{"version":3,"file":"useColumns.cjs","sources":["../../../../src/components/Grid/useColumns.ts"],"sourcesContent":["import { RefObject, useCallback, useRef, useState } from 'react';\nimport { ColumnResizeFn } from './types';\nimport { VariableSizeGrid } from 'react-window';\n\nconst DEFAULT_WIDTH = 100;\nconst MIN_COLUMN_WIDTH = 32;\n\n/**\n * Measures the minimum width required to display all content in a column without wrapping or truncation.\n * Note. We cannot simply measure item.scrollWidth, because it will return the current width if it is larger than needed.\n * To workaround it, we temporary shrink the column width to MIN_COLUMN_WIDTH and measure the scrollWidth.\n * @param {number} columnIndex - The index of the column to measure.\n * @param {HTMLDivElement} outerGrid - The grid element containing the column.\n * @returns {number} The minimum width needed for the column's content (in pixels).\n */\nconst measureColumnWidth = (columnIndex: number, outerGrid: HTMLDivElement): number => {\n  // Store the original widths\n  const cells = outerGrid.querySelectorAll<HTMLDivElement>(\n    `[data-grid-column=\"${columnIndex}\"]`\n  );\n\n  // Store the original widths and temporarily set cells to minimum width\n  const originalWidths: string[] = [];\n  cells.forEach(cell => {\n    originalWidths.push(cell.style.width);\n    cell.style.width = `${MIN_COLUMN_WIDTH}px`;\n  });\n\n  // Measure the actual content width\n  const maxWidth = Array.from(cells).reduce((max, item) => {\n    return Math.max(max, item.scrollWidth + 2);\n  }, MIN_COLUMN_WIDTH);\n\n  // Restore original widths\n  cells.forEach((cell, i) => {\n    cell.style.width = originalWidths[i];\n  });\n\n  return maxWidth;\n};\n\ninterface Props {\n  columnCount: number;\n  columnWidth?: (index: number) => number;\n  outerGridRef: RefObject<HTMLDivElement>;\n  gridRef: RefObject<VariableSizeGrid>;\n  onColumnResize?: (columnIndex: number, newWidth: number) => void;\n}\nconst useColumns = ({\n  columnCount,\n  columnWidth: columnWidthProp,\n  outerGridRef,\n  onColumnResize: onColumnResizeProp,\n  gridRef,\n}: Props) => {\n  const columnResized = useRef(false);\n  const prevWidth = useRef<Record<string, number>>({});\n  const columnWidthRefs = useRef<number[]>([]);\n  const autoWidthIndices = useRef<number[]>([]);\n  const [columnHorizontalPosition, setColumnHorizontalPosition] = useState<number[]>([]);\n\n  const initColumnSize = useCallback(\n    (containerWidth: number) => {\n      const newWidth =\n        containerWidth > DEFAULT_WIDTH * columnCount\n          ? containerWidth / columnCount\n          : DEFAULT_WIDTH;\n      if (columnResized.current) {\n        return;\n      }\n      const getWidth = (index: number) => {\n        if (typeof columnWidthProp === 'function') {\n          return columnWidthProp(index);\n        }\n        return newWidth;\n      };\n\n      const columnWidthList = [...Array(columnCount).keys()];\n\n      setColumnHorizontalPosition(() => {\n        return columnWidthList.reduce(\n          (acc, _, index) => {\n            const width = getWidth(index);\n            prevWidth.current[index.toString()] = width;\n            columnWidthRefs.current[index] = width;\n            acc.push(acc[index] + width);\n            return acc;\n          },\n          [0]\n        );\n      });\n      gridRef.current?.resetAfterColumnIndex(0);\n    },\n    [columnCount, columnWidthProp, gridRef]\n  );\n\n  const onColumnResize: ColumnResizeFn = useCallback(\n    (columnIndex, newWidth, type) => {\n      columnResized.current = true;\n      if (type === 'auto') {\n        const widthIndex = autoWidthIndices.current.findIndex(\n          index => index === columnIndex\n        );\n        if (widthIndex > -1) {\n          newWidth = prevWidth.current[columnIndex.toString()];\n          autoWidthIndices.current.splice(widthIndex, 1);\n        } else if (outerGridRef.current) {\n          newWidth = measureColumnWidth(columnIndex, outerGridRef.current);\n          autoWidthIndices.current.push(columnIndex);\n        }\n      } else {\n        const widthIndex = autoWidthIndices.current.findIndex(\n          index => index === columnIndex\n        );\n        autoWidthIndices.current.splice(widthIndex, 1);\n        prevWidth.current[columnIndex.toString()] = newWidth;\n      }\n\n      columnWidthRefs.current[columnIndex] = newWidth;\n      setColumnHorizontalPosition(columnHorizontalPosition => {\n        const currentWidth =\n          columnHorizontalPosition[columnIndex + 1] -\n          columnHorizontalPosition[columnIndex];\n        const diff = newWidth - currentWidth;\n\n        for (let i = columnIndex + 1; i < columnCount; i++) {\n          columnHorizontalPosition[i] = columnHorizontalPosition[i] + diff;\n        }\n        return [...columnHorizontalPosition];\n      });\n      gridRef.current?.resetAfterColumnIndex(columnIndex);\n      if (typeof onColumnResizeProp === 'function') {\n        onColumnResizeProp(columnIndex, newWidth);\n      }\n    },\n    [gridRef, onColumnResizeProp, outerGridRef, columnCount]\n  );\n\n  const columnWidth = useCallback(\n    (columnIndex: number) => {\n      if (columnWidthProp) {\n        return columnWidthProp(columnIndex);\n      }\n      return columnWidthRefs.current[columnIndex] ?? DEFAULT_WIDTH;\n    },\n    [columnWidthProp]\n  );\n\n  const getColumnHorizontalPosition = useCallback(\n    (index: number) => {\n      return columnHorizontalPosition[index] ?? DEFAULT_WIDTH * index;\n    },\n    [columnHorizontalPosition]\n  );\n\n  return {\n    getColumnHorizontalPosition,\n    onColumnResize,\n    columnWidth,\n    initColumnSize,\n  };\n};\n\nexport default useColumns;\n"],"names":["useRef","useState","useCallback","columnHorizontalPosition"],"mappings":"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"}