react-data-grid
Version:
Feature-rich and customizable data grid React component
1,534 lines (1,501 loc) • 96.1 kB
JavaScript
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