tree-element 0.1.1 → 0.2.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 +33 -29
- package/lib/animation.js +5 -5
- 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.map +1 -1
- package/lib/dataLoader.js +14 -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 +9 -12
- 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 +90 -114
- package/lib/dragAndDropHandler/index.js.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.js +10 -10
- package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
- package/lib/dragAndDropHandler/types.d.ts.map +1 -1
- package/lib/elementsRenderer.d.ts +15 -6
- package/lib/elementsRenderer.d.ts.map +1 -1
- package/lib/elementsRenderer.js +157 -121
- package/lib/elementsRenderer.js.map +1 -1
- package/lib/events.d.ts.map +1 -1
- package/lib/index.d.ts +5 -5
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +249 -252
- package/lib/index.js.map +1 -1
- package/lib/keyHandler.d.ts +2 -3
- package/lib/keyHandler.d.ts.map +1 -1
- package/lib/keyHandler.js +26 -25
- package/lib/keyHandler.js.map +1 -1
- package/lib/methodTypes.d.ts +1 -1
- package/lib/methodTypes.d.ts.map +1 -1
- package/lib/mouseHandler.d.ts.map +1 -1
- package/lib/mouseHandler.js +26 -42
- 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 +2 -1
- package/lib/node.d.ts.map +1 -1
- package/lib/node.js +36 -35
- 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 +7 -4
- package/lib/nodeElement/folderElement.d.ts.map +1 -1
- package/lib/nodeElement/folderElement.js +61 -42
- package/lib/nodeElement/folderElement.js.map +1 -1
- package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
- package/lib/nodeElement/ghostDropHint.js +5 -9
- 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 +34 -26
- 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.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 +4 -6
- package/lib/requestUrl.js.map +1 -1
- package/lib/saveStateHandler.d.ts.map +1 -1
- package/lib/saveStateHandler.js +38 -48
- package/lib/saveStateHandler.js.map +1 -1
- package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/containerScrollParent.js +9 -11
- package/lib/scrollHandler/containerScrollParent.js.map +1 -1
- package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/createScrollParent.js +10 -10
- package/lib/scrollHandler/createScrollParent.js.map +1 -1
- package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/documentScrollParent.js +16 -19
- package/lib/scrollHandler/documentScrollParent.js.map +1 -1
- package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/scrollParent.js +11 -17
- 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 +2 -2
- package/lib/selectNodeHandler.d.ts.map +1 -1
- package/lib/selectNodeHandler.js +45 -54
- package/lib/selectNodeHandler.js.map +1 -1
- package/lib/setDefaultOptions.d.ts.map +1 -1
- package/lib/setDefaultOptions.js +23 -28
- 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 +5 -3
- package/src/animation.ts +1 -1
- package/src/classNames.ts +52 -52
- package/src/dataLoader.ts +68 -71
- package/src/dragAndDropHandler/binarySearch.ts +17 -17
- package/src/dragAndDropHandler/dragElement.ts +50 -50
- package/src/dragAndDropHandler/generateHitAreas.ts +156 -161
- package/src/dragAndDropHandler/index.ts +342 -351
- package/src/dragAndDropHandler/iterateVisibleNodes.ts +59 -63
- package/src/dragAndDropHandler/types.ts +5 -5
- package/src/elementsRenderer.ts +351 -298
- package/src/events.ts +216 -216
- package/src/header.txt +1 -1
- package/src/index.ts +52 -82
- package/src/keyHandler.ts +125 -115
- package/src/methodTypes.ts +4 -7
- package/src/mouseHandler.ts +314 -317
- package/src/mouseUtils.ts +14 -14
- package/src/node.ts +761 -766
- package/src/nodeElement/borderDropHint.ts +25 -25
- package/src/nodeElement/folderElement.ts +135 -112
- package/src/nodeElement/ghostDropHint.ts +62 -62
- package/src/nodeElement/index.ts +88 -74
- package/src/nodeUtils.ts +5 -5
- package/src/options.ts +6 -2
- package/src/requestUrl.ts +3 -3
- package/src/saveStateHandler.ts +204 -206
- package/src/scrollHandler/containerScrollParent.ts +49 -52
- package/src/scrollHandler/createScrollParent.ts +27 -27
- package/src/scrollHandler/documentScrollParent.ts +70 -70
- package/src/scrollHandler/scrollParent.ts +98 -98
- package/src/scrollHandler.ts +45 -45
- package/src/selectNodeHandler.ts +176 -166
- package/src/setDefaultOptions.ts +25 -22
- package/src/triggerCustomEvent.ts +7 -3
- package/src/util.ts +2 -2
- package/src/version.ts +1 -1
- package/tree_element.debug.js +3752 -3784
- package/tree_element.debug.js.map +1 -1
- package/tree_element.js +2 -2
- package/tree_element.js.map +1 -1
package/lib/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
|
|
2
|
+
Tree-element 0.2.0
|
|
3
3
|
|
|
4
4
|
Copyright 2026 Marco Braak
|
|
5
5
|
|
|
@@ -41,8 +41,6 @@ import version from './version.js';
|
|
|
41
41
|
// as its global, instead of an object of named exports.
|
|
42
42
|
|
|
43
43
|
class TreeElement {
|
|
44
|
-
/** @hidden */
|
|
45
|
-
tree;
|
|
46
44
|
_classNames;
|
|
47
45
|
_dataLoader;
|
|
48
46
|
_dndHandler;
|
|
@@ -56,6 +54,7 @@ class TreeElement {
|
|
|
56
54
|
_saveStateHandler;
|
|
57
55
|
_scrollHandler;
|
|
58
56
|
_selectNodeHandler;
|
|
57
|
+
_tree;
|
|
59
58
|
_triggerEventProvider;
|
|
60
59
|
|
|
61
60
|
/** @hidden */
|
|
@@ -69,9 +68,9 @@ class TreeElement {
|
|
|
69
68
|
this._classNames = createClassNames(this._options);
|
|
70
69
|
this._triggerEventProvider = overrideTriggerEventProvider ?? triggerCustomEvent;
|
|
71
70
|
this._isInitialized = false;
|
|
72
|
-
this.
|
|
71
|
+
this._tree = new Node({}, true);
|
|
73
72
|
this._nodeMap = new WeakMap();
|
|
74
|
-
|
|
73
|
+
let {
|
|
75
74
|
autoEscape,
|
|
76
75
|
buttonLeft,
|
|
77
76
|
closedIcon,
|
|
@@ -94,125 +93,125 @@ class TreeElement {
|
|
|
94
93
|
slide,
|
|
95
94
|
tabIndex
|
|
96
95
|
} = this._options;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
saveStateHandler.
|
|
96
|
+
let classNames = this._classNames;
|
|
97
|
+
let closeNode = this.closeNode.bind(this);
|
|
98
|
+
let getNodeElement = this._getNodeElement.bind(this);
|
|
99
|
+
let getNodeElementForNode = this._getNodeElementForNode.bind(this);
|
|
100
|
+
let getNodeById = this.getNodeById.bind(this);
|
|
101
|
+
let getSelectedNode = this.getSelectedNode.bind(this);
|
|
102
|
+
let getTree = this.getTree.bind(this);
|
|
103
|
+
let isFocusOnTree = this._isFocusOnTree.bind(this);
|
|
104
|
+
let loadData = this.loadData.bind(this);
|
|
105
|
+
let openNode = this.openNode.bind(this);
|
|
106
|
+
let openParents = this._openParents.bind(this);
|
|
107
|
+
let refreshElements = this._refreshElements.bind(this);
|
|
108
|
+
let refreshHitAreas = this.refreshHitAreas.bind(this);
|
|
109
|
+
let setNodeElement = this._setNodeElement.bind(this);
|
|
110
|
+
let treeElement = this._htmlElement;
|
|
111
|
+
let triggerEvent = this._triggerEvent.bind(this);
|
|
112
|
+
let saveState = () => {
|
|
113
|
+
saveStateHandler._saveState();
|
|
115
114
|
};
|
|
116
|
-
|
|
117
|
-
getNodeById,
|
|
118
|
-
getNodeElementForNode,
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
openParents,
|
|
122
|
-
saveState,
|
|
123
|
-
triggerEvent
|
|
115
|
+
let selectNodeHandler = new SelectNodeHandler({
|
|
116
|
+
_getNodeById: getNodeById,
|
|
117
|
+
_getNodeElementForNode: getNodeElementForNode,
|
|
118
|
+
_getOnCanSelectNode: () => this._options.onCanSelectNode,
|
|
119
|
+
_getSelectable: () => this._options.selectable,
|
|
120
|
+
_openParents: openParents,
|
|
121
|
+
_saveState: saveState,
|
|
122
|
+
_triggerEvent: triggerEvent
|
|
124
123
|
});
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
classNames,
|
|
133
|
-
dataFilter,
|
|
134
|
-
loadData,
|
|
135
|
-
treeElement,
|
|
136
|
-
triggerEvent
|
|
124
|
+
let addToSelection = selectNodeHandler._addToSelection.bind(selectNodeHandler);
|
|
125
|
+
let getSelectedNodes = selectNodeHandler._getSelectedNodes.bind(selectNodeHandler);
|
|
126
|
+
let isNodeSelected = selectNodeHandler._isNodeSelected.bind(selectNodeHandler);
|
|
127
|
+
let removeFromSelection = selectNodeHandler._removeFromSelection.bind(selectNodeHandler);
|
|
128
|
+
let selectNode = selectNodeHandler._selectSingleNode.bind(selectNodeHandler);
|
|
129
|
+
let getMouseDelay = () => this._options.startDndDelay ?? 0;
|
|
130
|
+
let dataLoader = new DataLoader({
|
|
131
|
+
_classNames: classNames,
|
|
132
|
+
_dataFilter: dataFilter,
|
|
133
|
+
_loadData: loadData,
|
|
134
|
+
_treeElement: treeElement,
|
|
135
|
+
_triggerEvent: triggerEvent
|
|
137
136
|
});
|
|
138
|
-
|
|
139
|
-
addToSelection,
|
|
140
|
-
getNodeById,
|
|
141
|
-
getSelectedNodes,
|
|
142
|
-
getTree,
|
|
143
|
-
onGetStateFromStorage,
|
|
144
|
-
onSetStateFromStorage,
|
|
145
|
-
openNode,
|
|
146
|
-
refreshElements,
|
|
147
|
-
removeFromSelection,
|
|
148
|
-
|
|
137
|
+
let saveStateHandler = new SaveStateHandler({
|
|
138
|
+
_addToSelection: addToSelection,
|
|
139
|
+
_getNodeById: getNodeById,
|
|
140
|
+
_getSelectedNodes: getSelectedNodes,
|
|
141
|
+
_getTree: getTree,
|
|
142
|
+
_onGetStateFromStorage: onGetStateFromStorage,
|
|
143
|
+
_onSetStateFromStorage: onSetStateFromStorage,
|
|
144
|
+
_openNode: openNode,
|
|
145
|
+
_refreshElements: refreshElements,
|
|
146
|
+
_removeFromSelection: removeFromSelection,
|
|
147
|
+
_saveState: saveStateOption
|
|
149
148
|
});
|
|
150
|
-
|
|
151
|
-
refreshHitAreas,
|
|
152
|
-
treeElement
|
|
149
|
+
let scrollHandler = new ScrollHandler({
|
|
150
|
+
_refreshHitAreas: refreshHitAreas,
|
|
151
|
+
_treeElement: treeElement
|
|
153
152
|
});
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
autoEscape,
|
|
157
|
-
classNames,
|
|
158
|
-
getNodeElement,
|
|
159
|
-
getNodeElementForNode,
|
|
160
|
-
getScrollLeft,
|
|
161
|
-
getTree,
|
|
162
|
-
onCanMove,
|
|
163
|
-
onCanMoveTo,
|
|
164
|
-
onDragMove,
|
|
165
|
-
onDragStop,
|
|
166
|
-
onIsMoveHandle,
|
|
167
|
-
openFolderDelay,
|
|
168
|
-
openNode,
|
|
169
|
-
refreshElements,
|
|
170
|
-
slide,
|
|
171
|
-
treeElement,
|
|
172
|
-
triggerEvent
|
|
153
|
+
let getScrollLeft = scrollHandler._getScrollLeft.bind(scrollHandler);
|
|
154
|
+
let dndHandler = new DragAndDropHandler({
|
|
155
|
+
_autoEscape: autoEscape,
|
|
156
|
+
_classNames: classNames,
|
|
157
|
+
_getNodeElement: getNodeElement,
|
|
158
|
+
_getNodeElementForNode: getNodeElementForNode,
|
|
159
|
+
_getScrollLeft: getScrollLeft,
|
|
160
|
+
_getTree: getTree,
|
|
161
|
+
_onCanMove: onCanMove,
|
|
162
|
+
_onCanMoveTo: onCanMoveTo,
|
|
163
|
+
_onDragMove: onDragMove,
|
|
164
|
+
_onDragStop: onDragStop,
|
|
165
|
+
_onIsMoveHandle: onIsMoveHandle,
|
|
166
|
+
_openFolderDelay: openFolderDelay,
|
|
167
|
+
_openNode: openNode,
|
|
168
|
+
_refreshElements: refreshElements,
|
|
169
|
+
_slide: slide,
|
|
170
|
+
_treeElement: treeElement,
|
|
171
|
+
_triggerEvent: triggerEvent
|
|
173
172
|
});
|
|
174
|
-
|
|
175
|
-
closeNode,
|
|
176
|
-
getSelectedNode,
|
|
177
|
-
isFocusOnTree,
|
|
178
|
-
keyboardSupport,
|
|
179
|
-
openNode,
|
|
180
|
-
selectNode
|
|
173
|
+
let keyHandler = new KeyHandler({
|
|
174
|
+
_closeNode: closeNode,
|
|
175
|
+
_getSelectedNode: getSelectedNode,
|
|
176
|
+
_isFocusOnTree: isFocusOnTree,
|
|
177
|
+
_keyboardSupport: keyboardSupport,
|
|
178
|
+
_openNode: openNode,
|
|
179
|
+
_selectNode: selectNode
|
|
181
180
|
});
|
|
182
|
-
|
|
183
|
-
autoEscape,
|
|
184
|
-
buttonLeft,
|
|
185
|
-
classNames,
|
|
186
|
-
closedIcon,
|
|
187
|
-
dragAndDrop,
|
|
188
|
-
getTree,
|
|
189
|
-
|
|
190
|
-
isNodeSelected,
|
|
191
|
-
onCreateLi,
|
|
192
|
-
openedIcon,
|
|
193
|
-
rtl,
|
|
194
|
-
setNodeElement,
|
|
195
|
-
showEmptyFolder,
|
|
196
|
-
tabIndex
|
|
181
|
+
let renderer = new ElementsRenderer({
|
|
182
|
+
_autoEscape: autoEscape,
|
|
183
|
+
_buttonLeft: buttonLeft,
|
|
184
|
+
_classNames: classNames,
|
|
185
|
+
_closedIcon: closedIcon,
|
|
186
|
+
_dragAndDrop: dragAndDrop,
|
|
187
|
+
_getTree: getTree,
|
|
188
|
+
_htmlElement: treeElement,
|
|
189
|
+
_isNodeSelected: isNodeSelected,
|
|
190
|
+
_onCreateLi: onCreateLi,
|
|
191
|
+
_openedIcon: openedIcon,
|
|
192
|
+
_rtl: rtl,
|
|
193
|
+
_setNodeElement: setNodeElement,
|
|
194
|
+
_showEmptyFolder: showEmptyFolder,
|
|
195
|
+
_tabIndex: tabIndex
|
|
197
196
|
});
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
classNames,
|
|
205
|
-
|
|
206
|
-
getMouseDelay,
|
|
207
|
-
getNode,
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
onMouseCapture,
|
|
211
|
-
onMouseDrag,
|
|
212
|
-
onMouseStart,
|
|
213
|
-
onMouseStop,
|
|
214
|
-
triggerEvent,
|
|
215
|
-
|
|
197
|
+
let getNode = this.getNode.bind(this);
|
|
198
|
+
let onMouseCapture = this._mouseCapture.bind(this);
|
|
199
|
+
let onMouseDrag = this._mouseDrag.bind(this);
|
|
200
|
+
let onMouseStart = this._mouseStart.bind(this);
|
|
201
|
+
let onMouseStop = this._mouseStop.bind(this);
|
|
202
|
+
let mouseHandler = new MouseHandler({
|
|
203
|
+
_classNames: classNames,
|
|
204
|
+
_element: treeElement,
|
|
205
|
+
_getMouseDelay: getMouseDelay,
|
|
206
|
+
_getNode: getNode,
|
|
207
|
+
_onClickButton: this.toggle.bind(this),
|
|
208
|
+
_onClickTitle: selectNode,
|
|
209
|
+
_onMouseCapture: onMouseCapture,
|
|
210
|
+
_onMouseDrag: onMouseDrag,
|
|
211
|
+
_onMouseStart: onMouseStart,
|
|
212
|
+
_onMouseStop: onMouseStop,
|
|
213
|
+
_triggerEvent: triggerEvent,
|
|
214
|
+
_useContextMenu: this._options.useContextMenu
|
|
216
215
|
});
|
|
217
216
|
this._dataLoader = dataLoader;
|
|
218
217
|
this._dndHandler = dndHandler;
|
|
@@ -232,7 +231,7 @@ class TreeElement {
|
|
|
232
231
|
* @group Changing the tree
|
|
233
232
|
*/
|
|
234
233
|
addNodeAfter(nodeData, existingNode) {
|
|
235
|
-
|
|
234
|
+
let newNode = existingNode.addAfter(nodeData);
|
|
236
235
|
if (newNode) {
|
|
237
236
|
this._refreshElements(existingNode.parent);
|
|
238
237
|
}
|
|
@@ -246,7 +245,7 @@ class TreeElement {
|
|
|
246
245
|
* @group Changing the tree
|
|
247
246
|
*/
|
|
248
247
|
addNodeBefore(nodeData, existingNode) {
|
|
249
|
-
|
|
248
|
+
let newNode = existingNode.addBefore(nodeData);
|
|
250
249
|
if (newNode) {
|
|
251
250
|
this._refreshElements(existingNode.parent);
|
|
252
251
|
}
|
|
@@ -261,7 +260,7 @@ class TreeElement {
|
|
|
261
260
|
* @group Changing the tree
|
|
262
261
|
*/
|
|
263
262
|
addParentNode(nodeData, existingNode) {
|
|
264
|
-
|
|
263
|
+
let newNode = existingNode.addParent(nodeData);
|
|
265
264
|
if (newNode) {
|
|
266
265
|
this._refreshElements(newNode.parent);
|
|
267
266
|
}
|
|
@@ -275,9 +274,9 @@ class TreeElement {
|
|
|
275
274
|
* @group Selection
|
|
276
275
|
*/
|
|
277
276
|
addToSelection(node, mustSetFocus) {
|
|
278
|
-
this._selectNodeHandler.
|
|
277
|
+
this._selectNodeHandler._addToSelection(node);
|
|
279
278
|
this._openParents(node);
|
|
280
|
-
this._getNodeElementForNode(node).
|
|
279
|
+
this._getNodeElementForNode(node)._select(mustSetFocus ?? true);
|
|
281
280
|
this._saveState();
|
|
282
281
|
}
|
|
283
282
|
|
|
@@ -293,7 +292,7 @@ class TreeElement {
|
|
|
293
292
|
* @group Changing the tree
|
|
294
293
|
*/
|
|
295
294
|
appendNode(nodeData, parentNode) {
|
|
296
|
-
|
|
295
|
+
let node = parentNode.append(nodeData);
|
|
297
296
|
this._refreshElements(parentNode);
|
|
298
297
|
return node;
|
|
299
298
|
}
|
|
@@ -306,7 +305,7 @@ class TreeElement {
|
|
|
306
305
|
*/
|
|
307
306
|
closeNode(node, slide) {
|
|
308
307
|
if (node.isFolder() || node.isEmptyFolder) {
|
|
309
|
-
this._createFolderElement(node).
|
|
308
|
+
this._createFolderElement(node)._close(slide ?? this._options.slide, this._options.animationSpeed);
|
|
310
309
|
this._saveState();
|
|
311
310
|
}
|
|
312
311
|
}
|
|
@@ -318,11 +317,11 @@ class TreeElement {
|
|
|
318
317
|
* @group Other
|
|
319
318
|
*/
|
|
320
319
|
deinit() {
|
|
321
|
-
this._htmlElement.textContent =
|
|
322
|
-
this._dataLoader.
|
|
323
|
-
this._keyHandler.
|
|
324
|
-
this._mouseHandler.
|
|
325
|
-
this.
|
|
320
|
+
this._htmlElement.textContent = "";
|
|
321
|
+
this._dataLoader._deinit();
|
|
322
|
+
this._keyHandler._deinit();
|
|
323
|
+
this._mouseHandler._deinit();
|
|
324
|
+
this._tree = new Node({}, true);
|
|
326
325
|
}
|
|
327
326
|
|
|
328
327
|
/**
|
|
@@ -331,7 +330,7 @@ class TreeElement {
|
|
|
331
330
|
* @group Finding nodes
|
|
332
331
|
*/
|
|
333
332
|
getNode(element) {
|
|
334
|
-
|
|
333
|
+
let liElement = element.closest(`li.${this._classNames.common}`);
|
|
335
334
|
if (liElement) {
|
|
336
335
|
return this._nodeMap.get(liElement) ?? null;
|
|
337
336
|
} else {
|
|
@@ -350,7 +349,7 @@ class TreeElement {
|
|
|
350
349
|
* @group Finding nodes
|
|
351
350
|
*/
|
|
352
351
|
getNodeByCallback(callback) {
|
|
353
|
-
return this.
|
|
352
|
+
return this._tree.getNodeByCallback(callback);
|
|
354
353
|
}
|
|
355
354
|
|
|
356
355
|
/**
|
|
@@ -364,7 +363,7 @@ class TreeElement {
|
|
|
364
363
|
* @group Finding nodes
|
|
365
364
|
*/
|
|
366
365
|
getNodeById(id) {
|
|
367
|
-
return this.
|
|
366
|
+
return this._tree.getNodeById(id);
|
|
368
367
|
}
|
|
369
368
|
|
|
370
369
|
/**
|
|
@@ -373,7 +372,7 @@ class TreeElement {
|
|
|
373
372
|
* @group Finding nodes
|
|
374
373
|
*/
|
|
375
374
|
getNodeByName(name) {
|
|
376
|
-
return this.
|
|
375
|
+
return this._tree.getNodeByName(name);
|
|
377
376
|
}
|
|
378
377
|
|
|
379
378
|
/**
|
|
@@ -383,7 +382,7 @@ class TreeElement {
|
|
|
383
382
|
* @group Finding nodes
|
|
384
383
|
*/
|
|
385
384
|
getNodeByNameMustExist(name) {
|
|
386
|
-
return this.
|
|
385
|
+
return this._tree.getNodeByNameMustExist(name);
|
|
387
386
|
}
|
|
388
387
|
|
|
389
388
|
/**
|
|
@@ -397,16 +396,16 @@ class TreeElement {
|
|
|
397
396
|
* @group Finding nodes
|
|
398
397
|
*/
|
|
399
398
|
getNodesByProperty(key, value) {
|
|
400
|
-
return this.
|
|
399
|
+
return this._tree.getNodesByProperty(key, value);
|
|
401
400
|
}
|
|
402
401
|
|
|
403
402
|
/**
|
|
404
|
-
* Returns the selected node, or `
|
|
403
|
+
* Returns the selected node, or `null` when nothing is selected.
|
|
405
404
|
*
|
|
406
405
|
* @group Selection
|
|
407
406
|
*/
|
|
408
407
|
getSelectedNode() {
|
|
409
|
-
return this._selectNodeHandler.
|
|
408
|
+
return this._selectNodeHandler._getSelectedNode();
|
|
410
409
|
}
|
|
411
410
|
|
|
412
411
|
/**
|
|
@@ -415,7 +414,7 @@ class TreeElement {
|
|
|
415
414
|
* @group Selection
|
|
416
415
|
*/
|
|
417
416
|
getSelectedNodes() {
|
|
418
|
-
return this._selectNodeHandler.
|
|
417
|
+
return this._selectNodeHandler._getSelectedNodes();
|
|
419
418
|
}
|
|
420
419
|
|
|
421
420
|
/**
|
|
@@ -425,7 +424,7 @@ class TreeElement {
|
|
|
425
424
|
* @group State
|
|
426
425
|
*/
|
|
427
426
|
getState() {
|
|
428
|
-
return this._saveStateHandler.
|
|
427
|
+
return this._saveStateHandler._getState();
|
|
429
428
|
}
|
|
430
429
|
|
|
431
430
|
/**
|
|
@@ -434,7 +433,7 @@ class TreeElement {
|
|
|
434
433
|
* @group State
|
|
435
434
|
*/
|
|
436
435
|
getStateFromStorage() {
|
|
437
|
-
return this._saveStateHandler.
|
|
436
|
+
return this._saveStateHandler._getStateFromStorage();
|
|
438
437
|
}
|
|
439
438
|
|
|
440
439
|
/**
|
|
@@ -444,7 +443,7 @@ class TreeElement {
|
|
|
444
443
|
* @group Finding nodes
|
|
445
444
|
*/
|
|
446
445
|
getTree() {
|
|
447
|
-
return this.
|
|
446
|
+
return this._tree;
|
|
448
447
|
}
|
|
449
448
|
|
|
450
449
|
/**
|
|
@@ -462,7 +461,7 @@ class TreeElement {
|
|
|
462
461
|
* @group Other
|
|
463
462
|
*/
|
|
464
463
|
isDragging() {
|
|
465
|
-
return this._dndHandler.
|
|
464
|
+
return this._dndHandler._isDragging;
|
|
466
465
|
}
|
|
467
466
|
|
|
468
467
|
/**
|
|
@@ -471,7 +470,7 @@ class TreeElement {
|
|
|
471
470
|
* @group Selection
|
|
472
471
|
*/
|
|
473
472
|
isNodeSelected(node) {
|
|
474
|
-
return this._selectNodeHandler.
|
|
473
|
+
return this._selectNodeHandler._isNodeSelected(node);
|
|
475
474
|
}
|
|
476
475
|
|
|
477
476
|
/**
|
|
@@ -490,7 +489,7 @@ class TreeElement {
|
|
|
490
489
|
this._initTree(data);
|
|
491
490
|
}
|
|
492
491
|
if (this.isDragging()) {
|
|
493
|
-
this._dndHandler.
|
|
492
|
+
this._dndHandler._refresh();
|
|
494
493
|
}
|
|
495
494
|
}
|
|
496
495
|
this._triggerEvent("tree.set_data", {
|
|
@@ -506,9 +505,9 @@ class TreeElement {
|
|
|
506
505
|
* @group Loading data
|
|
507
506
|
*/
|
|
508
507
|
async loadDataFromUrl(url, parentNode) {
|
|
509
|
-
|
|
508
|
+
let requestUrl = url ? new RequestUrl(url) : this._createRequestUrl(parentNode);
|
|
510
509
|
if (requestUrl) {
|
|
511
|
-
await this._dataLoader.
|
|
510
|
+
await this._dataLoader._loadFromUrl(requestUrl, parentNode);
|
|
512
511
|
}
|
|
513
512
|
}
|
|
514
513
|
|
|
@@ -518,10 +517,7 @@ class TreeElement {
|
|
|
518
517
|
* @group Selection
|
|
519
518
|
*/
|
|
520
519
|
moveDown() {
|
|
521
|
-
|
|
522
|
-
if (selectedNode) {
|
|
523
|
-
this._keyHandler.moveDown(selectedNode);
|
|
524
|
-
}
|
|
520
|
+
this._keyHandler._moveDown();
|
|
525
521
|
}
|
|
526
522
|
|
|
527
523
|
/**
|
|
@@ -536,7 +532,7 @@ class TreeElement {
|
|
|
536
532
|
* @group Changing the tree
|
|
537
533
|
*/
|
|
538
534
|
moveNode(node, targetNode, position) {
|
|
539
|
-
this.
|
|
535
|
+
this._tree.moveNode(node, targetNode, position);
|
|
540
536
|
this._refreshElements(null);
|
|
541
537
|
}
|
|
542
538
|
|
|
@@ -546,10 +542,7 @@ class TreeElement {
|
|
|
546
542
|
* @group Selection
|
|
547
543
|
*/
|
|
548
544
|
moveUp() {
|
|
549
|
-
|
|
550
|
-
if (selectedNode) {
|
|
551
|
-
this._keyHandler.moveUp(selectedNode);
|
|
552
|
-
}
|
|
545
|
+
this._keyHandler._moveUp();
|
|
553
546
|
}
|
|
554
547
|
|
|
555
548
|
/**
|
|
@@ -567,13 +560,13 @@ class TreeElement {
|
|
|
567
560
|
* @group Opening and closing
|
|
568
561
|
*/
|
|
569
562
|
async openNode(node, slide) {
|
|
570
|
-
|
|
571
|
-
|
|
563
|
+
let mustSlide = slide ?? this._options.slide;
|
|
564
|
+
let doOpenNode = async (openedNode, slideOption) => {
|
|
572
565
|
if (!node.children.length) {
|
|
573
566
|
return;
|
|
574
567
|
}
|
|
575
|
-
|
|
576
|
-
await folderElement.
|
|
568
|
+
let folderElement = this._createFolderElement(openedNode);
|
|
569
|
+
await folderElement._open(slideOption, this._options.animationSpeed);
|
|
577
570
|
};
|
|
578
571
|
if (node.isFolder() || node.isEmptyFolder) {
|
|
579
572
|
if (node.load_on_demand) {
|
|
@@ -600,7 +593,7 @@ class TreeElement {
|
|
|
600
593
|
* @group Changing the tree
|
|
601
594
|
*/
|
|
602
595
|
prependNode(nodeData, parentNode) {
|
|
603
|
-
|
|
596
|
+
let node = parentNode.prepend(nodeData);
|
|
604
597
|
this._refreshElements(parentNode);
|
|
605
598
|
return node;
|
|
606
599
|
}
|
|
@@ -622,7 +615,7 @@ class TreeElement {
|
|
|
622
615
|
* @group Other
|
|
623
616
|
*/
|
|
624
617
|
refreshHitAreas() {
|
|
625
|
-
this._dndHandler.
|
|
618
|
+
this._dndHandler._refresh();
|
|
626
619
|
}
|
|
627
620
|
|
|
628
621
|
/**
|
|
@@ -631,8 +624,8 @@ class TreeElement {
|
|
|
631
624
|
* @group Selection
|
|
632
625
|
*/
|
|
633
626
|
removeFromSelection(node) {
|
|
634
|
-
this._selectNodeHandler.
|
|
635
|
-
this._getNodeElementForNode(node).
|
|
627
|
+
this._selectNodeHandler._removeFromSelection(node);
|
|
628
|
+
this._getNodeElementForNode(node)._deselect();
|
|
636
629
|
this._saveState();
|
|
637
630
|
}
|
|
638
631
|
|
|
@@ -642,9 +635,9 @@ class TreeElement {
|
|
|
642
635
|
* @group Changing the tree
|
|
643
636
|
*/
|
|
644
637
|
removeNode(node) {
|
|
645
|
-
this._selectNodeHandler.
|
|
638
|
+
this._selectNodeHandler._removeFromSelection(node, true); // including children
|
|
646
639
|
|
|
647
|
-
|
|
640
|
+
let parent = node.parent;
|
|
648
641
|
node.remove();
|
|
649
642
|
this._refreshElements(parent);
|
|
650
643
|
}
|
|
@@ -658,8 +651,8 @@ class TreeElement {
|
|
|
658
651
|
if (!node.element) {
|
|
659
652
|
return;
|
|
660
653
|
}
|
|
661
|
-
|
|
662
|
-
this._scrollHandler.
|
|
654
|
+
let top = getOffsetTop(node.element) - getOffsetTop(this._htmlElement);
|
|
655
|
+
this._scrollHandler._scrollToY(top);
|
|
663
656
|
}
|
|
664
657
|
|
|
665
658
|
/**
|
|
@@ -675,10 +668,10 @@ class TreeElement {
|
|
|
675
668
|
if (!node) {
|
|
676
669
|
// Called with empty node -> deselect current node
|
|
677
670
|
this._deselectCurrentNode();
|
|
678
|
-
this._saveStateHandler.
|
|
671
|
+
this._saveStateHandler._saveState();
|
|
679
672
|
return;
|
|
680
673
|
}
|
|
681
|
-
this._selectNodeHandler.
|
|
674
|
+
this._selectNodeHandler._selectSingleNode(node, options);
|
|
682
675
|
}
|
|
683
676
|
|
|
684
677
|
/**
|
|
@@ -692,13 +685,15 @@ class TreeElement {
|
|
|
692
685
|
}
|
|
693
686
|
|
|
694
687
|
/**
|
|
695
|
-
* Applies a state to the tree
|
|
688
|
+
* Applies a state to the tree, and saves it to storage when `saveState` is
|
|
689
|
+
* enabled.
|
|
696
690
|
*
|
|
697
691
|
* @group State
|
|
698
692
|
*/
|
|
699
693
|
setState(state) {
|
|
700
|
-
this._saveStateHandler.
|
|
694
|
+
this._saveStateHandler._setInitialState(state);
|
|
701
695
|
this._refreshElements(null);
|
|
696
|
+
this._saveState();
|
|
702
697
|
}
|
|
703
698
|
|
|
704
699
|
/**
|
|
@@ -708,7 +703,7 @@ class TreeElement {
|
|
|
708
703
|
* @group Opening and closing
|
|
709
704
|
*/
|
|
710
705
|
toggle(node, slide = null) {
|
|
711
|
-
|
|
706
|
+
let mustSlide = slide ?? this._options.slide;
|
|
712
707
|
if (node.is_open) {
|
|
713
708
|
this.closeNode(node, mustSlide);
|
|
714
709
|
} else {
|
|
@@ -723,7 +718,7 @@ class TreeElement {
|
|
|
723
718
|
* @group Other
|
|
724
719
|
*/
|
|
725
720
|
toJson() {
|
|
726
|
-
return JSON.stringify(this.
|
|
721
|
+
return JSON.stringify(this._tree.getData());
|
|
727
722
|
}
|
|
728
723
|
|
|
729
724
|
/**
|
|
@@ -742,13 +737,13 @@ class TreeElement {
|
|
|
742
737
|
* @group Changing the tree
|
|
743
738
|
*/
|
|
744
739
|
updateNode(node, data) {
|
|
745
|
-
|
|
740
|
+
let idIsChanged = typeof data === "object" && data.id && data.id !== node.id;
|
|
746
741
|
if (idIsChanged) {
|
|
747
|
-
this.
|
|
742
|
+
this._tree.removeNodeFromIndex(node);
|
|
748
743
|
}
|
|
749
744
|
node.setData(data);
|
|
750
745
|
if (idIsChanged) {
|
|
751
|
-
this.
|
|
746
|
+
this._tree.addNodeToIndex(node);
|
|
752
747
|
}
|
|
753
748
|
if (typeof data === "object" && data.children && data.children instanceof Array) {
|
|
754
749
|
node.removeChildren();
|
|
@@ -759,44 +754,46 @@ class TreeElement {
|
|
|
759
754
|
this._refreshElements(node);
|
|
760
755
|
}
|
|
761
756
|
_createFolderElement(node) {
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
757
|
+
let classNames = this._classNames;
|
|
758
|
+
let closedIconElement = this._renderer._closedIconElement;
|
|
759
|
+
let getScrollLeft = this._scrollHandler._getScrollLeft.bind(this._scrollHandler);
|
|
760
|
+
let openedIconElement = this._renderer._openedIconElement;
|
|
761
|
+
let renderChildren = this._renderer._renderChildren.bind(this._renderer);
|
|
762
|
+
let tabIndex = this._options.tabIndex;
|
|
763
|
+
let treeElement = this._htmlElement;
|
|
764
|
+
let triggerEvent = this._triggerEvent.bind(this);
|
|
769
765
|
return new FolderElement({
|
|
770
|
-
classNames,
|
|
771
|
-
closedIconElement,
|
|
772
|
-
getScrollLeft,
|
|
773
|
-
node,
|
|
774
|
-
openedIconElement,
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
766
|
+
_classNames: classNames,
|
|
767
|
+
_closedIconElement: closedIconElement,
|
|
768
|
+
_getScrollLeft: getScrollLeft,
|
|
769
|
+
_node: node,
|
|
770
|
+
_openedIconElement: openedIconElement,
|
|
771
|
+
_renderChildren: renderChildren,
|
|
772
|
+
_tabIndex: tabIndex,
|
|
773
|
+
_treeElement: treeElement,
|
|
774
|
+
_triggerEvent: triggerEvent
|
|
778
775
|
});
|
|
779
776
|
}
|
|
780
777
|
_createNodeElement(node) {
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
778
|
+
let classNames = this._classNames;
|
|
779
|
+
let getScrollLeft = this._scrollHandler._getScrollLeft.bind(this._scrollHandler);
|
|
780
|
+
let tabIndex = this._options.tabIndex;
|
|
781
|
+
let treeElement = this._htmlElement;
|
|
785
782
|
return new NodeElement({
|
|
786
|
-
classNames,
|
|
787
|
-
getScrollLeft,
|
|
788
|
-
node,
|
|
789
|
-
tabIndex,
|
|
790
|
-
treeElement
|
|
783
|
+
_classNames: classNames,
|
|
784
|
+
_getScrollLeft: getScrollLeft,
|
|
785
|
+
_node: node,
|
|
786
|
+
_tabIndex: tabIndex,
|
|
787
|
+
_treeElement: treeElement
|
|
791
788
|
});
|
|
792
789
|
}
|
|
793
790
|
|
|
794
791
|
/* Create a RequestUrl based on the url in the options.
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
792
|
+
* Add a 'node' query parameter for loading on demand
|
|
793
|
+
* Add a 'selected_node' query parameter if a node is selected.
|
|
794
|
+
*/
|
|
798
795
|
_createRequestUrl(node) {
|
|
799
|
-
|
|
796
|
+
let dataUrl = this._options.dataUrl;
|
|
800
797
|
let url;
|
|
801
798
|
if (typeof dataUrl === "function") {
|
|
802
799
|
url = dataUrl(node);
|
|
@@ -806,21 +803,21 @@ class TreeElement {
|
|
|
806
803
|
if (!url) {
|
|
807
804
|
return null;
|
|
808
805
|
}
|
|
809
|
-
|
|
806
|
+
let requestUrl = new RequestUrl(url);
|
|
810
807
|
if (node?.id) {
|
|
811
808
|
// Load on demand of a subtree; add node parameter
|
|
812
|
-
requestUrl.
|
|
809
|
+
requestUrl._setSearchParam("node", node.id.toString());
|
|
813
810
|
} else {
|
|
814
811
|
// Add selected_node parameter
|
|
815
|
-
|
|
812
|
+
let selectedNodeId = this._getNodeIdToBeSelected();
|
|
816
813
|
if (selectedNodeId) {
|
|
817
|
-
requestUrl.
|
|
814
|
+
requestUrl._setSearchParam("selected_node", selectedNodeId.toString());
|
|
818
815
|
}
|
|
819
816
|
}
|
|
820
817
|
return requestUrl;
|
|
821
818
|
}
|
|
822
819
|
_deselectCurrentNode() {
|
|
823
|
-
|
|
820
|
+
let node = this.getSelectedNode();
|
|
824
821
|
if (node) {
|
|
825
822
|
this.removeFromSelection(node);
|
|
826
823
|
}
|
|
@@ -828,9 +825,9 @@ class TreeElement {
|
|
|
828
825
|
|
|
829
826
|
// Deselect the children of the node.
|
|
830
827
|
_deselectNodes(parentNode) {
|
|
831
|
-
|
|
832
|
-
for (
|
|
833
|
-
this._selectNodeHandler.
|
|
828
|
+
let selectedNodesUnderParent = this._selectNodeHandler._getSelectedNodesUnder(parentNode);
|
|
829
|
+
for (let n of selectedNodesUnderParent) {
|
|
830
|
+
this._selectNodeHandler._removeFromSelection(n);
|
|
834
831
|
}
|
|
835
832
|
}
|
|
836
833
|
|
|
@@ -848,7 +845,7 @@ class TreeElement {
|
|
|
848
845
|
return 0;
|
|
849
846
|
}
|
|
850
847
|
_getNodeElement(element) {
|
|
851
|
-
|
|
848
|
+
let node = this.getNode(element);
|
|
852
849
|
if (node) {
|
|
853
850
|
return this._getNodeElementForNode(node);
|
|
854
851
|
} else {
|
|
@@ -863,13 +860,13 @@ class TreeElement {
|
|
|
863
860
|
}
|
|
864
861
|
}
|
|
865
862
|
_getNodeIdToBeSelected() {
|
|
866
|
-
return this._saveStateHandler.
|
|
863
|
+
return this._saveStateHandler._getNodeIdToBeSelected();
|
|
867
864
|
}
|
|
868
865
|
_initData() {
|
|
869
866
|
if (this._options.data) {
|
|
870
867
|
this.loadData(this._options.data);
|
|
871
868
|
} else {
|
|
872
|
-
|
|
869
|
+
let dataUrl = this._createRequestUrl();
|
|
873
870
|
if (dataUrl) {
|
|
874
871
|
void this.loadDataFromUrl();
|
|
875
872
|
} else {
|
|
@@ -878,16 +875,16 @@ class TreeElement {
|
|
|
878
875
|
}
|
|
879
876
|
}
|
|
880
877
|
_initTree(data) {
|
|
881
|
-
|
|
878
|
+
let doInit = () => {
|
|
882
879
|
if (!this._isInitialized) {
|
|
883
880
|
this._isInitialized = true;
|
|
884
881
|
this._triggerEvent("tree.init");
|
|
885
882
|
}
|
|
886
883
|
};
|
|
887
|
-
this.
|
|
888
|
-
this._selectNodeHandler.
|
|
889
|
-
this.
|
|
890
|
-
|
|
884
|
+
this._tree = new this._options.nodeClass(null, true, this._options.nodeClass);
|
|
885
|
+
this._selectNodeHandler._clear();
|
|
886
|
+
this._tree.loadFromData(data);
|
|
887
|
+
let mustLoadOnDemand = this._setInitialState();
|
|
891
888
|
this._refreshElements(null);
|
|
892
889
|
if (mustLoadOnDemand) {
|
|
893
890
|
// Load data on demand and then init the tree
|
|
@@ -899,7 +896,7 @@ class TreeElement {
|
|
|
899
896
|
|
|
900
897
|
// Does an HTML element of the tree have the focus?
|
|
901
898
|
_isFocusOnTree() {
|
|
902
|
-
|
|
899
|
+
let activeElement = document.activeElement;
|
|
903
900
|
|
|
904
901
|
/* istanbul ignore if */
|
|
905
902
|
if (!activeElement) {
|
|
@@ -907,15 +904,15 @@ class TreeElement {
|
|
|
907
904
|
}
|
|
908
905
|
|
|
909
906
|
// The keyboard must still work for input elements.
|
|
910
|
-
|
|
907
|
+
let tagName = activeElement.tagName;
|
|
911
908
|
if (tagName !== "A" && tagName !== "SPAN") {
|
|
912
909
|
return false;
|
|
913
910
|
}
|
|
914
|
-
|
|
915
|
-
return node?.tree === this.
|
|
911
|
+
let node = this.getNode(activeElement);
|
|
912
|
+
return node?.tree === this._tree;
|
|
916
913
|
}
|
|
917
914
|
_isSelectedNodeInSubtree(subtree) {
|
|
918
|
-
|
|
915
|
+
let selectedNode = this.getSelectedNode();
|
|
919
916
|
if (!selectedNode) {
|
|
920
917
|
return false;
|
|
921
918
|
} else {
|
|
@@ -937,15 +934,15 @@ class TreeElement {
|
|
|
937
934
|
if (!this._options.dragAndDrop) {
|
|
938
935
|
return false;
|
|
939
936
|
}
|
|
940
|
-
return this._dndHandler.
|
|
937
|
+
return this._dndHandler._mouseCapture(positionInfo);
|
|
941
938
|
}
|
|
942
939
|
_mouseDrag(positionInfo) {
|
|
943
940
|
/* istanbul ignore if */
|
|
944
941
|
if (!this._options.dragAndDrop) {
|
|
945
942
|
return false;
|
|
946
943
|
}
|
|
947
|
-
|
|
948
|
-
this._scrollHandler.
|
|
944
|
+
let result = this._dndHandler._mouseDrag(positionInfo);
|
|
945
|
+
this._scrollHandler._checkScrolling(positionInfo);
|
|
949
946
|
return result;
|
|
950
947
|
}
|
|
951
948
|
_mouseStart(positionInfo) {
|
|
@@ -953,18 +950,18 @@ class TreeElement {
|
|
|
953
950
|
if (!this._options.dragAndDrop) {
|
|
954
951
|
return false;
|
|
955
952
|
}
|
|
956
|
-
return this._dndHandler.
|
|
953
|
+
return this._dndHandler._mouseStart(positionInfo);
|
|
957
954
|
}
|
|
958
955
|
_mouseStop(positionInfo) {
|
|
959
956
|
/* istanbul ignore if */
|
|
960
957
|
if (!this._options.dragAndDrop) {
|
|
961
958
|
return false;
|
|
962
959
|
}
|
|
963
|
-
this._scrollHandler.
|
|
964
|
-
return this._dndHandler.
|
|
960
|
+
this._scrollHandler._stopScrolling();
|
|
961
|
+
return this._dndHandler._mouseStop(positionInfo);
|
|
965
962
|
}
|
|
966
963
|
_openParents(node) {
|
|
967
|
-
|
|
964
|
+
let parent = node.parent;
|
|
968
965
|
if (parent?.parent && !parent.is_open) {
|
|
969
966
|
void this.openNode(parent, false);
|
|
970
967
|
}
|
|
@@ -975,48 +972,48 @@ class TreeElement {
|
|
|
975
972
|
from_node: redraw this subtree
|
|
976
973
|
*/
|
|
977
974
|
_refreshElements(fromNode) {
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
this._renderer.
|
|
975
|
+
let mustSetFocus = this._isFocusOnTree();
|
|
976
|
+
let mustSelect = fromNode ? this._isSelectedNodeInSubtree(fromNode) : false;
|
|
977
|
+
this._renderer._render(fromNode);
|
|
981
978
|
if (mustSelect) {
|
|
982
979
|
this._selectCurrentNode(mustSetFocus);
|
|
983
980
|
}
|
|
984
981
|
this._triggerEvent("tree.refresh");
|
|
985
982
|
}
|
|
986
983
|
_saveState() {
|
|
987
|
-
this._saveStateHandler.
|
|
984
|
+
this._saveStateHandler._saveState();
|
|
988
985
|
}
|
|
989
986
|
_selectCurrentNode(mustSetFocus) {
|
|
990
|
-
|
|
987
|
+
let node = this.getSelectedNode();
|
|
991
988
|
if (node) {
|
|
992
|
-
|
|
993
|
-
nodeElement.
|
|
989
|
+
let nodeElement = this._getNodeElementForNode(node);
|
|
990
|
+
nodeElement._select(mustSetFocus);
|
|
994
991
|
}
|
|
995
992
|
}
|
|
996
993
|
|
|
997
994
|
// Set initial state, either by restoring the state or auto-opening nodes
|
|
998
995
|
// result: must load nodes on demand?
|
|
999
996
|
_setInitialState() {
|
|
1000
|
-
|
|
997
|
+
let restoreState = () => {
|
|
1001
998
|
// result: is state restored, must load on demand?
|
|
1002
|
-
|
|
999
|
+
let state = this._saveStateHandler._getStateFromStorage();
|
|
1003
1000
|
if (!state) {
|
|
1004
1001
|
return [false, false];
|
|
1005
1002
|
} else {
|
|
1006
|
-
|
|
1003
|
+
let mustLoadOnDemand = this._saveStateHandler._setInitialState(state);
|
|
1007
1004
|
|
|
1008
1005
|
// return true: the state is restored
|
|
1009
1006
|
return [true, mustLoadOnDemand];
|
|
1010
1007
|
}
|
|
1011
1008
|
};
|
|
1012
|
-
|
|
1009
|
+
let autoOpenNodes = () => {
|
|
1013
1010
|
// result: must load on demand?
|
|
1014
1011
|
if (this._options.autoOpen === false) {
|
|
1015
1012
|
return false;
|
|
1016
1013
|
}
|
|
1017
|
-
|
|
1014
|
+
let maxLevel = this._getAutoOpenMaxLevel();
|
|
1018
1015
|
let mustLoadOnDemand = false;
|
|
1019
|
-
this.
|
|
1016
|
+
this._tree.iterate((node, level) => {
|
|
1020
1017
|
if (node.load_on_demand) {
|
|
1021
1018
|
mustLoadOnDemand = true;
|
|
1022
1019
|
return false;
|
|
@@ -1040,29 +1037,29 @@ class TreeElement {
|
|
|
1040
1037
|
// Set the initial state for nodes that are loaded on demand
|
|
1041
1038
|
async _setInitialStateOnDemand() {
|
|
1042
1039
|
return new Promise(resolve => {
|
|
1043
|
-
|
|
1044
|
-
|
|
1040
|
+
let restoreState = () => {
|
|
1041
|
+
let state = this._saveStateHandler._getStateFromStorage();
|
|
1045
1042
|
if (!state) {
|
|
1046
1043
|
return false;
|
|
1047
1044
|
} else {
|
|
1048
|
-
void this._saveStateHandler.
|
|
1045
|
+
void this._saveStateHandler._setInitialStateOnDemand(state).then(() => {
|
|
1049
1046
|
resolve();
|
|
1050
1047
|
});
|
|
1051
1048
|
return true;
|
|
1052
1049
|
}
|
|
1053
1050
|
};
|
|
1054
|
-
|
|
1055
|
-
|
|
1051
|
+
let autoOpenNodes = () => {
|
|
1052
|
+
let maxLevel = this._getAutoOpenMaxLevel();
|
|
1056
1053
|
let loadingCount = 0;
|
|
1057
|
-
|
|
1054
|
+
let loadAndOpenNode = node => {
|
|
1058
1055
|
loadingCount += 1;
|
|
1059
1056
|
void this.openNode(node, false).then(() => {
|
|
1060
1057
|
loadingCount -= 1;
|
|
1061
1058
|
openNodes();
|
|
1062
1059
|
});
|
|
1063
1060
|
};
|
|
1064
|
-
|
|
1065
|
-
this.
|
|
1061
|
+
let openNodes = () => {
|
|
1062
|
+
this._tree.iterate((node, level) => {
|
|
1066
1063
|
if (node.load_on_demand) {
|
|
1067
1064
|
if (!node.is_loading) {
|
|
1068
1065
|
loadAndOpenNode(node);
|