Skip to content

Commit 1090074

Browse files
rahulyadav5524Mihran Margaryan
authored andcommitted
Added feature to right side freeze columnj
1 parent 0f833b4 commit 1090074

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
@@ -911,6 +911,9 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
911911
const maxColumnWidth = Math.max(maxColumnWidthIn, minColumnWidth);
912912
const maxColumnAutoWidth = Math.max(maxColumnAutoWidthIn ?? maxColumnWidth, minColumnWidth);
913913

914+
const freezeLeftColumns = typeof freezeColumns === "number" ? freezeColumns: freezeColumns[0];
915+
const freezeRightColumns = typeof freezeColumns === "number" ? 0 : freezeColumns[1];
916+
914917
const docStyle = React.useMemo(() => {
915918
if (typeof window === "undefined") return { fontSize: "16px" };
916919
return window.getComputedStyle(document.documentElement);
@@ -1559,9 +1562,13 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
15591562
height: targetRect.height + 2 * paddingY,
15601563
};
15611564

1562-
let frozenWidth = 0;
1563-
for (let i = 0; i < freezeColumns; i++) {
1564-
frozenWidth += columns[i].width;
1565+
let frozenLeftWidth = 0;
1566+
for (let i = 0; i < freezeLeftColumns; i++) {
1567+
frozenLeftWidth += columns[i].width;
1568+
}
1569+
let frozenRightWidth = 0;
1570+
for (let i = mangledCols.length - 1; i >= mangledCols.length - freezeRightColumns; i--) {
1571+
frozenRightWidth += columns[i].width;
15651572
}
15661573
let trailingRowHeight = 0;
15671574
const freezeTrailingRowsEffective = freezeTrailingRows + (lastRowSticky ? 1 : 0);
@@ -1574,8 +1581,8 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
15741581
}
15751582

15761583
// scrollBounds is already scaled
1577-
let sLeft = frozenWidth * scale + scrollBounds.left + rowMarkerOffset * rowMarkerWidth * scale;
1578-
let sRight = scrollBounds.right;
1584+
let sLeft = frozenLeftWidth * scale + scrollBounds.left + rowMarkerOffset * rowMarkerWidth * scale;
1585+
let sRight = scrollBounds.right - frozenRightWidth * scale;
15791586
let sTop = scrollBounds.top + totalHeaderHeight * scale;
15801587
let sBottom = scrollBounds.bottom - trailingRowHeight * scale;
15811588

@@ -1619,7 +1626,11 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
16191626
scrollY = bounds.y + bounds.height - sBottom;
16201627
}
16211628

1622-
if (dir === "vertical" || (typeof col === "number" && col < freezeColumns)) {
1629+
if (
1630+
dir === "vertical" ||
1631+
(typeof col === "number" &&
1632+
(col < freezeLeftColumns || col >= mangledCols.length - freezeRightColumns))
1633+
) {
16231634
scrollX = 0;
16241635
} else if (
16251636
dir === "horizontal" ||
@@ -1650,7 +1661,9 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
16501661
rowMarkerWidth,
16511662
scrollRef,
16521663
totalHeaderHeight,
1653-
freezeColumns,
1664+
freezeLeftColumns,
1665+
freezeRightColumns,
1666+
mangledCols.length,
16541667
columns,
16551668
mangledRows,
16561669
lastRowSticky,
@@ -2557,18 +2570,29 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
25572570
selected = [selected[0] - rowMarkerOffset, selected[1]];
25582571
}
25592572

2560-
const freezeRegion =
2561-
freezeColumns === 0
2573+
const freezeLeftRegion =
2574+
freezeLeftColumns === 0
25622575
? undefined
25632576
: {
25642577
x: 0,
25652578
y: region.y,
2566-
width: freezeColumns,
2579+
width: freezeLeftColumns,
2580+
height: region.height,
2581+
};
2582+
2583+
const freezeRightRegion =
2584+
freezeRightColumns === 0
2585+
? undefined
2586+
: {
2587+
x: columns.length - freezeRightColumns,
2588+
y: region.y,
2589+
width: freezeRightColumns,
25672590
height: region.height,
25682591
};
25692592

25702593
const freezeRegions: Rectangle[] = [];
2571-
if (freezeRegion !== undefined) freezeRegions.push(freezeRegion);
2594+
if (freezeLeftRegion !== undefined) freezeRegions.push(freezeLeftRegion);
2595+
if (freezeRightRegion !== undefined) freezeRegions.push(freezeRightRegion);
25722596
if (freezeTrailingRows > 0) {
25732597
freezeRegions.push({
25742598
x: region.x - rowMarkerOffset,
@@ -2577,11 +2601,20 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
25772601
height: freezeTrailingRows,
25782602
});
25792603

2580-
if (freezeColumns > 0) {
2604+
if (freezeLeftColumns > 0) {
25812605
freezeRegions.push({
25822606
x: 0,
25832607
y: rows - freezeTrailingRows,
2584-
width: freezeColumns,
2608+
width: freezeLeftColumns,
2609+
height: freezeTrailingRows,
2610+
});
2611+
}
2612+
2613+
if (freezeRightColumns > 0) {
2614+
freezeRegions.push({
2615+
x: columns.length - freezeRightColumns,
2616+
y: rows - freezeTrailingRows,
2617+
width: freezeRightColumns,
25852618
height: freezeTrailingRows,
25862619
});
25872620
}
@@ -2596,7 +2629,7 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
25962629
ty,
25972630
extras: {
25982631
selected,
2599-
freezeRegion,
2632+
freezeRegion: freezeLeftRegion,
26002633
freezeRegions,
26012634
},
26022635
};
@@ -2610,7 +2643,9 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
26102643
rowMarkerOffset,
26112644
showTrailingBlankRow,
26122645
rows,
2613-
freezeColumns,
2646+
freezeLeftColumns,
2647+
freezeRightColumns,
2648+
columns.length,
26142649
freezeTrailingRows,
26152650
setVisibleRegion,
26162651
onVisibleRegionChanged,
@@ -3944,7 +3979,7 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
39443979
);
39453980
}, [onGroupHeaderRenamed, renameGroup]);
39463981

3947-
const mangledFreezeColumns = Math.min(mangledCols.length, freezeColumns + (hasRowMarkers ? 1 : 0));
3982+
const mangledFreezeColumns = Math.min(mangledCols.length, freezeLeftColumns + (hasRowMarkers ? 1 : 0));
39483983

39493984
React.useImperativeHandle(
39503985
forwardedRef,
@@ -4212,7 +4247,7 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
42124247
onColumnProposeMove={onColumnProposeMoveImpl}
42134248
drawCell={drawCell}
42144249
disabledRows={disabledRows}
4215-
freezeColumns={mangledFreezeColumns}
4250+
freezeColumns={[mangledFreezeColumns, freezeRightColumns]}
42164251
lockColumns={rowMarkerOffset}
42174252
firstColAccessible={rowMarkerOffset === 0}
42184253
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)