Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 0 additions & 68 deletions .github/workflows/ci.yml

This file was deleted.

11 changes: 4 additions & 7 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
{
"name": "react-data-grid",
"version": "7.0.0-beta.59",
"name": "@port-labs/port-react-data-grid",
"version": "1.0.3-beta.1",
"license": "MIT",
"description": "Feature-rich and customizable data grid React component",
"description": "Forked version of @adazzle/react-data-grid with custom changes by Port Labs",
"keywords": [
"react",
"data grid"
],
"repository": {
"type": "git",
"url": "git+https://github.com/Comcast/react-data-grid.git"
"type": "git"
},
"homepage": "https://github.com/Comcast/react-data-grid#readme",
"bugs": "https://github.com/Comcast/react-data-grid/issues",
"type": "module",
"exports": {
"./lib/styles.css": "./lib/styles.css",
Expand Down
16 changes: 12 additions & 4 deletions src/DataGrid.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,9 @@ export function DataGrid<R, SR = unknown, K extends Key = Key>(props: DataGridPr
colOverscanEndIdx,
templateColumns,
layoutCssVars,
totalFrozenColumnWidth
totalFrozenColumnWidth,
rightFrozenColumnCount,
totalRightFrozenColumnWidth
} = useCalculatedColumns({
rawColumns,
defaultColumnOptions,
Expand Down Expand Up @@ -460,7 +462,8 @@ export function DataGrid<R, SR = unknown, K extends Key = Key>(props: DataGridPr
rowOverscanEndIdx,
rows,
topSummaryRows,
bottomSummaryRows
bottomSummaryRows,
rightFrozenColumnCount
});

const { gridTemplateColumns, handleColumnResize } = useColumnWidths(
Expand Down Expand Up @@ -507,7 +510,9 @@ export function DataGrid<R, SR = unknown, K extends Key = Key>(props: DataGridPr
const cell = getCellToScroll(gridRef.current!);
if (cell === null) return;

if (shouldScroll) {
const isFrozen = cell.classList.contains('rdg-cell-frozen');

if (!isFrozen && shouldScroll) {
scrollIntoView(cell);
}

Expand Down Expand Up @@ -1179,7 +1184,6 @@ export function DataGrid<R, SR = unknown, K extends Key = Key>(props: DataGridPr

const isGroupRowFocused =
selectedPosition.idx === -1 && selectedPosition.rowIdx !== minRowIdx - 1;

return (
<div
role={role}
Expand Down Expand Up @@ -1207,6 +1211,10 @@ export function DataGrid<R, SR = unknown, K extends Key = Key>(props: DataGridPr
selectedPosition.idx > lastFrozenColumnIndex || scrollToPosition?.idx !== undefined
? `${totalFrozenColumnWidth}px`
: undefined,
scrollPaddingInlineEnd:
rightFrozenColumnCount < maxRowIdx || scrollToPosition?.idx !== undefined
? `${totalRightFrozenColumnWidth}px`
: undefined,
scrollPaddingBlock:
isRowIdxWithinViewportBounds(selectedPosition.rowIdx) ||
scrollToPosition?.rowIdx !== undefined
Expand Down
7 changes: 6 additions & 1 deletion src/HeaderCell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,12 @@ const resizeHandle = css`
inset-block-start: 0;
inset-inline-end: 0;
inset-block-end: 0;
inline-size: 10px;
inline-size: 4px;

&:hover {
background: var(--rdg-selection-color);
padding: 4px 0;
}
}
`;

Expand Down
105 changes: 81 additions & 24 deletions src/hooks/useCalculatedColumns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,21 @@ export function useCalculatedColumns<R, SR>({
const defaultResizable = defaultColumnOptions?.resizable ?? false;
const defaultDraggable = defaultColumnOptions?.draggable ?? false;

const { columns, colSpanColumns, lastFrozenColumnIndex, headerRowsCount } = useMemo((): {
const {
columns,
colSpanColumns,
lastFrozenColumnIndex,
rightFrozenColumnCount,
headerRowsCount
} = useMemo((): {
readonly columns: readonly CalculatedColumn<R, SR>[];
readonly colSpanColumns: readonly CalculatedColumn<R, SR>[];
readonly lastFrozenColumnIndex: number;
readonly rightFrozenColumnCount: number;
readonly headerRowsCount: number;
} => {
let lastFrozenColumnIndex = -1;
let rightFrozenColumnCount = 0;
let headerRowsCount = 1;
const columns: MutableCalculatedColumn<R, SR>[] = [];

Expand All @@ -87,13 +95,15 @@ export function useCalculatedColumns<R, SR>({
}

const frozen = rawColumn.frozen ?? false;
const rightFrozen = rawColumn.rightFrozen ?? false;

const column: MutableCalculatedColumn<R, SR> = {
...rawColumn,
parent,
idx: 0,
level: 0,
frozen,
rightFrozen,
width: rawColumn.width ?? defaultWidth,
minWidth: rawColumn.minWidth ?? defaultMinWidth,
maxWidth: rawColumn.maxWidth ?? defaultMaxWidth,
Expand All @@ -110,29 +120,45 @@ export function useCalculatedColumns<R, SR>({
lastFrozenColumnIndex++;
}

if (rightFrozen) {
rightFrozenColumnCount++;
}

if (level > headerRowsCount) {
headerRowsCount = level;
}
}
}

columns.sort(({ key: aKey, frozen: frozenA }, { key: bKey, frozen: frozenB }) => {
// Sort select column first:
if (aKey === SELECT_COLUMN_KEY) return -1;
if (bKey === SELECT_COLUMN_KEY) return 1;
columns.sort(
(
{ key: aKey, frozen: frozenA, rightFrozen: rightFrozenA },
{ key: bKey, frozen: frozenB, rightFrozen: rightFrozenB }
) => {
// Sort select column first:
if (aKey === SELECT_COLUMN_KEY) return -1;
if (bKey === SELECT_COLUMN_KEY) return 1;

// Sort frozen columns second:
if (frozenA) {
if (frozenB) return 0;
return -1;
}
if (frozenB) return 1;

// Sort frozen columns second:
if (frozenA) {
if (frozenB) return 0;
return -1;
}
if (frozenB) return 1;
// Sort right frozen columns second:
if (rightFrozenA) {
if (rightFrozenB) return 0;
return 1;
}
if (rightFrozenB) return -1;

// TODO: sort columns to keep them grouped if they have a parent
// TODO: sort columns to keep them grouped if they have a parent

// Sort other columns last:
return 0;
});
// Sort other columns last:
return 0;
}
);

const colSpanColumns: CalculatedColumn<R, SR>[] = [];
columns.forEach((column, idx) => {
Expand All @@ -148,6 +174,7 @@ export function useCalculatedColumns<R, SR>({
columns,
colSpanColumns,
lastFrozenColumnIndex,
rightFrozenColumnCount,
headerRowsCount
};
}, [
Expand All @@ -162,15 +189,23 @@ export function useCalculatedColumns<R, SR>({
defaultDraggable
]);

const { templateColumns, layoutCssVars, totalFrozenColumnWidth, columnMetrics } = useMemo((): {
const {
templateColumns,
layoutCssVars,
totalFrozenColumnWidth,
totalRightFrozenColumnWidth,
columnMetrics
} = useMemo((): {
templateColumns: readonly string[];
layoutCssVars: Readonly<Record<string, string>>;
totalFrozenColumnWidth: number;
totalRightFrozenColumnWidth: number;
columnMetrics: ReadonlyMap<CalculatedColumn<R, SR>, ColumnMetric>;
} => {
const columnMetrics = new Map<CalculatedColumn<R, SR>, ColumnMetric>();
let left = 0;
let totalFrozenColumnWidth = 0;
let totalRightFrozenColumnWidth = 0;
const templateColumns: string[] = [];

for (const column of columns) {
Expand All @@ -195,24 +230,42 @@ export function useCalculatedColumns<R, SR>({

const layoutCssVars: Record<string, string> = {};

if (rightFrozenColumnCount !== 0) {
let rightEnd = 0;
for (let i = columns.length - 1; i >= columns.length - rightFrozenColumnCount; i--) {
const column = columns[i];
const columnMetric = columnMetrics.get(column)!;
totalRightFrozenColumnWidth += columnMetric.width;
layoutCssVars[`--rdg-frozen-right-${column.idx}`] = `${rightEnd}px`;
rightEnd += columnMetric.width;
}
}

for (let i = 0; i <= lastFrozenColumnIndex; i++) {
const column = columns[i];
layoutCssVars[`--rdg-frozen-left-${column.idx}`] = `${columnMetrics.get(column)!.left}px`;
}

return { templateColumns, layoutCssVars, totalFrozenColumnWidth, columnMetrics };
}, [getColumnWidth, columns, lastFrozenColumnIndex]);
return {
templateColumns,
layoutCssVars,
totalFrozenColumnWidth,
totalRightFrozenColumnWidth,
columnMetrics
};
}, [getColumnWidth, columns, lastFrozenColumnIndex, rightFrozenColumnCount]);

const [colOverscanStartIdx, colOverscanEndIdx] = useMemo((): [number, number] => {
if (!enableVirtualization) {
return [0, columns.length - 1];
}
// get the viewport's left side and right side positions for non-frozen columns
const viewportLeft = scrollLeft + totalFrozenColumnWidth;
const viewportRight = scrollLeft + viewportWidth;
const viewportRight = scrollLeft + viewportWidth - totalRightFrozenColumnWidth;
// get first and last non-frozen column indexes
const lastColIdx = columns.length - 1;
const firstUnfrozenColumnIdx = min(lastFrozenColumnIndex + 1, lastColIdx);
const lastUnfrozonColumnIdx = min(columns.length - rightFrozenColumnCount - 1, lastColIdx);

// skip rendering non-frozen columns if the frozen columns cover the entire viewport
if (viewportLeft >= viewportRight) {
Expand All @@ -221,7 +274,7 @@ export function useCalculatedColumns<R, SR>({

// get the first visible non-frozen column index
let colVisibleStartIdx = firstUnfrozenColumnIdx;
while (colVisibleStartIdx < lastColIdx) {
while (colVisibleStartIdx < lastUnfrozonColumnIdx) {
const { left, width } = columnMetrics.get(columns[colVisibleStartIdx])!;
// if the right side of the columnn is beyond the left side of the available viewport,
// then it is the first column that's at least partially visible
Expand All @@ -233,7 +286,7 @@ export function useCalculatedColumns<R, SR>({

// get the last visible non-frozen column index
let colVisibleEndIdx = colVisibleStartIdx;
while (colVisibleEndIdx < lastColIdx) {
while (colVisibleEndIdx < lastUnfrozonColumnIdx) {
const { left, width } = columnMetrics.get(columns[colVisibleEndIdx])!;
// if the right side of the column is beyond or equal to the right side of the available viewport,
// then it the last column that's at least partially visible, as the previous column's right side is not beyond the viewport.
Expand All @@ -244,7 +297,7 @@ export function useCalculatedColumns<R, SR>({
}

const colOverscanStartIdx = max(firstUnfrozenColumnIdx, colVisibleStartIdx - 1);
const colOverscanEndIdx = min(lastColIdx, colVisibleEndIdx + 1);
const colOverscanEndIdx = min(lastUnfrozonColumnIdx, colVisibleEndIdx + 1);

return [colOverscanStartIdx, colOverscanEndIdx];
}, [
Expand All @@ -253,8 +306,10 @@ export function useCalculatedColumns<R, SR>({
lastFrozenColumnIndex,
scrollLeft,
totalFrozenColumnWidth,
totalRightFrozenColumnWidth,
viewportWidth,
enableVirtualization
enableVirtualization,
rightFrozenColumnCount
]);

return {
Expand All @@ -266,7 +321,9 @@ export function useCalculatedColumns<R, SR>({
layoutCssVars,
headerRowsCount,
lastFrozenColumnIndex,
totalFrozenColumnWidth
totalFrozenColumnWidth,
rightFrozenColumnCount,
totalRightFrozenColumnWidth
};
}

Expand Down
Loading