tree-element 0.3.2 → 0.4.1

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 (91) hide show
  1. package/README.md +23 -20
  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 +10 -7
  7. package/lib/dataLoader.js.map +1 -1
  8. package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -1
  9. package/lib/dragAndDropHandler/generateHitAreas.js +3 -2
  10. package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -1
  11. package/lib/dragAndDropHandler/index.d.ts +2 -4
  12. package/lib/dragAndDropHandler/index.d.ts.map +1 -1
  13. package/lib/dragAndDropHandler/index.js +2 -9
  14. package/lib/dragAndDropHandler/index.js.map +1 -1
  15. package/lib/elementsRenderer.d.ts +11 -4
  16. package/lib/elementsRenderer.d.ts.map +1 -1
  17. package/lib/elementsRenderer.js +104 -43
  18. package/lib/elementsRenderer.js.map +1 -1
  19. package/lib/events.d.ts +13 -7
  20. package/lib/events.d.ts.map +1 -1
  21. package/lib/folderOpenState.d.ts +8 -0
  22. package/lib/folderOpenState.d.ts.map +1 -0
  23. package/lib/folderOpenState.js +22 -0
  24. package/lib/folderOpenState.js.map +1 -0
  25. package/lib/index.d.ts +27 -20
  26. package/lib/index.d.ts.map +1 -1
  27. package/lib/index.js +166 -65
  28. package/lib/index.js.map +1 -1
  29. package/lib/keyHandler.d.ts +16 -3
  30. package/lib/keyHandler.d.ts.map +1 -1
  31. package/lib/keyHandler.js +79 -32
  32. package/lib/keyHandler.js.map +1 -1
  33. package/lib/methodTypes.d.ts +3 -0
  34. package/lib/methodTypes.d.ts.map +1 -1
  35. package/lib/mouseHandler.d.ts.map +1 -1
  36. package/lib/mouseHandler.js +12 -12
  37. package/lib/mouseHandler.js.map +1 -1
  38. package/lib/node.d.ts +12 -10
  39. package/lib/node.d.ts.map +1 -1
  40. package/lib/node.js +12 -10
  41. package/lib/node.js.map +1 -1
  42. package/lib/nodeElement/folderElement.d.ts +7 -5
  43. package/lib/nodeElement/folderElement.d.ts.map +1 -1
  44. package/lib/nodeElement/folderElement.js +35 -55
  45. package/lib/nodeElement/folderElement.js.map +1 -1
  46. package/lib/nodeElement/index.d.ts +3 -2
  47. package/lib/nodeElement/index.d.ts.map +1 -1
  48. package/lib/nodeElement/index.js +15 -12
  49. package/lib/nodeElement/index.js.map +1 -1
  50. package/lib/options.d.ts +29 -14
  51. package/lib/options.d.ts.map +1 -1
  52. package/lib/options.js +12 -0
  53. package/lib/options.js.map +1 -0
  54. package/lib/saveStateHandler.d.ts.map +1 -1
  55. package/lib/saveStateHandler.js +6 -6
  56. package/lib/saveStateHandler.js.map +1 -1
  57. package/lib/selectNodeHandler.d.ts +3 -0
  58. package/lib/selectNodeHandler.d.ts.map +1 -1
  59. package/lib/selectNodeHandler.js +66 -22
  60. package/lib/selectNodeHandler.js.map +1 -1
  61. package/lib/setDefaultOptions.d.ts.map +1 -1
  62. package/lib/setDefaultOptions.js +1 -0
  63. package/lib/setDefaultOptions.js.map +1 -1
  64. package/lib/version.d.ts +1 -1
  65. package/lib/version.js +1 -1
  66. package/lib/version.js.map +1 -1
  67. package/package.json +38 -32
  68. package/src/classNames.ts +4 -4
  69. package/src/dataLoader.ts +9 -10
  70. package/src/dragAndDropHandler/generateHitAreas.ts +3 -2
  71. package/src/dragAndDropHandler/index.ts +3 -17
  72. package/src/elementsRenderer.ts +124 -55
  73. package/src/events.ts +13 -7
  74. package/src/folderOpenState.ts +38 -0
  75. package/src/index.ts +191 -82
  76. package/src/keyHandler.ts +104 -34
  77. package/src/methodTypes.ts +6 -0
  78. package/src/mouseHandler.ts +15 -13
  79. package/src/node.ts +12 -10
  80. package/src/nodeElement/folderElement.ts +47 -72
  81. package/src/nodeElement/index.ts +20 -17
  82. package/src/options.ts +46 -14
  83. package/src/saveStateHandler.ts +5 -8
  84. package/src/selectNodeHandler.ts +69 -25
  85. package/src/setDefaultOptions.ts +1 -0
  86. package/src/version.ts +1 -1
  87. package/tree_element.css +48 -5
  88. package/tree_element.debug.js +540 -278
  89. package/tree_element.debug.js.map +1 -1
  90. package/tree_element.js +2 -2
  91. package/tree_element.js.map +1 -1
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 { ChangeableOption, 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 { changeableOptions } from \"./options\";\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 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 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. The siblings of the node\n * move along: the new node takes all children of the parent, and becomes its\n * only 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, and 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 that contain 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 (!openedNode.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. Only some options can be changed:\n * the others throw an error. See\n * [Options](/reference/options#changing-an-option-later).\n *\n * @group Other\n */\n public setOption(option: ChangeableOption, value: unknown) {\n if (!(changeableOptions as readonly string[]).includes(option)) {\n throw new Error(\n `The option ${option} can only be set in the constructor`,\n );\n }\n\n (this.options as unknown as Record<string, unknown>)[option] = value;\n\n switch (option) {\n case \"dragAndDrop\": {\n this.renderer.setDragAndDrop(Boolean(value));\n\n break;\n }\n case \"keyboardSupport\": {\n this.keyHandler.setKeyboardSupport(Boolean(value));\n\n break;\n }\n case \"multiSelect\": {\n this.setMultiSelect(Boolean(value));\n\n break;\n }\n case \"tabIndex\": {\n this.options.tabIndex = (value as null | number) ?? undefined;\n this.renderer.setTabIndex(this.options.tabIndex);\n this.fallbackTabStop = null;\n this.updateTabStop();\n\n break;\n }\n // No default\n }\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 getScrollLeft = this.scrollHandler.getScrollLeft.bind(\n this.scrollHandler,\n );\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 getScrollLeft,\n icons: this.renderer.icons,\n multiSelect: this.options.multiSelect,\n node,\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 // An active element must exist and the keyboard must still work for input elements.\n if (\n !activeElement ||\n ![\"A\", \"LI\", \"SPAN\"].includes(activeElement.tagName)\n ) {\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 // Before the tree is replaced: then the focused node is no longer in it\n const focusedNode = this.getFocusedNode();\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 (focusedNode) {\n this.restoreFocus(focusedNode);\n }\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 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): void {\n /* istanbul ignore if */\n if (!this.options.dragAndDrop) {\n return;\n }\n\n this.scrollHandler.stopScrolling();\n 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 focusedNode = this.getFocusedNode();\n\n // The renderer marks the selected nodes, so only the focus needs restoring\n this.renderer.render(fromNode);\n\n if (focusedNode) {\n this.restoreFocus(focusedNode);\n }\n\n this.updateTabStop();\n\n this.triggerEvent(\"tree.refresh\");\n }\n\n // Rendering replaces the elements of the nodes, so a focused element can be\n // gone. Then move the focus to the new element of the same node. After\n // loadData the nodes are new objects, so look the node up by its id.\n private restoreFocus(focusedNode: Node): void {\n if (this.htmlElement.contains(document.activeElement)) {\n return;\n }\n\n const node =\n (focusedNode.id == null ? null : this.getNodeById(focusedNode.id)) ??\n focusedNode;\n const element = node.element;\n\n if (element && this.htmlElement.contains(element)) {\n element.focus();\n }\n }\n\n private saveState(): void {\n this.saveStateHandler.saveState();\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 /* Change multiSelect after construction. The attributes of the nodes\n * depend on it, so the tree is rendered again. The selection is kept: a\n * tree without multiSelect can also have several selected nodes, see\n * addToSelection.\n */\n private setMultiSelect(multiSelect: boolean): void {\n const focusedNode = this.getFocusedNode();\n\n this.keyHandler.setMultiSelect(multiSelect);\n this.renderer.setMultiSelect(multiSelect);\n\n if (multiSelect) {\n this.htmlElement.addEventListener(\"focusin\", this.handleFocusIn);\n } else {\n this.htmlElement.removeEventListener(\"focusin\", this.handleFocusIn);\n }\n\n this.activeNode = multiSelect ? focusedNode : null;\n this.fallbackTabStop = null;\n this.refreshElements(null);\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 ChangeableOption, 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","setDragAndDrop","setKeyboardSupport","setMultiSelect","setTabIndex","setInitialState","autoOpenNodesOnDemand","getAutoOpenMaxLevel","renderChildren","icons","createNodeElement","setSearchParam","getNodeIdToBeSelected","getSelectedNodesUnder","getFirstTreeItem","hasRenderedSelectedNode","clear","restoreFocus","setInitialStateOnDemand","checkScrolling","stopScrolling","render"],"mappings":"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"}
@@ -1,34 +1,47 @@
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;
33
+ setKeyboardSupport(keyboardSupport: boolean): void;
34
+ setMultiSelect(multiSelect: boolean): void;
25
35
  private activate;
36
+ private getCurrentNode;
37
+ private goToNode;
26
38
  private handleArrowKey;
39
+ private handleKey;
27
40
  private handleKeyDown;
28
41
  private handleKeyWithoutSelection;
29
42
  private moveLeft;
30
43
  private moveRight;
31
- private selectNode;
44
+ private toggle;
32
45
  }
33
46
  export {};
34
47
  //# 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;IAKjB,kBAAkB,CAAC,eAAe,EAAE,OAAO,GAAG,IAAI;IAelD,cAAc,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI;IAKjD,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"}
package/lib/keyHandler.js CHANGED
@@ -1,21 +1,34 @@
1
+ /* The keys move from the selected node and select the node they move to.
2
+ * With multiSelect they move from the focused node and only move the focus;
3
+ * Space adds the focused node to the selection or removes it.
4
+ */
5
+
1
6
  class KeyHandler {
2
7
  constructor({
3
8
  _closeNode: closeNode,
9
+ _focusNode: focusNode,
10
+ _getActiveNode: getActiveNode,
4
11
  _getFocusedNode: getFocusedNode,
5
12
  _getSelectedNode: getSelectedNode,
6
13
  _getTree: getTree,
7
14
  _keyboardSupport: keyboardSupport,
15
+ _multiSelect: multiSelect,
8
16
  _openNode: openNode,
9
17
  _selectNode: selectNode,
18
+ _toggleNodeInSelection: toggleNodeInSelection,
10
19
  _triggerEvent: triggerEvent
11
20
  }) {
12
21
  this._closeNode = closeNode;
22
+ this._focusNode = focusNode;
23
+ this._getActiveNode = getActiveNode;
13
24
  this._getFocusedNode = getFocusedNode;
14
25
  this._getSelectedNode = getSelectedNode;
15
26
  this._getTree = getTree;
16
27
  this._keyboardSupport = keyboardSupport;
28
+ this._multiSelect = multiSelect;
17
29
  this._openNode = openNode;
18
30
  this._originalSelectNode = selectNode;
31
+ this._toggleNodeInSelection = toggleNodeInSelection;
19
32
  this._triggerEvent = triggerEvent;
20
33
  if (keyboardSupport) {
21
34
  document.addEventListener("keydown", this._handleKeyDown);
@@ -27,10 +40,28 @@ class KeyHandler {
27
40
  }
28
41
  }
29
42
  _moveDown() {
30
- return this._selectNode(this._getSelectedNode()?.getNextVisibleNode());
43
+ return this._goToNode(this._getCurrentNode()?.getNextVisibleNode());
31
44
  }
32
45
  _moveUp() {
33
- return this._selectNode(this._getSelectedNode()?.getPreviousVisibleNode());
46
+ return this._goToNode(this._getCurrentNode()?.getPreviousVisibleNode());
47
+ }
48
+
49
+ // Change keyboardSupport after construction
50
+ _setKeyboardSupport(keyboardSupport) {
51
+ if (keyboardSupport === this._keyboardSupport) {
52
+ return;
53
+ }
54
+ this._keyboardSupport = keyboardSupport;
55
+ if (keyboardSupport) {
56
+ document.addEventListener("keydown", this._handleKeyDown);
57
+ } else {
58
+ document.removeEventListener("keydown", this._handleKeyDown);
59
+ }
60
+ }
61
+
62
+ // Change multiSelect after construction
63
+ _setMultiSelect(multiSelect) {
64
+ this._multiSelect = multiSelect;
34
65
  }
35
66
 
36
67
  // Activate the node, for example to open its edit page.
@@ -41,6 +72,26 @@ class KeyHandler {
41
72
  });
42
73
  return true;
43
74
  }
75
+
76
+ // No node is selected. These keys select the focused node, which is
77
+ // usually the first node, see TreeElement.updateTabStop.
78
+ _getCurrentNode() {
79
+ return this._multiSelect ? this._getActiveNode() : this._getSelectedNode();
80
+ }
81
+
82
+ // Move to the node: select it, or with multiSelect focus it.
83
+ // Result: there was a node to move to.
84
+ _goToNode(node) {
85
+ if (!node) {
86
+ return false;
87
+ }
88
+ if (this._multiSelect) {
89
+ this._focusNode(node);
90
+ } else {
91
+ this._originalSelectNode(node);
92
+ }
93
+ return true;
94
+ }
44
95
  _handleArrowKey(key) {
45
96
  switch (key) {
46
97
  case "ArrowDown":
@@ -65,49 +116,53 @@ class KeyHandler {
65
116
  }
66
117
  }
67
118
  }
119
+ _handleKey(key, focusedNode) {
120
+ return this._getCurrentNode() ? this._handleArrowKey(key) : this._handleKeyWithoutSelection(key, focusedNode);
121
+ }
68
122
  _handleKeyDown = e => {
69
123
  let focusedNode = this._getFocusedNode();
70
124
  if (!focusedNode) {
71
125
  return;
72
126
  }
73
127
  let isKeyHandled;
74
- let selectedNode = this._getSelectedNode();
75
128
  switch (e.key) {
129
+ case " ":
130
+ {
131
+ isKeyHandled = this._multiSelect ? this._toggle(focusedNode) : this._handleKey(e.key, focusedNode);
132
+ break;
133
+ }
76
134
  case "End":
77
135
  {
78
- isKeyHandled = this._selectNode(this._getTree()?.getLastChild());
136
+ isKeyHandled = this._goToNode(this._getTree()?.getLastChild());
79
137
  break;
80
138
  }
81
139
  case "Enter":
82
140
  {
83
141
  // Without a selected node, activate the focused node
84
- isKeyHandled = this._activate(selectedNode ?? focusedNode, e);
142
+ isKeyHandled = this._activate(this._multiSelect ? focusedNode : this._getSelectedNode() ?? focusedNode, e);
85
143
  break;
86
144
  }
87
145
  case "Home":
88
146
  {
89
- isKeyHandled = this._selectNode(this._getTree()?.children[0]);
147
+ isKeyHandled = this._goToNode(this._getTree()?.children[0]);
90
148
  break;
91
149
  }
92
150
  default:
93
151
  {
94
- isKeyHandled = selectedNode ? this._handleArrowKey(e.key) : this._handleKeyWithoutSelection(e.key, focusedNode);
152
+ isKeyHandled = this._handleKey(e.key, focusedNode);
95
153
  }
96
154
  }
97
155
  if (isKeyHandled) {
98
156
  e.preventDefault();
99
157
  }
100
158
  };
101
-
102
- // No node is selected. These keys select the focused node, which is
103
- // usually the first node, see TreeElement.updateTabStop.
104
159
  _handleKeyWithoutSelection(key, focusedNode) {
105
160
  switch (key) {
106
161
  case " ":
107
162
  case "ArrowDown":
108
163
  case "ArrowRight":
109
164
  {
110
- return this._selectNode(focusedNode);
165
+ return this._goToNode(focusedNode);
111
166
  }
112
167
  default:
113
168
  {
@@ -116,45 +171,37 @@ class KeyHandler {
116
171
  }
117
172
  }
118
173
  _moveLeft() {
119
- let selectedNode = this._getSelectedNode();
174
+ let currentNode = this._getCurrentNode();
120
175
 
121
176
  /* istanbul ignore if */
122
- if (!selectedNode) {
177
+ if (!currentNode) {
123
178
  return false;
124
179
  }
125
- if (selectedNode.isFolder() && selectedNode.is_open) {
180
+ if (currentNode.isFolder() && currentNode.is_open) {
126
181
  // Left on an open node closes the node
127
- void this._closeNode(selectedNode);
182
+ void this._closeNode(currentNode);
128
183
  return true;
129
184
  }
130
185
  // Left on a closed or end node moves focus to the node's parent
131
- return this._selectNode(selectedNode.getParent());
186
+ return this._goToNode(currentNode.getParent());
132
187
  }
133
188
  _moveRight() {
134
- let selectedNode = this._getSelectedNode();
135
- if (selectedNode?.isFolder()) {
189
+ let currentNode = this._getCurrentNode();
190
+ if (currentNode?.isFolder()) {
136
191
  // folder node
137
- if (selectedNode.is_open) {
192
+ if (currentNode.is_open) {
138
193
  // Right moves to the first child of an open node
139
- return this._selectNode(selectedNode.getNextVisibleNode());
194
+ return this._goToNode(currentNode.getNextVisibleNode());
140
195
  }
141
196
  // Right expands a closed node
142
- void this._openNode(selectedNode);
197
+ void this._openNode(currentNode);
143
198
  return true;
144
199
  }
145
200
  return false;
146
201
  }
147
-
148
- /* Select the node.
149
- * Don't do anything if the node is null.
150
- * Result: a different node was selected.
151
- */
152
- _selectNode(node) {
153
- if (node) {
154
- this._originalSelectNode(node);
155
- return true;
156
- }
157
- return false;
202
+ _toggle(node) {
203
+ this._toggleNodeInSelection(node);
204
+ return true;
158
205
  }
159
206
  }
160
207