UNPKG

react-data-grid

Version:

Feature-rich and customizable data grid React component

1,534 lines (1,501 loc) • 96.1 kB
import { createContext, memo, useCallback, useContext, useEffect, useId, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react"; import { flushSync } from "react-dom"; import clsx from "clsx"; import { Fragment, jsx, jsxs } from "react/jsx-runtime"; //#region src/utils/colSpanUtils.ts function getColSpan(column, lastFrozenColumnIndex, args) { const colSpan = typeof column.colSpan === "function" ? column.colSpan(args) : 1; if (Number.isInteger(colSpan) && colSpan > 1 && (!column.frozen || column.idx + colSpan - 1 <= lastFrozenColumnIndex)) return colSpan; return void 0; } //#endregion //#region src/utils/domUtils.ts function stopPropagation(event) { event.stopPropagation(); } function scrollIntoView(element) { element?.scrollIntoView({ inline: "nearest", block: "nearest" }); } //#endregion //#region src/utils/eventUtils.ts function createCellEvent(event) { let defaultPrevented = false; const cellEvent = { ...event, preventGridDefault() { defaultPrevented = true; }, isGridDefaultPrevented() { return defaultPrevented; } }; Object.setPrototypeOf(cellEvent, Object.getPrototypeOf(event)); return cellEvent; } //#endregion //#region src/utils/keyboardUtils.ts const nonInputKeys = new Set([ "Unidentified", "Alt", "AltGraph", "CapsLock", "Control", "Fn", "FnLock", "Meta", "NumLock", "ScrollLock", "Shift", "Tab", "ArrowDown", "ArrowLeft", "ArrowRight", "ArrowUp", "End", "Home", "PageDown", "PageUp", "Insert", "ContextMenu", "Escape", "Pause", "Play", "PrintScreen", "F1", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12" ]); function isCtrlKeyHeldDown(e) { return (e.ctrlKey || e.metaKey) && e.key !== "Control"; } const vKey = 86; function isDefaultCellInput(event, isUserHandlingPaste) { if (isCtrlKeyHeldDown(event) && (event.keyCode !== vKey || isUserHandlingPaste)) return false; return !nonInputKeys.has(event.key); } function onEditorNavigation({ key, target }) { if (key === "Tab" && (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement)) return target.closest(".rdg-editor-container")?.querySelectorAll("input, textarea, select").length === 1; return false; } function getLeftRightKey(direction) { const isRtl = direction === "rtl"; return { leftKey: isRtl ? "ArrowRight" : "ArrowLeft", rightKey: isRtl ? "ArrowLeft" : "ArrowRight" }; } //#endregion //#region src/utils/renderMeasuringCells.tsx const measuringCellClassname = "mlln6zg7-0-0-beta-52"; function renderMeasuringCells(viewportColumns) { return viewportColumns.map(({ key, idx, minWidth, maxWidth }) => /* @__PURE__ */ jsx("div", { className: measuringCellClassname, style: { gridColumnStart: idx + 1, minWidth, maxWidth }, "data-measuring-cell-key": key }, key)); } //#endregion //#region src/utils/selectedCellUtils.ts function isSelectedCellEditable({ selectedPosition, columns, rows }) { const column = columns[selectedPosition.idx]; const row$1 = rows[selectedPosition.rowIdx]; return isCellEditableUtil(column, row$1); } function isCellEditableUtil(column, row$1) { return column.renderEditCell != null && (typeof column.editable === "function" ? column.editable(row$1) : column.editable) !== false; } function getSelectedCellColSpan({ rows, topSummaryRows, bottomSummaryRows, rowIdx, mainHeaderRowIdx, lastFrozenColumnIndex, column }) { const topSummaryRowsCount = topSummaryRows?.length ?? 0; if (rowIdx === mainHeaderRowIdx) return getColSpan(column, lastFrozenColumnIndex, { type: "HEADER" }); if (topSummaryRows && rowIdx > mainHeaderRowIdx && rowIdx <= topSummaryRowsCount + mainHeaderRowIdx) return getColSpan(column, lastFrozenColumnIndex, { type: "SUMMARY", row: topSummaryRows[rowIdx + topSummaryRowsCount] }); if (rowIdx >= 0 && rowIdx < rows.length) { const row$1 = rows[rowIdx]; return getColSpan(column, lastFrozenColumnIndex, { type: "ROW", row: row$1 }); } if (bottomSummaryRows) return getColSpan(column, lastFrozenColumnIndex, { type: "SUMMARY", row: bottomSummaryRows[rowIdx - rows.length] }); return void 0; } function getNextSelectedCellPosition({ moveUp, moveNext, cellNavigationMode, columns, colSpanColumns, rows, topSummaryRows, bottomSummaryRows, minRowIdx, mainHeaderRowIdx, maxRowIdx, currentPosition: { idx: currentIdx, rowIdx: currentRowIdx }, nextPosition, lastFrozenColumnIndex, isCellWithinBounds }) { let { idx: nextIdx, rowIdx: nextRowIdx } = nextPosition; const columnsCount = columns.length; const setColSpan = (moveNext$1) => { for (const column of colSpanColumns) { const colIdx = column.idx; if (colIdx > nextIdx) break; const colSpan = getSelectedCellColSpan({ rows, topSummaryRows, bottomSummaryRows, rowIdx: nextRowIdx, mainHeaderRowIdx, lastFrozenColumnIndex, column }); if (colSpan && nextIdx > colIdx && nextIdx < colSpan + colIdx) { nextIdx = colIdx + (moveNext$1 ? colSpan : 0); break; } } }; const getParentRowIdx = (parent) => { return parent.level + mainHeaderRowIdx; }; const setHeaderGroupColAndRowSpan = () => { if (moveNext) { const nextColumn = columns[nextIdx]; let parent = nextColumn.parent; while (parent !== void 0) { const parentRowIdx = getParentRowIdx(parent); if (nextRowIdx === parentRowIdx) { nextIdx = parent.idx + parent.colSpan; break; } parent = parent.parent; } } else if (moveUp) { const nextColumn = columns[nextIdx]; let parent = nextColumn.parent; let found = false; while (parent !== void 0) { const parentRowIdx = getParentRowIdx(parent); if (nextRowIdx >= parentRowIdx) { nextIdx = parent.idx; nextRowIdx = parentRowIdx; found = true; break; } parent = parent.parent; } if (!found) { nextIdx = currentIdx; nextRowIdx = currentRowIdx; } } }; if (isCellWithinBounds(nextPosition)) { setColSpan(moveNext); if (nextRowIdx < mainHeaderRowIdx) setHeaderGroupColAndRowSpan(); } if (cellNavigationMode === "CHANGE_ROW") { const isAfterLastColumn = nextIdx === columnsCount; const isBeforeFirstColumn = nextIdx === -1; if (isAfterLastColumn) { const isLastRow = nextRowIdx === maxRowIdx; if (!isLastRow) { nextIdx = 0; nextRowIdx += 1; } } else if (isBeforeFirstColumn) { const isFirstRow = nextRowIdx === minRowIdx; if (!isFirstRow) { nextRowIdx -= 1; nextIdx = columnsCount - 1; } setColSpan(false); } } if (nextRowIdx < mainHeaderRowIdx) { const nextColumn = columns[nextIdx]; let parent = nextColumn.parent; const nextParentRowIdx = nextRowIdx; nextRowIdx = mainHeaderRowIdx; while (parent !== void 0) { const parentRowIdx = getParentRowIdx(parent); if (parentRowIdx >= nextParentRowIdx) { nextRowIdx = parentRowIdx; nextIdx = parent.idx; } parent = parent.parent; } } return { idx: nextIdx, rowIdx: nextRowIdx }; } function canExitGrid({ maxColIdx, minRowIdx, maxRowIdx, selectedPosition: { rowIdx, idx }, shiftKey }) { const atLastCellInRow = idx === maxColIdx; const atFirstCellInRow = idx === 0; const atLastRow = rowIdx === maxRowIdx; const atFirstRow = rowIdx === minRowIdx; return shiftKey ? atFirstCellInRow && atFirstRow : atLastCellInRow && atLastRow; } //#endregion //#region src/style/cell.ts const cell = "cj343x07-0-0-beta-52"; const cellClassname = `rdg-cell ${cell}`; const cellFrozen = "csofj7r7-0-0-beta-52"; const cellFrozenClassname = `rdg-cell-frozen ${cellFrozen}`; //#endregion //#region src/utils/styleUtils.ts function getRowStyle(rowIdx) { return { "--rdg-grid-row-start": rowIdx }; } function getHeaderCellStyle(column, rowIdx, rowSpan) { const gridRowEnd = rowIdx + 1; const paddingBlockStart = `calc(${rowSpan - 1} * var(--rdg-header-row-height))`; if (column.parent === void 0) return { insetBlockStart: 0, gridRowStart: 1, gridRowEnd, paddingBlockStart }; return { insetBlockStart: `calc(${rowIdx - rowSpan} * var(--rdg-header-row-height))`, gridRowStart: gridRowEnd - rowSpan, gridRowEnd, paddingBlockStart }; } function getCellStyle(column, colSpan = 1) { const index = column.idx + 1; return { gridColumnStart: index, gridColumnEnd: index + colSpan, insetInlineStart: column.frozen ? `var(--rdg-frozen-left-${column.idx})` : void 0 }; } function getCellClassname(column, ...extraClasses) { return clsx(cellClassname, { [cellFrozenClassname]: column.frozen }, ...extraClasses); } //#endregion //#region src/utils/index.ts const { min, max, floor, sign, abs } = Math; function assertIsValidKeyGetter(keyGetter) { if (typeof keyGetter !== "function") throw new Error("Please specify the rowKeyGetter prop to use selection"); } function clampColumnWidth(width, { minWidth, maxWidth }) { width = max(width, minWidth); if (typeof maxWidth === "number" && maxWidth >= minWidth) return min(width, maxWidth); return width; } function getHeaderCellRowSpan(column, rowIdx) { return column.parent === void 0 ? rowIdx : column.level - column.parent.level; } //#endregion //#region src/cellRenderers/renderCheckbox.tsx const checkbox = "c1bn88vv7-0-0-beta-52"; const checkboxClassname = `rdg-checkbox-input ${checkbox}`; function renderCheckbox({ onChange, indeterminate,...props }) { function handleChange(e) { onChange(e.target.checked, e.nativeEvent.shiftKey); } return /* @__PURE__ */ jsx("input", { ref: (el) => { if (el) el.indeterminate = indeterminate === true; }, type: "checkbox", className: checkboxClassname, onChange: handleChange, ...props }); } //#endregion //#region src/cellRenderers/renderToggleGroup.tsx const groupCellContent = "g1s9ylgp7-0-0-beta-52"; const groupCellContentClassname = `rdg-group-cell-content ${groupCellContent}`; const caret = "cz54e4y7-0-0-beta-52"; const caretClassname = `rdg-caret ${caret}`; function renderToggleGroup(props) { return /* @__PURE__ */ jsx(ToggleGroup, { ...props }); } function ToggleGroup({ groupKey, isExpanded, tabIndex, toggleGroup }) { function handleKeyDown({ key }) { if (key === "Enter") toggleGroup(); } const d = isExpanded ? "M1 1 L 7 7 L 13 1" : "M1 7 L 7 1 L 13 7"; return /* @__PURE__ */ jsxs("span", { className: groupCellContentClassname, tabIndex, onKeyDown: handleKeyDown, children: [groupKey, /* @__PURE__ */ jsx("svg", { viewBox: "0 0 14 8", width: "14", height: "8", className: caretClassname, "aria-hidden": true, children: /* @__PURE__ */ jsx("path", { d }) })] }); } //#endregion //#region src/cellRenderers/renderValue.tsx function renderValue(props) { try { return props.row[props.column.key]; } catch { return null; } } //#endregion //#region src/DataGridDefaultRenderersContext.ts const DataGridDefaultRenderersContext = createContext(void 0); function useDefaultRenderers() { return useContext(DataGridDefaultRenderersContext); } //#endregion //#region src/cellRenderers/SelectCellFormatter.tsx function SelectCellFormatter({ value, tabIndex, indeterminate, disabled, onChange, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy }) { const renderCheckbox$1 = useDefaultRenderers().renderCheckbox; return renderCheckbox$1({ "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, tabIndex, indeterminate, disabled, checked: value, onChange }); } //#endregion //#region src/hooks/useRowSelection.ts const RowSelectionContext = createContext(void 0); const RowSelectionChangeContext = createContext(void 0); function useRowSelection() { const rowSelectionContext = useContext(RowSelectionContext); const rowSelectionChangeContext = useContext(RowSelectionChangeContext); if (rowSelectionContext === void 0 || rowSelectionChangeContext === void 0) throw new Error("useRowSelection must be used within renderCell"); return { isRowSelectionDisabled: rowSelectionContext.isRowSelectionDisabled, isRowSelected: rowSelectionContext.isRowSelected, onRowSelectionChange: rowSelectionChangeContext }; } const HeaderRowSelectionContext = createContext(void 0); const HeaderRowSelectionChangeContext = createContext(void 0); function useHeaderRowSelection() { const headerRowSelectionContext = useContext(HeaderRowSelectionContext); const headerRowSelectionChangeContext = useContext(HeaderRowSelectionChangeContext); if (headerRowSelectionContext === void 0 || headerRowSelectionChangeContext === void 0) throw new Error("useHeaderRowSelection must be used within renderHeaderCell"); return { isIndeterminate: headerRowSelectionContext.isIndeterminate, isRowSelected: headerRowSelectionContext.isRowSelected, onRowSelectionChange: headerRowSelectionChangeContext }; } //#endregion //#region src/Columns.tsx const SELECT_COLUMN_KEY = "rdg-select-column"; function HeaderRenderer(props) { const { isIndeterminate, isRowSelected, onRowSelectionChange } = useHeaderRowSelection(); return /* @__PURE__ */ jsx(SelectCellFormatter, { "aria-label": "Select All", tabIndex: props.tabIndex, indeterminate: isIndeterminate, value: isRowSelected, onChange: (checked) => { onRowSelectionChange({ checked: isIndeterminate ? false : checked }); } }); } function SelectFormatter(props) { const { isRowSelectionDisabled, isRowSelected, onRowSelectionChange } = useRowSelection(); return /* @__PURE__ */ jsx(SelectCellFormatter, { "aria-label": "Select", tabIndex: props.tabIndex, disabled: isRowSelectionDisabled, value: isRowSelected, onChange: (checked, isShiftClick) => { onRowSelectionChange({ row: props.row, checked, isShiftClick }); } }); } function SelectGroupFormatter(props) { const { isRowSelected, onRowSelectionChange } = useRowSelection(); return /* @__PURE__ */ jsx(SelectCellFormatter, { "aria-label": "Select Group", tabIndex: props.tabIndex, value: isRowSelected, onChange: (checked) => { onRowSelectionChange({ row: props.row, checked, isShiftClick: false }); } }); } const SelectColumn = { key: SELECT_COLUMN_KEY, name: "", width: 35, minWidth: 35, maxWidth: 35, resizable: false, sortable: false, frozen: true, renderHeaderCell(props) { return /* @__PURE__ */ jsx(HeaderRenderer, { ...props }); }, renderCell(props) { return /* @__PURE__ */ jsx(SelectFormatter, { ...props }); }, renderGroupCell(props) { return /* @__PURE__ */ jsx(SelectGroupFormatter, { ...props }); } }; //#endregion //#region src/renderHeaderCell.tsx const headerSortCellClassname = "h44jtk67-0-0-beta-52"; const headerSortName = "hcgkhxz7-0-0-beta-52"; const headerSortNameClassname = `rdg-header-sort-name ${headerSortName}`; function renderHeaderCell({ column, sortDirection, priority }) { if (!column.sortable) return column.name; return /* @__PURE__ */ jsx(SortableHeaderCell, { sortDirection, priority, children: column.name }); } function SortableHeaderCell({ sortDirection, priority, children }) { const renderSortStatus$1 = useDefaultRenderers().renderSortStatus; return /* @__PURE__ */ jsxs("span", { className: headerSortCellClassname, children: [/* @__PURE__ */ jsx("span", { className: headerSortNameClassname, children }), /* @__PURE__ */ jsx("span", { children: renderSortStatus$1({ sortDirection, priority }) })] }); } //#endregion //#region src/hooks/useCalculatedColumns.ts const DEFAULT_COLUMN_WIDTH = "auto"; const DEFAULT_COLUMN_MIN_WIDTH = 50; function useCalculatedColumns({ rawColumns, defaultColumnOptions, getColumnWidth, viewportWidth, scrollLeft, enableVirtualization }) { const defaultWidth = defaultColumnOptions?.width ?? DEFAULT_COLUMN_WIDTH; const defaultMinWidth = defaultColumnOptions?.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH; const defaultMaxWidth = defaultColumnOptions?.maxWidth ?? void 0; const defaultRenderCell$1 = defaultColumnOptions?.renderCell ?? renderValue; const defaultRenderHeaderCell = defaultColumnOptions?.renderHeaderCell ?? renderHeaderCell; const defaultSortable = defaultColumnOptions?.sortable ?? false; const defaultResizable = defaultColumnOptions?.resizable ?? false; const defaultDraggable = defaultColumnOptions?.draggable ?? false; const { columns, colSpanColumns, lastFrozenColumnIndex, headerRowsCount } = useMemo(() => { let lastFrozenColumnIndex$1 = -1; let headerRowsCount$1 = 1; const columns$1 = []; collectColumns(rawColumns, 1); function collectColumns(rawColumns$1, level, parent) { for (const rawColumn of rawColumns$1) { if ("children" in rawColumn) { const calculatedColumnParent = { name: rawColumn.name, parent, idx: -1, colSpan: 0, level: 0, headerCellClass: rawColumn.headerCellClass }; collectColumns(rawColumn.children, level + 1, calculatedColumnParent); continue; } const frozen = rawColumn.frozen ?? false; const column = { ...rawColumn, parent, idx: 0, level: 0, frozen, width: rawColumn.width ?? defaultWidth, minWidth: rawColumn.minWidth ?? defaultMinWidth, maxWidth: rawColumn.maxWidth ?? defaultMaxWidth, sortable: rawColumn.sortable ?? defaultSortable, resizable: rawColumn.resizable ?? defaultResizable, draggable: rawColumn.draggable ?? defaultDraggable, renderCell: rawColumn.renderCell ?? defaultRenderCell$1, renderHeaderCell: rawColumn.renderHeaderCell ?? defaultRenderHeaderCell }; columns$1.push(column); if (frozen) lastFrozenColumnIndex$1++; if (level > headerRowsCount$1) headerRowsCount$1 = level; } } columns$1.sort(({ key: aKey, frozen: frozenA }, { key: bKey, frozen: frozenB }) => { if (aKey === SELECT_COLUMN_KEY) return -1; if (bKey === SELECT_COLUMN_KEY) return 1; if (frozenA) { if (frozenB) return 0; return -1; } if (frozenB) return 1; return 0; }); const colSpanColumns$1 = []; columns$1.forEach((column, idx) => { column.idx = idx; updateColumnParent(column, idx, 0); if (column.colSpan != null) colSpanColumns$1.push(column); }); return { columns: columns$1, colSpanColumns: colSpanColumns$1, lastFrozenColumnIndex: lastFrozenColumnIndex$1, headerRowsCount: headerRowsCount$1 }; }, [ rawColumns, defaultWidth, defaultMinWidth, defaultMaxWidth, defaultRenderCell$1, defaultRenderHeaderCell, defaultResizable, defaultSortable, defaultDraggable ]); const { templateColumns, layoutCssVars, totalFrozenColumnWidth, columnMetrics } = useMemo(() => { const columnMetrics$1 = new Map(); let left = 0; let totalFrozenColumnWidth$1 = 0; const templateColumns$1 = []; for (const column of columns) { let width = getColumnWidth(column); if (typeof width === "number") width = clampColumnWidth(width, column); else width = column.minWidth; templateColumns$1.push(`${width}px`); columnMetrics$1.set(column, { width, left }); left += width; } if (lastFrozenColumnIndex !== -1) { const columnMetric = columnMetrics$1.get(columns[lastFrozenColumnIndex]); totalFrozenColumnWidth$1 = columnMetric.left + columnMetric.width; } const layoutCssVars$1 = {}; for (let i = 0; i <= lastFrozenColumnIndex; i++) { const column = columns[i]; layoutCssVars$1[`--rdg-frozen-left-${column.idx}`] = `${columnMetrics$1.get(column).left}px`; } return { templateColumns: templateColumns$1, layoutCssVars: layoutCssVars$1, totalFrozenColumnWidth: totalFrozenColumnWidth$1, columnMetrics: columnMetrics$1 }; }, [ getColumnWidth, columns, lastFrozenColumnIndex ]); const [colOverscanStartIdx, colOverscanEndIdx] = useMemo(() => { if (!enableVirtualization) return [0, columns.length - 1]; const viewportLeft = scrollLeft + totalFrozenColumnWidth; const viewportRight = scrollLeft + viewportWidth; const lastColIdx = columns.length - 1; const firstUnfrozenColumnIdx = min(lastFrozenColumnIndex + 1, lastColIdx); if (viewportLeft >= viewportRight) return [firstUnfrozenColumnIdx, firstUnfrozenColumnIdx]; let colVisibleStartIdx = firstUnfrozenColumnIdx; while (colVisibleStartIdx < lastColIdx) { const { left, width } = columnMetrics.get(columns[colVisibleStartIdx]); if (left + width > viewportLeft) break; colVisibleStartIdx++; } let colVisibleEndIdx = colVisibleStartIdx; while (colVisibleEndIdx < lastColIdx) { const { left, width } = columnMetrics.get(columns[colVisibleEndIdx]); if (left + width >= viewportRight) break; colVisibleEndIdx++; } const colOverscanStartIdx$1 = max(firstUnfrozenColumnIdx, colVisibleStartIdx - 1); const colOverscanEndIdx$1 = min(lastColIdx, colVisibleEndIdx + 1); return [colOverscanStartIdx$1, colOverscanEndIdx$1]; }, [ columnMetrics, columns, lastFrozenColumnIndex, scrollLeft, totalFrozenColumnWidth, viewportWidth, enableVirtualization ]); return { columns, colSpanColumns, colOverscanStartIdx, colOverscanEndIdx, templateColumns, layoutCssVars, headerRowsCount, lastFrozenColumnIndex, totalFrozenColumnWidth }; } function updateColumnParent(column, index, level) { if (level < column.level) column.level = level; if (column.parent !== void 0) { const { parent } = column; if (parent.idx === -1) parent.idx = index; parent.colSpan += 1; updateColumnParent(parent, index, level - 1); } } //#endregion //#region src/hooks/useColumnWidths.ts function useColumnWidths(columns, viewportColumns, templateColumns, gridRef, gridWidth, resizedColumnWidths, measuredColumnWidths, setResizedColumnWidths, setMeasuredColumnWidths, onColumnResize) { const [columnToAutoResize, setColumnToAutoResize] = useState(null); const [prevGridWidth, setPreviousGridWidth] = useState(gridWidth); const columnsCanFlex = columns.length === viewportColumns.length; const ignorePreviouslyMeasuredColumns = columnsCanFlex && gridWidth !== prevGridWidth; const newTemplateColumns = [...templateColumns]; const columnsToMeasure = []; for (const { key, idx, width } of viewportColumns) if (key === columnToAutoResize?.key) { newTemplateColumns[idx] = columnToAutoResize.width === "max-content" ? columnToAutoResize.width : `${columnToAutoResize.width}px`; columnsToMeasure.push(key); } else if (typeof width === "string" && (ignorePreviouslyMeasuredColumns || !measuredColumnWidths.has(key)) && !resizedColumnWidths.has(key)) { newTemplateColumns[idx] = width; columnsToMeasure.push(key); } const gridTemplateColumns = newTemplateColumns.join(" "); useLayoutEffect(updateMeasuredWidths); function updateMeasuredWidths() { setPreviousGridWidth(gridWidth); if (columnsToMeasure.length === 0) return; setMeasuredColumnWidths((measuredColumnWidths$1) => { const newMeasuredColumnWidths = new Map(measuredColumnWidths$1); let hasChanges = false; for (const key of columnsToMeasure) { const measuredWidth = measureColumnWidth(gridRef, key); hasChanges ||= measuredWidth !== measuredColumnWidths$1.get(key); if (measuredWidth === void 0) newMeasuredColumnWidths.delete(key); else newMeasuredColumnWidths.set(key, measuredWidth); } return hasChanges ? newMeasuredColumnWidths : measuredColumnWidths$1; }); if (columnToAutoResize !== null) { const resizingKey = columnToAutoResize.key; setResizedColumnWidths((resizedColumnWidths$1) => { const oldWidth = resizedColumnWidths$1.get(resizingKey); const newWidth = measureColumnWidth(gridRef, resizingKey); if (newWidth !== void 0 && oldWidth !== newWidth) { const newResizedColumnWidths = new Map(resizedColumnWidths$1); newResizedColumnWidths.set(resizingKey, newWidth); return newResizedColumnWidths; } return resizedColumnWidths$1; }); setColumnToAutoResize(null); } } function handleColumnResize(column, nextWidth) { const { key: resizingKey } = column; flushSync(() => { if (columnsCanFlex) setMeasuredColumnWidths((measuredColumnWidths$1) => { const newMeasuredColumnWidths = new Map(measuredColumnWidths$1); for (const { key, width } of viewportColumns) if (resizingKey !== key && typeof width === "string" && !resizedColumnWidths.has(key)) newMeasuredColumnWidths.delete(key); return newMeasuredColumnWidths; }); setColumnToAutoResize({ key: resizingKey, width: nextWidth }); }); if (onColumnResize) { const previousWidth = resizedColumnWidths.get(resizingKey); const newWidth = typeof nextWidth === "number" ? nextWidth : measureColumnWidth(gridRef, resizingKey); if (newWidth !== void 0 && newWidth !== previousWidth) onColumnResize(column, newWidth); } } return { gridTemplateColumns, handleColumnResize }; } function measureColumnWidth(gridRef, key) { const selector = `[data-measuring-cell-key="${CSS.escape(key)}"]`; const measuringCell = gridRef.current?.querySelector(selector); return measuringCell?.getBoundingClientRect().width; } //#endregion //#region src/hooks/useGridDimensions.ts function useGridDimensions() { const gridRef = useRef(null); const [inlineSize, setInlineSize] = useState(1); const [blockSize, setBlockSize] = useState(1); const [horizontalScrollbarHeight, setHorizontalScrollbarHeight] = useState(0); useLayoutEffect(() => { const { ResizeObserver } = window; if (ResizeObserver == null) return; const { clientWidth, clientHeight, offsetWidth, offsetHeight } = gridRef.current; const { width, height } = gridRef.current.getBoundingClientRect(); const initialHorizontalScrollbarHeight = offsetHeight - clientHeight; const initialWidth = width - offsetWidth + clientWidth; const initialHeight = height - initialHorizontalScrollbarHeight; setInlineSize(initialWidth); setBlockSize(initialHeight); setHorizontalScrollbarHeight(initialHorizontalScrollbarHeight); const resizeObserver = new ResizeObserver((entries) => { const size = entries[0].contentBoxSize[0]; const { clientHeight: clientHeight$1, offsetHeight: offsetHeight$1 } = gridRef.current; flushSync(() => { setInlineSize(size.inlineSize); setBlockSize(size.blockSize); setHorizontalScrollbarHeight(offsetHeight$1 - clientHeight$1); }); }); resizeObserver.observe(gridRef.current); return () => { resizeObserver.disconnect(); }; }, []); return [ gridRef, inlineSize, blockSize, horizontalScrollbarHeight ]; } //#endregion //#region src/hooks/useLatestFunc.ts function useLatestFunc(fn) { const ref = useRef(fn); useEffect(() => { ref.current = fn; }); const callbackFn = useCallback((...args) => { ref.current(...args); }, []); return fn ? callbackFn : fn; } //#endregion //#region src/hooks/useRovingTabIndex.ts function useRovingTabIndex(isSelected) { const [isChildFocused, setIsChildFocused] = useState(false); if (isChildFocused && !isSelected) setIsChildFocused(false); function onFocus(event) { if (event.target !== event.currentTarget) setIsChildFocused(true); } const isFocusable = isSelected && !isChildFocused; return { tabIndex: isFocusable ? 0 : -1, childTabIndex: isSelected ? 0 : -1, onFocus: isSelected ? onFocus : void 0 }; } //#endregion //#region src/hooks/useViewportColumns.ts function useViewportColumns({ columns, colSpanColumns, rows, topSummaryRows, bottomSummaryRows, colOverscanStartIdx, colOverscanEndIdx, lastFrozenColumnIndex, rowOverscanStartIdx, rowOverscanEndIdx }) { const startIdx = useMemo(() => { if (colOverscanStartIdx === 0) return 0; let startIdx$1 = colOverscanStartIdx; const updateStartIdx = (colIdx, colSpan) => { if (colSpan !== void 0 && colIdx + colSpan > colOverscanStartIdx) { startIdx$1 = colIdx; return true; } return false; }; for (const column of colSpanColumns) { const colIdx = column.idx; if (colIdx >= startIdx$1) break; if (updateStartIdx(colIdx, getColSpan(column, lastFrozenColumnIndex, { type: "HEADER" }))) break; for (let rowIdx = rowOverscanStartIdx; rowIdx <= rowOverscanEndIdx; rowIdx++) { const row$1 = rows[rowIdx]; if (updateStartIdx(colIdx, getColSpan(column, lastFrozenColumnIndex, { type: "ROW", row: row$1 }))) break; } if (topSummaryRows != null) { for (const row$1 of topSummaryRows) if (updateStartIdx(colIdx, getColSpan(column, lastFrozenColumnIndex, { type: "SUMMARY", row: row$1 }))) break; } if (bottomSummaryRows != null) { for (const row$1 of bottomSummaryRows) if (updateStartIdx(colIdx, getColSpan(column, lastFrozenColumnIndex, { type: "SUMMARY", row: row$1 }))) break; } } return startIdx$1; }, [ rowOverscanStartIdx, rowOverscanEndIdx, rows, topSummaryRows, bottomSummaryRows, colOverscanStartIdx, lastFrozenColumnIndex, colSpanColumns ]); return useMemo(() => { const viewportColumns = []; for (let colIdx = 0; colIdx <= colOverscanEndIdx; colIdx++) { const column = columns[colIdx]; if (colIdx < startIdx && !column.frozen) continue; viewportColumns.push(column); } return viewportColumns; }, [ startIdx, colOverscanEndIdx, columns ]); } //#endregion //#region src/hooks/useViewportRows.ts function useViewportRows({ rows, rowHeight, clientHeight, scrollTop, enableVirtualization }) { const { totalRowHeight, gridTemplateRows, getRowTop, getRowHeight, findRowIdx } = useMemo(() => { if (typeof rowHeight === "number") return { totalRowHeight: rowHeight * rows.length, gridTemplateRows: ` repeat(${rows.length}, ${rowHeight}px)`, getRowTop: (rowIdx) => rowIdx * rowHeight, getRowHeight: () => rowHeight, findRowIdx: (offset) => floor(offset / rowHeight) }; let totalRowHeight$1 = 0; let gridTemplateRows$1 = " "; const rowPositions = rows.map((row$1) => { const currentRowHeight = rowHeight(row$1); const position = { top: totalRowHeight$1, height: currentRowHeight }; gridTemplateRows$1 += `${currentRowHeight}px `; totalRowHeight$1 += currentRowHeight; return position; }); const validateRowIdx = (rowIdx) => { return max(0, min(rows.length - 1, rowIdx)); }; return { totalRowHeight: totalRowHeight$1, gridTemplateRows: gridTemplateRows$1, getRowTop: (rowIdx) => rowPositions[validateRowIdx(rowIdx)].top, getRowHeight: (rowIdx) => rowPositions[validateRowIdx(rowIdx)].height, findRowIdx(offset) { let start = 0; let end = rowPositions.length - 1; while (start <= end) { const middle = start + floor((end - start) / 2); const currentOffset = rowPositions[middle].top; if (currentOffset === offset) return middle; if (currentOffset < offset) start = middle + 1; else if (currentOffset > offset) end = middle - 1; if (start > end) return end; } return 0; } }; }, [rowHeight, rows]); let rowOverscanStartIdx = 0; let rowOverscanEndIdx = rows.length - 1; if (enableVirtualization) { const overscanThreshold = 4; const rowVisibleStartIdx = findRowIdx(scrollTop); const rowVisibleEndIdx = findRowIdx(scrollTop + clientHeight); rowOverscanStartIdx = max(0, rowVisibleStartIdx - overscanThreshold); rowOverscanEndIdx = min(rows.length - 1, rowVisibleEndIdx + overscanThreshold); } return { rowOverscanStartIdx, rowOverscanEndIdx, totalRowHeight, gridTemplateRows, getRowTop, getRowHeight, findRowIdx }; } //#endregion //#region src/Cell.tsx const cellDraggedOver = "c6ra8a37-0-0-beta-52"; const cellDraggedOverClassname = `rdg-cell-dragged-over ${cellDraggedOver}`; function Cell({ column, colSpan, isCellSelected, isDraggedOver, row: row$1, rowIdx, className, onClick, onDoubleClick, onContextMenu, onRowChange, selectCell, style,...props }) { const { tabIndex, childTabIndex, onFocus } = useRovingTabIndex(isCellSelected); const { cellClass } = column; className = getCellClassname(column, { [cellDraggedOverClassname]: isDraggedOver }, typeof cellClass === "function" ? cellClass(row$1) : cellClass, className); const isEditable = isCellEditableUtil(column, row$1); function selectCellWrapper(openEditor) { selectCell({ rowIdx, idx: column.idx }, openEditor); } function handleClick(event) { if (onClick) { const cellEvent = createCellEvent(event); onClick({ rowIdx, row: row$1, column, selectCell: selectCellWrapper }, cellEvent); if (cellEvent.isGridDefaultPrevented()) return; } selectCellWrapper(); } function handleContextMenu(event) { if (onContextMenu) { const cellEvent = createCellEvent(event); onContextMenu({ rowIdx, row: row$1, column, selectCell: selectCellWrapper }, cellEvent); if (cellEvent.isGridDefaultPrevented()) return; } selectCellWrapper(); } function handleDoubleClick(event) { if (onDoubleClick) { const cellEvent = createCellEvent(event); onDoubleClick({ rowIdx, row: row$1, column, selectCell: selectCellWrapper }, cellEvent); if (cellEvent.isGridDefaultPrevented()) return; } selectCellWrapper(true); } function handleRowChange(newRow) { onRowChange(column, newRow); } return /* @__PURE__ */ jsx( "div", // aria-colindex is 1-based { role: "gridcell", "aria-colindex": column.idx + 1, "aria-colspan": colSpan, "aria-selected": isCellSelected, "aria-readonly": !isEditable || void 0, tabIndex, className, style: { ...getCellStyle(column, colSpan), ...style }, onClick: handleClick, onDoubleClick: handleDoubleClick, onContextMenu: handleContextMenu, onFocus, ...props, children: column.renderCell({ column, row: row$1, rowIdx, isCellEditable: isEditable, tabIndex: childTabIndex, onRowChange: handleRowChange }) } ); } const CellComponent = memo(Cell); var Cell_default = CellComponent; function defaultRenderCell(key, props) { return /* @__PURE__ */ jsx(CellComponent, { ...props }, key); } //#endregion //#region src/DragHandle.tsx const cellDragHandle = "c1w9bbhr7-0-0-beta-52"; const cellDragHandleFrozenClassname = "c1creorc7-0-0-beta-52"; const cellDragHandleClassname = `rdg-cell-drag-handle ${cellDragHandle}`; function DragHandle({ gridRowStart, rows, column, columnWidth, maxColIdx, isLastRow, selectedPosition, latestDraggedOverRowIdx, isCellEditable, onRowsChange, onFill, onClick, setDragging, setDraggedOverRowIdx }) { const { idx, rowIdx } = selectedPosition; function handleMouseDown(event) { event.preventDefault(); if (event.buttons !== 1) return; setDragging(true); window.addEventListener("mouseover", onMouseOver); window.addEventListener("mouseup", onMouseUp); function onMouseOver(event$1) { if (event$1.buttons !== 1) onMouseUp(); } function onMouseUp() { window.removeEventListener("mouseover", onMouseOver); window.removeEventListener("mouseup", onMouseUp); setDragging(false); handleDragEnd(); } } function handleDragEnd() { const overRowIdx = latestDraggedOverRowIdx.current; if (overRowIdx === void 0) return; const startRowIndex = rowIdx < overRowIdx ? rowIdx + 1 : overRowIdx; const endRowIndex = rowIdx < overRowIdx ? overRowIdx + 1 : rowIdx; updateRows(startRowIndex, endRowIndex); setDraggedOverRowIdx(void 0); } function handleDoubleClick(event) { event.stopPropagation(); updateRows(rowIdx + 1, rows.length); } function updateRows(startRowIdx, endRowIdx) { const sourceRow = rows[rowIdx]; const updatedRows = [...rows]; const indexes = []; for (let i = startRowIdx; i < endRowIdx; i++) if (isCellEditable({ rowIdx: i, idx })) { const updatedRow = onFill({ columnKey: column.key, sourceRow, targetRow: rows[i] }); if (updatedRow !== rows[i]) { updatedRows[i] = updatedRow; indexes.push(i); } } if (indexes.length > 0) onRowsChange?.(updatedRows, { indexes, column }); } function getStyle() { const colSpan = column.colSpan?.({ type: "ROW", row: rows[rowIdx] }) ?? 1; const { insetInlineStart,...style } = getCellStyle(column, colSpan); const marginEnd = "calc(var(--rdg-drag-handle-size) * -0.5 + 1px)"; const isLastColumn = column.idx + colSpan - 1 === maxColIdx; return { ...style, gridRowStart, marginInlineEnd: isLastColumn ? void 0 : marginEnd, marginBlockEnd: isLastRow ? void 0 : marginEnd, insetInlineStart: insetInlineStart ? `calc(${insetInlineStart} + ${columnWidth}px + var(--rdg-drag-handle-size) * -0.5 - 1px)` : void 0 }; } return /* @__PURE__ */ jsx("div", { style: getStyle(), className: clsx(cellDragHandleClassname, column.frozen && cellDragHandleFrozenClassname), onClick, onMouseDown: handleMouseDown, onDoubleClick: handleDoubleClick }); } //#endregion //#region src/EditCell.tsx const cellEditing = "cis5rrm7-0-0-beta-52"; function EditCell({ column, colSpan, row: row$1, rowIdx, onRowChange, closeEditor, onKeyDown, navigate }) { const frameRequestRef = useRef(void 0); const commitOnOutsideClick = column.editorOptions?.commitOnOutsideClick ?? true; const commitOnOutsideMouseDown = useLatestFunc(() => { onClose(true, false); }); useEffect(() => { if (!commitOnOutsideClick) return; function onWindowCaptureMouseDown() { frameRequestRef.current = requestAnimationFrame(commitOnOutsideMouseDown); } addEventListener("mousedown", onWindowCaptureMouseDown, { capture: true }); return () => { removeEventListener("mousedown", onWindowCaptureMouseDown, { capture: true }); cancelFrameRequest(); }; }, [commitOnOutsideClick, commitOnOutsideMouseDown]); function cancelFrameRequest() { cancelAnimationFrame(frameRequestRef.current); } function handleKeyDown(event) { if (onKeyDown) { const cellEvent = createCellEvent(event); onKeyDown({ mode: "EDIT", row: row$1, column, rowIdx, navigate() { navigate(event); }, onClose }, cellEvent); if (cellEvent.isGridDefaultPrevented()) return; } if (event.key === "Escape") onClose(); else if (event.key === "Enter") onClose(true); else if (onEditorNavigation(event)) navigate(event); } function onClose(commitChanges = false, shouldFocusCell = true) { if (commitChanges) onRowChange(row$1, true, shouldFocusCell); else closeEditor(shouldFocusCell); } function onEditorRowChange(row$2, commitChangesAndFocus = false) { onRowChange(row$2, commitChangesAndFocus, commitChangesAndFocus); } const { cellClass } = column; const className = getCellClassname(column, "rdg-editor-container", !column.editorOptions?.displayCellContent && cellEditing, typeof cellClass === "function" ? cellClass(row$1) : cellClass); return /* @__PURE__ */ jsx( "div", // aria-colindex is 1-based { role: "gridcell", "aria-colindex": column.idx + 1, "aria-colspan": colSpan, "aria-selected": true, className, style: getCellStyle(column, colSpan), onKeyDown: handleKeyDown, onMouseDownCapture: cancelFrameRequest, children: column.renderEditCell != null && /* @__PURE__ */ jsxs(Fragment, { children: [column.renderEditCell({ column, row: row$1, rowIdx, onRowChange: onEditorRowChange, onClose }), column.editorOptions?.displayCellContent && column.renderCell({ column, row: row$1, rowIdx, isCellEditable: true, tabIndex: -1, onRowChange: onEditorRowChange })] }) } ); } //#endregion //#region src/GroupedColumnHeaderCell.tsx function GroupedColumnHeaderCell({ column, rowIdx, isCellSelected, selectCell }) { const { tabIndex, onFocus } = useRovingTabIndex(isCellSelected); const { colSpan } = column; const rowSpan = getHeaderCellRowSpan(column, rowIdx); const index = column.idx + 1; function onClick() { selectCell({ idx: column.idx, rowIdx }); } return /* @__PURE__ */ jsx("div", { role: "columnheader", "aria-colindex": index, "aria-colspan": colSpan, "aria-rowspan": rowSpan, "aria-selected": isCellSelected, tabIndex, className: clsx(cellClassname, column.headerCellClass), style: { ...getHeaderCellStyle(column, rowIdx, rowSpan), gridColumnStart: index, gridColumnEnd: index + colSpan }, onFocus, onClick, children: column.name }); } //#endregion //#region src/HeaderCell.tsx const cellSortableClassname = "c6l2wv17-0-0-beta-52"; const cellResizable = "c1kqdw7y7-0-0-beta-52"; const cellResizableClassname = `rdg-cell-resizable ${cellResizable}`; const resizeHandleClassname = "r1y6ywlx7-0-0-beta-52"; const cellDraggableClassname = "rdg-cell-draggable"; const cellDragging = "c1bezg5o7-0-0-beta-52"; const cellDraggingClassname = `rdg-cell-dragging ${cellDragging}`; const cellOver = "c1vc96037-0-0-beta-52"; const cellOverClassname = `rdg-cell-drag-over ${cellOver}`; function HeaderCell({ column, colSpan, rowIdx, isCellSelected, onColumnResize, onColumnsReorder, sortColumns, onSortColumnsChange, selectCell, shouldFocusGrid, direction, dragDropKey }) { const [isDragging, setIsDragging] = useState(false); const [isOver, setIsOver] = useState(false); const rowSpan = getHeaderCellRowSpan(column, rowIdx); const { tabIndex, childTabIndex, onFocus } = useRovingTabIndex(isCellSelected); const sortIndex = sortColumns?.findIndex((sort) => sort.columnKey === column.key); const sortColumn = sortIndex !== void 0 && sortIndex > -1 ? sortColumns[sortIndex] : void 0; const sortDirection = sortColumn?.direction; const priority = sortColumn !== void 0 && sortColumns.length > 1 ? sortIndex + 1 : void 0; const ariaSort = sortDirection && !priority ? sortDirection === "ASC" ? "ascending" : "descending" : void 0; const { sortable, resizable, draggable } = column; const className = getCellClassname(column, column.headerCellClass, { [cellSortableClassname]: sortable, [cellResizableClassname]: resizable, [cellDraggableClassname]: draggable, [cellDraggingClassname]: isDragging, [cellOverClassname]: isOver }); function onSort(ctrlClick) { if (onSortColumnsChange == null) return; const { sortDescendingFirst } = column; if (sortColumn === void 0) { const nextSort = { columnKey: column.key, direction: sortDescendingFirst ? "DESC" : "ASC" }; onSortColumnsChange(sortColumns && ctrlClick ? [...sortColumns, nextSort] : [nextSort]); } else { let nextSortColumn; if (sortDescendingFirst === true && sortDirection === "DESC" || sortDescendingFirst !== true && sortDirection === "ASC") nextSortColumn = { columnKey: column.key, direction: sortDirection === "ASC" ? "DESC" : "ASC" }; if (ctrlClick) { const nextSortColumns = [...sortColumns]; if (nextSortColumn) nextSortColumns[sortIndex] = nextSortColumn; else nextSortColumns.splice(sortIndex, 1); onSortColumnsChange(nextSortColumns); } else onSortColumnsChange(nextSortColumn ? [nextSortColumn] : []); } } function onClick(event) { selectCell({ idx: column.idx, rowIdx }); if (sortable) onSort(event.ctrlKey || event.metaKey); } function handleFocus(event) { onFocus?.(event); if (shouldFocusGrid) selectCell({ idx: 0, rowIdx }); } function onKeyDown(event) { const { key } = event; if (sortable && (key === " " || key === "Enter")) { event.preventDefault(); onSort(event.ctrlKey || event.metaKey); } else if (resizable && isCtrlKeyHeldDown(event) && (key === "ArrowLeft" || key === "ArrowRight")) { event.stopPropagation(); const { width } = event.currentTarget.getBoundingClientRect(); const { leftKey } = getLeftRightKey(direction); const offset = key === leftKey ? -10 : 10; const newWidth = clampColumnWidth(width + offset, column); if (newWidth !== width) onColumnResize(column, newWidth); } } function onDragStart(event) { event.dataTransfer.setData(dragDropKey, column.key); event.dataTransfer.dropEffect = "move"; setIsDragging(true); } function onDragEnd() { setIsDragging(false); } function onDragOver(event) { event.preventDefault(); event.dataTransfer.dropEffect = "move"; } function onDrop(event) { setIsOver(false); if (event.dataTransfer.types.includes(dragDropKey.toLowerCase())) { const sourceKey = event.dataTransfer.getData(dragDropKey.toLowerCase()); if (sourceKey !== column.key) { event.preventDefault(); onColumnsReorder?.(sourceKey, column.key); } } } function onDragEnter(event) { if (isEventPertinent(event)) setIsOver(true); } function onDragLeave(event) { if (isEventPertinent(event)) setIsOver(false); } let draggableProps; if (draggable) draggableProps = { draggable: true, onDragStart, onDragEnd, onDragOver, onDragEnter, onDragLeave, onDrop }; return /* @__PURE__ */ jsxs("div", { role: "columnheader", "aria-colindex": column.idx + 1, "aria-colspan": colSpan, "aria-rowspan": rowSpan, "aria-selected": isCellSelected, "aria-sort": ariaSort, tabIndex: shouldFocusGrid ? 0 : tabIndex, className, style: { ...getHeaderCellStyle(column, rowIdx, rowSpan), ...getCellStyle(column, colSpan) }, onFocus: handleFocus, onClick, onKeyDown, ...draggableProps, children: [column.renderHeaderCell({ column, sortDirection, priority, tabIndex: childTabIndex }), resizable && /* @__PURE__ */ jsx(ResizeHandle, { column, onColumnResize, direction })] }); } function ResizeHandle({ column, onColumnResize, direction }) { const resizingOffsetRef = useRef(void 0); const isRtl = direction === "rtl"; function onPointerDown(event) { if (event.pointerType === "mouse" && event.buttons !== 1) return; event.preventDefault(); const { currentTarget, pointerId } = event; currentTarget.setPointerCapture(pointerId); const headerCell = currentTarget.parentElement; const { right, left } = headerCell.getBoundingClientRect(); resizingOffsetRef.current = isRtl ? event.clientX - left : right - event.clientX; } function onPointerMove(event) { const offset = resizingOffsetRef.current; if (offset === void 0) return; const { width, right, left } = event.currentTarget.parentElement.getBoundingClientRect(); let newWidth = isRtl ? right + offset - event.clientX : event.clientX + offset - left; newWidth = clampColumnWidth(newWidth, column); if (width > 0 && newWidth !== width) onColumnResize(column, newWidth); } function onLostPointerCapture() { resizingOffsetRef.current = void 0; } function onDoubleClick() { onColumnResize(column, "max-content"); } return /* @__PURE__ */ jsx("div", { className: resizeHandleClassname, onClick: stopPropagation, onPointerDown, onPointerMove, onLostPointerCapture, onDoubleClick }); } function isEventPertinent(event) { const relatedTarget = event.relatedTarget; return !event.currentTarget.contains(relatedTarget); } //#endregion //#region src/style/row.ts const row = "r1upfr807-0-0-beta-52"; const rowClassname = `rdg-row ${row}`; const rowSelected = "r190mhd37-0-0-beta-52"; const rowSelectedClassname = "rdg-row-selected"; const rowSelectedWithFrozenCell = "r139qu9m7-0-0-beta-52"; const topSummaryRowClassname = "rdg-top-summary-row"; const bottomSummaryRowClassname = "rdg-bottom-summary-row"; //#endregion //#region src/HeaderRow.tsx const headerRow = "h10tskcx7-0-0-beta-52"; const headerRowClassname = `rdg-header-row ${headerRow}`; function HeaderRow({ headerRowClass, rowIdx, columns, onColumnResize, onColumnsReorder, sortColumns, onSortColumnsChange, lastFrozenColumnIndex, selectedCellIdx, selectCell, shouldFocusGrid, direction }) { const dragDropKey = useId(); const cells = []; for (let index = 0; index < columns.length; index++) { const column = columns[index]; const colSpan = getColSpan(column, lastFrozenColumnIndex, { type: "HEADER" }); if (colSpan !== void 0) index += colSpan - 1; cells.push(/* @__PURE__ */ jsx(HeaderCell, { column, colSpan, rowIdx, isCellSelected: selectedCellIdx === column.idx, onColumnResize, onColumnsReorder, onSortColumnsChange, sortColumns, selectCell, shouldFocusGrid: shouldFocusGrid && index === 0, direction, dragDropKey }, column.key)); } return /* @__PURE__ */ jsx("div", { role: "row", "aria-rowindex": rowIdx, className: clsx(headerRowClassname, { [rowSelectedClassname]: selectedCellIdx === -1 }, headerRowClass), children: cells }); } var HeaderRow_default = memo(HeaderRow); //#endregion //#region src/GroupedColumnHeaderRow.tsx function GroupedColumnHeaderRow({ rowIdx, level, columns, selectedCellIdx, selectCell }) { const cells = []; const renderedParents = new Set(); for (const column of columns) { let { parent } = column; if (parent === void 0) continue; while (parent.level > level) { if (parent.parent === void 0) break; parent = parent.parent; } if (parent.level === level && !renderedParents.has(parent)) { renderedParents.add(parent); const { idx } = parent; cells.push(/* @__PURE__ */ jsx( GroupedColumnHeaderCell, // aria-rowindex is 1 based { column: parent, rowIdx, isCellSelected: selectedCellIdx === idx, selectCell }, idx )); } } return /* @__PURE__ */ jsx("div", { role: "row", "aria-rowindex": rowIdx, className: headerRowClassname, children: cells }); } var GroupedColumnHeaderRow_default = memo(GroupedColumnHeaderRow); //#endregion //#region src/Row.tsx function Row({ className, rowIdx, gridRowStart, selectedCellIdx, isRowSelectionDisabled, isRowSelected, draggedOverCellIdx, lastFrozenColumnIndex, row: row$1, viewportColumns, selectedCellEditor, onCellClick, onCellDoubleClick, onCellContextMenu, rowClass, setDraggedOverRowIdx, onMouseEnter, onRowChange, selectCell,...props }) { const renderCell = useDefaultRenderers().renderCell; const handleRowChange = useLatestFunc((column, newRow) => { onRowChange(column, rowIdx, newRow); }); function handleDragEnter(event) { setDraggedOverRowIdx?.(rowIdx); onMouseEnter?.(event); } className = clsx(rowClassname, `rdg-row-${rowIdx % 2 === 0 ? "even" : "odd"}`, { [rowSelectedClassname]: selectedCellIdx === -1 }, rowClass?.(row$1, rowIdx), className); const cells = []; for (let index = 0; index < viewportColumns.length; index++) { const column = viewportColumns[index]; const { idx } = column; const colSpan = getColSpan(column, lastFrozenColumn