Skip to content

Commit 01c5c00

Browse files
rahulyadav5524Mihran Margaryan
authored andcommitted
Added feature to right side freeze columnj
1 parent 580aa1a commit 01c5c00

14 files changed

+347
-113
lines changed

packages/core/src/data-editor/data-editor.tsx

Lines changed: 52 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,9 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
894894
const maxColumnWidth = Math.max(maxColumnWidthIn, minColumnWidth);
895895
const maxColumnAutoWidth = Math.max(maxColumnAutoWidthIn ?? maxColumnWidth, minColumnWidth);
896896

897+
const freezeLeftColumns = typeof freezeColumns === "number" ? freezeColumns: freezeColumns[0];
898+
const freezeRightColumns = typeof freezeColumns === "number" ? 0 : freezeColumns[1];
899+
897900
const docStyle = React.useMemo(() => {
898901
if (typeof window === "undefined") return { fontSize: "16px" };
899902
return window.getComputedStyle(document.documentElement);
@@ -1542,9 +1545,13 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
15421545
height: targetRect.height + 2 * paddingY,
15431546
};
15441547

1545-
let frozenWidth = 0;
1546-
for (let i = 0; i < freezeColumns; i++) {
1547-
frozenWidth += columns[i].width;
1548+
let frozenLeftWidth = 0;
1549+
for (let i = 0; i < freezeLeftColumns; i++) {
1550+
frozenLeftWidth += columns[i].width;
1551+
}
1552+
let frozenRightWidth = 0;
1553+
for (let i = mangledCols.length - 1; i >= mangledCols.length - freezeRightColumns; i--) {
1554+
frozenRightWidth += columns[i].width;
15481555
}
15491556
let trailingRowHeight = 0;
15501557
const freezeTrailingRowsEffective = freezeTrailingRows + (lastRowSticky ? 1 : 0);
@@ -1557,8 +1564,8 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
15571564
}
15581565

15591566
// scrollBounds is already scaled
1560-
let sLeft = frozenWidth * scale + scrollBounds.left + rowMarkerOffset * rowMarkerWidth * scale;
1561-
let sRight = scrollBounds.right;
1567+
let sLeft = frozenLeftWidth * scale + scrollBounds.left + rowMarkerOffset * rowMarkerWidth * scale;
1568+
let sRight = scrollBounds.right - frozenRightWidth * scale;
15621569
let sTop = scrollBounds.top + totalHeaderHeight * scale;
15631570
let sBottom = scrollBounds.bottom - trailingRowHeight * scale;
15641571

@@ -1602,7 +1609,11 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
16021609
scrollY = bounds.y + bounds.height - sBottom;
16031610
}
16041611

1605-
if (dir === "vertical" || (typeof col === "number" && col < freezeColumns)) {
1612+
if (
1613+
dir === "vertical" ||
1614+
(typeof col === "number" &&
1615+
(col < freezeLeftColumns || col >= mangledCols.length - freezeRightColumns))
1616+
) {
16061617
scrollX = 0;
16071618
} else if (
16081619
dir === "horizontal" ||
@@ -1633,7 +1644,9 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
16331644
rowMarkerWidth,
16341645
scrollRef,
16351646
totalHeaderHeight,
1636-
freezeColumns,
1647+
freezeLeftColumns,
1648+
freezeRightColumns,
1649+
mangledCols.length,
16371650
columns,
16381651
mangledRows,
16391652
lastRowSticky,
@@ -2483,18 +2496,29 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
24832496
selected = [selected[0] - rowMarkerOffset, selected[1]];
24842497
}
24852498

2486-
const freezeRegion =
2487-
freezeColumns === 0
2499+
const freezeLeftRegion =
2500+
freezeLeftColumns === 0
24882501
? undefined
24892502
: {
24902503
x: 0,
24912504
y: region.y,
2492-
width: freezeColumns,
2505+
width: freezeLeftColumns,
2506+
height: region.height,
2507+
};
2508+
2509+
const freezeRightRegion =
2510+
freezeRightColumns === 0
2511+
? undefined
2512+
: {
2513+
x: columns.length - freezeRightColumns,
2514+
y: region.y,
2515+
width: freezeRightColumns,
24932516
height: region.height,
24942517
};
24952518

24962519
const freezeRegions: Rectangle[] = [];
2497-
if (freezeRegion !== undefined) freezeRegions.push(freezeRegion);
2520+
if (freezeLeftRegion !== undefined) freezeRegions.push(freezeLeftRegion);
2521+
if (freezeRightRegion !== undefined) freezeRegions.push(freezeRightRegion);
24982522
if (freezeTrailingRows > 0) {
24992523
freezeRegions.push({
25002524
x: region.x - rowMarkerOffset,
@@ -2503,11 +2527,20 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
25032527
height: freezeTrailingRows,
25042528
});
25052529

2506-
if (freezeColumns > 0) {
2530+
if (freezeLeftColumns > 0) {
25072531
freezeRegions.push({
25082532
x: 0,
25092533
y: rows - freezeTrailingRows,
2510-
width: freezeColumns,
2534+
width: freezeLeftColumns,
2535+
height: freezeTrailingRows,
2536+
});
2537+
}
2538+
2539+
if (freezeRightColumns > 0) {
2540+
freezeRegions.push({
2541+
x: columns.length - freezeRightColumns,
2542+
y: rows - freezeTrailingRows,
2543+
width: freezeRightColumns,
25112544
height: freezeTrailingRows,
25122545
});
25132546
}
@@ -2522,7 +2555,7 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
25222555
ty,
25232556
extras: {
25242557
selected,
2525-
freezeRegion,
2558+
freezeRegion: freezeLeftRegion,
25262559
freezeRegions,
25272560
},
25282561
};
@@ -2536,7 +2569,9 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
25362569
rowMarkerOffset,
25372570
showTrailingBlankRow,
25382571
rows,
2539-
freezeColumns,
2572+
freezeLeftColumns,
2573+
freezeRightColumns,
2574+
columns.length,
25402575
freezeTrailingRows,
25412576
setVisibleRegion,
25422577
onVisibleRegionChanged,
@@ -3850,7 +3885,7 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
38503885
);
38513886
}, [onGroupHeaderRenamed, renameGroup]);
38523887

3853-
const mangledFreezeColumns = Math.min(mangledCols.length, freezeColumns + (hasRowMarkers ? 1 : 0));
3888+
const mangledFreezeColumns = Math.min(mangledCols.length, freezeLeftColumns + (hasRowMarkers ? 1 : 0));
38543889

38553890
React.useImperativeHandle(
38563891
forwardedRef,
@@ -4107,7 +4142,7 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
41074142
onColumnProposeMove={onColumnProposeMoveImpl}
41084143
drawCell={drawCell}
41094144
disabledRows={disabledRows}
4110-
freezeColumns={mangledFreezeColumns}
4145+
freezeColumns={[mangledFreezeColumns, freezeRightColumns]}
41114146
lockColumns={rowMarkerOffset}
41124147
firstColAccessible={rowMarkerOffset === 0}
41134148
getCellContent={getMangledCellContent}

packages/core/src/docs/examples/freeze-columns.stories.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ export default {
3030
],
3131
};
3232

33-
export const FreezeColumns: React.VFC<any> = (p: { freezeColumns: number }) => {
33+
export const FreezeColumns: React.VFC<any> = (p: { freezeLeftColumns: number, freezeRightColumns: number }) => {
3434
const { cols, getCellContent } = useMockDataGenerator(100);
3535

3636
return (
3737
<DataEditor
3838
{...defaultProps}
3939
rowMarkers="both"
40-
freezeColumns={p.freezeColumns}
40+
freezeColumns={[p.freezeLeftColumns, p.freezeRightColumns]}
4141
getCellContent={getCellContent}
4242
columns={cols}
4343
verticalBorder={false}
@@ -46,7 +46,14 @@ export const FreezeColumns: React.VFC<any> = (p: { freezeColumns: number }) => {
4646
);
4747
};
4848
(FreezeColumns as any).argTypes = {
49-
freezeColumns: {
49+
freezeLeftColumns: {
50+
control: {
51+
type: "range",
52+
min: 0,
53+
max: 10,
54+
},
55+
},
56+
freezeRightColumns: {
5057
control: {
5158
type: "range",
5259
min: 0,
@@ -55,5 +62,6 @@ export const FreezeColumns: React.VFC<any> = (p: { freezeColumns: number }) => {
5562
},
5663
};
5764
(FreezeColumns as any).args = {
58-
freezeColumns: 1,
65+
freezeLeftColumns: 1,
66+
freezeRightColumns: 1,
5967
};

0 commit comments

Comments
 (0)