tree-element 0.1.1 → 0.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 +43 -31
- package/lib/animation.d.ts +2 -2
- package/lib/animation.d.ts.map +1 -1
- package/lib/animation.js +16 -12
- package/lib/animation.js.map +1 -1
- package/lib/classNames.d.ts.map +1 -1
- package/lib/classNames.js +2 -2
- package/lib/classNames.js.map +1 -1
- package/lib/dataLoader.d.ts +1 -0
- package/lib/dataLoader.d.ts.map +1 -1
- package/lib/dataLoader.js +22 -20
- package/lib/dataLoader.js.map +1 -1
- package/lib/dragAndDropHandler/binarySearch.js +3 -3
- package/lib/dragAndDropHandler/binarySearch.js.map +1 -1
- package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -1
- package/lib/dragAndDropHandler/dragElement.js +11 -13
- package/lib/dragAndDropHandler/dragElement.js.map +1 -1
- package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -1
- package/lib/dragAndDropHandler/generateHitAreas.js +25 -25
- package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -1
- package/lib/dragAndDropHandler/index.d.ts.map +1 -1
- package/lib/dragAndDropHandler/index.js +125 -158
- package/lib/dragAndDropHandler/index.js.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.js +23 -22
- package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
- package/lib/dragAndDropHandler/types.d.ts.map +1 -1
- package/lib/elementsRenderer.d.ts +20 -7
- package/lib/elementsRenderer.d.ts.map +1 -1
- package/lib/elementsRenderer.js +195 -136
- package/lib/elementsRenderer.js.map +1 -1
- package/lib/events.d.ts +44 -11
- package/lib/events.d.ts.map +1 -1
- package/lib/index.d.ts +36 -13
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +386 -349
- package/lib/index.js.map +1 -1
- package/lib/keyHandler.d.ts +13 -8
- package/lib/keyHandler.d.ts.map +1 -1
- package/lib/keyHandler.js +106 -51
- package/lib/keyHandler.js.map +1 -1
- package/lib/methodTypes.d.ts +3 -3
- package/lib/methodTypes.d.ts.map +1 -1
- package/lib/mouseHandler.d.ts +1 -1
- package/lib/mouseHandler.d.ts.map +1 -1
- package/lib/mouseHandler.js +36 -49
- package/lib/mouseHandler.js.map +1 -1
- package/lib/mouseUtils.d.ts.map +1 -1
- package/lib/mouseUtils.js +2 -2
- package/lib/mouseUtils.js.map +1 -1
- package/lib/node.d.ts +47 -16
- package/lib/node.d.ts.map +1 -1
- package/lib/node.js +169 -171
- package/lib/node.js.map +1 -1
- package/lib/nodeElement/borderDropHint.d.ts.map +1 -1
- package/lib/nodeElement/borderDropHint.js +4 -5
- package/lib/nodeElement/borderDropHint.js.map +1 -1
- package/lib/nodeElement/folderElement.d.ts +8 -5
- package/lib/nodeElement/folderElement.d.ts.map +1 -1
- package/lib/nodeElement/folderElement.js +75 -67
- package/lib/nodeElement/folderElement.js.map +1 -1
- package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
- package/lib/nodeElement/ghostDropHint.js +13 -13
- package/lib/nodeElement/ghostDropHint.js.map +1 -1
- package/lib/nodeElement/index.d.ts +2 -1
- package/lib/nodeElement/index.d.ts.map +1 -1
- package/lib/nodeElement/index.js +38 -30
- package/lib/nodeElement/index.js.map +1 -1
- package/lib/nodeUtils.d.ts.map +1 -1
- package/lib/nodeUtils.js +1 -1
- package/lib/nodeUtils.js.map +1 -1
- package/lib/options.d.ts +19 -3
- package/lib/options.d.ts.map +1 -1
- package/lib/positionUtils.js +3 -3
- package/lib/positionUtils.js.map +1 -1
- package/lib/requestUrl.d.ts +1 -1
- package/lib/requestUrl.d.ts.map +1 -1
- package/lib/requestUrl.js +6 -17
- package/lib/requestUrl.js.map +1 -1
- package/lib/saveStateHandler.d.ts.map +1 -1
- package/lib/saveStateHandler.js +59 -89
- package/lib/saveStateHandler.js.map +1 -1
- package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/containerScrollParent.js +11 -18
- package/lib/scrollHandler/containerScrollParent.js.map +1 -1
- package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/createScrollParent.js +12 -13
- package/lib/scrollHandler/createScrollParent.js.map +1 -1
- package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/documentScrollParent.js +18 -27
- package/lib/scrollHandler/documentScrollParent.js.map +1 -1
- package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/scrollParent.js +30 -34
- package/lib/scrollHandler/scrollParent.js.map +1 -1
- package/lib/scrollHandler.d.ts.map +1 -1
- package/lib/scrollHandler.js +11 -14
- package/lib/scrollHandler.js.map +1 -1
- package/lib/selectNodeHandler.d.ts +4 -2
- package/lib/selectNodeHandler.d.ts.map +1 -1
- package/lib/selectNodeHandler.js +64 -83
- package/lib/selectNodeHandler.js.map +1 -1
- package/lib/setDefaultOptions.d.ts.map +1 -1
- package/lib/setDefaultOptions.js +34 -38
- package/lib/setDefaultOptions.js.map +1 -1
- package/lib/triggerCustomEvent.d.ts.map +1 -1
- package/lib/triggerCustomEvent.js +2 -2
- package/lib/triggerCustomEvent.js.map +1 -1
- package/lib/util.d.ts.map +1 -1
- package/lib/util.js +2 -2
- package/lib/util.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +43 -32
- package/src/animation.ts +14 -12
- package/src/classNames.ts +52 -52
- package/src/dataLoader.ts +79 -71
- package/src/dragAndDropHandler/binarySearch.ts +17 -17
- package/src/dragAndDropHandler/dragElement.ts +51 -50
- package/src/dragAndDropHandler/generateHitAreas.ts +156 -161
- package/src/dragAndDropHandler/index.ts +334 -348
- package/src/dragAndDropHandler/iterateVisibleNodes.ts +61 -63
- package/src/dragAndDropHandler/types.ts +5 -5
- package/src/elementsRenderer.ts +377 -294
- package/src/events.ts +241 -208
- package/src/header.txt +1 -1
- package/src/index.ts +259 -229
- package/src/keyHandler.ts +179 -115
- package/src/methodTypes.ts +7 -10
- package/src/mouseHandler.ts +316 -316
- package/src/mouseUtils.ts +14 -14
- package/src/node.ts +773 -771
- package/src/nodeElement/borderDropHint.ts +25 -25
- package/src/nodeElement/folderElement.ts +116 -102
- package/src/nodeElement/ghostDropHint.ts +64 -62
- package/src/nodeElement/index.ts +81 -73
- package/src/nodeUtils.ts +5 -5
- package/src/options.ts +25 -5
- package/src/requestUrl.ts +7 -14
- package/src/saveStateHandler.ts +191 -207
- package/src/scrollHandler/containerScrollParent.ts +40 -49
- package/src/scrollHandler/createScrollParent.ts +26 -27
- package/src/scrollHandler/documentScrollParent.ts +66 -72
- package/src/scrollHandler/scrollParent.ts +90 -86
- package/src/scrollHandler.ts +45 -45
- package/src/selectNodeHandler.ts +171 -165
- package/src/setDefaultOptions.ts +44 -32
- package/src/triggerCustomEvent.ts +7 -3
- package/src/util.ts +2 -3
- package/src/version.ts +1 -1
- package/tree_element.css +87 -69
- package/tree_element.debug.js +3866 -3831
- package/tree_element.debug.js.map +1 -1
- package/tree_element.js +2 -2
- package/tree_element.js.map +1 -1
package/lib/node.js
CHANGED
|
@@ -26,37 +26,62 @@ prefix-private-members: all
|
|
|
26
26
|
* :::
|
|
27
27
|
*/
|
|
28
28
|
class Node {
|
|
29
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
@hidden
|
|
31
|
+
*/
|
|
30
32
|
|
|
31
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
The child nodes.
|
|
35
|
+
*/
|
|
32
36
|
children;
|
|
33
|
-
/** The `li` element, once the node is rendered.
|
|
37
|
+
/** The `li` element, once the node is rendered. Nodes inside a closed
|
|
38
|
+
* folder are rendered when the folder is opened. */
|
|
34
39
|
element;
|
|
35
|
-
/**
|
|
40
|
+
/**
|
|
41
|
+
The id from the node data.
|
|
42
|
+
*/
|
|
36
43
|
id;
|
|
37
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
@hidden
|
|
46
|
+
*/
|
|
38
47
|
idMapping;
|
|
39
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
Whether the node's children are being fetched.
|
|
50
|
+
*/
|
|
40
51
|
is_loading;
|
|
41
|
-
/**
|
|
52
|
+
/**
|
|
53
|
+
Whether the folder is open.
|
|
54
|
+
*/
|
|
42
55
|
is_open;
|
|
43
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
Whether the node data had an empty `children` array.
|
|
58
|
+
*/
|
|
44
59
|
isEmptyFolder;
|
|
45
|
-
/**
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
Whether the children still have to be fetched.
|
|
62
|
+
*/
|
|
63
|
+
load_on_demand = false;
|
|
64
|
+
/**
|
|
65
|
+
The label. Also settable from the `label` key in node data.
|
|
66
|
+
*/
|
|
67
|
+
name = "";
|
|
68
|
+
/**
|
|
69
|
+
@hidden
|
|
70
|
+
*/
|
|
50
71
|
nodeClass;
|
|
51
|
-
/**
|
|
72
|
+
/**
|
|
73
|
+
The parent; `null` for the root node.
|
|
74
|
+
*/
|
|
52
75
|
parent;
|
|
53
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
The root node.
|
|
78
|
+
*/
|
|
54
79
|
tree;
|
|
55
80
|
|
|
56
|
-
/**
|
|
81
|
+
/**
|
|
82
|
+
@hidden
|
|
83
|
+
*/
|
|
57
84
|
constructor(nodeData = null, isRoot = false, nodeClass = Node) {
|
|
58
|
-
this.name = "";
|
|
59
|
-
this.load_on_demand = false;
|
|
60
85
|
this.isEmptyFolder = nodeData != null && isNodeRecordWithChildren(nodeData) && nodeData.children.length === 0;
|
|
61
86
|
this.setData(nodeData);
|
|
62
87
|
this.children = [];
|
|
@@ -79,15 +104,14 @@ class Node {
|
|
|
79
104
|
* @group Changing the tree
|
|
80
105
|
*/
|
|
81
106
|
addAfter(nodeInfo) {
|
|
82
|
-
if (
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const node = this._createNode(nodeInfo);
|
|
86
|
-
const childIndex = this.parent.getChildIndex(this);
|
|
107
|
+
if (this.parent) {
|
|
108
|
+
let node = this._createNode(nodeInfo);
|
|
109
|
+
let childIndex = this.parent.getChildIndex(this);
|
|
87
110
|
this.parent.addChildAtPosition(node, childIndex + 1);
|
|
88
111
|
node._loadChildrenFromData(nodeInfo);
|
|
89
112
|
return node;
|
|
90
113
|
}
|
|
114
|
+
return null;
|
|
91
115
|
}
|
|
92
116
|
|
|
93
117
|
/**
|
|
@@ -97,15 +121,14 @@ class Node {
|
|
|
97
121
|
* @group Changing the tree
|
|
98
122
|
*/
|
|
99
123
|
addBefore(nodeInfo) {
|
|
100
|
-
if (
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
const node = this._createNode(nodeInfo);
|
|
104
|
-
const childIndex = this.parent.getChildIndex(this);
|
|
124
|
+
if (this.parent) {
|
|
125
|
+
let node = this._createNode(nodeInfo);
|
|
126
|
+
let childIndex = this.parent.getChildIndex(this);
|
|
105
127
|
this.parent.addChildAtPosition(node, childIndex);
|
|
106
128
|
node._loadChildrenFromData(nodeInfo);
|
|
107
129
|
return node;
|
|
108
130
|
}
|
|
131
|
+
return null;
|
|
109
132
|
}
|
|
110
133
|
|
|
111
134
|
/**
|
|
@@ -129,7 +152,9 @@ class Node {
|
|
|
129
152
|
node._setParent(this);
|
|
130
153
|
}
|
|
131
154
|
|
|
132
|
-
/**
|
|
155
|
+
/**
|
|
156
|
+
@hidden
|
|
157
|
+
*/
|
|
133
158
|
addNodeToIndex(node) {
|
|
134
159
|
if (node.id != null) {
|
|
135
160
|
this.idMapping?.set(node.id, node);
|
|
@@ -143,21 +168,20 @@ class Node {
|
|
|
143
168
|
* @group Changing the tree
|
|
144
169
|
*/
|
|
145
170
|
addParent(nodeInfo) {
|
|
146
|
-
if (
|
|
147
|
-
|
|
148
|
-
} else {
|
|
149
|
-
const newParent = this._createNode(nodeInfo);
|
|
171
|
+
if (this.parent) {
|
|
172
|
+
let newParent = this._createNode(nodeInfo);
|
|
150
173
|
if (this.tree) {
|
|
151
174
|
newParent._setParent(this.tree);
|
|
152
175
|
}
|
|
153
|
-
|
|
154
|
-
for (
|
|
176
|
+
let originalParent = this.parent;
|
|
177
|
+
for (let child of originalParent.children) {
|
|
155
178
|
newParent.addChild(child);
|
|
156
179
|
}
|
|
157
180
|
originalParent.children = [];
|
|
158
181
|
originalParent.addChild(newParent);
|
|
159
182
|
return newParent;
|
|
160
183
|
}
|
|
184
|
+
return null;
|
|
161
185
|
}
|
|
162
186
|
|
|
163
187
|
/**
|
|
@@ -167,7 +191,7 @@ class Node {
|
|
|
167
191
|
* @group Changing the tree
|
|
168
192
|
*/
|
|
169
193
|
append(nodeInfo) {
|
|
170
|
-
|
|
194
|
+
let node = this._createNode(nodeInfo);
|
|
171
195
|
this.addChild(node);
|
|
172
196
|
node._loadChildrenFromData(nodeInfo);
|
|
173
197
|
return node;
|
|
@@ -185,7 +209,7 @@ class Node {
|
|
|
185
209
|
* @group Searching
|
|
186
210
|
*/
|
|
187
211
|
filter(f) {
|
|
188
|
-
|
|
212
|
+
let result = [];
|
|
189
213
|
this.iterate(node => {
|
|
190
214
|
if (f(node)) {
|
|
191
215
|
result.push(node);
|
|
@@ -220,14 +244,15 @@ class Node {
|
|
|
220
244
|
* @group Reading data back
|
|
221
245
|
*/
|
|
222
246
|
getData(includeParent = false) {
|
|
223
|
-
|
|
247
|
+
let getDataFromNodes = nodes => {
|
|
224
248
|
return nodes.map(node => {
|
|
225
|
-
|
|
226
|
-
for (
|
|
227
|
-
if (["
|
|
228
|
-
|
|
229
|
-
tmpNode[k] = v;
|
|
249
|
+
let tmpNode = {};
|
|
250
|
+
for (let k in node) {
|
|
251
|
+
if (["children", "element", "idMapping", "isEmptyFolder", "load_on_demand", "nodeClass", "parent", "tree"].includes(k) || !Object.prototype.hasOwnProperty.call(node, k)) {
|
|
252
|
+
continue;
|
|
230
253
|
}
|
|
254
|
+
let v = node[k];
|
|
255
|
+
tmpNode[k] = v;
|
|
231
256
|
}
|
|
232
257
|
if (node.hasChildren()) {
|
|
233
258
|
tmpNode.children = getDataFromNodes(node.children);
|
|
@@ -235,11 +260,7 @@ class Node {
|
|
|
235
260
|
return tmpNode;
|
|
236
261
|
});
|
|
237
262
|
};
|
|
238
|
-
|
|
239
|
-
return getDataFromNodes([this]);
|
|
240
|
-
} else {
|
|
241
|
-
return getDataFromNodes(this.children);
|
|
242
|
-
}
|
|
263
|
+
return getDataFromNodes(includeParent ? [this] : this.children);
|
|
243
264
|
}
|
|
244
265
|
|
|
245
266
|
/**
|
|
@@ -249,16 +270,11 @@ class Node {
|
|
|
249
270
|
* @group Moving around the tree
|
|
250
271
|
*/
|
|
251
272
|
getLastChild() {
|
|
252
|
-
if (
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
const lastChild = this.children[this.children.length - 1];
|
|
256
|
-
if (!(lastChild.hasChildren() && lastChild.is_open)) {
|
|
257
|
-
return lastChild;
|
|
258
|
-
} else {
|
|
259
|
-
return lastChild.getLastChild();
|
|
260
|
-
}
|
|
273
|
+
if (this.hasChildren()) {
|
|
274
|
+
let lastChild = this.children[this.children.length - 1];
|
|
275
|
+
return lastChild.hasChildren() && lastChild.is_open ? lastChild.getLastChild() : lastChild;
|
|
261
276
|
}
|
|
277
|
+
return null;
|
|
262
278
|
}
|
|
263
279
|
|
|
264
280
|
/**
|
|
@@ -268,7 +284,7 @@ class Node {
|
|
|
268
284
|
*/
|
|
269
285
|
getLevel() {
|
|
270
286
|
let level = 0;
|
|
271
|
-
let node = this; // eslint-disable-line @typescript-eslint/no-this-alias
|
|
287
|
+
let node = this; // eslint-disable-line @typescript-eslint/no-this-alias, unicorn/no-this-assignment
|
|
272
288
|
|
|
273
289
|
while (node.parent) {
|
|
274
290
|
level += 1;
|
|
@@ -286,16 +302,12 @@ class Node {
|
|
|
286
302
|
getNextNode(includeChildren = true) {
|
|
287
303
|
if (includeChildren && this.hasChildren()) {
|
|
288
304
|
return this.children[0] ?? null;
|
|
289
|
-
} else if (!this.parent) {
|
|
290
|
-
return null;
|
|
291
|
-
} else {
|
|
292
|
-
const nextSibling = this.getNextSibling();
|
|
293
|
-
if (nextSibling) {
|
|
294
|
-
return nextSibling;
|
|
295
|
-
} else {
|
|
296
|
-
return this.parent.getNextNode(false);
|
|
297
|
-
}
|
|
298
305
|
}
|
|
306
|
+
if (this.parent) {
|
|
307
|
+
let nextSibling = this.getNextSibling();
|
|
308
|
+
return nextSibling ?? this.parent.getNextNode(false);
|
|
309
|
+
}
|
|
310
|
+
return null;
|
|
299
311
|
}
|
|
300
312
|
|
|
301
313
|
/**
|
|
@@ -304,16 +316,11 @@ class Node {
|
|
|
304
316
|
* @group Moving around the tree
|
|
305
317
|
*/
|
|
306
318
|
getNextSibling() {
|
|
307
|
-
if (
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
const nextIndex = this.parent.getChildIndex(this) + 1;
|
|
311
|
-
if (nextIndex < this.parent.children.length) {
|
|
312
|
-
return this.parent.children[nextIndex] ?? null;
|
|
313
|
-
} else {
|
|
314
|
-
return null;
|
|
315
|
-
}
|
|
319
|
+
if (this.parent) {
|
|
320
|
+
let nextIndex = this.parent.getChildIndex(this) + 1;
|
|
321
|
+
return nextIndex < this.parent.children.length ? this.parent.children[nextIndex] ?? null : null;
|
|
316
322
|
}
|
|
323
|
+
return null;
|
|
317
324
|
}
|
|
318
325
|
|
|
319
326
|
/**
|
|
@@ -326,20 +333,17 @@ class Node {
|
|
|
326
333
|
if (this.hasChildren() && this.is_open) {
|
|
327
334
|
// First child
|
|
328
335
|
return this.children[0] ?? null;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
// Next sibling
|
|
336
|
-
return nextSibling;
|
|
337
|
-
} else {
|
|
338
|
-
// Next node of parent
|
|
339
|
-
return this.parent.getNextNode(false);
|
|
340
|
-
}
|
|
336
|
+
}
|
|
337
|
+
if (this.parent) {
|
|
338
|
+
let nextSibling = this.getNextSibling();
|
|
339
|
+
if (nextSibling) {
|
|
340
|
+
// Next sibling
|
|
341
|
+
return nextSibling;
|
|
341
342
|
}
|
|
343
|
+
// Next node of parent
|
|
344
|
+
return this.parent.getNextNode(false);
|
|
342
345
|
}
|
|
346
|
+
return null;
|
|
343
347
|
}
|
|
344
348
|
|
|
345
349
|
/**
|
|
@@ -352,12 +356,12 @@ class Node {
|
|
|
352
356
|
this.iterate(node => {
|
|
353
357
|
if (result) {
|
|
354
358
|
return false;
|
|
355
|
-
}
|
|
359
|
+
}
|
|
360
|
+
if (callback(node)) {
|
|
356
361
|
result = node;
|
|
357
362
|
return false;
|
|
358
|
-
} else {
|
|
359
|
-
return true;
|
|
360
363
|
}
|
|
364
|
+
return true;
|
|
361
365
|
});
|
|
362
366
|
return result;
|
|
363
367
|
}
|
|
@@ -387,7 +391,7 @@ class Node {
|
|
|
387
391
|
* @group Searching
|
|
388
392
|
*/
|
|
389
393
|
getNodeByNameMustExist(name) {
|
|
390
|
-
|
|
394
|
+
let node = this.getNodeByCallback(n => n.name === name);
|
|
391
395
|
if (!node) {
|
|
392
396
|
throw new Error(`Node with name ${name} not found`);
|
|
393
397
|
}
|
|
@@ -413,12 +417,12 @@ class Node {
|
|
|
413
417
|
// Return parent except if it is the root node
|
|
414
418
|
if (!this.parent) {
|
|
415
419
|
return null;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
return null;
|
|
419
|
-
} else {
|
|
420
|
+
}
|
|
421
|
+
if (this.parent.parent) {
|
|
420
422
|
return this.parent;
|
|
421
423
|
}
|
|
424
|
+
// Root node -> null
|
|
425
|
+
return null;
|
|
422
426
|
}
|
|
423
427
|
|
|
424
428
|
/**
|
|
@@ -428,18 +432,14 @@ class Node {
|
|
|
428
432
|
* @group Moving around the tree
|
|
429
433
|
*/
|
|
430
434
|
getPreviousNode() {
|
|
431
|
-
if (
|
|
432
|
-
|
|
433
|
-
} else {
|
|
434
|
-
const previousSibling = this.getPreviousSibling();
|
|
435
|
+
if (this.parent) {
|
|
436
|
+
let previousSibling = this.getPreviousSibling();
|
|
435
437
|
if (!previousSibling) {
|
|
436
438
|
return this.getParent();
|
|
437
|
-
} else if (previousSibling.hasChildren()) {
|
|
438
|
-
return previousSibling.getLastChild();
|
|
439
|
-
} else {
|
|
440
|
-
return previousSibling;
|
|
441
439
|
}
|
|
440
|
+
return previousSibling.hasChildren() ? previousSibling.getLastChild() : previousSibling;
|
|
442
441
|
}
|
|
442
|
+
return null;
|
|
443
443
|
}
|
|
444
444
|
|
|
445
445
|
/**
|
|
@@ -448,16 +448,11 @@ class Node {
|
|
|
448
448
|
* @group Moving around the tree
|
|
449
449
|
*/
|
|
450
450
|
getPreviousSibling() {
|
|
451
|
-
if (
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
const previousIndex = this.parent.getChildIndex(this) - 1;
|
|
455
|
-
if (previousIndex >= 0) {
|
|
456
|
-
return this.parent.children[previousIndex] ?? null;
|
|
457
|
-
} else {
|
|
458
|
-
return null;
|
|
459
|
-
}
|
|
451
|
+
if (this.parent) {
|
|
452
|
+
let previousIndex = this.parent.getChildIndex(this) - 1;
|
|
453
|
+
return previousIndex >= 0 ? this.parent.children[previousIndex] ?? null : null;
|
|
460
454
|
}
|
|
455
|
+
return null;
|
|
461
456
|
}
|
|
462
457
|
|
|
463
458
|
/**
|
|
@@ -467,20 +462,19 @@ class Node {
|
|
|
467
462
|
* @group Moving around the tree
|
|
468
463
|
*/
|
|
469
464
|
getPreviousVisibleNode() {
|
|
470
|
-
if (
|
|
471
|
-
|
|
472
|
-
} else {
|
|
473
|
-
const previousSibling = this.getPreviousSibling();
|
|
465
|
+
if (this.parent) {
|
|
466
|
+
let previousSibling = this.getPreviousSibling();
|
|
474
467
|
if (!previousSibling) {
|
|
475
468
|
return this.getParent();
|
|
476
|
-
}
|
|
469
|
+
}
|
|
470
|
+
if (!previousSibling.hasChildren() || !previousSibling.is_open) {
|
|
477
471
|
// Previous sibling
|
|
478
472
|
return previousSibling;
|
|
479
|
-
} else {
|
|
480
|
-
// Last child of previous sibling
|
|
481
|
-
return previousSibling.getLastChild();
|
|
482
473
|
}
|
|
474
|
+
// Last child of previous sibling
|
|
475
|
+
return previousSibling.getLastChild();
|
|
483
476
|
}
|
|
477
|
+
return null;
|
|
484
478
|
}
|
|
485
479
|
|
|
486
480
|
/**
|
|
@@ -498,15 +492,15 @@ class Node {
|
|
|
498
492
|
* @hidden
|
|
499
493
|
*/
|
|
500
494
|
initFromData(data) {
|
|
501
|
-
|
|
495
|
+
let addNode = nodeData => {
|
|
502
496
|
this.setData(nodeData);
|
|
503
497
|
if (isNodeRecordWithChildren(nodeData) && nodeData.children.length) {
|
|
504
498
|
addChildren(nodeData.children);
|
|
505
499
|
}
|
|
506
500
|
};
|
|
507
|
-
|
|
508
|
-
for (
|
|
509
|
-
|
|
501
|
+
let addChildren = childrenData => {
|
|
502
|
+
for (let child of childrenData) {
|
|
503
|
+
let node = this._createNode();
|
|
510
504
|
node.initFromData(child);
|
|
511
505
|
this.addChild(node);
|
|
512
506
|
}
|
|
@@ -553,9 +547,9 @@ class Node {
|
|
|
553
547
|
* @group Searching
|
|
554
548
|
*/
|
|
555
549
|
iterate(callback) {
|
|
556
|
-
|
|
557
|
-
for (
|
|
558
|
-
|
|
550
|
+
let _iterate = (node, level) => {
|
|
551
|
+
for (let child of node.children) {
|
|
552
|
+
let result = callback(child, level);
|
|
559
553
|
if (result && child.hasChildren()) {
|
|
560
554
|
_iterate(child, level + 1);
|
|
561
555
|
}
|
|
@@ -571,8 +565,8 @@ class Node {
|
|
|
571
565
|
*/
|
|
572
566
|
loadFromData(data) {
|
|
573
567
|
this.removeChildren();
|
|
574
|
-
for (
|
|
575
|
-
|
|
568
|
+
for (let childData of data) {
|
|
569
|
+
let node = this._createNode(childData);
|
|
576
570
|
this.addChild(node);
|
|
577
571
|
if (isNodeRecordWithChildren(childData)) {
|
|
578
572
|
node.loadFromData(childData.children);
|
|
@@ -594,32 +588,31 @@ class Node {
|
|
|
594
588
|
// - Node is parent of target node
|
|
595
589
|
// - Or, parent is empty
|
|
596
590
|
return false;
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
}
|
|
606
|
-
return false;
|
|
607
|
-
}
|
|
608
|
-
case "before":
|
|
609
|
-
{
|
|
610
|
-
if (targetNode.parent) {
|
|
611
|
-
targetNode.parent.addChildAtPosition(movedNode, targetNode.parent.getChildIndex(targetNode));
|
|
612
|
-
return true;
|
|
613
|
-
}
|
|
614
|
-
return false;
|
|
591
|
+
}
|
|
592
|
+
movedNode.parent._doRemoveChild(movedNode);
|
|
593
|
+
switch (position) {
|
|
594
|
+
case "after":
|
|
595
|
+
{
|
|
596
|
+
if (targetNode.parent) {
|
|
597
|
+
targetNode.parent.addChildAtPosition(movedNode, targetNode.parent.getChildIndex(targetNode) + 1);
|
|
598
|
+
return true;
|
|
615
599
|
}
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
600
|
+
return false;
|
|
601
|
+
}
|
|
602
|
+
case "before":
|
|
603
|
+
{
|
|
604
|
+
if (targetNode.parent) {
|
|
605
|
+
targetNode.parent.addChildAtPosition(movedNode, targetNode.parent.getChildIndex(targetNode));
|
|
620
606
|
return true;
|
|
621
607
|
}
|
|
622
|
-
|
|
608
|
+
return false;
|
|
609
|
+
}
|
|
610
|
+
case "inside":
|
|
611
|
+
{
|
|
612
|
+
// move inside as first child
|
|
613
|
+
targetNode.addChildAtPosition(movedNode, 0);
|
|
614
|
+
return true;
|
|
615
|
+
}
|
|
623
616
|
}
|
|
624
617
|
}
|
|
625
618
|
|
|
@@ -630,7 +623,7 @@ class Node {
|
|
|
630
623
|
* @group Changing the tree
|
|
631
624
|
*/
|
|
632
625
|
prepend(nodeInfo) {
|
|
633
|
-
|
|
626
|
+
let node = this._createNode(nodeInfo);
|
|
634
627
|
this.addChildAtPosition(node, 0);
|
|
635
628
|
node._loadChildrenFromData(nodeInfo);
|
|
636
629
|
return node;
|
|
@@ -642,10 +635,11 @@ class Node {
|
|
|
642
635
|
* @group Changing the tree
|
|
643
636
|
*/
|
|
644
637
|
remove() {
|
|
645
|
-
if (this.parent) {
|
|
646
|
-
|
|
647
|
-
this.parent = null;
|
|
638
|
+
if (!this.parent) {
|
|
639
|
+
return;
|
|
648
640
|
}
|
|
641
|
+
this.parent.removeChild(this);
|
|
642
|
+
this.parent = null;
|
|
649
643
|
}
|
|
650
644
|
|
|
651
645
|
/**
|
|
@@ -672,7 +666,9 @@ class Node {
|
|
|
672
666
|
this.children = [];
|
|
673
667
|
}
|
|
674
668
|
|
|
675
|
-
/**
|
|
669
|
+
/**
|
|
670
|
+
@hidden
|
|
671
|
+
*/
|
|
676
672
|
removeNodeFromIndex(node) {
|
|
677
673
|
if (node.id != null) {
|
|
678
674
|
this.idMapping?.delete(node.id);
|
|
@@ -689,27 +685,29 @@ class Node {
|
|
|
689
685
|
setData(o) {
|
|
690
686
|
if (!o) {
|
|
691
687
|
return;
|
|
692
|
-
}
|
|
688
|
+
}
|
|
689
|
+
if (typeof o === "string") {
|
|
693
690
|
this.name = o;
|
|
694
691
|
} else if (typeof o === "object") {
|
|
695
|
-
for (
|
|
696
|
-
if (Object.prototype.hasOwnProperty.call(o, key)) {
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
// You can't update the children or the parent using this function
|
|
705
|
-
this[key] = value;
|
|
692
|
+
for (let key in o) {
|
|
693
|
+
if (!Object.prototype.hasOwnProperty.call(o, key)) {
|
|
694
|
+
continue;
|
|
695
|
+
}
|
|
696
|
+
let value = o[key];
|
|
697
|
+
if (key === "label" || key === "name") {
|
|
698
|
+
// You can use the 'label' key instead of 'name'; this is a legacy feature
|
|
699
|
+
if (typeof value === "string") {
|
|
700
|
+
this.name = value;
|
|
706
701
|
}
|
|
702
|
+
} else if (key !== "children" && key !== "parent") {
|
|
703
|
+
// You can't update the children or the parent using this function
|
|
704
|
+
this[key] = value;
|
|
707
705
|
}
|
|
708
706
|
}
|
|
709
707
|
}
|
|
710
708
|
}
|
|
711
709
|
_createNode(nodeData) {
|
|
712
|
-
|
|
710
|
+
let nodeClass = this._getNodeClass();
|
|
713
711
|
return new nodeClass(nodeData);
|
|
714
712
|
}
|
|
715
713
|
_doRemoveChild(node) {
|