tree-element 0.3.1 → 0.4.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.
Files changed (59) hide show
  1. package/README.md +1 -0
  2. package/lib/classNames.js +4 -4
  3. package/lib/classNames.js.map +1 -1
  4. package/lib/dataLoader.d.ts +0 -1
  5. package/lib/dataLoader.d.ts.map +1 -1
  6. package/lib/dataLoader.js +6 -6
  7. package/lib/dataLoader.js.map +1 -1
  8. package/lib/elementsRenderer.d.ts +4 -2
  9. package/lib/elementsRenderer.d.ts.map +1 -1
  10. package/lib/elementsRenderer.js +35 -21
  11. package/lib/elementsRenderer.js.map +1 -1
  12. package/lib/index.d.ts +10 -4
  13. package/lib/index.d.ts.map +1 -1
  14. package/lib/index.js +75 -18
  15. package/lib/index.js.map +1 -1
  16. package/lib/keyHandler.d.ts +14 -3
  17. package/lib/keyHandler.d.ts.map +1 -1
  18. package/lib/keyHandler.js +61 -32
  19. package/lib/keyHandler.js.map +1 -1
  20. package/lib/methodTypes.d.ts +3 -0
  21. package/lib/methodTypes.d.ts.map +1 -1
  22. package/lib/nodeElement/folderElement.d.ts +1 -1
  23. package/lib/nodeElement/folderElement.d.ts.map +1 -1
  24. package/lib/nodeElement/folderElement.js +4 -4
  25. package/lib/nodeElement/folderElement.js.map +1 -1
  26. package/lib/nodeElement/index.d.ts +3 -2
  27. package/lib/nodeElement/index.d.ts.map +1 -1
  28. package/lib/nodeElement/index.js +15 -12
  29. package/lib/nodeElement/index.js.map +1 -1
  30. package/lib/options.d.ts +13 -0
  31. package/lib/options.d.ts.map +1 -1
  32. package/lib/selectNodeHandler.d.ts +3 -0
  33. package/lib/selectNodeHandler.d.ts.map +1 -1
  34. package/lib/selectNodeHandler.js +54 -22
  35. package/lib/selectNodeHandler.js.map +1 -1
  36. package/lib/setDefaultOptions.d.ts.map +1 -1
  37. package/lib/setDefaultOptions.js +5 -4
  38. package/lib/setDefaultOptions.js.map +1 -1
  39. package/lib/version.d.ts +1 -1
  40. package/lib/version.js +1 -1
  41. package/lib/version.js.map +1 -1
  42. package/package.json +19 -19
  43. package/src/classNames.ts +4 -4
  44. package/src/dataLoader.ts +6 -9
  45. package/src/elementsRenderer.ts +42 -24
  46. package/src/index.ts +83 -24
  47. package/src/keyHandler.ts +84 -34
  48. package/src/methodTypes.ts +6 -0
  49. package/src/nodeElement/folderElement.ts +4 -4
  50. package/src/nodeElement/index.ts +20 -17
  51. package/src/options.ts +13 -0
  52. package/src/selectNodeHandler.ts +58 -25
  53. package/src/setDefaultOptions.ts +5 -4
  54. package/src/version.ts +1 -1
  55. package/tree_element.css +16 -0
  56. package/tree_element.debug.js +260 -124
  57. package/tree_element.debug.js.map +1 -1
  58. package/tree_element.js +2 -2
  59. package/tree_element.js.map +1 -1
package/lib/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*
2
- Tree-element 0.3.1
2
+ Tree-element 0.4.0
3
3
 
4
4
  Copyright 2026 Marco Braak
5
5
 
@@ -41,6 +41,8 @@ import version from './version.js';
41
41
  // as its global, instead of an object of named exports.
42
42
 
43
43
  class TreeElement {
44
+ // With multiSelect: the node that is the tab stop, see updateTabStop
45
+ _activeNode;
44
46
  _classNames;
45
47
  _dataLoader;
46
48
  _dndHandler;
@@ -74,6 +76,7 @@ class TreeElement {
74
76
  this._tree = new Node({}, true);
75
77
  this._nodeMap = new WeakMap();
76
78
  this._fallbackTabStop = null;
79
+ this._activeNode = null;
77
80
  let {
78
81
  ariaLabel,
79
82
  ariaLabelledBy,
@@ -83,6 +86,7 @@ class TreeElement {
83
86
  dataFilter,
84
87
  dragAndDrop,
85
88
  keyboardSupport,
89
+ multiSelect,
86
90
  onCanMove,
87
91
  onCanMoveTo,
88
92
  onCreateLi,
@@ -134,6 +138,17 @@ class TreeElement {
134
138
  let isNodeSelected = selectNodeHandler._isNodeSelected.bind(selectNodeHandler);
135
139
  let removeFromSelection = selectNodeHandler._removeFromSelection.bind(selectNodeHandler);
136
140
  let selectNode = selectNodeHandler._selectSingleNode.bind(selectNodeHandler);
141
+ let toggleNodeInSelection = selectNodeHandler._toggleNodeInSelection.bind(selectNodeHandler);
142
+
143
+ // With multiSelect, a click adds a node to the selection or removes it
144
+ let onClickTitle = node => {
145
+ if (this._options.multiSelect) {
146
+ toggleNodeInSelection(node, false);
147
+ this._focusNode(node);
148
+ } else {
149
+ selectNode(node);
150
+ }
151
+ };
137
152
  let getMouseDelay = () => this._options.startDndDelay ?? 0;
138
153
  let dataLoader = new DataLoader({
139
154
  _classNames: classNames,
@@ -180,12 +195,16 @@ class TreeElement {
180
195
  });
181
196
  let keyHandler = new KeyHandler({
182
197
  _closeNode: closeNode,
198
+ _focusNode: this._focusNode.bind(this),
199
+ _getActiveNode: this._getActiveNode.bind(this),
183
200
  _getFocusedNode: getFocusedNode,
184
201
  _getSelectedNode: getSelectedNode,
185
202
  _getTree: getTree,
186
203
  _keyboardSupport: keyboardSupport,
204
+ _multiSelect: multiSelect,
187
205
  _openNode: openNode,
188
206
  _selectNode: selectNode,
207
+ _toggleNodeInSelection: toggleNodeInSelection,
189
208
  _triggerEvent: triggerEvent
190
209
  });
191
210
  let renderer = new ElementsRenderer({
@@ -199,6 +218,7 @@ class TreeElement {
199
218
  _getTree: getTree,
200
219
  _htmlElement: treeElement,
201
220
  _isNodeSelected: isNodeSelected,
221
+ _multiSelect: multiSelect,
202
222
  _onCreateLi: onCreateLi,
203
223
  _openedIcon: openedIcon,
204
224
  _rtl: rtl,
@@ -217,7 +237,7 @@ class TreeElement {
217
237
  _getMouseDelay: getMouseDelay,
218
238
  _getNode: getNode,
219
239
  _onClickButton: this.toggle.bind(this),
220
- _onClickTitle: selectNode,
240
+ _onClickTitle: onClickTitle,
221
241
  _onMouseCapture: onMouseCapture,
222
242
  _onMouseDrag: onMouseDrag,
223
243
  _onMouseStart: onMouseStart,
@@ -233,6 +253,9 @@ class TreeElement {
233
253
  this._saveStateHandler = saveStateHandler;
234
254
  this._scrollHandler = scrollHandler;
235
255
  this._selectNodeHandler = selectNodeHandler;
256
+ if (multiSelect) {
257
+ treeElement.addEventListener("focusin", this._handleFocusIn);
258
+ }
236
259
  this._initData();
237
260
  }
238
261
 
@@ -342,6 +365,7 @@ class TreeElement {
342
365
  this._dataLoader._deinit();
343
366
  this._keyHandler._deinit();
344
367
  this._mouseHandler._deinit();
368
+ this._htmlElement.removeEventListener("focusin", this._handleFocusIn);
345
369
  this._tree = new Node({}, true);
346
370
  }
347
371
 
@@ -529,7 +553,8 @@ class TreeElement {
529
553
  }
530
554
 
531
555
  /**
532
- * Selects the next visible node, like the down arrow key.
556
+ * Selects the next visible node, like the down arrow key. With
557
+ * `multiSelect` it moves the focus instead.
533
558
  *
534
559
  * @group Selection
535
560
  */
@@ -554,7 +579,8 @@ class TreeElement {
554
579
  }
555
580
 
556
581
  /**
557
- * Selects the previous visible node, like the up arrow key.
582
+ * Selects the previous visible node, like the up arrow key. With
583
+ * `multiSelect` it moves the focus instead.
558
584
  *
559
585
  * @group Selection
560
586
  */
@@ -684,8 +710,8 @@ class TreeElement {
684
710
  */
685
711
  selectNode(node, options) {
686
712
  if (!node) {
687
- // Called with empty node -> deselect current node
688
- this._deselectCurrentNode();
713
+ // Called with empty node -> deselect all nodes
714
+ this._deselectAllNodes();
689
715
  this._saveStateHandler._saveState();
690
716
  return;
691
717
  }
@@ -821,6 +847,7 @@ class TreeElement {
821
847
  _classNames: classNames,
822
848
  _closedIconElement: closedIconElement,
823
849
  _getScrollLeft: getScrollLeft,
850
+ _multiSelect: this._options.multiSelect,
824
851
  _node: node,
825
852
  _openedIconElement: openedIconElement,
826
853
  _renderChildren: renderChildren,
@@ -837,6 +864,7 @@ class TreeElement {
837
864
  return new NodeElement({
838
865
  _classNames: classNames,
839
866
  _getScrollLeft: getScrollLeft,
867
+ _multiSelect: this._options.multiSelect,
840
868
  _node: node,
841
869
  _tabIndex: tabIndex,
842
870
  _treeElement: treeElement
@@ -866,9 +894,8 @@ class TreeElement {
866
894
  }
867
895
  return requestUrl;
868
896
  }
869
- _deselectCurrentNode() {
870
- let node = this.getSelectedNode();
871
- if (node) {
897
+ _deselectAllNodes() {
898
+ for (let node of this.getSelectedNodes()) {
872
899
  this.removeFromSelection(node);
873
900
  }
874
901
  }
@@ -881,6 +908,20 @@ class TreeElement {
881
908
  }
882
909
  }
883
910
 
911
+ // The treeitem of the first node, or null when the tree is empty
912
+ // Move the focus to a node, without selecting it
913
+ _focusNode(node) {
914
+ this._activeNode = node;
915
+ this._updateTabStop();
916
+ node.element?.focus();
917
+ }
918
+
919
+ // With multiSelect: the active node, if it is still rendered in the tree
920
+ _getActiveNode() {
921
+ let element = this._activeNode?.element;
922
+ return element && this._htmlElement.contains(element) ? this._activeNode : null;
923
+ }
924
+
884
925
  // Get the maximum level for auto open
885
926
  _getAutoOpenMaxLevel() {
886
927
  if (this._options.autoOpen === true) {
@@ -896,11 +937,8 @@ class TreeElement {
896
937
  /* istanbul ignore next @preserve */
897
938
  return 0;
898
939
  }
899
-
900
- // The title span of the first node, or null when the tree is empty
901
- _getFirstTitleSpan() {
902
- let firstElement = this._tree.children[0]?.element;
903
- return firstElement ? firstElement.querySelector(`:scope > .${this._classNames.element} > span.${this._classNames.title}`) : null;
940
+ _getFirstTreeItem() {
941
+ return this._tree.children[0]?.element ?? null;
904
942
  }
905
943
 
906
944
  // The node of the HTML element that has the focus, if it is in this tree
@@ -914,7 +952,7 @@ class TreeElement {
914
952
 
915
953
  // The keyboard must still work for input elements.
916
954
  let tagName = activeElement.tagName;
917
- if (tagName !== "A" && tagName !== "SPAN") {
955
+ if (tagName !== "A" && tagName !== "LI" && tagName !== "SPAN") {
918
956
  return null;
919
957
  }
920
958
  let node = this.getNode(activeElement);
@@ -930,6 +968,16 @@ class TreeElement {
930
968
  _getNodeIdToBeSelected() {
931
969
  return this._saveStateHandler._getNodeIdToBeSelected();
932
970
  }
971
+
972
+ // With multiSelect, the focused node becomes the tab stop
973
+ _handleFocusIn = () => {
974
+ let node = this._getFocusedNode();
975
+ if (!node || node === this._activeNode) {
976
+ return;
977
+ }
978
+ this._activeNode = node;
979
+ this._updateTabStop();
980
+ };
933
981
  _hasRenderedSelectedNode() {
934
982
  return this.getSelectedNodes().some(node => Boolean(node.element));
935
983
  }
@@ -1006,7 +1054,6 @@ class TreeElement {
1006
1054
  }
1007
1055
  _mouseStart(positionInfo) {
1008
1056
  /* istanbul ignore if */
1009
- // eslint-disable-next-line unicorn/prefer-ternary
1010
1057
  if (!this._options.dragAndDrop) {
1011
1058
  return false;
1012
1059
  }
@@ -1116,12 +1163,22 @@ class TreeElement {
1116
1163
  /* Keyboard users reach the tree through the tab stop. The selected node is
1117
1164
  * the tab stop, see NodeElement.select. Without a selected node, the first
1118
1165
  * node is the tab stop, so the tree can always be reached.
1166
+ * With multiSelect the tab stop is the active node: the node that was
1167
+ * focused last. Without one, it is the first node.
1119
1168
  */
1120
1169
  _updateTabStop() {
1121
1170
  let tabIndex = this._options.tabIndex;
1171
+ let multiSelect = this._options.multiSelect;
1122
1172
  let previousTabStop = this._fallbackTabStop;
1123
- let tabStop = tabIndex == null || this._hasRenderedSelectedNode() ? null : this._getFirstTitleSpan();
1124
- if (previousTabStop && previousTabStop !== tabStop && previousTabStop.getAttribute("aria-selected") !== "true") {
1173
+ let tabStop;
1174
+ if (tabIndex == null) {
1175
+ tabStop = null;
1176
+ } else if (multiSelect) {
1177
+ tabStop = this._getActiveNode()?.element ?? this._getFirstTreeItem();
1178
+ } else {
1179
+ tabStop = this._hasRenderedSelectedNode() ? null : this._getFirstTreeItem();
1180
+ }
1181
+ if (previousTabStop && previousTabStop !== tabStop && (multiSelect || previousTabStop.getAttribute("aria-selected") !== "true")) {
1125
1182
  previousTabStop.setAttribute("tabindex", "-1");
1126
1183
  }
1127
1184
  if (tabStop && tabIndex != null) {
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { ClassNames } from \"./classNames\";\nimport type { TreeEventName, TreeEvents } from \"./events\";\nimport type { PositionInfo } from \"./mouseUtils\";\nimport type { NodeData, NodeId, Position } from \"./node\";\nimport type { TreeElementOptions } from \"./options\";\nimport type { SavedState } from \"./saveStateHandler\";\nimport type { SelectNodeOptions } from \"./selectNodeHandler\";\n\nimport createClassNames from \"./classNames\";\nimport DataLoader from \"./dataLoader\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseHandler from \"./mouseHandler\";\nimport { Node } from \"./node\";\nimport NodeElement from \"./nodeElement\";\nimport FolderElement from \"./nodeElement/folderElement\";\nimport { getOffsetTop } from \"./positionUtils\";\nimport RequestUrl from \"./requestUrl\";\nimport SaveStateHandler from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport setDefaultOptions from \"./setDefaultOptions\";\nimport triggerCustomEvent from \"./triggerCustomEvent\";\nimport __version__ from \"./version\";\n\n// The types that appear in the public api. Consumers cannot import them from\n// the submodules directly, because those are not exposed in package.json.\n// Type only, so that the iife build keeps exposing the TreeElement class itself\n// as its global, instead of an object of named exports.\n\nexport type TriggerEventProvider = (\n element: HTMLElement,\n eventName: TreeEventName,\n values?: TreeEvents[TreeEventName],\n) => boolean;\n\ninterface TreeElementParams extends Partial<TreeElementOptions> {\n /**\n The element the tree is rendered into. Its content is replaced.\n */\n htmlElement: HTMLElement;\n /** Replaces how events are dispatched. It must return whether the event\n * was not cancelled. This exists for tests and for integrating with\n * another event system. */\n overrideTriggerEventProvider?: TriggerEventProvider;\n}\n\nexport default class TreeElement {\n private classNames: ClassNames;\n private dataLoader: DataLoader;\n private dndHandler: DragAndDropHandler;\n private fallbackTabStop: HTMLElement | null;\n private htmlElement: HTMLElement;\n private isInitialized: boolean;\n private keyHandler: KeyHandler;\n private mouseHandler: MouseHandler;\n private nodeMap: WeakMap<HTMLElement, Node>;\n private options: TreeElementOptions;\n private renderer: ElementsRenderer;\n private saveStateHandler: SaveStateHandler;\n private scrollHandler: ScrollHandler;\n private selectNodeHandler: SelectNodeHandler;\n private tree: Node;\n private triggerEventProvider: TriggerEventProvider;\n\n /**\n @hidden\n */\n constructor({\n htmlElement,\n overrideTriggerEventProvider,\n ...options\n }: TreeElementParams) {\n this.htmlElement = htmlElement;\n this.options = setDefaultOptions(htmlElement, options);\n this.classNames = createClassNames(this.options);\n this.triggerEventProvider =\n overrideTriggerEventProvider ?? triggerCustomEvent;\n\n this.isInitialized = false;\n this.tree = new Node({}, true);\n this.nodeMap = new WeakMap();\n this.fallbackTabStop = null;\n\n const {\n ariaLabel,\n ariaLabelledBy,\n autoEscape,\n buttonLeft,\n closedIcon,\n dataFilter,\n dragAndDrop,\n keyboardSupport,\n onCanMove,\n onCanMoveTo,\n onCreateLi,\n onDragMove,\n onDragStop,\n onGetStateFromStorage,\n onIsMoveHandle,\n onSetStateFromStorage,\n openedIcon,\n openFolderDelay,\n rtl,\n saveState: saveStateOption,\n showEmptyFolder,\n slide,\n tabIndex,\n } = this.options;\n\n const classNames = this.classNames;\n const closeNode = this.closeNode.bind(this);\n const getNodeElement = this.getNodeElement.bind(this);\n const getNodeElementForNode = this.getNodeElementForNode.bind(this);\n const getFocusedNode = this.getFocusedNode.bind(this);\n const getNodeById = this.getNodeById.bind(this);\n const getSelectedNode = this.getSelectedNode.bind(this);\n const getTree = this.getTree.bind(this);\n const loadData = this.loadData.bind(this);\n const openNode = this.openNode.bind(this);\n const openParents = this.openParents.bind(this);\n const refreshElements = this.refreshElements.bind(this);\n const refreshHitAreas = this.refreshHitAreas.bind(this);\n const setNodeElement = this.setNodeElement.bind(this);\n const treeElement = this.htmlElement;\n const triggerEvent = this.triggerEvent.bind(this);\n const updateTabStop = this.updateTabStop.bind(this);\n\n const saveState = () => {\n saveStateHandler.saveState();\n };\n\n const selectNodeHandler = new SelectNodeHandler({\n getNodeById,\n getNodeElementForNode,\n getOnCanSelectNode: () => this.options.onCanSelectNode,\n getSelectable: () => this.options.selectable,\n openParents,\n saveState,\n triggerEvent,\n updateTabStop,\n });\n\n const addToSelection =\n selectNodeHandler.addToSelection.bind(selectNodeHandler);\n const getSelectedNodes =\n selectNodeHandler.getSelectedNodes.bind(selectNodeHandler);\n const isNodeSelected =\n selectNodeHandler.isNodeSelected.bind(selectNodeHandler);\n const removeFromSelection =\n selectNodeHandler.removeFromSelection.bind(selectNodeHandler);\n const selectNode =\n selectNodeHandler.selectSingleNode.bind(selectNodeHandler);\n\n const getMouseDelay = () => this.options.startDndDelay ?? 0;\n\n const dataLoader = new DataLoader({\n classNames,\n dataFilter,\n loadData,\n treeElement,\n triggerEvent,\n });\n\n const saveStateHandler = new SaveStateHandler({\n addToSelection,\n getNodeById,\n getSelectedNodes,\n getTree,\n onGetStateFromStorage,\n onSetStateFromStorage,\n openNode,\n refreshElements,\n removeFromSelection,\n saveState: saveStateOption,\n });\n\n const scrollHandler = new ScrollHandler({\n refreshHitAreas,\n treeElement,\n });\n\n const getScrollLeft = scrollHandler.getScrollLeft.bind(scrollHandler);\n\n const dndHandler = new DragAndDropHandler({\n autoEscape,\n classNames,\n getNodeElement,\n getNodeElementForNode,\n getScrollLeft,\n getTree,\n onCanMove,\n onCanMoveTo,\n onDragMove,\n onDragStop,\n onIsMoveHandle,\n openFolderDelay,\n openNode,\n refreshElements,\n slide,\n treeElement,\n triggerEvent,\n });\n\n const keyHandler = new KeyHandler({\n closeNode,\n getFocusedNode,\n getSelectedNode,\n getTree,\n keyboardSupport,\n openNode,\n selectNode,\n triggerEvent,\n });\n\n const renderer = new ElementsRenderer({\n ariaLabel,\n ariaLabelledBy,\n autoEscape,\n buttonLeft,\n classNames,\n closedIcon,\n dragAndDrop,\n getTree,\n htmlElement: treeElement,\n isNodeSelected,\n onCreateLi,\n openedIcon,\n rtl,\n setNodeElement,\n showEmptyFolder,\n tabIndex,\n });\n\n const getNode = this.getNode.bind(this);\n const onMouseCapture = this.mouseCapture.bind(this);\n const onMouseDrag = this.mouseDrag.bind(this);\n const onMouseStart = this.mouseStart.bind(this);\n const onMouseStop = this.mouseStop.bind(this);\n\n const mouseHandler = new MouseHandler({\n classNames,\n element: treeElement,\n getMouseDelay,\n getNode,\n onClickButton: this.toggle.bind(this),\n onClickTitle: selectNode,\n onMouseCapture,\n onMouseDrag,\n onMouseStart,\n onMouseStop,\n triggerEvent,\n useContextMenu: this.options.useContextMenu,\n });\n\n this.dataLoader = dataLoader;\n this.dndHandler = dndHandler;\n this.keyHandler = keyHandler;\n this.mouseHandler = mouseHandler;\n this.renderer = renderer;\n this.saveStateHandler = saveStateHandler;\n this.scrollHandler = scrollHandler;\n this.selectNodeHandler = selectNodeHandler;\n\n this.initData();\n }\n\n /**\n * Adds a sibling after a node.\n *\n * @returns The new node, or `null` when the node has no parent.\n * @group Changing the tree\n */\n public addNodeAfter(nodeData: NodeData, existingNode: Node): Node | null {\n const newNode = existingNode.addAfter(nodeData);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n /**\n * Adds a sibling before a node.\n *\n * @returns The new node, or `null` when the node has no parent.\n * @group Changing the tree\n */\n public addNodeBefore(nodeData: NodeData, existingNode: Node): Node | null {\n const newNode = existingNode.addBefore(nodeData);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n /**\n * Inserts a new node between a node and its parent, taking the node as its\n * child.\n *\n * @returns The new node, or `null` when the node has no parent.\n * @group Changing the tree\n */\n public addParentNode(nodeData: NodeData, existingNode: Node): Node | null {\n const newNode = existingNode.addParent(nodeData);\n\n if (newNode) {\n this.refreshElements(newNode.parent);\n }\n\n return newNode;\n }\n\n /**\n * Adds a node to the selection instead of replacing it.\n *\n * @param mustSetFocus - Move the focus to the node. Default `true`.\n * @group Selection\n */\n public addToSelection(node: Node, mustSetFocus = true) {\n this.selectNodeHandler.addToSelection(node);\n this.openParents(node);\n\n this.getNodeElementForNode(node).select(mustSetFocus);\n\n this.updateTabStop();\n this.saveState();\n }\n\n /**\n * Adds a node as the last child of a parent.\n *\n * @example\n * ```js\n * tree.appendNode({ name: \"child\", id: 5 }, tree.getNodeById(1));\n * ```\n *\n * @returns The new node.\n * @group Changing the tree\n */\n public appendNode(nodeData: NodeData, parentNode: Node): Node {\n const node = parentNode.append(nodeData);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n /**\n * Closes a folder. Await the promise when you need to know the closing\n * animation has finished.\n *\n * @example\n * ```js\n * await tree.closeNode(node);\n * console.log(\"closed\");\n * ```\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public async closeNode(node: Node, slide?: boolean): Promise<void> {\n if (!(node.isFolder() || node.isEmptyFolder)) {\n return;\n }\n\n await this.createFolderElement(node).close(\n slide ?? this.options.slide,\n this.options.animationSpeed,\n );\n\n this.saveState();\n }\n\n /**\n * Empties the element and removes the tree's document-level keyboard\n * listener. Call it when you remove the tree from the page.\n *\n * @group Other\n */\n public deinit(): void {\n this.htmlElement.textContent = \"\";\n\n this.dataLoader.deinit();\n this.keyHandler.deinit();\n this.mouseHandler.deinit();\n\n this.tree = new Node({}, true);\n }\n\n /**\n * Returns the node that belongs to a `li` element the tree rendered.\n *\n * @group Finding nodes\n */\n public getNode(element: HTMLElement): Node | null {\n const liElement = element.closest<HTMLElement>(\n `li.${this.classNames.common}`,\n );\n\n return liElement ? (this.nodeMap.get(liElement) ?? null) : null;\n }\n\n /**\n * Returns the first node for which the callback returns `true`.\n *\n * @example\n * ```js\n * const node = tree.getNodeByCallback((node) => node.children.length > 3);\n * ```\n *\n * @group Finding nodes\n */\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n return this.tree.getNodeByCallback(callback);\n }\n\n /**\n * Returns the node with this id.\n *\n * @example\n * ```js\n * const node = tree.getNodeById(1);\n * ```\n *\n * @group Finding nodes\n */\n public getNodeById(id: NodeId): Node | null {\n return this.tree.getNodeById(id);\n }\n\n /**\n * Returns the first node with this name.\n *\n * @group Finding nodes\n */\n public getNodeByName(name: string): Node | null {\n return this.tree.getNodeByName(name);\n }\n\n /**\n * Like `getNodeByName`, but throws when there is no such node. Convenient\n * in tests and when a missing node is a bug.\n *\n * @group Finding nodes\n */\n public getNodeByNameMustExist(name: string): Node {\n return this.tree.getNodeByNameMustExist(name);\n }\n\n /**\n * Returns all nodes with this property value.\n *\n * @example\n * ```js\n * tree.getNodesByProperty(\"color\", \"green\");\n * ```\n *\n * @group Finding nodes\n */\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.tree.getNodesByProperty(key, value);\n }\n\n /**\n * Returns the selected node, or `null` when nothing is selected.\n *\n * @group Selection\n */\n public getSelectedNode(): Node | null {\n return this.selectNodeHandler.getSelectedNode();\n }\n\n /**\n * Returns the selected nodes.\n *\n * @group Selection\n */\n public getSelectedNodes(): Node[] {\n return this.selectNodeHandler.getSelectedNodes();\n }\n\n /**\n * Returns the current state — `open_nodes` and `selected_node` — whether or\n * not `saveState` is enabled.\n *\n * @group State\n */\n public getState(): null | SavedState {\n return this.saveStateHandler.getState();\n }\n\n /**\n * Returns the state as it is stored.\n *\n * @group State\n */\n public getStateFromStorage(): null | SavedState {\n return this.saveStateHandler.getStateFromStorage();\n }\n\n /**\n * Returns the root node. It is not rendered; its `children` are the\n * top-level nodes. Also available as the `tree` property.\n *\n * @group Finding nodes\n */\n public getTree(): Node {\n return this.tree;\n }\n\n /**\n * Returns the version of tree-element.\n *\n * @group Other\n */\n public getVersion(): string {\n return __version__;\n }\n\n /**\n * Returns whether the user is dragging a node.\n *\n * @group Other\n */\n public isDragging(): boolean {\n return this.dndHandler.isDragging;\n }\n\n /**\n * Returns whether the node is selected.\n *\n * @group Selection\n */\n public isNodeSelected(node: Node): boolean {\n return this.selectNodeHandler.isNodeSelected(node);\n }\n\n /**\n * Loads data into the tree.\n *\n * @param parentNode - Replace this node's children instead of the whole\n * tree.\n * @group Loading data\n */\n public loadData(data: NodeData[] | null, parentNode?: Node): void {\n if (data) {\n if (parentNode) {\n this.deselectNodes(parentNode);\n this.loadSubtree(data, parentNode);\n } else {\n this.initTree(data);\n }\n\n if (this.isDragging()) {\n this.dndHandler.refresh();\n }\n }\n\n this.triggerEvent(\"tree.set_data\", {\n node: parentNode,\n treeData: data ?? undefined,\n });\n }\n\n /**\n * Fetches data and loads it into the tree, or into `parentNode`.\n *\n * @param url - Defaults to the `dataUrl` option.\n * @group Loading data\n */\n public async loadDataFromUrl(url?: string, parentNode?: Node): Promise<void> {\n const requestUrl = url\n ? new RequestUrl(url)\n : this.createRequestUrl(parentNode);\n\n if (requestUrl) {\n await this.dataLoader.loadFromUrl(requestUrl, parentNode);\n }\n }\n\n /**\n * Selects the next visible node, like the down arrow key.\n *\n * @group Selection\n */\n public moveDown() {\n this.keyHandler.moveDown();\n }\n\n /**\n * Moves a node inside the tree.\n *\n * @example\n * ```js\n * tree.moveNode(tree.getNodeById(2), tree.getNodeById(1), \"inside\");\n * ```\n *\n * @param position - `\"before\"`, `\"after\"` or `\"inside\"`.\n * @group Changing the tree\n */\n public moveNode(node: Node, targetNode: Node, position: Position): void {\n this.tree.moveNode(node, targetNode, position);\n this.refreshElements(null);\n }\n\n /**\n * Selects the previous visible node, like the up arrow key.\n *\n * @group Selection\n */\n public moveUp() {\n this.keyHandler.moveUp();\n }\n\n /**\n * Opens a folder, and the folders above it. A node marked `load_on_demand`\n * is fetched first, so await the promise when you need to know it is really\n * open.\n *\n * @example\n * ```js\n * await tree.openNode(node);\n * console.log(\"open\");\n * ```\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public async openNode(node: Node, slide?: boolean): Promise<void> {\n const mustSlide = slide ?? this.options.slide;\n\n const doOpenNode = async (\n openedNode: Node,\n slideOption: boolean,\n ): Promise<void> => {\n if (!node.children.length) {\n return;\n }\n\n const folderElement = this.createFolderElement(openedNode);\n\n await folderElement.open(slideOption, this.options.animationSpeed);\n };\n\n if (node.isFolder() || node.isEmptyFolder) {\n if (node.load_on_demand) {\n await this.loadFolderOnDemand(node, mustSlide);\n } else {\n let parent = node.parent;\n\n while (parent) {\n // nb: do not open root element\n if (parent.parent) {\n await doOpenNode(parent, false);\n }\n parent = parent.parent;\n }\n\n await doOpenNode(node, mustSlide);\n\n this.saveState();\n }\n }\n }\n\n /**\n * Adds a node as the first child of a parent.\n *\n * @returns The new node.\n * @group Changing the tree\n */\n public prependNode(nodeData: NodeData, parentNode: Node): Node {\n const node = parentNode.prepend(nodeData);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n /**\n * Re-renders the whole tree. Needed after changing node data directly\n * instead of through these methods.\n *\n * @group Changing the tree\n */\n public refresh() {\n this.refreshElements(null);\n }\n\n /**\n * Recomputes the drop targets. Call this if the layout changes during a\n * drag.\n *\n * @group Other\n */\n public refreshHitAreas() {\n this.dndHandler.refresh();\n }\n\n /**\n * Removes a node from the selection.\n *\n * @group Selection\n */\n public removeFromSelection(node: Node) {\n this.selectNodeHandler.removeFromSelection(node);\n\n this.getNodeElementForNode(node).deselect();\n this.updateTabStop();\n this.saveState();\n }\n\n /**\n * Removes a node and its children.\n *\n * @group Changing the tree\n */\n public removeNode(node: Node): void {\n this.selectNodeHandler.removeFromSelection(node, true); // including children\n\n const parent = node.parent;\n node.remove();\n this.refreshElements(parent);\n }\n\n /**\n * Scrolls the node into view.\n *\n * @group Selection\n */\n public scrollToNode(node: Node) {\n if (!node.element) {\n return;\n }\n\n const top = getOffsetTop(node.element) - getOffsetTop(this.htmlElement);\n\n this.scrollHandler.scrollToY(top);\n }\n\n /**\n * Replaces the selection, and opens the parents of the node.\n *\n * @param node - `null` clears the selection.\n * @param options - `mustSetFocus`: move focus to the node, default `true`.\n * `mustToggle`: deselect the node if it is already selected, default\n * `false`.\n * @group Selection\n */\n public selectNode(node: Node | null, options?: SelectNodeOptions): void {\n if (!node) {\n // Called with empty node -> deselect current node\n this.deselectCurrentNode();\n this.saveStateHandler.saveState();\n return;\n }\n\n // Unlike a click, selecting the selected node again keeps it selected\n this.selectNodeHandler.selectSingleNode(node, {\n mustToggle: false,\n ...options,\n });\n }\n\n /**\n * Changes an option after construction. See\n * [Options](/reference/options#changing-an-option-later) for the caveats.\n *\n * @group Other\n */\n public setOption(option: string, value: unknown) {\n (this.options as unknown as Record<string, unknown>)[option] = value;\n }\n\n /**\n * Applies a state to the tree, and saves it to storage when `saveState` is\n * enabled.\n *\n * @group State\n */\n public setState(state: SavedState) {\n this.saveStateHandler.setInitialState(state);\n this.refreshElements(null);\n this.saveState();\n }\n\n /**\n * Closes an open node and opens a closed one. Await the promise when you\n * need to know the node is really open or closed, like with `openNode` and\n * `closeNode`.\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public async toggle(node: Node, slide: boolean | null = null): Promise<void> {\n const mustSlide = slide ?? this.options.slide;\n\n if (node.is_open) {\n await this.closeNode(node, mustSlide);\n } else {\n await this.openNode(node, mustSlide);\n }\n }\n\n /**\n * Returns the tree as a json string, including changes made through the\n * api.\n *\n * @group Other\n */\n public toJson(): string {\n return JSON.stringify(this.tree.getData());\n }\n\n /**\n * Updates the data of a node and re-renders it. A string updates just the\n * name.\n *\n * Changing the `id` re-indexes the node. `children` and `parent` are\n * ignored — use `loadData` or `moveNode` for those.\n *\n * @example\n * ```js\n * tree.updateNode(node, \"new name\");\n * tree.updateNode(node, { name: \"new name\", color: \"red\" });\n * ```\n *\n * @group Changing the tree\n */\n public updateNode(node: Node, data: NodeData): void {\n const idIsChanged =\n typeof data === \"object\" && data.id && data.id !== node.id;\n\n if (idIsChanged) {\n this.tree.removeNodeFromIndex(node);\n }\n\n node.setData(data);\n\n if (idIsChanged) {\n this.tree.addNodeToIndex(node);\n }\n\n if (\n typeof data === \"object\" &&\n data.children &&\n Array.isArray(data.children)\n ) {\n node.removeChildren();\n\n if (data.children.length) {\n node.loadFromData(data.children);\n }\n }\n\n this.refreshElements(node);\n }\n\n // Open the nodes up to the autoOpen level. A folder that is loaded on\n // demand is fetched first, and its children are opened when the data has\n // arrived.\n private async autoOpenNodesOnDemand(): Promise<void> {\n const maxLevel = this.getAutoOpenMaxLevel();\n\n const openNodes = async (): Promise<void> => {\n const loading: Promise<void>[] = [];\n\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n if (!node.is_loading) {\n loading.push(this.openNode(node, false).then(openNodes));\n }\n\n return false;\n }\n void this.openNode(node, false);\n\n return level !== maxLevel;\n });\n\n await Promise.all(loading);\n };\n\n await openNodes();\n }\n\n private createFolderElement(node: Node) {\n const classNames = this.classNames;\n const closedIconElement = this.renderer.closedIconElement;\n const getScrollLeft = this.scrollHandler.getScrollLeft.bind(\n this.scrollHandler,\n );\n const openedIconElement = this.renderer.openedIconElement;\n const tabIndex = this.options.tabIndex;\n const treeElement = this.htmlElement;\n const triggerEvent = this.triggerEvent.bind(this);\n\n // A selected node in a closed folder is rendered when the folder is\n // opened, which can be after it was selected. It becomes the tab stop\n // then, so the fallback tab stop must go.\n const renderChildren = (folder: Node) => {\n const ul = this.renderer.renderChildren(folder);\n this.updateTabStop();\n return ul;\n };\n\n return new FolderElement({\n classNames,\n closedIconElement,\n getScrollLeft,\n node,\n openedIconElement,\n renderChildren,\n tabIndex,\n treeElement,\n triggerEvent,\n });\n }\n\n private createNodeElement(node: Node) {\n const classNames = this.classNames;\n const getScrollLeft = this.scrollHandler.getScrollLeft.bind(\n this.scrollHandler,\n );\n const tabIndex = this.options.tabIndex;\n const treeElement = this.htmlElement;\n\n return new NodeElement({\n classNames,\n getScrollLeft,\n node,\n tabIndex,\n treeElement,\n });\n }\n\n /* Create a RequestUrl based on the url in the options.\n * Add a 'node' query parameter for loading on demand\n * Add a 'selected_node' query parameter if a node is selected.\n */\n private createRequestUrl(node?: Node): null | RequestUrl {\n const dataUrl = this.options.dataUrl;\n\n const url = typeof dataUrl === \"function\" ? dataUrl(node) : dataUrl;\n\n if (!url) {\n return null;\n }\n\n const requestUrl = new RequestUrl(url);\n\n if (node?.id) {\n // Load on demand of a subtree; add node parameter\n requestUrl.setSearchParam(\"node\", node.id.toString());\n } else {\n // Add selected_node parameter\n const selectedNodeId = this.getNodeIdToBeSelected();\n if (selectedNodeId) {\n requestUrl.setSearchParam(\"selected_node\", selectedNodeId.toString());\n }\n }\n\n return requestUrl;\n }\n\n private deselectCurrentNode(): void {\n const node = this.getSelectedNode();\n if (node) {\n this.removeFromSelection(node);\n }\n }\n\n // Deselect the children of the node.\n private deselectNodes(parentNode: Node): void {\n const selectedNodesUnderParent =\n this.selectNodeHandler.getSelectedNodesUnder(parentNode);\n for (const n of selectedNodesUnderParent) {\n this.selectNodeHandler.removeFromSelection(n);\n }\n }\n\n // Get the maximum level for auto open\n private getAutoOpenMaxLevel(): number {\n if (this.options.autoOpen === true) {\n return -1;\n }\n if (typeof this.options.autoOpen === \"number\") {\n return this.options.autoOpen;\n }\n if (typeof this.options.autoOpen === \"string\") {\n return parseInt(this.options.autoOpen, 10);\n }\n\n /* istanbul ignore next @preserve */\n return 0;\n }\n\n // The title span of the first node, or null when the tree is empty\n private getFirstTitleSpan(): HTMLElement | null {\n const firstElement = this.tree.children[0]?.element;\n\n return firstElement\n ? firstElement.querySelector<HTMLElement>(\n `:scope > .${this.classNames.element} > span.${this.classNames.title}`,\n )\n : null;\n }\n\n // The node of the HTML element that has the focus, if it is in this tree\n private getFocusedNode(): Node | null {\n const activeElement = document.activeElement;\n\n /* istanbul ignore if */\n if (!activeElement) {\n return null;\n }\n\n // The keyboard must still work for input elements.\n const tagName = activeElement.tagName;\n if (tagName !== \"A\" && tagName !== \"SPAN\") {\n return null;\n }\n\n const node = this.getNode(activeElement as HTMLElement);\n return node?.tree === this.tree ? node : null;\n }\n\n private getNodeElement(element: HTMLElement): NodeElement | null {\n const node = this.getNode(element);\n return node ? this.getNodeElementForNode(node) : null;\n }\n\n private getNodeElementForNode(node: Node): NodeElement {\n return node.isFolder()\n ? this.createFolderElement(node)\n : this.createNodeElement(node);\n }\n\n private getNodeIdToBeSelected(): NodeId | null {\n return this.saveStateHandler.getNodeIdToBeSelected();\n }\n\n private hasRenderedSelectedNode(): boolean {\n return this.getSelectedNodes().some((node) => Boolean(node.element));\n }\n\n private initData(): void {\n if (this.options.data) {\n this.loadData(this.options.data);\n } else {\n const dataUrl = this.createRequestUrl();\n\n if (dataUrl) {\n void this.loadDataFromUrl();\n } else {\n this.loadData([]);\n }\n }\n }\n\n private initTree(data: NodeData[]): void {\n const doInit = (): void => {\n if (this.isInitialized) {\n return;\n }\n\n this.isInitialized = true;\n this.triggerEvent(\"tree.init\");\n };\n\n this.tree = new this.options.nodeClass(null, true, this.options.nodeClass);\n\n this.selectNodeHandler.clear();\n\n this.tree.loadFromData(data);\n\n const mustLoadOnDemand = this.setInitialState();\n\n this.refreshElements(null);\n\n if (mustLoadOnDemand) {\n // Load data on demand and then init the tree\n void this.setInitialStateOnDemand().then(doInit);\n } else {\n doInit();\n }\n }\n\n // Does an HTML element of the tree have the focus?\n private isFocusOnTree(): boolean {\n return this.getFocusedNode() !== null;\n }\n\n private isSelectedNodeInSubtree(subtree: Node): boolean {\n const selectedNode = this.getSelectedNode();\n\n return selectedNode\n ? subtree === selectedNode || subtree.isParentOf(selectedNode)\n : false;\n }\n\n private async loadFolderOnDemand(node: Node, slide: boolean): Promise<void> {\n node.is_loading = true;\n\n await this.loadDataFromUrl(undefined, node);\n\n // Loading failed, or there is no url. Opening the node now would load it\n // again, without end. Leave it closed so the user can try again.\n if (node.load_on_demand) {\n node.is_loading = false;\n return;\n }\n\n await this.openNode(node, slide);\n }\n\n private loadSubtree(data: NodeData[], parentNode: Node): void {\n parentNode.loadFromData(data);\n\n parentNode.load_on_demand = false;\n parentNode.is_loading = false;\n\n this.refreshElements(parentNode);\n }\n\n private mouseCapture(positionInfo: PositionInfo): boolean | null {\n return this.options.dragAndDrop\n ? this.dndHandler.mouseCapture(positionInfo)\n : false;\n }\n\n private mouseDrag(positionInfo: PositionInfo): boolean {\n /* istanbul ignore if */\n if (!this.options.dragAndDrop) {\n return false;\n }\n\n const result = this.dndHandler.mouseDrag(positionInfo);\n this.scrollHandler.checkScrolling(positionInfo);\n return result;\n }\n\n private mouseStart(positionInfo: PositionInfo): boolean {\n /* istanbul ignore if */\n // eslint-disable-next-line unicorn/prefer-ternary\n if (!this.options.dragAndDrop) {\n return false;\n }\n\n return this.dndHandler.mouseStart(positionInfo);\n }\n\n private mouseStop(positionInfo: PositionInfo): boolean {\n /* istanbul ignore if */\n if (!this.options.dragAndDrop) {\n return false;\n }\n\n this.scrollHandler.stopScrolling();\n return this.dndHandler.mouseStop(positionInfo);\n }\n\n private openParents(node: Node) {\n const parent = node.parent;\n\n if (parent?.parent && !parent.is_open) {\n void this.openNode(parent, false);\n }\n }\n\n /*\n Redraw the tree or part of the tree.\n from_node: redraw this subtree\n */\n private refreshElements(fromNode: Node | null): void {\n const mustSetFocus = this.isFocusOnTree();\n const mustSelect = fromNode\n ? this.isSelectedNodeInSubtree(fromNode)\n : false;\n\n this.renderer.render(fromNode);\n\n if (mustSelect) {\n this.selectCurrentNode(mustSetFocus);\n }\n\n this.updateTabStop();\n\n this.triggerEvent(\"tree.refresh\");\n }\n\n private saveState(): void {\n this.saveStateHandler.saveState();\n }\n\n private selectCurrentNode(mustSetFocus: boolean): void {\n const node = this.getSelectedNode();\n if (!node) {\n return;\n }\n\n const nodeElement = this.getNodeElementForNode(node);\n nodeElement.select(mustSetFocus);\n }\n\n // Set initial state, either by restoring the state or auto-opening nodes\n // result: must load nodes on demand?\n private setInitialState(): boolean {\n const restoreState = (): [boolean, boolean] => {\n // result: is state restored, must load on demand?\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (state) {\n const mustLoadOnDemand = this.saveStateHandler.setInitialState(state);\n\n // return true: the state is restored\n return [true, mustLoadOnDemand];\n }\n return [false, false];\n };\n\n const autoOpenNodes = (): boolean => {\n // result: must load on demand?\n if (this.options.autoOpen === false) {\n return false;\n }\n\n const maxLevel = this.getAutoOpenMaxLevel();\n let mustLoadOnDemand = false;\n\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n mustLoadOnDemand = true;\n return false;\n }\n if (node.hasChildren()) {\n node.is_open = true;\n return level !== maxLevel;\n }\n return false;\n });\n\n return mustLoadOnDemand;\n };\n\n let [isRestored, mustLoadOnDemand] = restoreState(); // eslint-disable-line prefer-const\n\n if (!isRestored) {\n mustLoadOnDemand = autoOpenNodes();\n }\n\n return mustLoadOnDemand;\n }\n\n // Set the initial state for nodes that are loaded on demand\n private async setInitialStateOnDemand(): Promise<void> {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (state) {\n await this.saveStateHandler.setInitialStateOnDemand(state);\n } else {\n await this.autoOpenNodesOnDemand();\n }\n }\n\n // Set this HTML element to this node in the node map.\n private setNodeElement(element: HTMLElement, node: Node) {\n this.nodeMap.set(element, node);\n }\n\n private triggerEvent<Name extends TreeEventName>(\n eventName: Name,\n values?: TreeEvents[Name],\n ): boolean {\n return this.triggerEventProvider(this.htmlElement, eventName, values);\n }\n\n /* Keyboard users reach the tree through the tab stop. The selected node is\n * the tab stop, see NodeElement.select. Without a selected node, the first\n * node is the tab stop, so the tree can always be reached.\n */\n private updateTabStop(): void {\n const tabIndex = this.options.tabIndex;\n const previousTabStop = this.fallbackTabStop;\n const tabStop =\n tabIndex == null || this.hasRenderedSelectedNode()\n ? null\n : this.getFirstTitleSpan();\n\n if (\n previousTabStop &&\n previousTabStop !== tabStop &&\n previousTabStop.getAttribute(\"aria-selected\") !== \"true\"\n ) {\n previousTabStop.setAttribute(\"tabindex\", \"-1\");\n }\n\n if (tabStop && tabIndex != null) {\n tabStop.setAttribute(\"tabindex\", String(tabIndex));\n }\n\n this.fallbackTabStop = tabStop;\n }\n}\n\nexport {\n type MoveInfo,\n type TreeEvent,\n type TreeEventName,\n type TreeEvents,\n} from \"./events\";\nexport { type Node, type NodeData, type NodeId, type Position } from \"./node\";\nexport { type TreeElementOptions } from \"./options\";\nexport { type SavedState } from \"./saveStateHandler\";\nexport { type SelectNodeOptions } from \"./selectNodeHandler\";\n"],"names":["classNames","dataLoader","dndHandler","fallbackTabStop","htmlElement","isInitialized","keyHandler","mouseHandler","nodeMap","options","renderer","saveStateHandler","scrollHandler","selectNodeHandler","tree","triggerEventProvider","getNodeElement","getNodeElementForNode","getFocusedNode","openParents","refreshElements","setNodeElement","triggerEvent","updateTabStop","saveState","addToSelection","getSelectedNodes","isNodeSelected","removeFromSelection","selectSingleNode","getScrollLeft","mouseCapture","mouseDrag","mouseStart","mouseStop","initData","select","createFolderElement","close","deinit","getSelectedNode","getState","getStateFromStorage","__version__","isDragging","deselectNodes","loadSubtree","initTree","refresh","createRequestUrl","loadFromUrl","moveDown","moveUp","open","loadFolderOnDemand","deselect","scrollToY","deselectCurrentNode","setInitialState","autoOpenNodesOnDemand","getAutoOpenMaxLevel","closedIconElement","openedIconElement","renderChildren","createNodeElement","setSearchParam","getNodeIdToBeSelected","getSelectedNodesUnder","getFirstTitleSpan","hasRenderedSelectedNode","clear","setInitialStateOnDemand","isFocusOnTree","isSelectedNodeInSubtree","checkScrolling","stopScrolling","render","selectCurrentNode"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { ClassNames } from \"./classNames\";\nimport type { TreeEventName, TreeEvents } from \"./events\";\nimport type { PositionInfo } from \"./mouseUtils\";\nimport type { NodeData, NodeId, Position } from \"./node\";\nimport type { TreeElementOptions } from \"./options\";\nimport type { SavedState } from \"./saveStateHandler\";\nimport type { SelectNodeOptions } from \"./selectNodeHandler\";\n\nimport createClassNames from \"./classNames\";\nimport DataLoader from \"./dataLoader\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseHandler from \"./mouseHandler\";\nimport { Node } from \"./node\";\nimport NodeElement from \"./nodeElement\";\nimport FolderElement from \"./nodeElement/folderElement\";\nimport { getOffsetTop } from \"./positionUtils\";\nimport RequestUrl from \"./requestUrl\";\nimport SaveStateHandler from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport setDefaultOptions from \"./setDefaultOptions\";\nimport triggerCustomEvent from \"./triggerCustomEvent\";\nimport __version__ from \"./version\";\n\n// The types that appear in the public api. Consumers cannot import them from\n// the submodules directly, because those are not exposed in package.json.\n// Type only, so that the iife build keeps exposing the TreeElement class itself\n// as its global, instead of an object of named exports.\n\nexport type TriggerEventProvider = (\n element: HTMLElement,\n eventName: TreeEventName,\n values?: TreeEvents[TreeEventName],\n) => boolean;\n\ninterface TreeElementParams extends Partial<TreeElementOptions> {\n /**\n The element the tree is rendered into. Its content is replaced.\n */\n htmlElement: HTMLElement;\n /** Replaces how events are dispatched. It must return whether the event\n * was not cancelled. This exists for tests and for integrating with\n * another event system. */\n overrideTriggerEventProvider?: TriggerEventProvider;\n}\n\nexport default class TreeElement {\n // With multiSelect: the node that is the tab stop, see updateTabStop\n private activeNode: Node | null;\n private classNames: ClassNames;\n private dataLoader: DataLoader;\n private dndHandler: DragAndDropHandler;\n private fallbackTabStop: HTMLElement | null;\n private htmlElement: HTMLElement;\n private isInitialized: boolean;\n private keyHandler: KeyHandler;\n private mouseHandler: MouseHandler;\n private nodeMap: WeakMap<HTMLElement, Node>;\n private options: TreeElementOptions;\n private renderer: ElementsRenderer;\n private saveStateHandler: SaveStateHandler;\n private scrollHandler: ScrollHandler;\n private selectNodeHandler: SelectNodeHandler;\n private tree: Node;\n private triggerEventProvider: TriggerEventProvider;\n\n /**\n @hidden\n */\n constructor({\n htmlElement,\n overrideTriggerEventProvider,\n ...options\n }: TreeElementParams) {\n this.htmlElement = htmlElement;\n this.options = setDefaultOptions(htmlElement, options);\n this.classNames = createClassNames(this.options);\n this.triggerEventProvider =\n overrideTriggerEventProvider ?? triggerCustomEvent;\n\n this.isInitialized = false;\n this.tree = new Node({}, true);\n this.nodeMap = new WeakMap();\n this.fallbackTabStop = null;\n this.activeNode = null;\n\n const {\n ariaLabel,\n ariaLabelledBy,\n autoEscape,\n buttonLeft,\n closedIcon,\n dataFilter,\n dragAndDrop,\n keyboardSupport,\n multiSelect,\n onCanMove,\n onCanMoveTo,\n onCreateLi,\n onDragMove,\n onDragStop,\n onGetStateFromStorage,\n onIsMoveHandle,\n onSetStateFromStorage,\n openedIcon,\n openFolderDelay,\n rtl,\n saveState: saveStateOption,\n showEmptyFolder,\n slide,\n tabIndex,\n } = this.options;\n\n const classNames = this.classNames;\n const closeNode = this.closeNode.bind(this);\n const getNodeElement = this.getNodeElement.bind(this);\n const getNodeElementForNode = this.getNodeElementForNode.bind(this);\n const getFocusedNode = this.getFocusedNode.bind(this);\n const getNodeById = this.getNodeById.bind(this);\n const getSelectedNode = this.getSelectedNode.bind(this);\n const getTree = this.getTree.bind(this);\n const loadData = this.loadData.bind(this);\n const openNode = this.openNode.bind(this);\n const openParents = this.openParents.bind(this);\n const refreshElements = this.refreshElements.bind(this);\n const refreshHitAreas = this.refreshHitAreas.bind(this);\n const setNodeElement = this.setNodeElement.bind(this);\n const treeElement = this.htmlElement;\n const triggerEvent = this.triggerEvent.bind(this);\n const updateTabStop = this.updateTabStop.bind(this);\n\n const saveState = () => {\n saveStateHandler.saveState();\n };\n\n const selectNodeHandler = new SelectNodeHandler({\n getNodeById,\n getNodeElementForNode,\n getOnCanSelectNode: () => this.options.onCanSelectNode,\n getSelectable: () => this.options.selectable,\n openParents,\n saveState,\n triggerEvent,\n updateTabStop,\n });\n\n const addToSelection =\n selectNodeHandler.addToSelection.bind(selectNodeHandler);\n const getSelectedNodes =\n selectNodeHandler.getSelectedNodes.bind(selectNodeHandler);\n const isNodeSelected =\n selectNodeHandler.isNodeSelected.bind(selectNodeHandler);\n const removeFromSelection =\n selectNodeHandler.removeFromSelection.bind(selectNodeHandler);\n const selectNode =\n selectNodeHandler.selectSingleNode.bind(selectNodeHandler);\n\n const toggleNodeInSelection =\n selectNodeHandler.toggleNodeInSelection.bind(selectNodeHandler);\n\n // With multiSelect, a click adds a node to the selection or removes it\n const onClickTitle = (node: Node) => {\n if (this.options.multiSelect) {\n toggleNodeInSelection(node, false);\n this.focusNode(node);\n } else {\n selectNode(node);\n }\n };\n\n const getMouseDelay = () => this.options.startDndDelay ?? 0;\n\n const dataLoader = new DataLoader({\n classNames,\n dataFilter,\n loadData,\n treeElement,\n triggerEvent,\n });\n\n const saveStateHandler = new SaveStateHandler({\n addToSelection,\n getNodeById,\n getSelectedNodes,\n getTree,\n onGetStateFromStorage,\n onSetStateFromStorage,\n openNode,\n refreshElements,\n removeFromSelection,\n saveState: saveStateOption,\n });\n\n const scrollHandler = new ScrollHandler({\n refreshHitAreas,\n treeElement,\n });\n\n const getScrollLeft = scrollHandler.getScrollLeft.bind(scrollHandler);\n\n const dndHandler = new DragAndDropHandler({\n autoEscape,\n classNames,\n getNodeElement,\n getNodeElementForNode,\n getScrollLeft,\n getTree,\n onCanMove,\n onCanMoveTo,\n onDragMove,\n onDragStop,\n onIsMoveHandle,\n openFolderDelay,\n openNode,\n refreshElements,\n slide,\n treeElement,\n triggerEvent,\n });\n\n const keyHandler = new KeyHandler({\n closeNode,\n focusNode: this.focusNode.bind(this),\n getActiveNode: this.getActiveNode.bind(this),\n getFocusedNode,\n getSelectedNode,\n getTree,\n keyboardSupport,\n multiSelect,\n openNode,\n selectNode,\n toggleNodeInSelection,\n triggerEvent,\n });\n\n const renderer = new ElementsRenderer({\n ariaLabel,\n ariaLabelledBy,\n autoEscape,\n buttonLeft,\n classNames,\n closedIcon,\n dragAndDrop,\n getTree,\n htmlElement: treeElement,\n isNodeSelected,\n multiSelect,\n onCreateLi,\n openedIcon,\n rtl,\n setNodeElement,\n showEmptyFolder,\n tabIndex,\n });\n\n const getNode = this.getNode.bind(this);\n const onMouseCapture = this.mouseCapture.bind(this);\n const onMouseDrag = this.mouseDrag.bind(this);\n const onMouseStart = this.mouseStart.bind(this);\n const onMouseStop = this.mouseStop.bind(this);\n\n const mouseHandler = new MouseHandler({\n classNames,\n element: treeElement,\n getMouseDelay,\n getNode,\n onClickButton: this.toggle.bind(this),\n onClickTitle,\n onMouseCapture,\n onMouseDrag,\n onMouseStart,\n onMouseStop,\n triggerEvent,\n useContextMenu: this.options.useContextMenu,\n });\n\n this.dataLoader = dataLoader;\n this.dndHandler = dndHandler;\n this.keyHandler = keyHandler;\n this.mouseHandler = mouseHandler;\n this.renderer = renderer;\n this.saveStateHandler = saveStateHandler;\n this.scrollHandler = scrollHandler;\n this.selectNodeHandler = selectNodeHandler;\n\n if (multiSelect) {\n treeElement.addEventListener(\"focusin\", this.handleFocusIn);\n }\n\n this.initData();\n }\n\n /**\n * Adds a sibling after a node.\n *\n * @returns The new node, or `null` when the node has no parent.\n * @group Changing the tree\n */\n public addNodeAfter(nodeData: NodeData, existingNode: Node): Node | null {\n const newNode = existingNode.addAfter(nodeData);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n /**\n * Adds a sibling before a node.\n *\n * @returns The new node, or `null` when the node has no parent.\n * @group Changing the tree\n */\n public addNodeBefore(nodeData: NodeData, existingNode: Node): Node | null {\n const newNode = existingNode.addBefore(nodeData);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n /**\n * Inserts a new node between a node and its parent, taking the node as its\n * child.\n *\n * @returns The new node, or `null` when the node has no parent.\n * @group Changing the tree\n */\n public addParentNode(nodeData: NodeData, existingNode: Node): Node | null {\n const newNode = existingNode.addParent(nodeData);\n\n if (newNode) {\n this.refreshElements(newNode.parent);\n }\n\n return newNode;\n }\n\n /**\n * Adds a node to the selection instead of replacing it.\n *\n * @param mustSetFocus - Move the focus to the node. Default `true`.\n * @group Selection\n */\n public addToSelection(node: Node, mustSetFocus = true) {\n this.selectNodeHandler.addToSelection(node);\n this.openParents(node);\n\n this.getNodeElementForNode(node).select(mustSetFocus);\n\n this.updateTabStop();\n this.saveState();\n }\n\n /**\n * Adds a node as the last child of a parent.\n *\n * @example\n * ```js\n * tree.appendNode({ name: \"child\", id: 5 }, tree.getNodeById(1));\n * ```\n *\n * @returns The new node.\n * @group Changing the tree\n */\n public appendNode(nodeData: NodeData, parentNode: Node): Node {\n const node = parentNode.append(nodeData);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n /**\n * Closes a folder. Await the promise when you need to know the closing\n * animation has finished.\n *\n * @example\n * ```js\n * await tree.closeNode(node);\n * console.log(\"closed\");\n * ```\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public async closeNode(node: Node, slide?: boolean): Promise<void> {\n if (!(node.isFolder() || node.isEmptyFolder)) {\n return;\n }\n\n await this.createFolderElement(node).close(\n slide ?? this.options.slide,\n this.options.animationSpeed,\n );\n\n this.saveState();\n }\n\n /**\n * Empties the element and removes the tree's document-level keyboard\n * listener. Call it when you remove the tree from the page.\n *\n * @group Other\n */\n public deinit(): void {\n this.htmlElement.textContent = \"\";\n\n this.dataLoader.deinit();\n this.keyHandler.deinit();\n this.mouseHandler.deinit();\n this.htmlElement.removeEventListener(\"focusin\", this.handleFocusIn);\n\n this.tree = new Node({}, true);\n }\n\n /**\n * Returns the node that belongs to a `li` element the tree rendered.\n *\n * @group Finding nodes\n */\n public getNode(element: HTMLElement): Node | null {\n const liElement = element.closest<HTMLElement>(\n `li.${this.classNames.common}`,\n );\n\n return liElement ? (this.nodeMap.get(liElement) ?? null) : null;\n }\n\n /**\n * Returns the first node for which the callback returns `true`.\n *\n * @example\n * ```js\n * const node = tree.getNodeByCallback((node) => node.children.length > 3);\n * ```\n *\n * @group Finding nodes\n */\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n return this.tree.getNodeByCallback(callback);\n }\n\n /**\n * Returns the node with this id.\n *\n * @example\n * ```js\n * const node = tree.getNodeById(1);\n * ```\n *\n * @group Finding nodes\n */\n public getNodeById(id: NodeId): Node | null {\n return this.tree.getNodeById(id);\n }\n\n /**\n * Returns the first node with this name.\n *\n * @group Finding nodes\n */\n public getNodeByName(name: string): Node | null {\n return this.tree.getNodeByName(name);\n }\n\n /**\n * Like `getNodeByName`, but throws when there is no such node. Convenient\n * in tests and when a missing node is a bug.\n *\n * @group Finding nodes\n */\n public getNodeByNameMustExist(name: string): Node {\n return this.tree.getNodeByNameMustExist(name);\n }\n\n /**\n * Returns all nodes with this property value.\n *\n * @example\n * ```js\n * tree.getNodesByProperty(\"color\", \"green\");\n * ```\n *\n * @group Finding nodes\n */\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.tree.getNodesByProperty(key, value);\n }\n\n /**\n * Returns the selected node, or `null` when nothing is selected.\n *\n * @group Selection\n */\n public getSelectedNode(): Node | null {\n return this.selectNodeHandler.getSelectedNode();\n }\n\n /**\n * Returns the selected nodes.\n *\n * @group Selection\n */\n public getSelectedNodes(): Node[] {\n return this.selectNodeHandler.getSelectedNodes();\n }\n\n /**\n * Returns the current state — `open_nodes` and `selected_node` — whether or\n * not `saveState` is enabled.\n *\n * @group State\n */\n public getState(): null | SavedState {\n return this.saveStateHandler.getState();\n }\n\n /**\n * Returns the state as it is stored.\n *\n * @group State\n */\n public getStateFromStorage(): null | SavedState {\n return this.saveStateHandler.getStateFromStorage();\n }\n\n /**\n * Returns the root node. It is not rendered; its `children` are the\n * top-level nodes. Also available as the `tree` property.\n *\n * @group Finding nodes\n */\n public getTree(): Node {\n return this.tree;\n }\n\n /**\n * Returns the version of tree-element.\n *\n * @group Other\n */\n public getVersion(): string {\n return __version__;\n }\n\n /**\n * Returns whether the user is dragging a node.\n *\n * @group Other\n */\n public isDragging(): boolean {\n return this.dndHandler.isDragging;\n }\n\n /**\n * Returns whether the node is selected.\n *\n * @group Selection\n */\n public isNodeSelected(node: Node): boolean {\n return this.selectNodeHandler.isNodeSelected(node);\n }\n\n /**\n * Loads data into the tree.\n *\n * @param parentNode - Replace this node's children instead of the whole\n * tree.\n * @group Loading data\n */\n public loadData(data: NodeData[] | null, parentNode?: Node): void {\n if (data) {\n if (parentNode) {\n this.deselectNodes(parentNode);\n this.loadSubtree(data, parentNode);\n } else {\n this.initTree(data);\n }\n\n if (this.isDragging()) {\n this.dndHandler.refresh();\n }\n }\n\n this.triggerEvent(\"tree.set_data\", {\n node: parentNode,\n treeData: data ?? undefined,\n });\n }\n\n /**\n * Fetches data and loads it into the tree, or into `parentNode`.\n *\n * @param url - Defaults to the `dataUrl` option.\n * @group Loading data\n */\n public async loadDataFromUrl(url?: string, parentNode?: Node): Promise<void> {\n const requestUrl = url\n ? new RequestUrl(url)\n : this.createRequestUrl(parentNode);\n\n if (requestUrl) {\n await this.dataLoader.loadFromUrl(requestUrl, parentNode);\n }\n }\n\n /**\n * Selects the next visible node, like the down arrow key. With\n * `multiSelect` it moves the focus instead.\n *\n * @group Selection\n */\n public moveDown() {\n this.keyHandler.moveDown();\n }\n\n /**\n * Moves a node inside the tree.\n *\n * @example\n * ```js\n * tree.moveNode(tree.getNodeById(2), tree.getNodeById(1), \"inside\");\n * ```\n *\n * @param position - `\"before\"`, `\"after\"` or `\"inside\"`.\n * @group Changing the tree\n */\n public moveNode(node: Node, targetNode: Node, position: Position): void {\n this.tree.moveNode(node, targetNode, position);\n this.refreshElements(null);\n }\n\n /**\n * Selects the previous visible node, like the up arrow key. With\n * `multiSelect` it moves the focus instead.\n *\n * @group Selection\n */\n public moveUp() {\n this.keyHandler.moveUp();\n }\n\n /**\n * Opens a folder, and the folders above it. A node marked `load_on_demand`\n * is fetched first, so await the promise when you need to know it is really\n * open.\n *\n * @example\n * ```js\n * await tree.openNode(node);\n * console.log(\"open\");\n * ```\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public async openNode(node: Node, slide?: boolean): Promise<void> {\n const mustSlide = slide ?? this.options.slide;\n\n const doOpenNode = async (\n openedNode: Node,\n slideOption: boolean,\n ): Promise<void> => {\n if (!node.children.length) {\n return;\n }\n\n const folderElement = this.createFolderElement(openedNode);\n\n await folderElement.open(slideOption, this.options.animationSpeed);\n };\n\n if (node.isFolder() || node.isEmptyFolder) {\n if (node.load_on_demand) {\n await this.loadFolderOnDemand(node, mustSlide);\n } else {\n let parent = node.parent;\n\n while (parent) {\n // nb: do not open root element\n if (parent.parent) {\n await doOpenNode(parent, false);\n }\n parent = parent.parent;\n }\n\n await doOpenNode(node, mustSlide);\n\n this.saveState();\n }\n }\n }\n\n /**\n * Adds a node as the first child of a parent.\n *\n * @returns The new node.\n * @group Changing the tree\n */\n public prependNode(nodeData: NodeData, parentNode: Node): Node {\n const node = parentNode.prepend(nodeData);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n /**\n * Re-renders the whole tree. Needed after changing node data directly\n * instead of through these methods.\n *\n * @group Changing the tree\n */\n public refresh() {\n this.refreshElements(null);\n }\n\n /**\n * Recomputes the drop targets. Call this if the layout changes during a\n * drag.\n *\n * @group Other\n */\n public refreshHitAreas() {\n this.dndHandler.refresh();\n }\n\n /**\n * Removes a node from the selection.\n *\n * @group Selection\n */\n public removeFromSelection(node: Node) {\n this.selectNodeHandler.removeFromSelection(node);\n\n this.getNodeElementForNode(node).deselect();\n this.updateTabStop();\n this.saveState();\n }\n\n /**\n * Removes a node and its children.\n *\n * @group Changing the tree\n */\n public removeNode(node: Node): void {\n this.selectNodeHandler.removeFromSelection(node, true); // including children\n\n const parent = node.parent;\n node.remove();\n this.refreshElements(parent);\n }\n\n /**\n * Scrolls the node into view.\n *\n * @group Selection\n */\n public scrollToNode(node: Node) {\n if (!node.element) {\n return;\n }\n\n const top = getOffsetTop(node.element) - getOffsetTop(this.htmlElement);\n\n this.scrollHandler.scrollToY(top);\n }\n\n /**\n * Replaces the selection, and opens the parents of the node.\n *\n * @param node - `null` clears the selection.\n * @param options - `mustSetFocus`: move focus to the node, default `true`.\n * `mustToggle`: deselect the node if it is already selected, default\n * `false`.\n * @group Selection\n */\n public selectNode(node: Node | null, options?: SelectNodeOptions): void {\n if (!node) {\n // Called with empty node -> deselect all nodes\n this.deselectAllNodes();\n this.saveStateHandler.saveState();\n return;\n }\n\n // Unlike a click, selecting the selected node again keeps it selected\n this.selectNodeHandler.selectSingleNode(node, {\n mustToggle: false,\n ...options,\n });\n }\n\n /**\n * Changes an option after construction. See\n * [Options](/reference/options#changing-an-option-later) for the caveats.\n *\n * @group Other\n */\n public setOption(option: string, value: unknown) {\n (this.options as unknown as Record<string, unknown>)[option] = value;\n }\n\n /**\n * Applies a state to the tree, and saves it to storage when `saveState` is\n * enabled.\n *\n * @group State\n */\n public setState(state: SavedState) {\n this.saveStateHandler.setInitialState(state);\n this.refreshElements(null);\n this.saveState();\n }\n\n /**\n * Closes an open node and opens a closed one. Await the promise when you\n * need to know the node is really open or closed, like with `openNode` and\n * `closeNode`.\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public async toggle(node: Node, slide: boolean | null = null): Promise<void> {\n const mustSlide = slide ?? this.options.slide;\n\n if (node.is_open) {\n await this.closeNode(node, mustSlide);\n } else {\n await this.openNode(node, mustSlide);\n }\n }\n\n /**\n * Returns the tree as a json string, including changes made through the\n * api.\n *\n * @group Other\n */\n public toJson(): string {\n return JSON.stringify(this.tree.getData());\n }\n\n /**\n * Updates the data of a node and re-renders it. A string updates just the\n * name.\n *\n * Changing the `id` re-indexes the node. `children` and `parent` are\n * ignored — use `loadData` or `moveNode` for those.\n *\n * @example\n * ```js\n * tree.updateNode(node, \"new name\");\n * tree.updateNode(node, { name: \"new name\", color: \"red\" });\n * ```\n *\n * @group Changing the tree\n */\n public updateNode(node: Node, data: NodeData): void {\n const idIsChanged =\n typeof data === \"object\" && data.id && data.id !== node.id;\n\n if (idIsChanged) {\n this.tree.removeNodeFromIndex(node);\n }\n\n node.setData(data);\n\n if (idIsChanged) {\n this.tree.addNodeToIndex(node);\n }\n\n if (\n typeof data === \"object\" &&\n data.children &&\n Array.isArray(data.children)\n ) {\n node.removeChildren();\n\n if (data.children.length) {\n node.loadFromData(data.children);\n }\n }\n\n this.refreshElements(node);\n }\n\n // Open the nodes up to the autoOpen level. A folder that is loaded on\n // demand is fetched first, and its children are opened when the data has\n // arrived.\n private async autoOpenNodesOnDemand(): Promise<void> {\n const maxLevel = this.getAutoOpenMaxLevel();\n\n const openNodes = async (): Promise<void> => {\n const loading: Promise<void>[] = [];\n\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n if (!node.is_loading) {\n loading.push(this.openNode(node, false).then(openNodes));\n }\n\n return false;\n }\n void this.openNode(node, false);\n\n return level !== maxLevel;\n });\n\n await Promise.all(loading);\n };\n\n await openNodes();\n }\n\n private createFolderElement(node: Node) {\n const classNames = this.classNames;\n const closedIconElement = this.renderer.closedIconElement;\n const getScrollLeft = this.scrollHandler.getScrollLeft.bind(\n this.scrollHandler,\n );\n const openedIconElement = this.renderer.openedIconElement;\n const tabIndex = this.options.tabIndex;\n const treeElement = this.htmlElement;\n const triggerEvent = this.triggerEvent.bind(this);\n\n // A selected node in a closed folder is rendered when the folder is\n // opened, which can be after it was selected. It becomes the tab stop\n // then, so the fallback tab stop must go.\n const renderChildren = (folder: Node) => {\n const ul = this.renderer.renderChildren(folder);\n this.updateTabStop();\n return ul;\n };\n\n return new FolderElement({\n classNames,\n closedIconElement,\n getScrollLeft,\n multiSelect: this.options.multiSelect,\n node,\n openedIconElement,\n renderChildren,\n tabIndex,\n treeElement,\n triggerEvent,\n });\n }\n\n private createNodeElement(node: Node) {\n const classNames = this.classNames;\n const getScrollLeft = this.scrollHandler.getScrollLeft.bind(\n this.scrollHandler,\n );\n const tabIndex = this.options.tabIndex;\n const treeElement = this.htmlElement;\n\n return new NodeElement({\n classNames,\n getScrollLeft,\n multiSelect: this.options.multiSelect,\n node,\n tabIndex,\n treeElement,\n });\n }\n\n /* Create a RequestUrl based on the url in the options.\n * Add a 'node' query parameter for loading on demand\n * Add a 'selected_node' query parameter if a node is selected.\n */\n private createRequestUrl(node?: Node): null | RequestUrl {\n const dataUrl = this.options.dataUrl;\n\n const url = typeof dataUrl === \"function\" ? dataUrl(node) : dataUrl;\n\n if (!url) {\n return null;\n }\n\n const requestUrl = new RequestUrl(url);\n\n if (node?.id) {\n // Load on demand of a subtree; add node parameter\n requestUrl.setSearchParam(\"node\", node.id.toString());\n } else {\n // Add selected_node parameter\n const selectedNodeId = this.getNodeIdToBeSelected();\n if (selectedNodeId) {\n requestUrl.setSearchParam(\"selected_node\", selectedNodeId.toString());\n }\n }\n\n return requestUrl;\n }\n\n private deselectAllNodes(): void {\n for (const node of this.getSelectedNodes()) {\n this.removeFromSelection(node);\n }\n }\n\n // Deselect the children of the node.\n private deselectNodes(parentNode: Node): void {\n const selectedNodesUnderParent =\n this.selectNodeHandler.getSelectedNodesUnder(parentNode);\n for (const n of selectedNodesUnderParent) {\n this.selectNodeHandler.removeFromSelection(n);\n }\n }\n\n // The treeitem of the first node, or null when the tree is empty\n // Move the focus to a node, without selecting it\n private focusNode(node: Node): void {\n this.activeNode = node;\n this.updateTabStop();\n node.element?.focus();\n }\n\n // With multiSelect: the active node, if it is still rendered in the tree\n private getActiveNode(): Node | null {\n const element = this.activeNode?.element;\n\n return element && this.htmlElement.contains(element)\n ? this.activeNode\n : null;\n }\n\n // Get the maximum level for auto open\n private getAutoOpenMaxLevel(): number {\n if (this.options.autoOpen === true) {\n return -1;\n }\n if (typeof this.options.autoOpen === \"number\") {\n return this.options.autoOpen;\n }\n if (typeof this.options.autoOpen === \"string\") {\n return parseInt(this.options.autoOpen, 10);\n }\n\n /* istanbul ignore next @preserve */\n return 0;\n }\n\n private getFirstTreeItem(): HTMLElement | null {\n return this.tree.children[0]?.element ?? null;\n }\n\n // The node of the HTML element that has the focus, if it is in this tree\n private getFocusedNode(): Node | null {\n const activeElement = document.activeElement;\n\n /* istanbul ignore if */\n if (!activeElement) {\n return null;\n }\n\n // The keyboard must still work for input elements.\n const tagName = activeElement.tagName;\n if (tagName !== \"A\" && tagName !== \"LI\" && tagName !== \"SPAN\") {\n return null;\n }\n\n const node = this.getNode(activeElement as HTMLElement);\n return node?.tree === this.tree ? node : null;\n }\n\n private getNodeElement(element: HTMLElement): NodeElement | null {\n const node = this.getNode(element);\n return node ? this.getNodeElementForNode(node) : null;\n }\n\n private getNodeElementForNode(node: Node): NodeElement {\n return node.isFolder()\n ? this.createFolderElement(node)\n : this.createNodeElement(node);\n }\n\n private getNodeIdToBeSelected(): NodeId | null {\n return this.saveStateHandler.getNodeIdToBeSelected();\n }\n\n // With multiSelect, the focused node becomes the tab stop\n private handleFocusIn = (): void => {\n const node = this.getFocusedNode();\n\n if (!node || node === this.activeNode) {\n return;\n }\n\n this.activeNode = node;\n this.updateTabStop();\n };\n\n private hasRenderedSelectedNode(): boolean {\n return this.getSelectedNodes().some((node) => Boolean(node.element));\n }\n\n private initData(): void {\n if (this.options.data) {\n this.loadData(this.options.data);\n } else {\n const dataUrl = this.createRequestUrl();\n\n if (dataUrl) {\n void this.loadDataFromUrl();\n } else {\n this.loadData([]);\n }\n }\n }\n\n private initTree(data: NodeData[]): void {\n const doInit = (): void => {\n if (this.isInitialized) {\n return;\n }\n\n this.isInitialized = true;\n this.triggerEvent(\"tree.init\");\n };\n\n this.tree = new this.options.nodeClass(null, true, this.options.nodeClass);\n\n this.selectNodeHandler.clear();\n\n this.tree.loadFromData(data);\n\n const mustLoadOnDemand = this.setInitialState();\n\n this.refreshElements(null);\n\n if (mustLoadOnDemand) {\n // Load data on demand and then init the tree\n void this.setInitialStateOnDemand().then(doInit);\n } else {\n doInit();\n }\n }\n\n // Does an HTML element of the tree have the focus?\n private isFocusOnTree(): boolean {\n return this.getFocusedNode() !== null;\n }\n\n private isSelectedNodeInSubtree(subtree: Node): boolean {\n const selectedNode = this.getSelectedNode();\n\n return selectedNode\n ? subtree === selectedNode || subtree.isParentOf(selectedNode)\n : false;\n }\n\n private async loadFolderOnDemand(node: Node, slide: boolean): Promise<void> {\n node.is_loading = true;\n\n await this.loadDataFromUrl(undefined, node);\n\n // Loading failed, or there is no url. Opening the node now would load it\n // again, without end. Leave it closed so the user can try again.\n if (node.load_on_demand) {\n node.is_loading = false;\n return;\n }\n\n await this.openNode(node, slide);\n }\n\n private loadSubtree(data: NodeData[], parentNode: Node): void {\n parentNode.loadFromData(data);\n\n parentNode.load_on_demand = false;\n parentNode.is_loading = false;\n\n this.refreshElements(parentNode);\n }\n\n private mouseCapture(positionInfo: PositionInfo): boolean | null {\n return this.options.dragAndDrop\n ? this.dndHandler.mouseCapture(positionInfo)\n : false;\n }\n\n private mouseDrag(positionInfo: PositionInfo): boolean {\n /* istanbul ignore if */\n if (!this.options.dragAndDrop) {\n return false;\n }\n\n const result = this.dndHandler.mouseDrag(positionInfo);\n this.scrollHandler.checkScrolling(positionInfo);\n return result;\n }\n\n private mouseStart(positionInfo: PositionInfo): boolean {\n /* istanbul ignore if */\n if (!this.options.dragAndDrop) {\n return false;\n }\n\n return this.dndHandler.mouseStart(positionInfo);\n }\n\n private mouseStop(positionInfo: PositionInfo): boolean {\n /* istanbul ignore if */\n if (!this.options.dragAndDrop) {\n return false;\n }\n\n this.scrollHandler.stopScrolling();\n return this.dndHandler.mouseStop(positionInfo);\n }\n\n private openParents(node: Node) {\n const parent = node.parent;\n\n if (parent?.parent && !parent.is_open) {\n void this.openNode(parent, false);\n }\n }\n\n /*\n Redraw the tree or part of the tree.\n from_node: redraw this subtree\n */\n private refreshElements(fromNode: Node | null): void {\n const mustSetFocus = this.isFocusOnTree();\n const mustSelect = fromNode\n ? this.isSelectedNodeInSubtree(fromNode)\n : false;\n\n this.renderer.render(fromNode);\n\n if (mustSelect) {\n this.selectCurrentNode(mustSetFocus);\n }\n\n this.updateTabStop();\n\n this.triggerEvent(\"tree.refresh\");\n }\n\n private saveState(): void {\n this.saveStateHandler.saveState();\n }\n\n private selectCurrentNode(mustSetFocus: boolean): void {\n const node = this.getSelectedNode();\n if (!node) {\n return;\n }\n\n const nodeElement = this.getNodeElementForNode(node);\n nodeElement.select(mustSetFocus);\n }\n\n // Set initial state, either by restoring the state or auto-opening nodes\n // result: must load nodes on demand?\n private setInitialState(): boolean {\n const restoreState = (): [boolean, boolean] => {\n // result: is state restored, must load on demand?\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (state) {\n const mustLoadOnDemand = this.saveStateHandler.setInitialState(state);\n\n // return true: the state is restored\n return [true, mustLoadOnDemand];\n }\n return [false, false];\n };\n\n const autoOpenNodes = (): boolean => {\n // result: must load on demand?\n if (this.options.autoOpen === false) {\n return false;\n }\n\n const maxLevel = this.getAutoOpenMaxLevel();\n let mustLoadOnDemand = false;\n\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n mustLoadOnDemand = true;\n return false;\n }\n if (node.hasChildren()) {\n node.is_open = true;\n return level !== maxLevel;\n }\n return false;\n });\n\n return mustLoadOnDemand;\n };\n\n let [isRestored, mustLoadOnDemand] = restoreState(); // eslint-disable-line prefer-const\n\n if (!isRestored) {\n mustLoadOnDemand = autoOpenNodes();\n }\n\n return mustLoadOnDemand;\n }\n\n // Set the initial state for nodes that are loaded on demand\n private async setInitialStateOnDemand(): Promise<void> {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (state) {\n await this.saveStateHandler.setInitialStateOnDemand(state);\n } else {\n await this.autoOpenNodesOnDemand();\n }\n }\n\n // Set this HTML element to this node in the node map.\n private setNodeElement(element: HTMLElement, node: Node) {\n this.nodeMap.set(element, node);\n }\n\n private triggerEvent<Name extends TreeEventName>(\n eventName: Name,\n values?: TreeEvents[Name],\n ): boolean {\n return this.triggerEventProvider(this.htmlElement, eventName, values);\n }\n\n /* Keyboard users reach the tree through the tab stop. The selected node is\n * the tab stop, see NodeElement.select. Without a selected node, the first\n * node is the tab stop, so the tree can always be reached.\n * With multiSelect the tab stop is the active node: the node that was\n * focused last. Without one, it is the first node.\n */\n private updateTabStop(): void {\n const tabIndex = this.options.tabIndex;\n const multiSelect = this.options.multiSelect;\n const previousTabStop = this.fallbackTabStop;\n let tabStop: HTMLElement | null;\n\n if (tabIndex == null) {\n tabStop = null;\n } else if (multiSelect) {\n tabStop = this.getActiveNode()?.element ?? this.getFirstTreeItem();\n } else {\n tabStop = this.hasRenderedSelectedNode() ? null : this.getFirstTreeItem();\n }\n\n if (\n previousTabStop &&\n previousTabStop !== tabStop &&\n (multiSelect || previousTabStop.getAttribute(\"aria-selected\") !== \"true\")\n ) {\n previousTabStop.setAttribute(\"tabindex\", \"-1\");\n }\n\n if (tabStop && tabIndex != null) {\n tabStop.setAttribute(\"tabindex\", String(tabIndex));\n }\n\n this.fallbackTabStop = tabStop;\n }\n}\n\nexport {\n type MoveInfo,\n type TreeEvent,\n type TreeEventName,\n type TreeEvents,\n} from \"./events\";\nexport { type Node, type NodeData, type NodeId, type Position } from \"./node\";\nexport { type TreeElementOptions } from \"./options\";\nexport { type SavedState } from \"./saveStateHandler\";\nexport { type SelectNodeOptions } from \"./selectNodeHandler\";\n"],"names":["activeNode","classNames","dataLoader","dndHandler","fallbackTabStop","htmlElement","isInitialized","keyHandler","mouseHandler","nodeMap","options","renderer","saveStateHandler","scrollHandler","selectNodeHandler","tree","triggerEventProvider","getNodeElement","getNodeElementForNode","getFocusedNode","openParents","refreshElements","setNodeElement","triggerEvent","updateTabStop","saveState","addToSelection","getSelectedNodes","isNodeSelected","removeFromSelection","selectSingleNode","toggleNodeInSelection","focusNode","getScrollLeft","getActiveNode","mouseCapture","mouseDrag","mouseStart","mouseStop","handleFocusIn","initData","select","createFolderElement","close","deinit","getSelectedNode","getState","getStateFromStorage","__version__","isDragging","deselectNodes","loadSubtree","initTree","refresh","createRequestUrl","loadFromUrl","moveDown","moveUp","open","loadFolderOnDemand","deselect","scrollToY","deselectAllNodes","setInitialState","autoOpenNodesOnDemand","getAutoOpenMaxLevel","closedIconElement","openedIconElement","renderChildren","createNodeElement","setSearchParam","getNodeIdToBeSelected","getSelectedNodesUnder","getFirstTreeItem","hasRenderedSelectedNode","clear","setInitialStateOnDemand","isFocusOnTree","isSelectedNodeInSubtree","checkScrolling","stopScrolling","render","selectCurrentNode"],"mappings":"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"}
@@ -1,34 +1,45 @@
1
- import type { CloseNode, GetFocusedNode, GetSelectedNode, GetTree, OpenNode, SelectNode, TriggerEvent } from "./methodTypes.js";
1
+ import type { CloseNode, FocusNode, GetActiveNode, GetFocusedNode, GetSelectedNode, GetTree, OpenNode, SelectNode, ToggleNodeInSelection, TriggerEvent } from "./methodTypes.js";
2
2
  interface KeyHandlerParams {
3
3
  closeNode: CloseNode;
4
+ focusNode: FocusNode;
5
+ getActiveNode: GetActiveNode;
4
6
  getFocusedNode: GetFocusedNode;
5
7
  getSelectedNode: GetSelectedNode;
6
8
  getTree: GetTree;
7
9
  keyboardSupport: boolean;
10
+ multiSelect: boolean;
8
11
  openNode: OpenNode;
9
12
  selectNode: SelectNode;
13
+ toggleNodeInSelection: ToggleNodeInSelection;
10
14
  triggerEvent: TriggerEvent;
11
15
  }
12
16
  export default class KeyHandler {
13
17
  private closeNode;
18
+ private focusNode;
19
+ private getActiveNode;
14
20
  private getFocusedNode;
15
21
  private getSelectedNode;
16
22
  private getTree;
17
23
  private keyboardSupport;
24
+ private multiSelect;
18
25
  private openNode;
19
26
  private originalSelectNode;
27
+ private toggleNodeInSelection;
20
28
  private triggerEvent;
21
- constructor({ closeNode, getFocusedNode, getSelectedNode, getTree, keyboardSupport, openNode, selectNode, triggerEvent, }: KeyHandlerParams);
29
+ constructor({ closeNode, focusNode, getActiveNode, getFocusedNode, getSelectedNode, getTree, keyboardSupport, multiSelect, openNode, selectNode, toggleNodeInSelection, triggerEvent, }: KeyHandlerParams);
22
30
  deinit(): void;
23
31
  moveDown(): boolean;
24
32
  moveUp(): boolean;
25
33
  private activate;
34
+ private getCurrentNode;
35
+ private goToNode;
26
36
  private handleArrowKey;
37
+ private handleKey;
27
38
  private handleKeyDown;
28
39
  private handleKeyWithoutSelection;
29
40
  private moveLeft;
30
41
  private moveRight;
31
- private selectNode;
42
+ private toggle;
32
43
  }
33
44
  export {};
34
45
  //# sourceMappingURL=keyHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"keyHandler.d.ts","sourceRoot":"","sources":["../src/keyHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,OAAO,EACP,QAAQ,EACR,UAAU,EACV,YAAY,EACb,MAAM,eAAe,CAAC;AAGvB,UAAU,gBAAgB;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,YAAY,CAAe;gBAEvB,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,OAAO,EACP,eAAe,EACf,QAAQ,EACR,UAAU,EACV,YAAY,GACb,EAAE,gBAAgB;IAeZ,MAAM,IAAI,IAAI;IAMd,QAAQ,IAAI,OAAO;IAInB,MAAM,IAAI,OAAO;IAKxB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,aAAa,CAsCnB;IAIF,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,UAAU;CAQnB"}
1
+ {"version":3,"file":"keyHandler.d.ts","sourceRoot":"","sources":["../src/keyHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,cAAc,EACd,eAAe,EACf,OAAO,EACP,QAAQ,EACR,UAAU,EACV,qBAAqB,EACrB,YAAY,EACb,MAAM,eAAe,CAAC;AAGvB,UAAU,gBAAgB;IACxB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,YAAY,EAAE,YAAY,CAAC;CAC5B;AAOD,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,YAAY,CAAe;gBAEvB,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,cAAc,EACd,eAAe,EACf,OAAO,EACP,eAAe,EACf,WAAW,EACX,QAAQ,EACR,UAAU,EACV,qBAAqB,EACrB,YAAY,GACb,EAAE,gBAAgB;IAmBZ,MAAM,IAAI,IAAI;IAMd,QAAQ,IAAI,OAAO;IAInB,MAAM,IAAI,OAAO;IAKxB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,aAAa,CA8CnB;IAEF,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,MAAM;CAIf"}