@gravity-ui/dashkit 10.1.3 → 10.3.0
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/README.md +95 -19
- package/build/cjs/components/ActionPanel/ActionPanel.d.ts +3 -2
- package/build/cjs/components/DashKit/DashKit.d.ts +13 -3
- package/build/cjs/components/DashKit/DashKit.js +55 -7
- package/build/cjs/components/DashKit/DashKit.js.map +1 -1
- package/build/cjs/components/DashKit/__tests__/controlled-layout.test.d.ts +4 -0
- package/build/cjs/components/DashKit/__tests__/controlled-layout.test.js +196 -0
- package/build/cjs/components/DashKit/__tests__/controlled-layout.test.js.map +1 -0
- package/build/cjs/components/DashKit/__tests__/events.test.d.ts +1 -0
- package/build/cjs/components/DashKit/__tests__/events.test.js +227 -0
- package/build/cjs/components/DashKit/__tests__/events.test.js.map +1 -0
- package/build/cjs/components/DashKitView/DashKitView.d.ts +1 -1
- package/build/cjs/components/DashKitView/DashKitView.js +1 -3
- package/build/cjs/components/DashKitView/DashKitView.js.map +1 -1
- package/build/cjs/components/GridLayout/GridLayout.d.ts +3 -3
- package/build/cjs/components/GridLayout/GroupLayout.js +2 -2
- package/build/cjs/components/GridLayout/GroupLayout.js.map +1 -1
- package/build/cjs/components/GridLayout/ReactGridLayout.d.ts +1 -0
- package/build/cjs/components/GridLayout/ReactGridLayout.js +37 -0
- package/build/cjs/components/GridLayout/ReactGridLayout.js.map +1 -1
- package/build/cjs/components/MobileLayout/MobileLayout.d.ts +1 -1
- package/build/cjs/components/OverlayControls/OverlayControls.d.ts +1 -1
- package/build/cjs/components/OverlayControls/OverlayControls.js +1 -1
- package/build/cjs/components/OverlayControls/OverlayControls.js.map +1 -1
- package/build/cjs/context/DashKitContext.d.ts +1 -0
- package/build/cjs/context/DashKitContext.js.map +1 -1
- package/build/cjs/context/DashkitOverlayControlsContext.d.ts +1 -1
- package/build/cjs/context/DashkitOverlayControlsContext.js +2 -2
- package/build/cjs/context/DashkitOverlayControlsContext.js.map +1 -1
- package/build/cjs/hocs/withContext.d.ts +3 -3
- package/build/cjs/hocs/withContext.js +61 -31
- package/build/cjs/hocs/withContext.js.map +1 -1
- package/build/cjs/package.json +1 -1
- package/build/cjs/plugins/Text/Text.d.ts +1 -1
- package/build/cjs/plugins/Text/Text.js +1 -1
- package/build/cjs/plugins/Text/Text.js.map +1 -1
- package/build/cjs/plugins/Title/Title.d.ts +1 -1
- package/build/cjs/shared/types/config.d.ts +2 -0
- package/build/cjs/shared/types/config.js +9 -0
- package/build/cjs/shared/types/config.js.map +1 -1
- package/build/cjs/typings/events.d.ts +34 -0
- package/build/cjs/typings/events.js +3 -0
- package/build/cjs/typings/events.js.map +1 -0
- package/build/cjs/typings/index.d.ts +1 -0
- package/build/cjs/typings/index.js +1 -0
- package/build/cjs/typings/index.js.map +1 -1
- package/build/cjs/utils/__tests__/get-layout-patches.test.d.ts +1 -0
- package/build/cjs/utils/__tests__/get-layout-patches.test.js +51 -0
- package/build/cjs/utils/__tests__/get-layout-patches.test.js.map +1 -0
- package/build/cjs/utils/enrichLayoutWithDefaults.d.ts +5 -0
- package/build/cjs/utils/enrichLayoutWithDefaults.js +29 -0
- package/build/cjs/utils/enrichLayoutWithDefaults.js.map +1 -0
- package/build/cjs/utils/events.d.ts +10 -0
- package/build/cjs/utils/events.js +34 -0
- package/build/cjs/utils/events.js.map +1 -0
- package/build/cjs/utils/get-layout-patches.d.ts +3 -0
- package/build/cjs/utils/get-layout-patches.js +23 -0
- package/build/cjs/utils/get-layout-patches.js.map +1 -0
- package/build/cjs/utils/index.d.ts +3 -0
- package/build/cjs/utils/index.js +3 -0
- package/build/cjs/utils/index.js.map +1 -1
- package/build/cjs/utils/update-manager.js +2 -2
- package/build/cjs/utils/update-manager.js.map +1 -1
- package/build/esm/components/ActionPanel/ActionPanel.d.ts +3 -2
- package/build/esm/components/DashKit/DashKit.d.ts +13 -3
- package/build/esm/components/DashKit/DashKit.js +54 -6
- package/build/esm/components/DashKit/DashKit.js.map +1 -1
- package/build/esm/components/DashKit/__tests__/controlled-layout.test.d.ts +4 -0
- package/build/esm/components/DashKit/__tests__/controlled-layout.test.js +193 -0
- package/build/esm/components/DashKit/__tests__/controlled-layout.test.js.map +1 -0
- package/build/esm/components/DashKit/__tests__/events.test.d.ts +1 -0
- package/build/esm/components/DashKit/__tests__/events.test.js +225 -0
- package/build/esm/components/DashKit/__tests__/events.test.js.map +1 -0
- package/build/esm/components/DashKitView/DashKitView.d.ts +1 -1
- package/build/esm/components/DashKitView/DashKitView.js +1 -3
- package/build/esm/components/DashKitView/DashKitView.js.map +1 -1
- package/build/esm/components/GridLayout/GridLayout.d.ts +3 -3
- package/build/esm/components/GridLayout/GroupLayout.js +2 -2
- package/build/esm/components/GridLayout/GroupLayout.js.map +1 -1
- package/build/esm/components/GridLayout/ReactGridLayout.d.ts +1 -0
- package/build/esm/components/GridLayout/ReactGridLayout.js +37 -0
- package/build/esm/components/GridLayout/ReactGridLayout.js.map +1 -1
- package/build/esm/components/MobileLayout/MobileLayout.d.ts +1 -1
- package/build/esm/components/OverlayControls/OverlayControls.d.ts +1 -1
- package/build/esm/components/OverlayControls/OverlayControls.js +2 -2
- package/build/esm/components/OverlayControls/OverlayControls.js.map +1 -1
- package/build/esm/context/DashKitContext.d.ts +1 -0
- package/build/esm/context/DashKitContext.js.map +1 -1
- package/build/esm/context/DashkitOverlayControlsContext.d.ts +1 -1
- package/build/esm/context/DashkitOverlayControlsContext.js +1 -1
- package/build/esm/context/DashkitOverlayControlsContext.js.map +1 -1
- package/build/esm/hocs/withContext.d.ts +3 -3
- package/build/esm/hocs/withContext.js +64 -34
- package/build/esm/hocs/withContext.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/plugins/Text/Text.d.ts +1 -1
- package/build/esm/plugins/Text/Text.js +1 -1
- package/build/esm/plugins/Text/Text.js.map +1 -1
- package/build/esm/plugins/Title/Title.d.ts +1 -1
- package/build/esm/shared/types/config.d.ts +2 -0
- package/build/esm/shared/types/config.js +8 -1
- package/build/esm/shared/types/config.js.map +1 -1
- package/build/esm/typings/events.d.ts +34 -0
- package/build/esm/typings/events.js +2 -0
- package/build/esm/typings/events.js.map +1 -0
- package/build/esm/typings/index.d.ts +1 -0
- package/build/esm/typings/index.js +1 -0
- package/build/esm/typings/index.js.map +1 -1
- package/build/esm/utils/__tests__/get-layout-patches.test.d.ts +1 -0
- package/build/esm/utils/__tests__/get-layout-patches.test.js +49 -0
- package/build/esm/utils/__tests__/get-layout-patches.test.js.map +1 -0
- package/build/esm/utils/enrichLayoutWithDefaults.d.ts +5 -0
- package/build/esm/utils/enrichLayoutWithDefaults.js +25 -0
- package/build/esm/utils/enrichLayoutWithDefaults.js.map +1 -0
- package/build/esm/utils/events.d.ts +10 -0
- package/build/esm/utils/events.js +30 -0
- package/build/esm/utils/events.js.map +1 -0
- package/build/esm/utils/get-layout-patches.d.ts +3 -0
- package/build/esm/utils/get-layout-patches.js +19 -0
- package/build/esm/utils/get-layout-patches.js.map +1 -0
- package/build/esm/utils/index.d.ts +3 -0
- package/build/esm/utils/index.js +3 -0
- package/build/esm/utils/index.js.map +1 -1
- package/build/esm/utils/update-manager.js +3 -3
- package/build/esm/utils/update-manager.js.map +1 -1
- package/package.json +10 -9
- package/build/cjs/hooks/useCalcLayout.d.ts +0 -3
- package/build/cjs/hooks/useCalcLayout.js +0 -40
- package/build/cjs/hooks/useCalcLayout.js.map +0 -1
- package/build/esm/hooks/useCalcLayout.d.ts +0 -3
- package/build/esm/hooks/useCalcLayout.js +0 -35
- package/build/esm/hooks/useCalcLayout.js.map +0 -1
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
jest.mock('@gravity-ui/icons', () => ({
|
|
4
|
+
Ellipsis: 'ellipsis',
|
|
5
|
+
Gear: 'gear',
|
|
6
|
+
Xmark: 'xmark',
|
|
7
|
+
}));
|
|
8
|
+
jest.mock('@gravity-ui/uikit', () => {
|
|
9
|
+
const ReactMock = require('react');
|
|
10
|
+
return {
|
|
11
|
+
Button: ({ children }) => ReactMock.createElement('button', null, children),
|
|
12
|
+
DropdownMenu: () => null,
|
|
13
|
+
Icon: () => null,
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
jest.mock('../../GridLayout/GridLayout', () => {
|
|
17
|
+
const ReactMock = require('react');
|
|
18
|
+
return ReactMock.forwardRef(() => null);
|
|
19
|
+
});
|
|
20
|
+
const utils_1 = require("../../../utils/index.js");
|
|
21
|
+
const DashKit_1 = require("../index.js");
|
|
22
|
+
const TEST_CONFIG = {
|
|
23
|
+
salt: 'test',
|
|
24
|
+
counter: 1,
|
|
25
|
+
items: [{ id: 'item1', type: 'test-event', namespace: 'default', data: {} }],
|
|
26
|
+
layout: [{ i: 'item1', x: 0, y: 0, w: 2, h: 2 }],
|
|
27
|
+
aliases: {},
|
|
28
|
+
connections: [],
|
|
29
|
+
};
|
|
30
|
+
const NEXT_LAYOUT = [{ i: 'item1', x: 1, y: 0, w: 2, h: 2 }];
|
|
31
|
+
const NEXT_CONFIG = Object.assign(Object.assign({}, TEST_CONFIG), { layout: NEXT_LAYOUT });
|
|
32
|
+
describe('DashKit change event — onChange gate', () => {
|
|
33
|
+
it('no handler: onChange fires with full config when layout changes', () => {
|
|
34
|
+
const onChange = jest.fn();
|
|
35
|
+
const emitDashKitEvent = jest.fn();
|
|
36
|
+
(0, utils_1.emitDashKitChangeEvent)({
|
|
37
|
+
config: TEST_CONFIG,
|
|
38
|
+
newConfig: NEXT_CONFIG,
|
|
39
|
+
onChange,
|
|
40
|
+
emitDashKitEvent,
|
|
41
|
+
});
|
|
42
|
+
expect(emitDashKitEvent).toHaveBeenCalledTimes(1);
|
|
43
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
44
|
+
expect(onChange.mock.calls[0][0].config.layout).toEqual(NEXT_LAYOUT);
|
|
45
|
+
});
|
|
46
|
+
it('handler without preventDefault: onChange fires and handler receives correct event', () => {
|
|
47
|
+
const instance = new DashKit_1.DashKit(DashKit_1.DashKit.defaultProps);
|
|
48
|
+
const onChange = jest.fn();
|
|
49
|
+
const handler = jest.fn();
|
|
50
|
+
instance.on('change', handler);
|
|
51
|
+
(0, utils_1.emitDashKitChangeEvent)({
|
|
52
|
+
config: TEST_CONFIG,
|
|
53
|
+
newConfig: NEXT_CONFIG,
|
|
54
|
+
onChange,
|
|
55
|
+
emitDashKitEvent: instance[DashKit_1._emitSymbol],
|
|
56
|
+
});
|
|
57
|
+
expect(handler).toHaveBeenCalledTimes(1);
|
|
58
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
59
|
+
const event = handler.mock.calls[0][0];
|
|
60
|
+
expect(event.layout).toEqual(NEXT_LAYOUT);
|
|
61
|
+
expect(event.previousLayout).toEqual(TEST_CONFIG.layout);
|
|
62
|
+
expect(event.defaultPrevented).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
it('handler calls preventDefault: onChange does NOT fire; event carries correct patches', () => {
|
|
65
|
+
const instance = new DashKit_1.DashKit(DashKit_1.DashKit.defaultProps);
|
|
66
|
+
const onChange = jest.fn();
|
|
67
|
+
let capturedEvent;
|
|
68
|
+
instance.on('change', (e) => {
|
|
69
|
+
capturedEvent = e;
|
|
70
|
+
e.preventDefault();
|
|
71
|
+
});
|
|
72
|
+
(0, utils_1.emitDashKitChangeEvent)({
|
|
73
|
+
config: TEST_CONFIG,
|
|
74
|
+
newConfig: NEXT_CONFIG,
|
|
75
|
+
onChange,
|
|
76
|
+
emitDashKitEvent: instance[DashKit_1._emitSymbol],
|
|
77
|
+
});
|
|
78
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
79
|
+
expect(capturedEvent).toBeDefined();
|
|
80
|
+
if (capturedEvent) {
|
|
81
|
+
expect(capturedEvent.patches).toEqual([{ i: 'item1', x: 1, y: 0, w: 2, h: 2 }]);
|
|
82
|
+
expect(capturedEvent.layout).toEqual(NEXT_LAYOUT);
|
|
83
|
+
expect(capturedEvent.previousLayout).toEqual(TEST_CONFIG.layout);
|
|
84
|
+
expect(capturedEvent.defaultPrevented).toBe(true);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
it('same layout: event and onChange do not fire', () => {
|
|
88
|
+
const onChange = jest.fn();
|
|
89
|
+
const emitDashKitEvent = jest.fn();
|
|
90
|
+
(0, utils_1.emitDashKitChangeEvent)({
|
|
91
|
+
config: TEST_CONFIG,
|
|
92
|
+
newConfig: TEST_CONFIG,
|
|
93
|
+
onChange,
|
|
94
|
+
emitDashKitEvent,
|
|
95
|
+
});
|
|
96
|
+
expect(emitDashKitEvent).not.toHaveBeenCalled();
|
|
97
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe('DashKit event emitter', () => {
|
|
101
|
+
it('unsubscribe stops handler from being called', () => {
|
|
102
|
+
const instance = new DashKit_1.DashKit(DashKit_1.DashKit.defaultProps);
|
|
103
|
+
const handler = jest.fn();
|
|
104
|
+
const unsubscribe = instance.on('change', handler);
|
|
105
|
+
unsubscribe();
|
|
106
|
+
const event = {
|
|
107
|
+
patches: [],
|
|
108
|
+
layout: [],
|
|
109
|
+
previousLayout: [],
|
|
110
|
+
preventDefault: jest.fn(),
|
|
111
|
+
defaultPrevented: false,
|
|
112
|
+
};
|
|
113
|
+
instance[DashKit_1._emitSymbol]('change', event);
|
|
114
|
+
expect(handler).not.toHaveBeenCalled();
|
|
115
|
+
});
|
|
116
|
+
it('handler error does not stop other handlers; onChange still fires', () => {
|
|
117
|
+
const instance = new DashKit_1.DashKit(DashKit_1.DashKit.defaultProps);
|
|
118
|
+
const onChange = jest.fn();
|
|
119
|
+
const normalHandler = jest.fn();
|
|
120
|
+
instance.on('change', () => {
|
|
121
|
+
throw new Error('boom');
|
|
122
|
+
});
|
|
123
|
+
instance.on('change', normalHandler);
|
|
124
|
+
const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
125
|
+
(0, utils_1.emitDashKitChangeEvent)({
|
|
126
|
+
config: TEST_CONFIG,
|
|
127
|
+
newConfig: NEXT_CONFIG,
|
|
128
|
+
onChange,
|
|
129
|
+
emitDashKitEvent: instance[DashKit_1._emitSymbol],
|
|
130
|
+
});
|
|
131
|
+
consoleErrorSpy.mockRestore();
|
|
132
|
+
expect(normalHandler).toHaveBeenCalledTimes(1);
|
|
133
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('DashKit change event — internal baseline (preventDefault flow)', () => {
|
|
137
|
+
it('preventDefault flow: sequential changes produce incremental patches when baseline is updated', () => {
|
|
138
|
+
const instance = new DashKit_1.DashKit(DashKit_1.DashKit.defaultProps);
|
|
139
|
+
const onChange = jest.fn();
|
|
140
|
+
const patches = [];
|
|
141
|
+
instance.on('change', (e) => {
|
|
142
|
+
patches.push([...e.patches]);
|
|
143
|
+
e.preventDefault();
|
|
144
|
+
});
|
|
145
|
+
const config1 = Object.assign(Object.assign({}, TEST_CONFIG), { items: [
|
|
146
|
+
{ id: 'item1', type: 'test-event', namespace: 'default', data: {} },
|
|
147
|
+
{ id: 'item2', type: 'test-event', namespace: 'default', data: {} },
|
|
148
|
+
], layout: [
|
|
149
|
+
{ i: 'item1', x: 0, y: 0, w: 2, h: 2 },
|
|
150
|
+
{ i: 'item2', x: 2, y: 0, w: 2, h: 2 },
|
|
151
|
+
] });
|
|
152
|
+
const config2 = Object.assign(Object.assign({}, config1), { layout: [
|
|
153
|
+
{ i: 'item1', x: 1, y: 0, w: 2, h: 2 }, // item1 moved to x=1
|
|
154
|
+
{ i: 'item2', x: 2, y: 0, w: 2, h: 2 }, // item2 unchanged
|
|
155
|
+
] });
|
|
156
|
+
const config3 = Object.assign(Object.assign({}, config1), { layout: [
|
|
157
|
+
{ i: 'item1', x: 1, y: 0, w: 2, h: 2 }, // item1 unchanged
|
|
158
|
+
{ i: 'item2', x: 3, y: 0, w: 2, h: 2 }, // item2 moved to x=3
|
|
159
|
+
] });
|
|
160
|
+
// First change: item1 moved from x=0 to x=1
|
|
161
|
+
(0, utils_1.emitDashKitChangeEvent)({
|
|
162
|
+
config: config1,
|
|
163
|
+
newConfig: config2,
|
|
164
|
+
onChange,
|
|
165
|
+
emitDashKitEvent: instance[DashKit_1._emitSymbol],
|
|
166
|
+
});
|
|
167
|
+
// Second change: In withContext, the internal baseline is updated automatically
|
|
168
|
+
// after each change. Here we simulate this behavior by passing config2 as baseline.
|
|
169
|
+
(0, utils_1.emitDashKitChangeEvent)({
|
|
170
|
+
config: config2, // internal baseline updated to config2.layout
|
|
171
|
+
newConfig: config3,
|
|
172
|
+
onChange,
|
|
173
|
+
emitDashKitEvent: instance[DashKit_1._emitSymbol],
|
|
174
|
+
});
|
|
175
|
+
expect(onChange).not.toHaveBeenCalled(); // preventDefault works
|
|
176
|
+
expect(patches).toHaveLength(2);
|
|
177
|
+
// First patch: only item1
|
|
178
|
+
expect(patches[0]).toEqual([{ i: 'item1', x: 1, y: 0, w: 2, h: 2 }]);
|
|
179
|
+
// Second patch: only item2 (NO accumulation!)
|
|
180
|
+
// This works because baseline was updated from config1.layout to config2.layout
|
|
181
|
+
expect(patches[1]).toEqual([{ i: 'item2', x: 3, y: 0, w: 2, h: 2 }]);
|
|
182
|
+
});
|
|
183
|
+
it('legacy flow: onChange updates props and patches work correctly', () => {
|
|
184
|
+
const instance = new DashKit_1.DashKit(DashKit_1.DashKit.defaultProps);
|
|
185
|
+
let currentConfig = Object.assign(Object.assign({}, TEST_CONFIG), { items: [
|
|
186
|
+
{ id: 'item1', type: 'test-event', namespace: 'default', data: {} },
|
|
187
|
+
{ id: 'item2', type: 'test-event', namespace: 'default', data: {} },
|
|
188
|
+
], layout: [
|
|
189
|
+
{ i: 'item1', x: 0, y: 0, w: 2, h: 2 },
|
|
190
|
+
{ i: 'item2', x: 2, y: 0, w: 2, h: 2 },
|
|
191
|
+
] });
|
|
192
|
+
const patches = [];
|
|
193
|
+
instance.on('change', (e) => {
|
|
194
|
+
patches.push([...e.patches]);
|
|
195
|
+
// NO preventDefault → onChange will fire
|
|
196
|
+
});
|
|
197
|
+
const onChange = jest.fn(({ config }) => {
|
|
198
|
+
currentConfig = config; // consumer updates state
|
|
199
|
+
});
|
|
200
|
+
const config2 = Object.assign(Object.assign({}, currentConfig), { layout: [
|
|
201
|
+
{ i: 'item1', x: 1, y: 0, w: 2, h: 2 }, // item1 moved to x=1
|
|
202
|
+
{ i: 'item2', x: 2, y: 0, w: 2, h: 2 }, // item2 unchanged
|
|
203
|
+
] });
|
|
204
|
+
(0, utils_1.emitDashKitChangeEvent)({
|
|
205
|
+
config: currentConfig,
|
|
206
|
+
newConfig: config2,
|
|
207
|
+
onChange,
|
|
208
|
+
emitDashKitEvent: instance[DashKit_1._emitSymbol],
|
|
209
|
+
});
|
|
210
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
211
|
+
expect(patches[0]).toEqual([{ i: 'item1', x: 1, y: 0, w: 2, h: 2 }]);
|
|
212
|
+
// Second change with updated config
|
|
213
|
+
const config3 = Object.assign(Object.assign({}, currentConfig), { layout: [
|
|
214
|
+
{ i: 'item1', x: 1, y: 0, w: 2, h: 2 }, // item1 unchanged
|
|
215
|
+
{ i: 'item2', x: 3, y: 0, w: 2, h: 2 }, // item2 moved to x=3
|
|
216
|
+
] });
|
|
217
|
+
(0, utils_1.emitDashKitChangeEvent)({
|
|
218
|
+
config: currentConfig, // ← updated after first onChange
|
|
219
|
+
newConfig: config3,
|
|
220
|
+
onChange,
|
|
221
|
+
emitDashKitEvent: instance[DashKit_1._emitSymbol],
|
|
222
|
+
});
|
|
223
|
+
expect(onChange).toHaveBeenCalledTimes(2);
|
|
224
|
+
expect(patches[1]).toEqual([{ i: 'item2', x: 3, y: 0, w: 2, h: 2 }]); // only new changes
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
//# sourceMappingURL=events.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.test.js","sourceRoot":"../../../../../src","sources":["components/DashKit/__tests__/events.test.tsx"],"names":[],"mappings":"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","sourcesContent":["jest.mock('@gravity-ui/icons', () => ({\n Ellipsis: 'ellipsis',\n Gear: 'gear',\n Xmark: 'xmark',\n}));\n\njest.mock('@gravity-ui/uikit', () => {\n const ReactMock = require('react');\n\n return {\n Button: ({children}: {children?: unknown}) =>\n ReactMock.createElement('button', null, children),\n DropdownMenu: () => null,\n Icon: () => null,\n };\n});\n\njest.mock('../../GridLayout/GridLayout', () => {\n const ReactMock = require('react');\n\n return ReactMock.forwardRef(() => null);\n});\n\nimport type {Config} from '../../../shared';\nimport type {DashKitEventMap, DashKitLayoutPatch} from '../../../typings';\nimport {emitDashKitChangeEvent} from '../../../utils';\nimport {DashKit, _emitSymbol} from '../../DashKit';\n\nconst TEST_CONFIG: Config = {\n salt: 'test',\n counter: 1,\n items: [{id: 'item1', type: 'test-event', namespace: 'default', data: {}}],\n layout: [{i: 'item1', x: 0, y: 0, w: 2, h: 2}],\n aliases: {},\n connections: [],\n};\n\nconst NEXT_LAYOUT: Config['layout'] = [{i: 'item1', x: 1, y: 0, w: 2, h: 2}];\nconst NEXT_CONFIG: Config = {...TEST_CONFIG, layout: NEXT_LAYOUT};\n\ndescribe('DashKit change event — onChange gate', () => {\n it('no handler: onChange fires with full config when layout changes', () => {\n const onChange = jest.fn();\n const emitDashKitEvent = jest.fn();\n\n emitDashKitChangeEvent({\n config: TEST_CONFIG,\n newConfig: NEXT_CONFIG,\n onChange,\n emitDashKitEvent,\n });\n\n expect(emitDashKitEvent).toHaveBeenCalledTimes(1);\n expect(onChange).toHaveBeenCalledTimes(1);\n expect(onChange.mock.calls[0][0].config.layout).toEqual(NEXT_LAYOUT);\n });\n\n it('handler without preventDefault: onChange fires and handler receives correct event', () => {\n const instance = new DashKit(DashKit.defaultProps as never);\n const onChange = jest.fn();\n const handler = jest.fn();\n\n instance.on('change', handler);\n\n emitDashKitChangeEvent({\n config: TEST_CONFIG,\n newConfig: NEXT_CONFIG,\n onChange,\n emitDashKitEvent: instance[_emitSymbol],\n });\n\n expect(handler).toHaveBeenCalledTimes(1);\n expect(onChange).toHaveBeenCalledTimes(1);\n const event = handler.mock.calls[0][0] as DashKitEventMap['change'];\n expect(event.layout).toEqual(NEXT_LAYOUT);\n expect(event.previousLayout).toEqual(TEST_CONFIG.layout);\n expect(event.defaultPrevented).toBe(false);\n });\n\n it('handler calls preventDefault: onChange does NOT fire; event carries correct patches', () => {\n const instance = new DashKit(DashKit.defaultProps as never);\n const onChange = jest.fn();\n let capturedEvent: DashKitEventMap['change'] | undefined;\n\n instance.on('change', (e) => {\n capturedEvent = e;\n e.preventDefault();\n });\n\n emitDashKitChangeEvent({\n config: TEST_CONFIG,\n newConfig: NEXT_CONFIG,\n onChange,\n emitDashKitEvent: instance[_emitSymbol],\n });\n\n expect(onChange).not.toHaveBeenCalled();\n expect(capturedEvent).toBeDefined();\n if (capturedEvent) {\n expect(capturedEvent.patches).toEqual([{i: 'item1', x: 1, y: 0, w: 2, h: 2}]);\n expect(capturedEvent.layout).toEqual(NEXT_LAYOUT);\n expect(capturedEvent.previousLayout).toEqual(TEST_CONFIG.layout);\n expect(capturedEvent.defaultPrevented).toBe(true);\n }\n });\n\n it('same layout: event and onChange do not fire', () => {\n const onChange = jest.fn();\n const emitDashKitEvent = jest.fn();\n\n emitDashKitChangeEvent({\n config: TEST_CONFIG,\n newConfig: TEST_CONFIG,\n onChange,\n emitDashKitEvent,\n });\n\n expect(emitDashKitEvent).not.toHaveBeenCalled();\n expect(onChange).not.toHaveBeenCalled();\n });\n});\n\ndescribe('DashKit event emitter', () => {\n it('unsubscribe stops handler from being called', () => {\n const instance = new DashKit(DashKit.defaultProps as never);\n const handler = jest.fn();\n\n const unsubscribe = instance.on('change', handler);\n unsubscribe();\n\n const event = {\n patches: [],\n layout: [],\n previousLayout: [],\n preventDefault: jest.fn(),\n defaultPrevented: false,\n } as unknown as DashKitEventMap['change'];\n\n instance[_emitSymbol]('change', event);\n\n expect(handler).not.toHaveBeenCalled();\n });\n\n it('handler error does not stop other handlers; onChange still fires', () => {\n const instance = new DashKit(DashKit.defaultProps as never);\n const onChange = jest.fn();\n const normalHandler = jest.fn();\n\n instance.on('change', () => {\n throw new Error('boom');\n });\n instance.on('change', normalHandler);\n\n const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});\n\n emitDashKitChangeEvent({\n config: TEST_CONFIG,\n newConfig: NEXT_CONFIG,\n onChange,\n emitDashKitEvent: instance[_emitSymbol],\n });\n\n consoleErrorSpy.mockRestore();\n\n expect(normalHandler).toHaveBeenCalledTimes(1);\n expect(onChange).toHaveBeenCalledTimes(1);\n });\n});\n\ndescribe('DashKit change event — internal baseline (preventDefault flow)', () => {\n it('preventDefault flow: sequential changes produce incremental patches when baseline is updated', () => {\n const instance = new DashKit(DashKit.defaultProps as never);\n const onChange = jest.fn();\n const patches: Array<DashKitLayoutPatch[]> = [];\n\n instance.on('change', (e) => {\n patches.push([...e.patches]);\n e.preventDefault();\n });\n\n const config1: Config = {\n ...TEST_CONFIG,\n items: [\n {id: 'item1', type: 'test-event', namespace: 'default', data: {}},\n {id: 'item2', type: 'test-event', namespace: 'default', data: {}},\n ],\n layout: [\n {i: 'item1', x: 0, y: 0, w: 2, h: 2},\n {i: 'item2', x: 2, y: 0, w: 2, h: 2},\n ],\n };\n\n const config2: Config = {\n ...config1,\n layout: [\n {i: 'item1', x: 1, y: 0, w: 2, h: 2}, // item1 moved to x=1\n {i: 'item2', x: 2, y: 0, w: 2, h: 2}, // item2 unchanged\n ],\n };\n\n const config3: Config = {\n ...config1,\n layout: [\n {i: 'item1', x: 1, y: 0, w: 2, h: 2}, // item1 unchanged\n {i: 'item2', x: 3, y: 0, w: 2, h: 2}, // item2 moved to x=3\n ],\n };\n\n // First change: item1 moved from x=0 to x=1\n emitDashKitChangeEvent({\n config: config1,\n newConfig: config2,\n onChange,\n emitDashKitEvent: instance[_emitSymbol],\n });\n\n // Second change: In withContext, the internal baseline is updated automatically\n // after each change. Here we simulate this behavior by passing config2 as baseline.\n emitDashKitChangeEvent({\n config: config2, // internal baseline updated to config2.layout\n newConfig: config3,\n onChange,\n emitDashKitEvent: instance[_emitSymbol],\n });\n\n expect(onChange).not.toHaveBeenCalled(); // preventDefault works\n expect(patches).toHaveLength(2);\n\n // First patch: only item1\n expect(patches[0]).toEqual([{i: 'item1', x: 1, y: 0, w: 2, h: 2}]);\n\n // Second patch: only item2 (NO accumulation!)\n // This works because baseline was updated from config1.layout to config2.layout\n expect(patches[1]).toEqual([{i: 'item2', x: 3, y: 0, w: 2, h: 2}]);\n });\n\n it('legacy flow: onChange updates props and patches work correctly', () => {\n const instance = new DashKit(DashKit.defaultProps as never);\n let currentConfig: Config = {\n ...TEST_CONFIG,\n items: [\n {id: 'item1', type: 'test-event', namespace: 'default', data: {}},\n {id: 'item2', type: 'test-event', namespace: 'default', data: {}},\n ],\n layout: [\n {i: 'item1', x: 0, y: 0, w: 2, h: 2},\n {i: 'item2', x: 2, y: 0, w: 2, h: 2},\n ],\n };\n const patches: Array<Array<{i: string; x?: number; y?: number; w?: number; h?: number}>> =\n [];\n\n instance.on('change', (e) => {\n patches.push([...e.patches]);\n // NO preventDefault → onChange will fire\n });\n\n const onChange = jest.fn(({config}) => {\n currentConfig = config; // consumer updates state\n });\n\n const config2 = {\n ...currentConfig,\n layout: [\n {i: 'item1', x: 1, y: 0, w: 2, h: 2}, // item1 moved to x=1\n {i: 'item2', x: 2, y: 0, w: 2, h: 2}, // item2 unchanged\n ],\n };\n\n emitDashKitChangeEvent({\n config: currentConfig,\n newConfig: config2,\n onChange,\n emitDashKitEvent: instance[_emitSymbol],\n });\n\n expect(onChange).toHaveBeenCalledTimes(1);\n expect(patches[0]).toEqual([{i: 'item1', x: 1, y: 0, w: 2, h: 2}]);\n\n // Second change with updated config\n const config3 = {\n ...currentConfig,\n layout: [\n {i: 'item1', x: 1, y: 0, w: 2, h: 2}, // item1 unchanged\n {i: 'item2', x: 3, y: 0, w: 2, h: 2}, // item2 moved to x=3\n ],\n };\n\n emitDashKitChangeEvent({\n config: currentConfig, // ← updated after first onChange\n newConfig: config3,\n onChange,\n emitDashKitEvent: instance[_emitSymbol],\n });\n\n expect(onChange).toHaveBeenCalledTimes(2);\n expect(patches[1]).toEqual([{i: 'item2', x: 3, y: 0, w: 2, h: 2}]); // only new changes\n });\n});\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { DashKitWithContextProps } from "../../hocs/withContext.js";
|
|
3
3
|
import "./DashKitView.css";
|
|
4
|
-
type DashKitViewProps = Omit<DashKitWithContextProps, '
|
|
4
|
+
type DashKitViewProps = Omit<DashKitWithContextProps, 'forwardedMetaRef'>;
|
|
5
5
|
declare const DashKitViewForwardedMeta: React.ForwardRefExoticComponent<DashKitViewProps & React.RefAttributes<unknown>>;
|
|
6
6
|
export default DashKitViewForwardedMeta;
|
|
@@ -4,7 +4,6 @@ const tslib_1 = require("tslib");
|
|
|
4
4
|
const react_1 = tslib_1.__importDefault(require("react"));
|
|
5
5
|
const context_1 = require("../../context/index.js");
|
|
6
6
|
const withContext_1 = require("../../hocs/withContext.js");
|
|
7
|
-
const useCalcLayout_1 = require("../../hooks/useCalcLayout.js");
|
|
8
7
|
const cn_1 = require("../../utils/cn.js");
|
|
9
8
|
const GridLayout_1 = tslib_1.__importDefault(require("../GridLayout/GridLayout.js"));
|
|
10
9
|
const MobileLayout_1 = tslib_1.__importDefault(require("../MobileLayout/MobileLayout.js"));
|
|
@@ -17,8 +16,7 @@ function DashKitView() {
|
|
|
17
16
|
}
|
|
18
17
|
const DashKitViewWithContext = (0, withContext_1.withContext)(DashKitView);
|
|
19
18
|
const DashKitViewForwardedMeta = react_1.default.forwardRef((props, ref) => {
|
|
20
|
-
|
|
21
|
-
return react_1.default.createElement(DashKitViewWithContext, Object.assign({}, props, { layout: layout, forwardedMetaRef: ref }));
|
|
19
|
+
return react_1.default.createElement(DashKitViewWithContext, Object.assign({}, props, { forwardedMetaRef: ref }));
|
|
22
20
|
});
|
|
23
21
|
DashKitViewForwardedMeta.displayName = 'DashKitViewForwardedMeta';
|
|
24
22
|
exports.default = DashKitViewForwardedMeta;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashKitView.js","sourceRoot":"../../../../src","sources":["components/DashKitView/DashKitView.tsx"],"names":[],"mappings":";;;AAAA,0DAA0B;AAE1B,oDAA6C;AAC7C,2DAAmD;AAEnD,
|
|
1
|
+
{"version":3,"file":"DashKitView.js","sourceRoot":"../../../../src","sources":["components/DashKitView/DashKitView.tsx"],"names":[],"mappings":";;;AAAA,0DAA0B;AAE1B,oDAA6C;AAC7C,2DAAmD;AAEnD,0CAAkC;AAClC,qFAAkD;AAClD,2FAAwD;AAExD,6BAA4B;AAE5B,MAAM,CAAC,GAAG,IAAA,OAAE,EAAC,SAAS,CAAC,CAAC;AAIxB,SAAS,WAAW;IAChB,MAAM,OAAO,GAAG,eAAK,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;IACjD,MAAM,EAAC,eAAe,EAAE,gBAAgB,EAAC,GAAG,OAAO,CAAC;IAEpD,OAAO,CACH,uCAAK,SAAS,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,KAAK,EAAC,CAAC,IACrD,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CACjC,8BAAC,sBAAY,OAAG,CACnB,CAAC,CAAC,CAAC,CACA,8BAAC,oBAAU,IAAC,GAAG,EAAE,gBAAgB,GAAI,CACxC,CACC,CACT,CAAC;AACN,CAAC;AAED,MAAM,sBAAsB,GAAG,IAAA,yBAAW,EAAC,WAAW,CAAC,CAAC;AAExD,MAAM,wBAAwB,GAAG,eAAK,CAAC,UAAU,CAAC,CAAC,KAAuB,EAAE,GAAG,EAAE,EAAE;IAC/E,OAAO,8BAAC,sBAAsB,oBAAK,KAAK,IAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;AACxE,CAAC,CAAC,CAAC;AAEH,wBAAwB,CAAC,WAAW,GAAG,0BAA0B,CAAC;AAElE,kBAAe,wBAAwB,CAAC","sourcesContent":["import React from 'react';\n\nimport {DashKitContext} from '../../context';\nimport {withContext} from '../../hocs/withContext';\nimport type {DashKitWithContextProps} from '../../hocs/withContext';\nimport {cn} from '../../utils/cn';\nimport GridLayout from '../GridLayout/GridLayout';\nimport MobileLayout from '../MobileLayout/MobileLayout';\n\nimport './DashKitView.scss';\n\nconst b = cn('dashkit');\n\ntype DashKitViewProps = Omit<DashKitWithContextProps, 'forwardedMetaRef'>;\n\nfunction DashKitView() {\n const context = React.useContext(DashKitContext);\n const {registerManager, forwardedMetaRef} = context;\n\n return (\n <div className={b({theme: registerManager.settings.theme})}>\n {registerManager.settings.isMobile ? (\n <MobileLayout />\n ) : (\n <GridLayout ref={forwardedMetaRef} />\n )}\n </div>\n );\n}\n\nconst DashKitViewWithContext = withContext(DashKitView);\n\nconst DashKitViewForwardedMeta = React.forwardRef((props: DashKitViewProps, ref) => {\n return <DashKitViewWithContext {...props} forwardedMetaRef={ref} />;\n});\n\nDashKitViewForwardedMeta.displayName = 'DashKitViewForwardedMeta';\n\nexport default DashKitViewForwardedMeta;\n"]}
|
|
@@ -64,7 +64,7 @@ export default class GridLayout extends React.PureComponent<GridLayoutProps, Gri
|
|
|
64
64
|
h?: number;
|
|
65
65
|
} | false | undefined;
|
|
66
66
|
_clearSharedDragState(): void;
|
|
67
|
-
renderTemporaryPlaceholder(gridLayout: Partial<ReactGridLayoutProps>): JSX.Element | null;
|
|
68
|
-
renderGroup(group: string, renderLayout: ConfigLayout[], renderItems: ConfigItem[], offset?: number, groupGridProperties?: (props: ReactGridLayoutProps) => ReactGridLayoutProps): JSX.Element;
|
|
69
|
-
render(): JSX.Element | (string | number | boolean | JSX.Element | React.
|
|
67
|
+
renderTemporaryPlaceholder(gridLayout: Partial<ReactGridLayoutProps>): React.JSX.Element | null;
|
|
68
|
+
renderGroup(group: string, renderLayout: ConfigLayout[], renderItems: ConfigItem[], offset?: number, groupGridProperties?: (props: ReactGridLayoutProps) => ReactGridLayoutProps): React.JSX.Element;
|
|
69
|
+
render(): React.JSX.Element | (string | number | bigint | boolean | React.JSX.Element | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | undefined)[];
|
|
70
70
|
}
|
|
@@ -23,7 +23,7 @@ function groupLayoutPropsAreEqual(prev, next) {
|
|
|
23
23
|
return !needRerenderIfChanged && !needRerenderGroupScoped && !hasTmpPlaceholderChanged;
|
|
24
24
|
}
|
|
25
25
|
exports.GroupLayout = react_1.default.memo(function GroupLayout({ group, renderItems, offset, properties, compactType, callbacks, layout, temporaryPlaceholder, dragStateRef, sharedDragPositionRef, groupResetRegistryRef, isDragCaptured, isAnyDragging, currentDraggingItemId, isAnyDraggedOut, adjustWidgetLayout, getMemoForwardRefCallback, }) {
|
|
26
|
-
const { editMode, noOverlay, focusable, draggableHandleClassName, outerDnDEnable, onItemMountChange, onItemRender, onItemFocus, onItemBlur, } = react_1.default.useContext(context_1.DashKitContext);
|
|
26
|
+
const { editMode, noOverlay, focusable, draggableHandleClassName, outerDnDEnable, onItemMountChange, onItemRender, onItemFocus, onItemBlur, externalLayoutRevision, } = react_1.default.useContext(context_1.DashKitContext);
|
|
27
27
|
// Use group-specific noOverlay if it was explicitly set via groupGridProperties,
|
|
28
28
|
// otherwise fallback to the dashboard-level noOverlay from context.
|
|
29
29
|
const resolvedNoOverlay = 'noOverlay' in properties ? properties.noOverlay : noOverlay;
|
|
@@ -54,7 +54,7 @@ exports.GroupLayout = react_1.default.memo(function GroupLayout({ group, renderI
|
|
|
54
54
|
getMemoForwardRefCallback,
|
|
55
55
|
editMode,
|
|
56
56
|
]);
|
|
57
|
-
return (react_1.default.createElement(ReactGridLayout_1.Layout, Object.assign({ key: `group_${group}`, isDraggable: editMode, isResizable: editMode }, properties, { compactType: compactType, layout: layout, draggableCancel: `.${constants_1.DRAGGABLE_CANCEL_CLASS_NAME}`, draggableHandle: draggableHandleClassName ? `.${draggableHandleClassName}` : undefined, onDragStart: callbacks.onDragStart, onDrag: callbacks.onDrag, onDragStop: callbacks.onDragStop, onResizeStart: callbacks.onResizeStart, onResize: callbacks.onResize, onResizeStop: callbacks.onResizeStop, onDragTargetRestore: callbacks.onDragTargetRestore, onDropDragOver: callbacks.onDropDragOver, onDrop: callbacks.onDrop, dragStateRef: dragStateRef, sharedDragPositionRef: sharedDragPositionRef, groupResetRegistryRef: groupResetRegistryRef, group: group, isDragCaptured: isDragCaptured, isDroppable: Boolean(outerDnDEnable) && editMode }),
|
|
57
|
+
return (react_1.default.createElement(ReactGridLayout_1.Layout, Object.assign({ key: `group_${group}`, isDraggable: editMode, externalLayoutRevision: externalLayoutRevision, isResizable: editMode }, properties, { compactType: compactType, layout: layout, draggableCancel: `.${constants_1.DRAGGABLE_CANCEL_CLASS_NAME}`, draggableHandle: draggableHandleClassName ? `.${draggableHandleClassName}` : undefined, onDragStart: callbacks.onDragStart, onDrag: callbacks.onDrag, onDragStop: callbacks.onDragStop, onResizeStart: callbacks.onResizeStart, onResize: callbacks.onResize, onResizeStop: callbacks.onResizeStop, onDragTargetRestore: callbacks.onDragTargetRestore, onDropDragOver: callbacks.onDropDragOver, onDrop: callbacks.onDrop, dragStateRef: dragStateRef, sharedDragPositionRef: sharedDragPositionRef, groupResetRegistryRef: groupResetRegistryRef, group: group, isDragCaptured: isDragCaptured, isDroppable: Boolean(outerDnDEnable) && editMode }),
|
|
58
58
|
itemElements,
|
|
59
59
|
temporaryPlaceholder));
|
|
60
60
|
}, groupLayoutPropsAreEqual);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupLayout.js","sourceRoot":"../../../../src","sources":["components/GridLayout/GroupLayout.tsx"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAE1B,wDAA4D;AAC5D,oDAA6C;AAG7C,+EAA4C;AAE5C,0DAAyC;AAEzC,sCAA8D;AA8B9D,SAAS,wBAAwB,CAAC,IAAsB,EAAE,IAAsB;IAC5E,MAAM,qBAAqB,GACvB,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;QACzB,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAC3B,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAC3B,CAAC,IAAA,yBAAiB,EAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;QACtD,CAAC,IAAA,0BAAkB,EAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAE1D,sFAAsF;IACtF,MAAM,uBAAuB,GACzB,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,cAAc;QAC3C,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa;QACzC,IAAI,CAAC,qBAAqB,KAAK,IAAI,CAAC,qBAAqB;QACzD,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,eAAe,CAAC;IAElD,MAAM,wBAAwB,GAAG,IAAI,CAAC,oBAAoB,KAAK,IAAI,CAAC,oBAAoB,CAAC;IAEzF,OAAO,CAAC,qBAAqB,IAAI,CAAC,uBAAuB,IAAI,CAAC,wBAAwB,CAAC;AAC3F,CAAC;AAEY,QAAA,WAAW,GAAG,eAAK,CAAC,IAAI,CAAC,SAAS,WAAW,CAAC,EACvD,KAAK,EACL,WAAW,EACX,MAAM,EACN,UAAU,EACV,WAAW,EACX,SAAS,EACT,MAAM,EACN,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,yBAAyB,GACV;IACf,MAAM,EACF,QAAQ,EACR,SAAS,EACT,SAAS,EACT,wBAAwB,EACxB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,UAAU,
|
|
1
|
+
{"version":3,"file":"GroupLayout.js","sourceRoot":"../../../../src","sources":["components/GridLayout/GroupLayout.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport {DRAGGABLE_CANCEL_CLASS_NAME} from '../../constants';\nimport {DashKitContext} from '../../context';\nimport type {ConfigItem, ConfigLayout} from '../../shared';\nimport type {PluginRef, PluginWidgetProps, ReactGridLayoutProps} from '../../typings';\nimport GridItem from '../GridItem/GridItem';\n\nimport {Layout} from './ReactGridLayout';\nimport type {GroupCallbacks} from './types';\nimport {shallowArrayEqual, shallowObjectEqual} from './utils';\n\nexport interface GroupLayoutProps {\n group: string;\n renderItems: ConfigItem[];\n offset: number;\n\n // Pre-computed by GridLayout.renderGroup (stable refs via getMemoGroupProps)\n properties: Partial<ReactGridLayoutProps>;\n compactType: 'vertical' | 'horizontal' | null | undefined;\n callbacks: GroupCallbacks;\n layout: ConfigLayout[];\n temporaryPlaceholder: React.ReactNode;\n\n // Refs read imperatively by DragOverLayout — no re-render on drag start.\n isDragCaptured: boolean;\n dragStateRef: React.MutableRefObject<{isDragging: boolean; sourceGroup: string | null}>;\n sharedDragPositionRef: React.MutableRefObject<{offsetX: number; offsetY: number} | null>;\n groupResetRegistryRef: React.MutableRefObject<Map<string, () => void>>;\n\n // Drag state scoped to this group only (always false/null for non-source groups)\n isAnyDragging: boolean;\n currentDraggingItemId: string | null;\n isAnyDraggedOut: boolean;\n\n // Stable instance method refs from GridLayout (arrow function class properties)\n adjustWidgetLayout: PluginWidgetProps['adjustWidgetLayout'];\n getMemoForwardRefCallback: (index: number) => (ref: PluginRef) => void;\n}\n\nfunction groupLayoutPropsAreEqual(prev: GroupLayoutProps, next: GroupLayoutProps): boolean {\n const needRerenderIfChanged =\n prev.group !== next.group ||\n prev.layout !== next.layout ||\n prev.offset !== next.offset ||\n !shallowArrayEqual(prev.renderItems, next.renderItems) ||\n !shallowObjectEqual(prev.properties, next.properties);\n\n // Drag refs are stable and never trigger re-renders; only group-scoped state matters.\n const needRerenderGroupScoped =\n prev.isDragCaptured !== next.isDragCaptured ||\n prev.isAnyDragging !== next.isAnyDragging ||\n prev.currentDraggingItemId !== next.currentDraggingItemId ||\n prev.isAnyDraggedOut !== next.isAnyDraggedOut;\n\n const hasTmpPlaceholderChanged = prev.temporaryPlaceholder !== next.temporaryPlaceholder;\n\n return !needRerenderIfChanged && !needRerenderGroupScoped && !hasTmpPlaceholderChanged;\n}\n\nexport const GroupLayout = React.memo(function GroupLayout({\n group,\n renderItems,\n offset,\n properties,\n compactType,\n callbacks,\n layout,\n temporaryPlaceholder,\n dragStateRef,\n sharedDragPositionRef,\n groupResetRegistryRef,\n isDragCaptured,\n isAnyDragging,\n currentDraggingItemId,\n isAnyDraggedOut,\n adjustWidgetLayout,\n getMemoForwardRefCallback,\n}: GroupLayoutProps) {\n const {\n editMode,\n noOverlay,\n focusable,\n draggableHandleClassName,\n outerDnDEnable,\n onItemMountChange,\n onItemRender,\n onItemFocus,\n onItemBlur,\n externalLayoutRevision,\n } = React.useContext(DashKitContext);\n\n // Use group-specific noOverlay if it was explicitly set via groupGridProperties,\n // otherwise fallback to the dashboard-level noOverlay from context.\n const resolvedNoOverlay = 'noOverlay' in properties ? properties.noOverlay : noOverlay;\n\n // Memoize items array; non-source groups have stable false/null drag props so React skips their subtrees.\n const itemElements = React.useMemo(() => {\n return renderItems.map((item, i) => {\n const keyId = item.id;\n\n const isDragging = editMode && isAnyDragging && keyId === currentDraggingItemId;\n const isDraggedOut = isDragging && isAnyDraggedOut;\n\n return (\n <GridItem\n key={keyId}\n forwardedPluginRef={getMemoForwardRefCallback(offset + i)}\n id={keyId}\n item={item}\n layout={layout}\n adjustWidgetLayout={adjustWidgetLayout}\n isDragging={isDragging}\n isDraggedOut={isDraggedOut || undefined}\n noOverlay={resolvedNoOverlay}\n focusable={focusable}\n withCustomHandle={Boolean(draggableHandleClassName)}\n onItemMountChange={onItemMountChange}\n onItemRender={onItemRender}\n gridLayout={properties}\n onItemFocus={onItemFocus}\n onItemBlur={onItemBlur}\n />\n );\n });\n }, [\n renderItems,\n isAnyDragging,\n currentDraggingItemId,\n isAnyDraggedOut,\n offset,\n layout,\n adjustWidgetLayout,\n resolvedNoOverlay,\n focusable,\n draggableHandleClassName,\n onItemMountChange,\n onItemRender,\n properties,\n onItemFocus,\n onItemBlur,\n getMemoForwardRefCallback,\n editMode,\n ]);\n\n return (\n <Layout\n key={`group_${group}`}\n isDraggable={editMode}\n externalLayoutRevision={externalLayoutRevision}\n isResizable={editMode}\n {...properties}\n compactType={compactType}\n layout={layout}\n draggableCancel={`.${DRAGGABLE_CANCEL_CLASS_NAME}`}\n draggableHandle={draggableHandleClassName ? `.${draggableHandleClassName}` : undefined}\n onDragStart={callbacks.onDragStart}\n onDrag={callbacks.onDrag}\n onDragStop={callbacks.onDragStop}\n onResizeStart={callbacks.onResizeStart}\n onResize={callbacks.onResize}\n onResizeStop={callbacks.onResizeStop}\n onDragTargetRestore={callbacks.onDragTargetRestore}\n onDropDragOver={callbacks.onDropDragOver}\n onDrop={callbacks.onDrop}\n dragStateRef={dragStateRef}\n sharedDragPositionRef={sharedDragPositionRef}\n groupResetRegistryRef={groupResetRegistryRef}\n group={group}\n isDragCaptured={isDragCaptured}\n isDroppable={Boolean(outerDnDEnable) && editMode}\n >\n {itemElements}\n {temporaryPlaceholder}\n </Layout>\n );\n}, groupLayoutPropsAreEqual);\n"]}
|
|
@@ -16,5 +16,6 @@ export declare const Layout: React.ComponentClass<ReactGridLayout.ReactGridLayou
|
|
|
16
16
|
onDragTargetRestore?: () => void;
|
|
17
17
|
transformScaleRef?: React.MutableRefObject<number>;
|
|
18
18
|
groupResetRegistryRef?: React.MutableRefObject<Map<string, () => void>>;
|
|
19
|
+
externalLayoutRevision?: number;
|
|
19
20
|
} & ReactGridLayout.WidthProviderProps, any>;
|
|
20
21
|
export {};
|
|
@@ -16,6 +16,10 @@ class DragOverLayout extends react_grid_layout_1.default {
|
|
|
16
16
|
constructor(props, context) {
|
|
17
17
|
super(props, context);
|
|
18
18
|
this._savedDraggedOutLayout = null;
|
|
19
|
+
// Suppresses onLayoutMaybeChanged during imperative layout restore actions.
|
|
20
|
+
// Without this flag, our setState would trigger onLayoutChange back to the consumer
|
|
21
|
+
// that just initiated the action, causing a spurious 'change' event.
|
|
22
|
+
this._isRestoringExternalLayout = false;
|
|
19
23
|
// Reset placeholder when item dragged from outside
|
|
20
24
|
this.resetExternalPlaceholder = () => {
|
|
21
25
|
// @ts-expect-error - dragEnterCounter is an internal property of parent class
|
|
@@ -166,6 +170,39 @@ class DragOverLayout extends react_grid_layout_1.default {
|
|
|
166
170
|
innerElement.addEventListener('mousemove', this.mouseMoveHandler);
|
|
167
171
|
}
|
|
168
172
|
}
|
|
173
|
+
componentDidUpdate(prevProps, prevState) {
|
|
174
|
+
var _a;
|
|
175
|
+
const revisionChanged = prevProps.externalLayoutRevision !== this.props.externalLayoutRevision;
|
|
176
|
+
if (revisionChanged && this.props.layout) {
|
|
177
|
+
const newLayout = react_grid_layout_1.utils.synchronizeLayoutWithChildren(this.props.layout, this.props.children, this.props.cols, react_grid_layout_1.utils.compactType(this.props), this.props.allowOverlap);
|
|
178
|
+
this._isRestoringExternalLayout = true;
|
|
179
|
+
// Override both layout and propsLayout so getDerivedStateFromProps
|
|
180
|
+
// doesn't revert our update on the next render cycle.
|
|
181
|
+
this.setState({
|
|
182
|
+
layout: newLayout,
|
|
183
|
+
propsLayout: this.props.layout,
|
|
184
|
+
}, () => {
|
|
185
|
+
this._isRestoringExternalLayout = false;
|
|
186
|
+
});
|
|
187
|
+
// RGL's shouldComponentUpdate only tracks activeDrag/mounted/droppingPosition — not
|
|
188
|
+
// state.layout. So setState({layout}) alone is silently ignored (no re-render).
|
|
189
|
+
// forceUpdate bypasses SCU and is batched with the setState above, producing a
|
|
190
|
+
// single render cycle with the merged state that includes the restored layout.
|
|
191
|
+
this.forceUpdate();
|
|
192
|
+
// Don't call super here: restoring is an external action, not a user drag/resize.
|
|
193
|
+
// onLayoutMaybeChanged is suppressed via _isRestoringExternalLayout.
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
// Maintain parent behavior for all non-restore cycles (drag, resize, etc.).
|
|
197
|
+
(_a = super.componentDidUpdate) === null || _a === void 0 ? void 0 : _a.call(this, prevProps, prevState);
|
|
198
|
+
}
|
|
199
|
+
onLayoutMaybeChanged(newLayout, oldLayout) {
|
|
200
|
+
if (this._isRestoringExternalLayout) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
// @ts-expect-error — onLayoutMaybeChanged is not in ReactGridLayout's public types
|
|
204
|
+
super.onLayoutMaybeChanged(newLayout, oldLayout);
|
|
205
|
+
}
|
|
169
206
|
componentWillUnmount() {
|
|
170
207
|
var _a;
|
|
171
208
|
if (this.props.group !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactGridLayout.js","sourceRoot":"../../../../src","sources":["components/GridLayout/ReactGridLayout.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport type {Layout as RGLLayout} from 'react-grid-layout';\n// @ts-expect-error - utils is not exported in type definitions\nimport ReactGridLayout, {WidthProvider, utils} from 'react-grid-layout';\n\nimport {DROPPING_ELEMENT_CLASS_NAME, OVERLAY_CLASS_NAME} from '../../constants';\n\nconst isRefObject = (\n value: React.Ref<HTMLDivElement>,\n): value is React.RefObject<HTMLDivElement> => {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'current' in value &&\n typeof value.current === 'object'\n );\n};\n\ntype SharedDragPosition = {\n offsetX: number;\n offsetY: number;\n};\n\ntype DragOverLayoutProps = ReactGridLayout.ReactGridLayoutProps & {\n innerRef?: React.Ref<HTMLDivElement>;\n isDragCaptured?: boolean;\n dragStateRef?: React.MutableRefObject<{isDragging: boolean; sourceGroup: string | null}>;\n sharedDragPositionRef?: React.MutableRefObject<SharedDragPosition | null>;\n group?: string;\n onDragTargetRestore?: () => void;\n transformScaleRef?: React.MutableRefObject<number>;\n groupResetRegistryRef?: React.MutableRefObject<Map<string, () => void>>;\n};\n\ntype DragOverLayoutState = {\n layout: RGLLayout[];\n activeDrag: RGLLayout | null;\n};\n\ntype RGLLayoutWithPlaceholder = RGLLayout & {placeholder?: boolean};\n\ntype OnDragMethod = (\n i: string,\n x: number,\n y: number,\n sintEv: {e: Event; node: HTMLElement},\n) => void;\n\nclass DragOverLayout extends ReactGridLayout {\n // @ts-expect-error - TypeScript doesn't allow direct property redeclaration in extending classes. We need to narrow the props type from ReactGridLayoutProps to DragOverLayoutProps for type safety in our custom methods\n props: DragOverLayoutProps;\n // @ts-expect-error - TypeScript doesn't allow direct property redeclaration in extending classes. State is initialized by parent constructor\n state: DragOverLayoutState;\n\n parentOnDrag: OnDragMethod;\n parentOnDragStop: OnDragMethod;\n _savedDraggedOutLayout: RGLLayout[] | null = null;\n\n constructor(props: DragOverLayoutProps, context?: unknown) {\n super(props, context);\n\n // @ts-expect-error - onDrag is a protected method in parent class\n this.parentOnDrag = this.onDrag;\n // @ts-expect-error - assigning custom method to parent's onDrag\n this.onDrag = this.extendedOnDrag;\n\n // @ts-expect-error - onDragStop is a protected method in parent class\n this.parentOnDragStop = this.onDragStop;\n // @ts-expect-error - assigning custom method to parent's onDragStop\n this.onDragStop = this.extendedOnDragStop;\n }\n\n componentDidMount(): void {\n super.componentDidMount?.();\n\n if (this.props.group !== undefined) {\n this.props.groupResetRegistryRef?.current.set(\n this.props.group,\n this.resetExternalPlaceholder,\n );\n }\n\n // If cursor is moved out of the window there is a bug\n // which leaves placeholder element in grid, this action needed to reset this state\n window.addEventListener('dragend', this.resetExternalPlaceholder);\n const innerElement = this.getInnerElement();\n\n if (innerElement) {\n innerElement.addEventListener('mouseup', this.mouseUpHandler);\n innerElement.addEventListener('mouseenter', this.mouseEnterHandler);\n innerElement.addEventListener('mouseleave', this.mouseLeaveHandler);\n innerElement.addEventListener('mousemove', this.mouseMoveHandler);\n }\n }\n\n componentWillUnmount(): void {\n if (this.props.group !== undefined) {\n this.props.groupResetRegistryRef?.current.delete(this.props.group);\n }\n\n window.removeEventListener('dragend', this.resetExternalPlaceholder);\n const innerElement = this.getInnerElement();\n\n if (innerElement) {\n innerElement.removeEventListener('mouseup', this.mouseUpHandler);\n innerElement.removeEventListener('mouseenter', this.mouseEnterHandler);\n innerElement.removeEventListener('mouseleave', this.mouseLeaveHandler);\n innerElement.removeEventListener('mousemove', this.mouseMoveHandler);\n }\n }\n\n // react-grid-layout doens't calculate it's height when last element is removed\n // and just keeps the previous value\n // so for autosize to work in that case we are resetting it's height value\n containerHeight(): string | undefined {\n if (this.props.autoSize && this.state.layout.length === 0) {\n return;\n }\n\n // eslint-disable-next-line consistent-return\n // @ts-expect-error - containerHeight is a protected method in parent class\n return super.containerHeight();\n }\n\n // innerRef is passed by WithProvider without this wrapper there are only\n // * findDOMNode - deprecated\n // * rewrite whole ReactGridLayout.render method\n // so in that case don't try to use this class on it's own\n // or pass innerRef: React.MutableRef as it's not optional prop\n getInnerElement(): HTMLDivElement | null {\n const {innerRef} = this.props;\n\n return innerRef && isRefObject(innerRef) && innerRef.current ? innerRef.current : null;\n }\n\n // Reset placeholder when item dragged from outside\n resetExternalPlaceholder = (): void => {\n // @ts-expect-error - dragEnterCounter is an internal property of parent class\n if (this.dragEnterCounter) {\n // @ts-expect-error - dragEnterCounter is an internal property of parent class\n this.dragEnterCounter = 0;\n // @ts-expect-error - removeDroppingPlaceholder is a protected method in parent class\n this.removeDroppingPlaceholder();\n }\n };\n\n // Hide placeholder when element is dragged out\n hideLocalPlaceholder = (i: string): RGLLayout[] => {\n const {layout} = this.state;\n const {cols} = this.props;\n const savedLayout = layout.map((item) => ({...item}));\n\n let hiddenElement: RGLLayout | undefined;\n const newLayout = utils.compact(\n layout.filter((item) => {\n if (item.i === i) {\n hiddenElement = item;\n return false;\n }\n\n return true;\n }),\n utils.compactType(this.props),\n cols,\n );\n\n if (hiddenElement) {\n newLayout.push(hiddenElement);\n }\n\n this.setState({\n activeDrag: null,\n layout: newLayout,\n });\n\n return savedLayout;\n };\n\n extendedOnDrag = (\n i: string,\n x: number,\n y: number,\n sintEv: {e: Event; node: HTMLElement},\n ): void => {\n if (this.props.isDragCaptured) {\n if (!this._savedDraggedOutLayout) {\n this._savedDraggedOutLayout = this.hideLocalPlaceholder(i);\n }\n\n return;\n }\n\n this._savedDraggedOutLayout = null;\n // parent onDrag will show new placeholder again\n this.parentOnDrag(i, x, y, sintEv);\n };\n\n extendedOnDragStop = (\n i: string,\n x: number,\n y: number,\n sintEv: {e: Event; node: HTMLElement},\n ): void => {\n // Restoring layout if item was dropped outside of the grid\n if (this._savedDraggedOutLayout) {\n const savedLayout = this._savedDraggedOutLayout;\n const l = utils.getLayoutItem(savedLayout, i);\n\n // Create placeholder (display only)\n const placeholder: RGLLayoutWithPlaceholder = {\n w: l.w,\n h: l.h,\n x: l.x,\n y: l.y,\n placeholder: true,\n i: i,\n };\n\n this.setState(\n {\n layout: savedLayout,\n activeDrag: placeholder,\n },\n () => {\n this.parentOnDragStop(i, x, y, sintEv);\n },\n );\n\n this._savedDraggedOutLayout = null;\n } else {\n this.parentOnDragStop(i, x, y, sintEv);\n }\n };\n\n isSharedDragTarget = (): boolean => {\n const drag = this.props.dragStateRef?.current;\n return Boolean(drag?.isDragging);\n };\n\n // Proxy mouse events -> drag methods for dnd between groups\n mouseEnterHandler = (e: MouseEvent): void => {\n if (this.isSharedDragTarget()) {\n // @ts-expect-error - onDragEnter is a protected method in parent class\n this.onDragEnter(e);\n } else if (this.props.isDragCaptured) {\n this.props.onDragTargetRestore?.();\n }\n };\n\n mouseLeaveHandler = (e: MouseEvent): void => {\n if (this.isSharedDragTarget()) {\n // @ts-expect-error - onDragLeave is a protected method in parent class\n this.onDragLeave(e);\n this.props.onDragTargetRestore?.();\n }\n };\n\n mouseMoveHandler = (e: MouseEvent): void => {\n if (\n this.isSharedDragTarget() &&\n this.props.group !== this.props.dragStateRef?.current.sourceGroup\n ) {\n if (!(e as MouseEvent & {nativeEvent?: MouseEvent}).nativeEvent) {\n // Emulate nativeEvent for firefox\n const target = this.getInnerElement() || (e.target as HTMLElement);\n\n (e as MouseEvent & {nativeEvent: Partial<MouseEvent>}).nativeEvent = {\n clientX: e.clientX,\n clientY: e.clientY,\n target,\n };\n }\n\n // @ts-expect-error - onDragOver is a protected method in parent class\n this.onDragOver(e);\n }\n };\n\n mouseUpHandler = (e: MouseEvent): void => {\n if (this.isSharedDragTarget()) {\n e.preventDefault();\n const {droppingItem} = this.props;\n const {layout} = this.state;\n const item = layout.find((l) => l.i === droppingItem?.i);\n\n // reset dragEnter counter on drop for all registered groups\n this.props.groupResetRegistryRef?.current.forEach((reset) => reset());\n\n if (item) {\n this.props.onDrop?.(layout, item, e);\n }\n }\n };\n\n calculateDroppingPosition(itemProps: {\n containerWidth: number;\n cols: number;\n w: number;\n h: number;\n rowHeight: number;\n margin: [number, number];\n transformScale: number;\n droppingPosition: {left: number; top: number};\n }): {left: number; top: number} {\n const {containerWidth, cols, w, h, rowHeight, margin, transformScale, droppingPosition} =\n itemProps;\n const sharedDragPosition = this.props.sharedDragPositionRef?.current;\n\n let offsetX: number, offsetY: number;\n\n if (sharedDragPosition) {\n offsetX = sharedDragPosition.offsetX;\n offsetY = sharedDragPosition.offsetY;\n } else {\n offsetX = (((containerWidth / cols) * w) / 2 || 0) * transformScale;\n offsetY = ((h * rowHeight + (h - 1) * margin[1]) / 2 || 0) * transformScale;\n }\n\n return {\n ...droppingPosition,\n left: droppingPosition.left - offsetX,\n top: droppingPosition.top - offsetY,\n };\n }\n\n // Drop item from outside gets 0,0 droppingPosition\n // centering cursor on newly creted grid item\n // And cause grid-layout using it's own GridItem to make it look\n // like overlay adding className\n processGridItem(\n child: React.ReactElement,\n isDroppingItem?: boolean,\n ): React.ReactElement | undefined {\n // @ts-expect-error - processGridItem is a protected method in parent class\n const gridItem = super.processGridItem?.(child, isDroppingItem);\n\n if (!gridItem) {\n return gridItem;\n }\n\n // Lazy proxy for transformScaleRef so react-draggable reads fresh scale without re-render.\n const {transformScaleRef} = this.props;\n const lazyScale = transformScaleRef\n ? ({valueOf: () => transformScaleRef.current} as unknown as number)\n : undefined;\n\n if (isDroppingItem) {\n // React.cloneElement is just cleaner then copy-paste whole processGridItem method\n return React.cloneElement(gridItem, {\n ...(lazyScale !== undefined && {transformScale: lazyScale}),\n // hiding preview if dragging shared item\n style: this.isSharedDragTarget()\n ? {...gridItem.props.style, opacity: 0}\n : gridItem.props.style,\n className: `${OVERLAY_CLASS_NAME} ${DROPPING_ELEMENT_CLASS_NAME}`,\n droppingPosition: this.calculateDroppingPosition(gridItem.props),\n });\n }\n\n if (lazyScale !== undefined) {\n return React.cloneElement(gridItem, {transformScale: lazyScale});\n }\n\n return gridItem;\n }\n}\n\n// eslint-disable-next-line new-cap\nexport const Layout = WidthProvider<DragOverLayoutProps>(DragOverLayout);\n"]}
|
|
1
|
+
{"version":3,"file":"ReactGridLayout.js","sourceRoot":"../../../../src","sources":["components/GridLayout/ReactGridLayout.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport type {Layout as RGLLayout} from 'react-grid-layout';\n// @ts-expect-error - utils is not exported in type definitions\nimport ReactGridLayout, {WidthProvider, utils} from 'react-grid-layout';\n\nimport {DROPPING_ELEMENT_CLASS_NAME, OVERLAY_CLASS_NAME} from '../../constants';\n\nconst isRefObject = (\n value: React.Ref<HTMLDivElement>,\n): value is React.RefObject<HTMLDivElement> => {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'current' in value &&\n typeof value.current === 'object'\n );\n};\n\ntype SharedDragPosition = {\n offsetX: number;\n offsetY: number;\n};\n\ntype DragOverLayoutProps = ReactGridLayout.ReactGridLayoutProps & {\n innerRef?: React.Ref<HTMLDivElement>;\n isDragCaptured?: boolean;\n dragStateRef?: React.MutableRefObject<{isDragging: boolean; sourceGroup: string | null}>;\n sharedDragPositionRef?: React.MutableRefObject<SharedDragPosition | null>;\n group?: string;\n onDragTargetRestore?: () => void;\n transformScaleRef?: React.MutableRefObject<number>;\n groupResetRegistryRef?: React.MutableRefObject<Map<string, () => void>>;\n externalLayoutRevision?: number;\n};\n\ntype DragOverLayoutState = {\n layout: RGLLayout[];\n activeDrag: RGLLayout | null;\n};\n\ntype RGLLayoutWithPlaceholder = RGLLayout & {placeholder?: boolean};\n\ntype OnDragMethod = (\n i: string,\n x: number,\n y: number,\n sintEv: {e: Event; node: HTMLElement},\n) => void;\n\nclass DragOverLayout extends ReactGridLayout {\n // @ts-expect-error - TypeScript doesn't allow direct property redeclaration in extending classes. We need to narrow the props type from ReactGridLayoutProps to DragOverLayoutProps for type safety in our custom methods\n props: DragOverLayoutProps;\n // @ts-expect-error - TypeScript doesn't allow direct property redeclaration in extending classes. State is initialized by parent constructor\n state: DragOverLayoutState;\n\n parentOnDrag: OnDragMethod;\n parentOnDragStop: OnDragMethod;\n _savedDraggedOutLayout: RGLLayout[] | null = null;\n // Suppresses onLayoutMaybeChanged during imperative layout restore actions.\n // Without this flag, our setState would trigger onLayoutChange back to the consumer\n // that just initiated the action, causing a spurious 'change' event.\n _isRestoringExternalLayout = false;\n\n constructor(props: DragOverLayoutProps, context?: unknown) {\n super(props, context);\n\n // @ts-expect-error - onDrag is a protected method in parent class\n this.parentOnDrag = this.onDrag;\n // @ts-expect-error - assigning custom method to parent's onDrag\n this.onDrag = this.extendedOnDrag;\n\n // @ts-expect-error - onDragStop is a protected method in parent class\n this.parentOnDragStop = this.onDragStop;\n // @ts-expect-error - assigning custom method to parent's onDragStop\n this.onDragStop = this.extendedOnDragStop;\n }\n\n componentDidMount(): void {\n super.componentDidMount?.();\n\n if (this.props.group !== undefined) {\n this.props.groupResetRegistryRef?.current.set(\n this.props.group,\n this.resetExternalPlaceholder,\n );\n }\n\n // If cursor is moved out of the window there is a bug\n // which leaves placeholder element in grid, this action needed to reset this state\n window.addEventListener('dragend', this.resetExternalPlaceholder);\n const innerElement = this.getInnerElement();\n\n if (innerElement) {\n innerElement.addEventListener('mouseup', this.mouseUpHandler);\n innerElement.addEventListener('mouseenter', this.mouseEnterHandler);\n innerElement.addEventListener('mouseleave', this.mouseLeaveHandler);\n innerElement.addEventListener('mousemove', this.mouseMoveHandler);\n }\n }\n\n componentDidUpdate(prevProps: DragOverLayoutProps, prevState: DragOverLayoutState): void {\n const revisionChanged =\n prevProps.externalLayoutRevision !== this.props.externalLayoutRevision;\n\n if (revisionChanged && this.props.layout) {\n const newLayout = utils.synchronizeLayoutWithChildren(\n this.props.layout,\n this.props.children,\n this.props.cols,\n utils.compactType(this.props),\n this.props.allowOverlap,\n );\n\n this._isRestoringExternalLayout = true;\n // Override both layout and propsLayout so getDerivedStateFromProps\n // doesn't revert our update on the next render cycle.\n this.setState(\n {\n layout: newLayout,\n propsLayout: this.props.layout,\n } as unknown as DragOverLayoutState,\n () => {\n this._isRestoringExternalLayout = false;\n },\n );\n // RGL's shouldComponentUpdate only tracks activeDrag/mounted/droppingPosition — not\n // state.layout. So setState({layout}) alone is silently ignored (no re-render).\n // forceUpdate bypasses SCU and is batched with the setState above, producing a\n // single render cycle with the merged state that includes the restored layout.\n this.forceUpdate();\n // Don't call super here: restoring is an external action, not a user drag/resize.\n // onLayoutMaybeChanged is suppressed via _isRestoringExternalLayout.\n return;\n }\n\n // Maintain parent behavior for all non-restore cycles (drag, resize, etc.).\n super.componentDidUpdate?.(prevProps, prevState);\n }\n\n onLayoutMaybeChanged(newLayout: RGLLayout[], oldLayout: RGLLayout[]): void {\n if (this._isRestoringExternalLayout) {\n return;\n }\n // @ts-expect-error — onLayoutMaybeChanged is not in ReactGridLayout's public types\n super.onLayoutMaybeChanged(newLayout, oldLayout);\n }\n\n componentWillUnmount(): void {\n if (this.props.group !== undefined) {\n this.props.groupResetRegistryRef?.current.delete(this.props.group);\n }\n\n window.removeEventListener('dragend', this.resetExternalPlaceholder);\n const innerElement = this.getInnerElement();\n\n if (innerElement) {\n innerElement.removeEventListener('mouseup', this.mouseUpHandler);\n innerElement.removeEventListener('mouseenter', this.mouseEnterHandler);\n innerElement.removeEventListener('mouseleave', this.mouseLeaveHandler);\n innerElement.removeEventListener('mousemove', this.mouseMoveHandler);\n }\n }\n\n // react-grid-layout doens't calculate it's height when last element is removed\n // and just keeps the previous value\n // so for autosize to work in that case we are resetting it's height value\n containerHeight(): string | undefined {\n if (this.props.autoSize && this.state.layout.length === 0) {\n return;\n }\n\n // eslint-disable-next-line consistent-return\n // @ts-expect-error - containerHeight is a protected method in parent class\n return super.containerHeight();\n }\n\n // innerRef is passed by WithProvider without this wrapper there are only\n // * findDOMNode - deprecated\n // * rewrite whole ReactGridLayout.render method\n // so in that case don't try to use this class on it's own\n // or pass innerRef: React.MutableRef as it's not optional prop\n getInnerElement(): HTMLDivElement | null {\n const {innerRef} = this.props;\n\n return innerRef && isRefObject(innerRef) && innerRef.current ? innerRef.current : null;\n }\n\n // Reset placeholder when item dragged from outside\n resetExternalPlaceholder = (): void => {\n // @ts-expect-error - dragEnterCounter is an internal property of parent class\n if (this.dragEnterCounter) {\n // @ts-expect-error - dragEnterCounter is an internal property of parent class\n this.dragEnterCounter = 0;\n // @ts-expect-error - removeDroppingPlaceholder is a protected method in parent class\n this.removeDroppingPlaceholder();\n }\n };\n\n // Hide placeholder when element is dragged out\n hideLocalPlaceholder = (i: string): RGLLayout[] => {\n const {layout} = this.state;\n const {cols} = this.props;\n const savedLayout = layout.map((item) => ({...item}));\n\n let hiddenElement: RGLLayout | undefined;\n const newLayout = utils.compact(\n layout.filter((item) => {\n if (item.i === i) {\n hiddenElement = item;\n return false;\n }\n\n return true;\n }),\n utils.compactType(this.props),\n cols,\n );\n\n if (hiddenElement) {\n newLayout.push(hiddenElement);\n }\n\n this.setState({\n activeDrag: null,\n layout: newLayout,\n });\n\n return savedLayout;\n };\n\n extendedOnDrag = (\n i: string,\n x: number,\n y: number,\n sintEv: {e: Event; node: HTMLElement},\n ): void => {\n if (this.props.isDragCaptured) {\n if (!this._savedDraggedOutLayout) {\n this._savedDraggedOutLayout = this.hideLocalPlaceholder(i);\n }\n\n return;\n }\n\n this._savedDraggedOutLayout = null;\n // parent onDrag will show new placeholder again\n this.parentOnDrag(i, x, y, sintEv);\n };\n\n extendedOnDragStop = (\n i: string,\n x: number,\n y: number,\n sintEv: {e: Event; node: HTMLElement},\n ): void => {\n // Restoring layout if item was dropped outside of the grid\n if (this._savedDraggedOutLayout) {\n const savedLayout = this._savedDraggedOutLayout;\n const l = utils.getLayoutItem(savedLayout, i);\n\n // Create placeholder (display only)\n const placeholder: RGLLayoutWithPlaceholder = {\n w: l.w,\n h: l.h,\n x: l.x,\n y: l.y,\n placeholder: true,\n i: i,\n };\n\n this.setState(\n {\n layout: savedLayout,\n activeDrag: placeholder,\n },\n () => {\n this.parentOnDragStop(i, x, y, sintEv);\n },\n );\n\n this._savedDraggedOutLayout = null;\n } else {\n this.parentOnDragStop(i, x, y, sintEv);\n }\n };\n\n isSharedDragTarget = (): boolean => {\n const drag = this.props.dragStateRef?.current;\n return Boolean(drag?.isDragging);\n };\n\n // Proxy mouse events -> drag methods for dnd between groups\n mouseEnterHandler = (e: MouseEvent): void => {\n if (this.isSharedDragTarget()) {\n // @ts-expect-error - onDragEnter is a protected method in parent class\n this.onDragEnter(e);\n } else if (this.props.isDragCaptured) {\n this.props.onDragTargetRestore?.();\n }\n };\n\n mouseLeaveHandler = (e: MouseEvent): void => {\n if (this.isSharedDragTarget()) {\n // @ts-expect-error - onDragLeave is a protected method in parent class\n this.onDragLeave(e);\n this.props.onDragTargetRestore?.();\n }\n };\n\n mouseMoveHandler = (e: MouseEvent): void => {\n if (\n this.isSharedDragTarget() &&\n this.props.group !== this.props.dragStateRef?.current.sourceGroup\n ) {\n if (!(e as MouseEvent & {nativeEvent?: MouseEvent}).nativeEvent) {\n // Emulate nativeEvent for firefox\n const target = this.getInnerElement() || (e.target as HTMLElement);\n\n (e as MouseEvent & {nativeEvent: Partial<MouseEvent>}).nativeEvent = {\n clientX: e.clientX,\n clientY: e.clientY,\n target,\n };\n }\n\n // @ts-expect-error - onDragOver is a protected method in parent class\n this.onDragOver(e);\n }\n };\n\n mouseUpHandler = (e: MouseEvent): void => {\n if (this.isSharedDragTarget()) {\n e.preventDefault();\n const {droppingItem} = this.props;\n const {layout} = this.state;\n const item = layout.find((l) => l.i === droppingItem?.i);\n\n // reset dragEnter counter on drop for all registered groups\n this.props.groupResetRegistryRef?.current.forEach((reset) => reset());\n\n if (item) {\n this.props.onDrop?.(layout, item, e);\n }\n }\n };\n\n calculateDroppingPosition(itemProps: {\n containerWidth: number;\n cols: number;\n w: number;\n h: number;\n rowHeight: number;\n margin: [number, number];\n transformScale: number;\n droppingPosition: {left: number; top: number};\n }): {left: number; top: number} {\n const {containerWidth, cols, w, h, rowHeight, margin, transformScale, droppingPosition} =\n itemProps;\n const sharedDragPosition = this.props.sharedDragPositionRef?.current;\n\n let offsetX: number, offsetY: number;\n\n if (sharedDragPosition) {\n offsetX = sharedDragPosition.offsetX;\n offsetY = sharedDragPosition.offsetY;\n } else {\n offsetX = (((containerWidth / cols) * w) / 2 || 0) * transformScale;\n offsetY = ((h * rowHeight + (h - 1) * margin[1]) / 2 || 0) * transformScale;\n }\n\n return {\n ...droppingPosition,\n left: droppingPosition.left - offsetX,\n top: droppingPosition.top - offsetY,\n };\n }\n\n // Drop item from outside gets 0,0 droppingPosition\n // centering cursor on newly creted grid item\n // And cause grid-layout using it's own GridItem to make it look\n // like overlay adding className\n processGridItem(\n child: React.ReactElement,\n isDroppingItem?: boolean,\n ): React.ReactElement | undefined {\n // @ts-expect-error - processGridItem is a protected method in parent class\n const gridItem = super.processGridItem?.(child, isDroppingItem);\n\n if (!gridItem) {\n return gridItem;\n }\n\n // Lazy proxy for transformScaleRef so react-draggable reads fresh scale without re-render.\n const {transformScaleRef} = this.props;\n const lazyScale = transformScaleRef\n ? ({valueOf: () => transformScaleRef.current} as unknown as number)\n : undefined;\n\n if (isDroppingItem) {\n // React.cloneElement is just cleaner then copy-paste whole processGridItem method\n return React.cloneElement(gridItem, {\n ...(lazyScale !== undefined && {transformScale: lazyScale}),\n // hiding preview if dragging shared item\n style: this.isSharedDragTarget()\n ? {...gridItem.props.style, opacity: 0}\n : gridItem.props.style,\n className: `${OVERLAY_CLASS_NAME} ${DROPPING_ELEMENT_CLASS_NAME}`,\n droppingPosition: this.calculateDroppingPosition(gridItem.props),\n });\n }\n\n if (lazyScale !== undefined) {\n return React.cloneElement(gridItem, {transformScale: lazyScale});\n }\n\n return gridItem;\n }\n}\n\n// eslint-disable-next-line new-cap\nexport const Layout = WidthProvider<DragOverLayoutProps>(DragOverLayout);\n"]}
|
|
@@ -18,7 +18,7 @@ export default class MobileLayout extends React.PureComponent<MobileLayoutProps,
|
|
|
18
18
|
needSetDefault?: boolean;
|
|
19
19
|
}) => void>;
|
|
20
20
|
state: MobileLayoutState;
|
|
21
|
-
render(): JSX.Element;
|
|
21
|
+
render(): React.JSX.Element;
|
|
22
22
|
getSortedLayoutItems(): Record<string, (import("../../index.js").ConfigItem & import("../../index.js").ConfigLayout)[]>;
|
|
23
23
|
getMemoForwardRefCallback(refIndex: number): (refObject: PluginRef) => void;
|
|
24
24
|
adjustWidgetLayout(id: string, { needSetDefault }: {
|
|
@@ -63,7 +63,7 @@ declare class OverlayControls extends React.Component<OverlayControlsProps> {
|
|
|
63
63
|
};
|
|
64
64
|
componentDidMount(): void;
|
|
65
65
|
componentDidUpdate(): void;
|
|
66
|
-
render(): JSX.Element;
|
|
66
|
+
render(): React.JSX.Element;
|
|
67
67
|
private shallowEqualDropdownMenu;
|
|
68
68
|
private updateDropdownMenuItems;
|
|
69
69
|
private getItems;
|
|
@@ -309,7 +309,7 @@ class OverlayControls extends react_1.default.Component {
|
|
|
309
309
|
return result;
|
|
310
310
|
}
|
|
311
311
|
}
|
|
312
|
-
OverlayControls.contextType = context_1.
|
|
312
|
+
OverlayControls.contextType = context_1.DashkitOverlayControlsContext;
|
|
313
313
|
OverlayControls.defaultProps = {
|
|
314
314
|
position: OverlayControlsPosition.TopRight,
|
|
315
315
|
view: 'flat',
|