Skip to content

Commit 67a8c55

Browse files
Mihran MargaryanMihran Margaryan
authored andcommitted
add utility function to extract left and right freeze, minor fixes
1 parent 387ad51 commit 67a8c55

File tree

8 files changed

+30
-20
lines changed

8 files changed

+30
-20
lines changed

packages/core/src/common/utils.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,3 +282,10 @@ export function useDeepMemo<T>(value: T): T {
282282

283283
return ref.current;
284284
}
285+
286+
export function normalizeFreezeColumns(freezeColumns: number | readonly [number, number]): readonly [number, number] {
287+
const freezeLeftColumns = typeof freezeColumns === "number" ? freezeColumns : freezeColumns[0];
288+
const freezeRightColumns = typeof freezeColumns === "number" ? 0 : freezeColumns[1];
289+
290+
return [freezeLeftColumns, freezeRightColumns];
291+
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import {
4444
mergeAndRealizeTheme,
4545
} from "../common/styles.js";
4646
import type { DataGridRef } from "../internal/data-grid/data-grid.js";
47-
import { getScrollBarWidth, useEventListener, whenDefined } from "../common/utils.js";
47+
import { getScrollBarWidth, useEventListener, normalizeFreezeColumns, whenDefined } from "../common/utils.js";
4848
import {
4949
isGroupEqual,
5050
itemsAreEqual,
@@ -911,8 +911,7 @@ 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];
914+
const [freezeLeftColumns, freezeRightColumns] = normalizeFreezeColumns(freezeColumns);
916915

917916
const docStyle = React.useMemo(() => {
918917
if (typeof window === "undefined") return { fontSize: "16px" };
@@ -1567,7 +1566,7 @@ const DataEditorImpl: React.ForwardRefRenderFunction<DataEditorRef, DataEditorPr
15671566
frozenLeftWidth += columns[i].width;
15681567
}
15691568
let frozenRightWidth = 0;
1570-
for (let i = columns.length - 1; i >= columns.length - 1 - freezeRightColumns; i--) {
1569+
for (let i = columns.length - 1; i >= columns.length - freezeRightColumns; i--) {
15711570
frozenRightWidth += columns[i].width;
15721571
}
15731572
let trailingRowHeight = 0;

packages/core/src/internal/data-grid/data-grid.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,13 @@ import {
2626
} from "./data-grid-types.js";
2727
import { CellSet } from "./cell-set.js";
2828
import { SpriteManager, type SpriteMap } from "./data-grid-sprites.js";
29-
import { direction, getScrollBarWidth, useDebouncedMemo, useEventListener } from "../../common/utils.js";
29+
import {
30+
direction,
31+
getScrollBarWidth,
32+
useDebouncedMemo,
33+
useEventListener,
34+
normalizeFreezeColumns,
35+
} from "../../common/utils.js";
3036
import clamp from "lodash/clamp.js";
3137
import makeRange from "lodash/range.js";
3238
import { drawGrid } from "./render/data-grid-render.js";
@@ -403,8 +409,7 @@ const DataGrid: React.ForwardRefRenderFunction<DataGridRef, DataGridProps> = (p,
403409
} = p;
404410
const translateX = p.translateX ?? 0;
405411
const translateY = p.translateY ?? 0;
406-
const freezeLeftColumns = typeof freezeColumns === "number" ? freezeColumns : freezeColumns[0];
407-
const freezeRightColumns = typeof freezeColumns === "number" ? 0 : freezeColumns[1];
412+
const [freezeLeftColumns, freezeRightColumns] = normalizeFreezeColumns(freezeColumns);
408413
const cellXOffset = Math.max(freezeLeftColumns, Math.min(columns.length - 1, cellXOffsetReal));
409414

410415
const ref = React.useRef<HTMLCanvasElement | null>(null);

packages/core/src/internal/data-grid/render/data-grid-lib.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
type Rectangle,
99
type BaseGridCell,
1010
} from "../data-grid-types.js";
11-
import { direction } from "../../../common/utils.js";
11+
import { direction, normalizeFreezeColumns } from "../../../common/utils.js";
1212
import React from "react";
1313
import type { BaseDrawArgs, PrepResult } from "../../../cells/cell-types.js";
1414
import { split as splitText, clearCache } from "canvas-hypertxt";
@@ -232,8 +232,7 @@ export function getEffectiveColumns(
232232
): readonly MappedGridColumn[] {
233233
const mappedCols = remapForDnDState(columns, dndState);
234234

235-
const freezeLeftColumns = typeof freezeColumns === "number" ? freezeColumns : freezeColumns[0];
236-
const freezeRightColumns = typeof freezeColumns === "number" ? 0 : freezeColumns[1];
235+
const [freezeLeftColumns, freezeRightColumns] = normalizeFreezeColumns(freezeColumns);
237236

238237
const sticky: MappedGridColumn[] = [];
239238
for (let i = 0; i < freezeLeftColumns; i++) {
@@ -829,8 +828,7 @@ export function computeBounds(
829828
height: 0,
830829
};
831830

832-
const freezeLeftColumns = typeof freezeColumns === "number" ? freezeColumns : freezeColumns[0];
833-
const freezeRightColumns = typeof freezeColumns === "number" ? 0 : freezeColumns[1];
831+
const [freezeLeftColumns, freezeRightColumns] = normalizeFreezeColumns(freezeColumns);
834832
const column = mappedColumns[col];
835833

836834
if (col >= mappedColumns.length || row >= rows || row < -2 || col < 0) {

packages/core/src/internal/data-grid/render/data-grid-render.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { drawGridHeaders } from "./data-grid-render.header.js";
1212
import { drawGridLines, overdrawStickyBoundaries, drawBlanks, drawExtraRowThemes } from "./data-grid-render.lines.js";
1313
import { blitLastFrame, blitResizedCol, computeCanBlit } from "./data-grid-render.blit.js";
1414
import { drawHighlightRings, drawFillHandle, drawColumnResizeOutline } from "./data-grid.render.rings.js";
15+
import { normalizeFreezeColumns } from "../../../common/utils.js";
1516

1617
// Future optimization opportunities
1718
// - Create a cache of a buffer used to render the full view of a partially displayed column so that when
@@ -188,8 +189,7 @@ export function drawGrid(arg: DrawGridArg, lastArg: DrawGridArg | undefined) {
188189
const doubleBuffer = renderStrategy === "double-buffer";
189190
const dpr = Math.min(maxScaleFactor, Math.ceil(window.devicePixelRatio ?? 1));
190191

191-
const freezeLeftColumns = typeof freezeColumns === "number" ? freezeColumns : freezeColumns[0];
192-
const freezeRightColumns = typeof freezeColumns === "number" ? 0 : freezeColumns[1];
192+
const [freezeLeftColumns, freezeRightColumns] = normalizeFreezeColumns(freezeColumns);
193193

194194
// if we are double buffering we need to make sure we can blit. If we can't we need to redraw the whole thing
195195
const canBlit = renderStrategy !== "direct" && computeCanBlit(arg, lastArg);

packages/core/src/internal/data-grid/render/data-grid.render.rings.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { blend, withAlpha } from "../color-parser.js";
77
import { hugRectToTarget, intersectRect, rectContains, splitRectIntoRegions } from "../../../common/math.js";
88
import { getSpanBounds, walkColumns, walkRowsInCol } from "./data-grid-render.walk.js";
99
import { type Highlight } from "./data-grid-render.cells.js";
10+
import { normalizeFreezeColumns } from "../../../common/utils.js";
1011

1112
export function drawHighlightRings(
1213
ctx: CanvasRenderingContext2D,
@@ -27,8 +28,7 @@ export function drawHighlightRings(
2728
theme: FullTheme
2829
): (() => void) | undefined {
2930
const highlightRegions = allHighlightRegions?.filter(x => x.style !== "no-outline");
30-
const freezeLeftColumns = typeof freezeColumns === "number" ? freezeColumns : freezeColumns[0];
31-
const freezeRightColumns = typeof freezeColumns === "number" ? 0 : freezeColumns[1];
31+
const [freezeLeftColumns, freezeRightColumns] = normalizeFreezeColumns(freezeColumns);
3232

3333
if (highlightRegions === undefined || highlightRegions.length === 0) return undefined;
3434

packages/core/src/internal/scrolling-data-grid/scrolling-data-grid.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as React from "react";
22
import DataGridDnd, { type DataGridDndProps } from "../data-grid-dnd/data-grid-dnd.js";
33
import type { Rectangle } from "../data-grid/data-grid-types.js";
44
import { InfiniteScroller } from "./infinite-scroller.js";
5+
import { normalizeFreezeColumns } from "../../common/utils.js";
56

67
type Props = Omit<DataGridDndProps, "width" | "height" | "eventTargetRef">;
78

@@ -102,7 +103,7 @@ const GridScroller: React.FunctionComponent<ScrollingDataGridProps> = p => {
102103
const lastY = React.useRef<number | undefined>();
103104
const lastSize = React.useRef<readonly [number, number] | undefined>();
104105

105-
const freezeLeftColumns = typeof freezeColumns === "number" ? freezeColumns : freezeColumns[0];
106+
const [freezeLeftColumns] = normalizeFreezeColumns(freezeColumns);
106107

107108
const width = nonGrowWidth + Math.max(0, overscrollX ?? 0);
108109

packages/source/src/use-collapsing-groups.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export function useCollapsingGroups(props: Props): Result {
3434
const result: [number, number][] = [];
3535
let current: [number, number] = [-1, -1];
3636
let lastGroup: string | undefined;
37-
for (let i = freezeColumnsLeft as number; i < columnsIn.length - freezeColumnsRight; i++) {
37+
for (let i = freezeColumnsLeft; i < columnsIn.length - freezeColumnsRight; i++) {
3838
const c = columnsIn[i];
3939
const group = c.group ?? "";
4040
const isCollapsed = collapsed.includes(group);
@@ -121,8 +121,8 @@ export function useCollapsingGroups(props: Props): Result {
121121
name: group,
122122
overrideTheme: collapsed.includes(group ?? "")
123123
? {
124-
bgHeader: theme.bgHeaderHasFocus,
125-
}
124+
bgHeader: theme.bgHeaderHasFocus,
125+
}
126126
: undefined,
127127
};
128128
},

0 commit comments

Comments
 (0)