@gravity-ui/dashkit 10.4.0 → 10.4.2
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.
- package/build/cjs/components/GridItem/GridItem.d.ts +20 -0
- package/build/cjs/components/GridItem/GridItem.js +3 -1
- package/build/cjs/components/GridItem/GridItem.js.map +1 -1
- package/build/cjs/components/GridLayout/ReactGridLayout.d.ts +37 -2
- package/build/cjs/components/GridLayout/ReactGridLayout.js +211 -4
- package/build/cjs/components/GridLayout/ReactGridLayout.js.map +1 -1
- package/build/cjs/components/GridLayout/__tests__/passive-resize.test.d.ts +2 -0
- package/build/cjs/components/GridLayout/__tests__/passive-resize.test.js +397 -0
- package/build/cjs/components/GridLayout/__tests__/passive-resize.test.js.map +1 -0
- package/build/cjs/package.json +1 -1
- package/build/cjs/shared/modules/helpers.js +22 -19
- package/build/cjs/shared/modules/helpers.js.map +1 -1
- package/build/cjs/shared/modules/state-and-params.js +11 -7
- package/build/cjs/shared/modules/state-and-params.js.map +1 -1
- package/build/esm/components/GridItem/GridItem.d.ts +20 -0
- package/build/esm/components/GridItem/GridItem.js +2 -2
- package/build/esm/components/GridItem/GridItem.js.map +1 -1
- package/build/esm/components/GridLayout/ReactGridLayout.d.ts +37 -2
- package/build/esm/components/GridLayout/ReactGridLayout.js +213 -5
- package/build/esm/components/GridLayout/ReactGridLayout.js.map +1 -1
- package/build/esm/components/GridLayout/__tests__/passive-resize.test.d.ts +2 -0
- package/build/esm/components/GridLayout/__tests__/passive-resize.test.js +394 -0
- package/build/esm/components/GridLayout/__tests__/passive-resize.test.js.map +1 -0
- package/build/esm/package.json +1 -1
- package/build/esm/shared/modules/helpers.js +22 -19
- package/build/esm/shared/modules/helpers.js.map +1 -1
- package/build/esm/shared/modules/state-and-params.js +11 -7
- package/build/esm/shared/modules/state-and-params.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/** @jest-environment jsdom */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { act, fireEvent, render } from '@testing-library/react';
|
|
4
|
+
import ReactGridLayout from 'react-grid-layout';
|
|
5
|
+
import GridItem, { GridItem as GridItemComponent } from "../../GridItem/GridItem.js";
|
|
6
|
+
import { Layout } from "../ReactGridLayout.js";
|
|
7
|
+
jest.mock('../../Item/Item', () => ({
|
|
8
|
+
__esModule: true,
|
|
9
|
+
default: () => null,
|
|
10
|
+
}));
|
|
11
|
+
const resizeObservers = [];
|
|
12
|
+
const mockPolyfillObservers = [];
|
|
13
|
+
const animationFrameCallbacks = new Map();
|
|
14
|
+
let animationFrameId = 0;
|
|
15
|
+
jest.mock('resize-observer-polyfill', () => ({
|
|
16
|
+
__esModule: true,
|
|
17
|
+
default: class {
|
|
18
|
+
constructor(callback) {
|
|
19
|
+
this.disconnect = jest.fn();
|
|
20
|
+
this.elements = new Set();
|
|
21
|
+
this.observe = (element) => {
|
|
22
|
+
this.elements.add(element);
|
|
23
|
+
};
|
|
24
|
+
this.unobserve = (element) => {
|
|
25
|
+
this.elements.delete(element);
|
|
26
|
+
};
|
|
27
|
+
this.callback = callback;
|
|
28
|
+
mockPolyfillObservers.push(this);
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
}));
|
|
32
|
+
class TestResizeObserver {
|
|
33
|
+
constructor(callback) {
|
|
34
|
+
this.disconnect = jest.fn();
|
|
35
|
+
this.elements = new Set();
|
|
36
|
+
this.unobserve = jest.fn((element) => {
|
|
37
|
+
this.elements.delete(element);
|
|
38
|
+
});
|
|
39
|
+
this.callback = callback;
|
|
40
|
+
resizeObservers.push(this);
|
|
41
|
+
}
|
|
42
|
+
observe(element) {
|
|
43
|
+
this.elements.add(element);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const emitResize = (width) => {
|
|
47
|
+
resizeObservers.forEach((observer) => {
|
|
48
|
+
observer.elements.forEach((element) => {
|
|
49
|
+
observer.callback([{ contentRect: { width }, target: element }]);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
const emitResizeFor = (element, width) => {
|
|
54
|
+
resizeObservers
|
|
55
|
+
.filter((observer) => observer.elements.has(element))
|
|
56
|
+
.forEach((observer) => {
|
|
57
|
+
observer.callback([{ contentRect: { width }, target: element }]);
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
const emitPolyfillResizeFor = (element, width) => {
|
|
61
|
+
mockPolyfillObservers
|
|
62
|
+
.filter((observer) => observer.elements.has(element))
|
|
63
|
+
.forEach((observer) => {
|
|
64
|
+
observer.callback([{ contentRect: { width }, target: element }]);
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
const runAnimationFrame = () => {
|
|
68
|
+
const callbacks = Array.from(animationFrameCallbacks.values());
|
|
69
|
+
animationFrameCallbacks.clear();
|
|
70
|
+
callbacks.forEach((callback) => callback(0));
|
|
71
|
+
};
|
|
72
|
+
const gridItem = (React.createElement(GridItem, { adjustWidgetLayout: jest.fn(), id: "item", item: { data: {} }, key: "item", layout: [] }));
|
|
73
|
+
describe('Layout passive resize', () => {
|
|
74
|
+
beforeEach(() => {
|
|
75
|
+
resizeObservers.length = 0;
|
|
76
|
+
mockPolyfillObservers.length = 0;
|
|
77
|
+
animationFrameCallbacks.clear();
|
|
78
|
+
animationFrameId = 0;
|
|
79
|
+
global.ResizeObserver = TestResizeObserver;
|
|
80
|
+
window.requestAnimationFrame = jest.fn((callback) => {
|
|
81
|
+
animationFrameId += 1;
|
|
82
|
+
animationFrameCallbacks.set(animationFrameId, callback);
|
|
83
|
+
return animationFrameId;
|
|
84
|
+
});
|
|
85
|
+
window.cancelAnimationFrame = jest.fn((frame) => {
|
|
86
|
+
animationFrameCallbacks.delete(frame);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
test('does not render ReactGridLayout for passive container resize', () => {
|
|
90
|
+
const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');
|
|
91
|
+
const { container } = render(React.createElement(Layout, { cols: 12, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], rowHeight: 100 },
|
|
92
|
+
React.createElement("div", { key: "item" })));
|
|
93
|
+
const rendersBeforeResize = renderSpy.mock.calls.length;
|
|
94
|
+
act(() => {
|
|
95
|
+
emitResize(900);
|
|
96
|
+
fireEvent.pointerDown(container.firstElementChild);
|
|
97
|
+
});
|
|
98
|
+
expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
|
|
99
|
+
renderSpy.mockRestore();
|
|
100
|
+
});
|
|
101
|
+
test.each([undefined, null])('uses polyfill when native ResizeObserver is %p', (resizeObserver) => {
|
|
102
|
+
global.ResizeObserver = resizeObserver;
|
|
103
|
+
const { container } = render(React.createElement(Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [{ h: 1, i: 'item', w: 3, x: 2, y: 0 }], rowHeight: 100 },
|
|
104
|
+
React.createElement("div", { key: "item" })));
|
|
105
|
+
const layout = container.querySelector('.react-grid-layout');
|
|
106
|
+
const item = container.querySelector('.react-grid-item');
|
|
107
|
+
expect(mockPolyfillObservers[0].elements.has(layout)).toBe(true);
|
|
108
|
+
act(() => {
|
|
109
|
+
emitPolyfillResizeFor(layout, 900);
|
|
110
|
+
});
|
|
111
|
+
expect(item === null || item === void 0 ? void 0 : item.style.width).toBe('213px');
|
|
112
|
+
expect(item === null || item === void 0 ? void 0 : item.style.transform).toBe('translate(158px,10px)');
|
|
113
|
+
});
|
|
114
|
+
test('commits only latest width after delivery between two quiet frames', () => {
|
|
115
|
+
const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');
|
|
116
|
+
render(React.createElement(Layout, { cols: 12, isDraggable: true, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], rowHeight: 100 },
|
|
117
|
+
React.createElement("div", { key: "item" })));
|
|
118
|
+
const rendersBeforeResize = renderSpy.mock.calls.length;
|
|
119
|
+
act(() => {
|
|
120
|
+
emitResize(900);
|
|
121
|
+
runAnimationFrame();
|
|
122
|
+
emitResize(1000);
|
|
123
|
+
});
|
|
124
|
+
expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
|
|
125
|
+
act(() => {
|
|
126
|
+
runAnimationFrame();
|
|
127
|
+
});
|
|
128
|
+
expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
|
|
129
|
+
act(() => {
|
|
130
|
+
runAnimationFrame();
|
|
131
|
+
});
|
|
132
|
+
expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize + 1);
|
|
133
|
+
expect(renderSpy.mock.instances.at(-1).props.width).toBe(1000);
|
|
134
|
+
renderSpy.mockRestore();
|
|
135
|
+
});
|
|
136
|
+
test('cancels second quiet frame on unmount', () => {
|
|
137
|
+
const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');
|
|
138
|
+
const { unmount } = render(React.createElement(Layout, { cols: 12, isDraggable: true, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], rowHeight: 100 },
|
|
139
|
+
React.createElement("div", { key: "item" })));
|
|
140
|
+
const rendersBeforeResize = renderSpy.mock.calls.length;
|
|
141
|
+
act(() => {
|
|
142
|
+
emitResize(900);
|
|
143
|
+
runAnimationFrame();
|
|
144
|
+
});
|
|
145
|
+
expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
|
|
146
|
+
unmount();
|
|
147
|
+
expect(window.cancelAnimationFrame).toHaveBeenLastCalledWith(2);
|
|
148
|
+
act(() => {
|
|
149
|
+
runAnimationFrame();
|
|
150
|
+
});
|
|
151
|
+
expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
|
|
152
|
+
renderSpy.mockRestore();
|
|
153
|
+
});
|
|
154
|
+
test('keeps distinct view item geometry after passive resize', () => {
|
|
155
|
+
const { container } = render(React.createElement(Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [
|
|
156
|
+
{ h: 1, i: 'first', w: 1, x: 0, y: 0 },
|
|
157
|
+
{ h: 1, i: 'second', w: 3, x: 2, y: 0 },
|
|
158
|
+
], rowHeight: 100 },
|
|
159
|
+
React.createElement("div", { key: "first" }),
|
|
160
|
+
React.createElement("div", { key: "second" })));
|
|
161
|
+
act(() => {
|
|
162
|
+
emitResize(1000);
|
|
163
|
+
});
|
|
164
|
+
const first = container.querySelector('.react-grid-item[data-dashkit-grid-x="0"]');
|
|
165
|
+
const second = container.querySelector('.react-grid-item[data-dashkit-grid-x="2"]');
|
|
166
|
+
expect(first === null || first === void 0 ? void 0 : first.style.transform).toBe('translate(10px,10px)');
|
|
167
|
+
expect(first === null || first === void 0 ? void 0 : first.style.width).toBe('73px');
|
|
168
|
+
expect(second === null || second === void 0 ? void 0 : second.style.transform).toBe('translate(175px,10px)');
|
|
169
|
+
expect(second === null || second === void 0 ? void 0 : second.style.width).toBe('238px');
|
|
170
|
+
});
|
|
171
|
+
test('forwards transform mode through GridItem and uses transforms by default', () => {
|
|
172
|
+
const { container } = render(React.createElement(Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [{ h: 1, i: 'item', w: 3, x: 2, y: 0 }], rowHeight: 100 }, gridItem));
|
|
173
|
+
const item = container.querySelector('.react-grid-item');
|
|
174
|
+
act(() => {
|
|
175
|
+
emitResize(900);
|
|
176
|
+
});
|
|
177
|
+
expect(item === null || item === void 0 ? void 0 : item.style.width).toBe('213px');
|
|
178
|
+
expect(item === null || item === void 0 ? void 0 : item.dataset.dashkitGridUseCssTransforms).toBe('true');
|
|
179
|
+
expect(item === null || item === void 0 ? void 0 : item.style.transform).toBe('translate(158px,10px)');
|
|
180
|
+
expect(item === null || item === void 0 ? void 0 : item.style.left).toBe('');
|
|
181
|
+
expect(item === null || item === void 0 ? void 0 : item.style.top).toBe('');
|
|
182
|
+
});
|
|
183
|
+
test('switches to top and left without stale transform when CSS transforms are disabled', () => {
|
|
184
|
+
const { container, rerender } = render(React.createElement(Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [{ h: 1, i: 'item', w: 3, x: 2, y: 0 }], rowHeight: 100 }, gridItem));
|
|
185
|
+
const item = container.querySelector('.react-grid-item');
|
|
186
|
+
act(() => {
|
|
187
|
+
emitResize(900);
|
|
188
|
+
});
|
|
189
|
+
rerender(React.createElement(Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [{ h: 1, i: 'item', w: 3, x: 2, y: 0 }], rowHeight: 100, useCSSTransforms: false }, gridItem));
|
|
190
|
+
act(() => {
|
|
191
|
+
emitResize(1000);
|
|
192
|
+
});
|
|
193
|
+
expect(item === null || item === void 0 ? void 0 : item.dataset.dashkitGridUseCssTransforms).toBe('false');
|
|
194
|
+
expect(item === null || item === void 0 ? void 0 : item.style.width).toBe('238px');
|
|
195
|
+
expect(item === null || item === void 0 ? void 0 : item.style.left).toBe('175px');
|
|
196
|
+
expect(item === null || item === void 0 ? void 0 : item.style.top).toBe('10px');
|
|
197
|
+
expect(item === null || item === void 0 ? void 0 : item.style.transform).toBe('');
|
|
198
|
+
});
|
|
199
|
+
test('resizes only direct grid items when layouts are nested', () => {
|
|
200
|
+
const { container, getByTestId } = render(React.createElement(Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [{ h: 1, i: 'outer', w: 3, x: 2, y: 0 }], rowHeight: 100 },
|
|
201
|
+
React.createElement("div", { "data-testid": "outer-item", key: "outer" },
|
|
202
|
+
React.createElement(Layout, { cols: 12, isDraggable: false, isResizable: false, layout: [{ h: 1, i: 'inner', w: 2, x: 1, y: 0 }], rowHeight: 100 },
|
|
203
|
+
React.createElement("div", { "data-testid": "inner-item", key: "inner" })))));
|
|
204
|
+
const layouts = container.querySelectorAll('.react-grid-layout');
|
|
205
|
+
const outerItem = getByTestId('outer-item');
|
|
206
|
+
const innerItem = getByTestId('inner-item');
|
|
207
|
+
act(() => {
|
|
208
|
+
emitResizeFor(layouts[1], 500);
|
|
209
|
+
});
|
|
210
|
+
const innerWidth = innerItem.style.width;
|
|
211
|
+
const innerTransform = innerItem.style.transform;
|
|
212
|
+
expect(innerWidth).toBe('72px');
|
|
213
|
+
expect(innerTransform).toBe('translate(51px,10px)');
|
|
214
|
+
act(() => {
|
|
215
|
+
emitResizeFor(layouts[0], 1000);
|
|
216
|
+
});
|
|
217
|
+
expect(outerItem.style.width).toBe('238px');
|
|
218
|
+
expect(innerItem.style.width).toBe(innerWidth);
|
|
219
|
+
expect(innerItem.style.transform).toBe(innerTransform);
|
|
220
|
+
});
|
|
221
|
+
test('updates editable idle geometry and refreshes RGL width before interaction', () => {
|
|
222
|
+
const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');
|
|
223
|
+
const { container } = render(React.createElement(Layout, { cols: 12, isDraggable: true, isResizable: true, layout: [{ h: 1, i: 'item', w: 3, x: 2, y: 0 }], rowHeight: 100 },
|
|
224
|
+
React.createElement("div", { key: "item" })));
|
|
225
|
+
const item = container.querySelector('.react-grid-item[data-dashkit-grid-cols]');
|
|
226
|
+
act(() => {
|
|
227
|
+
emitResize(900);
|
|
228
|
+
});
|
|
229
|
+
expect(item === null || item === void 0 ? void 0 : item.style.width).toBe('213px');
|
|
230
|
+
expect(item === null || item === void 0 ? void 0 : item.style.transform).toBe('translate(158px,10px)');
|
|
231
|
+
item === null || item === void 0 ? void 0 : item.classList.add('react-draggable-dragging');
|
|
232
|
+
act(() => {
|
|
233
|
+
emitResize(1000);
|
|
234
|
+
});
|
|
235
|
+
expect(item === null || item === void 0 ? void 0 : item.style.width).toBe('213px');
|
|
236
|
+
item === null || item === void 0 ? void 0 : item.classList.remove('react-draggable-dragging');
|
|
237
|
+
act(() => {
|
|
238
|
+
fireEvent.pointerDown(item);
|
|
239
|
+
});
|
|
240
|
+
const lastRenderInstance = renderSpy.mock.instances.at(-1);
|
|
241
|
+
expect(lastRenderInstance.props.width).toBe(1000);
|
|
242
|
+
renderSpy.mockRestore();
|
|
243
|
+
});
|
|
244
|
+
test('syncs RGL width before native and shared drag-over after passive resize', () => {
|
|
245
|
+
const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');
|
|
246
|
+
const dragStateRef = { current: { isDragging: true, sourceGroup: 'source' } };
|
|
247
|
+
const widths = [900, 1000];
|
|
248
|
+
const onDropDragOver = jest.fn(() => {
|
|
249
|
+
const instance = renderSpy.mock.instances.at(-1);
|
|
250
|
+
expect(instance.props.width).toBe(widths[onDropDragOver.mock.calls.length - 1]);
|
|
251
|
+
return {};
|
|
252
|
+
});
|
|
253
|
+
const { container } = render(React.createElement(Layout, { cols: 12, dragStateRef: dragStateRef, group: "target", isDroppable: true, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], onDropDragOver: onDropDragOver, rowHeight: 100 },
|
|
254
|
+
React.createElement("div", { key: "item" })));
|
|
255
|
+
const layout = container.querySelector('.react-grid-layout');
|
|
256
|
+
const rendersBeforeResize = renderSpy.mock.calls.length;
|
|
257
|
+
act(() => {
|
|
258
|
+
emitResizeFor(layout, 900);
|
|
259
|
+
});
|
|
260
|
+
expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeResize);
|
|
261
|
+
act(() => {
|
|
262
|
+
fireEvent.dragOver(layout, { clientX: 100, clientY: 100 });
|
|
263
|
+
});
|
|
264
|
+
act(() => {
|
|
265
|
+
emitResizeFor(layout, 1000);
|
|
266
|
+
});
|
|
267
|
+
const rendersBeforeSharedDragOver = renderSpy.mock.calls.length;
|
|
268
|
+
act(() => {
|
|
269
|
+
fireEvent.mouseEnter(layout);
|
|
270
|
+
fireEvent.mouseMove(layout, { clientX: 100, clientY: 100 });
|
|
271
|
+
});
|
|
272
|
+
expect(renderSpy.mock.calls.length).toBeGreaterThan(rendersBeforeSharedDragOver);
|
|
273
|
+
expect(onDropDragOver).toHaveBeenCalledTimes(2);
|
|
274
|
+
renderSpy.mockRestore();
|
|
275
|
+
});
|
|
276
|
+
test('refreshes the outer-item cache when the layout children change', () => {
|
|
277
|
+
const { container, rerender } = render(React.createElement(Layout, { cols: 12, isDraggable: true, isResizable: true, layout: [{ h: 1, i: 'first', w: 1, x: 0, y: 0 }], rowHeight: 100 },
|
|
278
|
+
React.createElement("div", { key: "first" })));
|
|
279
|
+
act(() => {
|
|
280
|
+
emitResize(900);
|
|
281
|
+
});
|
|
282
|
+
rerender(React.createElement(Layout, { cols: 12, isDraggable: true, isResizable: true, layout: [
|
|
283
|
+
{ h: 1, i: 'first', w: 1, x: 0, y: 0 },
|
|
284
|
+
{ h: 1, i: 'second', w: 2, x: 1, y: 0 },
|
|
285
|
+
], rowHeight: 100 },
|
|
286
|
+
React.createElement("div", { key: "first" }),
|
|
287
|
+
React.createElement("div", { key: "second" })));
|
|
288
|
+
const second = container.querySelector('.react-grid-item[data-dashkit-grid-x="1"]');
|
|
289
|
+
expect(second === null || second === void 0 ? void 0 : second.style.width).toBe('138px');
|
|
290
|
+
expect(second === null || second === void 0 ? void 0 : second.style.transform).toBe('translate(84px,10px)');
|
|
291
|
+
});
|
|
292
|
+
test('measures after mount, accepts a visible width after zero and disconnects observer', () => {
|
|
293
|
+
var _a;
|
|
294
|
+
const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');
|
|
295
|
+
const { container, unmount } = render(React.createElement(Layout, { cols: 12, isDraggable: true, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], measureBeforeMount: true, rowHeight: 100 },
|
|
296
|
+
React.createElement("div", { key: "item" })));
|
|
297
|
+
const initialRender = renderSpy.mock.instances.at(-1);
|
|
298
|
+
expect(initialRender.props.width).toBe(0);
|
|
299
|
+
act(() => {
|
|
300
|
+
emitResize(900);
|
|
301
|
+
});
|
|
302
|
+
expect((_a = container.querySelector('.react-grid-item[data-dashkit-grid-cols]')) === null || _a === void 0 ? void 0 : _a.style.width).toBe('64px');
|
|
303
|
+
unmount();
|
|
304
|
+
expect(resizeObservers[0].disconnect).toHaveBeenCalledTimes(1);
|
|
305
|
+
renderSpy.mockRestore();
|
|
306
|
+
});
|
|
307
|
+
test('keeps WidthProvider placeholder class names', () => {
|
|
308
|
+
render(React.createElement(Layout, { className: "custom-layout", cols: 12, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], measureBeforeMount: true, rowHeight: 100 },
|
|
309
|
+
React.createElement("div", { key: "item" })));
|
|
310
|
+
expect(resizeObservers[0].unobserve.mock.calls[0][0].className).toBe('custom-layout react-grid-layout');
|
|
311
|
+
});
|
|
312
|
+
test('moves observer and pointer listener from measurement placeholder to grid root', () => {
|
|
313
|
+
const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');
|
|
314
|
+
const { container } = render(React.createElement(Layout, { cols: 12, isDraggable: true, layout: [{ h: 1, i: 'item', w: 3, x: 2, y: 0 }], measureBeforeMount: true, rowHeight: 100 },
|
|
315
|
+
React.createElement("div", { key: "item" })));
|
|
316
|
+
const placeholder = resizeObservers[0].unobserve.mock.calls[0][0];
|
|
317
|
+
const layout = container.querySelector('.react-grid-layout');
|
|
318
|
+
const item = container.querySelector('.react-grid-item');
|
|
319
|
+
const rendersBeforeSync = renderSpy.mock.calls.length;
|
|
320
|
+
const widthBeforeOldTargetDelivery = item === null || item === void 0 ? void 0 : item.style.width;
|
|
321
|
+
expect(resizeObservers[0].elements.has(placeholder)).toBe(false);
|
|
322
|
+
expect(resizeObservers[0].elements.has(layout)).toBe(true);
|
|
323
|
+
act(() => {
|
|
324
|
+
resizeObservers[0].callback([
|
|
325
|
+
{ contentRect: { width: 700 }, target: placeholder },
|
|
326
|
+
]);
|
|
327
|
+
});
|
|
328
|
+
expect(item === null || item === void 0 ? void 0 : item.style.width).toBe(widthBeforeOldTargetDelivery);
|
|
329
|
+
act(() => {
|
|
330
|
+
emitResizeFor(layout, 900);
|
|
331
|
+
});
|
|
332
|
+
expect(item === null || item === void 0 ? void 0 : item.style.width).toBe('213px');
|
|
333
|
+
fireEvent.pointerDown(placeholder);
|
|
334
|
+
expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeSync);
|
|
335
|
+
fireEvent.pointerDown(layout);
|
|
336
|
+
expect(renderSpy).toHaveBeenCalledTimes(rendersBeforeSync + 1);
|
|
337
|
+
renderSpy.mockRestore();
|
|
338
|
+
});
|
|
339
|
+
test('installs and removes drag-over listeners on grid root', () => {
|
|
340
|
+
const addEventListenerSpy = jest.spyOn(HTMLElement.prototype, 'addEventListener');
|
|
341
|
+
const removeEventListenerSpy = jest.spyOn(HTMLElement.prototype, 'removeEventListener');
|
|
342
|
+
const { container, unmount } = render(React.createElement(Layout, { cols: 12, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], rowHeight: 100 },
|
|
343
|
+
React.createElement("div", { key: "item" })));
|
|
344
|
+
const layout = container.querySelector('.react-grid-layout');
|
|
345
|
+
const dragEventNames = ['mouseup', 'mouseenter', 'mouseleave', 'mousemove'];
|
|
346
|
+
const callsOnLayout = (spy) => spy.mock.calls.filter(([eventName], index) => spy.mock.contexts[index] === layout && dragEventNames.includes(eventName));
|
|
347
|
+
expect(callsOnLayout(addEventListenerSpy)).toHaveLength(dragEventNames.length);
|
|
348
|
+
unmount();
|
|
349
|
+
expect(callsOnLayout(removeEventListenerSpy)).toHaveLength(dragEventNames.length);
|
|
350
|
+
addEventListenerSpy.mockRestore();
|
|
351
|
+
removeEventListenerSpy.mockRestore();
|
|
352
|
+
});
|
|
353
|
+
test('re-observes grid root and restores pointerdown after StrictMode remount', () => {
|
|
354
|
+
const renderSpy = jest.spyOn(ReactGridLayout.prototype, 'render');
|
|
355
|
+
const { container } = render(React.createElement(React.StrictMode, null,
|
|
356
|
+
React.createElement(Layout, { cols: 12, isDraggable: true, layout: [{ h: 1, i: 'item', w: 1, x: 0, y: 0 }], rowHeight: 100 },
|
|
357
|
+
React.createElement("div", { key: "item" }))));
|
|
358
|
+
const layout = container.querySelector('.react-grid-layout');
|
|
359
|
+
const currentObserver = resizeObservers.at(-1);
|
|
360
|
+
expect(resizeObservers).toHaveLength(2);
|
|
361
|
+
expect(currentObserver.elements.has(layout)).toBe(true);
|
|
362
|
+
act(() => {
|
|
363
|
+
currentObserver.callback([
|
|
364
|
+
{ contentRect: { width: 900 }, target: layout },
|
|
365
|
+
]);
|
|
366
|
+
});
|
|
367
|
+
const rendersBeforePointerDown = renderSpy.mock.calls.length;
|
|
368
|
+
fireEvent.pointerDown(layout);
|
|
369
|
+
expect(renderSpy.mock.calls.length).toBeGreaterThan(rendersBeforePointerDown);
|
|
370
|
+
renderSpy.mockRestore();
|
|
371
|
+
});
|
|
372
|
+
test('keeps unchanged GridItem child clone during another item layout update', () => {
|
|
373
|
+
const renderSpy = jest.spyOn(GridItemComponent.prototype, 'render');
|
|
374
|
+
const first = React.createElement(GridItem, Object.assign({}, gridItem.props, { id: "first", key: "first" }));
|
|
375
|
+
const second = React.createElement(GridItem, Object.assign({}, gridItem.props, { id: "second", key: "second" }));
|
|
376
|
+
const { container, rerender } = render(React.createElement(Layout, { cols: 12, layout: [
|
|
377
|
+
{ h: 1, i: 'first', w: 1, x: 0, y: 0 },
|
|
378
|
+
{ h: 1, i: 'second', w: 1, x: 2, y: 0 },
|
|
379
|
+
], rowHeight: 100 },
|
|
380
|
+
first,
|
|
381
|
+
second));
|
|
382
|
+
const secondRenders = renderSpy.mock.instances.filter((instance) => instance.props.id === 'second').length;
|
|
383
|
+
rerender(React.createElement(Layout, { cols: 12, layout: [
|
|
384
|
+
{ h: 1, i: 'first', w: 1, x: 1, y: 0 },
|
|
385
|
+
{ h: 1, i: 'second', w: 1, x: 2, y: 0 },
|
|
386
|
+
], rowHeight: 100 },
|
|
387
|
+
first,
|
|
388
|
+
second));
|
|
389
|
+
expect(renderSpy.mock.instances.filter((instance) => instance.props.id === 'second').length).toBe(secondRenders);
|
|
390
|
+
expect(container.querySelector('.react-grid-item[data-dashkit-grid-x="1"]')).not.toBeNull();
|
|
391
|
+
renderSpy.mockRestore();
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
//# 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"]}
|
package/build/esm/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"10.4.
|
|
1
|
+
{"version":"10.4.2","type":"module","sideEffects":["*.scss","*.css"]}
|
|
@@ -120,27 +120,30 @@ export function resolveItemInnerId({ item, itemsStateAndParams, }) {
|
|
|
120
120
|
// Тут мы нормализуем к виду Record<itemId: ignoredItemId[]>
|
|
121
121
|
export function getMapItemsIgnores({ items, ignores, itemsStateAndParams, isFirstVersion, }) {
|
|
122
122
|
// Record<itemId, innerId (tabId | itemId)>
|
|
123
|
-
const mapIds =
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
123
|
+
const mapIds = {};
|
|
124
|
+
for (const item of items) {
|
|
125
|
+
mapIds[item.id] = isItemWithTabs(item)
|
|
126
|
+
? resolveItemInnerId({ item, itemsStateAndParams })
|
|
127
|
+
: item.id;
|
|
128
|
+
}
|
|
128
129
|
// Record<innerId (tabId | itemId), itemId>
|
|
129
130
|
const invertedMapIds = invert(mapIds);
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
131
|
+
const itemsIgnores = {};
|
|
132
|
+
for (const item of items) {
|
|
133
|
+
itemsIgnores[item.id] = ignores
|
|
134
|
+
.filter(({ from, to }) => {
|
|
135
|
+
if (isFirstVersion) {
|
|
136
|
+
// В первой версии был баг - если есть игнор на один таб, то весь виджет игнорит селектор.
|
|
137
|
+
// Повторяем это неправильное поведение,
|
|
138
|
+
// иначе будут прилетать дефолты селекта в табы, которые не игнорят.
|
|
139
|
+
const fromInTabs = isItemWithTabs(item) && item.data.tabs.some(({ id }) => id === from);
|
|
140
|
+
return (from === item.id || fromInTabs) && invertedMapIds[to];
|
|
141
|
+
}
|
|
142
|
+
return from === mapIds[item.id] && invertedMapIds[to];
|
|
143
|
+
})
|
|
144
|
+
.map(({ to }) => invertedMapIds[to]);
|
|
145
|
+
}
|
|
146
|
+
return itemsIgnores;
|
|
144
147
|
}
|
|
145
148
|
export function mergeParamsWithAliases({ aliases, namespace, params, actionParams, }) {
|
|
146
149
|
const aliasesByNamespace = get(aliases, [namespace], []);
|