tree-element 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -31
- package/lib/animation.d.ts +2 -2
- package/lib/animation.d.ts.map +1 -1
- package/lib/animation.js +16 -12
- package/lib/animation.js.map +1 -1
- package/lib/classNames.d.ts.map +1 -1
- package/lib/classNames.js +2 -2
- package/lib/classNames.js.map +1 -1
- package/lib/dataLoader.d.ts +1 -0
- package/lib/dataLoader.d.ts.map +1 -1
- package/lib/dataLoader.js +22 -20
- package/lib/dataLoader.js.map +1 -1
- package/lib/dragAndDropHandler/binarySearch.js +3 -3
- package/lib/dragAndDropHandler/binarySearch.js.map +1 -1
- package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -1
- package/lib/dragAndDropHandler/dragElement.js +11 -13
- package/lib/dragAndDropHandler/dragElement.js.map +1 -1
- package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -1
- package/lib/dragAndDropHandler/generateHitAreas.js +25 -25
- package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -1
- package/lib/dragAndDropHandler/index.d.ts.map +1 -1
- package/lib/dragAndDropHandler/index.js +125 -158
- package/lib/dragAndDropHandler/index.js.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.js +23 -22
- package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
- package/lib/dragAndDropHandler/types.d.ts.map +1 -1
- package/lib/elementsRenderer.d.ts +20 -7
- package/lib/elementsRenderer.d.ts.map +1 -1
- package/lib/elementsRenderer.js +195 -136
- package/lib/elementsRenderer.js.map +1 -1
- package/lib/events.d.ts +44 -11
- package/lib/events.d.ts.map +1 -1
- package/lib/index.d.ts +36 -13
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +386 -349
- package/lib/index.js.map +1 -1
- package/lib/keyHandler.d.ts +13 -8
- package/lib/keyHandler.d.ts.map +1 -1
- package/lib/keyHandler.js +106 -51
- package/lib/keyHandler.js.map +1 -1
- package/lib/methodTypes.d.ts +3 -3
- package/lib/methodTypes.d.ts.map +1 -1
- package/lib/mouseHandler.d.ts +1 -1
- package/lib/mouseHandler.d.ts.map +1 -1
- package/lib/mouseHandler.js +36 -49
- package/lib/mouseHandler.js.map +1 -1
- package/lib/mouseUtils.d.ts.map +1 -1
- package/lib/mouseUtils.js +2 -2
- package/lib/mouseUtils.js.map +1 -1
- package/lib/node.d.ts +47 -16
- package/lib/node.d.ts.map +1 -1
- package/lib/node.js +169 -171
- package/lib/node.js.map +1 -1
- package/lib/nodeElement/borderDropHint.d.ts.map +1 -1
- package/lib/nodeElement/borderDropHint.js +4 -5
- package/lib/nodeElement/borderDropHint.js.map +1 -1
- package/lib/nodeElement/folderElement.d.ts +8 -5
- package/lib/nodeElement/folderElement.d.ts.map +1 -1
- package/lib/nodeElement/folderElement.js +75 -67
- package/lib/nodeElement/folderElement.js.map +1 -1
- package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
- package/lib/nodeElement/ghostDropHint.js +13 -13
- package/lib/nodeElement/ghostDropHint.js.map +1 -1
- package/lib/nodeElement/index.d.ts +2 -1
- package/lib/nodeElement/index.d.ts.map +1 -1
- package/lib/nodeElement/index.js +38 -30
- package/lib/nodeElement/index.js.map +1 -1
- package/lib/nodeUtils.d.ts.map +1 -1
- package/lib/nodeUtils.js +1 -1
- package/lib/nodeUtils.js.map +1 -1
- package/lib/options.d.ts +19 -3
- package/lib/options.d.ts.map +1 -1
- package/lib/positionUtils.js +3 -3
- package/lib/positionUtils.js.map +1 -1
- package/lib/requestUrl.d.ts +1 -1
- package/lib/requestUrl.d.ts.map +1 -1
- package/lib/requestUrl.js +6 -17
- package/lib/requestUrl.js.map +1 -1
- package/lib/saveStateHandler.d.ts.map +1 -1
- package/lib/saveStateHandler.js +59 -89
- package/lib/saveStateHandler.js.map +1 -1
- package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/containerScrollParent.js +11 -18
- package/lib/scrollHandler/containerScrollParent.js.map +1 -1
- package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/createScrollParent.js +12 -13
- package/lib/scrollHandler/createScrollParent.js.map +1 -1
- package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/documentScrollParent.js +18 -27
- package/lib/scrollHandler/documentScrollParent.js.map +1 -1
- package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/scrollParent.js +30 -34
- package/lib/scrollHandler/scrollParent.js.map +1 -1
- package/lib/scrollHandler.d.ts.map +1 -1
- package/lib/scrollHandler.js +11 -14
- package/lib/scrollHandler.js.map +1 -1
- package/lib/selectNodeHandler.d.ts +4 -2
- package/lib/selectNodeHandler.d.ts.map +1 -1
- package/lib/selectNodeHandler.js +64 -83
- package/lib/selectNodeHandler.js.map +1 -1
- package/lib/setDefaultOptions.d.ts.map +1 -1
- package/lib/setDefaultOptions.js +34 -38
- package/lib/setDefaultOptions.js.map +1 -1
- package/lib/triggerCustomEvent.d.ts.map +1 -1
- package/lib/triggerCustomEvent.js +2 -2
- package/lib/triggerCustomEvent.js.map +1 -1
- package/lib/util.d.ts.map +1 -1
- package/lib/util.js +2 -2
- package/lib/util.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +43 -32
- package/src/animation.ts +14 -12
- package/src/classNames.ts +52 -52
- package/src/dataLoader.ts +79 -71
- package/src/dragAndDropHandler/binarySearch.ts +17 -17
- package/src/dragAndDropHandler/dragElement.ts +51 -50
- package/src/dragAndDropHandler/generateHitAreas.ts +156 -161
- package/src/dragAndDropHandler/index.ts +334 -348
- package/src/dragAndDropHandler/iterateVisibleNodes.ts +61 -63
- package/src/dragAndDropHandler/types.ts +5 -5
- package/src/elementsRenderer.ts +377 -294
- package/src/events.ts +241 -208
- package/src/header.txt +1 -1
- package/src/index.ts +259 -229
- package/src/keyHandler.ts +179 -115
- package/src/methodTypes.ts +7 -10
- package/src/mouseHandler.ts +316 -316
- package/src/mouseUtils.ts +14 -14
- package/src/node.ts +773 -771
- package/src/nodeElement/borderDropHint.ts +25 -25
- package/src/nodeElement/folderElement.ts +116 -102
- package/src/nodeElement/ghostDropHint.ts +64 -62
- package/src/nodeElement/index.ts +81 -73
- package/src/nodeUtils.ts +5 -5
- package/src/options.ts +25 -5
- package/src/requestUrl.ts +7 -14
- package/src/saveStateHandler.ts +191 -207
- package/src/scrollHandler/containerScrollParent.ts +40 -49
- package/src/scrollHandler/createScrollParent.ts +26 -27
- package/src/scrollHandler/documentScrollParent.ts +66 -72
- package/src/scrollHandler/scrollParent.ts +90 -86
- package/src/scrollHandler.ts +45 -45
- package/src/selectNodeHandler.ts +171 -165
- package/src/setDefaultOptions.ts +44 -32
- package/src/triggerCustomEvent.ts +7 -3
- package/src/util.ts +2 -3
- package/src/version.ts +1 -1
- package/tree_element.css +87 -69
- package/tree_element.debug.js +3866 -3831
- package/tree_element.debug.js.map +1 -1
- package/tree_element.js +2 -2
- package/tree_element.js.map +1 -1
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { ClassNames } from \"./classNames\";\nimport type { MoveInfo, TreeEvent, 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.\nexport type {\n MoveInfo,\n Node,\n NodeData,\n NodeId,\n Position,\n SavedState,\n SelectNodeOptions,\n TreeElementOptions,\n TreeEvent,\n TreeEventName,\n TreeEvents,\n};\n\nexport type TriggerEventProvider = (\n element: HTMLElement,\n eventName: TreeEventName,\n values?: TreeEvents[TreeEventName],\n) => boolean;\n\ninterface TreeElementParams extends Partial<TreeElementOptions> {\n /** The element the tree is rendered into. Its content is replaced. */\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 /** @hidden */\n public tree: Node;\n\n private classNames: ClassNames;\n private dataLoader: DataLoader;\n private dndHandler: DragAndDropHandler;\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 triggerEventProvider: TriggerEventProvider;\n\n /** @hidden */\n constructor({ htmlElement, overrideTriggerEventProvider, ...options }: TreeElementParams) {\n this.htmlElement = htmlElement;\n this.options = setDefaultOptions(htmlElement, options);\n this.classNames = createClassNames(this.options);\n this.triggerEventProvider = overrideTriggerEventProvider ?? triggerCustomEvent;\n\n this.isInitialized = false;\n this.tree = new Node({}, true);\n this.nodeMap = new WeakMap();\n\n const {\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 getNodeById = this.getNodeById.bind(this);\n const getSelectedNode = this.getSelectedNode.bind(this);\n const getTree = this.getTree.bind(this);\n const isFocusOnTree = this.isFocusOnTree.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\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 });\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 = 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 getSelectedNode,\n isFocusOnTree,\n keyboardSupport,\n openNode,\n selectNode,\n });\n\n const renderer = new ElementsRenderer({\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(\n nodeData: NodeData,\n existingNode: Node,\n ): 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(\n nodeData: NodeData,\n existingNode: Node,\n ): 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(\n nodeData: NodeData,\n existingNode: Node,\n ): 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?: boolean) {\n this.selectNodeHandler.addToSelection(node);\n this.openParents(node);\n\n this.getNodeElementForNode(node).select(mustSetFocus ?? true);\n\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.\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public closeNode(node: Node, slide?: boolean): void {\n if (node.isFolder() || node.isEmptyFolder) {\n this.createFolderElement(node).close(\n slide ?? this.options.slide,\n this.options.animationSpeed,\n );\n\n this.saveState();\n }\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 if (liElement) {\n return this.nodeMap.get(liElement) ?? null;\n } else {\n return null;\n }\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 `false` when nothing is selected.\n *\n * @group Selection\n */\n public getSelectedNode(): false | Node {\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(\n url?: string,\n parentNode?: Node\n ): Promise<void> {\n const requestUrl = url ? new RequestUrl(url) : 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 const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveDown(selectedNode);\n }\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(\n node: Node,\n targetNode: Node,\n position: Position,\n ): 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 const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveUp(selectedNode);\n }\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(\n node: Node,\n slide?: boolean\n ): 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(\n slideOption,\n this.options.animationSpeed,\n );\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.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 =\n getOffsetTop(node.element) -\n 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(\n node: Node | null,\n options?: SelectNodeOptions,\n ): void {\n if (!node) {\n // Called with empty node -> deselect current node\n this.deselectCurrentNode();\n this.saveStateHandler.saveState();\n return;\n }\n\n this.selectNodeHandler.selectSingleNode(node, options);\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.\n *\n * @group State\n */\n public setState(state: SavedState) {\n this.saveStateHandler.setInitialState(state);\n this.refreshElements(null);\n }\n\n /**\n * Closes an open node and opens a closed one.\n *\n * @param slide - Override the `slide` option for this call.\n * @group Opening and closing\n */\n public toggle(node: Node, slide: boolean | null = null) {\n const mustSlide = slide ?? this.options.slide;\n\n if (node.is_open) {\n this.closeNode(node, mustSlide);\n } else {\n void 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 data.children instanceof Array\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 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 return new FolderElement({\n classNames,\n closedIconElement,\n getScrollLeft,\n node,\n openedIconElement,\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 let url;\n\n if (typeof dataUrl === \"function\") {\n url = dataUrl(node);\n } else {\n url = dataUrl;\n }\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 } else if (typeof this.options.autoOpen === \"number\") {\n return this.options.autoOpen;\n } else 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 getNodeElement(element: HTMLElement): NodeElement | null {\n const node = this.getNode(element);\n if (node) {\n return this.getNodeElementForNode(node);\n } else {\n return null;\n }\n }\n\n private getNodeElementForNode(node: Node): NodeElement {\n if (node.isFolder()) {\n return this.createFolderElement(node);\n } else {\n return this.createNodeElement(node);\n }\n }\n\n private getNodeIdToBeSelected(): NodeId | null {\n return this.saveStateHandler.getNodeIdToBeSelected();\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 this.isInitialized = true;\n this.triggerEvent(\"tree.init\");\n }\n };\n\n this.tree = new this.options.nodeClass(\n null,\n true,\n this.options.nodeClass,\n );\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 const activeElement = document.activeElement;\n\n /* istanbul ignore if */\n if (!activeElement) {\n return false;\n }\n\n // The keyboard must still work for input elements.\n const tagName = activeElement.tagName;\n if (tagName !== \"A\" && tagName !== \"SPAN\") {\n return false;\n }\n\n const node = this.getNode(activeElement as HTMLElement);\n return node?.tree === this.tree;\n }\n\n private isSelectedNodeInSubtree(subtree: Node): boolean {\n const selectedNode = this.getSelectedNode();\n\n if (!selectedNode) {\n return false;\n } else {\n return subtree === selectedNode || subtree.isParentOf(selectedNode);\n }\n }\n\n private async loadFolderOnDemand(\n node: Node,\n slide: boolean,\n ): Promise<void> {\n node.is_loading = true;\n\n await this.loadDataFromUrl(undefined, node);\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 if (!this.options.dragAndDrop) {\n return false;\n }\n\n return this.dndHandler.mouseCapture(positionInfo);\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.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 const nodeElement = this.getNodeElementForNode(node);\n nodeElement.select(mustSetFocus);\n }\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 return [false, false];\n } else {\n const mustLoadOnDemand =\n this.saveStateHandler.setInitialState(state);\n\n // return true: the state is restored\n return [true, mustLoadOnDemand];\n }\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 } else if (!node.hasChildren()) {\n return false;\n } else {\n node.is_open = true;\n return level !== maxLevel;\n }\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 return new Promise(resolve => {\n const restoreState = (): boolean => {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (!state) {\n return false;\n } else {\n void this.saveStateHandler.setInitialStateOnDemand(\n state,\n ).then(() => {\n resolve();\n });\n\n return true;\n }\n };\n\n const autoOpenNodes = (): void => {\n const maxLevel = this.getAutoOpenMaxLevel();\n let loadingCount = 0;\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n void this.openNode(node, false).then(() => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n const openNodes = (): void => {\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n if (!node.is_loading) {\n loadAndOpenNode(node);\n }\n\n return false;\n } else {\n void this.openNode(node, false);\n\n return level !== maxLevel;\n }\n });\n\n if (loadingCount === 0) {\n resolve();\n }\n };\n\n openNodes();\n };\n\n if (!restoreState()) {\n autoOpenNodes();\n }\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>(eventName: Name, values?: TreeEvents[Name]): boolean {\n return this.triggerEventProvider(this.htmlElement, eventName, values)\n }\n}"],"names":["classNames","dataLoader","dndHandler","htmlElement","isInitialized","keyHandler","mouseHandler","nodeMap","options","renderer","saveStateHandler","scrollHandler","selectNodeHandler","triggerEventProvider","getNodeElement","getNodeElementForNode","isFocusOnTree","openParents","refreshElements","setNodeElement","triggerEvent","mouseCapture","mouseDrag","mouseStart","mouseStop","initData","saveState","createFolderElement","__version__","deselectNodes","loadSubtree","initTree","createRequestUrl","loadFolderOnDemand","deselectCurrentNode","createNodeElement","getNodeIdToBeSelected","getAutoOpenMaxLevel","setInitialState","setInitialStateOnDemand","isSelectedNodeInSubtree","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 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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"}
|
package/lib/keyHandler.d.ts
CHANGED
|
@@ -1,26 +1,31 @@
|
|
|
1
|
-
import type { CloseNode, GetSelectedNode,
|
|
2
|
-
import type { Node } from "./node.js";
|
|
1
|
+
import type { CloseNode, GetFocusedNode, GetSelectedNode, GetTree, OpenNode, SelectNode, TriggerEvent } from "./methodTypes.js";
|
|
3
2
|
interface KeyHandlerParams {
|
|
4
3
|
closeNode: CloseNode;
|
|
4
|
+
getFocusedNode: GetFocusedNode;
|
|
5
5
|
getSelectedNode: GetSelectedNode;
|
|
6
|
-
|
|
6
|
+
getTree: GetTree;
|
|
7
7
|
keyboardSupport: boolean;
|
|
8
8
|
openNode: OpenNode;
|
|
9
9
|
selectNode: SelectNode;
|
|
10
|
+
triggerEvent: TriggerEvent;
|
|
10
11
|
}
|
|
11
12
|
export default class KeyHandler {
|
|
12
13
|
private closeNode;
|
|
14
|
+
private getFocusedNode;
|
|
13
15
|
private getSelectedNode;
|
|
14
|
-
private
|
|
16
|
+
private getTree;
|
|
15
17
|
private keyboardSupport;
|
|
16
18
|
private openNode;
|
|
17
19
|
private originalSelectNode;
|
|
18
|
-
|
|
20
|
+
private triggerEvent;
|
|
21
|
+
constructor({ closeNode, getFocusedNode, getSelectedNode, getTree, keyboardSupport, openNode, selectNode, triggerEvent, }: KeyHandlerParams);
|
|
19
22
|
deinit(): void;
|
|
20
|
-
moveDown(
|
|
21
|
-
moveUp(
|
|
22
|
-
private
|
|
23
|
+
moveDown(): boolean;
|
|
24
|
+
moveUp(): boolean;
|
|
25
|
+
private activate;
|
|
26
|
+
private handleArrowKey;
|
|
23
27
|
private handleKeyDown;
|
|
28
|
+
private handleKeyWithoutSelection;
|
|
24
29
|
private moveLeft;
|
|
25
30
|
private moveRight;
|
|
26
31
|
private selectNode;
|
package/lib/keyHandler.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyHandler.d.ts","sourceRoot":"","sources":["../src/keyHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
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"}
|
package/lib/keyHandler.js
CHANGED
|
@@ -1,92 +1,148 @@
|
|
|
1
1
|
class KeyHandler {
|
|
2
|
-
_closeNode;
|
|
3
|
-
_getSelectedNode;
|
|
4
|
-
_isFocusOnTree;
|
|
5
|
-
_keyboardSupport;
|
|
6
|
-
_openNode;
|
|
7
|
-
_originalSelectNode;
|
|
8
2
|
constructor({
|
|
9
|
-
closeNode,
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
3
|
+
_closeNode: closeNode,
|
|
4
|
+
_getFocusedNode: getFocusedNode,
|
|
5
|
+
_getSelectedNode: getSelectedNode,
|
|
6
|
+
_getTree: getTree,
|
|
7
|
+
_keyboardSupport: keyboardSupport,
|
|
8
|
+
_openNode: openNode,
|
|
9
|
+
_selectNode: selectNode,
|
|
10
|
+
_triggerEvent: triggerEvent
|
|
15
11
|
}) {
|
|
16
12
|
this._closeNode = closeNode;
|
|
13
|
+
this._getFocusedNode = getFocusedNode;
|
|
17
14
|
this._getSelectedNode = getSelectedNode;
|
|
18
|
-
this.
|
|
15
|
+
this._getTree = getTree;
|
|
19
16
|
this._keyboardSupport = keyboardSupport;
|
|
20
17
|
this._openNode = openNode;
|
|
21
18
|
this._originalSelectNode = selectNode;
|
|
19
|
+
this._triggerEvent = triggerEvent;
|
|
22
20
|
if (keyboardSupport) {
|
|
23
21
|
document.addEventListener("keydown", this._handleKeyDown);
|
|
24
22
|
}
|
|
25
23
|
}
|
|
26
|
-
|
|
24
|
+
_deinit() {
|
|
27
25
|
if (this._keyboardSupport) {
|
|
28
26
|
document.removeEventListener("keydown", this._handleKeyDown);
|
|
29
27
|
}
|
|
30
28
|
}
|
|
31
|
-
|
|
32
|
-
return this._selectNode(
|
|
29
|
+
_moveDown() {
|
|
30
|
+
return this._selectNode(this._getSelectedNode()?.getNextVisibleNode());
|
|
33
31
|
}
|
|
34
|
-
|
|
35
|
-
return this._selectNode(
|
|
32
|
+
_moveUp() {
|
|
33
|
+
return this._selectNode(this._getSelectedNode()?.getPreviousVisibleNode());
|
|
36
34
|
}
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
|
|
36
|
+
// Activate the node, for example to open its edit page.
|
|
37
|
+
_activate(node, originalEvent) {
|
|
38
|
+
this._triggerEvent("tree.activate", {
|
|
39
|
+
node,
|
|
40
|
+
originalEvent
|
|
41
|
+
});
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
_handleArrowKey(key) {
|
|
45
|
+
switch (key) {
|
|
46
|
+
case "ArrowDown":
|
|
47
|
+
{
|
|
48
|
+
return this._moveDown();
|
|
49
|
+
}
|
|
50
|
+
case "ArrowLeft":
|
|
51
|
+
{
|
|
52
|
+
return this._moveLeft();
|
|
53
|
+
}
|
|
54
|
+
case "ArrowRight":
|
|
55
|
+
{
|
|
56
|
+
return this._moveRight();
|
|
57
|
+
}
|
|
58
|
+
case "ArrowUp":
|
|
59
|
+
{
|
|
60
|
+
return this._moveUp();
|
|
61
|
+
}
|
|
62
|
+
default:
|
|
63
|
+
{
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
39
67
|
}
|
|
40
68
|
_handleKeyDown = e => {
|
|
41
|
-
|
|
69
|
+
let focusedNode = this._getFocusedNode();
|
|
70
|
+
if (!focusedNode) {
|
|
42
71
|
return;
|
|
43
72
|
}
|
|
44
|
-
let isKeyHandled
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
isKeyHandled = this.
|
|
50
|
-
break;
|
|
51
|
-
case "ArrowLeft":
|
|
52
|
-
isKeyHandled = this._moveLeft(selectedNode);
|
|
73
|
+
let isKeyHandled;
|
|
74
|
+
let selectedNode = this._getSelectedNode();
|
|
75
|
+
switch (e.key) {
|
|
76
|
+
case "End":
|
|
77
|
+
{
|
|
78
|
+
isKeyHandled = this._selectNode(this._getTree()?.getLastChild());
|
|
53
79
|
break;
|
|
54
|
-
|
|
55
|
-
|
|
80
|
+
}
|
|
81
|
+
case "Enter":
|
|
82
|
+
{
|
|
83
|
+
// Without a selected node, activate the focused node
|
|
84
|
+
isKeyHandled = this._activate(selectedNode ?? focusedNode, e);
|
|
56
85
|
break;
|
|
57
|
-
|
|
58
|
-
|
|
86
|
+
}
|
|
87
|
+
case "Home":
|
|
88
|
+
{
|
|
89
|
+
isKeyHandled = this._selectNode(this._getTree()?.children[0]);
|
|
59
90
|
break;
|
|
60
|
-
|
|
91
|
+
}
|
|
92
|
+
default:
|
|
93
|
+
{
|
|
94
|
+
isKeyHandled = selectedNode ? this._handleArrowKey(e.key) : this._handleKeyWithoutSelection(e.key, focusedNode);
|
|
95
|
+
}
|
|
61
96
|
}
|
|
62
97
|
if (isKeyHandled) {
|
|
63
98
|
e.preventDefault();
|
|
64
99
|
}
|
|
65
100
|
};
|
|
66
|
-
|
|
101
|
+
|
|
102
|
+
// No node is selected. These keys select the focused node, which is
|
|
103
|
+
// usually the first node, see TreeElement.updateTabStop.
|
|
104
|
+
_handleKeyWithoutSelection(key, focusedNode) {
|
|
105
|
+
switch (key) {
|
|
106
|
+
case " ":
|
|
107
|
+
case "ArrowDown":
|
|
108
|
+
case "ArrowRight":
|
|
109
|
+
{
|
|
110
|
+
return this._selectNode(focusedNode);
|
|
111
|
+
}
|
|
112
|
+
default:
|
|
113
|
+
{
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
_moveLeft() {
|
|
119
|
+
let selectedNode = this._getSelectedNode();
|
|
120
|
+
|
|
121
|
+
/* istanbul ignore if */
|
|
122
|
+
if (!selectedNode) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
67
125
|
if (selectedNode.isFolder() && selectedNode.is_open) {
|
|
68
126
|
// Left on an open node closes the node
|
|
69
|
-
this._closeNode(selectedNode);
|
|
127
|
+
void this._closeNode(selectedNode);
|
|
70
128
|
return true;
|
|
71
|
-
} else {
|
|
72
|
-
// Left on a closed or end node moves focus to the node's parent
|
|
73
|
-
return this._selectNode(selectedNode.getParent());
|
|
74
129
|
}
|
|
130
|
+
// Left on a closed or end node moves focus to the node's parent
|
|
131
|
+
return this._selectNode(selectedNode.getParent());
|
|
75
132
|
}
|
|
76
|
-
_moveRight(
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
} else {
|
|
133
|
+
_moveRight() {
|
|
134
|
+
let selectedNode = this._getSelectedNode();
|
|
135
|
+
if (selectedNode?.isFolder()) {
|
|
80
136
|
// folder node
|
|
81
137
|
if (selectedNode.is_open) {
|
|
82
138
|
// Right moves to the first child of an open node
|
|
83
139
|
return this._selectNode(selectedNode.getNextVisibleNode());
|
|
84
|
-
} else {
|
|
85
|
-
// Right expands a closed node
|
|
86
|
-
void this._openNode(selectedNode);
|
|
87
|
-
return true;
|
|
88
140
|
}
|
|
141
|
+
// Right expands a closed node
|
|
142
|
+
void this._openNode(selectedNode);
|
|
143
|
+
return true;
|
|
89
144
|
}
|
|
145
|
+
return false;
|
|
90
146
|
}
|
|
91
147
|
|
|
92
148
|
/* Select the node.
|
|
@@ -94,12 +150,11 @@ class KeyHandler {
|
|
|
94
150
|
* Result: a different node was selected.
|
|
95
151
|
*/
|
|
96
152
|
_selectNode(node) {
|
|
97
|
-
if (
|
|
98
|
-
return false;
|
|
99
|
-
} else {
|
|
153
|
+
if (node) {
|
|
100
154
|
this._originalSelectNode(node);
|
|
101
155
|
return true;
|
|
102
156
|
}
|
|
157
|
+
return false;
|
|
103
158
|
}
|
|
104
159
|
}
|
|
105
160
|
|
package/lib/keyHandler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyHandler.js","sources":["../src/keyHandler.ts"],"sourcesContent":["import type {\n
|
|
1
|
+
{"version":3,"file":"keyHandler.js","sources":["../src/keyHandler.ts"],"sourcesContent":["import type {\n CloseNode,\n GetFocusedNode,\n GetSelectedNode,\n GetTree,\n OpenNode,\n SelectNode,\n TriggerEvent,\n} from \"./methodTypes\";\nimport type { Node } from \"./node\";\n\ninterface KeyHandlerParams {\n closeNode: CloseNode;\n getFocusedNode: GetFocusedNode;\n getSelectedNode: GetSelectedNode;\n getTree: GetTree;\n keyboardSupport: boolean;\n openNode: OpenNode;\n selectNode: SelectNode;\n triggerEvent: TriggerEvent;\n}\n\nexport default class KeyHandler {\n private closeNode: CloseNode;\n private getFocusedNode: GetFocusedNode;\n private getSelectedNode: GetSelectedNode;\n private getTree: GetTree;\n\n private keyboardSupport: boolean;\n private openNode: OpenNode;\n private originalSelectNode: SelectNode;\n private triggerEvent: TriggerEvent;\n\n constructor({\n closeNode,\n getFocusedNode,\n getSelectedNode,\n getTree,\n keyboardSupport,\n openNode,\n selectNode,\n triggerEvent,\n }: KeyHandlerParams) {\n this.closeNode = closeNode;\n this.getFocusedNode = getFocusedNode;\n this.getSelectedNode = getSelectedNode;\n this.getTree = getTree;\n this.keyboardSupport = keyboardSupport;\n this.openNode = openNode;\n this.originalSelectNode = selectNode;\n this.triggerEvent = triggerEvent;\n\n if (keyboardSupport) {\n document.addEventListener(\"keydown\", this.handleKeyDown);\n }\n }\n\n public deinit(): void {\n if (this.keyboardSupport) {\n document.removeEventListener(\"keydown\", this.handleKeyDown);\n }\n }\n\n public moveDown(): boolean {\n return this.selectNode(this.getSelectedNode()?.getNextVisibleNode());\n }\n\n public moveUp(): boolean {\n return this.selectNode(this.getSelectedNode()?.getPreviousVisibleNode());\n }\n\n // Activate the node, for example to open its edit page.\n private activate(node: Node, originalEvent: KeyboardEvent): boolean {\n this.triggerEvent(\"tree.activate\", { node, originalEvent });\n return true;\n }\n\n private handleArrowKey(key: string): boolean {\n switch (key) {\n case \"ArrowDown\": {\n return this.moveDown();\n }\n\n case \"ArrowLeft\": {\n return this.moveLeft();\n }\n\n case \"ArrowRight\": {\n return this.moveRight();\n }\n\n case \"ArrowUp\": {\n return this.moveUp();\n }\n\n default: {\n return false;\n }\n }\n }\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n const focusedNode = this.getFocusedNode();\n\n if (!focusedNode) {\n return;\n }\n\n let isKeyHandled: boolean;\n\n const selectedNode = this.getSelectedNode();\n\n switch (e.key) {\n case \"End\": {\n isKeyHandled = this.selectNode(this.getTree()?.getLastChild());\n break;\n }\n\n case \"Enter\": {\n // Without a selected node, activate the focused node\n isKeyHandled = this.activate(selectedNode ?? focusedNode, e);\n break;\n }\n\n case \"Home\": {\n isKeyHandled = this.selectNode(this.getTree()?.children[0]);\n break;\n }\n\n default: {\n isKeyHandled = selectedNode\n ? this.handleArrowKey(e.key)\n : this.handleKeyWithoutSelection(e.key, focusedNode);\n }\n }\n\n if (isKeyHandled) {\n e.preventDefault();\n }\n };\n\n // No node is selected. These keys select the focused node, which is\n // usually the first node, see TreeElement.updateTabStop.\n private handleKeyWithoutSelection(key: string, focusedNode: Node): boolean {\n switch (key) {\n case \" \":\n case \"ArrowDown\":\n case \"ArrowRight\": {\n return this.selectNode(focusedNode);\n }\n\n default: {\n return false;\n }\n }\n }\n\n private moveLeft(): boolean {\n const selectedNode = this.getSelectedNode();\n\n /* istanbul ignore if */\n if (!selectedNode) {\n return false;\n }\n\n if (selectedNode.isFolder() && selectedNode.is_open) {\n // Left on an open node closes the node\n void this.closeNode(selectedNode);\n return true;\n }\n // Left on a closed or end node moves focus to the node's parent\n return this.selectNode(selectedNode.getParent());\n }\n\n private moveRight(): boolean {\n const selectedNode = this.getSelectedNode();\n\n if (selectedNode?.isFolder()) {\n // folder node\n if (selectedNode.is_open) {\n // Right moves to the first child of an open node\n return this.selectNode(selectedNode.getNextVisibleNode());\n }\n // Right expands a closed node\n void this.openNode(selectedNode);\n return true;\n }\n return false;\n }\n\n /* Select the node.\n * Don't do anything if the node is null.\n * Result: a different node was selected.\n */\n private selectNode(node?: Node | null): boolean {\n if (node) {\n this.originalSelectNode(node);\n\n return true;\n }\n return false;\n }\n}\n"],"names":["closeNode","getFocusedNode","getSelectedNode","getTree","keyboardSupport","openNode","originalSelectNode","triggerEvent","handleKeyDown","deinit","moveDown","selectNode","moveUp","activate","handleArrowKey","moveLeft","moveRight","handleKeyWithoutSelection"],"mappings":"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"}
|
package/lib/methodTypes.d.ts
CHANGED
|
@@ -2,14 +2,14 @@ import type { TreeEventName, TreeEvents } from "./events.js";
|
|
|
2
2
|
import type { Node, NodeData, NodeId } from "./node.js";
|
|
3
3
|
import type NodeElement from "./nodeElement/index.js";
|
|
4
4
|
export type AddToSelection = (node: Node) => void;
|
|
5
|
-
export type CloseNode = (node: Node) => void
|
|
5
|
+
export type CloseNode = (node: Node) => Promise<void>;
|
|
6
|
+
export type GetFocusedNode = () => Node | null;
|
|
6
7
|
export type GetNodeById = (nodeId: NodeId) => Node | null;
|
|
7
8
|
export type GetNodeElementForNode = (node: Node) => NodeElement;
|
|
8
9
|
export type GetScrollLeft = () => number;
|
|
9
|
-
export type GetSelectedNode = () =>
|
|
10
|
+
export type GetSelectedNode = () => Node | null;
|
|
10
11
|
export type GetSelectedNodes = () => Node[];
|
|
11
12
|
export type GetTree = () => Node | null;
|
|
12
|
-
export type IsFocusOnTree = () => boolean;
|
|
13
13
|
export type IsNodeSelected = (node: Node) => boolean;
|
|
14
14
|
export type LoadData = (data: NodeData[], parentNode?: Node) => void;
|
|
15
15
|
export type OpenNode = (node: Node, slide?: boolean) => Promise<void>;
|