@reltio/components 1.4.2091 → 1.4.2093
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reltio/components",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.2093",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE FILE",
|
|
5
5
|
"main": "./cjs/index.js",
|
|
6
6
|
"module": "./index.js",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"@fluentui/react-context-selector": "^9.1.26",
|
|
12
12
|
"@googlemaps/markerclusterer": "^2.5.3",
|
|
13
13
|
"@react-sigma/core": "3.4.0",
|
|
14
|
-
"@reltio/mdm-sdk": "^1.4.
|
|
14
|
+
"@reltio/mdm-sdk": "^1.4.1931",
|
|
15
15
|
"@vis.gl/react-google-maps": "^1.3.0",
|
|
16
16
|
"d3-cloud": "^1.2.5",
|
|
17
17
|
"d3-geo": "^2.0.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,473 +0,0 @@
|
|
|
1
|
-
var __extends = (this && this.__extends) || (function () {
|
|
2
|
-
var extendStatics = function (d, b) {
|
|
3
|
-
extendStatics = Object.setPrototypeOf ||
|
|
4
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
6
|
-
return extendStatics(d, b);
|
|
7
|
-
};
|
|
8
|
-
return function (d, b) {
|
|
9
|
-
if (typeof b !== "function" && b !== null)
|
|
10
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
11
|
-
extendStatics(d, b);
|
|
12
|
-
function __() { this.constructor = d; }
|
|
13
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
14
|
-
};
|
|
15
|
-
})();
|
|
16
|
-
var __assign = (this && this.__assign) || function () {
|
|
17
|
-
__assign = Object.assign || function(t) {
|
|
18
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
19
|
-
s = arguments[i];
|
|
20
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
21
|
-
t[p] = s[p];
|
|
22
|
-
}
|
|
23
|
-
return t;
|
|
24
|
-
};
|
|
25
|
-
return __assign.apply(this, arguments);
|
|
26
|
-
};
|
|
27
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
28
|
-
var t = {};
|
|
29
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
30
|
-
t[p] = s[p];
|
|
31
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
32
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
33
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
34
|
-
t[p[i]] = s[p[i]];
|
|
35
|
-
}
|
|
36
|
-
return t;
|
|
37
|
-
};
|
|
38
|
-
import React, { Component } from 'react';
|
|
39
|
-
import { act } from 'react-dom/test-utils';
|
|
40
|
-
import PropTypes from 'prop-types';
|
|
41
|
-
import { mount } from 'enzyme';
|
|
42
|
-
import { List } from 'react-virtualized';
|
|
43
|
-
import { DndProvider, DndContext } from 'react-dnd';
|
|
44
|
-
import TestBackend from 'react-dnd-test-backend';
|
|
45
|
-
import HTML5Backend from 'react-dnd-html5-backend';
|
|
46
|
-
import TouchBackend from 'react-dnd-touch-backend';
|
|
47
|
-
import SortableTree from './ReactSortableTree';
|
|
48
|
-
import { TreeNode } from './components/TreeNode';
|
|
49
|
-
import { NodeRendererDefault as DefaultNodeRenderer } from './components/NodeRendererDefault';
|
|
50
|
-
var SortableTreeWithDndTestBackend = function (_a) {
|
|
51
|
-
var _b = _a.dndManagerRef, dndManagerRef = _b === void 0 ? { current: null } : _b, treeProps = __rest(_a, ["dndManagerRef"]);
|
|
52
|
-
return (React.createElement(DndProvider, { backend: TestBackend },
|
|
53
|
-
React.createElement(DndContext.Consumer, null, function (_a) {
|
|
54
|
-
var dragDropManager = _a.dragDropManager;
|
|
55
|
-
dndManagerRef.current = dragDropManager;
|
|
56
|
-
}),
|
|
57
|
-
React.createElement(SortableTree, __assign({}, treeProps))));
|
|
58
|
-
};
|
|
59
|
-
SortableTreeWithDndTestBackend.propTypes = {
|
|
60
|
-
dndManagerRef: PropTypes.object,
|
|
61
|
-
treeProps: PropTypes.shape({
|
|
62
|
-
current: PropTypes.object
|
|
63
|
-
})
|
|
64
|
-
};
|
|
65
|
-
jest.mock('frontend-collective-react-dnd-scrollzone', function () { return (__assign(__assign({}, jest.requireActual('frontend-collective-react-dnd-scrollzone')), { createScrollingComponent: function (component) { return component; } })); });
|
|
66
|
-
describe('<SortableTree />', function () {
|
|
67
|
-
beforeAll(function () {
|
|
68
|
-
jest.useFakeTimers();
|
|
69
|
-
});
|
|
70
|
-
it('loads using SortableTree second case', function () {
|
|
71
|
-
var onDragStateChanged = jest.fn();
|
|
72
|
-
var treeData = [{ title: 'a' }, { title: 'b' }];
|
|
73
|
-
var manager = null;
|
|
74
|
-
var wrapper = mount(React.createElement(DndProvider, { backend: TestBackend },
|
|
75
|
-
React.createElement(DndContext.Consumer, null, function (_a) {
|
|
76
|
-
var dragDropManager = _a.dragDropManager;
|
|
77
|
-
manager = dragDropManager;
|
|
78
|
-
}),
|
|
79
|
-
React.createElement(SortableTree, { treeData: treeData, onDragStateChanged: onDragStateChanged, onChange: function () { } })));
|
|
80
|
-
// Obtain a reference to the backend
|
|
81
|
-
var backend = manager.getBackend();
|
|
82
|
-
// Retrieve our DnD-wrapped node component type
|
|
83
|
-
var wrappedNodeType = wrapper.find('ReactSortableTree').instance().nodeContentRenderer;
|
|
84
|
-
// And get the first such component
|
|
85
|
-
var nodeInstance = wrapper.find(wrappedNodeType).first().instance();
|
|
86
|
-
backend.simulateBeginDrag([nodeInstance.getHandlerId()]);
|
|
87
|
-
expect(onDragStateChanged).toHaveBeenCalledWith({
|
|
88
|
-
isDragging: true,
|
|
89
|
-
draggedNode: treeData[0]
|
|
90
|
-
});
|
|
91
|
-
backend.simulateEndDrag([nodeInstance.getHandlerId()]);
|
|
92
|
-
expect(onDragStateChanged).toHaveBeenCalledWith({
|
|
93
|
-
isDragging: false,
|
|
94
|
-
draggedNode: null
|
|
95
|
-
});
|
|
96
|
-
expect(onDragStateChanged).toHaveBeenCalledTimes(2);
|
|
97
|
-
});
|
|
98
|
-
describe('dnd behaviour', function () {
|
|
99
|
-
var getReactSortableTreeInstance = function (wrapper) { return wrapper.find('ReactSortableTree').instance(); };
|
|
100
|
-
beforeEach(function () {
|
|
101
|
-
jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (cb) { return cb(); });
|
|
102
|
-
});
|
|
103
|
-
it('should suppress errors for nonexistent nodes when the drag-and-drop.', function () {
|
|
104
|
-
var onDragStateChanged = jest.fn();
|
|
105
|
-
var treeData = [
|
|
106
|
-
{
|
|
107
|
-
title: 'a',
|
|
108
|
-
expanded: true,
|
|
109
|
-
children: [
|
|
110
|
-
{
|
|
111
|
-
title: 'a.0',
|
|
112
|
-
expanded: false,
|
|
113
|
-
children: [
|
|
114
|
-
{
|
|
115
|
-
title: 'a.0.0',
|
|
116
|
-
expanded: false,
|
|
117
|
-
children: [
|
|
118
|
-
{
|
|
119
|
-
title: 'a.0.0.1'
|
|
120
|
-
}
|
|
121
|
-
]
|
|
122
|
-
}
|
|
123
|
-
]
|
|
124
|
-
}
|
|
125
|
-
]
|
|
126
|
-
},
|
|
127
|
-
{ title: 'b' }
|
|
128
|
-
];
|
|
129
|
-
var manager = { current: null };
|
|
130
|
-
var defaultTreeProps = {
|
|
131
|
-
onDragStateChanged: onDragStateChanged,
|
|
132
|
-
onChange: function () { }
|
|
133
|
-
};
|
|
134
|
-
var wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, __assign({ dndManagerRef: manager, treeData: treeData }, defaultTreeProps)));
|
|
135
|
-
var backend = manager.current.getBackend();
|
|
136
|
-
var monitor = manager.current.getMonitor();
|
|
137
|
-
var sourceNodeType = wrapper.find('ReactSortableTree').instance().nodeContentRenderer;
|
|
138
|
-
var targetNodeType = wrapper.find('ReactSortableTree').instance().treeNodeRenderer;
|
|
139
|
-
var getLastNodeHandlerId = function () { return wrapper.find(targetNodeType).last().instance().getHandlerId(); };
|
|
140
|
-
var sourceNodeInstance = wrapper.find(sourceNodeType).last().instance();
|
|
141
|
-
act(function () {
|
|
142
|
-
backend.simulateBeginDrag([sourceNodeInstance.getHandlerId()]);
|
|
143
|
-
});
|
|
144
|
-
wrapper.update();
|
|
145
|
-
jest.spyOn(monitor, 'getDifferenceFromInitialOffset').mockReturnValue({ x: 300 });
|
|
146
|
-
act(function () {
|
|
147
|
-
backend.simulateHover([wrapper.find(targetNodeType).at(1).instance().getHandlerId()]);
|
|
148
|
-
});
|
|
149
|
-
wrapper.update();
|
|
150
|
-
act(function () {
|
|
151
|
-
backend.simulateHover([getLastNodeHandlerId()]);
|
|
152
|
-
});
|
|
153
|
-
wrapper.update();
|
|
154
|
-
act(function () {
|
|
155
|
-
backend.simulateHover([getLastNodeHandlerId()]);
|
|
156
|
-
});
|
|
157
|
-
wrapper.update();
|
|
158
|
-
wrapper.setProps({
|
|
159
|
-
treeProps: __assign({ treeData: [
|
|
160
|
-
{
|
|
161
|
-
title: 'a',
|
|
162
|
-
expanded: true,
|
|
163
|
-
children: [
|
|
164
|
-
{
|
|
165
|
-
title: 'a.0',
|
|
166
|
-
expanded: false
|
|
167
|
-
}
|
|
168
|
-
]
|
|
169
|
-
},
|
|
170
|
-
{ title: 'b' }
|
|
171
|
-
] }, defaultTreeProps)
|
|
172
|
-
});
|
|
173
|
-
backend.simulateEndDrag([sourceNodeInstance.getHandlerId()]);
|
|
174
|
-
});
|
|
175
|
-
it('should call hover handler once', function () {
|
|
176
|
-
jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (cb) { return setTimeout(cb, 1); });
|
|
177
|
-
var onDragStateChanged = jest.fn();
|
|
178
|
-
var treeData = [{ title: 'a' }, { title: 'b' }];
|
|
179
|
-
var manager = { current: null };
|
|
180
|
-
var defaultTreeProps = {
|
|
181
|
-
onDragStateChanged: onDragStateChanged,
|
|
182
|
-
onChange: function () { }
|
|
183
|
-
};
|
|
184
|
-
var wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, __assign({ dndManagerRef: manager, treeData: treeData }, defaultTreeProps)));
|
|
185
|
-
var backend = manager.current.getBackend();
|
|
186
|
-
var monitor = manager.current.getMonitor();
|
|
187
|
-
var treeInstance = getReactSortableTreeInstance(wrapper);
|
|
188
|
-
var sourceNodeType = treeInstance.nodeContentRenderer;
|
|
189
|
-
var targetNodeType = treeInstance.treeNodeRenderer;
|
|
190
|
-
var dragHoverSpy = jest.spyOn(treeInstance, 'dragHover');
|
|
191
|
-
var sourceNodeInstance = wrapper.find(sourceNodeType).last().instance();
|
|
192
|
-
act(function () {
|
|
193
|
-
backend.simulateBeginDrag([sourceNodeInstance.getHandlerId()]);
|
|
194
|
-
});
|
|
195
|
-
wrapper.update();
|
|
196
|
-
jest.spyOn(monitor, 'getDifferenceFromInitialOffset').mockReturnValue({ x: 300 });
|
|
197
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(0);
|
|
198
|
-
act(function () {
|
|
199
|
-
backend.simulateHover([wrapper.find(targetNodeType).last().instance().getHandlerId()]);
|
|
200
|
-
});
|
|
201
|
-
act(function () {
|
|
202
|
-
backend.simulateHover([wrapper.find(targetNodeType).last().instance().getHandlerId()]);
|
|
203
|
-
});
|
|
204
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(0);
|
|
205
|
-
jest.runAllTimers();
|
|
206
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(1);
|
|
207
|
-
act(function () {
|
|
208
|
-
backend.simulateEndDrag();
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
it('should cancel hover handler after end drag', function () {
|
|
212
|
-
jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (cb) { return setTimeout(cb, 1); });
|
|
213
|
-
jest.spyOn(window, 'cancelAnimationFrame').mockImplementation(function (id) { return clearTimeout(id); });
|
|
214
|
-
var onDragStateChanged = jest.fn();
|
|
215
|
-
var treeData = [{ title: 'a' }, { title: 'b' }];
|
|
216
|
-
var manager = { current: null };
|
|
217
|
-
var defaultTreeProps = {
|
|
218
|
-
onDragStateChanged: onDragStateChanged,
|
|
219
|
-
onChange: function () { }
|
|
220
|
-
};
|
|
221
|
-
var wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, __assign({ dndManagerRef: manager, treeData: treeData }, defaultTreeProps)));
|
|
222
|
-
var backend = manager.current.getBackend();
|
|
223
|
-
var monitor = manager.current.getMonitor();
|
|
224
|
-
var treeInstance = getReactSortableTreeInstance(wrapper);
|
|
225
|
-
var sourceNodeType = treeInstance.nodeContentRenderer;
|
|
226
|
-
var targetNodeType = treeInstance.treeNodeRenderer;
|
|
227
|
-
var dragHoverSpy = jest.spyOn(treeInstance, 'dragHover');
|
|
228
|
-
var sourceNodeInstance = wrapper.find(sourceNodeType).last().instance();
|
|
229
|
-
act(function () {
|
|
230
|
-
backend.simulateBeginDrag([sourceNodeInstance.getHandlerId()]);
|
|
231
|
-
});
|
|
232
|
-
wrapper.update();
|
|
233
|
-
jest.spyOn(monitor, 'getDifferenceFromInitialOffset').mockReturnValue({ x: 300 });
|
|
234
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(0);
|
|
235
|
-
act(function () {
|
|
236
|
-
backend.simulateHover([wrapper.find(targetNodeType).last().instance().getHandlerId()]);
|
|
237
|
-
});
|
|
238
|
-
act(function () {
|
|
239
|
-
backend.simulateHover([wrapper.find(targetNodeType).last().instance().getHandlerId()]);
|
|
240
|
-
});
|
|
241
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(0);
|
|
242
|
-
act(function () {
|
|
243
|
-
backend.simulateDrop();
|
|
244
|
-
backend.simulateEndDrag();
|
|
245
|
-
});
|
|
246
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(0);
|
|
247
|
-
jest.runAllTimers();
|
|
248
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(0);
|
|
249
|
-
});
|
|
250
|
-
});
|
|
251
|
-
it('should render nodes for flat data', function () {
|
|
252
|
-
var wrapper;
|
|
253
|
-
// No nodes
|
|
254
|
-
wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [], onChange: function () { } }));
|
|
255
|
-
expect(wrapper.find(TreeNode).length).toEqual(0);
|
|
256
|
-
// Single node
|
|
257
|
-
wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{}], onChange: function () { } }));
|
|
258
|
-
expect(wrapper.find(TreeNode).length).toEqual(1);
|
|
259
|
-
// Two nodes
|
|
260
|
-
wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{}, {}], onChange: function () { } }));
|
|
261
|
-
expect(wrapper.find(TreeNode).length).toEqual(2);
|
|
262
|
-
});
|
|
263
|
-
it('should render nodes for nested, expanded data', function () {
|
|
264
|
-
var wrapper;
|
|
265
|
-
// Single Nested
|
|
266
|
-
wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ expanded: true, children: [{}] }], onChange: function () { } }));
|
|
267
|
-
expect(wrapper.find(TreeNode).length).toEqual(2);
|
|
268
|
-
// Double Nested
|
|
269
|
-
wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ expanded: true, children: [{ expanded: true, children: [{}] }] }], onChange: function () { } }));
|
|
270
|
-
expect(wrapper.find(TreeNode).length).toEqual(3);
|
|
271
|
-
// 2x Double Nested Siblings
|
|
272
|
-
wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [
|
|
273
|
-
{ expanded: true, children: [{ expanded: true, children: [{}] }] },
|
|
274
|
-
{ expanded: true, children: [{ expanded: true, children: [{}] }] }
|
|
275
|
-
], onChange: function () { } }));
|
|
276
|
-
expect(wrapper.find(TreeNode).length).toEqual(6);
|
|
277
|
-
});
|
|
278
|
-
it('should render nodes for nested, collapsed data', function () {
|
|
279
|
-
var wrapper;
|
|
280
|
-
// Single Nested
|
|
281
|
-
wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ expanded: false, children: [{}] }], onChange: function () { } }));
|
|
282
|
-
expect(wrapper.find(TreeNode).length).toEqual(1);
|
|
283
|
-
// Double Nested
|
|
284
|
-
wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ expanded: false, children: [{ expanded: false, children: [{}] }] }], onChange: function () { } }));
|
|
285
|
-
expect(wrapper.find(TreeNode).length).toEqual(1);
|
|
286
|
-
// 2x Double Nested Siblings, top level of first expanded
|
|
287
|
-
wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [
|
|
288
|
-
{ expanded: true, children: [{ expanded: false, children: [{}] }] },
|
|
289
|
-
{ expanded: false, children: [{ expanded: false, children: [{}] }] }
|
|
290
|
-
], onChange: function () { } }));
|
|
291
|
-
expect(wrapper.find(TreeNode).length).toEqual(3);
|
|
292
|
-
});
|
|
293
|
-
it('should reveal hidden nodes when visibility toggled', function () {
|
|
294
|
-
var wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a', children: [{ title: 'b' }] }], onChange: function (treeData) { return wrapper.setProps({ treeData: treeData }); } }));
|
|
295
|
-
// Check nodes in collapsed state
|
|
296
|
-
expect(wrapper.find(TreeNode).length).toEqual(1);
|
|
297
|
-
// Expand node and check for the existence of the revealed child
|
|
298
|
-
wrapper.find('.rst__expandButton').first().simulate('click');
|
|
299
|
-
expect(wrapper.find(TreeNode).length).toEqual(2);
|
|
300
|
-
// Collapse node and make sure the child has been hidden
|
|
301
|
-
wrapper.find('.rst__collapseButton').first().simulate('click');
|
|
302
|
-
expect(wrapper.find(TreeNode).length).toEqual(1);
|
|
303
|
-
});
|
|
304
|
-
it('should change outer wrapper style via `style` and `className` props', function () {
|
|
305
|
-
var wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }], onChange: function () { }, style: { borderWidth: 42 }, className: "extra-classy" }));
|
|
306
|
-
expect(wrapper.find('.rst__tree').prop('style').borderWidth).toBe(42);
|
|
307
|
-
expect(wrapper.find('.rst__tree')).toHaveClassName('extra-classy');
|
|
308
|
-
});
|
|
309
|
-
it('should change style of scroll container with `innerStyle` prop', function () {
|
|
310
|
-
var wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }], onChange: function () { }, innerStyle: { borderWidth: 42 } }));
|
|
311
|
-
expect(wrapper.find(List).first().prop('style').borderWidth).toBe(42);
|
|
312
|
-
});
|
|
313
|
-
it('should change height according to rowHeight prop', function () {
|
|
314
|
-
var wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }, { title: 'b', extraHeight: 2 }], onChange: function () { }, rowHeight: 12 }));
|
|
315
|
-
// Works with static value
|
|
316
|
-
expect(wrapper.find(TreeNode).first().prop('style').height).toBe(12);
|
|
317
|
-
// Works with function callback
|
|
318
|
-
wrapper.setProps({ rowHeight: function (_a) {
|
|
319
|
-
var node = _a.node;
|
|
320
|
-
return 42 + (node.extraHeight || 0);
|
|
321
|
-
} });
|
|
322
|
-
expect(wrapper.find(TreeNode).first().prop('style').height).toBe(42);
|
|
323
|
-
expect(wrapper.find(TreeNode).last().prop('style').height).toBe(44);
|
|
324
|
-
});
|
|
325
|
-
it('should toggle virtualization according to isVirtualized prop', function () {
|
|
326
|
-
var virtualized = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }, { title: 'b' }], onChange: function () { }, isVirtualized: true }));
|
|
327
|
-
expect(virtualized.find(List).length).toEqual(1);
|
|
328
|
-
var notVirtualized = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }, { title: 'b' }], onChange: function () { }, isVirtualized: false }));
|
|
329
|
-
expect(notVirtualized.find(List).length).toEqual(0);
|
|
330
|
-
});
|
|
331
|
-
it('should change scaffold width according to scaffoldBlockPxWidth prop', function () {
|
|
332
|
-
var wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }], onChange: function () { }, scaffoldBlockPxWidth: 12 }));
|
|
333
|
-
expect(wrapper.find('.rst__lineBlock').prop('style').width).toBe(12);
|
|
334
|
-
});
|
|
335
|
-
it('should pass props to the node renderer from `generateNodeProps`', function () {
|
|
336
|
-
var title = 42;
|
|
337
|
-
var wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: title }], onChange: function () { }, generateNodeProps: function (_a) {
|
|
338
|
-
var node = _a.node;
|
|
339
|
-
return ({ buttons: [node.title] });
|
|
340
|
-
} }));
|
|
341
|
-
expect(wrapper.find(DefaultNodeRenderer)).toHaveProp('buttons', [title]);
|
|
342
|
-
});
|
|
343
|
-
it('should call the callback in `onVisibilityToggle` when visibility toggled', function () {
|
|
344
|
-
var out = null;
|
|
345
|
-
var wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a', children: [{ title: 'b' }] }], onChange: function (treeData) { return wrapper.setProps({ treeData: treeData }); }, onVisibilityToggle: function (_a) {
|
|
346
|
-
var expanded = _a.expanded;
|
|
347
|
-
out = expanded ? 'expanded' : 'collapsed';
|
|
348
|
-
} }));
|
|
349
|
-
wrapper.find('.rst__expandButton').first().simulate('click');
|
|
350
|
-
expect(out).toEqual('expanded');
|
|
351
|
-
wrapper.find('.rst__collapseButton').first().simulate('click');
|
|
352
|
-
expect(out).toEqual('collapsed');
|
|
353
|
-
});
|
|
354
|
-
it('should render with a custom `nodeContentRenderer`', function () {
|
|
355
|
-
var FakeNode = /** @class */ (function (_super) {
|
|
356
|
-
__extends(FakeNode, _super);
|
|
357
|
-
function FakeNode() {
|
|
358
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
359
|
-
}
|
|
360
|
-
FakeNode.prototype.render = function () {
|
|
361
|
-
return React.createElement("div", null, this.props.node.title);
|
|
362
|
-
};
|
|
363
|
-
return FakeNode;
|
|
364
|
-
}(Component));
|
|
365
|
-
FakeNode.propTypes = {
|
|
366
|
-
node: PropTypes.shape({ title: PropTypes.string }).isRequired
|
|
367
|
-
};
|
|
368
|
-
var wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }], onChange: function () { }, nodeContentRenderer: FakeNode }));
|
|
369
|
-
expect(wrapper.find(FakeNode).length).toEqual(1);
|
|
370
|
-
});
|
|
371
|
-
it('search should call searchFinishCallback', function () {
|
|
372
|
-
var searchFinishCallback = jest.fn();
|
|
373
|
-
mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a', children: [{ title: 'b' }] }], searchQuery: "b", searchFocusOffset: 0, searchFinishCallback: searchFinishCallback, onChange: function () { } }));
|
|
374
|
-
expect(searchFinishCallback).toHaveBeenCalledWith([
|
|
375
|
-
// Node should be found expanded
|
|
376
|
-
{ node: { title: 'b' }, path: [0, 1], treeIndex: 1 }
|
|
377
|
-
]);
|
|
378
|
-
});
|
|
379
|
-
it('search should expand all matches and seek out the focus offset', function () {
|
|
380
|
-
var wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [
|
|
381
|
-
{ title: 'a', children: [{ title: 'b' }] },
|
|
382
|
-
{ title: 'a', children: [{ title: 'be' }] }
|
|
383
|
-
], searchQuery: "b", onChange: function () { } }));
|
|
384
|
-
var tree = wrapper.find('ReactSortableTree').instance();
|
|
385
|
-
expect(tree.state.searchMatches).toEqual([
|
|
386
|
-
{ node: { title: 'b' }, path: [0, 1], treeIndex: 1 },
|
|
387
|
-
{ node: { title: 'be' }, path: [2, 3], treeIndex: 3 }
|
|
388
|
-
]);
|
|
389
|
-
expect(tree.state.searchFocusTreeIndex).toEqual(null);
|
|
390
|
-
wrapper.setProps({ searchFocusOffset: 0 });
|
|
391
|
-
expect(tree.state.searchFocusTreeIndex).toEqual(1);
|
|
392
|
-
wrapper.setProps({ searchFocusOffset: 1 });
|
|
393
|
-
// As the empty `onChange` we use here doesn't actually change
|
|
394
|
-
// the tree, the expansion of all nodes doesn't get preserved
|
|
395
|
-
// after the first mount, and this change in searchFocusOffset
|
|
396
|
-
// only triggers the opening of a single path.
|
|
397
|
-
// Therefore it's 2 instead of 3.
|
|
398
|
-
expect(tree.state.searchFocusTreeIndex).toEqual(2);
|
|
399
|
-
});
|
|
400
|
-
it('search onlyExpandSearchedNodes should collapse all nodes except matches', function () {
|
|
401
|
-
var wrapper = mount(React.createElement(SortableTreeWithDndTestBackend, { treeData: [
|
|
402
|
-
{
|
|
403
|
-
title: 'a',
|
|
404
|
-
children: [{ title: 'b', children: [{ title: 'c' }] }]
|
|
405
|
-
},
|
|
406
|
-
{
|
|
407
|
-
title: 'b',
|
|
408
|
-
children: [{ title: 'd', children: [{ title: 'be' }] }]
|
|
409
|
-
},
|
|
410
|
-
{
|
|
411
|
-
title: 'c',
|
|
412
|
-
children: [{ title: 'f', children: [{ title: 'dd' }] }]
|
|
413
|
-
}
|
|
414
|
-
], onChange: function (treeData) { return wrapper.setProps({ treeData: treeData }); }, onlyExpandSearchedNodes: true }));
|
|
415
|
-
wrapper.setProps({ searchQuery: 'be' });
|
|
416
|
-
expect(wrapper.prop('treeData')).toEqual([
|
|
417
|
-
{
|
|
418
|
-
title: 'a',
|
|
419
|
-
children: [
|
|
420
|
-
{
|
|
421
|
-
title: 'b',
|
|
422
|
-
children: [
|
|
423
|
-
{
|
|
424
|
-
title: 'c',
|
|
425
|
-
expanded: false
|
|
426
|
-
}
|
|
427
|
-
],
|
|
428
|
-
expanded: false
|
|
429
|
-
}
|
|
430
|
-
],
|
|
431
|
-
expanded: false
|
|
432
|
-
},
|
|
433
|
-
{
|
|
434
|
-
title: 'b',
|
|
435
|
-
children: [
|
|
436
|
-
{
|
|
437
|
-
title: 'd',
|
|
438
|
-
children: [
|
|
439
|
-
{
|
|
440
|
-
title: 'be',
|
|
441
|
-
expanded: false
|
|
442
|
-
}
|
|
443
|
-
],
|
|
444
|
-
expanded: true
|
|
445
|
-
}
|
|
446
|
-
],
|
|
447
|
-
expanded: true
|
|
448
|
-
},
|
|
449
|
-
{
|
|
450
|
-
title: 'c',
|
|
451
|
-
children: [
|
|
452
|
-
{
|
|
453
|
-
title: 'f',
|
|
454
|
-
children: [
|
|
455
|
-
{
|
|
456
|
-
title: 'dd',
|
|
457
|
-
expanded: false
|
|
458
|
-
}
|
|
459
|
-
],
|
|
460
|
-
expanded: false
|
|
461
|
-
}
|
|
462
|
-
],
|
|
463
|
-
expanded: false
|
|
464
|
-
}
|
|
465
|
-
]);
|
|
466
|
-
});
|
|
467
|
-
it('should work with different dnd backends', function () {
|
|
468
|
-
expect(mount(React.createElement(DndProvider, { backend: HTML5Backend },
|
|
469
|
-
React.createElement(SortableTree, { treeData: [{ title: 'a' }], onChange: function () { } })))).toBeDefined();
|
|
470
|
-
expect(mount(React.createElement(DndProvider, { backend: TouchBackend },
|
|
471
|
-
React.createElement(SortableTree, { treeData: [{ title: 'a' }], onChange: function () { } })))).toBeDefined();
|
|
472
|
-
});
|
|
473
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,501 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
|
-
var __assign = (this && this.__assign) || function () {
|
|
18
|
-
__assign = Object.assign || function(t) {
|
|
19
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
20
|
-
s = arguments[i];
|
|
21
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
22
|
-
t[p] = s[p];
|
|
23
|
-
}
|
|
24
|
-
return t;
|
|
25
|
-
};
|
|
26
|
-
return __assign.apply(this, arguments);
|
|
27
|
-
};
|
|
28
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
29
|
-
if (k2 === undefined) k2 = k;
|
|
30
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
31
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
32
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
33
|
-
}
|
|
34
|
-
Object.defineProperty(o, k2, desc);
|
|
35
|
-
}) : (function(o, m, k, k2) {
|
|
36
|
-
if (k2 === undefined) k2 = k;
|
|
37
|
-
o[k2] = m[k];
|
|
38
|
-
}));
|
|
39
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
40
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
41
|
-
}) : function(o, v) {
|
|
42
|
-
o["default"] = v;
|
|
43
|
-
});
|
|
44
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
45
|
-
if (mod && mod.__esModule) return mod;
|
|
46
|
-
var result = {};
|
|
47
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
48
|
-
__setModuleDefault(result, mod);
|
|
49
|
-
return result;
|
|
50
|
-
};
|
|
51
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
52
|
-
var t = {};
|
|
53
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
54
|
-
t[p] = s[p];
|
|
55
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
56
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
57
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
58
|
-
t[p[i]] = s[p[i]];
|
|
59
|
-
}
|
|
60
|
-
return t;
|
|
61
|
-
};
|
|
62
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
63
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
64
|
-
};
|
|
65
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
66
|
-
var react_1 = __importStar(require("react"));
|
|
67
|
-
var test_utils_1 = require("react-dom/test-utils");
|
|
68
|
-
var prop_types_1 = __importDefault(require("prop-types"));
|
|
69
|
-
var enzyme_1 = require("enzyme");
|
|
70
|
-
var react_virtualized_1 = require("react-virtualized");
|
|
71
|
-
var react_dnd_1 = require("react-dnd");
|
|
72
|
-
var react_dnd_test_backend_1 = __importDefault(require("react-dnd-test-backend"));
|
|
73
|
-
var react_dnd_html5_backend_1 = __importDefault(require("react-dnd-html5-backend"));
|
|
74
|
-
var react_dnd_touch_backend_1 = __importDefault(require("react-dnd-touch-backend"));
|
|
75
|
-
var ReactSortableTree_1 = __importDefault(require("./ReactSortableTree"));
|
|
76
|
-
var TreeNode_1 = require("./components/TreeNode");
|
|
77
|
-
var NodeRendererDefault_1 = require("./components/NodeRendererDefault");
|
|
78
|
-
var SortableTreeWithDndTestBackend = function (_a) {
|
|
79
|
-
var _b = _a.dndManagerRef, dndManagerRef = _b === void 0 ? { current: null } : _b, treeProps = __rest(_a, ["dndManagerRef"]);
|
|
80
|
-
return (react_1.default.createElement(react_dnd_1.DndProvider, { backend: react_dnd_test_backend_1.default },
|
|
81
|
-
react_1.default.createElement(react_dnd_1.DndContext.Consumer, null, function (_a) {
|
|
82
|
-
var dragDropManager = _a.dragDropManager;
|
|
83
|
-
dndManagerRef.current = dragDropManager;
|
|
84
|
-
}),
|
|
85
|
-
react_1.default.createElement(ReactSortableTree_1.default, __assign({}, treeProps))));
|
|
86
|
-
};
|
|
87
|
-
SortableTreeWithDndTestBackend.propTypes = {
|
|
88
|
-
dndManagerRef: prop_types_1.default.object,
|
|
89
|
-
treeProps: prop_types_1.default.shape({
|
|
90
|
-
current: prop_types_1.default.object
|
|
91
|
-
})
|
|
92
|
-
};
|
|
93
|
-
jest.mock('frontend-collective-react-dnd-scrollzone', function () { return (__assign(__assign({}, jest.requireActual('frontend-collective-react-dnd-scrollzone')), { createScrollingComponent: function (component) { return component; } })); });
|
|
94
|
-
describe('<SortableTree />', function () {
|
|
95
|
-
beforeAll(function () {
|
|
96
|
-
jest.useFakeTimers();
|
|
97
|
-
});
|
|
98
|
-
it('loads using SortableTree second case', function () {
|
|
99
|
-
var onDragStateChanged = jest.fn();
|
|
100
|
-
var treeData = [{ title: 'a' }, { title: 'b' }];
|
|
101
|
-
var manager = null;
|
|
102
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(react_dnd_1.DndProvider, { backend: react_dnd_test_backend_1.default },
|
|
103
|
-
react_1.default.createElement(react_dnd_1.DndContext.Consumer, null, function (_a) {
|
|
104
|
-
var dragDropManager = _a.dragDropManager;
|
|
105
|
-
manager = dragDropManager;
|
|
106
|
-
}),
|
|
107
|
-
react_1.default.createElement(ReactSortableTree_1.default, { treeData: treeData, onDragStateChanged: onDragStateChanged, onChange: function () { } })));
|
|
108
|
-
// Obtain a reference to the backend
|
|
109
|
-
var backend = manager.getBackend();
|
|
110
|
-
// Retrieve our DnD-wrapped node component type
|
|
111
|
-
var wrappedNodeType = wrapper.find('ReactSortableTree').instance().nodeContentRenderer;
|
|
112
|
-
// And get the first such component
|
|
113
|
-
var nodeInstance = wrapper.find(wrappedNodeType).first().instance();
|
|
114
|
-
backend.simulateBeginDrag([nodeInstance.getHandlerId()]);
|
|
115
|
-
expect(onDragStateChanged).toHaveBeenCalledWith({
|
|
116
|
-
isDragging: true,
|
|
117
|
-
draggedNode: treeData[0]
|
|
118
|
-
});
|
|
119
|
-
backend.simulateEndDrag([nodeInstance.getHandlerId()]);
|
|
120
|
-
expect(onDragStateChanged).toHaveBeenCalledWith({
|
|
121
|
-
isDragging: false,
|
|
122
|
-
draggedNode: null
|
|
123
|
-
});
|
|
124
|
-
expect(onDragStateChanged).toHaveBeenCalledTimes(2);
|
|
125
|
-
});
|
|
126
|
-
describe('dnd behaviour', function () {
|
|
127
|
-
var getReactSortableTreeInstance = function (wrapper) { return wrapper.find('ReactSortableTree').instance(); };
|
|
128
|
-
beforeEach(function () {
|
|
129
|
-
jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (cb) { return cb(); });
|
|
130
|
-
});
|
|
131
|
-
it('should suppress errors for nonexistent nodes when the drag-and-drop.', function () {
|
|
132
|
-
var onDragStateChanged = jest.fn();
|
|
133
|
-
var treeData = [
|
|
134
|
-
{
|
|
135
|
-
title: 'a',
|
|
136
|
-
expanded: true,
|
|
137
|
-
children: [
|
|
138
|
-
{
|
|
139
|
-
title: 'a.0',
|
|
140
|
-
expanded: false,
|
|
141
|
-
children: [
|
|
142
|
-
{
|
|
143
|
-
title: 'a.0.0',
|
|
144
|
-
expanded: false,
|
|
145
|
-
children: [
|
|
146
|
-
{
|
|
147
|
-
title: 'a.0.0.1'
|
|
148
|
-
}
|
|
149
|
-
]
|
|
150
|
-
}
|
|
151
|
-
]
|
|
152
|
-
}
|
|
153
|
-
]
|
|
154
|
-
},
|
|
155
|
-
{ title: 'b' }
|
|
156
|
-
];
|
|
157
|
-
var manager = { current: null };
|
|
158
|
-
var defaultTreeProps = {
|
|
159
|
-
onDragStateChanged: onDragStateChanged,
|
|
160
|
-
onChange: function () { }
|
|
161
|
-
};
|
|
162
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, __assign({ dndManagerRef: manager, treeData: treeData }, defaultTreeProps)));
|
|
163
|
-
var backend = manager.current.getBackend();
|
|
164
|
-
var monitor = manager.current.getMonitor();
|
|
165
|
-
var sourceNodeType = wrapper.find('ReactSortableTree').instance().nodeContentRenderer;
|
|
166
|
-
var targetNodeType = wrapper.find('ReactSortableTree').instance().treeNodeRenderer;
|
|
167
|
-
var getLastNodeHandlerId = function () { return wrapper.find(targetNodeType).last().instance().getHandlerId(); };
|
|
168
|
-
var sourceNodeInstance = wrapper.find(sourceNodeType).last().instance();
|
|
169
|
-
(0, test_utils_1.act)(function () {
|
|
170
|
-
backend.simulateBeginDrag([sourceNodeInstance.getHandlerId()]);
|
|
171
|
-
});
|
|
172
|
-
wrapper.update();
|
|
173
|
-
jest.spyOn(monitor, 'getDifferenceFromInitialOffset').mockReturnValue({ x: 300 });
|
|
174
|
-
(0, test_utils_1.act)(function () {
|
|
175
|
-
backend.simulateHover([wrapper.find(targetNodeType).at(1).instance().getHandlerId()]);
|
|
176
|
-
});
|
|
177
|
-
wrapper.update();
|
|
178
|
-
(0, test_utils_1.act)(function () {
|
|
179
|
-
backend.simulateHover([getLastNodeHandlerId()]);
|
|
180
|
-
});
|
|
181
|
-
wrapper.update();
|
|
182
|
-
(0, test_utils_1.act)(function () {
|
|
183
|
-
backend.simulateHover([getLastNodeHandlerId()]);
|
|
184
|
-
});
|
|
185
|
-
wrapper.update();
|
|
186
|
-
wrapper.setProps({
|
|
187
|
-
treeProps: __assign({ treeData: [
|
|
188
|
-
{
|
|
189
|
-
title: 'a',
|
|
190
|
-
expanded: true,
|
|
191
|
-
children: [
|
|
192
|
-
{
|
|
193
|
-
title: 'a.0',
|
|
194
|
-
expanded: false
|
|
195
|
-
}
|
|
196
|
-
]
|
|
197
|
-
},
|
|
198
|
-
{ title: 'b' }
|
|
199
|
-
] }, defaultTreeProps)
|
|
200
|
-
});
|
|
201
|
-
backend.simulateEndDrag([sourceNodeInstance.getHandlerId()]);
|
|
202
|
-
});
|
|
203
|
-
it('should call hover handler once', function () {
|
|
204
|
-
jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (cb) { return setTimeout(cb, 1); });
|
|
205
|
-
var onDragStateChanged = jest.fn();
|
|
206
|
-
var treeData = [{ title: 'a' }, { title: 'b' }];
|
|
207
|
-
var manager = { current: null };
|
|
208
|
-
var defaultTreeProps = {
|
|
209
|
-
onDragStateChanged: onDragStateChanged,
|
|
210
|
-
onChange: function () { }
|
|
211
|
-
};
|
|
212
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, __assign({ dndManagerRef: manager, treeData: treeData }, defaultTreeProps)));
|
|
213
|
-
var backend = manager.current.getBackend();
|
|
214
|
-
var monitor = manager.current.getMonitor();
|
|
215
|
-
var treeInstance = getReactSortableTreeInstance(wrapper);
|
|
216
|
-
var sourceNodeType = treeInstance.nodeContentRenderer;
|
|
217
|
-
var targetNodeType = treeInstance.treeNodeRenderer;
|
|
218
|
-
var dragHoverSpy = jest.spyOn(treeInstance, 'dragHover');
|
|
219
|
-
var sourceNodeInstance = wrapper.find(sourceNodeType).last().instance();
|
|
220
|
-
(0, test_utils_1.act)(function () {
|
|
221
|
-
backend.simulateBeginDrag([sourceNodeInstance.getHandlerId()]);
|
|
222
|
-
});
|
|
223
|
-
wrapper.update();
|
|
224
|
-
jest.spyOn(monitor, 'getDifferenceFromInitialOffset').mockReturnValue({ x: 300 });
|
|
225
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(0);
|
|
226
|
-
(0, test_utils_1.act)(function () {
|
|
227
|
-
backend.simulateHover([wrapper.find(targetNodeType).last().instance().getHandlerId()]);
|
|
228
|
-
});
|
|
229
|
-
(0, test_utils_1.act)(function () {
|
|
230
|
-
backend.simulateHover([wrapper.find(targetNodeType).last().instance().getHandlerId()]);
|
|
231
|
-
});
|
|
232
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(0);
|
|
233
|
-
jest.runAllTimers();
|
|
234
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(1);
|
|
235
|
-
(0, test_utils_1.act)(function () {
|
|
236
|
-
backend.simulateEndDrag();
|
|
237
|
-
});
|
|
238
|
-
});
|
|
239
|
-
it('should cancel hover handler after end drag', function () {
|
|
240
|
-
jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (cb) { return setTimeout(cb, 1); });
|
|
241
|
-
jest.spyOn(window, 'cancelAnimationFrame').mockImplementation(function (id) { return clearTimeout(id); });
|
|
242
|
-
var onDragStateChanged = jest.fn();
|
|
243
|
-
var treeData = [{ title: 'a' }, { title: 'b' }];
|
|
244
|
-
var manager = { current: null };
|
|
245
|
-
var defaultTreeProps = {
|
|
246
|
-
onDragStateChanged: onDragStateChanged,
|
|
247
|
-
onChange: function () { }
|
|
248
|
-
};
|
|
249
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, __assign({ dndManagerRef: manager, treeData: treeData }, defaultTreeProps)));
|
|
250
|
-
var backend = manager.current.getBackend();
|
|
251
|
-
var monitor = manager.current.getMonitor();
|
|
252
|
-
var treeInstance = getReactSortableTreeInstance(wrapper);
|
|
253
|
-
var sourceNodeType = treeInstance.nodeContentRenderer;
|
|
254
|
-
var targetNodeType = treeInstance.treeNodeRenderer;
|
|
255
|
-
var dragHoverSpy = jest.spyOn(treeInstance, 'dragHover');
|
|
256
|
-
var sourceNodeInstance = wrapper.find(sourceNodeType).last().instance();
|
|
257
|
-
(0, test_utils_1.act)(function () {
|
|
258
|
-
backend.simulateBeginDrag([sourceNodeInstance.getHandlerId()]);
|
|
259
|
-
});
|
|
260
|
-
wrapper.update();
|
|
261
|
-
jest.spyOn(monitor, 'getDifferenceFromInitialOffset').mockReturnValue({ x: 300 });
|
|
262
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(0);
|
|
263
|
-
(0, test_utils_1.act)(function () {
|
|
264
|
-
backend.simulateHover([wrapper.find(targetNodeType).last().instance().getHandlerId()]);
|
|
265
|
-
});
|
|
266
|
-
(0, test_utils_1.act)(function () {
|
|
267
|
-
backend.simulateHover([wrapper.find(targetNodeType).last().instance().getHandlerId()]);
|
|
268
|
-
});
|
|
269
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(0);
|
|
270
|
-
(0, test_utils_1.act)(function () {
|
|
271
|
-
backend.simulateDrop();
|
|
272
|
-
backend.simulateEndDrag();
|
|
273
|
-
});
|
|
274
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(0);
|
|
275
|
-
jest.runAllTimers();
|
|
276
|
-
expect(dragHoverSpy).toHaveBeenCalledTimes(0);
|
|
277
|
-
});
|
|
278
|
-
});
|
|
279
|
-
it('should render nodes for flat data', function () {
|
|
280
|
-
var wrapper;
|
|
281
|
-
// No nodes
|
|
282
|
-
wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [], onChange: function () { } }));
|
|
283
|
-
expect(wrapper.find(TreeNode_1.TreeNode).length).toEqual(0);
|
|
284
|
-
// Single node
|
|
285
|
-
wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{}], onChange: function () { } }));
|
|
286
|
-
expect(wrapper.find(TreeNode_1.TreeNode).length).toEqual(1);
|
|
287
|
-
// Two nodes
|
|
288
|
-
wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{}, {}], onChange: function () { } }));
|
|
289
|
-
expect(wrapper.find(TreeNode_1.TreeNode).length).toEqual(2);
|
|
290
|
-
});
|
|
291
|
-
it('should render nodes for nested, expanded data', function () {
|
|
292
|
-
var wrapper;
|
|
293
|
-
// Single Nested
|
|
294
|
-
wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ expanded: true, children: [{}] }], onChange: function () { } }));
|
|
295
|
-
expect(wrapper.find(TreeNode_1.TreeNode).length).toEqual(2);
|
|
296
|
-
// Double Nested
|
|
297
|
-
wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ expanded: true, children: [{ expanded: true, children: [{}] }] }], onChange: function () { } }));
|
|
298
|
-
expect(wrapper.find(TreeNode_1.TreeNode).length).toEqual(3);
|
|
299
|
-
// 2x Double Nested Siblings
|
|
300
|
-
wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [
|
|
301
|
-
{ expanded: true, children: [{ expanded: true, children: [{}] }] },
|
|
302
|
-
{ expanded: true, children: [{ expanded: true, children: [{}] }] }
|
|
303
|
-
], onChange: function () { } }));
|
|
304
|
-
expect(wrapper.find(TreeNode_1.TreeNode).length).toEqual(6);
|
|
305
|
-
});
|
|
306
|
-
it('should render nodes for nested, collapsed data', function () {
|
|
307
|
-
var wrapper;
|
|
308
|
-
// Single Nested
|
|
309
|
-
wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ expanded: false, children: [{}] }], onChange: function () { } }));
|
|
310
|
-
expect(wrapper.find(TreeNode_1.TreeNode).length).toEqual(1);
|
|
311
|
-
// Double Nested
|
|
312
|
-
wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ expanded: false, children: [{ expanded: false, children: [{}] }] }], onChange: function () { } }));
|
|
313
|
-
expect(wrapper.find(TreeNode_1.TreeNode).length).toEqual(1);
|
|
314
|
-
// 2x Double Nested Siblings, top level of first expanded
|
|
315
|
-
wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [
|
|
316
|
-
{ expanded: true, children: [{ expanded: false, children: [{}] }] },
|
|
317
|
-
{ expanded: false, children: [{ expanded: false, children: [{}] }] }
|
|
318
|
-
], onChange: function () { } }));
|
|
319
|
-
expect(wrapper.find(TreeNode_1.TreeNode).length).toEqual(3);
|
|
320
|
-
});
|
|
321
|
-
it('should reveal hidden nodes when visibility toggled', function () {
|
|
322
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a', children: [{ title: 'b' }] }], onChange: function (treeData) { return wrapper.setProps({ treeData: treeData }); } }));
|
|
323
|
-
// Check nodes in collapsed state
|
|
324
|
-
expect(wrapper.find(TreeNode_1.TreeNode).length).toEqual(1);
|
|
325
|
-
// Expand node and check for the existence of the revealed child
|
|
326
|
-
wrapper.find('.rst__expandButton').first().simulate('click');
|
|
327
|
-
expect(wrapper.find(TreeNode_1.TreeNode).length).toEqual(2);
|
|
328
|
-
// Collapse node and make sure the child has been hidden
|
|
329
|
-
wrapper.find('.rst__collapseButton').first().simulate('click');
|
|
330
|
-
expect(wrapper.find(TreeNode_1.TreeNode).length).toEqual(1);
|
|
331
|
-
});
|
|
332
|
-
it('should change outer wrapper style via `style` and `className` props', function () {
|
|
333
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }], onChange: function () { }, style: { borderWidth: 42 }, className: "extra-classy" }));
|
|
334
|
-
expect(wrapper.find('.rst__tree').prop('style').borderWidth).toBe(42);
|
|
335
|
-
expect(wrapper.find('.rst__tree')).toHaveClassName('extra-classy');
|
|
336
|
-
});
|
|
337
|
-
it('should change style of scroll container with `innerStyle` prop', function () {
|
|
338
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }], onChange: function () { }, innerStyle: { borderWidth: 42 } }));
|
|
339
|
-
expect(wrapper.find(react_virtualized_1.List).first().prop('style').borderWidth).toBe(42);
|
|
340
|
-
});
|
|
341
|
-
it('should change height according to rowHeight prop', function () {
|
|
342
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }, { title: 'b', extraHeight: 2 }], onChange: function () { }, rowHeight: 12 }));
|
|
343
|
-
// Works with static value
|
|
344
|
-
expect(wrapper.find(TreeNode_1.TreeNode).first().prop('style').height).toBe(12);
|
|
345
|
-
// Works with function callback
|
|
346
|
-
wrapper.setProps({ rowHeight: function (_a) {
|
|
347
|
-
var node = _a.node;
|
|
348
|
-
return 42 + (node.extraHeight || 0);
|
|
349
|
-
} });
|
|
350
|
-
expect(wrapper.find(TreeNode_1.TreeNode).first().prop('style').height).toBe(42);
|
|
351
|
-
expect(wrapper.find(TreeNode_1.TreeNode).last().prop('style').height).toBe(44);
|
|
352
|
-
});
|
|
353
|
-
it('should toggle virtualization according to isVirtualized prop', function () {
|
|
354
|
-
var virtualized = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }, { title: 'b' }], onChange: function () { }, isVirtualized: true }));
|
|
355
|
-
expect(virtualized.find(react_virtualized_1.List).length).toEqual(1);
|
|
356
|
-
var notVirtualized = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }, { title: 'b' }], onChange: function () { }, isVirtualized: false }));
|
|
357
|
-
expect(notVirtualized.find(react_virtualized_1.List).length).toEqual(0);
|
|
358
|
-
});
|
|
359
|
-
it('should change scaffold width according to scaffoldBlockPxWidth prop', function () {
|
|
360
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }], onChange: function () { }, scaffoldBlockPxWidth: 12 }));
|
|
361
|
-
expect(wrapper.find('.rst__lineBlock').prop('style').width).toBe(12);
|
|
362
|
-
});
|
|
363
|
-
it('should pass props to the node renderer from `generateNodeProps`', function () {
|
|
364
|
-
var title = 42;
|
|
365
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: title }], onChange: function () { }, generateNodeProps: function (_a) {
|
|
366
|
-
var node = _a.node;
|
|
367
|
-
return ({ buttons: [node.title] });
|
|
368
|
-
} }));
|
|
369
|
-
expect(wrapper.find(NodeRendererDefault_1.NodeRendererDefault)).toHaveProp('buttons', [title]);
|
|
370
|
-
});
|
|
371
|
-
it('should call the callback in `onVisibilityToggle` when visibility toggled', function () {
|
|
372
|
-
var out = null;
|
|
373
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a', children: [{ title: 'b' }] }], onChange: function (treeData) { return wrapper.setProps({ treeData: treeData }); }, onVisibilityToggle: function (_a) {
|
|
374
|
-
var expanded = _a.expanded;
|
|
375
|
-
out = expanded ? 'expanded' : 'collapsed';
|
|
376
|
-
} }));
|
|
377
|
-
wrapper.find('.rst__expandButton').first().simulate('click');
|
|
378
|
-
expect(out).toEqual('expanded');
|
|
379
|
-
wrapper.find('.rst__collapseButton').first().simulate('click');
|
|
380
|
-
expect(out).toEqual('collapsed');
|
|
381
|
-
});
|
|
382
|
-
it('should render with a custom `nodeContentRenderer`', function () {
|
|
383
|
-
var FakeNode = /** @class */ (function (_super) {
|
|
384
|
-
__extends(FakeNode, _super);
|
|
385
|
-
function FakeNode() {
|
|
386
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
387
|
-
}
|
|
388
|
-
FakeNode.prototype.render = function () {
|
|
389
|
-
return react_1.default.createElement("div", null, this.props.node.title);
|
|
390
|
-
};
|
|
391
|
-
return FakeNode;
|
|
392
|
-
}(react_1.Component));
|
|
393
|
-
FakeNode.propTypes = {
|
|
394
|
-
node: prop_types_1.default.shape({ title: prop_types_1.default.string }).isRequired
|
|
395
|
-
};
|
|
396
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a' }], onChange: function () { }, nodeContentRenderer: FakeNode }));
|
|
397
|
-
expect(wrapper.find(FakeNode).length).toEqual(1);
|
|
398
|
-
});
|
|
399
|
-
it('search should call searchFinishCallback', function () {
|
|
400
|
-
var searchFinishCallback = jest.fn();
|
|
401
|
-
(0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [{ title: 'a', children: [{ title: 'b' }] }], searchQuery: "b", searchFocusOffset: 0, searchFinishCallback: searchFinishCallback, onChange: function () { } }));
|
|
402
|
-
expect(searchFinishCallback).toHaveBeenCalledWith([
|
|
403
|
-
// Node should be found expanded
|
|
404
|
-
{ node: { title: 'b' }, path: [0, 1], treeIndex: 1 }
|
|
405
|
-
]);
|
|
406
|
-
});
|
|
407
|
-
it('search should expand all matches and seek out the focus offset', function () {
|
|
408
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [
|
|
409
|
-
{ title: 'a', children: [{ title: 'b' }] },
|
|
410
|
-
{ title: 'a', children: [{ title: 'be' }] }
|
|
411
|
-
], searchQuery: "b", onChange: function () { } }));
|
|
412
|
-
var tree = wrapper.find('ReactSortableTree').instance();
|
|
413
|
-
expect(tree.state.searchMatches).toEqual([
|
|
414
|
-
{ node: { title: 'b' }, path: [0, 1], treeIndex: 1 },
|
|
415
|
-
{ node: { title: 'be' }, path: [2, 3], treeIndex: 3 }
|
|
416
|
-
]);
|
|
417
|
-
expect(tree.state.searchFocusTreeIndex).toEqual(null);
|
|
418
|
-
wrapper.setProps({ searchFocusOffset: 0 });
|
|
419
|
-
expect(tree.state.searchFocusTreeIndex).toEqual(1);
|
|
420
|
-
wrapper.setProps({ searchFocusOffset: 1 });
|
|
421
|
-
// As the empty `onChange` we use here doesn't actually change
|
|
422
|
-
// the tree, the expansion of all nodes doesn't get preserved
|
|
423
|
-
// after the first mount, and this change in searchFocusOffset
|
|
424
|
-
// only triggers the opening of a single path.
|
|
425
|
-
// Therefore it's 2 instead of 3.
|
|
426
|
-
expect(tree.state.searchFocusTreeIndex).toEqual(2);
|
|
427
|
-
});
|
|
428
|
-
it('search onlyExpandSearchedNodes should collapse all nodes except matches', function () {
|
|
429
|
-
var wrapper = (0, enzyme_1.mount)(react_1.default.createElement(SortableTreeWithDndTestBackend, { treeData: [
|
|
430
|
-
{
|
|
431
|
-
title: 'a',
|
|
432
|
-
children: [{ title: 'b', children: [{ title: 'c' }] }]
|
|
433
|
-
},
|
|
434
|
-
{
|
|
435
|
-
title: 'b',
|
|
436
|
-
children: [{ title: 'd', children: [{ title: 'be' }] }]
|
|
437
|
-
},
|
|
438
|
-
{
|
|
439
|
-
title: 'c',
|
|
440
|
-
children: [{ title: 'f', children: [{ title: 'dd' }] }]
|
|
441
|
-
}
|
|
442
|
-
], onChange: function (treeData) { return wrapper.setProps({ treeData: treeData }); }, onlyExpandSearchedNodes: true }));
|
|
443
|
-
wrapper.setProps({ searchQuery: 'be' });
|
|
444
|
-
expect(wrapper.prop('treeData')).toEqual([
|
|
445
|
-
{
|
|
446
|
-
title: 'a',
|
|
447
|
-
children: [
|
|
448
|
-
{
|
|
449
|
-
title: 'b',
|
|
450
|
-
children: [
|
|
451
|
-
{
|
|
452
|
-
title: 'c',
|
|
453
|
-
expanded: false
|
|
454
|
-
}
|
|
455
|
-
],
|
|
456
|
-
expanded: false
|
|
457
|
-
}
|
|
458
|
-
],
|
|
459
|
-
expanded: false
|
|
460
|
-
},
|
|
461
|
-
{
|
|
462
|
-
title: 'b',
|
|
463
|
-
children: [
|
|
464
|
-
{
|
|
465
|
-
title: 'd',
|
|
466
|
-
children: [
|
|
467
|
-
{
|
|
468
|
-
title: 'be',
|
|
469
|
-
expanded: false
|
|
470
|
-
}
|
|
471
|
-
],
|
|
472
|
-
expanded: true
|
|
473
|
-
}
|
|
474
|
-
],
|
|
475
|
-
expanded: true
|
|
476
|
-
},
|
|
477
|
-
{
|
|
478
|
-
title: 'c',
|
|
479
|
-
children: [
|
|
480
|
-
{
|
|
481
|
-
title: 'f',
|
|
482
|
-
children: [
|
|
483
|
-
{
|
|
484
|
-
title: 'dd',
|
|
485
|
-
expanded: false
|
|
486
|
-
}
|
|
487
|
-
],
|
|
488
|
-
expanded: false
|
|
489
|
-
}
|
|
490
|
-
],
|
|
491
|
-
expanded: false
|
|
492
|
-
}
|
|
493
|
-
]);
|
|
494
|
-
});
|
|
495
|
-
it('should work with different dnd backends', function () {
|
|
496
|
-
expect((0, enzyme_1.mount)(react_1.default.createElement(react_dnd_1.DndProvider, { backend: react_dnd_html5_backend_1.default },
|
|
497
|
-
react_1.default.createElement(ReactSortableTree_1.default, { treeData: [{ title: 'a' }], onChange: function () { } })))).toBeDefined();
|
|
498
|
-
expect((0, enzyme_1.mount)(react_1.default.createElement(react_dnd_1.DndProvider, { backend: react_dnd_touch_backend_1.default },
|
|
499
|
-
react_1.default.createElement(ReactSortableTree_1.default, { treeData: [{ title: 'a' }], onChange: function () { } })))).toBeDefined();
|
|
500
|
-
});
|
|
501
|
-
});
|