Skip to content

Commit fd360fb

Browse files
Mihran MargaryanMihran Margaryan
authored andcommitted
fix image loader doesn't take into account freezeColumns new api
1 parent 1026249 commit fd360fb

File tree

5 files changed

+61
-32
lines changed

5 files changed

+61
-32
lines changed

packages/core/src/common/render-state-provider.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,33 +35,42 @@ export abstract class WindowingTrackerBase {
3535
height: 0,
3636
};
3737

38-
public freezeCols: number = 0;
38+
public columnsLength: number = 0;
39+
public freezeCols: number | readonly [number, number] = 0;
3940
public freezeRows: number[] = [];
4041

4142
protected isInWindow = (packed: number) => {
43+
const freezeColumnsLeft = typeof this.freezeCols === "number" ? this.freezeCols : this.freezeCols[0];
44+
const freezeColumnsRight = typeof this.freezeCols === "number" ? 0 : this.freezeCols[1];
4245
const col = unpackCol(packed);
4346
const row = unpackRow(packed);
4447
const w = this.visibleWindow;
45-
const colInWindow = (col >= w.x && col <= w.x + w.width) || col < this.freezeCols;
48+
const colInWindow =
49+
(col >= w.x && col <= w.x + w.width) ||
50+
col < freezeColumnsLeft ||
51+
col > this.columnsLength - freezeColumnsRight - 1;
52+
4653
const rowInWindow = (row >= w.y && row <= w.y + w.height) || this.freezeRows.includes(row);
4754
return colInWindow && rowInWindow;
4855
};
4956

5057
protected abstract clearOutOfWindow: () => void;
5158

52-
public setWindow(newWindow: Rectangle, freezeCols: number, freezeRows: number[]): void {
59+
public setWindow(newWindow: Rectangle, freezeCols: number, freezeRows: number[], columnsLength: number): void {
5360
if (
5461
this.visibleWindow.x === newWindow.x &&
5562
this.visibleWindow.y === newWindow.y &&
5663
this.visibleWindow.width === newWindow.width &&
5764
this.visibleWindow.height === newWindow.height &&
5865
this.freezeCols === freezeCols &&
66+
this.columnsLength === columnsLength &&
5967
deepEqual(this.freezeRows, freezeRows)
6068
)
6169
return;
6270
this.visibleWindow = newWindow;
6371
this.freezeCols = freezeCols;
6472
this.freezeRows = freezeRows;
73+
this.columnsLength = columnsLength;
6574
this.clearOutOfWindow();
6675
}
6776
}

packages/core/src/internal/data-grid/image-window-loader-interface.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ export interface ImageWindowLoader {
66
setWindow(
77
newWindow: Rectangle,
88
freezeCols: number | readonly [left: number, right: number],
9-
freezeRows: number[]
9+
freezeRows: number[],
10+
columnsLength: number
1011
): void;
1112
loadOrGetImage(url: string, col: number, row: number): HTMLImageElement | ImageBitmap | undefined;
1213
setCallback(imageLoaded: (locations: CellSet) => void): void;

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

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,10 @@ function clipHeaderDamage(
7171
const diff = Math.max(0, clipX - drawX);
7272

7373
const finalX = drawX + diff + 1;
74-
const finalWidth = c.stickyPosition === "right" ? c.width - diff : Math.min(c.width - diff - 1, width - drawX - clipXRight); // c.width - diff - 1;
74+
const finalWidth =
75+
c.stickyPosition === "right"
76+
? c.width - diff
77+
: Math.min(c.width - diff - 1, width - drawX - clipXRight);
7578
if (damage.has([c.sourceIndex, -1])) {
7679
ctx.rect(finalX, groupHeaderHeight, finalWidth, totalHeaderHeight - groupHeaderHeight);
7780
}
@@ -631,25 +634,25 @@ export function drawGrid(arg: DrawGridArg, lastArg: DrawGridArg | undefined) {
631634
// the overdraw may have nuked out our focus ring right edge.
632635
const focusRedraw = drawFocus
633636
? drawFillHandle(
634-
targetCtx,
635-
width,
636-
height,
637-
cellYOffset,
638-
translateX,
639-
translateY,
640-
effectiveCols,
641-
mappedColumns,
642-
theme,
643-
totalHeaderHeight,
644-
selection,
645-
getRowHeight,
646-
getCellContent,
647-
freezeTrailingRows,
648-
freezeRightColumns,
649-
hasAppendRow,
650-
fillHandle,
651-
rows
652-
)
637+
targetCtx,
638+
width,
639+
height,
640+
cellYOffset,
641+
translateX,
642+
translateY,
643+
effectiveCols,
644+
mappedColumns,
645+
theme,
646+
totalHeaderHeight,
647+
selection,
648+
getRowHeight,
649+
getCellContent,
650+
freezeTrailingRows,
651+
freezeRightColumns,
652+
hasAppendRow,
653+
fillHandle,
654+
rows
655+
)
653656
: undefined;
654657

655658
targetCtx.fillStyle = theme.bgCell;
@@ -823,7 +826,8 @@ export function drawGrid(arg: DrawGridArg, lastArg: DrawGridArg | undefined) {
823826
height: lastRowDrawn - cellYOffset,
824827
},
825828
freezeColumns,
826-
Array.from({ length: freezeTrailingRows }, (_, i) => rows - 1 - i)
829+
Array.from({ length: freezeTrailingRows }, (_, i) => rows - 1 - i),
830+
mappedColumns.length
827831
);
828832

829833
const scrollX = last !== undefined && (cellXOffset !== last.cellXOffset || translateX !== last.translateX);

packages/core/test/image-window-loader.test.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,28 @@ describe("ImageWindowLoaderImpl", () => {
1919
};
2020
const freezeCols = 5;
2121

22-
loader.setWindow(newWindow, freezeCols, []);
22+
loader.setWindow(newWindow, freezeCols, [], 10);
2323

2424
// Assuming you modify your class to expose `visibleWindow` and `freezeCols` for testing
2525
expect(loader.visibleWindow).toEqual(newWindow);
2626
expect(loader.freezeCols).toBe(freezeCols);
2727
});
2828

29+
it("should set the new columnsLength", () => {
30+
const newWindow = {
31+
x: 10,
32+
y: 10,
33+
width: 100,
34+
height: 100,
35+
};
36+
const freezeCols = 5;
37+
const columnsLength = 10;
38+
39+
loader.setWindow(newWindow, freezeCols, [], columnsLength);
40+
41+
expect(loader.columnsLength).toBe(columnsLength);
42+
});
43+
2944
it("should call clearOutOfWindow() if the window or freezeCols changes", () => {
3045
const spyClearOutOfWindow = vi.spyOn(loader, "clearOutOfWindow" as any); // Private method, so using 'as any'
3146

@@ -44,13 +59,13 @@ describe("ImageWindowLoaderImpl", () => {
4459
const freezeCols1 = 5;
4560
const freezeCols2 = 10;
4661

47-
loader.setWindow(window1, freezeCols1, []);
62+
loader.setWindow(window1, freezeCols1, [], 10);
4863
expect(spyClearOutOfWindow).toHaveBeenCalledTimes(1);
4964

50-
loader.setWindow(window2, freezeCols1, []);
65+
loader.setWindow(window2, freezeCols1, [], 10);
5166
expect(spyClearOutOfWindow).toHaveBeenCalledTimes(2);
5267

53-
loader.setWindow(window2, freezeCols2, []);
68+
loader.setWindow(window2, freezeCols2, [], 10);
5469
expect(spyClearOutOfWindow).toHaveBeenCalledTimes(3);
5570

5671
// Cleanup
@@ -68,8 +83,8 @@ describe("ImageWindowLoaderImpl", () => {
6883
};
6984
const freezeCols = 5;
7085

71-
loader.setWindow(newWindow, freezeCols, []);
72-
loader.setWindow(newWindow, freezeCols, []);
86+
loader.setWindow(newWindow, freezeCols, [], 10);
87+
loader.setWindow(newWindow, freezeCols, [], 10);
7388

7489
expect(spyClearOutOfWindow).toHaveBeenCalledTimes(1);
7590

packages/core/test/render-state-provider.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ describe("Data Grid Utility Functions", () => {
7878
it("should update visible window and freeze columns correctly", () => {
7979
renderStateProvider.setValue([0, 30], "state");
8080
renderStateProvider.setValue([1, 0], "state");
81-
renderStateProvider.setWindow(testRectangle, 1, []);
81+
renderStateProvider.setWindow(testRectangle, 1, [], 10);
8282
expect(renderStateProvider.getValue([0, 30])).to.equal("state");
8383
expect(renderStateProvider.getValue([1, 0])).to.equal(undefined);
8484
});

0 commit comments

Comments
 (0)