@gravity-ui/dashkit 10.4.1 → 10.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/build/cjs/components/DashKit/__tests__/controlled-layout.test.js +68 -4
  2. package/build/cjs/components/DashKit/__tests__/controlled-layout.test.js.map +1 -1
  3. package/build/cjs/components/GridItem/GridItem.d.ts +20 -0
  4. package/build/cjs/components/GridItem/GridItem.js +3 -1
  5. package/build/cjs/components/GridItem/GridItem.js.map +1 -1
  6. package/build/cjs/components/GridLayout/ReactGridLayout.d.ts +37 -2
  7. package/build/cjs/components/GridLayout/ReactGridLayout.js +211 -4
  8. package/build/cjs/components/GridLayout/ReactGridLayout.js.map +1 -1
  9. package/build/cjs/components/GridLayout/__tests__/passive-resize.test.d.ts +2 -0
  10. package/build/cjs/components/GridLayout/__tests__/passive-resize.test.js +397 -0
  11. package/build/cjs/components/GridLayout/__tests__/passive-resize.test.js.map +1 -0
  12. package/build/cjs/hocs/withContext.js +35 -13
  13. package/build/cjs/hocs/withContext.js.map +1 -1
  14. package/build/cjs/package.json +1 -1
  15. package/build/esm/components/DashKit/__tests__/controlled-layout.test.js +69 -5
  16. package/build/esm/components/DashKit/__tests__/controlled-layout.test.js.map +1 -1
  17. package/build/esm/components/GridItem/GridItem.d.ts +20 -0
  18. package/build/esm/components/GridItem/GridItem.js +2 -2
  19. package/build/esm/components/GridItem/GridItem.js.map +1 -1
  20. package/build/esm/components/GridLayout/ReactGridLayout.d.ts +37 -2
  21. package/build/esm/components/GridLayout/ReactGridLayout.js +213 -5
  22. package/build/esm/components/GridLayout/ReactGridLayout.js.map +1 -1
  23. package/build/esm/components/GridLayout/__tests__/passive-resize.test.d.ts +2 -0
  24. package/build/esm/components/GridLayout/__tests__/passive-resize.test.js +394 -0
  25. package/build/esm/components/GridLayout/__tests__/passive-resize.test.js.map +1 -0
  26. package/build/esm/hocs/withContext.js +35 -13
  27. package/build/esm/hocs/withContext.js.map +1 -1
  28. package/build/esm/package.json +1 -1
  29. package/package.json +3 -2
@@ -0,0 +1,397 @@
1
+ "use strict";
2
+ /** @jest-environment jsdom */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const react_2 = require("@testing-library/react");
7
+ const react_grid_layout_1 = tslib_1.__importDefault(require("react-grid-layout"));
8
+ const GridItem_1 = tslib_1.__importStar(require("../../GridItem/GridItem.js"));
9
+ const ReactGridLayout_1 = require("../ReactGridLayout.js");
10
+ jest.mock('../../Item/Item', () => ({
11
+ __esModule: true,
12
+ default: () => null,
13
+ }));
14
+ const resizeObservers = [];
15
+ const mockPolyfillObservers = [];
16
+ const animationFrameCallbacks = new Map();
17
+ let animationFrameId = 0;
18
+ jest.mock('resize-observer-polyfill', () => ({
19
+ __esModule: true,
20
+ default: class {
21
+ constructor(callback) {
22
+ this.disconnect = jest.fn();
23
+ this.elements = new Set();
24
+ this.observe = (element) => {
25
+ this.elements.add(element);
26
+ };
27
+ this.unobserve = (element) => {
28
+ this.elements.delete(element);
29
+ };
30
+ this.callback = callback;
31
+ mockPolyfillObservers.push(this);
32
+ }
33
+ },
34
+ }));
35
+ class TestResizeObserver {
36
+ constructor(callback) {
37
+ this.disconnect = jest.fn();
38
+ this.elements = new Set();
39
+ this.unobserve = jest.fn((element) => {
40
+ this.elements.delete(element);
41
+ });
42
+ this.callback = callback;
43
+ resizeObservers.push(this);
44
+ }
45
+ observe(element) {
46
+ this.elements.add(element);
47
+ }
48
+ }
49
+ const emitResize = (width) => {
50
+ resizeObservers.forEach((observer) => {
51
+ observer.elements.forEach((element) => {
52
+ observer.callback([{ contentRect: { width }, target: element }]);
53
+ });
54
+ });
55
+ };
56
+ const emitResizeFor = (element, width) => {
57
+ resizeObservers
58
+ .filter((observer) => observer.elements.has(element))
59
+ .forEach((observer) => {
60
+ observer.callback([{ contentRect: { width }, target: element }]);
61
+ });
62
+ };
63
+ const emitPolyfillResizeFor = (element, width) => {
64
+ mockPolyfillObservers
65
+ .filter((observer) => observer.elements.has(element))
66
+ .forEach((observer) => {
67
+ observer.callback([{ contentRect: { width }, target: element }]);
68
+ });
69
+ };
70
+ const runAnimationFrame = () => {
71
+ const callbacks = Array.from(animationFrameCallbacks.values());
72
+ animationFrameCallbacks.clear();
73
+ callbacks.forEach((callback) => callback(0));
74
+ };
75
+ const gridItem = (react_1.default.createElement(GridItem_1.default, { adjustWidgetLayout: jest.fn(), id: "item", item: { data: {} }, key: "item", layout: [] }));
76
+ describe('Layout passive resize', () => {
77
+ beforeEach(() => {
78
+ resizeObservers.length = 0;
79
+ mockPolyfillObservers.length = 0;
80
+ animationFrameCallbacks.clear();
81
+ animationFrameId = 0;
82
+ global.ResizeObserver = TestResizeObserver;
83
+ window.requestAnimationFrame = jest.fn((callback) => {
84
+ animationFrameId += 1;
85
+ animationFrameCallbacks.set(animationFrameId, callback);
86
+ return animationFrameId;
87
+ });
88
+ window.cancelAnimationFrame = jest.fn((frame) => {
89
+ animationFrameCallbacks.delete(frame);
90
+ });
91
+ });
92
+ test('does not render ReactGridLayout for passive container resize', () => {
93
+ const renderSpy = jest.spyOn(react_grid_layout_1.default.prototype, 'render');
94
+ const { container } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], rowHeight: 100 },
95
+ react_1.default.createElement("div", { key: "item" })));
96
+ const rendersBeforeResize = renderSpy.mock.calls.length;
97
+ (0, react_2.act)(() => {
98
+ emitResize(900);
99
+ react_2.fireEvent.pointerDown(container.firstElementChild);
100
+ });
101
+ expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
102
+ renderSpy.mockRestore();
103
+ });
104
+ test.each([undefined, null])('uses polyfill when native ResizeObserver is %p', (resizeObserver) => {
105
+ global.ResizeObserver = resizeObserver;
106
+ const { container } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [{ h: 1, i: 'item', w: 3, x: 2, y: 0 }], rowHeight: 100 },
107
+ react_1.default.createElement("div", { key: "item" })));
108
+ const layout = container.querySelector('.react-grid-layout');
109
+ const item = container.querySelector('.react-grid-item');
110
+ expect(mockPolyfillObservers[0].elements.has(layout)).toBe(true);
111
+ (0, react_2.act)(() => {
112
+ emitPolyfillResizeFor(layout, 900);
113
+ });
114
+ expect(item === null || item === void 0 ? void 0 : item.style.width).toBe('213px');
115
+ expect(item === null || item === void 0 ? void 0 : item.style.transform).toBe('translate(158px,10px)');
116
+ });
117
+ test('commits only latest width after delivery between two quiet frames', () => {
118
+ const renderSpy = jest.spyOn(react_grid_layout_1.default.prototype, 'render');
119
+ (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: true, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], rowHeight: 100 },
120
+ react_1.default.createElement("div", { key: "item" })));
121
+ const rendersBeforeResize = renderSpy.mock.calls.length;
122
+ (0, react_2.act)(() => {
123
+ emitResize(900);
124
+ runAnimationFrame();
125
+ emitResize(1000);
126
+ });
127
+ expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
128
+ (0, react_2.act)(() => {
129
+ runAnimationFrame();
130
+ });
131
+ expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
132
+ (0, react_2.act)(() => {
133
+ runAnimationFrame();
134
+ });
135
+ expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize + 1);
136
+ expect(renderSpy.mock.instances.at(-1).props.width).toBe(1000);
137
+ renderSpy.mockRestore();
138
+ });
139
+ test('cancels second quiet frame on unmount', () => {
140
+ const renderSpy = jest.spyOn(react_grid_layout_1.default.prototype, 'render');
141
+ const { unmount } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: true, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], rowHeight: 100 },
142
+ react_1.default.createElement("div", { key: "item" })));
143
+ const rendersBeforeResize = renderSpy.mock.calls.length;
144
+ (0, react_2.act)(() => {
145
+ emitResize(900);
146
+ runAnimationFrame();
147
+ });
148
+ expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
149
+ unmount();
150
+ expect(window.cancelAnimationFrame).toHaveBeenLastCalledWith(2);
151
+ (0, react_2.act)(() => {
152
+ runAnimationFrame();
153
+ });
154
+ expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
155
+ renderSpy.mockRestore();
156
+ });
157
+ test('keeps distinct view item geometry after passive resize', () => {
158
+ const { container } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [
159
+ { h: 1, i: 'first', w: 1, x: 0, y: 0 },
160
+ { h: 1, i: 'second', w: 3, x: 2, y: 0 },
161
+ ], rowHeight: 100 },
162
+ react_1.default.createElement("div", { key: "first" }),
163
+ react_1.default.createElement("div", { key: "second" })));
164
+ (0, react_2.act)(() => {
165
+ emitResize(1000);
166
+ });
167
+ const first = container.querySelector('.react-grid-item[data-dashkit-grid-x="0"]');
168
+ const second = container.querySelector('.react-grid-item[data-dashkit-grid-x="2"]');
169
+ expect(first === null || first === void 0 ? void 0 : first.style.transform).toBe('translate(10px,10px)');
170
+ expect(first === null || first === void 0 ? void 0 : first.style.width).toBe('73px');
171
+ expect(second === null || second === void 0 ? void 0 : second.style.transform).toBe('translate(175px,10px)');
172
+ expect(second === null || second === void 0 ? void 0 : second.style.width).toBe('238px');
173
+ });
174
+ test('forwards transform mode through GridItem and uses transforms by default', () => {
175
+ const { container } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [{ h: 1, i: 'item', w: 3, x: 2, y: 0 }], rowHeight: 100 }, gridItem));
176
+ const item = container.querySelector('.react-grid-item');
177
+ (0, react_2.act)(() => {
178
+ emitResize(900);
179
+ });
180
+ expect(item === null || item === void 0 ? void 0 : item.style.width).toBe('213px');
181
+ expect(item === null || item === void 0 ? void 0 : item.dataset.dashkitGridUseCssTransforms).toBe('true');
182
+ expect(item === null || item === void 0 ? void 0 : item.style.transform).toBe('translate(158px,10px)');
183
+ expect(item === null || item === void 0 ? void 0 : item.style.left).toBe('');
184
+ expect(item === null || item === void 0 ? void 0 : item.style.top).toBe('');
185
+ });
186
+ test('switches to top and left without stale transform when CSS transforms are disabled', () => {
187
+ const { container, rerender } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [{ h: 1, i: 'item', w: 3, x: 2, y: 0 }], rowHeight: 100 }, gridItem));
188
+ const item = container.querySelector('.react-grid-item');
189
+ (0, react_2.act)(() => {
190
+ emitResize(900);
191
+ });
192
+ rerender(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [{ h: 1, i: 'item', w: 3, x: 2, y: 0 }], rowHeight: 100, useCSSTransforms: false }, gridItem));
193
+ (0, react_2.act)(() => {
194
+ emitResize(1000);
195
+ });
196
+ expect(item === null || item === void 0 ? void 0 : item.dataset.dashkitGridUseCssTransforms).toBe('false');
197
+ expect(item === null || item === void 0 ? void 0 : item.style.width).toBe('238px');
198
+ expect(item === null || item === void 0 ? void 0 : item.style.left).toBe('175px');
199
+ expect(item === null || item === void 0 ? void 0 : item.style.top).toBe('10px');
200
+ expect(item === null || item === void 0 ? void 0 : item.style.transform).toBe('');
201
+ });
202
+ test('resizes only direct grid items when layouts are nested', () => {
203
+ const { container, getByTestId } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [{ h: 1, i: 'outer', w: 3, x: 2, y: 0 }], rowHeight: 100 },
204
+ react_1.default.createElement("div", { "data-testid": "outer-item", key: "outer" },
205
+ react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [{ h: 1, i: 'inner', w: 2, x: 1, y: 0 }], rowHeight: 100 },
206
+ react_1.default.createElement("div", { "data-testid": "inner-item", key: "inner" })))));
207
+ const layouts = container.querySelectorAll('.react-grid-layout');
208
+ const outerItem = getByTestId('outer-item');
209
+ const innerItem = getByTestId('inner-item');
210
+ (0, react_2.act)(() => {
211
+ emitResizeFor(layouts[1], 500);
212
+ });
213
+ const innerWidth = innerItem.style.width;
214
+ const innerTransform = innerItem.style.transform;
215
+ expect(innerWidth).toBe('72px');
216
+ expect(innerTransform).toBe('translate(51px,10px)');
217
+ (0, react_2.act)(() => {
218
+ emitResizeFor(layouts[0], 1000);
219
+ });
220
+ expect(outerItem.style.width).toBe('238px');
221
+ expect(innerItem.style.width).toBe(innerWidth);
222
+ expect(innerItem.style.transform).toBe(innerTransform);
223
+ });
224
+ test('updates editable idle geometry and refreshes RGL width before interaction', () => {
225
+ const renderSpy = jest.spyOn(react_grid_layout_1.default.prototype, 'render');
226
+ const { container } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: true, isResizable: true, layout: [{ h: 1, i: 'item', w: 3, x: 2, y: 0 }], rowHeight: 100 },
227
+ react_1.default.createElement("div", { key: "item" })));
228
+ const item = container.querySelector('.react-grid-item[data-dashkit-grid-cols]');
229
+ (0, react_2.act)(() => {
230
+ emitResize(900);
231
+ });
232
+ expect(item === null || item === void 0 ? void 0 : item.style.width).toBe('213px');
233
+ expect(item === null || item === void 0 ? void 0 : item.style.transform).toBe('translate(158px,10px)');
234
+ item === null || item === void 0 ? void 0 : item.classList.add('react-draggable-dragging');
235
+ (0, react_2.act)(() => {
236
+ emitResize(1000);
237
+ });
238
+ expect(item === null || item === void 0 ? void 0 : item.style.width).toBe('213px');
239
+ item === null || item === void 0 ? void 0 : item.classList.remove('react-draggable-dragging');
240
+ (0, react_2.act)(() => {
241
+ react_2.fireEvent.pointerDown(item);
242
+ });
243
+ const lastRenderInstance = renderSpy.mock.instances.at(-1);
244
+ expect(lastRenderInstance.props.width).toBe(1000);
245
+ renderSpy.mockRestore();
246
+ });
247
+ test('syncs RGL width before native and shared drag-over after passive resize', () => {
248
+ const renderSpy = jest.spyOn(react_grid_layout_1.default.prototype, 'render');
249
+ const dragStateRef = { current: { isDragging: true, sourceGroup: 'source' } };
250
+ const widths = [900, 1000];
251
+ const onDropDragOver = jest.fn(() => {
252
+ const instance = renderSpy.mock.instances.at(-1);
253
+ expect(instance.props.width).toBe(widths[onDropDragOver.mock.calls.length - 1]);
254
+ return {};
255
+ });
256
+ const { container } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, dragStateRef: dragStateRef, group: "target", isDroppable: true, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], onDropDragOver: onDropDragOver, rowHeight: 100 },
257
+ react_1.default.createElement("div", { key: "item" })));
258
+ const layout = container.querySelector('.react-grid-layout');
259
+ const rendersBeforeResize = renderSpy.mock.calls.length;
260
+ (0, react_2.act)(() => {
261
+ emitResizeFor(layout, 900);
262
+ });
263
+ expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
264
+ (0, react_2.act)(() => {
265
+ react_2.fireEvent.dragOver(layout, { clientX: 100, clientY: 100 });
266
+ });
267
+ (0, react_2.act)(() => {
268
+ emitResizeFor(layout, 1000);
269
+ });
270
+ const rendersBeforeSharedDragOver = renderSpy.mock.calls.length;
271
+ (0, react_2.act)(() => {
272
+ react_2.fireEvent.mouseEnter(layout);
273
+ react_2.fireEvent.mouseMove(layout, { clientX: 100, clientY: 100 });
274
+ });
275
+ expect(renderSpy.mock.calls.length).toBeGreaterThan(rendersBeforeSharedDragOver);
276
+ expect(onDropDragOver).toHaveBeenCalledTimes(2);
277
+ renderSpy.mockRestore();
278
+ });
279
+ test('refreshes the outer-item cache when the layout children change', () => {
280
+ const { container, rerender } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: true, isResizable: true, layout: [{ h: 1, i: 'first', w: 1, x: 0, y: 0 }], rowHeight: 100 },
281
+ react_1.default.createElement("div", { key: "first" })));
282
+ (0, react_2.act)(() => {
283
+ emitResize(900);
284
+ });
285
+ rerender(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: true, isResizable: true, layout: [
286
+ { h: 1, i: 'first', w: 1, x: 0, y: 0 },
287
+ { h: 1, i: 'second', w: 2, x: 1, y: 0 },
288
+ ], rowHeight: 100 },
289
+ react_1.default.createElement("div", { key: "first" }),
290
+ react_1.default.createElement("div", { key: "second" })));
291
+ const second = container.querySelector('.react-grid-item[data-dashkit-grid-x="1"]');
292
+ expect(second === null || second === void 0 ? void 0 : second.style.width).toBe('138px');
293
+ expect(second === null || second === void 0 ? void 0 : second.style.transform).toBe('translate(84px,10px)');
294
+ });
295
+ test('measures after mount, accepts a visible width after zero and disconnects observer', () => {
296
+ var _a;
297
+ const renderSpy = jest.spyOn(react_grid_layout_1.default.prototype, 'render');
298
+ const { container, unmount } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: true, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], measureBeforeMount: true, rowHeight: 100 },
299
+ react_1.default.createElement("div", { key: "item" })));
300
+ const initialRender = renderSpy.mock.instances.at(-1);
301
+ expect(initialRender.props.width).toBe(0);
302
+ (0, react_2.act)(() => {
303
+ emitResize(900);
304
+ });
305
+ expect((_a = container.querySelector('.react-grid-item[data-dashkit-grid-cols]')) === null || _a === void 0 ? void 0 : _a.style.width).toBe('64px');
306
+ unmount();
307
+ expect(resizeObservers[0].disconnect).toHaveBeenCalledTimes(1);
308
+ renderSpy.mockRestore();
309
+ });
310
+ test('keeps WidthProvider placeholder class names', () => {
311
+ (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { className: "custom-layout", cols: 12, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], measureBeforeMount: true, rowHeight: 100 },
312
+ react_1.default.createElement("div", { key: "item" })));
313
+ expect(resizeObservers[0].unobserve.mock.calls[0][0].className).toBe('custom-layout react-grid-layout');
314
+ });
315
+ test('moves observer and pointer listener from measurement placeholder to grid root', () => {
316
+ const renderSpy = jest.spyOn(react_grid_layout_1.default.prototype, 'render');
317
+ const { container } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: true, layout: [{ h: 1, i: 'item', w: 3, x: 2, y: 0 }], measureBeforeMount: true, rowHeight: 100 },
318
+ react_1.default.createElement("div", { key: "item" })));
319
+ const placeholder = resizeObservers[0].unobserve.mock.calls[0][0];
320
+ const layout = container.querySelector('.react-grid-layout');
321
+ const item = container.querySelector('.react-grid-item');
322
+ const rendersBeforeSync = renderSpy.mock.calls.length;
323
+ const widthBeforeOldTargetDelivery = item === null || item === void 0 ? void 0 : item.style.width;
324
+ expect(resizeObservers[0].elements.has(placeholder)).toBe(false);
325
+ expect(resizeObservers[0].elements.has(layout)).toBe(true);
326
+ (0, react_2.act)(() => {
327
+ resizeObservers[0].callback([
328
+ { contentRect: { width: 700 }, target: placeholder },
329
+ ]);
330
+ });
331
+ expect(item === null || item === void 0 ? void 0 : item.style.width).toBe(widthBeforeOldTargetDelivery);
332
+ (0, react_2.act)(() => {
333
+ emitResizeFor(layout, 900);
334
+ });
335
+ expect(item === null || item === void 0 ? void 0 : item.style.width).toBe('213px');
336
+ react_2.fireEvent.pointerDown(placeholder);
337
+ expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeSync);
338
+ react_2.fireEvent.pointerDown(layout);
339
+ expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeSync + 1);
340
+ renderSpy.mockRestore();
341
+ });
342
+ test('installs and removes drag-over listeners on grid root', () => {
343
+ const addEventListenerSpy = jest.spyOn(HTMLElement.prototype, 'addEventListener');
344
+ const removeEventListenerSpy = jest.spyOn(HTMLElement.prototype, 'removeEventListener');
345
+ const { container, unmount } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], rowHeight: 100 },
346
+ react_1.default.createElement("div", { key: "item" })));
347
+ const layout = container.querySelector('.react-grid-layout');
348
+ const dragEventNames = ['mouseup', 'mouseenter', 'mouseleave', 'mousemove'];
349
+ const callsOnLayout = (spy) => spy.mock.calls.filter(([eventName], index) => spy.mock.contexts[index] === layout && dragEventNames.includes(eventName));
350
+ expect(callsOnLayout(addEventListenerSpy)).toHaveLength(dragEventNames.length);
351
+ unmount();
352
+ expect(callsOnLayout(removeEventListenerSpy)).toHaveLength(dragEventNames.length);
353
+ addEventListenerSpy.mockRestore();
354
+ removeEventListenerSpy.mockRestore();
355
+ });
356
+ test('re-observes grid root and restores pointerdown after StrictMode remount', () => {
357
+ const renderSpy = jest.spyOn(react_grid_layout_1.default.prototype, 'render');
358
+ const { container } = (0, react_2.render)(react_1.default.createElement(react_1.default.StrictMode, null,
359
+ react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, isDraggable: true, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], rowHeight: 100 },
360
+ react_1.default.createElement("div", { key: "item" }))));
361
+ const layout = container.querySelector('.react-grid-layout');
362
+ const currentObserver = resizeObservers.at(-1);
363
+ expect(resizeObservers).toHaveLength(2);
364
+ expect(currentObserver.elements.has(layout)).toBe(true);
365
+ (0, react_2.act)(() => {
366
+ currentObserver.callback([
367
+ { contentRect: { width: 900 }, target: layout },
368
+ ]);
369
+ });
370
+ const rendersBeforePointerDown = renderSpy.mock.calls.length;
371
+ react_2.fireEvent.pointerDown(layout);
372
+ expect(renderSpy.mock.calls.length).toBeGreaterThan(rendersBeforePointerDown);
373
+ renderSpy.mockRestore();
374
+ });
375
+ test('keeps unchanged GridItem child clone during another item layout update', () => {
376
+ const renderSpy = jest.spyOn(GridItem_1.GridItem.prototype, 'render');
377
+ const first = react_1.default.createElement(GridItem_1.default, Object.assign({}, gridItem.props, { id: "first", key: "first" }));
378
+ const second = react_1.default.createElement(GridItem_1.default, Object.assign({}, gridItem.props, { id: "second", key: "second" }));
379
+ const { container, rerender } = (0, react_2.render)(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, layout: [
380
+ { h: 1, i: 'first', w: 1, x: 0, y: 0 },
381
+ { h: 1, i: 'second', w: 1, x: 2, y: 0 },
382
+ ], rowHeight: 100 },
383
+ first,
384
+ second));
385
+ const secondRenders = renderSpy.mock.instances.filter((instance) => instance.props.id === 'second').length;
386
+ rerender(react_1.default.createElement(ReactGridLayout_1.Layout, { cols: 12, layout: [
387
+ { h: 1, i: 'first', w: 1, x: 1, y: 0 },
388
+ { h: 1, i: 'second', w: 1, x: 2, y: 0 },
389
+ ], rowHeight: 100 },
390
+ first,
391
+ second));
392
+ expect(renderSpy.mock.instances.filter((instance) => instance.props.id === 'second').length).toBe(secondRenders);
393
+ expect(container.querySelector('.react-grid-item[data-dashkit-grid-x="1"]')).not.toBeNull();
394
+ renderSpy.mockRestore();
395
+ });
396
+ });
397
+ //# sourceMappingURL=passive-resize.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passive-resize.test.js","sourceRoot":"../../../../../src","sources":["components/GridLayout/__tests__/passive-resize.test.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jest-environment jsdom */\n\nimport React from 'react';\n\nimport {act, fireEvent, render} from '@testing-library/react';\nimport ReactGridLayout from 'react-grid-layout';\n\nimport type {ConfigItem} from '../../../shared';\nimport GridItem, {GridItem as GridItemComponent} from '../../GridItem/GridItem';\nimport {Layout} from '../ReactGridLayout';\n\njest.mock('../../Item/Item', () => ({\n __esModule: true,\n default: () => null,\n}));\n\ntype ResizeObserverCallback = (entries: ResizeObserverEntry[]) => void;\n\nconst resizeObservers: TestResizeObserver[] = [];\nconst mockPolyfillObservers: TestResizeObserver[] = [];\nconst animationFrameCallbacks = new Map<number, FrameRequestCallback>();\nlet animationFrameId = 0;\n\njest.mock('resize-observer-polyfill', () => ({\n __esModule: true,\n default: class {\n readonly callback: ResizeObserverCallback;\n disconnect = jest.fn();\n elements = new Set<Element>();\n\n constructor(callback: ResizeObserverCallback) {\n this.callback = callback;\n mockPolyfillObservers.push(this as unknown as TestResizeObserver);\n }\n\n observe = (element: Element) => {\n this.elements.add(element);\n };\n\n unobserve = (element: Element) => {\n this.elements.delete(element);\n };\n },\n}));\n\nclass TestResizeObserver {\n readonly callback: ResizeObserverCallback;\n disconnect = jest.fn();\n elements = new Set<Element>();\n\n unobserve = jest.fn((element: Element) => {\n this.elements.delete(element);\n });\n\n constructor(callback: ResizeObserverCallback) {\n this.callback = callback;\n resizeObservers.push(this);\n }\n\n observe(element: Element) {\n this.elements.add(element);\n }\n}\n\nconst emitResize = (width: number) => {\n resizeObservers.forEach((observer) => {\n observer.elements.forEach((element) => {\n observer.callback([{contentRect: {width}, target: element} as ResizeObserverEntry]);\n });\n });\n};\n\nconst emitResizeFor = (element: Element, width: number) => {\n resizeObservers\n .filter((observer) => observer.elements.has(element))\n .forEach((observer) => {\n observer.callback([{contentRect: {width}, target: element} as ResizeObserverEntry]);\n });\n};\n\nconst emitPolyfillResizeFor = (element: Element, width: number) => {\n mockPolyfillObservers\n .filter((observer) => observer.elements.has(element))\n .forEach((observer) => {\n observer.callback([{contentRect: {width}, target: element} as ResizeObserverEntry]);\n });\n};\n\nconst runAnimationFrame = () => {\n const callbacks = Array.from(animationFrameCallbacks.values());\n animationFrameCallbacks.clear();\n callbacks.forEach((callback) => callback(0));\n};\n\nconst gridItem = (\n <GridItem\n adjustWidgetLayout={jest.fn()}\n id=\"item\"\n item={{data: {}} as ConfigItem}\n key=\"item\"\n layout={[]}\n />\n);\n\ndescribe('Layout passive resize', () => {\n beforeEach(() => {\n resizeObservers.length = 0;\n mockPolyfillObservers.length = 0;\n animationFrameCallbacks.clear();\n animationFrameId = 0;\n global.ResizeObserver = TestResizeObserver as unknown as typeof ResizeObserver;\n window.requestAnimationFrame = jest.fn((callback) => {\n animationFrameId += 1;\n animationFrameCallbacks.set(animationFrameId, callback);\n return animationFrameId;\n });\n window.cancelAnimationFrame = jest.fn((frame) => {\n animationFrameCallbacks.delete(frame);\n });\n });\n\n test('does not render ReactGridLayout for passive container resize', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n\n const {container} = render(\n <Layout cols={12} layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]} rowHeight={100}>\n <div key=\"item\" />\n </Layout>,\n );\n const rendersBeforeResize = renderSpy.mock.calls.length;\n\n act(() => {\n emitResize(900);\n fireEvent.pointerDown(container.firstElementChild as HTMLElement);\n });\n\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n renderSpy.mockRestore();\n });\n\n test.each([undefined, null] as const)(\n 'uses polyfill when native ResizeObserver is %p',\n (resizeObserver) => {\n global.ResizeObserver = resizeObserver as unknown as typeof ResizeObserver;\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const item = container.querySelector<HTMLElement>('.react-grid-item');\n\n expect(mockPolyfillObservers[0].elements.has(layout as HTMLElement)).toBe(true);\n act(() => {\n emitPolyfillResizeFor(layout as HTMLElement, 900);\n });\n\n expect(item?.style.width).toBe('213px');\n expect(item?.style.transform).toBe('translate(158px,10px)');\n },\n );\n\n test('commits only latest width after delivery between two quiet frames', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n render(\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const rendersBeforeResize = renderSpy.mock.calls.length;\n\n act(() => {\n emitResize(900);\n runAnimationFrame();\n emitResize(1000);\n });\n\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n act(() => {\n runAnimationFrame();\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n act(() => {\n runAnimationFrame();\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize + 1);\n expect((renderSpy.mock.instances.at(-1) as unknown as ReactGridLayout).props.width).toBe(\n 1000,\n );\n renderSpy.mockRestore();\n });\n\n test('cancels second quiet frame on unmount', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {unmount} = render(\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const rendersBeforeResize = renderSpy.mock.calls.length;\n\n act(() => {\n emitResize(900);\n runAnimationFrame();\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n\n unmount();\n expect(window.cancelAnimationFrame).toHaveBeenLastCalledWith(2);\n act(() => {\n runAnimationFrame();\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n renderSpy.mockRestore();\n });\n\n test('keeps distinct view item geometry after passive resize', () => {\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[\n {h: 1, i: 'first', w: 1, x: 0, y: 0},\n {h: 1, i: 'second', w: 3, x: 2, y: 0},\n ]}\n rowHeight={100}\n >\n <div key=\"first\" />\n <div key=\"second\" />\n </Layout>,\n );\n\n act(() => {\n emitResize(1000);\n });\n\n const first = container.querySelector<HTMLElement>(\n '.react-grid-item[data-dashkit-grid-x=\"0\"]',\n );\n const second = container.querySelector<HTMLElement>(\n '.react-grid-item[data-dashkit-grid-x=\"2\"]',\n );\n expect(first?.style.transform).toBe('translate(10px,10px)');\n expect(first?.style.width).toBe('73px');\n expect(second?.style.transform).toBe('translate(175px,10px)');\n expect(second?.style.width).toBe('238px');\n });\n\n test('forwards transform mode through GridItem and uses transforms by default', () => {\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n {gridItem}\n </Layout>,\n );\n const item = container.querySelector<HTMLElement>('.react-grid-item');\n\n act(() => {\n emitResize(900);\n });\n\n expect(item?.style.width).toBe('213px');\n expect(item?.dataset.dashkitGridUseCssTransforms).toBe('true');\n expect(item?.style.transform).toBe('translate(158px,10px)');\n expect(item?.style.left).toBe('');\n expect(item?.style.top).toBe('');\n });\n\n test('switches to top and left without stale transform when CSS transforms are disabled', () => {\n const {container, rerender} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n {gridItem}\n </Layout>,\n );\n const item = container.querySelector<HTMLElement>('.react-grid-item');\n\n act(() => {\n emitResize(900);\n });\n rerender(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n useCSSTransforms={false}\n >\n {gridItem}\n </Layout>,\n );\n act(() => {\n emitResize(1000);\n });\n\n expect(item?.dataset.dashkitGridUseCssTransforms).toBe('false');\n expect(item?.style.width).toBe('238px');\n expect(item?.style.left).toBe('175px');\n expect(item?.style.top).toBe('10px');\n expect(item?.style.transform).toBe('');\n });\n\n test('resizes only direct grid items when layouts are nested', () => {\n const {container, getByTestId} = render(\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'outer', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n <div data-testid=\"outer-item\" key=\"outer\">\n <Layout\n cols={12}\n isDraggable={false}\n isResizable={false}\n layout={[{h: 1, i: 'inner', w: 2, x: 1, y: 0}]}\n rowHeight={100}\n >\n <div data-testid=\"inner-item\" key=\"inner\" />\n </Layout>\n </div>\n </Layout>,\n );\n const layouts = container.querySelectorAll('.react-grid-layout');\n const outerItem = getByTestId('outer-item');\n const innerItem = getByTestId('inner-item');\n\n act(() => {\n emitResizeFor(layouts[1], 500);\n });\n const innerWidth = innerItem.style.width;\n const innerTransform = innerItem.style.transform;\n expect(innerWidth).toBe('72px');\n expect(innerTransform).toBe('translate(51px,10px)');\n\n act(() => {\n emitResizeFor(layouts[0], 1000);\n });\n\n expect(outerItem.style.width).toBe('238px');\n expect(innerItem.style.width).toBe(innerWidth);\n expect(innerItem.style.transform).toBe(innerTransform);\n });\n\n test('updates editable idle geometry and refreshes RGL width before interaction', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={true}\n isResizable={true}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const item = container.querySelector<HTMLElement>(\n '.react-grid-item[data-dashkit-grid-cols]',\n );\n\n act(() => {\n emitResize(900);\n });\n\n expect(item?.style.width).toBe('213px');\n expect(item?.style.transform).toBe('translate(158px,10px)');\n\n item?.classList.add('react-draggable-dragging');\n act(() => {\n emitResize(1000);\n });\n expect(item?.style.width).toBe('213px');\n item?.classList.remove('react-draggable-dragging');\n\n act(() => {\n fireEvent.pointerDown(item as HTMLElement);\n });\n\n const lastRenderInstance = renderSpy.mock.instances.at(-1) as unknown as ReactGridLayout;\n expect(lastRenderInstance.props.width).toBe(1000);\n renderSpy.mockRestore();\n });\n\n test('syncs RGL width before native and shared drag-over after passive resize', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const dragStateRef = {current: {isDragging: true, sourceGroup: 'source'}};\n const widths = [900, 1000];\n const onDropDragOver = jest.fn(() => {\n const instance = renderSpy.mock.instances.at(-1) as unknown as ReactGridLayout;\n\n expect(instance.props.width).toBe(widths[onDropDragOver.mock.calls.length - 1]);\n return {};\n });\n const {container} = render(\n <Layout\n cols={12}\n dragStateRef={dragStateRef}\n group=\"target\"\n isDroppable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n onDropDragOver={onDropDragOver}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const rendersBeforeResize = renderSpy.mock.calls.length;\n\n act(() => {\n emitResizeFor(layout as HTMLElement, 900);\n });\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);\n\n act(() => {\n fireEvent.dragOver(layout as HTMLElement, {clientX: 100, clientY: 100});\n });\n\n act(() => {\n emitResizeFor(layout as HTMLElement, 1000);\n });\n const rendersBeforeSharedDragOver = renderSpy.mock.calls.length;\n\n act(() => {\n fireEvent.mouseEnter(layout as HTMLElement);\n fireEvent.mouseMove(layout as HTMLElement, {clientX: 100, clientY: 100});\n });\n\n expect(renderSpy.mock.calls.length).toBeGreaterThan(rendersBeforeSharedDragOver);\n expect(onDropDragOver).toHaveBeenCalledTimes(2);\n renderSpy.mockRestore();\n });\n\n test('refreshes the outer-item cache when the layout children change', () => {\n const {container, rerender} = render(\n <Layout\n cols={12}\n isDraggable={true}\n isResizable={true}\n layout={[{h: 1, i: 'first', w: 1, x: 0, y: 0}]}\n rowHeight={100}\n >\n <div key=\"first\" />\n </Layout>,\n );\n\n act(() => {\n emitResize(900);\n });\n rerender(\n <Layout\n cols={12}\n isDraggable={true}\n isResizable={true}\n layout={[\n {h: 1, i: 'first', w: 1, x: 0, y: 0},\n {h: 1, i: 'second', w: 2, x: 1, y: 0},\n ]}\n rowHeight={100}\n >\n <div key=\"first\" />\n <div key=\"second\" />\n </Layout>,\n );\n\n const second = container.querySelector<HTMLElement>(\n '.react-grid-item[data-dashkit-grid-x=\"1\"]',\n );\n expect(second?.style.width).toBe('138px');\n expect(second?.style.transform).toBe('translate(84px,10px)');\n });\n\n test('measures after mount, accepts a visible width after zero and disconnects observer', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {container, unmount} = render(\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n measureBeforeMount={true}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n\n const initialRender = renderSpy.mock.instances.at(-1) as unknown as ReactGridLayout;\n expect(initialRender.props.width).toBe(0);\n act(() => {\n emitResize(900);\n });\n expect(\n container.querySelector<HTMLElement>('.react-grid-item[data-dashkit-grid-cols]')?.style\n .width,\n ).toBe('64px');\n\n unmount();\n expect(resizeObservers[0].disconnect).toHaveBeenCalledTimes(1);\n renderSpy.mockRestore();\n });\n\n test('keeps WidthProvider placeholder class names', () => {\n render(\n <Layout\n className=\"custom-layout\"\n cols={12}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n measureBeforeMount={true}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n\n expect(resizeObservers[0].unobserve.mock.calls[0][0].className).toBe(\n 'custom-layout react-grid-layout',\n );\n });\n\n test('moves observer and pointer listener from measurement placeholder to grid root', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {container} = render(\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 3, x: 2, y: 0}]}\n measureBeforeMount={true}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>,\n );\n const placeholder = resizeObservers[0].unobserve.mock.calls[0][0] as HTMLElement;\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const item = container.querySelector<HTMLElement>('.react-grid-item');\n const rendersBeforeSync = renderSpy.mock.calls.length;\n const widthBeforeOldTargetDelivery = item?.style.width;\n\n expect(resizeObservers[0].elements.has(placeholder)).toBe(false);\n expect(resizeObservers[0].elements.has(layout as HTMLElement)).toBe(true);\n act(() => {\n resizeObservers[0].callback([\n {contentRect: {width: 700}, target: placeholder} as unknown as ResizeObserverEntry,\n ]);\n });\n expect(item?.style.width).toBe(widthBeforeOldTargetDelivery);\n\n act(() => {\n emitResizeFor(layout as HTMLElement, 900);\n });\n expect(item?.style.width).toBe('213px');\n\n fireEvent.pointerDown(placeholder);\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeSync);\n fireEvent.pointerDown(layout as HTMLElement);\n expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeSync + 1);\n renderSpy.mockRestore();\n });\n\n test('installs and removes drag-over listeners on grid root', () => {\n const addEventListenerSpy = jest.spyOn(HTMLElement.prototype, 'addEventListener');\n const removeEventListenerSpy = jest.spyOn(HTMLElement.prototype, 'removeEventListener');\n const {container, unmount} = render(\n <Layout cols={12} layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]} rowHeight={100}>\n <div key=\"item\" />\n </Layout>,\n );\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const dragEventNames = ['mouseup', 'mouseenter', 'mouseleave', 'mousemove'];\n const callsOnLayout = (spy: jest.SpyInstance) =>\n spy.mock.calls.filter(\n ([eventName], index) =>\n spy.mock.contexts[index] === layout && dragEventNames.includes(eventName),\n );\n\n expect(callsOnLayout(addEventListenerSpy)).toHaveLength(dragEventNames.length);\n\n unmount();\n\n expect(callsOnLayout(removeEventListenerSpy)).toHaveLength(dragEventNames.length);\n addEventListenerSpy.mockRestore();\n removeEventListenerSpy.mockRestore();\n });\n\n test('re-observes grid root and restores pointerdown after StrictMode remount', () => {\n const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');\n const {container} = render(\n <React.StrictMode>\n <Layout\n cols={12}\n isDraggable={true}\n layout={[{h: 1, i: 'item', w: 1, x: 0, y: 0}]}\n rowHeight={100}\n >\n <div key=\"item\" />\n </Layout>\n </React.StrictMode>,\n );\n const layout = container.querySelector<HTMLElement>('.react-grid-layout');\n const currentObserver = resizeObservers.at(-1) as TestResizeObserver;\n\n expect(resizeObservers).toHaveLength(2);\n expect(currentObserver.elements.has(layout as HTMLElement)).toBe(true);\n act(() => {\n currentObserver.callback([\n {contentRect: {width: 900}, target: layout} as unknown as ResizeObserverEntry,\n ]);\n });\n const rendersBeforePointerDown = renderSpy.mock.calls.length;\n\n fireEvent.pointerDown(layout as HTMLElement);\n\n expect(renderSpy.mock.calls.length).toBeGreaterThan(rendersBeforePointerDown);\n renderSpy.mockRestore();\n });\n\n test('keeps unchanged GridItem child clone during another item layout update', () => {\n const renderSpy = jest.spyOn(GridItemComponent.prototype, 'render');\n const first = <GridItem {...gridItem.props} id=\"first\" key=\"first\" />;\n const second = <GridItem {...gridItem.props} id=\"second\" key=\"second\" />;\n const {container, rerender} = render(\n <Layout\n cols={12}\n layout={[\n {h: 1, i: 'first', w: 1, x: 0, y: 0},\n {h: 1, i: 'second', w: 1, x: 2, y: 0},\n ]}\n rowHeight={100}\n >\n {first}\n {second}\n </Layout>,\n );\n const secondRenders = renderSpy.mock.instances.filter(\n (instance) => instance.props.id === 'second',\n ).length;\n\n rerender(\n <Layout\n cols={12}\n layout={[\n {h: 1, i: 'first', w: 1, x: 1, y: 0},\n {h: 1, i: 'second', w: 1, x: 2, y: 0},\n ]}\n rowHeight={100}\n >\n {first}\n {second}\n </Layout>,\n );\n\n expect(\n renderSpy.mock.instances.filter((instance) => instance.props.id === 'second').length,\n ).toBe(secondRenders);\n expect(\n container.querySelector<HTMLElement>('.react-grid-item[data-dashkit-grid-x=\"1\"]'),\n ).not.toBeNull();\n renderSpy.mockRestore();\n });\n});\n"]}
@@ -40,6 +40,16 @@ function useMemoStateContext(props) {
40
40
  [props.config.layout, props.registerManager]);
41
41
  const internalBaselineLayoutRef = react_1.default.useRef(enrichedPropsLayout);
42
42
  const [visualLayout, setVisualLayout] = react_1.default.useState(enrichedPropsLayout);
43
+ const [previousEnrichedPropsLayout, setPreviousEnrichedPropsLayout] = react_1.default.useState(enrichedPropsLayout);
44
+ const [pendingExternalBaselineLayout, setPendingExternalBaselineLayout] = react_1.default.useState();
45
+ const getBaselineLayout = react_1.default.useCallback(() => {
46
+ if (pendingExternalBaselineLayout &&
47
+ internalBaselineLayoutRef.current ===
48
+ pendingExternalBaselineLayout.previousBaselineLayout) {
49
+ return pendingExternalBaselineLayout.layout;
50
+ }
51
+ return internalBaselineLayoutRef.current;
52
+ }, [pendingExternalBaselineLayout]);
43
53
  const [externalLayoutRevision, setExternalLayoutRevision] = react_1.default.useState(0);
44
54
  const [temporaryLayout, setTemporaryLayout] = react_1.default.useState(null);
45
55
  const resetTemporaryLayout = react_1.default.useCallback(() => setTemporaryLayout(null), [setTemporaryLayout]);
@@ -74,7 +84,7 @@ function useMemoStateContext(props) {
74
84
  return Object.assign({}, item);
75
85
  }
76
86
  });
77
- const baselineConfig = Object.assign(Object.assign({}, props.config), { layout: internalBaselineLayoutRef.current });
87
+ const baselineConfig = Object.assign(Object.assign({}, props.config), { layout: getBaselineLayout() });
78
88
  const newConfig = utils_1.UpdateManager.updateLayout({
79
89
  layout: currentInnerLayout,
80
90
  config: baselineConfig,
@@ -86,13 +96,13 @@ function useMemoStateContext(props) {
86
96
  emitDashKitEvent: props.emitDashKitEvent,
87
97
  });
88
98
  internalBaselineLayoutRef.current = newConfig.layout;
89
- }, [props.config, props.emitDashKitEvent, onChange]);
99
+ }, [getBaselineLayout, props.config, props.emitDashKitEvent, onChange]);
90
100
  const getLayoutItem = react_1.default.useCallback((id) => {
91
- return internalBaselineLayoutRef.current.find(({ i }) => i === id);
92
- }, []);
101
+ return getBaselineLayout().find(({ i }) => i === id);
102
+ }, [getBaselineLayout]);
93
103
  const getOuterLayout = react_1.default.useCallback(() => {
94
- return (0, utils_1.convertEnrichedLayoutToConfigLayout)(internalBaselineLayoutRef.current);
95
- }, []);
104
+ return (0, utils_1.convertEnrichedLayoutToConfigLayout)(getBaselineLayout());
105
+ }, [getBaselineLayout]);
96
106
  // to calculate items, only memorization of items and globalItems is important
97
107
  const configItems = react_1.default.useMemo(() => (0, shared_1.getAllConfigItems)(props.config), [props.config.items, props.config.globalItems]);
98
108
  const onItemRemove = react_1.default.useCallback((id) => {
@@ -208,16 +218,28 @@ function useMemoStateContext(props) {
208
218
  });
209
219
  }
210
220
  }, [props.registerManager, props.groups, visualLayout]);
211
- // Synchronize internal baseline and visual layout when external props.layout changes re-init.
212
- // When props.config.layout reference changes, external update occurred re-init.
213
- react_1.default.useEffect(() => {
214
- const internalNotEqualProps = !(0, isEqual_1.default)(internalBaselineLayoutRef.current, enrichedPropsLayout);
215
- if (internalNotEqualProps) {
216
- internalBaselineLayoutRef.current = enrichedPropsLayout;
221
+ // Synchronize visual layout during render, so children never see new config with old layout.
222
+ // Keep the previous external layout separate from the drag baseline: a drag updates the latter.
223
+ if (previousEnrichedPropsLayout !== enrichedPropsLayout) {
224
+ setPreviousEnrichedPropsLayout(enrichedPropsLayout);
225
+ if (!(0, isEqual_1.default)(internalBaselineLayoutRef.current, enrichedPropsLayout)) {
226
+ setPendingExternalBaselineLayout({
227
+ layout: enrichedPropsLayout,
228
+ previousBaselineLayout: internalBaselineLayoutRef.current,
229
+ });
217
230
  setVisualLayout(enrichedPropsLayout);
218
231
  setExternalLayoutRevision((r) => r + 1);
219
232
  }
220
- }, [enrichedPropsLayout]);
233
+ }
234
+ react_1.default.useLayoutEffect(() => {
235
+ if (pendingExternalBaselineLayout) {
236
+ if (internalBaselineLayoutRef.current ===
237
+ pendingExternalBaselineLayout.previousBaselineLayout) {
238
+ internalBaselineLayoutRef.current = pendingExternalBaselineLayout.layout;
239
+ }
240
+ setPendingExternalBaselineLayout(undefined);
241
+ }
242
+ }, [pendingExternalBaselineLayout]);
221
243
  const itemsParams = (0, useDeepEqualMemo_1.useDeepEqualMemo)(() => (0, shared_1.getItemsParams)({
222
244
  defaultGlobalParams: props.defaultGlobalParams,
223
245
  globalParams: props.globalParams,