diff --git a/docs/_entries/events/tree-loading-data.md b/docs/_entries/events/tree-loading-data.md index 20234da8..401f62ab 100644 --- a/docs/_entries/events/tree-loading-data.md +++ b/docs/_entries/events/tree-loading-data.md @@ -7,18 +7,21 @@ Called before and after data is loaded using ajax. The event data looks like this: -- **isLoading**: true / false -- **node**: - - null; when loading the whole tree - - a node; when a node is loaded on demand +* **isLoading**: true / false +* **node**: + * null; when loading the whole tree + * a node; when a node is loaded on demand +* **$el**: dom element + * whole tree; when loading the whole tree + * dom element of node; when a node is loaded on demand Example code: {% highlight js %} $('#tree1').on( - 'tree.loading_data', - function(e) { - console.log(e.isLoading, e.node); - } + 'tree.loading_data', + function(e) { + console.log(e.isLoading, e.node, e.$el); + } ); {% endhighlight %} diff --git a/docs/_entries/general/changelog.md b/docs/_entries/general/changelog.md index 95ff4c98..c0facecf 100644 --- a/docs/_entries/general/changelog.md +++ b/docs/_entries/general/changelog.md @@ -3,14 +3,6 @@ title: Changelog name: changelog --- -#### development - -Small braking change: - -- Issue #779: remove `onLoading` option. - - The option can be replaced by using the `tree.loading_data` event - - Related: remove the `$el` attribute from the `tree.loading_data` event. - #### 1.8.0 (november 26 2023) This release drops support for very old browsers (like IE 11). diff --git a/docs/_entries/options/onloading.md b/docs/_entries/options/onloading.md new file mode 100644 index 00000000..349ad411 --- /dev/null +++ b/docs/_entries/options/onloading.md @@ -0,0 +1,22 @@ +--- +title: onLoading +name: options-onloading +--- + +The onLoading parameter is called when the tree data is loading. This gives us the opportunity to display a loading signal. + +Callback looks like this: + +```js +function (isLoading, node, $el) +``` + +* **isLoading**: boolean + * true: data is loading + * false: data is loaded +* **node**: + * Node: if a node is loading + * null: if the tree is loading +* **$el**: + * if a node is loading this is the `li` element + * if the tree is loading is the `ul` element of the whole tree diff --git a/src/dataLoader.ts b/src/dataLoader.ts index 9b0d104d..2e3b9ce8 100644 --- a/src/dataLoader.ts +++ b/src/dataLoader.ts @@ -1,5 +1,5 @@ import { Node } from "./node"; -import { DataFilter, OnLoadFailed } from "./jqtreeOptions"; +import { DataFilter, OnLoadFailed, OnLoading } from "./jqtreeOptions"; import { LoadData, TriggerEvent } from "./jqtreeMethodTypes"; export type HandleFinishedLoading = () => void; @@ -8,6 +8,7 @@ interface DataLoaderParams { dataFilter?: DataFilter; loadData: LoadData; onLoadFailed?: OnLoadFailed; + onLoading?: OnLoading; treeElement: HTMLElement; triggerEvent: TriggerEvent; } @@ -16,6 +17,7 @@ export default class DataLoader { private dataFilter?: DataFilter; private loadData: LoadData; private onLoadFailed?: OnLoadFailed; + private onLoading?: OnLoading; private treeElement: HTMLElement; private triggerEvent: TriggerEvent; @@ -23,12 +25,14 @@ export default class DataLoader { dataFilter, loadData, onLoadFailed, + onLoading, treeElement, triggerEvent, }: DataLoaderParams) { this.dataFilter = dataFilter; this.loadData = loadData; this.onLoadFailed = onLoadFailed; + this.onLoading = onLoading; this.treeElement = treeElement; this.triggerEvent = triggerEvent; } @@ -44,11 +48,11 @@ export default class DataLoader { const element = this.getDomElement(parentNode); this.addLoadingClass(element); - this.notifyLoading(true, parentNode); + this.notifyLoading(true, parentNode, element); const stopLoading = (): void => { this.removeLoadingClass(element); - this.notifyLoading(false, parentNode); + this.notifyLoading(false, parentNode, element); }; const handleSuccess = (data: string | NodeData[]): void => { @@ -87,10 +91,21 @@ export default class DataLoader { } } - private notifyLoading(isLoading: boolean, node: Node | null): void { + private notifyLoading( + isLoading: boolean, + node: Node | null, + element: HTMLElement, + ): void { + const $el = jQuery(element); + + if (this.onLoading) { + this.onLoading(isLoading, node, $el); + } + this.triggerEvent("tree.loading_data", { isLoading, node, + $el, }); } diff --git a/src/jqtreeOptions.ts b/src/jqtreeOptions.ts index ad488dff..fbfb5067 100644 --- a/src/jqtreeOptions.ts +++ b/src/jqtreeOptions.ts @@ -31,7 +31,7 @@ export type OnCreateLi = (node: Node, el: JQuery, isSelected: boolean) => void; export type OnLoading = ( isLoading: boolean, node: Node | null, - element: HTMLElement, + $el: JQuery, ) => void; export interface JQTreeOptions { @@ -55,6 +55,7 @@ export interface JQTreeOptions { onGetStateFromStorage?: OnGetStateFromStorage; onIsMoveHandle?: OnIsMoveHandle; onLoadFailed?: OnLoadFailed; + onLoading?: OnLoading; onSetStateFromStorage?: OnSetStateFromStorage; openedIcon?: IconElement; openFolderDelay: number | false; diff --git a/src/test/jqTree/events.test.ts b/src/test/jqTree/events.test.ts index 9f514c2d..56581a34 100644 --- a/src/test/jqTree/events.test.ts +++ b/src/test/jqTree/events.test.ts @@ -170,46 +170,6 @@ describe("tree.load_data", () => { }); }); -describe("tree.loading_data", () => { - const server = setupServer( - http.get("/tree/", () => HttpResponse.json(exampleData)), - ); - beforeEach(() => { - server.listen(); - }); - - afterAll(() => { - server.close(); - }); - - it("fires tree.loading_data when the data is loading from an url", async () => { - const $tree = $("#tree1"); - - const onLoading = jest.fn(); - $tree.on("tree.loading_data", onLoading); - - $tree.tree({ dataUrl: "/tree/" }); - - await waitFor(() => { - expect(onLoading).toHaveBeenCalledWith( - expect.objectContaining({ - isLoading: true, - node: null, - }), - ); - }); - - await waitFor(() => { - expect(onLoading).toHaveBeenCalledWith( - expect.objectContaining({ - isLoading: false, - node: null, - }), - ); - }); - }); -}); - describe("tree.select", () => { interface Vars { node1: INode; @@ -260,3 +220,71 @@ describe("tree.select", () => { }); }); }); + +describe("tree.loading_data", () => { + const server = setupServer( + http.get("/tree/", () => HttpResponse.json(exampleData)), + ); + beforeEach(() => { + server.listen(); + }); + + afterAll(() => { + server.close(); + }); + + it("fires tree.loading_data when the data is loading from an url", async () => { + const $tree = $("#tree1"); + + const onLoading = jest.fn(); + $tree.on("tree.loading_data", onLoading); + + $tree.tree({ dataUrl: "/tree/" }); + + await waitFor(() => { + expect(onLoading).toHaveBeenCalledWith( + expect.objectContaining({ + isLoading: true, + node: null, + }), + ); + }); + + await waitFor(() => { + expect(onLoading).toHaveBeenCalledWith( + expect.objectContaining({ + isLoading: false, + node: null, + }), + ); + }); + }); +}); + +describe("onLoading", () => { + const server = setupServer( + http.get("/tree/", () => HttpResponse.json(exampleData)), + ); + beforeEach(() => { + server.listen(); + }); + + afterAll(() => { + server.close(); + }); + + it("calls onLoading", async () => { + const $tree = $("#tree1"); + const onLoading = jest.fn(); + + $tree.tree({ dataUrl: "/tree/", onLoading }); + + await waitFor(() => { + expect(onLoading).toHaveBeenCalledWith(false, null, $tree); + }); + + await waitFor(() => { + expect(onLoading).toHaveBeenCalledWith(false, null, $tree); + }); + }); +}); diff --git a/src/tree.jquery.d.ts b/src/tree.jquery.d.ts index 4bd61142..37c17397 100644 --- a/src/tree.jquery.d.ts +++ b/src/tree.jquery.d.ts @@ -54,16 +54,17 @@ interface IJQTreeOptions { dataFilter?: (data: NodeData[]) => NodeData[]; dataUrl?: DataUrl; dragAndDrop?: boolean; - keyboardSupport?: boolean; nodeClass?: any; + keyboardSupport?: boolean; onCanMove?: (node: INode) => boolean; onCanSelectNode?: (node: INode) => boolean; onCreateLi?: (node: INode, el: JQuery, isSelected: boolean) => void; onDragMove?: (node: INode, event: JQuery.Event | Touch) => void; onDragStop?: (node: INode, event: JQuery.Event | Touch) => void; - onGetStateFromStorage?: () => string; onIsMoveHandle?: (el: JQuery) => boolean; onLoadFailed?: (response: JQuery.jqXHR) => void; + onLoading?: (isLoading: boolean, node: INode, $el: JQuery) => void; + onGetStateFromStorage?: () => string; onSetStateFromStorage?: (data: string) => void; openedIcon?: string | HTMLElement | JQuery; openFolderDelay?: number | false; diff --git a/src/tree.jquery.ts b/src/tree.jquery.ts index d1a3ae74..4e9e9737 100644 --- a/src/tree.jquery.ts +++ b/src/tree.jquery.ts @@ -49,6 +49,7 @@ export class JqTreeWidget extends SimpleWidget { onGetStateFromStorage: undefined, onIsMoveHandle: undefined, onLoadFailed: undefined, + onLoading: undefined, onSetStateFromStorage: undefined, openedIcon: "▼", openFolderDelay: 500, // The delay for opening a folder during drag and drop; the value is in milliseconds @@ -1090,6 +1091,7 @@ export class JqTreeWidget extends SimpleWidget { onGetStateFromStorage, onIsMoveHandle, onLoadFailed, + onLoading, onSetStateFromStorage, openedIcon, openFolderDelay, @@ -1134,6 +1136,7 @@ export class JqTreeWidget extends SimpleWidget { dataFilter, loadData, onLoadFailed, + onLoading, treeElement, triggerEvent, }); diff --git a/tree.jquery.debug.js b/tree.jquery.debug.js index 49a4c4e9..f88a0997 100644 --- a/tree.jquery.debug.js +++ b/tree.jquery.debug.js @@ -789,12 +789,14 @@ var jqtree = (function (exports) { dataFilter, loadData, onLoadFailed, + onLoading, treeElement, triggerEvent } = _ref; this.dataFilter = dataFilter; this.loadData = loadData; this.onLoadFailed = onLoadFailed; + this.onLoading = onLoading; this.treeElement = treeElement; this.triggerEvent = triggerEvent; } @@ -804,10 +806,10 @@ var jqtree = (function (exports) { } const element = this.getDomElement(parentNode); this.addLoadingClass(element); - this.notifyLoading(true, parentNode); + this.notifyLoading(true, parentNode, element); const stopLoading = () => { this.removeLoadingClass(element); - this.notifyLoading(false, parentNode); + this.notifyLoading(false, parentNode, element); }; const handleSuccess = data => { stopLoading(); @@ -837,10 +839,15 @@ var jqtree = (function (exports) { return this.treeElement; } } - notifyLoading(isLoading, node) { + notifyLoading(isLoading, node, element) { + const $el = jQuery(element); + if (this.onLoading) { + this.onLoading(isLoading, node, $el); + } this.triggerEvent("tree.loading_data", { isLoading, - node + node, + $el }); } submitRequest(urlInfoInput, handleSuccess, handleError) { @@ -2734,6 +2741,7 @@ var jqtree = (function (exports) { onGetStateFromStorage: undefined, onIsMoveHandle: undefined, onLoadFailed: undefined, + onLoading: undefined, onSetStateFromStorage: undefined, openedIcon: "▼", openFolderDelay: 500, @@ -3499,6 +3507,7 @@ var jqtree = (function (exports) { onGetStateFromStorage, onIsMoveHandle, onLoadFailed, + onLoading, onSetStateFromStorage, openedIcon, openFolderDelay, @@ -3535,6 +3544,7 @@ var jqtree = (function (exports) { dataFilter, loadData, onLoadFailed, + onLoading, treeElement, triggerEvent }); diff --git a/tree.jquery.debug.js.map b/tree.jquery.debug.js.map index a2e3ed5b..e88f463f 100644 --- a/tree.jquery.debug.js.map +++ b/tree.jquery.debug.js.map @@ -1 +1 @@ -{"version":3,"file":"tree.jquery.debug.js","sources":["src/version.ts","src/position.ts","src/dragAndDropHandler/dragElement.ts","src/util.ts","src/dragAndDropHandler/iterateVisibleNodes.ts","src/dragAndDropHandler/generateHitAreas.ts","src/dragAndDropHandler/index.ts","src/elementsRenderer.ts","src/dataLoader.ts","src/keyHandler.ts","src/mouseUtils.ts","src/mouseHandler.ts","src/saveStateHandler.ts","src/scrollHandler/containerScrollParent.ts","src/scrollHandler/documentScrollParent.ts","src/scrollHandler/createScrollParent.ts","src/scrollHandler.ts","src/selectNodeHandler.ts","src/simple.widget.ts","src/nodeUtils.ts","src/node.ts","src/nodeElement/borderDropHint.ts","src/nodeElement/ghostDropHint.ts","src/nodeElement/index.ts","src/nodeElement/folderElement.ts","src/tree.jquery.ts"],"sourcesContent":["const version = \"1.8.0\";\n\nexport default version;\n","export enum Position {\n Before = 1,\n After,\n Inside,\n None,\n}\n\nconst positionNames: Record = {\n before: Position.Before,\n after: Position.After,\n inside: Position.Inside,\n none: Position.None,\n};\n\nexport const getPositionName = (position: Position): string => {\n for (const name in positionNames) {\n if (Object.prototype.hasOwnProperty.call(positionNames, name)) {\n if (positionNames[name] === position) {\n return name;\n }\n }\n }\n\n return \"\";\n};\n\nexport const getPosition = (name: string): Position | undefined =>\n positionNames[name];\n","interface DragElementParams {\n autoEscape: boolean;\n nodeName: string;\n offsetX: number;\n offsetY: number;\n treeElement: HTMLElement;\n}\n\nclass DragElement {\n private offsetX: number;\n private offsetY: number;\n private element: HTMLElement;\n\n constructor({\n autoEscape,\n nodeName,\n offsetX,\n offsetY,\n treeElement,\n }: DragElementParams) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n this.element = this.createElement(nodeName, autoEscape);\n\n treeElement.appendChild(this.element);\n }\n\n public move(pageX: number, pageY: number): void {\n this.element.style.left = `${pageX - this.offsetX}px`;\n this.element.style.top = `${pageY - this.offsetY}px`;\n }\n\n public remove(): void {\n this.element.remove();\n }\n\n private createElement(nodeName: string, autoEscape: boolean) {\n const element = document.createElement(\"span\");\n element.classList.add(\"jqtree-title\", \"jqtree-dragging\");\n\n if (autoEscape) {\n element.textContent = nodeName;\n } else {\n element.innerHTML = nodeName;\n }\n\n element.style.position = \"absolute\";\n\n return element;\n }\n}\n\nexport default DragElement;\n","export const isInt = (n: unknown): boolean =>\n typeof n === \"number\" && n % 1 === 0;\n\nexport const isFunction = (v: unknown): boolean => typeof v === \"function\";\n\nexport const getBoolString = (value: unknown): string =>\n value ? \"true\" : \"false\";\n\nexport const getOffsetTop = (element: HTMLElement) =>\n getElementPosition(element).top;\n\nexport const getElementPosition = (element: HTMLElement) => {\n const rect = element.getBoundingClientRect();\n\n return {\n left: rect.x + window.scrollX,\n top: rect.y + window.scrollY,\n };\n};\n","import { Node } from \"../node\";\n\ninterface Options {\n handleAfterOpenFolder: (node: Node, nextNode: Node | null) => void;\n handleClosedFolder: (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => void;\n handleFirstNode: (node: Node) => void;\n handleNode: (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => void;\n\n /*\n override\n return\n - true: continue iterating\n - false: stop iterating\n */\n handleOpenFolder: (node: Node, element: HTMLElement) => boolean;\n}\n\nconst iterateVisibleNodes = (\n tree: Node,\n {\n handleAfterOpenFolder,\n handleClosedFolder,\n handleFirstNode,\n handleNode,\n handleOpenFolder,\n }: Options,\n) => {\n let isFirstNode = true;\n\n const iterate = (node: Node, nextNode: Node | null): void => {\n let mustIterateInside =\n (node.is_open || !node.element) && node.hasChildren();\n\n let element: HTMLElement | null = null;\n\n // Is the element visible?\n if (node.element?.offsetParent) {\n element = node.element;\n\n if (isFirstNode) {\n handleFirstNode(node);\n isFirstNode = false;\n }\n\n if (!node.hasChildren()) {\n handleNode(node, nextNode, node.element);\n } else if (node.is_open) {\n if (!handleOpenFolder(node, node.element)) {\n mustIterateInside = false;\n }\n } else {\n handleClosedFolder(node, nextNode, element);\n }\n }\n\n if (mustIterateInside) {\n const childrenLength = node.children.length;\n node.children.forEach((_, i) => {\n const child = node.children[i];\n\n if (child) {\n if (i === childrenLength - 1) {\n iterate(child, null);\n } else {\n const nextChild = node.children[i + 1];\n\n if (nextChild) {\n iterate(child, nextChild);\n }\n }\n }\n });\n\n if (node.is_open && element) {\n handleAfterOpenFolder(node, nextNode);\n }\n }\n };\n\n iterate(tree, null);\n};\n\nexport default iterateVisibleNodes;\n","import { HitArea } from \"./types\";\nimport { Node } from \"../node\";\nimport { Position } from \"../position\";\nimport { getOffsetTop } from \"../util\";\nimport iterateVisibleNodes from \"./iterateVisibleNodes\";\n\nconst generatePositions = (tree: Node, currentNode: Node): HitArea[] => {\n const positions: HitArea[] = [];\n let lastTop = 0;\n\n const addPosition = (node: Node, position: number, top: number) => {\n const area = {\n top,\n bottom: 0,\n node,\n position,\n };\n\n positions.push(area);\n lastTop = top;\n };\n\n const handleAfterOpenFolder = (node: Node, nextNode: Node | null) => {\n if (node === currentNode || nextNode === currentNode) {\n // Cannot move before or after current item\n addPosition(node, Position.None, lastTop);\n } else {\n addPosition(node, Position.After, lastTop);\n }\n };\n\n const handleClosedFolder = (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => {\n const top = getOffsetTop(element);\n\n if (node === currentNode) {\n // Cannot move after current item\n addPosition(node, Position.None, top);\n } else {\n addPosition(node, Position.Inside, top);\n\n // Cannot move before current item\n if (nextNode !== currentNode) {\n addPosition(node, Position.After, top);\n }\n }\n };\n\n const handleFirstNode = (node: Node) => {\n if (node !== currentNode) {\n addPosition(node, Position.Before, getOffsetTop(node.element));\n }\n };\n\n const handleNode = (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => {\n const top = getOffsetTop(element);\n\n if (node === currentNode) {\n // Cannot move inside current item\n addPosition(node, Position.None, top);\n } else {\n addPosition(node, Position.Inside, top);\n }\n\n if (nextNode === currentNode || node === currentNode) {\n // Cannot move before or after current item\n addPosition(node, Position.None, top);\n } else {\n addPosition(node, Position.After, top);\n }\n };\n\n const handleOpenFolder = (node: Node, element: HTMLElement) => {\n if (node === currentNode) {\n // Cannot move inside current item\n // Stop iterating\n return false;\n }\n\n // Cannot move before current item\n if (node.children[0] !== currentNode) {\n addPosition(node, Position.Inside, getOffsetTop(element));\n }\n\n // Continue iterating\n return true;\n };\n\n iterateVisibleNodes(tree, {\n handleAfterOpenFolder,\n handleClosedFolder,\n handleFirstNode,\n handleNode,\n handleOpenFolder,\n });\n\n return positions;\n};\n\nconst generateHitAreasForGroup = (\n hitAreas: HitArea[],\n positionsInGroup: HitArea[],\n top: number,\n bottom: number,\n) => {\n // limit positions in group\n const positionCount = Math.min(positionsInGroup.length, 4);\n\n const areaHeight = Math.round((bottom - top) / positionCount);\n let areaTop = top;\n\n let i = 0;\n while (i < positionCount) {\n const position = positionsInGroup[i];\n\n if (position) {\n hitAreas.push({\n top: areaTop,\n bottom: areaTop + areaHeight,\n node: position.node,\n position: position.position,\n });\n }\n\n areaTop += areaHeight;\n i += 1;\n }\n};\n\nconst generateHitAreasFromPositions = (\n positions: HitArea[],\n treeBottom: number,\n): HitArea[] => {\n let previousTop = positions[0]?.top ?? 0;\n let group = [];\n const hitAreas: HitArea[] = [];\n\n for (const position of positions) {\n if (position.top !== previousTop && group.length) {\n generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n position.top,\n );\n\n previousTop = position.top;\n group = [];\n }\n\n group.push(position);\n }\n\n generateHitAreasForGroup(hitAreas, group, previousTop, treeBottom);\n\n return hitAreas;\n};\n\nconst generateHitAreas = (\n tree: Node,\n currentNode: Node,\n treeBottom: number,\n) => {\n const positions = generatePositions(tree, currentNode);\n\n return generateHitAreasFromPositions(positions, treeBottom);\n};\n\nexport default generateHitAreas;\n","import { Node } from \"../node\";\nimport { getPositionName, Position } from \"../position\";\nimport { DropHint, HitArea } from \"./types\";\nimport { PositionInfo } from \"../mouseUtils\";\nimport NodeElement from \"../nodeElement\";\nimport DragElement from \"./dragElement\";\nimport generateHitAreas from \"./generateHitAreas\";\nimport { getElementPosition } from \"../util\";\nimport {\n OnCanMove,\n OnCanMoveTo,\n OnIsMoveHandle,\n DragMethod,\n} from \"../jqtreeOptions\";\nimport {\n GetScrollLeft,\n GetTree,\n OpenNode,\n RefreshElements,\n TriggerEvent,\n} from \"../jqtreeMethodTypes\";\n\ninterface Dimensions {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\ntype GetNodeElement = (element: HTMLElement) => NodeElement | null;\ntype GetNodeElementForNode = (node: Node) => NodeElement;\n\ninterface DragAndDropHandlerParams {\n autoEscape?: boolean;\n getNodeElement: GetNodeElement;\n getNodeElementForNode: GetNodeElementForNode;\n getScrollLeft: GetScrollLeft;\n getTree: GetTree;\n onCanMove?: OnCanMove;\n onCanMoveTo?: OnCanMoveTo;\n onDragMove?: DragMethod;\n onDragStop?: DragMethod;\n onIsMoveHandle?: OnIsMoveHandle;\n openFolderDelay: number | false;\n openNode: OpenNode;\n refreshElements: RefreshElements;\n slide: boolean;\n treeElement: HTMLElement;\n triggerEvent: TriggerEvent;\n}\n\nexport class DragAndDropHandler {\n public hitAreas: HitArea[];\n public isDragging: boolean;\n public currentItem: NodeElement | null;\n public hoveredArea: HitArea | null;\n\n private autoEscape?: boolean;\n private dragElement: DragElement | null;\n private getNodeElement: GetNodeElement;\n private getNodeElementForNode: GetNodeElementForNode;\n private getScrollLeft: GetScrollLeft;\n private getTree: GetTree;\n private onCanMove?: OnCanMove;\n private onCanMoveTo?: OnCanMoveTo;\n private onDragMove?: DragMethod;\n private onDragStop?: DragMethod;\n private onIsMoveHandle?: OnIsMoveHandle;\n private openFolderDelay: number | false;\n private openFolderTimer: number | null;\n private openNode: OpenNode;\n private previousGhost: DropHint | null;\n private refreshElements: RefreshElements;\n private slide: boolean;\n private treeElement: HTMLElement;\n private triggerEvent: TriggerEvent;\n\n constructor({\n autoEscape,\n getNodeElement,\n getNodeElementForNode,\n getScrollLeft,\n getTree,\n onCanMove,\n onCanMoveTo,\n onDragMove,\n onDragStop,\n onIsMoveHandle,\n openNode,\n refreshElements,\n slide,\n treeElement,\n triggerEvent,\n }: DragAndDropHandlerParams) {\n this.autoEscape = autoEscape;\n this.getNodeElement = getNodeElement;\n this.getNodeElementForNode = getNodeElementForNode;\n this.getScrollLeft = getScrollLeft;\n this.getTree = getTree;\n this.onCanMove = onCanMove;\n this.onCanMoveTo = onCanMoveTo;\n this.onDragMove = onDragMove;\n this.onDragStop = onDragStop;\n this.onIsMoveHandle = onIsMoveHandle;\n this.openNode = openNode;\n this.refreshElements = refreshElements;\n this.slide = slide;\n this.treeElement = treeElement;\n this.triggerEvent = triggerEvent;\n\n this.hoveredArea = null;\n this.hitAreas = [];\n this.isDragging = false;\n this.currentItem = null;\n }\n\n public mouseCapture(positionInfo: PositionInfo): boolean | null {\n const element = positionInfo.target;\n\n if (!this.mustCaptureElement(element)) {\n return null;\n }\n\n if (this.onIsMoveHandle && !this.onIsMoveHandle(jQuery(element))) {\n return null;\n }\n\n let nodeElement = this.getNodeElement(element);\n\n if (nodeElement && this.onCanMove) {\n if (!this.onCanMove(nodeElement.node)) {\n nodeElement = null;\n }\n }\n\n this.currentItem = nodeElement;\n return this.currentItem != null;\n }\n\n public mouseStart(positionInfo: PositionInfo): boolean {\n if (!this.currentItem) {\n return false;\n }\n\n this.refresh();\n\n const { left, top } = getElementPosition(positionInfo.target);\n\n const node = this.currentItem.node;\n\n this.dragElement = new DragElement({\n autoEscape: this.autoEscape ?? true,\n nodeName: node.name,\n offsetX: positionInfo.pageX - left,\n offsetY: positionInfo.pageY - top,\n treeElement: this.treeElement,\n });\n\n this.isDragging = true;\n this.currentItem.element.classList.add(\"jqtree-moving\");\n\n return true;\n }\n\n public mouseDrag(positionInfo: PositionInfo): boolean {\n if (!this.currentItem || !this.dragElement) {\n return false;\n }\n\n this.dragElement.move(positionInfo.pageX, positionInfo.pageY);\n\n const area = this.findHoveredArea(\n positionInfo.pageX,\n positionInfo.pageY,\n );\n\n if (area && this.canMoveToArea(area)) {\n if (!area.node.isFolder()) {\n this.stopOpenFolderTimer();\n }\n\n if (this.hoveredArea !== area) {\n this.hoveredArea = area;\n\n // If this is a closed folder, start timer to open it\n if (this.mustOpenFolderTimer(area)) {\n this.startOpenFolderTimer(area.node);\n } else {\n this.stopOpenFolderTimer();\n }\n\n this.updateDropHint();\n }\n } else {\n this.removeDropHint();\n this.stopOpenFolderTimer();\n this.hoveredArea = area;\n }\n\n if (!area) {\n if (this.onDragMove) {\n this.onDragMove(\n this.currentItem.node,\n positionInfo.originalEvent,\n );\n }\n }\n\n return true;\n }\n\n public mouseStop(positionInfo: PositionInfo): boolean {\n this.moveItem(positionInfo);\n this.clear();\n this.removeHover();\n this.removeDropHint();\n this.removeHitAreas();\n\n const currentItem = this.currentItem;\n\n if (this.currentItem) {\n this.currentItem.element.classList.remove(\"jqtree-moving\");\n this.currentItem = null;\n }\n\n this.isDragging = false;\n\n if (!this.hoveredArea && currentItem) {\n if (this.onDragStop) {\n this.onDragStop(currentItem.node, positionInfo.originalEvent);\n }\n }\n\n return false;\n }\n\n public refresh(): void {\n this.removeHitAreas();\n\n if (this.currentItem) {\n this.generateHitAreas();\n\n this.currentItem = this.getNodeElementForNode(\n this.currentItem.node,\n );\n\n if (this.isDragging) {\n this.currentItem.element.classList.add(\"jqtree-moving\");\n }\n }\n }\n\n private generateHitAreas(): void {\n const tree = this.getTree();\n\n if (!this.currentItem || !tree) {\n this.hitAreas = [];\n } else {\n this.hitAreas = generateHitAreas(\n tree,\n this.currentItem.node,\n this.getTreeDimensions().bottom,\n );\n }\n }\n\n private mustCaptureElement(element: HTMLElement): boolean {\n const nodeName = element.nodeName;\n\n return (\n nodeName !== \"INPUT\" &&\n nodeName !== \"SELECT\" &&\n nodeName !== \"TEXTAREA\"\n );\n }\n\n private canMoveToArea(area: HitArea): boolean {\n if (!this.onCanMoveTo) {\n return true;\n }\n\n if (!this.currentItem) {\n return false;\n }\n\n const positionName = getPositionName(area.position);\n\n return this.onCanMoveTo(this.currentItem.node, area.node, positionName);\n }\n\n private removeHitAreas(): void {\n this.hitAreas = [];\n }\n\n private clear(): void {\n if (this.dragElement) {\n this.dragElement.remove();\n this.dragElement = null;\n }\n }\n\n private removeDropHint(): void {\n if (this.previousGhost) {\n this.previousGhost.remove();\n }\n }\n\n private removeHover(): void {\n this.hoveredArea = null;\n }\n\n private findHoveredArea(x: number, y: number): HitArea | null {\n const dimensions = this.getTreeDimensions();\n\n if (\n x < dimensions.left ||\n y < dimensions.top ||\n x > dimensions.right ||\n y > dimensions.bottom\n ) {\n return null;\n }\n\n let low = 0;\n let high = this.hitAreas.length;\n while (low < high) {\n const mid = (low + high) >> 1;\n const area = this.hitAreas[mid];\n\n if (!area) {\n return null;\n }\n\n if (y < area.top) {\n high = mid;\n } else if (y > area.bottom) {\n low = mid + 1;\n } else {\n return area;\n }\n }\n\n return null;\n }\n\n private mustOpenFolderTimer(area: HitArea): boolean {\n const node = area.node;\n\n return (\n node.isFolder() &&\n !node.is_open &&\n area.position === Position.Inside\n );\n }\n\n private updateDropHint(): void {\n if (!this.hoveredArea) {\n return;\n }\n\n // remove previous drop hint\n this.removeDropHint();\n\n // add new drop hint\n const nodeElement = this.getNodeElementForNode(this.hoveredArea.node);\n this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);\n }\n\n private startOpenFolderTimer(folder: Node): void {\n const openFolder = (): void => {\n this.openNode(folder, this.slide, () => {\n this.refresh();\n this.updateDropHint();\n });\n };\n\n this.stopOpenFolderTimer();\n\n const openFolderDelay = this.openFolderDelay;\n\n if (openFolderDelay !== false) {\n this.openFolderTimer = window.setTimeout(\n openFolder,\n openFolderDelay,\n );\n }\n }\n\n private stopOpenFolderTimer(): void {\n if (this.openFolderTimer) {\n clearTimeout(this.openFolderTimer);\n this.openFolderTimer = null;\n }\n }\n\n private moveItem(positionInfo: PositionInfo): void {\n if (\n this.currentItem &&\n this.hoveredArea &&\n this.hoveredArea.position !== Position.None &&\n this.canMoveToArea(this.hoveredArea)\n ) {\n const movedNode = this.currentItem.node;\n const targetNode = this.hoveredArea.node;\n const position = this.hoveredArea.position;\n const previousParent = movedNode.parent;\n\n if (position === Position.Inside) {\n this.hoveredArea.node.is_open = true;\n }\n\n const doMove = (): void => {\n const tree = this.getTree();\n\n if (tree) {\n tree.moveNode(movedNode, targetNode, position);\n\n this.treeElement.textContent = \"\";\n this.refreshElements(null);\n }\n };\n\n const event = this.triggerEvent(\"tree.move\", {\n move_info: {\n moved_node: movedNode,\n target_node: targetNode,\n position: getPositionName(position),\n previous_parent: previousParent,\n do_move: doMove,\n original_event: positionInfo.originalEvent,\n },\n });\n\n if (!event.isDefaultPrevented()) {\n doMove();\n }\n }\n }\n\n private getTreeDimensions(): Dimensions {\n // Return the dimensions of the tree. Add a margin to the bottom to allow\n // to drag-and-drop after the last element.\n const treePosition = getElementPosition(this.treeElement);\n const left = treePosition.left + this.getScrollLeft();\n const top = treePosition.top;\n\n return {\n left,\n top,\n right: left + this.treeElement.clientWidth,\n bottom: top + this.treeElement.clientHeight + 16,\n };\n }\n}\n","import { getBoolString } from \"./util\";\nimport { Node } from \"./node\";\nimport { IconElement, OnCreateLi } from \"./jqtreeOptions\";\nimport { GetTree, IsNodeSelected } from \"./jqtreeMethodTypes\";\n\ninterface ElementsRendererParams {\n autoEscape: boolean;\n buttonLeft: boolean;\n closedIcon?: IconElement;\n dragAndDrop: boolean;\n $element: JQuery;\n getTree: GetTree;\n isNodeSelected: IsNodeSelected;\n onCreateLi?: OnCreateLi;\n openedIcon?: IconElement;\n rtl?: boolean;\n showEmptyFolder: boolean;\n tabIndex?: number;\n}\n\nexport default class ElementsRenderer {\n public openedIconElement?: HTMLElement | Text;\n public closedIconElement?: HTMLElement | Text;\n private autoEscape: boolean;\n private buttonLeft: boolean;\n private dragAndDrop: boolean;\n private $element: JQuery;\n private getTree: GetTree;\n private isNodeSelected: IsNodeSelected;\n private onCreateLi?: OnCreateLi;\n private rtl?: boolean;\n private showEmptyFolder: boolean;\n private tabIndex?: number;\n\n constructor({\n autoEscape,\n buttonLeft,\n closedIcon,\n onCreateLi,\n dragAndDrop,\n $element,\n getTree,\n isNodeSelected,\n openedIcon,\n rtl,\n showEmptyFolder,\n tabIndex,\n }: ElementsRendererParams) {\n this.autoEscape = autoEscape;\n this.buttonLeft = buttonLeft;\n this.dragAndDrop = dragAndDrop;\n this.$element = $element;\n this.getTree = getTree;\n this.isNodeSelected = isNodeSelected;\n this.onCreateLi = onCreateLi;\n this.rtl = rtl;\n this.showEmptyFolder = showEmptyFolder;\n this.tabIndex = tabIndex;\n this.openedIconElement = this.createButtonElement(openedIcon || \"+\");\n this.closedIconElement = this.createButtonElement(closedIcon || \"-\");\n }\n\n public render(fromNode: Node | null): void {\n if (fromNode && fromNode.parent) {\n this.renderFromNode(fromNode);\n } else {\n this.renderFromRoot();\n }\n }\n\n public renderFromRoot(): void {\n this.$element.empty();\n\n const tree = this.getTree();\n\n if (this.$element[0] && tree) {\n this.createDomElements(this.$element[0], tree.children, true, 1);\n }\n }\n\n public renderFromNode(node: Node): void {\n // remember current li\n const $previousLi = jQuery(node.element);\n\n // create element\n const li = this.createLi(node, node.getLevel());\n this.attachNodeData(node, li);\n\n // add element to dom\n $previousLi.after(li);\n\n // remove previous li\n $previousLi.remove();\n\n // create children\n if (node.children) {\n this.createDomElements(\n li,\n node.children,\n false,\n node.getLevel() + 1,\n );\n }\n }\n\n private createDomElements(\n element: Element,\n children: Node[],\n isRootNode: boolean,\n level: number,\n ): void {\n const ul = this.createUl(isRootNode);\n element.appendChild(ul);\n\n for (const child of children) {\n const li = this.createLi(child, level);\n ul.appendChild(li);\n\n this.attachNodeData(child, li);\n\n if (child.hasChildren()) {\n this.createDomElements(li, child.children, false, level + 1);\n }\n }\n }\n\n private attachNodeData(node: Node, li: HTMLElement): void {\n node.element = li;\n jQuery(li).data(\"node\", node);\n }\n\n private createUl(isRootNode: boolean): HTMLUListElement {\n let classString;\n let role;\n\n if (!isRootNode) {\n classString = \"\";\n role = \"group\";\n } else {\n classString = \"jqtree-tree\";\n role = \"tree\";\n\n if (this.rtl) {\n classString += \" jqtree-rtl\";\n }\n }\n\n if (this.dragAndDrop) {\n classString += \" jqtree-dnd\";\n }\n\n const ul = document.createElement(\"ul\");\n ul.className = `jqtree_common ${classString}`;\n\n ul.setAttribute(\"role\", role);\n\n return ul;\n }\n\n private createLi(node: Node, level: number): HTMLLIElement {\n const isSelected = Boolean(this.isNodeSelected(node));\n\n const mustShowFolder =\n node.isFolder() || (node.isEmptyFolder && this.showEmptyFolder);\n\n const li = mustShowFolder\n ? this.createFolderLi(node, level, isSelected)\n : this.createNodeLi(node, level, isSelected);\n\n if (this.onCreateLi) {\n this.onCreateLi(node, jQuery(li), isSelected);\n }\n\n return li;\n }\n\n private setTreeItemAriaAttributes(\n element: HTMLElement,\n name: string,\n level: number,\n isSelected: boolean,\n ) {\n element.setAttribute(\"aria-label\", name);\n element.setAttribute(\"aria-level\", `${level}`);\n element.setAttribute(\"aria-selected\", getBoolString(isSelected));\n element.setAttribute(\"role\", \"treeitem\");\n }\n\n private createFolderLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const buttonClasses = this.getButtonClasses(node);\n const folderClasses = this.getFolderClasses(node, isSelected);\n\n const iconElement = node.is_open\n ? this.openedIconElement\n : this.closedIconElement;\n\n // li\n const li = document.createElement(\"li\");\n li.className = `jqtree_common ${folderClasses}`;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // button link\n const buttonLink = document.createElement(\"a\");\n buttonLink.className = buttonClasses;\n\n if (iconElement) {\n buttonLink.appendChild(iconElement.cloneNode(true));\n }\n\n if (this.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n true,\n level,\n );\n titleSpan.setAttribute(\"aria-expanded\", getBoolString(node.is_open));\n div.appendChild(titleSpan);\n\n if (!this.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n return li;\n }\n\n private createNodeLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const liClasses = [\"jqtree_common\"];\n\n if (isSelected) {\n liClasses.push(\"jqtree-selected\");\n }\n\n const classString = liClasses.join(\" \");\n\n // li\n const li = document.createElement(\"li\");\n li.className = classString;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n false,\n level,\n );\n div.appendChild(titleSpan);\n\n return li;\n }\n\n private createTitleSpan(\n nodeName: string,\n isSelected: boolean,\n isFolder: boolean,\n level: number,\n ): HTMLSpanElement {\n const titleSpan = document.createElement(\"span\");\n\n let classes = \"jqtree-title jqtree_common\";\n\n if (isFolder) {\n classes += \" jqtree-title-folder\";\n }\n\n classes += ` jqtree-title-button-${this.buttonLeft ? \"left\" : \"right\"}`;\n\n titleSpan.className = classes;\n\n if (isSelected) {\n const tabIndex = this.tabIndex;\n\n if (tabIndex !== undefined) {\n titleSpan.setAttribute(\"tabindex\", `${tabIndex}`);\n }\n }\n\n this.setTreeItemAriaAttributes(titleSpan, nodeName, level, isSelected);\n\n if (this.autoEscape) {\n titleSpan.textContent = nodeName;\n } else {\n titleSpan.innerHTML = nodeName;\n }\n\n return titleSpan;\n }\n\n private getButtonClasses(node: Node): string {\n const classes = [\"jqtree-toggler\", \"jqtree_common\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (this.buttonLeft) {\n classes.push(\"jqtree-toggler-left\");\n } else {\n classes.push(\"jqtree-toggler-right\");\n }\n\n return classes.join(\" \");\n }\n\n private getFolderClasses(node: Node, isSelected: boolean): string {\n const classes = [\"jqtree-folder\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (isSelected) {\n classes.push(\"jqtree-selected\");\n }\n\n if (node.is_loading) {\n classes.push(\"jqtree-loading\");\n }\n\n return classes.join(\" \");\n }\n\n private createButtonElement(\n value: IconElement,\n ): HTMLElement | Text | undefined {\n if (typeof value === \"string\") {\n // convert value to html\n const div = document.createElement(\"div\");\n div.innerHTML = value;\n\n return document.createTextNode(div.innerHTML);\n } else if (value == null) {\n return undefined;\n } else if ((value as HTMLElement).nodeType) {\n return value as HTMLElement;\n } else {\n return jQuery(value)[0];\n }\n }\n}\n","import { Node } from \"./node\";\nimport { DataFilter, OnLoadFailed } from \"./jqtreeOptions\";\nimport { LoadData, TriggerEvent } from \"./jqtreeMethodTypes\";\n\nexport type HandleFinishedLoading = () => void;\n\ninterface DataLoaderParams {\n dataFilter?: DataFilter;\n loadData: LoadData;\n onLoadFailed?: OnLoadFailed;\n treeElement: HTMLElement;\n triggerEvent: TriggerEvent;\n}\n\nexport default class DataLoader {\n private dataFilter?: DataFilter;\n private loadData: LoadData;\n private onLoadFailed?: OnLoadFailed;\n private treeElement: HTMLElement;\n private triggerEvent: TriggerEvent;\n\n constructor({\n dataFilter,\n loadData,\n onLoadFailed,\n treeElement,\n triggerEvent,\n }: DataLoaderParams) {\n this.dataFilter = dataFilter;\n this.loadData = loadData;\n this.onLoadFailed = onLoadFailed;\n this.treeElement = treeElement;\n this.triggerEvent = triggerEvent;\n }\n\n public loadFromUrl(\n urlInfo: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null,\n ): void {\n if (!urlInfo) {\n return;\n }\n\n const element = this.getDomElement(parentNode);\n this.addLoadingClass(element);\n this.notifyLoading(true, parentNode);\n\n const stopLoading = (): void => {\n this.removeLoadingClass(element);\n this.notifyLoading(false, parentNode);\n };\n\n const handleSuccess = (data: string | NodeData[]): void => {\n stopLoading();\n this.loadData(this.parseData(data), parentNode);\n\n if (onFinished && typeof onFinished === \"function\") {\n onFinished();\n }\n };\n\n const handleError = (jqXHR: JQuery.jqXHR): void => {\n stopLoading();\n\n if (this.onLoadFailed) {\n this.onLoadFailed(jqXHR);\n }\n };\n\n this.submitRequest(urlInfo, handleSuccess, handleError);\n }\n\n private addLoadingClass(element: HTMLElement): void {\n element.classList.add(\"jqtree-loading\");\n }\n\n private removeLoadingClass(element: HTMLElement): void {\n element.classList.remove(\"jqtree-loading\");\n }\n\n private getDomElement(parentNode: Node | null): HTMLElement {\n if (parentNode) {\n return parentNode.element;\n } else {\n return this.treeElement;\n }\n }\n\n private notifyLoading(isLoading: boolean, node: Node | null): void {\n this.triggerEvent(\"tree.loading_data\", {\n isLoading,\n node,\n });\n }\n\n private submitRequest(\n urlInfoInput: string | JQuery.AjaxSettings,\n handleSuccess: JQuery.Ajax.SuccessCallback,\n handleError: JQuery.Ajax.ErrorCallback,\n ): void {\n const urlInfo =\n typeof urlInfoInput === \"string\"\n ? { url: urlInfoInput }\n : urlInfoInput;\n\n const ajaxSettings: JQuery.AjaxSettings = {\n method: \"GET\",\n cache: false,\n dataType: \"json\",\n success: handleSuccess,\n error: handleError,\n ...urlInfo,\n };\n\n ajaxSettings.method = ajaxSettings.method?.toUpperCase() || \"GET\";\n\n void jQuery.ajax(ajaxSettings);\n }\n\n private parseData(data: string | NodeData[]): NodeData[] {\n const getParsedData = () => {\n if (typeof data === \"string\") {\n return JSON.parse(data) as NodeData[];\n } else {\n return data;\n }\n };\n\n const parsedData = getParsedData();\n\n if (this.dataFilter) {\n return this.dataFilter(parsedData);\n } else {\n return parsedData;\n }\n }\n}\n","import { Node } from \"./node\";\nimport {\n CloseNode,\n GetSelectedNode,\n IsFocusOnTree,\n OpenNode,\n SelectNode,\n} from \"./jqtreeMethodTypes\";\n\ntype KeyboardEventHandler = (event: KeyboardEvent) => boolean;\n\ninterface KeyHandlerParams {\n closeNode: CloseNode;\n getSelectedNode: GetSelectedNode;\n isFocusOnTree: IsFocusOnTree;\n keyboardSupport: boolean;\n openNode: OpenNode;\n selectNode: SelectNode;\n}\n\nexport default class KeyHandler {\n private closeNode: CloseNode;\n private getSelectedNode: GetSelectedNode;\n private handleKeyDownHandler?: KeyboardEventHandler;\n private isFocusOnTree: IsFocusOnTree;\n private keyboardSupport: boolean;\n private openNode: OpenNode;\n private originalSelectNode: SelectNode;\n\n constructor({\n closeNode,\n getSelectedNode,\n isFocusOnTree,\n keyboardSupport,\n openNode,\n selectNode,\n }: KeyHandlerParams) {\n this.closeNode = closeNode;\n this.getSelectedNode = getSelectedNode;\n this.isFocusOnTree = isFocusOnTree;\n this.keyboardSupport = keyboardSupport;\n this.openNode = openNode;\n this.originalSelectNode = selectNode;\n\n if (keyboardSupport) {\n this.handleKeyDownHandler = this.handleKeyDown.bind(this);\n\n document.addEventListener(\"keydown\", this.handleKeyDownHandler);\n }\n }\n\n public deinit(): void {\n if (this.handleKeyDownHandler) {\n document.removeEventListener(\"keydown\", this.handleKeyDownHandler);\n }\n }\n\n public moveDown(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getNextVisibleNode());\n }\n\n public moveUp(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getPreviousVisibleNode());\n }\n\n public moveRight(selectedNode: Node): boolean {\n if (!selectedNode.isFolder()) {\n return true;\n } else {\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 } else {\n // Right expands a closed node\n this.openNode(selectedNode);\n return false;\n }\n }\n }\n\n public moveLeft(selectedNode: Node): boolean {\n if (selectedNode.isFolder() && selectedNode.is_open) {\n // Left on an open node closes the node\n this.closeNode(selectedNode);\n return false;\n } else {\n // Left on a closed or end node moves focus to the node's parent\n return this.selectNode(selectedNode.getParent());\n }\n }\n\n public selectNode(node: Node | null): boolean {\n if (!node) {\n return true;\n } else {\n this.originalSelectNode(node);\n\n return false;\n }\n }\n\n private handleKeyDown = (e: KeyboardEvent): boolean => {\n if (!this.canHandleKeyboard()) {\n return true;\n }\n\n const selectedNode = this.getSelectedNode();\n if (!selectedNode) {\n return true;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n return this.moveDown(selectedNode);\n\n case \"ArrowUp\":\n return this.moveUp(selectedNode);\n\n case \"ArrowRight\":\n return this.moveRight(selectedNode);\n\n case \"ArrowLeft\":\n return this.moveLeft(selectedNode);\n\n default:\n return true;\n }\n };\n\n private canHandleKeyboard(): boolean {\n return this.keyboardSupport && this.isFocusOnTree();\n }\n}\n","export interface PositionInfo {\n originalEvent: Event;\n pageX: number;\n pageY: number;\n target: HTMLElement;\n}\n\nexport const getPositionInfoFromMouseEvent = (e: MouseEvent): PositionInfo => ({\n originalEvent: e,\n pageX: e.pageX,\n pageY: e.pageY,\n target: e.target as HTMLElement,\n});\n\nexport const getPositionInfoFromTouch = (\n touch: Touch,\n e: TouchEvent,\n): PositionInfo => ({\n originalEvent: e,\n pageX: touch.pageX,\n pageY: touch.pageY,\n target: touch.target as HTMLElement,\n});\n","import {\n getPositionInfoFromMouseEvent,\n getPositionInfoFromTouch,\n PositionInfo,\n} from \"./mouseUtils\";\nimport { Node } from \"./node\";\nimport { TriggerEvent } from \"./jqtreeMethodTypes\";\n\ninterface ClickTarget {\n node: Node;\n type: \"button\" | \"label\";\n}\n\ntype GetNode = (element: HTMLElement) => null | Node;\n\ninterface MouseHandlerParams {\n element: HTMLElement;\n getMouseDelay: () => number;\n getNode: GetNode;\n onClickButton: (node: Node) => void;\n onClickTitle: (node: Node) => void;\n onMouseCapture: (positionInfo: PositionInfo) => boolean | null;\n onMouseDrag: (positionInfo: PositionInfo) => void;\n onMouseStart: (positionInfo: PositionInfo) => boolean;\n onMouseStop: (positionInfo: PositionInfo) => void;\n triggerEvent: TriggerEvent;\n useContextMenu: boolean;\n}\n\nclass MouseHandler {\n private element: HTMLElement;\n private getMouseDelay: () => number;\n private getNode: GetNode;\n private isMouseDelayMet: boolean;\n private isMouseStarted: boolean;\n private mouseDelayTimer: number | null;\n private mouseDownInfo: PositionInfo | null;\n private onClickButton: (node: Node) => void;\n private onClickTitle: (node: Node) => void;\n private onMouseCapture: (positionInfo: PositionInfo) => boolean | null;\n private onMouseDrag: (positionInfo: PositionInfo) => void;\n private onMouseStart: (positionInfo: PositionInfo) => boolean;\n private onMouseStop: (positionInfo: PositionInfo) => void;\n private triggerEvent: TriggerEvent;\n private useContextMenu: boolean;\n\n constructor({\n element,\n getMouseDelay,\n getNode,\n onClickButton,\n onClickTitle,\n onMouseCapture,\n onMouseDrag,\n onMouseStart,\n onMouseStop,\n triggerEvent,\n useContextMenu,\n }: MouseHandlerParams) {\n this.element = element;\n this.getMouseDelay = getMouseDelay;\n this.getNode = getNode;\n this.onClickButton = onClickButton;\n this.onClickTitle = onClickTitle;\n this.onMouseCapture = onMouseCapture;\n this.onMouseDrag = onMouseDrag;\n this.onMouseStart = onMouseStart;\n this.onMouseStop = onMouseStop;\n this.triggerEvent = triggerEvent;\n this.useContextMenu = useContextMenu;\n\n element.addEventListener(\"click\", this.handleClick);\n element.addEventListener(\"dblclick\", this.handleDblclick);\n element.addEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n element.addEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n\n if (useContextMenu) {\n element.addEventListener(\"contextmenu\", this.handleContextmenu);\n }\n\n this.isMouseStarted = false;\n this.mouseDelayTimer = null;\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n }\n\n public deinit(): void {\n this.element.removeEventListener(\"click\", this.handleClick);\n this.element.removeEventListener(\"dblclick\", this.handleDblclick);\n\n if (this.useContextMenu) {\n this.element.removeEventListener(\n \"contextmenu\",\n this.handleContextmenu,\n );\n }\n\n this.element.removeEventListener(\"mousedown\", this.mouseDown);\n this.element.removeEventListener(\"touchstart\", this.touchStart);\n this.removeMouseMoveEventListeners();\n }\n\n private mouseDown = (e: MouseEvent): void => {\n // Left mouse button?\n if (e.button !== 0) {\n return;\n }\n\n const result = this.handleMouseDown(getPositionInfoFromMouseEvent(e));\n\n if (result && e.cancelable) {\n e.preventDefault();\n }\n };\n\n private handleMouseDown(positionInfo: PositionInfo): boolean {\n // We may have missed mouseup (out of window)\n if (this.isMouseStarted) {\n this.handleMouseUp(positionInfo);\n }\n\n this.mouseDownInfo = positionInfo;\n\n if (!this.onMouseCapture(positionInfo)) {\n return false;\n }\n\n this.handleStartMouse();\n\n return true;\n }\n\n private handleStartMouse(): void {\n document.addEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n document.addEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n document.addEventListener(\"mouseup\", this.mouseUp, { passive: false });\n document.addEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\n\n const mouseDelay = this.getMouseDelay();\n\n if (mouseDelay) {\n this.startMouseDelayTimer(mouseDelay);\n } else {\n this.isMouseDelayMet = true;\n }\n }\n\n private startMouseDelayTimer(mouseDelay: number): void {\n if (this.mouseDelayTimer) {\n clearTimeout(this.mouseDelayTimer);\n }\n\n this.mouseDelayTimer = window.setTimeout(() => {\n if (this.mouseDownInfo) {\n this.isMouseDelayMet = true;\n }\n }, mouseDelay);\n\n this.isMouseDelayMet = false;\n }\n\n private mouseMove = (e: MouseEvent): void => {\n this.handleMouseMove(e, getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseMove(\n e: MouseEvent | TouchEvent,\n positionInfo: PositionInfo,\n ): void {\n if (this.isMouseStarted) {\n this.onMouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n return;\n }\n\n if (!this.isMouseDelayMet) {\n return;\n }\n\n if (this.mouseDownInfo) {\n this.isMouseStarted =\n this.onMouseStart(this.mouseDownInfo) !== false;\n }\n\n if (this.isMouseStarted) {\n this.onMouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n } else {\n this.handleMouseUp(positionInfo);\n }\n }\n\n private mouseUp = (e: MouseEvent): void => {\n this.handleMouseUp(getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseUp(positionInfo: PositionInfo): void {\n this.removeMouseMoveEventListeners();\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n\n if (this.isMouseStarted) {\n this.isMouseStarted = false;\n this.onMouseStop(positionInfo);\n }\n }\n\n private removeMouseMoveEventListeners() {\n document.removeEventListener(\"mousemove\", this.mouseMove);\n document.removeEventListener(\"touchmove\", this.touchMove);\n document.removeEventListener(\"mouseup\", this.mouseUp);\n document.removeEventListener(\"touchend\", this.touchEnd);\n }\n\n private touchStart = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.touches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseDown(getPositionInfoFromTouch(touch, e));\n };\n\n private touchMove = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.touches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseMove(e, getPositionInfoFromTouch(touch, e));\n };\n\n private touchEnd = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.touches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseUp(getPositionInfoFromTouch(touch, e));\n };\n\n private handleClick = (e: MouseEvent): void => {\n if (!e.target) {\n return;\n }\n\n const clickTarget = this.getClickTarget(e.target as HTMLElement);\n\n if (!clickTarget) {\n return;\n }\n\n if (clickTarget.type === \"button\") {\n this.onClickButton(clickTarget.node);\n\n e.preventDefault();\n e.stopPropagation();\n } else if (clickTarget.type === \"label\") {\n const event = this.triggerEvent(\"tree.click\", {\n node: clickTarget.node,\n click_event: e,\n });\n\n if (!event.isDefaultPrevented()) {\n this.onClickTitle(clickTarget.node);\n }\n }\n };\n\n private handleDblclick = (e: MouseEvent): void => {\n if (!e.target) {\n return;\n }\n\n const clickTarget = this.getClickTarget(e.target as HTMLElement);\n\n if (clickTarget?.type === \"label\") {\n this.triggerEvent(\"tree.dblclick\", {\n node: clickTarget.node,\n click_event: e,\n });\n }\n };\n\n private handleContextmenu = (e: MouseEvent) => {\n if (!e.target) {\n return;\n }\n\n const div = (e.target as HTMLElement).closest(\n \"ul.jqtree-tree .jqtree-element\",\n );\n\n if (div) {\n const node = this.getNode(div);\n if (node) {\n e.preventDefault();\n e.stopPropagation();\n\n this.triggerEvent(\"tree.contextmenu\", {\n node,\n click_event: e,\n });\n return false;\n }\n }\n\n return null;\n };\n\n private getClickTarget(element: HTMLElement): ClickTarget | null {\n const button = element.closest(\".jqtree-toggler\");\n\n if (button) {\n const node = this.getNode(button);\n\n if (node) {\n return {\n type: \"button\",\n node,\n };\n }\n } else {\n const jqTreeElement =\n element.closest(\".jqtree-element\");\n\n if (jqTreeElement) {\n const node = this.getNode(jqTreeElement);\n if (node) {\n return {\n type: \"label\",\n node,\n };\n }\n }\n }\n\n return null;\n }\n}\n\nexport default MouseHandler;\n","import { isInt } from \"./util\";\nimport { Node } from \"./node\";\nimport { OnGetStateFromStorage, OnSetStateFromStorage } from \"./jqtreeOptions\";\nimport {\n AddToSelection,\n GetNodeById,\n GetSelectedNodes,\n GetTree,\n OpenNode,\n RefreshElements,\n RemoveFromSelection,\n} from \"./jqtreeMethodTypes\";\n\nexport interface SavedState {\n open_nodes: NodeId[];\n selected_node: NodeId[];\n}\n\ninterface SaveStateHandlerParams {\n addToSelection: AddToSelection;\n getNodeById: GetNodeById;\n getSelectedNodes: GetSelectedNodes;\n getTree: GetTree;\n onGetStateFromStorage?: OnGetStateFromStorage;\n onSetStateFromStorage?: OnSetStateFromStorage;\n openNode: OpenNode;\n refreshElements: RefreshElements;\n removeFromSelection: RemoveFromSelection;\n saveState: boolean | string;\n}\n\nexport default class SaveStateHandler {\n private addToSelection: AddToSelection;\n private getNodeById: GetNodeById;\n private getSelectedNodes: GetSelectedNodes;\n private getTree: GetTree;\n private onGetStateFromStorage?: OnGetStateFromStorage;\n private onSetStateFromStorage?: OnSetStateFromStorage;\n private openNode: OpenNode;\n private refreshElements: RefreshElements;\n private removeFromSelection: RemoveFromSelection;\n private saveStateOption: boolean | string;\n private _supportsLocalStorage: boolean | null;\n\n constructor({\n addToSelection,\n getNodeById,\n getSelectedNodes,\n getTree,\n onGetStateFromStorage,\n onSetStateFromStorage,\n openNode,\n refreshElements,\n removeFromSelection,\n saveState,\n }: SaveStateHandlerParams) {\n this.addToSelection = addToSelection;\n this.getNodeById = getNodeById;\n this.getSelectedNodes = getSelectedNodes;\n this.getTree = getTree;\n this.onGetStateFromStorage = onGetStateFromStorage;\n this.onSetStateFromStorage = onSetStateFromStorage;\n this.openNode = openNode;\n this.refreshElements = refreshElements;\n this.removeFromSelection = removeFromSelection;\n this.saveStateOption = saveState;\n }\n\n public saveState(): void {\n const state = JSON.stringify(this.getState());\n\n if (this.onSetStateFromStorage) {\n this.onSetStateFromStorage(state);\n } else if (this.supportsLocalStorage()) {\n localStorage.setItem(this.getKeyName(), state);\n }\n }\n\n public getStateFromStorage(): SavedState | null {\n const jsonData = this.loadFromStorage();\n\n if (jsonData) {\n return this.parseState(jsonData) as unknown as SavedState;\n } else {\n return null;\n }\n }\n\n public getState(): SavedState {\n const getOpenNodeIds = (): NodeId[] => {\n const openNodes: NodeId[] = [];\n\n this.getTree()?.iterate((node: Node) => {\n if (node.is_open && node.id && node.hasChildren()) {\n openNodes.push(node.id);\n }\n return true;\n });\n\n return openNodes;\n };\n\n const getSelectedNodeIds = (): NodeId[] => {\n const selectedNodeIds: NodeId[] = [];\n\n this.getSelectedNodes().forEach((node) => {\n if (node.id != null) {\n selectedNodeIds.push(node.id);\n }\n });\n\n return selectedNodeIds;\n };\n\n return {\n open_nodes: getOpenNodeIds(),\n selected_node: getSelectedNodeIds(),\n };\n }\n\n /*\n Set initial state\n Don't handle nodes that are loaded on demand\n\n result: must load on demand\n */\n public setInitialState(state: SavedState): boolean {\n if (!state) {\n return false;\n } else {\n let mustLoadOnDemand = false;\n\n if (state.open_nodes) {\n mustLoadOnDemand = this.openInitialNodes(state.open_nodes);\n }\n\n if (state.selected_node) {\n this.resetSelection();\n this.selectInitialNodes(state.selected_node);\n }\n\n return mustLoadOnDemand;\n }\n }\n\n public setInitialStateOnDemand(\n state: SavedState,\n cbFinished: () => void,\n ): void {\n if (state) {\n this.doSetInitialStateOnDemand(\n state.open_nodes,\n state.selected_node,\n cbFinished,\n );\n } else {\n cbFinished();\n }\n }\n\n public getNodeIdToBeSelected(): NodeId | null {\n const state = this.getStateFromStorage();\n\n if (state && state.selected_node) {\n return state.selected_node[0] || null;\n } else {\n return null;\n }\n }\n\n private parseState(jsonData: string): SavedState {\n const state = JSON.parse(jsonData) as Record;\n\n // Check if selected_node is an int (instead of an array)\n if (state && state.selected_node && isInt(state.selected_node)) {\n // Convert to array\n state.selected_node = [state.selected_node];\n }\n\n return state as unknown as SavedState;\n }\n\n private loadFromStorage(): string | null {\n if (this.onGetStateFromStorage) {\n return this.onGetStateFromStorage();\n } else if (this.supportsLocalStorage()) {\n return localStorage.getItem(this.getKeyName());\n } else {\n return null;\n }\n }\n\n private openInitialNodes(nodeIds: NodeId[]): boolean {\n let mustLoadOnDemand = false;\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (node) {\n if (!node.load_on_demand) {\n node.is_open = true;\n } else {\n mustLoadOnDemand = true;\n }\n }\n }\n\n return mustLoadOnDemand;\n }\n\n private selectInitialNodes(nodeIds: NodeId[]): boolean {\n let selectCount = 0;\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (node) {\n selectCount += 1;\n\n this.addToSelection(node);\n }\n }\n\n return selectCount !== 0;\n }\n\n private resetSelection(): void {\n const selectedNodes = this.getSelectedNodes();\n\n selectedNodes.forEach((node) => {\n this.removeFromSelection(node);\n });\n }\n\n private doSetInitialStateOnDemand(\n nodeIdsParam: NodeId[],\n selectedNodes: NodeId[],\n cbFinished: () => void,\n ): void {\n let loadingCount = 0;\n let nodeIds = nodeIdsParam;\n\n const openNodes = (): void => {\n const newNodesIds = [];\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (!node) {\n newNodesIds.push(nodeId);\n } else {\n if (!node.is_loading) {\n if (node.load_on_demand) {\n loadAndOpenNode(node);\n } else {\n this.openNode(node, false);\n }\n }\n }\n }\n\n nodeIds = newNodesIds;\n\n if (this.selectInitialNodes(selectedNodes)) {\n this.refreshElements(null);\n }\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this.openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n openNodes();\n }\n\n private getKeyName(): string {\n if (typeof this.saveStateOption === \"string\") {\n return this.saveStateOption;\n } else {\n return \"tree\";\n }\n }\n\n private supportsLocalStorage(): boolean {\n const testSupport = (): boolean => {\n // Is local storage supported?\n if (localStorage == null) {\n return false;\n } else {\n // Check if it's possible to store an item. Safari does not allow this in private browsing mode.\n try {\n const key = \"_storage_test\";\n sessionStorage.setItem(key, \"value\");\n sessionStorage.removeItem(key);\n } catch (error) {\n return false;\n }\n\n return true;\n }\n };\n\n if (this._supportsLocalStorage == null) {\n this._supportsLocalStorage = testSupport();\n }\n\n return this._supportsLocalStorage;\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport { getElementPosition, getOffsetTop } from '../util'\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\ninterface Params {\n container: HTMLElement;\n refreshHitAreas: () => void;\n}\n\nexport default class ContainerScrollParent implements ScrollParent {\n private container: HTMLElement;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private scrollParentBottom?: number;\n private scrollParentTop?: number;\n private verticalScrollTimeout?: number;\n private verticalScrollDirection?: VerticalScrollDirection;\n\n constructor({ container, refreshHitAreas }: Params) {\n this.container = container;\n this.refreshHitAreas = refreshHitAreas;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return this.container.scrollLeft;\n }\n\n public scrollToY(top: number): void {\n this.container.scrollTop = top;\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.scrollParentTop = undefined;\n this.scrollParentBottom = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const scrollParentOffset = getElementPosition(this.container);\n\n const rightEdge = scrollParentOffset.left + this.container.clientWidth;\n const leftEdge = scrollParentOffset.left;\n const isNearRightEdge = pageX > rightEdge - 20;\n const isNearLeftEdge = pageX < leftEdge + 20;\n\n if (isNearRightEdge) {\n return \"right\";\n } else if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n if (pageY < this.getScrollParentTop()) {\n return \"top\";\n }\n\n if (pageY > this.getScrollParentBottom()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n\n this.container.scrollBy({\n left: distance,\n top: 0,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n\n this.container.scrollBy({\n left: 0,\n top: distance,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n\n private getScrollParentTop() {\n if (this.scrollParentTop == null) {\n this.scrollParentTop = getOffsetTop(this.container)\n }\n\n return this.scrollParentTop;\n }\n\n private getScrollParentBottom() {\n if (this.scrollParentBottom == null) {\n this.scrollParentBottom = this.getScrollParentTop() + this.container.clientHeight;\n }\n\n return this.scrollParentBottom;\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport { getOffsetTop } from '../util'\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\ninterface Params {\n refreshHitAreas: () => void;\n treeElement: HTMLElement;\n}\n\nexport default class DocumentScrollParent implements ScrollParent {\n private documentScrollHeight?: number;\n private documentScrollWidth?: number;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private treeElement: HTMLElement;\n private verticalScrollDirection?: VerticalScrollDirection;\n private verticalScrollTimeout?: number;\n\n constructor({ refreshHitAreas, treeElement }: Params) {\n this.refreshHitAreas = refreshHitAreas;\n this.treeElement = treeElement;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.horizontalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return document.documentElement.scrollLeft;\n }\n\n public scrollToY(top: number): void {\n const treeTop = getOffsetTop(this.treeElement);\n\n document.documentElement.scrollTop = top + treeTop;\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.documentScrollHeight = undefined;\n this.documentScrollWidth = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const scrollLeft = document.documentElement.scrollLeft;\n const windowWidth = window.innerWidth;\n\n const isNearRightEdge = pageX > windowWidth - 20;\n const isNearLeftEdge = pageX - scrollLeft < 20;\n\n if (isNearRightEdge && this.canScrollRight()) {\n return \"right\";\n }\n\n if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private canScrollRight() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollLeft + documentElement.clientWidth <\n this.getDocumentScrollWidth()\n );\n }\n\n private canScrollDown() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollTop + documentElement.clientHeight <\n this.getDocumentScrollHeight()\n );\n }\n\n private getDocumentScrollHeight() {\n // Store the original scroll height because the scroll height can increase when the drag element is moved beyond the scroll height.\n if (this.documentScrollHeight == null) {\n this.documentScrollHeight = document.documentElement.scrollHeight;\n }\n\n return this.documentScrollHeight;\n }\n\n private getDocumentScrollWidth() {\n // Store the original scroll width because the scroll width can increase when the drag element is moved beyond the scroll width.\n if (this.documentScrollWidth == null) {\n this.documentScrollWidth = document.documentElement.scrollWidth;\n }\n\n return this.documentScrollWidth;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n const scrollTop = jQuery(document).scrollTop() || 0;\n const distanceTop = pageY - scrollTop;\n\n if (distanceTop < 20) {\n return \"top\";\n }\n\n const windowHeight = window.innerHeight;\n\n if (windowHeight - (pageY - scrollTop) < 20 && this.canScrollDown()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n window.scrollBy({ left: distance, top: 0, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n window.scrollBy({ left: 0, top: distance, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport ContainerScrollParent from \"./containerScrollParent\";\nimport DocumentScrollParent from \"./documentScrollParent\";\n\nconst isOverflow = (overflowValue: string) =>\n overflowValue === \"auto\" || overflowValue === \"scroll\";\n\nconst hasOverFlow = (element: HTMLElement): boolean => {\n const style = getComputedStyle(element);\n\n return isOverflow(style.overflowX) || isOverflow(style.overflowY);\n};\n\nconst getParentWithOverflow = (\n treeElement: HTMLElement,\n): HTMLElement | null => {\n if (hasOverFlow(treeElement)) {\n return treeElement;\n }\n\n let parent = treeElement.parentElement;\n\n while (parent) {\n if (hasOverFlow(parent)) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return null;\n};\n\nconst createScrollParent = (\n treeElement: HTMLElement,\n refreshHitAreas: () => void,\n): ScrollParent => {\n const container = getParentWithOverflow(treeElement);\n\n if (container && container.tagName !== \"HTML\") {\n return new ContainerScrollParent({\n container,\n refreshHitAreas,\n });\n } else {\n return new DocumentScrollParent({ refreshHitAreas, treeElement });\n }\n};\n\nexport default createScrollParent;\n","import { PositionInfo } from \"./mouseUtils\";\nimport { ScrollParent } from \"./scrollHandler/types\";\nimport createScrollParent from \"./scrollHandler/createScrollParent\";\n\ninterface ScrollHandlerParams {\n refreshHitAreas: () => void;\n treeElement: HTMLElement;\n}\n\nexport default class ScrollHandler {\n private refreshHitAreas: () => void;\n private scrollParent?: ScrollParent;\n private treeElement: HTMLElement;\n\n constructor({ refreshHitAreas, treeElement }: ScrollHandlerParams) {\n this.refreshHitAreas = refreshHitAreas;\n this.scrollParent = undefined;\n this.treeElement = treeElement;\n }\n\n public checkScrolling(positionInfo: PositionInfo): void {\n this.checkVerticalScrolling(positionInfo);\n this.checkHorizontalScrolling(positionInfo);\n }\n\n public stopScrolling() {\n this.getScrollParent().stopScrolling();\n }\n\n public scrollToY(top: number): void {\n this.getScrollParent().scrollToY(top);\n }\n\n public getScrollLeft(): number {\n return this.getScrollParent().getScrollLeft();\n }\n\n private checkVerticalScrolling(positionInfo: PositionInfo): void {\n this.getScrollParent().checkVerticalScrolling(positionInfo.pageY);\n }\n\n private checkHorizontalScrolling(positionInfo: PositionInfo): void {\n this.getScrollParent().checkHorizontalScrolling(positionInfo.pageX);\n }\n\n private getScrollParent(): ScrollParent {\n if (!this.scrollParent) {\n this.scrollParent = createScrollParent(\n this.treeElement,\n this.refreshHitAreas,\n );\n }\n\n return this.scrollParent;\n }\n}\n","import { Node } from \"./node\";\nimport { GetNodeById } from \"./jqtreeMethodTypes\";\n\ninterface SelectNodeHandlerParameters {\n getNodeById: GetNodeById;\n}\n\nexport default class SelectNodeHandler {\n private getNodeById: GetNodeById;\n private selectedNodes: Set;\n private selectedSingleNode: Node | null;\n\n constructor({ getNodeById }: SelectNodeHandlerParameters) {\n this.getNodeById = getNodeById;\n this.selectedNodes = new Set();\n this.clear();\n }\n\n public getSelectedNode(): Node | false {\n const selectedNodes = this.getSelectedNodes();\n\n if (selectedNodes.length) {\n return selectedNodes[0] || false;\n } else {\n return false;\n }\n }\n\n public getSelectedNodes(): Node[] {\n if (this.selectedSingleNode) {\n return [this.selectedSingleNode];\n } else {\n const selectedNodes: Node[] = [];\n\n this.selectedNodes.forEach((id) => {\n const node = this.getNodeById(id);\n if (node) {\n selectedNodes.push(node);\n }\n });\n\n return selectedNodes;\n }\n }\n\n public getSelectedNodesUnder(parent: Node): Node[] {\n if (this.selectedSingleNode) {\n if (parent.isParentOf(this.selectedSingleNode)) {\n return [this.selectedSingleNode];\n } else {\n return [];\n }\n } else {\n const selectedNodes = [];\n\n for (const id in this.selectedNodes) {\n if (\n Object.prototype.hasOwnProperty.call(this.selectedNodes, id)\n ) {\n const node = this.getNodeById(id);\n if (node && parent.isParentOf(node)) {\n selectedNodes.push(node);\n }\n }\n }\n\n return selectedNodes;\n }\n }\n\n public isNodeSelected(node: Node): boolean {\n if (node.id != null) {\n return this.selectedNodes.has(node.id);\n } else if (this.selectedSingleNode) {\n return this.selectedSingleNode.element === node.element;\n } else {\n return false;\n }\n }\n\n public clear(): void {\n this.selectedNodes.clear();\n this.selectedSingleNode = null;\n }\n\n public removeFromSelection(node: Node, includeChildren = false): void {\n if (node.id == null) {\n if (\n this.selectedSingleNode &&\n node.element === this.selectedSingleNode.element\n ) {\n this.selectedSingleNode = null;\n }\n } else {\n this.selectedNodes.delete(node.id);\n\n if (includeChildren) {\n node.iterate(() => {\n if (node.id != null) {\n this.selectedNodes.delete(node.id);\n }\n return true;\n });\n }\n }\n }\n\n public addToSelection(node: Node): void {\n if (node.id != null) {\n this.selectedNodes.add(node.id);\n } else {\n this.selectedSingleNode = node;\n }\n }\n}\n","const register = (widgetClass: unknown, widgetName: string): void => {\n const getDataKey = (): string => `simple_widget_${widgetName}`;\n\n const getWidgetData = (\n el: HTMLElement,\n dataKey: string\n ): SimpleWidget | null => {\n const widget = jQuery.data(el, dataKey) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n return widget;\n } else {\n return null;\n }\n };\n\n const createWidget = ($el: JQuery, options: unknown): JQuery => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const existingWidget = getWidgetData(el, dataKey);\n\n if (!existingWidget) {\n const simpleWidgetClass = widgetClass as typeof SimpleWidget;\n const widget = new simpleWidgetClass(el, options);\n\n if (!jQuery.data(el, dataKey)) {\n jQuery.data(el, dataKey, widget);\n }\n\n // Call init after setting data, so we can call methods\n widget.init();\n }\n }\n\n return $el;\n };\n\n const destroyWidget = ($el: JQuery): void => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const widget = getWidgetData(el, dataKey);\n\n if (widget) {\n widget.destroy();\n }\n\n jQuery.removeData(el, dataKey);\n }\n };\n\n const callFunction = (\n $el: JQuery,\n functionName: string,\n args: unknown[]\n ): unknown => {\n let result = null;\n\n for (const el of $el.get()) {\n const widget = jQuery.data(el, getDataKey()) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n const simpleWidget = widget as SimpleWidget;\n const widgetFunction = simpleWidget[functionName];\n\n if (widgetFunction && typeof widgetFunction === \"function\") {\n result = widgetFunction.apply(widget, args) as unknown;\n }\n }\n }\n\n return result;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (jQuery.fn as any)[widgetName] = function (\n this: JQuery,\n argument1: unknown,\n ...args: unknown[]\n ) {\n if (!argument1) {\n return createWidget(this, null);\n } else if (typeof argument1 === \"object\") {\n const options = argument1 as unknown;\n return createWidget(this, options);\n } else if (typeof argument1 === \"string\" && argument1[0] !== \"_\") {\n const functionName = argument1;\n\n if (functionName === \"destroy\") {\n return destroyWidget(this);\n } else if (functionName === \"get_widget_class\") {\n return widgetClass;\n } else {\n return callFunction(this, functionName, args);\n }\n } else {\n return undefined;\n }\n };\n};\n\nexport default class SimpleWidget {\n public static register(widgetClass: unknown, widgetName: string): void {\n register(widgetClass, widgetName);\n }\n\n [key: string]: unknown;\n\n protected static defaults: unknown = {};\n\n public options: WidgetOptions;\n\n public $el: JQuery;\n\n constructor(el: HTMLElement, options: WidgetOptions) {\n this.$el = jQuery(el);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const defaults = (this.constructor as any)[\"defaults\"] as WidgetOptions;\n this.options = { ...defaults, ...options };\n }\n\n public destroy(): void {\n this.deinit();\n }\n\n public init(): void {\n //\n }\n\n public deinit(): void {\n //\n }\n}\n","interface NodeRecordWithChildren extends NodeRecord {\n children: NodeData[];\n}\n\nexport const isNodeRecordWithChildren = (\n data: NodeData,\n): data is NodeRecordWithChildren =>\n typeof data === \"object\" &&\n \"children\" in data &&\n data[\"children\"] instanceof Array;\n","import { isNodeRecordWithChildren } from \"./nodeUtils\";\nimport { Position } from \"./position\";\n\ntype IterateCallback = (node: Node, level: number) => boolean;\n\nexport class Node implements INode {\n public id?: NodeId;\n public name: string;\n public children: Node[];\n public parent: Node | null;\n public idMapping: Map;\n public tree?: Node;\n public nodeClass?: typeof Node;\n public load_on_demand: boolean;\n public is_open: boolean;\n public element: HTMLElement;\n public is_loading: boolean;\n public isEmptyFolder: boolean;\n\n [key: string]: unknown;\n\n constructor(\n nodeData: NodeData | null = null,\n isRoot = false,\n nodeClass = Node,\n ) {\n this.name = \"\";\n this.load_on_demand = false;\n\n this.isEmptyFolder =\n nodeData != null &&\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length === 0;\n\n this.setData(nodeData);\n\n this.children = [];\n this.parent = null;\n\n if (isRoot) {\n this.idMapping = new Map();\n this.tree = this;\n this.nodeClass = nodeClass;\n }\n }\n\n /*\n Set the data of this node.\n\n setData(string): set the name of the node\n setData(object): set attributes of the node\n\n Examples:\n setData('node1')\n\n setData({ name: 'node1', id: 1});\n\n setData({ name: 'node2', id: 2, color: 'green'});\n\n * This is an internal function; it is not in the docs\n * Does not remove existing node values\n */\n public setData(o: NodeData | null): void {\n if (!o) {\n return;\n } else if (typeof o === \"string\") {\n this.name = o;\n } else if (typeof o === \"object\") {\n for (const key in o) {\n if (Object.prototype.hasOwnProperty.call(o, key)) {\n const value = o[key];\n\n if (key === \"label\" || key === \"name\") {\n // You can use the 'label' key instead of 'name'; this is a legacy feature\n if (typeof value === \"string\") {\n this.name = value;\n }\n } else if (key !== \"children\" && key !== \"parent\") {\n // You can't update the children or the parent using this function\n this[key] = value;\n }\n }\n }\n }\n }\n\n /*\n Create tree from data.\n\n Structure of data is:\n [\n {\n name: 'node1',\n children: [\n { name: 'child1' },\n { name: 'child2' }\n ]\n },\n {\n name: 'node2'\n }\n ]\n */\n public loadFromData(data: NodeData[]): Node {\n this.removeChildren();\n\n for (const childData of data) {\n const node = this.createNode(childData);\n this.addChild(node);\n\n if (isNodeRecordWithChildren(childData)) {\n node.loadFromData(childData.children);\n }\n }\n\n return this;\n }\n\n /*\n Add child.\n\n tree.addChild(\n new Node('child1')\n );\n */\n public addChild(node: Node): void {\n this.children.push(node);\n node.setParent(this);\n }\n\n /*\n Add child at position. Index starts at 0.\n\n tree.addChildAtPosition(\n new Node('abc'),\n 1\n );\n */\n public addChildAtPosition(node: Node, index: number): void {\n this.children.splice(index, 0, node);\n node.setParent(this);\n }\n\n /*\n Remove child. This also removes the children of the node.\n\n tree.removeChild(tree.children[0]);\n */\n public removeChild(node: Node): void {\n // remove children from the index\n node.removeChildren();\n\n this.doRemoveChild(node);\n }\n\n /*\n Get child index.\n\n var index = getChildIndex(node);\n */\n public getChildIndex(node: Node): number {\n return this.children.indexOf(node);\n }\n\n /*\n Does the tree have children?\n\n if (tree.hasChildren()) {\n //\n }\n */\n public hasChildren(): boolean {\n return this.children.length !== 0;\n }\n\n public isFolder(): boolean {\n return this.hasChildren() || this.load_on_demand;\n }\n\n /*\n Iterate over all the nodes in the tree.\n\n Calls callback with (node, level).\n\n The callback must return true to continue the iteration on current node.\n\n tree.iterate(\n function(node, level) {\n console.log(node.name);\n\n // stop iteration after level 2\n return (level <= 2);\n }\n );\n\n */\n public iterate(callback: IterateCallback): void {\n const _iterate = (node: Node, level: number): void => {\n if (node.children) {\n for (const child of node.children) {\n const result = callback(child, level);\n\n if (result && child.hasChildren()) {\n _iterate(child, level + 1);\n }\n }\n }\n };\n\n _iterate(this, 0);\n }\n\n /*\n Move node relative to another node.\n\n Argument position: Position.BEFORE, Position.AFTER or Position.Inside\n\n // move node1 after node2\n tree.moveNode(node1, node2, Position.AFTER);\n */\n public moveNode(\n movedNode: Node,\n targetNode: Node,\n position: Position,\n ): boolean {\n if (!movedNode.parent || movedNode.isParentOf(targetNode)) {\n // - Node is parent of target node\n // - Or, parent is empty\n return false;\n } else {\n movedNode.parent.doRemoveChild(movedNode);\n\n switch (position) {\n case Position.After: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode) + 1,\n );\n return true;\n }\n return false;\n }\n\n case Position.Before: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode),\n );\n return true;\n }\n return false;\n }\n\n case Position.Inside: {\n // move inside as first child\n targetNode.addChildAtPosition(movedNode, 0);\n return true;\n }\n\n default:\n return false;\n }\n }\n }\n\n /*\n Get the tree as data.\n */\n public getData(includeParent = false): NodeRecord[] {\n const getDataFromNodes = (nodes: Node[]): Record[] => {\n return nodes.map((node) => {\n const tmpNode: Record = {};\n\n for (const k in node) {\n if (\n [\n \"parent\",\n \"children\",\n \"element\",\n \"idMapping\",\n \"load_on_demand\",\n \"nodeClass\",\n \"tree\",\n \"isEmptyFolder\",\n ].indexOf(k) === -1 &&\n Object.prototype.hasOwnProperty.call(node, k)\n ) {\n const v = node[k];\n tmpNode[k] = v;\n }\n }\n\n if (node.hasChildren()) {\n tmpNode[\"children\"] = getDataFromNodes(node.children);\n }\n\n return tmpNode;\n });\n };\n\n if (includeParent) {\n return getDataFromNodes([this]);\n } else {\n return getDataFromNodes(this.children);\n }\n }\n\n public getNodeByName(name: string): Node | null {\n return this.getNodeByCallback((node: Node) => node.name === name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n const node = this.getNodeByCallback((n: Node) => n.name === name);\n\n if (!node) {\n throw `Node with name ${name} not found`;\n }\n\n return node;\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n let result: Node | null = null;\n\n this.iterate((node: Node) => {\n if (result) {\n return false;\n } else if (callback(node)) {\n result = node;\n return false;\n } else {\n return true;\n }\n });\n\n return result;\n }\n\n public addAfter(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex + 1);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addBefore(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addParent(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const newParent = this.createNode(nodeInfo);\n\n if (this.tree) {\n newParent.setParent(this.tree);\n }\n const originalParent = this.parent;\n\n for (const child of originalParent.children) {\n newParent.addChild(child);\n }\n\n originalParent.children = [];\n originalParent.addChild(newParent);\n return newParent;\n }\n }\n\n public remove(): void {\n if (this.parent) {\n this.parent.removeChild(this);\n this.parent = null;\n }\n }\n\n public append(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChild(node);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public prepend(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChildAtPosition(node, 0);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public isParentOf(node: Node): boolean {\n let parent = node.parent;\n\n while (parent) {\n if (parent === this) {\n return true;\n }\n\n parent = parent.parent;\n }\n\n return false;\n }\n\n public getLevel(): number {\n let level = 0;\n let node: Node = this; // eslint-disable-line @typescript-eslint/no-this-alias\n\n while (node.parent) {\n level += 1;\n node = node.parent;\n }\n\n return level;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.idMapping.get(nodeId) || null;\n }\n\n public addNodeToIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.set(node.id, node);\n }\n }\n\n public removeNodeFromIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.delete(node.id);\n }\n }\n\n public removeChildren(): void {\n this.iterate((child: Node) => {\n this.tree?.removeNodeFromIndex(child);\n return true;\n });\n\n this.children = [];\n }\n\n public getPreviousSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousIndex = this.parent.getChildIndex(this) - 1;\n if (previousIndex >= 0) {\n return this.parent.children[previousIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNextSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const nextIndex = this.parent.getChildIndex(this) + 1;\n if (nextIndex < this.parent.children.length) {\n return this.parent.children[nextIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.filter((node: Node) => node[key] === value);\n }\n\n public filter(f: (node: Node) => boolean): Node[] {\n const result: Node[] = [];\n\n this.iterate((node: Node) => {\n if (f(node)) {\n result.push(node);\n }\n\n return true;\n });\n\n return result;\n }\n\n public getNextNode(includeChildren = true): Node | null {\n if (includeChildren && this.hasChildren()) {\n return this.children[0] || null;\n } else if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n\n if (nextSibling) {\n return nextSibling;\n } else {\n return this.parent.getNextNode(false);\n }\n }\n }\n\n public getNextVisibleNode(): Node | null {\n if (this.hasChildren() && this.is_open) {\n // First child\n return this.children[0] || null;\n } else {\n if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n if (nextSibling) {\n // Next sibling\n return nextSibling;\n } else {\n // Next node of parent\n return this.parent.getNextNode(false);\n }\n }\n }\n }\n\n public getPreviousNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (previousSibling.hasChildren()) {\n return previousSibling.getLastChild();\n } else {\n return previousSibling;\n }\n }\n }\n\n public getPreviousVisibleNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (\n !previousSibling.hasChildren() ||\n !previousSibling.is_open\n ) {\n // Previous sibling\n return previousSibling;\n } else {\n // Last child of previous sibling\n return previousSibling.getLastChild();\n }\n }\n }\n\n public getParent(): Node | null {\n // Return parent except if it is the root node\n if (!this.parent) {\n return null;\n } else if (!this.parent.parent) {\n // Root node -> null\n return null;\n } else {\n return this.parent;\n }\n }\n\n public getLastChild(): Node | null {\n if (!this.hasChildren()) {\n return null;\n } else {\n const lastChild = this.children[this.children.length - 1];\n\n if (!lastChild) {\n return null;\n }\n\n if (!(lastChild.hasChildren() && lastChild.is_open)) {\n return lastChild;\n } else {\n return lastChild?.getLastChild();\n }\n }\n }\n\n // Init Node from data without making it the root of the tree\n public initFromData(data: NodeData): void {\n const addNode = (nodeData: NodeData): void => {\n this.setData(nodeData);\n\n if (\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length\n ) {\n addChildren(nodeData.children);\n }\n };\n\n const addChildren = (childrenData: NodeData[]): void => {\n for (const child of childrenData) {\n const node = this.createNode();\n node.initFromData(child);\n this.addChild(node);\n }\n };\n\n addNode(data);\n }\n\n private setParent(parent: Node): void {\n this.parent = parent;\n this.tree = parent.tree;\n this.tree?.addNodeToIndex(this);\n }\n\n private doRemoveChild(node: Node): void {\n this.children.splice(this.getChildIndex(node), 1);\n this.tree?.removeNodeFromIndex(node);\n }\n\n private getNodeClass(): typeof Node {\n return this.nodeClass || this?.tree?.nodeClass || Node;\n }\n\n private createNode(nodeData?: NodeData): Node {\n const nodeClass = this.getNodeClass();\n return new nodeClass(nodeData);\n }\n\n // Load children data from nodeInfo if it has children\n private loadChildrenFromData(nodeInfo: NodeData) {\n if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {\n this.loadFromData(nodeInfo.children);\n }\n }\n}\n","import { DropHint } from \"../dragAndDropHandler/types\";\n\nclass BorderDropHint implements DropHint {\n private hint?: HTMLElement;\n\n constructor(element: HTMLElement, scrollLeft: number) {\n const div = element.querySelector(\":scope > .jqtree-element\");\n\n if (!div) {\n this.hint = undefined;\n return;\n }\n\n const width = Math.max(element.offsetWidth + scrollLeft - 4, 0);\n const height = Math.max(element.clientHeight - 4, 0);\n\n const hint = document.createElement(\"span\");\n hint.className = \"jqtree-border\";\n hint.style.width = `${width}px`;\n hint.style.height = `${height}px`;\n\n this.hint = hint;\n\n div.append(this.hint);\n }\n\n public remove(): void {\n this.hint?.remove();\n }\n}\n\nexport default BorderDropHint;\n","import { Node } from \"../node\";\nimport { Position } from \"../position\";\nimport { DropHint } from \"../dragAndDropHandler/types\";\n\nclass GhostDropHint implements DropHint {\n private element: HTMLElement;\n private node: Node;\n private ghost: HTMLElement;\n\n constructor(node: Node, element: HTMLElement, position: Position) {\n this.element = element;\n this.node = node;\n this.ghost = this.createGhostElement();\n\n if (position === Position.After) {\n this.moveAfter();\n } else if (position === Position.Before) {\n this.moveBefore();\n } else if (position === Position.Inside) {\n if (node.isFolder() && node.is_open) {\n this.moveInsideOpenFolder();\n } else {\n this.moveInside();\n }\n }\n }\n\n public remove(): void {\n this.ghost.remove();\n }\n\n private moveAfter(): void {\n this.element.after(this.ghost);\n }\n\n private moveBefore(): void {\n this.element.before(this.ghost);\n }\n\n private moveInsideOpenFolder(): void {\n const childElement = this.node.children[0]?.element;\n\n if (childElement) {\n childElement.before(this.ghost);\n }\n }\n\n private moveInside(): void {\n this.element.after(this.ghost);\n this.ghost.classList.add(\"jqtree-inside\");\n }\n\n private createGhostElement() {\n const ghost = document.createElement(\"li\");\n ghost.className = \"jqtree_common jqtree-ghost\";\n\n const circleSpan = document.createElement(\"span\");\n circleSpan.className = \"jqtree_common jqtree-circle\";\n ghost.append(circleSpan);\n\n const lineSpan = document.createElement(\"span\");\n lineSpan.className = \"jqtree_common jqtree-line\";\n ghost.append(lineSpan);\n\n return ghost;\n }\n}\n\nexport default GhostDropHint;\n","import { Node } from \"../node\";\nimport { Position } from \"../position\";\nimport { DropHint } from \"../dragAndDropHandler/types\";\nimport BorderDropHint from \"./borderDropHint\";\nimport GhostDropHint from \"./ghostDropHint\";\nimport { GetScrollLeft } from \"../jqtreeMethodTypes\";\n\nexport interface NodeElementParams {\n getScrollLeft: GetScrollLeft;\n node: Node;\n tabIndex?: number;\n $treeElement: JQuery;\n}\n\nclass NodeElement {\n public node: Node;\n public element: HTMLElement;\n private getScrollLeft: GetScrollLeft;\n private tabIndex?: number;\n private $treeElement: JQuery;\n\n constructor({\n getScrollLeft,\n node,\n tabIndex,\n $treeElement,\n }: NodeElementParams) {\n this.getScrollLeft = getScrollLeft;\n this.tabIndex = tabIndex;\n this.$treeElement = $treeElement;\n\n this.init(node);\n }\n\n public init(node: Node): void {\n this.node = node;\n\n if (!node.element) {\n const element = this.$treeElement.get(0);\n\n if (element) {\n node.element = element;\n }\n }\n\n if (node.element) {\n this.element = node.element;\n }\n }\n\n public addDropHint(position: number): DropHint {\n if (this.mustShowBorderDropHint(position)) {\n return new BorderDropHint(this.element, this.getScrollLeft());\n } else {\n return new GhostDropHint(this.node, this.element, position);\n }\n }\n\n public select(mustSetFocus: boolean): void {\n this.element.classList.add(\"jqtree-selected\");\n\n const titleSpan = this.getTitleSpan();\n const tabIndex = this.tabIndex;\n\n // Check for null or undefined\n if (tabIndex != null) {\n titleSpan.setAttribute(\"tabindex\", tabIndex.toString());\n }\n\n titleSpan.setAttribute(\"aria-selected\", \"true\");\n\n if (mustSetFocus) {\n titleSpan.focus();\n }\n }\n\n public deselect(): void {\n this.element.classList.remove(\"jqtree-selected\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.removeAttribute(\"tabindex\");\n titleSpan.setAttribute(\"aria-selected\", \"false\");\n\n titleSpan.blur();\n }\n\n protected getUl(): HTMLUListElement {\n return this.element.querySelector(\":scope > ul\") as HTMLUListElement;\n }\n\n protected getTitleSpan(): HTMLSpanElement {\n return this.element.querySelector(\n \":scope > .jqtree-element > span.jqtree-title\",\n ) as HTMLSpanElement;\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return position === Position.Inside;\n }\n}\n\nexport default NodeElement;\n","import { Position } from \"../position\";\nimport NodeElement, { NodeElementParams } from \"./index\";\nimport { OnFinishOpenNode, TriggerEvent } from \"../jqtreeMethodTypes\";\n\ninterface FolderElementParams extends NodeElementParams {\n closedIconElement?: HTMLElement | Text;\n openedIconElement?: HTMLElement | Text;\n triggerEvent: TriggerEvent;\n}\n\nclass FolderElement extends NodeElement {\n private closedIconElement?: HTMLElement | Text;\n private openedIconElement?: HTMLElement | Text;\n private triggerEvent: TriggerEvent;\n\n constructor({\n closedIconElement,\n getScrollLeft,\n node,\n openedIconElement,\n tabIndex,\n $treeElement,\n triggerEvent,\n }: FolderElementParams) {\n super({\n getScrollLeft,\n node,\n tabIndex,\n $treeElement,\n });\n\n this.closedIconElement = closedIconElement;\n this.openedIconElement = openedIconElement;\n this.triggerEvent = triggerEvent;\n }\n\n public open(\n onFinished: OnFinishOpenNode | undefined,\n slide = true,\n animationSpeed: JQuery.Duration = \"fast\",\n ): void {\n if (this.node.is_open) {\n return;\n }\n\n this.node.is_open = true;\n\n const button = this.getButton();\n button.classList.remove(\"jqtree-closed\");\n button.innerHTML = \"\";\n\n const openedIconElement = this.openedIconElement;\n\n if (openedIconElement) {\n const icon = openedIconElement.cloneNode(true);\n button.appendChild(icon);\n }\n\n const doOpen = (): void => {\n this.element.classList.remove(\"jqtree-closed\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"true\");\n\n if (onFinished) {\n onFinished(this.node);\n }\n\n this.triggerEvent(\"tree.open\", {\n node: this.node,\n });\n };\n\n if (slide) {\n jQuery(this.getUl()).slideDown(animationSpeed, doOpen);\n } else {\n jQuery(this.getUl()).show();\n doOpen();\n }\n }\n\n public close(\n slide = true,\n animationSpeed: JQuery.Duration | undefined = \"fast\",\n ): void {\n if (!this.node.is_open) {\n return;\n }\n\n this.node.is_open = false;\n\n const button = this.getButton();\n button.classList.add(\"jqtree-closed\");\n button.innerHTML = \"\";\n\n const closedIconElement = this.closedIconElement;\n\n if (closedIconElement) {\n const icon = closedIconElement.cloneNode(true);\n button.appendChild(icon);\n }\n\n const doClose = (): void => {\n this.element.classList.add(\"jqtree-closed\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"false\");\n\n this.triggerEvent(\"tree.close\", {\n node: this.node,\n });\n };\n\n if (slide) {\n jQuery(this.getUl()).slideUp(animationSpeed, doClose);\n } else {\n jQuery(this.getUl()).hide();\n doClose();\n }\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return !this.node.is_open && position === Position.Inside;\n }\n\n private getButton(): HTMLLinkElement {\n return this.element.querySelector(\n \":scope > .jqtree-element > a.jqtree-toggler\",\n ) as HTMLLinkElement;\n }\n}\n\nexport default FolderElement;\n","import __version__ from \"./version\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport DataLoader, { HandleFinishedLoading } from \"./dataLoader\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseHandler from \"./mouseHandler\";\nimport { PositionInfo } from \"./mouseUtils\";\nimport SaveStateHandler, { SavedState } from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport SimpleWidget from \"./simple.widget\";\nimport { getOffsetTop, isFunction } from \"./util\";\nimport { Node } from \"./node\";\nimport { getPosition } from \"./position\";\nimport NodeElement from \"./nodeElement\";\nimport FolderElement from \"./nodeElement/folderElement\";\nimport { OnFinishOpenNode } from \"./jqtreeMethodTypes\";\nimport { JQTreeOptions } from \"./jqtreeOptions\";\n\ninterface SelectNodeOptions {\n mustToggle?: boolean;\n mustSetFocus?: boolean;\n}\n\nconst NODE_PARAM_IS_EMPTY = \"Node parameter is empty\";\nconst PARAM_IS_EMPTY = \"Parameter is empty: \";\n\nexport class JqTreeWidget extends SimpleWidget {\n protected static defaults: JQTreeOptions = {\n animationSpeed: \"fast\",\n autoEscape: true,\n autoOpen: false, // true / false / int (open n levels starting at 0)\n buttonLeft: true,\n // The symbol to use for a closed node - â–º BLACK RIGHT-POINTING POINTER\n // http://www.fileformat.info/info/unicode/char/25ba/index.htm\n closedIcon: undefined,\n data: undefined,\n dataFilter: undefined,\n dataUrl: undefined,\n dragAndDrop: false,\n keyboardSupport: true,\n nodeClass: Node,\n onCanMove: undefined, // Can this node be moved?\n onCanMoveTo: undefined, // Can this node be moved to this position? function(moved_node, target_node, position)\n onCanSelectNode: undefined,\n onCreateLi: undefined,\n onDragMove: undefined,\n onDragStop: undefined,\n onGetStateFromStorage: undefined,\n onIsMoveHandle: undefined,\n onLoadFailed: undefined,\n onSetStateFromStorage: undefined,\n openedIcon: \"▼\",\n openFolderDelay: 500, // The delay for opening a folder during drag and drop; the value is in milliseconds\n // The symbol to use for an open node - â–¼ BLACK DOWN-POINTING TRIANGLE\n // http://www.fileformat.info/info/unicode/char/25bc/index.htm\n rtl: undefined, // right-to-left support; true / false (default)\n saveState: false, // true / false / string (cookie name)\n selectable: true,\n showEmptyFolder: false,\n slide: true, // must display slide animation?\n startDndDelay: 300, // The delay for starting dnd (in milliseconds)\n tabIndex: 0,\n useContextMenu: true,\n };\n\n private element: JQuery;\n private isInitialized: boolean;\n private tree: Node;\n\n private dataLoader: DataLoader;\n private dndHandler: DragAndDropHandler;\n private keyHandler: KeyHandler;\n private mouseHandler: MouseHandler;\n private renderer: ElementsRenderer;\n private saveStateHandler: SaveStateHandler;\n private scrollHandler: ScrollHandler;\n private selectNodeHandler: SelectNodeHandler;\n\n public toggle(node: Node, slideParam: null | boolean = null): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.is_open) {\n this.closeNode(node, slide);\n } else {\n this.openNode(node, slide);\n }\n\n return this.element;\n }\n\n public getTree(): Node {\n return this.tree;\n }\n\n public selectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): JQuery {\n this.doSelectNode(node, optionsParam);\n return this.element;\n }\n\n public getSelectedNode(): Node | false {\n return this.selectNodeHandler.getSelectedNode();\n }\n\n public toJson(): string {\n return JSON.stringify(this.tree.getData());\n }\n\n public loadData(data: NodeData[], parentNode: Node | null): JQuery {\n this.doLoadData(data, parentNode);\n return this.element;\n }\n\n /*\n signatures:\n - loadDataFromUrl(url, parent_node=null, on_finished=null)\n loadDataFromUrl('/my_data');\n loadDataFromUrl('/my_data', node1);\n loadDataFromUrl('/my_data', node1, function() { console.log('finished'); });\n loadDataFromUrl('/my_data', null, function() { console.log('finished'); });\n\n - loadDataFromUrl(parent_node=null, on_finished=null)\n loadDataFromUrl();\n loadDataFromUrl(node1);\n loadDataFromUrl(null, function() { console.log('finished'); });\n loadDataFromUrl(node1, function() { console.log('finished'); });\n */\n public loadDataFromUrl(\n param1: string | null | Node,\n param2?: Node | null | HandleFinishedLoading,\n param3?: HandleFinishedLoading,\n ): JQuery {\n if (typeof param1 === \"string\") {\n // first parameter is url\n this.doLoadDataFromUrl(\n param1,\n param2 as Node | null,\n param3 ?? null,\n );\n } else {\n // first parameter is not url\n this.doLoadDataFromUrl(\n null,\n param1,\n param2 as HandleFinishedLoading | null,\n );\n }\n\n return this.element;\n }\n\n public reload(onFinished: HandleFinishedLoading | null): JQuery {\n this.doLoadDataFromUrl(null, null, onFinished);\n return this.element;\n }\n\n public refresh(): JQuery {\n this.refreshElements(null);\n return this.element;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.tree.getNodeById(nodeId);\n }\n\n public getNodeByName(name: string): Node | null {\n return this.tree.getNodeByName(name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n return this.tree.getNodeByNameMustExist(name);\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.tree.getNodesByProperty(key, value);\n }\n\n public getNodeByHtmlElement(\n inputElement: HTMLElement | JQuery,\n ): Node | null {\n const element =\n inputElement instanceof HTMLElement\n ? inputElement\n : inputElement[0];\n\n if (!element) {\n return null;\n }\n\n return this.getNode(element);\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n return this.tree.getNodeByCallback(callback);\n }\n\n public openNode(\n node: Node,\n param1?: boolean | OnFinishOpenNode,\n param2?: OnFinishOpenNode,\n ): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const parseParams = (): [boolean, OnFinishOpenNode | undefined] => {\n let onFinished: OnFinishOpenNode | null;\n let slide: boolean | null;\n\n if (isFunction(param1)) {\n onFinished = param1 as OnFinishOpenNode;\n slide = null;\n } else {\n slide = param1 as boolean;\n onFinished = param2 as OnFinishOpenNode;\n }\n\n if (slide == null) {\n slide = this.options.slide ?? false;\n }\n\n return [slide, onFinished];\n };\n\n const [slide, onFinished] = parseParams();\n\n this.openNodeInternal(node, slide, onFinished);\n return this.element;\n }\n\n public closeNode(node: Node, slideParam?: null | boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.isFolder() || node.isEmptyFolder) {\n this.createFolderElement(node).close(\n slide,\n this.options.animationSpeed,\n );\n\n this.saveState();\n }\n\n return this.element;\n }\n\n public isDragging(): boolean {\n return this.dndHandler.isDragging;\n }\n\n public refreshHitAreas(): JQuery {\n this.dndHandler.refresh();\n return this.element;\n }\n\n public addNodeAfter(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n const newNode = existingNode.addAfter(newNodeInfo);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addNodeBefore(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addBefore(newNodeInfo);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addParentNode(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addParent(newNodeInfo);\n\n if (newNode) {\n this.refreshElements(newNode.parent);\n }\n\n return newNode;\n }\n\n public removeNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!node.parent) {\n throw Error(\"Node has no parent\");\n }\n\n this.selectNodeHandler.removeFromSelection(node, true); // including children\n\n const parent = node.parent;\n node.remove();\n this.refreshElements(parent);\n\n return this.element;\n }\n\n public appendNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam || this.tree;\n\n const node = parentNode.append(newNodeInfo);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n public prependNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam ?? this.tree;\n\n const node = parentNode.prepend(newNodeInfo);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n public updateNode(node: Node, data: NodeData): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\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 as Node[]);\n }\n }\n\n this.refreshElements(node);\n\n return this.element;\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 public moveNode(node: Node, targetNode: Node, position: string): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!targetNode) {\n throw Error(PARAM_IS_EMPTY + \"targetNode\");\n }\n\n const positionIndex = getPosition(position);\n\n if (positionIndex !== undefined) {\n this.tree.moveNode(node, targetNode, positionIndex);\n this.refreshElements(null);\n }\n\n return this.element;\n }\n\n public getStateFromStorage(): SavedState | null {\n return this.saveStateHandler.getStateFromStorage();\n }\n\n public addToSelection(node: Node, mustSetFocus?: boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.addToSelection(node);\n this.openParents(node);\n\n this.getNodeElementForNode(node).select(\n mustSetFocus === undefined ? true : mustSetFocus,\n );\n\n this.saveState();\n\n return this.element;\n }\n\n public getSelectedNodes(): Node[] {\n return this.selectNodeHandler.getSelectedNodes();\n }\n\n public isNodeSelected(node: Node): boolean {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n return this.selectNodeHandler.isNodeSelected(node);\n }\n\n public removeFromSelection(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.removeFromSelection(node);\n\n this.getNodeElementForNode(node).deselect();\n this.saveState();\n\n return this.element;\n }\n\n public scrollToNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const top =\n getOffsetTop(node.element) -\n getOffsetTop(this.$el.get(0) as HTMLElement);\n\n this.scrollHandler.scrollToY(top);\n\n return this.element;\n }\n\n public getState(): SavedState | null {\n return this.saveStateHandler.getState();\n }\n\n public setState(state: SavedState): JQuery {\n this.saveStateHandler.setInitialState(state);\n this.refreshElements(null);\n\n return this.element;\n }\n\n public setOption(option: string, value: unknown): JQuery {\n (this.options as unknown as Record)[option] = value;\n return this.element;\n }\n\n public moveDown(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveDown(selectedNode);\n }\n\n return this.element;\n }\n\n public moveUp(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveUp(selectedNode);\n }\n\n return this.element;\n }\n\n public getVersion(): string {\n return __version__;\n }\n\n private openNodeInternal(\n node: Node,\n slide = true,\n onFinished?: OnFinishOpenNode,\n ): void {\n const doOpenNode = (\n _node: Node,\n _slide: boolean,\n _onFinished?: OnFinishOpenNode,\n ): void => {\n const folderElement = this.createFolderElement(_node);\n folderElement.open(\n _onFinished,\n _slide,\n this.options.animationSpeed,\n );\n };\n\n if (node.isFolder() || node.isEmptyFolder) {\n if (node.load_on_demand) {\n this.loadFolderOnDemand(node, slide, onFinished);\n } else {\n let parent = node.parent;\n\n while (parent) {\n // nb: do not open root element\n if (parent.parent) {\n doOpenNode(parent, false);\n }\n parent = parent.parent;\n }\n\n doOpenNode(node, slide, onFinished);\n this.saveState();\n }\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 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 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 public init(): void {\n super.init();\n\n this.element = this.$el;\n this.isInitialized = false;\n\n this.options.rtl = this.getRtlOption();\n\n if (this.options.closedIcon == null) {\n this.options.closedIcon = this.getDefaultClosedIcon();\n }\n\n this.connectHandlers();\n\n this.initData();\n }\n\n public deinit(): void {\n this.element.empty();\n this.element.off();\n\n this.keyHandler.deinit();\n this.mouseHandler.deinit();\n\n this.tree = new Node({}, true);\n\n super.deinit();\n }\n\n private triggerEvent(\n eventName: string,\n values?: Record,\n ): JQuery.Event {\n const event = jQuery.Event(eventName, values);\n this.element.trigger(event);\n return event;\n }\n\n private mouseCapture(positionInfo: PositionInfo): boolean | null {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseCapture(positionInfo);\n } else {\n return false;\n }\n }\n\n private mouseStart(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseStart(positionInfo);\n } else {\n return false;\n }\n }\n\n private mouseDrag(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n const result = this.dndHandler.mouseDrag(positionInfo);\n\n this.scrollHandler.checkScrolling(positionInfo);\n return result;\n } else {\n return false;\n }\n }\n\n private mouseStop(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n this.scrollHandler.stopScrolling();\n return this.dndHandler.mouseStop(positionInfo);\n } else {\n return false;\n }\n }\n\n private initData(): void {\n if (this.options.data) {\n this.doLoadData(this.options.data, null);\n } else {\n const dataUrl = this.getDataUrlInfo(null);\n\n if (dataUrl) {\n this.doLoadDataFromUrl(null, null, null);\n } else {\n this.doLoadData([], null);\n }\n }\n }\n\n private getDataUrlInfo(node: Node | null): JQuery.AjaxSettings | null {\n const dataUrl =\n this.options.dataUrl || (this.element.data(\"url\") as string | null);\n\n const getUrlFromString = (url: string): JQuery.AjaxSettings => {\n const urlInfo: JQuery.AjaxSettings = { url };\n\n setUrlInfoData(urlInfo);\n\n return urlInfo;\n };\n\n const setUrlInfoData = (urlInfo: JQuery.AjaxSettings): void => {\n if (node?.id) {\n // Load on demand of a subtree; add node parameter\n const data = { node: node.id };\n urlInfo[\"data\"] = data;\n } else {\n // Add selected_node parameter\n const selectedNodeId = this.getNodeIdToBeSelected();\n if (selectedNodeId) {\n const data = { selected_node: selectedNodeId };\n urlInfo[\"data\"] = data;\n }\n }\n };\n\n if (typeof dataUrl === \"function\") {\n return dataUrl(node);\n } else if (typeof dataUrl === \"string\") {\n return getUrlFromString(dataUrl);\n } else if (dataUrl && typeof dataUrl === \"object\") {\n setUrlInfoData(dataUrl);\n return dataUrl;\n } else {\n return null;\n }\n }\n\n private getNodeIdToBeSelected(): NodeId | null {\n if (this.options.saveState) {\n return this.saveStateHandler.getNodeIdToBeSelected();\n } else {\n return null;\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 if (!this.options.nodeClass) {\n return;\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 doInit();\n } else {\n // Load data on demand and then init the tree\n this.setInitialStateOnDemand(doInit);\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 if (!this.options.saveState) {\n return [false, false];\n } else {\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\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 // Call cb_finished when done\n private setInitialStateOnDemand(cbFinished: () => void): void {\n const restoreState = (): boolean => {\n if (!this.options.saveState) {\n return false;\n } else {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (!state) {\n return false;\n } else {\n this.saveStateHandler.setInitialStateOnDemand(\n state,\n cbFinished,\n );\n\n return true;\n }\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 this.openNodeInternal(node, false, () => {\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 this.openNodeInternal(node, false);\n\n return level !== maxLevel;\n }\n });\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n openNodes();\n };\n\n if (!restoreState()) {\n autoOpenNodes();\n }\n }\n\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 } else {\n return 0;\n }\n }\n\n private getNode(element: HTMLElement): null | Node {\n const liElement = element.closest(\"li.jqtree_common\");\n\n if (liElement) {\n return jQuery(liElement).data(\"node\") as Node;\n } else {\n return null;\n }\n }\n\n private saveState(): void {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n }\n\n private selectCurrentNode(mustSetFocus: boolean): void {\n const node = this.getSelectedNode();\n if (node) {\n const nodeElement = this.getNodeElementForNode(node);\n if (nodeElement) {\n nodeElement.select(mustSetFocus);\n }\n }\n }\n\n private deselectCurrentNode(): void {\n const node = this.getSelectedNode();\n if (node) {\n this.removeFromSelection(node);\n }\n }\n\n private getDefaultClosedIcon(): string {\n if (this.options.rtl) {\n // triangle to the left\n return \"◀\";\n } else {\n // triangle to the right\n return \"►\";\n }\n }\n\n private getRtlOption(): boolean {\n if (this.options.rtl != null) {\n return this.options.rtl;\n } else {\n const dataRtl = this.element.data(\"rtl\") as unknown;\n\n if (\n dataRtl !== null &&\n dataRtl !== false &&\n dataRtl !== undefined\n ) {\n return true;\n } else {\n return false;\n }\n }\n }\n\n private doSelectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): void {\n const saveState = (): void => {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n };\n\n if (!node) {\n // Called with empty node -> deselect current node\n this.deselectCurrentNode();\n saveState();\n return;\n }\n const defaultOptions = { mustSetFocus: true, mustToggle: true };\n const selectOptions = { ...defaultOptions, ...(optionsParam || {}) };\n\n const canSelect = (): boolean => {\n if (this.options.onCanSelectNode) {\n return (\n this.options.selectable === true &&\n this.options.onCanSelectNode(node)\n );\n } else {\n return this.options.selectable === true;\n }\n };\n\n if (!canSelect()) {\n return;\n }\n\n if (this.selectNodeHandler.isNodeSelected(node)) {\n if (selectOptions.mustToggle) {\n this.deselectCurrentNode();\n this.triggerEvent(\"tree.select\", {\n node: null,\n previous_node: node,\n });\n }\n } else {\n const deselectedNode = this.getSelectedNode() || null;\n this.deselectCurrentNode();\n this.addToSelection(node, selectOptions.mustSetFocus);\n\n this.triggerEvent(\"tree.select\", {\n node,\n deselected_node: deselectedNode,\n });\n this.openParents(node);\n }\n\n saveState();\n }\n\n private doLoadData(data: NodeData[] | null, parentNode: Node | null): 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.load_data\", {\n tree_data: data,\n parent_node: parentNode,\n });\n }\n\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 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 doLoadDataFromUrl(\n urlInfoParam: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null,\n ): void {\n const urlInfo = urlInfoParam || this.getDataUrlInfo(parentNode);\n\n this.dataLoader.loadFromUrl(urlInfo, parentNode, onFinished);\n }\n\n private loadFolderOnDemand(\n node: Node,\n slide = true,\n onFinished?: OnFinishOpenNode,\n ): void {\n node.is_loading = true;\n\n this.doLoadDataFromUrl(null, node, () => {\n this.openNodeInternal(node, slide, onFinished);\n });\n }\n\n private containsElement(element: HTMLElement): boolean {\n const node = this.getNode(element);\n\n return node != null && node.tree === this.tree;\n }\n\n private isFocusOnTree(): boolean {\n const activeElement = document.activeElement;\n\n return Boolean(\n activeElement &&\n activeElement.tagName === \"SPAN\" &&\n this.containsElement(activeElement as HTMLElement),\n );\n }\n\n private connectHandlers() {\n const {\n autoEscape,\n buttonLeft,\n closedIcon,\n dataFilter,\n dragAndDrop,\n keyboardSupport,\n onCanMove,\n onCreateLi,\n onDragMove,\n onDragStop,\n onGetStateFromStorage,\n onIsMoveHandle,\n onLoadFailed,\n onSetStateFromStorage,\n openedIcon,\n openFolderDelay,\n rtl,\n saveState,\n showEmptyFolder,\n slide,\n tabIndex,\n } = this.options;\n\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.openNodeInternal.bind(this);\n const refreshElements = this.refreshElements.bind(this);\n const refreshHitAreas = this.refreshHitAreas.bind(this);\n const selectNode = this.selectNode.bind(this);\n const $treeElement = this.element;\n const treeElement = this.element.get(0) as HTMLElement;\n const triggerEvent = this.triggerEvent.bind(this);\n\n const selectNodeHandler = new SelectNodeHandler({\n getNodeById,\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 getMouseDelay = () => this.options.startDndDelay ?? 0;\n\n const dataLoader = new DataLoader({\n dataFilter,\n loadData,\n onLoadFailed,\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,\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 getNodeElement,\n getNodeElementForNode,\n getScrollLeft,\n getTree,\n onCanMove,\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 closedIcon,\n dragAndDrop,\n $element: $treeElement,\n getTree,\n isNodeSelected,\n onCreateLi,\n openedIcon,\n rtl,\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 element: treeElement,\n getMouseDelay,\n getNode,\n onClickButton: this.toggle.bind(this),\n onClickTitle: this.doSelectNode.bind(this),\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\n private createFolderElement(node: Node) {\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.element;\n const triggerEvent = this.triggerEvent.bind(this);\n\n return new FolderElement({\n closedIconElement,\n getScrollLeft,\n node,\n openedIconElement,\n tabIndex,\n $treeElement,\n triggerEvent,\n });\n }\n\n private createNodeElement(node: Node) {\n const getScrollLeft = this.scrollHandler.getScrollLeft.bind(\n this.scrollHandler,\n );\n const tabIndex = this.options.tabIndex;\n const $treeElement = this.element;\n\n return new NodeElement({\n getScrollLeft,\n node,\n tabIndex,\n $treeElement,\n });\n }\n\n private openParents(node: Node) {\n const parent = node.parent;\n\n if (parent && parent.parent && !parent.is_open) {\n this.openNode(parent, false);\n }\n }\n}\n\nSimpleWidget.register(JqTreeWidget, \"tree\");\n"],"names":["version","Position","positionNames","before","Before","after","After","inside","Inside","none","None","getPositionName","position","name","Object","prototype","hasOwnProperty","call","getPosition","DragElement","constructor","_ref","autoEscape","nodeName","offsetX","offsetY","treeElement","element","createElement","appendChild","move","pageX","pageY","style","left","top","remove","document","classList","add","textContent","innerHTML","isInt","n","isFunction","v","getBoolString","value","getOffsetTop","getElementPosition","rect","getBoundingClientRect","x","window","scrollX","y","scrollY","iterateVisibleNodes","tree","handleAfterOpenFolder","handleClosedFolder","handleFirstNode","handleNode","handleOpenFolder","isFirstNode","iterate","node","nextNode","mustIterateInside","is_open","hasChildren","offsetParent","childrenLength","children","length","forEach","_","i","child","nextChild","generatePositions","currentNode","positions","lastTop","addPosition","area","bottom","push","generateHitAreasForGroup","hitAreas","positionsInGroup","positionCount","Math","min","areaHeight","round","areaTop","generateHitAreasFromPositions","treeBottom","previousTop","group","generateHitAreas","DragAndDropHandler","getNodeElement","getNodeElementForNode","getScrollLeft","getTree","onCanMove","onCanMoveTo","onDragMove","onDragStop","onIsMoveHandle","openNode","refreshElements","slide","triggerEvent","hoveredArea","isDragging","currentItem","mouseCapture","positionInfo","target","mustCaptureElement","jQuery","nodeElement","mouseStart","refresh","dragElement","mouseDrag","findHoveredArea","canMoveToArea","isFolder","stopOpenFolderTimer","mustOpenFolderTimer","startOpenFolderTimer","updateDropHint","removeDropHint","originalEvent","mouseStop","moveItem","clear","removeHover","removeHitAreas","getTreeDimensions","positionName","previousGhost","dimensions","right","low","high","mid","addDropHint","folder","openFolder","openFolderDelay","openFolderTimer","setTimeout","clearTimeout","movedNode","targetNode","previousParent","parent","doMove","moveNode","event","move_info","moved_node","target_node","previous_parent","do_move","original_event","isDefaultPrevented","treePosition","clientWidth","clientHeight","ElementsRenderer","buttonLeft","closedIcon","onCreateLi","dragAndDrop","$element","isNodeSelected","openedIcon","rtl","showEmptyFolder","tabIndex","openedIconElement","createButtonElement","closedIconElement","render","fromNode","renderFromNode","renderFromRoot","empty","createDomElements","$previousLi","li","createLi","getLevel","attachNodeData","isRootNode","level","ul","createUl","data","classString","role","className","setAttribute","isSelected","Boolean","mustShowFolder","isEmptyFolder","createFolderLi","createNodeLi","setTreeItemAriaAttributes","buttonClasses","getButtonClasses","folderClasses","getFolderClasses","iconElement","div","buttonLink","cloneNode","titleSpan","createTitleSpan","liClasses","join","classes","undefined","is_loading","createTextNode","nodeType","DataLoader","dataFilter","loadData","onLoadFailed","loadFromUrl","urlInfo","parentNode","onFinished","getDomElement","addLoadingClass","notifyLoading","stopLoading","removeLoadingClass","handleSuccess","parseData","handleError","jqXHR","submitRequest","isLoading","urlInfoInput","url","ajaxSettings","method","cache","dataType","success","error","toUpperCase","ajax","getParsedData","JSON","parse","parsedData","KeyHandler","closeNode","getSelectedNode","isFocusOnTree","keyboardSupport","selectNode","originalSelectNode","handleKeyDownHandler","handleKeyDown","bind","addEventListener","deinit","removeEventListener","moveDown","selectedNode","getNextVisibleNode","moveUp","getPreviousVisibleNode","moveRight","moveLeft","getParent","e","canHandleKeyboard","key","getPositionInfoFromMouseEvent","getPositionInfoFromTouch","touch","MouseHandler","getMouseDelay","getNode","onClickButton","onClickTitle","onMouseCapture","onMouseDrag","onMouseStart","onMouseStop","useContextMenu","handleClick","handleDblclick","mouseDown","passive","touchStart","handleContextmenu","isMouseStarted","mouseDelayTimer","isMouseDelayMet","mouseDownInfo","removeMouseMoveEventListeners","button","result","handleMouseDown","cancelable","preventDefault","handleMouseUp","handleStartMouse","mouseMove","touchMove","mouseUp","touchEnd","mouseDelay","startMouseDelayTimer","handleMouseMove","touches","clickTarget","getClickTarget","type","stopPropagation","click_event","closest","jqTreeElement","SaveStateHandler","addToSelection","getNodeById","getSelectedNodes","onGetStateFromStorage","onSetStateFromStorage","removeFromSelection","saveState","saveStateOption","state","stringify","getState","supportsLocalStorage","localStorage","setItem","getKeyName","getStateFromStorage","jsonData","loadFromStorage","parseState","getOpenNodeIds","openNodes","id","getSelectedNodeIds","selectedNodeIds","open_nodes","selected_node","setInitialState","mustLoadOnDemand","openInitialNodes","resetSelection","selectInitialNodes","setInitialStateOnDemand","cbFinished","doSetInitialStateOnDemand","getNodeIdToBeSelected","getItem","nodeIds","nodeId","load_on_demand","selectCount","selectedNodes","nodeIdsParam","loadingCount","newNodesIds","loadAndOpenNode","testSupport","sessionStorage","removeItem","_supportsLocalStorage","ContainerScrollParent","container","refreshHitAreas","checkHorizontalScrolling","newHorizontalScrollDirection","getNewHorizontalScrollDirection","horizontalScrollDirection","horizontalScrollTimeout","verticalScrollTimeout","scrollHorizontally","checkVerticalScrolling","newVerticalScrollDirection","getNewVerticalScrollDirection","verticalScrollDirection","scrollVertically","scrollLeft","scrollToY","scrollTop","stopScrolling","scrollParentTop","scrollParentBottom","scrollParentOffset","rightEdge","leftEdge","isNearRightEdge","isNearLeftEdge","getScrollParentTop","getScrollParentBottom","distance","scrollBy","behavior","DocumentScrollParent","documentElement","treeTop","documentScrollHeight","documentScrollWidth","windowWidth","innerWidth","canScrollRight","getDocumentScrollWidth","canScrollDown","getDocumentScrollHeight","scrollHeight","scrollWidth","distanceTop","windowHeight","innerHeight","isOverflow","overflowValue","hasOverFlow","getComputedStyle","overflowX","overflowY","getParentWithOverflow","parentElement","createScrollParent","tagName","ScrollHandler","scrollParent","checkScrolling","getScrollParent","SelectNodeHandler","Set","selectedSingleNode","getSelectedNodesUnder","isParentOf","has","includeChildren","arguments","delete","register","widgetClass","widgetName","getDataKey","getWidgetData","el","dataKey","widget","SimpleWidget","createWidget","$el","options","get","existingWidget","simpleWidgetClass","init","destroyWidget","destroy","removeData","callFunction","functionName","args","simpleWidget","widgetFunction","apply","fn","argument1","_len","Array","_key","defaults","isNodeRecordWithChildren","Node","nodeData","isRoot","nodeClass","setData","idMapping","Map","o","loadFromData","removeChildren","childData","createNode","addChild","setParent","addChildAtPosition","index","splice","removeChild","doRemoveChild","getChildIndex","indexOf","callback","_iterate","getData","includeParent","getDataFromNodes","nodes","map","tmpNode","k","getNodeByName","getNodeByCallback","getNodeByNameMustExist","addAfter","nodeInfo","childIndex","loadChildrenFromData","addBefore","addParent","newParent","originalParent","append","prepend","addNodeToIndex","set","removeNodeFromIndex","getPreviousSibling","previousIndex","getNextSibling","nextIndex","getNodesByProperty","filter","f","getNextNode","nextSibling","getPreviousNode","previousSibling","getLastChild","lastChild","initFromData","addNode","addChildren","childrenData","getNodeClass","BorderDropHint","querySelector","hint","width","max","offsetWidth","height","GhostDropHint","ghost","createGhostElement","moveAfter","moveBefore","moveInsideOpenFolder","moveInside","childElement","circleSpan","lineSpan","NodeElement","$treeElement","mustShowBorderDropHint","select","mustSetFocus","getTitleSpan","toString","focus","deselect","removeAttribute","blur","getUl","FolderElement","open","animationSpeed","getButton","icon","doOpen","slideDown","show","close","doClose","slideUp","hide","NODE_PARAM_IS_EMPTY","PARAM_IS_EMPTY","JqTreeWidget","autoOpen","dataUrl","onCanSelectNode","selectable","startDndDelay","toggle","slideParam","Error","optionsParam","doSelectNode","selectNodeHandler","toJson","doLoadData","loadDataFromUrl","param1","param2","param3","doLoadDataFromUrl","reload","getNodeByHtmlElement","inputElement","HTMLElement","parseParams","openNodeInternal","createFolderElement","dndHandler","addNodeAfter","newNodeInfo","existingNode","newNode","addNodeBefore","addParentNode","removeNode","appendNode","parentNodeParam","prependNode","updateNode","idIsChanged","isSelectedNodeInSubtree","subtree","positionIndex","saveStateHandler","openParents","scrollToNode","scrollHandler","setState","setOption","option","keyHandler","getVersion","__version__","doOpenNode","_node","_slide","_onFinished","folderElement","loadFolderOnDemand","mustSelect","renderer","selectCurrentNode","createNodeElement","isInitialized","getRtlOption","getDefaultClosedIcon","connectHandlers","initData","off","mouseHandler","eventName","values","Event","trigger","getDataUrlInfo","getUrlFromString","setUrlInfoData","selectedNodeId","initTree","doInit","restoreState","autoOpenNodes","maxLevel","getAutoOpenMaxLevel","isRestored","parseInt","liElement","deselectCurrentNode","dataRtl","defaultOptions","mustToggle","selectOptions","canSelect","previous_node","deselectedNode","deselected_node","deselectNodes","loadSubtree","tree_data","parent_node","selectedNodesUnderParent","urlInfoParam","dataLoader","containsElement","activeElement"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tree.jquery.debug.js","sources":["src/version.ts","src/position.ts","src/dragAndDropHandler/dragElement.ts","src/util.ts","src/dragAndDropHandler/iterateVisibleNodes.ts","src/dragAndDropHandler/generateHitAreas.ts","src/dragAndDropHandler/index.ts","src/elementsRenderer.ts","src/dataLoader.ts","src/keyHandler.ts","src/mouseUtils.ts","src/mouseHandler.ts","src/saveStateHandler.ts","src/scrollHandler/containerScrollParent.ts","src/scrollHandler/documentScrollParent.ts","src/scrollHandler/createScrollParent.ts","src/scrollHandler.ts","src/selectNodeHandler.ts","src/simple.widget.ts","src/nodeUtils.ts","src/node.ts","src/nodeElement/borderDropHint.ts","src/nodeElement/ghostDropHint.ts","src/nodeElement/index.ts","src/nodeElement/folderElement.ts","src/tree.jquery.ts"],"sourcesContent":["const version = \"1.8.0\";\n\nexport default version;\n","export enum Position {\n Before = 1,\n After,\n Inside,\n None,\n}\n\nconst positionNames: Record = {\n before: Position.Before,\n after: Position.After,\n inside: Position.Inside,\n none: Position.None,\n};\n\nexport const getPositionName = (position: Position): string => {\n for (const name in positionNames) {\n if (Object.prototype.hasOwnProperty.call(positionNames, name)) {\n if (positionNames[name] === position) {\n return name;\n }\n }\n }\n\n return \"\";\n};\n\nexport const getPosition = (name: string): Position | undefined =>\n positionNames[name];\n","interface DragElementParams {\n autoEscape: boolean;\n nodeName: string;\n offsetX: number;\n offsetY: number;\n treeElement: HTMLElement;\n}\n\nclass DragElement {\n private offsetX: number;\n private offsetY: number;\n private element: HTMLElement;\n\n constructor({\n autoEscape,\n nodeName,\n offsetX,\n offsetY,\n treeElement,\n }: DragElementParams) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n this.element = this.createElement(nodeName, autoEscape);\n\n treeElement.appendChild(this.element);\n }\n\n public move(pageX: number, pageY: number): void {\n this.element.style.left = `${pageX - this.offsetX}px`;\n this.element.style.top = `${pageY - this.offsetY}px`;\n }\n\n public remove(): void {\n this.element.remove();\n }\n\n private createElement(nodeName: string, autoEscape: boolean) {\n const element = document.createElement(\"span\");\n element.classList.add(\"jqtree-title\", \"jqtree-dragging\");\n\n if (autoEscape) {\n element.textContent = nodeName;\n } else {\n element.innerHTML = nodeName;\n }\n\n element.style.position = \"absolute\";\n\n return element;\n }\n}\n\nexport default DragElement;\n","export const isInt = (n: unknown): boolean =>\n typeof n === \"number\" && n % 1 === 0;\n\nexport const isFunction = (v: unknown): boolean => typeof v === \"function\";\n\nexport const getBoolString = (value: unknown): string =>\n value ? \"true\" : \"false\";\n\nexport const getOffsetTop = (element: HTMLElement) =>\n getElementPosition(element).top;\n\nexport const getElementPosition = (element: HTMLElement) => {\n const rect = element.getBoundingClientRect();\n\n return {\n left: rect.x + window.scrollX,\n top: rect.y + window.scrollY,\n };\n};\n","import { Node } from \"../node\";\n\ninterface Options {\n handleAfterOpenFolder: (node: Node, nextNode: Node | null) => void;\n handleClosedFolder: (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => void;\n handleFirstNode: (node: Node) => void;\n handleNode: (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => void;\n\n /*\n override\n return\n - true: continue iterating\n - false: stop iterating\n */\n handleOpenFolder: (node: Node, element: HTMLElement) => boolean;\n}\n\nconst iterateVisibleNodes = (\n tree: Node,\n {\n handleAfterOpenFolder,\n handleClosedFolder,\n handleFirstNode,\n handleNode,\n handleOpenFolder,\n }: Options,\n) => {\n let isFirstNode = true;\n\n const iterate = (node: Node, nextNode: Node | null): void => {\n let mustIterateInside =\n (node.is_open || !node.element) && node.hasChildren();\n\n let element: HTMLElement | null = null;\n\n // Is the element visible?\n if (node.element?.offsetParent) {\n element = node.element;\n\n if (isFirstNode) {\n handleFirstNode(node);\n isFirstNode = false;\n }\n\n if (!node.hasChildren()) {\n handleNode(node, nextNode, node.element);\n } else if (node.is_open) {\n if (!handleOpenFolder(node, node.element)) {\n mustIterateInside = false;\n }\n } else {\n handleClosedFolder(node, nextNode, element);\n }\n }\n\n if (mustIterateInside) {\n const childrenLength = node.children.length;\n node.children.forEach((_, i) => {\n const child = node.children[i];\n\n if (child) {\n if (i === childrenLength - 1) {\n iterate(child, null);\n } else {\n const nextChild = node.children[i + 1];\n\n if (nextChild) {\n iterate(child, nextChild);\n }\n }\n }\n });\n\n if (node.is_open && element) {\n handleAfterOpenFolder(node, nextNode);\n }\n }\n };\n\n iterate(tree, null);\n};\n\nexport default iterateVisibleNodes;\n","import { HitArea } from \"./types\";\nimport { Node } from \"../node\";\nimport { Position } from \"../position\";\nimport { getOffsetTop } from \"../util\";\nimport iterateVisibleNodes from \"./iterateVisibleNodes\";\n\nconst generatePositions = (tree: Node, currentNode: Node): HitArea[] => {\n const positions: HitArea[] = [];\n let lastTop = 0;\n\n const addPosition = (node: Node, position: number, top: number) => {\n const area = {\n top,\n bottom: 0,\n node,\n position,\n };\n\n positions.push(area);\n lastTop = top;\n };\n\n const handleAfterOpenFolder = (node: Node, nextNode: Node | null) => {\n if (node === currentNode || nextNode === currentNode) {\n // Cannot move before or after current item\n addPosition(node, Position.None, lastTop);\n } else {\n addPosition(node, Position.After, lastTop);\n }\n };\n\n const handleClosedFolder = (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => {\n const top = getOffsetTop(element);\n\n if (node === currentNode) {\n // Cannot move after current item\n addPosition(node, Position.None, top);\n } else {\n addPosition(node, Position.Inside, top);\n\n // Cannot move before current item\n if (nextNode !== currentNode) {\n addPosition(node, Position.After, top);\n }\n }\n };\n\n const handleFirstNode = (node: Node) => {\n if (node !== currentNode) {\n addPosition(node, Position.Before, getOffsetTop(node.element));\n }\n };\n\n const handleNode = (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => {\n const top = getOffsetTop(element);\n\n if (node === currentNode) {\n // Cannot move inside current item\n addPosition(node, Position.None, top);\n } else {\n addPosition(node, Position.Inside, top);\n }\n\n if (nextNode === currentNode || node === currentNode) {\n // Cannot move before or after current item\n addPosition(node, Position.None, top);\n } else {\n addPosition(node, Position.After, top);\n }\n };\n\n const handleOpenFolder = (node: Node, element: HTMLElement) => {\n if (node === currentNode) {\n // Cannot move inside current item\n // Stop iterating\n return false;\n }\n\n // Cannot move before current item\n if (node.children[0] !== currentNode) {\n addPosition(node, Position.Inside, getOffsetTop(element));\n }\n\n // Continue iterating\n return true;\n };\n\n iterateVisibleNodes(tree, {\n handleAfterOpenFolder,\n handleClosedFolder,\n handleFirstNode,\n handleNode,\n handleOpenFolder,\n });\n\n return positions;\n};\n\nconst generateHitAreasForGroup = (\n hitAreas: HitArea[],\n positionsInGroup: HitArea[],\n top: number,\n bottom: number,\n) => {\n // limit positions in group\n const positionCount = Math.min(positionsInGroup.length, 4);\n\n const areaHeight = Math.round((bottom - top) / positionCount);\n let areaTop = top;\n\n let i = 0;\n while (i < positionCount) {\n const position = positionsInGroup[i];\n\n if (position) {\n hitAreas.push({\n top: areaTop,\n bottom: areaTop + areaHeight,\n node: position.node,\n position: position.position,\n });\n }\n\n areaTop += areaHeight;\n i += 1;\n }\n};\n\nconst generateHitAreasFromPositions = (\n positions: HitArea[],\n treeBottom: number,\n): HitArea[] => {\n let previousTop = positions[0]?.top ?? 0;\n let group = [];\n const hitAreas: HitArea[] = [];\n\n for (const position of positions) {\n if (position.top !== previousTop && group.length) {\n generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n position.top,\n );\n\n previousTop = position.top;\n group = [];\n }\n\n group.push(position);\n }\n\n generateHitAreasForGroup(hitAreas, group, previousTop, treeBottom);\n\n return hitAreas;\n};\n\nconst generateHitAreas = (\n tree: Node,\n currentNode: Node,\n treeBottom: number,\n) => {\n const positions = generatePositions(tree, currentNode);\n\n return generateHitAreasFromPositions(positions, treeBottom);\n};\n\nexport default generateHitAreas;\n","import { Node } from \"../node\";\nimport { getPositionName, Position } from \"../position\";\nimport { DropHint, HitArea } from \"./types\";\nimport { PositionInfo } from \"../mouseUtils\";\nimport NodeElement from \"../nodeElement\";\nimport DragElement from \"./dragElement\";\nimport generateHitAreas from \"./generateHitAreas\";\nimport { getElementPosition } from \"../util\";\nimport {\n OnCanMove,\n OnCanMoveTo,\n OnIsMoveHandle,\n DragMethod,\n} from \"../jqtreeOptions\";\nimport {\n GetScrollLeft,\n GetTree,\n OpenNode,\n RefreshElements,\n TriggerEvent,\n} from \"../jqtreeMethodTypes\";\n\ninterface Dimensions {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\ntype GetNodeElement = (element: HTMLElement) => NodeElement | null;\ntype GetNodeElementForNode = (node: Node) => NodeElement;\n\ninterface DragAndDropHandlerParams {\n autoEscape?: boolean;\n getNodeElement: GetNodeElement;\n getNodeElementForNode: GetNodeElementForNode;\n getScrollLeft: GetScrollLeft;\n getTree: GetTree;\n onCanMove?: OnCanMove;\n onCanMoveTo?: OnCanMoveTo;\n onDragMove?: DragMethod;\n onDragStop?: DragMethod;\n onIsMoveHandle?: OnIsMoveHandle;\n openFolderDelay: number | false;\n openNode: OpenNode;\n refreshElements: RefreshElements;\n slide: boolean;\n treeElement: HTMLElement;\n triggerEvent: TriggerEvent;\n}\n\nexport class DragAndDropHandler {\n public hitAreas: HitArea[];\n public isDragging: boolean;\n public currentItem: NodeElement | null;\n public hoveredArea: HitArea | null;\n\n private autoEscape?: boolean;\n private dragElement: DragElement | null;\n private getNodeElement: GetNodeElement;\n private getNodeElementForNode: GetNodeElementForNode;\n private getScrollLeft: GetScrollLeft;\n private getTree: GetTree;\n private onCanMove?: OnCanMove;\n private onCanMoveTo?: OnCanMoveTo;\n private onDragMove?: DragMethod;\n private onDragStop?: DragMethod;\n private onIsMoveHandle?: OnIsMoveHandle;\n private openFolderDelay: number | false;\n private openFolderTimer: number | null;\n private openNode: OpenNode;\n private previousGhost: DropHint | null;\n private refreshElements: RefreshElements;\n private slide: boolean;\n private treeElement: HTMLElement;\n private triggerEvent: TriggerEvent;\n\n constructor({\n autoEscape,\n getNodeElement,\n getNodeElementForNode,\n getScrollLeft,\n getTree,\n onCanMove,\n onCanMoveTo,\n onDragMove,\n onDragStop,\n onIsMoveHandle,\n openNode,\n refreshElements,\n slide,\n treeElement,\n triggerEvent,\n }: DragAndDropHandlerParams) {\n this.autoEscape = autoEscape;\n this.getNodeElement = getNodeElement;\n this.getNodeElementForNode = getNodeElementForNode;\n this.getScrollLeft = getScrollLeft;\n this.getTree = getTree;\n this.onCanMove = onCanMove;\n this.onCanMoveTo = onCanMoveTo;\n this.onDragMove = onDragMove;\n this.onDragStop = onDragStop;\n this.onIsMoveHandle = onIsMoveHandle;\n this.openNode = openNode;\n this.refreshElements = refreshElements;\n this.slide = slide;\n this.treeElement = treeElement;\n this.triggerEvent = triggerEvent;\n\n this.hoveredArea = null;\n this.hitAreas = [];\n this.isDragging = false;\n this.currentItem = null;\n }\n\n public mouseCapture(positionInfo: PositionInfo): boolean | null {\n const element = positionInfo.target;\n\n if (!this.mustCaptureElement(element)) {\n return null;\n }\n\n if (this.onIsMoveHandle && !this.onIsMoveHandle(jQuery(element))) {\n return null;\n }\n\n let nodeElement = this.getNodeElement(element);\n\n if (nodeElement && this.onCanMove) {\n if (!this.onCanMove(nodeElement.node)) {\n nodeElement = null;\n }\n }\n\n this.currentItem = nodeElement;\n return this.currentItem != null;\n }\n\n public mouseStart(positionInfo: PositionInfo): boolean {\n if (!this.currentItem) {\n return false;\n }\n\n this.refresh();\n\n const { left, top } = getElementPosition(positionInfo.target);\n\n const node = this.currentItem.node;\n\n this.dragElement = new DragElement({\n autoEscape: this.autoEscape ?? true,\n nodeName: node.name,\n offsetX: positionInfo.pageX - left,\n offsetY: positionInfo.pageY - top,\n treeElement: this.treeElement,\n });\n\n this.isDragging = true;\n this.currentItem.element.classList.add(\"jqtree-moving\");\n\n return true;\n }\n\n public mouseDrag(positionInfo: PositionInfo): boolean {\n if (!this.currentItem || !this.dragElement) {\n return false;\n }\n\n this.dragElement.move(positionInfo.pageX, positionInfo.pageY);\n\n const area = this.findHoveredArea(\n positionInfo.pageX,\n positionInfo.pageY,\n );\n\n if (area && this.canMoveToArea(area)) {\n if (!area.node.isFolder()) {\n this.stopOpenFolderTimer();\n }\n\n if (this.hoveredArea !== area) {\n this.hoveredArea = area;\n\n // If this is a closed folder, start timer to open it\n if (this.mustOpenFolderTimer(area)) {\n this.startOpenFolderTimer(area.node);\n } else {\n this.stopOpenFolderTimer();\n }\n\n this.updateDropHint();\n }\n } else {\n this.removeDropHint();\n this.stopOpenFolderTimer();\n this.hoveredArea = area;\n }\n\n if (!area) {\n if (this.onDragMove) {\n this.onDragMove(\n this.currentItem.node,\n positionInfo.originalEvent,\n );\n }\n }\n\n return true;\n }\n\n public mouseStop(positionInfo: PositionInfo): boolean {\n this.moveItem(positionInfo);\n this.clear();\n this.removeHover();\n this.removeDropHint();\n this.removeHitAreas();\n\n const currentItem = this.currentItem;\n\n if (this.currentItem) {\n this.currentItem.element.classList.remove(\"jqtree-moving\");\n this.currentItem = null;\n }\n\n this.isDragging = false;\n\n if (!this.hoveredArea && currentItem) {\n if (this.onDragStop) {\n this.onDragStop(currentItem.node, positionInfo.originalEvent);\n }\n }\n\n return false;\n }\n\n public refresh(): void {\n this.removeHitAreas();\n\n if (this.currentItem) {\n this.generateHitAreas();\n\n this.currentItem = this.getNodeElementForNode(\n this.currentItem.node,\n );\n\n if (this.isDragging) {\n this.currentItem.element.classList.add(\"jqtree-moving\");\n }\n }\n }\n\n private generateHitAreas(): void {\n const tree = this.getTree();\n\n if (!this.currentItem || !tree) {\n this.hitAreas = [];\n } else {\n this.hitAreas = generateHitAreas(\n tree,\n this.currentItem.node,\n this.getTreeDimensions().bottom,\n );\n }\n }\n\n private mustCaptureElement(element: HTMLElement): boolean {\n const nodeName = element.nodeName;\n\n return (\n nodeName !== \"INPUT\" &&\n nodeName !== \"SELECT\" &&\n nodeName !== \"TEXTAREA\"\n );\n }\n\n private canMoveToArea(area: HitArea): boolean {\n if (!this.onCanMoveTo) {\n return true;\n }\n\n if (!this.currentItem) {\n return false;\n }\n\n const positionName = getPositionName(area.position);\n\n return this.onCanMoveTo(this.currentItem.node, area.node, positionName);\n }\n\n private removeHitAreas(): void {\n this.hitAreas = [];\n }\n\n private clear(): void {\n if (this.dragElement) {\n this.dragElement.remove();\n this.dragElement = null;\n }\n }\n\n private removeDropHint(): void {\n if (this.previousGhost) {\n this.previousGhost.remove();\n }\n }\n\n private removeHover(): void {\n this.hoveredArea = null;\n }\n\n private findHoveredArea(x: number, y: number): HitArea | null {\n const dimensions = this.getTreeDimensions();\n\n if (\n x < dimensions.left ||\n y < dimensions.top ||\n x > dimensions.right ||\n y > dimensions.bottom\n ) {\n return null;\n }\n\n let low = 0;\n let high = this.hitAreas.length;\n while (low < high) {\n const mid = (low + high) >> 1;\n const area = this.hitAreas[mid];\n\n if (!area) {\n return null;\n }\n\n if (y < area.top) {\n high = mid;\n } else if (y > area.bottom) {\n low = mid + 1;\n } else {\n return area;\n }\n }\n\n return null;\n }\n\n private mustOpenFolderTimer(area: HitArea): boolean {\n const node = area.node;\n\n return (\n node.isFolder() &&\n !node.is_open &&\n area.position === Position.Inside\n );\n }\n\n private updateDropHint(): void {\n if (!this.hoveredArea) {\n return;\n }\n\n // remove previous drop hint\n this.removeDropHint();\n\n // add new drop hint\n const nodeElement = this.getNodeElementForNode(this.hoveredArea.node);\n this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);\n }\n\n private startOpenFolderTimer(folder: Node): void {\n const openFolder = (): void => {\n this.openNode(folder, this.slide, () => {\n this.refresh();\n this.updateDropHint();\n });\n };\n\n this.stopOpenFolderTimer();\n\n const openFolderDelay = this.openFolderDelay;\n\n if (openFolderDelay !== false) {\n this.openFolderTimer = window.setTimeout(\n openFolder,\n openFolderDelay,\n );\n }\n }\n\n private stopOpenFolderTimer(): void {\n if (this.openFolderTimer) {\n clearTimeout(this.openFolderTimer);\n this.openFolderTimer = null;\n }\n }\n\n private moveItem(positionInfo: PositionInfo): void {\n if (\n this.currentItem &&\n this.hoveredArea &&\n this.hoveredArea.position !== Position.None &&\n this.canMoveToArea(this.hoveredArea)\n ) {\n const movedNode = this.currentItem.node;\n const targetNode = this.hoveredArea.node;\n const position = this.hoveredArea.position;\n const previousParent = movedNode.parent;\n\n if (position === Position.Inside) {\n this.hoveredArea.node.is_open = true;\n }\n\n const doMove = (): void => {\n const tree = this.getTree();\n\n if (tree) {\n tree.moveNode(movedNode, targetNode, position);\n\n this.treeElement.textContent = \"\";\n this.refreshElements(null);\n }\n };\n\n const event = this.triggerEvent(\"tree.move\", {\n move_info: {\n moved_node: movedNode,\n target_node: targetNode,\n position: getPositionName(position),\n previous_parent: previousParent,\n do_move: doMove,\n original_event: positionInfo.originalEvent,\n },\n });\n\n if (!event.isDefaultPrevented()) {\n doMove();\n }\n }\n }\n\n private getTreeDimensions(): Dimensions {\n // Return the dimensions of the tree. Add a margin to the bottom to allow\n // to drag-and-drop after the last element.\n const treePosition = getElementPosition(this.treeElement);\n const left = treePosition.left + this.getScrollLeft();\n const top = treePosition.top;\n\n return {\n left,\n top,\n right: left + this.treeElement.clientWidth,\n bottom: top + this.treeElement.clientHeight + 16,\n };\n }\n}\n","import { getBoolString } from \"./util\";\nimport { Node } from \"./node\";\nimport { IconElement, OnCreateLi } from \"./jqtreeOptions\";\nimport { GetTree, IsNodeSelected } from \"./jqtreeMethodTypes\";\n\ninterface ElementsRendererParams {\n autoEscape: boolean;\n buttonLeft: boolean;\n closedIcon?: IconElement;\n dragAndDrop: boolean;\n $element: JQuery;\n getTree: GetTree;\n isNodeSelected: IsNodeSelected;\n onCreateLi?: OnCreateLi;\n openedIcon?: IconElement;\n rtl?: boolean;\n showEmptyFolder: boolean;\n tabIndex?: number;\n}\n\nexport default class ElementsRenderer {\n public openedIconElement?: HTMLElement | Text;\n public closedIconElement?: HTMLElement | Text;\n private autoEscape: boolean;\n private buttonLeft: boolean;\n private dragAndDrop: boolean;\n private $element: JQuery;\n private getTree: GetTree;\n private isNodeSelected: IsNodeSelected;\n private onCreateLi?: OnCreateLi;\n private rtl?: boolean;\n private showEmptyFolder: boolean;\n private tabIndex?: number;\n\n constructor({\n autoEscape,\n buttonLeft,\n closedIcon,\n onCreateLi,\n dragAndDrop,\n $element,\n getTree,\n isNodeSelected,\n openedIcon,\n rtl,\n showEmptyFolder,\n tabIndex,\n }: ElementsRendererParams) {\n this.autoEscape = autoEscape;\n this.buttonLeft = buttonLeft;\n this.dragAndDrop = dragAndDrop;\n this.$element = $element;\n this.getTree = getTree;\n this.isNodeSelected = isNodeSelected;\n this.onCreateLi = onCreateLi;\n this.rtl = rtl;\n this.showEmptyFolder = showEmptyFolder;\n this.tabIndex = tabIndex;\n this.openedIconElement = this.createButtonElement(openedIcon || \"+\");\n this.closedIconElement = this.createButtonElement(closedIcon || \"-\");\n }\n\n public render(fromNode: Node | null): void {\n if (fromNode && fromNode.parent) {\n this.renderFromNode(fromNode);\n } else {\n this.renderFromRoot();\n }\n }\n\n public renderFromRoot(): void {\n this.$element.empty();\n\n const tree = this.getTree();\n\n if (this.$element[0] && tree) {\n this.createDomElements(this.$element[0], tree.children, true, 1);\n }\n }\n\n public renderFromNode(node: Node): void {\n // remember current li\n const $previousLi = jQuery(node.element);\n\n // create element\n const li = this.createLi(node, node.getLevel());\n this.attachNodeData(node, li);\n\n // add element to dom\n $previousLi.after(li);\n\n // remove previous li\n $previousLi.remove();\n\n // create children\n if (node.children) {\n this.createDomElements(\n li,\n node.children,\n false,\n node.getLevel() + 1,\n );\n }\n }\n\n private createDomElements(\n element: Element,\n children: Node[],\n isRootNode: boolean,\n level: number,\n ): void {\n const ul = this.createUl(isRootNode);\n element.appendChild(ul);\n\n for (const child of children) {\n const li = this.createLi(child, level);\n ul.appendChild(li);\n\n this.attachNodeData(child, li);\n\n if (child.hasChildren()) {\n this.createDomElements(li, child.children, false, level + 1);\n }\n }\n }\n\n private attachNodeData(node: Node, li: HTMLElement): void {\n node.element = li;\n jQuery(li).data(\"node\", node);\n }\n\n private createUl(isRootNode: boolean): HTMLUListElement {\n let classString;\n let role;\n\n if (!isRootNode) {\n classString = \"\";\n role = \"group\";\n } else {\n classString = \"jqtree-tree\";\n role = \"tree\";\n\n if (this.rtl) {\n classString += \" jqtree-rtl\";\n }\n }\n\n if (this.dragAndDrop) {\n classString += \" jqtree-dnd\";\n }\n\n const ul = document.createElement(\"ul\");\n ul.className = `jqtree_common ${classString}`;\n\n ul.setAttribute(\"role\", role);\n\n return ul;\n }\n\n private createLi(node: Node, level: number): HTMLLIElement {\n const isSelected = Boolean(this.isNodeSelected(node));\n\n const mustShowFolder =\n node.isFolder() || (node.isEmptyFolder && this.showEmptyFolder);\n\n const li = mustShowFolder\n ? this.createFolderLi(node, level, isSelected)\n : this.createNodeLi(node, level, isSelected);\n\n if (this.onCreateLi) {\n this.onCreateLi(node, jQuery(li), isSelected);\n }\n\n return li;\n }\n\n private setTreeItemAriaAttributes(\n element: HTMLElement,\n name: string,\n level: number,\n isSelected: boolean,\n ) {\n element.setAttribute(\"aria-label\", name);\n element.setAttribute(\"aria-level\", `${level}`);\n element.setAttribute(\"aria-selected\", getBoolString(isSelected));\n element.setAttribute(\"role\", \"treeitem\");\n }\n\n private createFolderLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const buttonClasses = this.getButtonClasses(node);\n const folderClasses = this.getFolderClasses(node, isSelected);\n\n const iconElement = node.is_open\n ? this.openedIconElement\n : this.closedIconElement;\n\n // li\n const li = document.createElement(\"li\");\n li.className = `jqtree_common ${folderClasses}`;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // button link\n const buttonLink = document.createElement(\"a\");\n buttonLink.className = buttonClasses;\n\n if (iconElement) {\n buttonLink.appendChild(iconElement.cloneNode(true));\n }\n\n if (this.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n true,\n level,\n );\n titleSpan.setAttribute(\"aria-expanded\", getBoolString(node.is_open));\n div.appendChild(titleSpan);\n\n if (!this.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n return li;\n }\n\n private createNodeLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const liClasses = [\"jqtree_common\"];\n\n if (isSelected) {\n liClasses.push(\"jqtree-selected\");\n }\n\n const classString = liClasses.join(\" \");\n\n // li\n const li = document.createElement(\"li\");\n li.className = classString;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n false,\n level,\n );\n div.appendChild(titleSpan);\n\n return li;\n }\n\n private createTitleSpan(\n nodeName: string,\n isSelected: boolean,\n isFolder: boolean,\n level: number,\n ): HTMLSpanElement {\n const titleSpan = document.createElement(\"span\");\n\n let classes = \"jqtree-title jqtree_common\";\n\n if (isFolder) {\n classes += \" jqtree-title-folder\";\n }\n\n classes += ` jqtree-title-button-${this.buttonLeft ? \"left\" : \"right\"}`;\n\n titleSpan.className = classes;\n\n if (isSelected) {\n const tabIndex = this.tabIndex;\n\n if (tabIndex !== undefined) {\n titleSpan.setAttribute(\"tabindex\", `${tabIndex}`);\n }\n }\n\n this.setTreeItemAriaAttributes(titleSpan, nodeName, level, isSelected);\n\n if (this.autoEscape) {\n titleSpan.textContent = nodeName;\n } else {\n titleSpan.innerHTML = nodeName;\n }\n\n return titleSpan;\n }\n\n private getButtonClasses(node: Node): string {\n const classes = [\"jqtree-toggler\", \"jqtree_common\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (this.buttonLeft) {\n classes.push(\"jqtree-toggler-left\");\n } else {\n classes.push(\"jqtree-toggler-right\");\n }\n\n return classes.join(\" \");\n }\n\n private getFolderClasses(node: Node, isSelected: boolean): string {\n const classes = [\"jqtree-folder\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (isSelected) {\n classes.push(\"jqtree-selected\");\n }\n\n if (node.is_loading) {\n classes.push(\"jqtree-loading\");\n }\n\n return classes.join(\" \");\n }\n\n private createButtonElement(\n value: IconElement,\n ): HTMLElement | Text | undefined {\n if (typeof value === \"string\") {\n // convert value to html\n const div = document.createElement(\"div\");\n div.innerHTML = value;\n\n return document.createTextNode(div.innerHTML);\n } else if (value == null) {\n return undefined;\n } else if ((value as HTMLElement).nodeType) {\n return value as HTMLElement;\n } else {\n return jQuery(value)[0];\n }\n }\n}\n","import { Node } from \"./node\";\nimport { DataFilter, OnLoadFailed, OnLoading } from \"./jqtreeOptions\";\nimport { LoadData, TriggerEvent } from \"./jqtreeMethodTypes\";\n\nexport type HandleFinishedLoading = () => void;\n\ninterface DataLoaderParams {\n dataFilter?: DataFilter;\n loadData: LoadData;\n onLoadFailed?: OnLoadFailed;\n onLoading?: OnLoading;\n treeElement: HTMLElement;\n triggerEvent: TriggerEvent;\n}\n\nexport default class DataLoader {\n private dataFilter?: DataFilter;\n private loadData: LoadData;\n private onLoadFailed?: OnLoadFailed;\n private onLoading?: OnLoading;\n private treeElement: HTMLElement;\n private triggerEvent: TriggerEvent;\n\n constructor({\n dataFilter,\n loadData,\n onLoadFailed,\n onLoading,\n treeElement,\n triggerEvent,\n }: DataLoaderParams) {\n this.dataFilter = dataFilter;\n this.loadData = loadData;\n this.onLoadFailed = onLoadFailed;\n this.onLoading = onLoading;\n this.treeElement = treeElement;\n this.triggerEvent = triggerEvent;\n }\n\n public loadFromUrl(\n urlInfo: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null,\n ): void {\n if (!urlInfo) {\n return;\n }\n\n const element = this.getDomElement(parentNode);\n this.addLoadingClass(element);\n this.notifyLoading(true, parentNode, element);\n\n const stopLoading = (): void => {\n this.removeLoadingClass(element);\n this.notifyLoading(false, parentNode, element);\n };\n\n const handleSuccess = (data: string | NodeData[]): void => {\n stopLoading();\n this.loadData(this.parseData(data), parentNode);\n\n if (onFinished && typeof onFinished === \"function\") {\n onFinished();\n }\n };\n\n const handleError = (jqXHR: JQuery.jqXHR): void => {\n stopLoading();\n\n if (this.onLoadFailed) {\n this.onLoadFailed(jqXHR);\n }\n };\n\n this.submitRequest(urlInfo, handleSuccess, handleError);\n }\n\n private addLoadingClass(element: HTMLElement): void {\n element.classList.add(\"jqtree-loading\");\n }\n\n private removeLoadingClass(element: HTMLElement): void {\n element.classList.remove(\"jqtree-loading\");\n }\n\n private getDomElement(parentNode: Node | null): HTMLElement {\n if (parentNode) {\n return parentNode.element;\n } else {\n return this.treeElement;\n }\n }\n\n private notifyLoading(\n isLoading: boolean,\n node: Node | null,\n element: HTMLElement,\n ): void {\n const $el = jQuery(element);\n\n if (this.onLoading) {\n this.onLoading(isLoading, node, $el);\n }\n\n this.triggerEvent(\"tree.loading_data\", {\n isLoading,\n node,\n $el,\n });\n }\n\n private submitRequest(\n urlInfoInput: string | JQuery.AjaxSettings,\n handleSuccess: JQuery.Ajax.SuccessCallback,\n handleError: JQuery.Ajax.ErrorCallback,\n ): void {\n const urlInfo =\n typeof urlInfoInput === \"string\"\n ? { url: urlInfoInput }\n : urlInfoInput;\n\n const ajaxSettings: JQuery.AjaxSettings = {\n method: \"GET\",\n cache: false,\n dataType: \"json\",\n success: handleSuccess,\n error: handleError,\n ...urlInfo,\n };\n\n ajaxSettings.method = ajaxSettings.method?.toUpperCase() || \"GET\";\n\n void jQuery.ajax(ajaxSettings);\n }\n\n private parseData(data: string | NodeData[]): NodeData[] {\n const getParsedData = () => {\n if (typeof data === \"string\") {\n return JSON.parse(data) as NodeData[];\n } else {\n return data;\n }\n };\n\n const parsedData = getParsedData();\n\n if (this.dataFilter) {\n return this.dataFilter(parsedData);\n } else {\n return parsedData;\n }\n }\n}\n","import { Node } from \"./node\";\nimport {\n CloseNode,\n GetSelectedNode,\n IsFocusOnTree,\n OpenNode,\n SelectNode,\n} from \"./jqtreeMethodTypes\";\n\ntype KeyboardEventHandler = (event: KeyboardEvent) => boolean;\n\ninterface KeyHandlerParams {\n closeNode: CloseNode;\n getSelectedNode: GetSelectedNode;\n isFocusOnTree: IsFocusOnTree;\n keyboardSupport: boolean;\n openNode: OpenNode;\n selectNode: SelectNode;\n}\n\nexport default class KeyHandler {\n private closeNode: CloseNode;\n private getSelectedNode: GetSelectedNode;\n private handleKeyDownHandler?: KeyboardEventHandler;\n private isFocusOnTree: IsFocusOnTree;\n private keyboardSupport: boolean;\n private openNode: OpenNode;\n private originalSelectNode: SelectNode;\n\n constructor({\n closeNode,\n getSelectedNode,\n isFocusOnTree,\n keyboardSupport,\n openNode,\n selectNode,\n }: KeyHandlerParams) {\n this.closeNode = closeNode;\n this.getSelectedNode = getSelectedNode;\n this.isFocusOnTree = isFocusOnTree;\n this.keyboardSupport = keyboardSupport;\n this.openNode = openNode;\n this.originalSelectNode = selectNode;\n\n if (keyboardSupport) {\n this.handleKeyDownHandler = this.handleKeyDown.bind(this);\n\n document.addEventListener(\"keydown\", this.handleKeyDownHandler);\n }\n }\n\n public deinit(): void {\n if (this.handleKeyDownHandler) {\n document.removeEventListener(\"keydown\", this.handleKeyDownHandler);\n }\n }\n\n public moveDown(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getNextVisibleNode());\n }\n\n public moveUp(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getPreviousVisibleNode());\n }\n\n public moveRight(selectedNode: Node): boolean {\n if (!selectedNode.isFolder()) {\n return true;\n } else {\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 } else {\n // Right expands a closed node\n this.openNode(selectedNode);\n return false;\n }\n }\n }\n\n public moveLeft(selectedNode: Node): boolean {\n if (selectedNode.isFolder() && selectedNode.is_open) {\n // Left on an open node closes the node\n this.closeNode(selectedNode);\n return false;\n } else {\n // Left on a closed or end node moves focus to the node's parent\n return this.selectNode(selectedNode.getParent());\n }\n }\n\n public selectNode(node: Node | null): boolean {\n if (!node) {\n return true;\n } else {\n this.originalSelectNode(node);\n\n return false;\n }\n }\n\n private handleKeyDown = (e: KeyboardEvent): boolean => {\n if (!this.canHandleKeyboard()) {\n return true;\n }\n\n const selectedNode = this.getSelectedNode();\n if (!selectedNode) {\n return true;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n return this.moveDown(selectedNode);\n\n case \"ArrowUp\":\n return this.moveUp(selectedNode);\n\n case \"ArrowRight\":\n return this.moveRight(selectedNode);\n\n case \"ArrowLeft\":\n return this.moveLeft(selectedNode);\n\n default:\n return true;\n }\n };\n\n private canHandleKeyboard(): boolean {\n return this.keyboardSupport && this.isFocusOnTree();\n }\n}\n","export interface PositionInfo {\n originalEvent: Event;\n pageX: number;\n pageY: number;\n target: HTMLElement;\n}\n\nexport const getPositionInfoFromMouseEvent = (e: MouseEvent): PositionInfo => ({\n originalEvent: e,\n pageX: e.pageX,\n pageY: e.pageY,\n target: e.target as HTMLElement,\n});\n\nexport const getPositionInfoFromTouch = (\n touch: Touch,\n e: TouchEvent,\n): PositionInfo => ({\n originalEvent: e,\n pageX: touch.pageX,\n pageY: touch.pageY,\n target: touch.target as HTMLElement,\n});\n","import {\n getPositionInfoFromMouseEvent,\n getPositionInfoFromTouch,\n PositionInfo,\n} from \"./mouseUtils\";\nimport { Node } from \"./node\";\nimport { TriggerEvent } from \"./jqtreeMethodTypes\";\n\ninterface ClickTarget {\n node: Node;\n type: \"button\" | \"label\";\n}\n\ntype GetNode = (element: HTMLElement) => null | Node;\n\ninterface MouseHandlerParams {\n element: HTMLElement;\n getMouseDelay: () => number;\n getNode: GetNode;\n onClickButton: (node: Node) => void;\n onClickTitle: (node: Node) => void;\n onMouseCapture: (positionInfo: PositionInfo) => boolean | null;\n onMouseDrag: (positionInfo: PositionInfo) => void;\n onMouseStart: (positionInfo: PositionInfo) => boolean;\n onMouseStop: (positionInfo: PositionInfo) => void;\n triggerEvent: TriggerEvent;\n useContextMenu: boolean;\n}\n\nclass MouseHandler {\n private element: HTMLElement;\n private getMouseDelay: () => number;\n private getNode: GetNode;\n private isMouseDelayMet: boolean;\n private isMouseStarted: boolean;\n private mouseDelayTimer: number | null;\n private mouseDownInfo: PositionInfo | null;\n private onClickButton: (node: Node) => void;\n private onClickTitle: (node: Node) => void;\n private onMouseCapture: (positionInfo: PositionInfo) => boolean | null;\n private onMouseDrag: (positionInfo: PositionInfo) => void;\n private onMouseStart: (positionInfo: PositionInfo) => boolean;\n private onMouseStop: (positionInfo: PositionInfo) => void;\n private triggerEvent: TriggerEvent;\n private useContextMenu: boolean;\n\n constructor({\n element,\n getMouseDelay,\n getNode,\n onClickButton,\n onClickTitle,\n onMouseCapture,\n onMouseDrag,\n onMouseStart,\n onMouseStop,\n triggerEvent,\n useContextMenu,\n }: MouseHandlerParams) {\n this.element = element;\n this.getMouseDelay = getMouseDelay;\n this.getNode = getNode;\n this.onClickButton = onClickButton;\n this.onClickTitle = onClickTitle;\n this.onMouseCapture = onMouseCapture;\n this.onMouseDrag = onMouseDrag;\n this.onMouseStart = onMouseStart;\n this.onMouseStop = onMouseStop;\n this.triggerEvent = triggerEvent;\n this.useContextMenu = useContextMenu;\n\n element.addEventListener(\"click\", this.handleClick);\n element.addEventListener(\"dblclick\", this.handleDblclick);\n element.addEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n element.addEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n\n if (useContextMenu) {\n element.addEventListener(\"contextmenu\", this.handleContextmenu);\n }\n\n this.isMouseStarted = false;\n this.mouseDelayTimer = null;\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n }\n\n public deinit(): void {\n this.element.removeEventListener(\"click\", this.handleClick);\n this.element.removeEventListener(\"dblclick\", this.handleDblclick);\n\n if (this.useContextMenu) {\n this.element.removeEventListener(\n \"contextmenu\",\n this.handleContextmenu,\n );\n }\n\n this.element.removeEventListener(\"mousedown\", this.mouseDown);\n this.element.removeEventListener(\"touchstart\", this.touchStart);\n this.removeMouseMoveEventListeners();\n }\n\n private mouseDown = (e: MouseEvent): void => {\n // Left mouse button?\n if (e.button !== 0) {\n return;\n }\n\n const result = this.handleMouseDown(getPositionInfoFromMouseEvent(e));\n\n if (result && e.cancelable) {\n e.preventDefault();\n }\n };\n\n private handleMouseDown(positionInfo: PositionInfo): boolean {\n // We may have missed mouseup (out of window)\n if (this.isMouseStarted) {\n this.handleMouseUp(positionInfo);\n }\n\n this.mouseDownInfo = positionInfo;\n\n if (!this.onMouseCapture(positionInfo)) {\n return false;\n }\n\n this.handleStartMouse();\n\n return true;\n }\n\n private handleStartMouse(): void {\n document.addEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n document.addEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n document.addEventListener(\"mouseup\", this.mouseUp, { passive: false });\n document.addEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\n\n const mouseDelay = this.getMouseDelay();\n\n if (mouseDelay) {\n this.startMouseDelayTimer(mouseDelay);\n } else {\n this.isMouseDelayMet = true;\n }\n }\n\n private startMouseDelayTimer(mouseDelay: number): void {\n if (this.mouseDelayTimer) {\n clearTimeout(this.mouseDelayTimer);\n }\n\n this.mouseDelayTimer = window.setTimeout(() => {\n if (this.mouseDownInfo) {\n this.isMouseDelayMet = true;\n }\n }, mouseDelay);\n\n this.isMouseDelayMet = false;\n }\n\n private mouseMove = (e: MouseEvent): void => {\n this.handleMouseMove(e, getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseMove(\n e: MouseEvent | TouchEvent,\n positionInfo: PositionInfo,\n ): void {\n if (this.isMouseStarted) {\n this.onMouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n return;\n }\n\n if (!this.isMouseDelayMet) {\n return;\n }\n\n if (this.mouseDownInfo) {\n this.isMouseStarted =\n this.onMouseStart(this.mouseDownInfo) !== false;\n }\n\n if (this.isMouseStarted) {\n this.onMouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n } else {\n this.handleMouseUp(positionInfo);\n }\n }\n\n private mouseUp = (e: MouseEvent): void => {\n this.handleMouseUp(getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseUp(positionInfo: PositionInfo): void {\n this.removeMouseMoveEventListeners();\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n\n if (this.isMouseStarted) {\n this.isMouseStarted = false;\n this.onMouseStop(positionInfo);\n }\n }\n\n private removeMouseMoveEventListeners() {\n document.removeEventListener(\"mousemove\", this.mouseMove);\n document.removeEventListener(\"touchmove\", this.touchMove);\n document.removeEventListener(\"mouseup\", this.mouseUp);\n document.removeEventListener(\"touchend\", this.touchEnd);\n }\n\n private touchStart = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.touches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseDown(getPositionInfoFromTouch(touch, e));\n };\n\n private touchMove = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.touches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseMove(e, getPositionInfoFromTouch(touch, e));\n };\n\n private touchEnd = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.touches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseUp(getPositionInfoFromTouch(touch, e));\n };\n\n private handleClick = (e: MouseEvent): void => {\n if (!e.target) {\n return;\n }\n\n const clickTarget = this.getClickTarget(e.target as HTMLElement);\n\n if (!clickTarget) {\n return;\n }\n\n if (clickTarget.type === \"button\") {\n this.onClickButton(clickTarget.node);\n\n e.preventDefault();\n e.stopPropagation();\n } else if (clickTarget.type === \"label\") {\n const event = this.triggerEvent(\"tree.click\", {\n node: clickTarget.node,\n click_event: e,\n });\n\n if (!event.isDefaultPrevented()) {\n this.onClickTitle(clickTarget.node);\n }\n }\n };\n\n private handleDblclick = (e: MouseEvent): void => {\n if (!e.target) {\n return;\n }\n\n const clickTarget = this.getClickTarget(e.target as HTMLElement);\n\n if (clickTarget?.type === \"label\") {\n this.triggerEvent(\"tree.dblclick\", {\n node: clickTarget.node,\n click_event: e,\n });\n }\n };\n\n private handleContextmenu = (e: MouseEvent) => {\n if (!e.target) {\n return;\n }\n\n const div = (e.target as HTMLElement).closest(\n \"ul.jqtree-tree .jqtree-element\",\n );\n\n if (div) {\n const node = this.getNode(div);\n if (node) {\n e.preventDefault();\n e.stopPropagation();\n\n this.triggerEvent(\"tree.contextmenu\", {\n node,\n click_event: e,\n });\n return false;\n }\n }\n\n return null;\n };\n\n private getClickTarget(element: HTMLElement): ClickTarget | null {\n const button = element.closest(\".jqtree-toggler\");\n\n if (button) {\n const node = this.getNode(button);\n\n if (node) {\n return {\n type: \"button\",\n node,\n };\n }\n } else {\n const jqTreeElement =\n element.closest(\".jqtree-element\");\n\n if (jqTreeElement) {\n const node = this.getNode(jqTreeElement);\n if (node) {\n return {\n type: \"label\",\n node,\n };\n }\n }\n }\n\n return null;\n }\n}\n\nexport default MouseHandler;\n","import { isInt } from \"./util\";\nimport { Node } from \"./node\";\nimport { OnGetStateFromStorage, OnSetStateFromStorage } from \"./jqtreeOptions\";\nimport {\n AddToSelection,\n GetNodeById,\n GetSelectedNodes,\n GetTree,\n OpenNode,\n RefreshElements,\n RemoveFromSelection,\n} from \"./jqtreeMethodTypes\";\n\nexport interface SavedState {\n open_nodes: NodeId[];\n selected_node: NodeId[];\n}\n\ninterface SaveStateHandlerParams {\n addToSelection: AddToSelection;\n getNodeById: GetNodeById;\n getSelectedNodes: GetSelectedNodes;\n getTree: GetTree;\n onGetStateFromStorage?: OnGetStateFromStorage;\n onSetStateFromStorage?: OnSetStateFromStorage;\n openNode: OpenNode;\n refreshElements: RefreshElements;\n removeFromSelection: RemoveFromSelection;\n saveState: boolean | string;\n}\n\nexport default class SaveStateHandler {\n private addToSelection: AddToSelection;\n private getNodeById: GetNodeById;\n private getSelectedNodes: GetSelectedNodes;\n private getTree: GetTree;\n private onGetStateFromStorage?: OnGetStateFromStorage;\n private onSetStateFromStorage?: OnSetStateFromStorage;\n private openNode: OpenNode;\n private refreshElements: RefreshElements;\n private removeFromSelection: RemoveFromSelection;\n private saveStateOption: boolean | string;\n private _supportsLocalStorage: boolean | null;\n\n constructor({\n addToSelection,\n getNodeById,\n getSelectedNodes,\n getTree,\n onGetStateFromStorage,\n onSetStateFromStorage,\n openNode,\n refreshElements,\n removeFromSelection,\n saveState,\n }: SaveStateHandlerParams) {\n this.addToSelection = addToSelection;\n this.getNodeById = getNodeById;\n this.getSelectedNodes = getSelectedNodes;\n this.getTree = getTree;\n this.onGetStateFromStorage = onGetStateFromStorage;\n this.onSetStateFromStorage = onSetStateFromStorage;\n this.openNode = openNode;\n this.refreshElements = refreshElements;\n this.removeFromSelection = removeFromSelection;\n this.saveStateOption = saveState;\n }\n\n public saveState(): void {\n const state = JSON.stringify(this.getState());\n\n if (this.onSetStateFromStorage) {\n this.onSetStateFromStorage(state);\n } else if (this.supportsLocalStorage()) {\n localStorage.setItem(this.getKeyName(), state);\n }\n }\n\n public getStateFromStorage(): SavedState | null {\n const jsonData = this.loadFromStorage();\n\n if (jsonData) {\n return this.parseState(jsonData) as unknown as SavedState;\n } else {\n return null;\n }\n }\n\n public getState(): SavedState {\n const getOpenNodeIds = (): NodeId[] => {\n const openNodes: NodeId[] = [];\n\n this.getTree()?.iterate((node: Node) => {\n if (node.is_open && node.id && node.hasChildren()) {\n openNodes.push(node.id);\n }\n return true;\n });\n\n return openNodes;\n };\n\n const getSelectedNodeIds = (): NodeId[] => {\n const selectedNodeIds: NodeId[] = [];\n\n this.getSelectedNodes().forEach((node) => {\n if (node.id != null) {\n selectedNodeIds.push(node.id);\n }\n });\n\n return selectedNodeIds;\n };\n\n return {\n open_nodes: getOpenNodeIds(),\n selected_node: getSelectedNodeIds(),\n };\n }\n\n /*\n Set initial state\n Don't handle nodes that are loaded on demand\n\n result: must load on demand\n */\n public setInitialState(state: SavedState): boolean {\n if (!state) {\n return false;\n } else {\n let mustLoadOnDemand = false;\n\n if (state.open_nodes) {\n mustLoadOnDemand = this.openInitialNodes(state.open_nodes);\n }\n\n if (state.selected_node) {\n this.resetSelection();\n this.selectInitialNodes(state.selected_node);\n }\n\n return mustLoadOnDemand;\n }\n }\n\n public setInitialStateOnDemand(\n state: SavedState,\n cbFinished: () => void,\n ): void {\n if (state) {\n this.doSetInitialStateOnDemand(\n state.open_nodes,\n state.selected_node,\n cbFinished,\n );\n } else {\n cbFinished();\n }\n }\n\n public getNodeIdToBeSelected(): NodeId | null {\n const state = this.getStateFromStorage();\n\n if (state && state.selected_node) {\n return state.selected_node[0] || null;\n } else {\n return null;\n }\n }\n\n private parseState(jsonData: string): SavedState {\n const state = JSON.parse(jsonData) as Record;\n\n // Check if selected_node is an int (instead of an array)\n if (state && state.selected_node && isInt(state.selected_node)) {\n // Convert to array\n state.selected_node = [state.selected_node];\n }\n\n return state as unknown as SavedState;\n }\n\n private loadFromStorage(): string | null {\n if (this.onGetStateFromStorage) {\n return this.onGetStateFromStorage();\n } else if (this.supportsLocalStorage()) {\n return localStorage.getItem(this.getKeyName());\n } else {\n return null;\n }\n }\n\n private openInitialNodes(nodeIds: NodeId[]): boolean {\n let mustLoadOnDemand = false;\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (node) {\n if (!node.load_on_demand) {\n node.is_open = true;\n } else {\n mustLoadOnDemand = true;\n }\n }\n }\n\n return mustLoadOnDemand;\n }\n\n private selectInitialNodes(nodeIds: NodeId[]): boolean {\n let selectCount = 0;\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (node) {\n selectCount += 1;\n\n this.addToSelection(node);\n }\n }\n\n return selectCount !== 0;\n }\n\n private resetSelection(): void {\n const selectedNodes = this.getSelectedNodes();\n\n selectedNodes.forEach((node) => {\n this.removeFromSelection(node);\n });\n }\n\n private doSetInitialStateOnDemand(\n nodeIdsParam: NodeId[],\n selectedNodes: NodeId[],\n cbFinished: () => void,\n ): void {\n let loadingCount = 0;\n let nodeIds = nodeIdsParam;\n\n const openNodes = (): void => {\n const newNodesIds = [];\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (!node) {\n newNodesIds.push(nodeId);\n } else {\n if (!node.is_loading) {\n if (node.load_on_demand) {\n loadAndOpenNode(node);\n } else {\n this.openNode(node, false);\n }\n }\n }\n }\n\n nodeIds = newNodesIds;\n\n if (this.selectInitialNodes(selectedNodes)) {\n this.refreshElements(null);\n }\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this.openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n openNodes();\n }\n\n private getKeyName(): string {\n if (typeof this.saveStateOption === \"string\") {\n return this.saveStateOption;\n } else {\n return \"tree\";\n }\n }\n\n private supportsLocalStorage(): boolean {\n const testSupport = (): boolean => {\n // Is local storage supported?\n if (localStorage == null) {\n return false;\n } else {\n // Check if it's possible to store an item. Safari does not allow this in private browsing mode.\n try {\n const key = \"_storage_test\";\n sessionStorage.setItem(key, \"value\");\n sessionStorage.removeItem(key);\n } catch (error) {\n return false;\n }\n\n return true;\n }\n };\n\n if (this._supportsLocalStorage == null) {\n this._supportsLocalStorage = testSupport();\n }\n\n return this._supportsLocalStorage;\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport { getElementPosition, getOffsetTop } from '../util'\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\ninterface Params {\n container: HTMLElement;\n refreshHitAreas: () => void;\n}\n\nexport default class ContainerScrollParent implements ScrollParent {\n private container: HTMLElement;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private scrollParentBottom?: number;\n private scrollParentTop?: number;\n private verticalScrollTimeout?: number;\n private verticalScrollDirection?: VerticalScrollDirection;\n\n constructor({ container, refreshHitAreas }: Params) {\n this.container = container;\n this.refreshHitAreas = refreshHitAreas;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return this.container.scrollLeft;\n }\n\n public scrollToY(top: number): void {\n this.container.scrollTop = top;\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.scrollParentTop = undefined;\n this.scrollParentBottom = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const scrollParentOffset = getElementPosition(this.container);\n\n const rightEdge = scrollParentOffset.left + this.container.clientWidth;\n const leftEdge = scrollParentOffset.left;\n const isNearRightEdge = pageX > rightEdge - 20;\n const isNearLeftEdge = pageX < leftEdge + 20;\n\n if (isNearRightEdge) {\n return \"right\";\n } else if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n if (pageY < this.getScrollParentTop()) {\n return \"top\";\n }\n\n if (pageY > this.getScrollParentBottom()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n\n this.container.scrollBy({\n left: distance,\n top: 0,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n\n this.container.scrollBy({\n left: 0,\n top: distance,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n\n private getScrollParentTop() {\n if (this.scrollParentTop == null) {\n this.scrollParentTop = getOffsetTop(this.container)\n }\n\n return this.scrollParentTop;\n }\n\n private getScrollParentBottom() {\n if (this.scrollParentBottom == null) {\n this.scrollParentBottom = this.getScrollParentTop() + this.container.clientHeight;\n }\n\n return this.scrollParentBottom;\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport { getOffsetTop } from '../util'\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\ninterface Params {\n refreshHitAreas: () => void;\n treeElement: HTMLElement;\n}\n\nexport default class DocumentScrollParent implements ScrollParent {\n private documentScrollHeight?: number;\n private documentScrollWidth?: number;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private treeElement: HTMLElement;\n private verticalScrollDirection?: VerticalScrollDirection;\n private verticalScrollTimeout?: number;\n\n constructor({ refreshHitAreas, treeElement }: Params) {\n this.refreshHitAreas = refreshHitAreas;\n this.treeElement = treeElement;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.horizontalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return document.documentElement.scrollLeft;\n }\n\n public scrollToY(top: number): void {\n const treeTop = getOffsetTop(this.treeElement);\n\n document.documentElement.scrollTop = top + treeTop;\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.documentScrollHeight = undefined;\n this.documentScrollWidth = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const scrollLeft = document.documentElement.scrollLeft;\n const windowWidth = window.innerWidth;\n\n const isNearRightEdge = pageX > windowWidth - 20;\n const isNearLeftEdge = pageX - scrollLeft < 20;\n\n if (isNearRightEdge && this.canScrollRight()) {\n return \"right\";\n }\n\n if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private canScrollRight() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollLeft + documentElement.clientWidth <\n this.getDocumentScrollWidth()\n );\n }\n\n private canScrollDown() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollTop + documentElement.clientHeight <\n this.getDocumentScrollHeight()\n );\n }\n\n private getDocumentScrollHeight() {\n // Store the original scroll height because the scroll height can increase when the drag element is moved beyond the scroll height.\n if (this.documentScrollHeight == null) {\n this.documentScrollHeight = document.documentElement.scrollHeight;\n }\n\n return this.documentScrollHeight;\n }\n\n private getDocumentScrollWidth() {\n // Store the original scroll width because the scroll width can increase when the drag element is moved beyond the scroll width.\n if (this.documentScrollWidth == null) {\n this.documentScrollWidth = document.documentElement.scrollWidth;\n }\n\n return this.documentScrollWidth;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n const scrollTop = jQuery(document).scrollTop() || 0;\n const distanceTop = pageY - scrollTop;\n\n if (distanceTop < 20) {\n return \"top\";\n }\n\n const windowHeight = window.innerHeight;\n\n if (windowHeight - (pageY - scrollTop) < 20 && this.canScrollDown()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n window.scrollBy({ left: distance, top: 0, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n window.scrollBy({ left: 0, top: distance, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport ContainerScrollParent from \"./containerScrollParent\";\nimport DocumentScrollParent from \"./documentScrollParent\";\n\nconst isOverflow = (overflowValue: string) =>\n overflowValue === \"auto\" || overflowValue === \"scroll\";\n\nconst hasOverFlow = (element: HTMLElement): boolean => {\n const style = getComputedStyle(element);\n\n return isOverflow(style.overflowX) || isOverflow(style.overflowY);\n};\n\nconst getParentWithOverflow = (\n treeElement: HTMLElement,\n): HTMLElement | null => {\n if (hasOverFlow(treeElement)) {\n return treeElement;\n }\n\n let parent = treeElement.parentElement;\n\n while (parent) {\n if (hasOverFlow(parent)) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return null;\n};\n\nconst createScrollParent = (\n treeElement: HTMLElement,\n refreshHitAreas: () => void,\n): ScrollParent => {\n const container = getParentWithOverflow(treeElement);\n\n if (container && container.tagName !== \"HTML\") {\n return new ContainerScrollParent({\n container,\n refreshHitAreas,\n });\n } else {\n return new DocumentScrollParent({ refreshHitAreas, treeElement });\n }\n};\n\nexport default createScrollParent;\n","import { PositionInfo } from \"./mouseUtils\";\nimport { ScrollParent } from \"./scrollHandler/types\";\nimport createScrollParent from \"./scrollHandler/createScrollParent\";\n\ninterface ScrollHandlerParams {\n refreshHitAreas: () => void;\n treeElement: HTMLElement;\n}\n\nexport default class ScrollHandler {\n private refreshHitAreas: () => void;\n private scrollParent?: ScrollParent;\n private treeElement: HTMLElement;\n\n constructor({ refreshHitAreas, treeElement }: ScrollHandlerParams) {\n this.refreshHitAreas = refreshHitAreas;\n this.scrollParent = undefined;\n this.treeElement = treeElement;\n }\n\n public checkScrolling(positionInfo: PositionInfo): void {\n this.checkVerticalScrolling(positionInfo);\n this.checkHorizontalScrolling(positionInfo);\n }\n\n public stopScrolling() {\n this.getScrollParent().stopScrolling();\n }\n\n public scrollToY(top: number): void {\n this.getScrollParent().scrollToY(top);\n }\n\n public getScrollLeft(): number {\n return this.getScrollParent().getScrollLeft();\n }\n\n private checkVerticalScrolling(positionInfo: PositionInfo): void {\n this.getScrollParent().checkVerticalScrolling(positionInfo.pageY);\n }\n\n private checkHorizontalScrolling(positionInfo: PositionInfo): void {\n this.getScrollParent().checkHorizontalScrolling(positionInfo.pageX);\n }\n\n private getScrollParent(): ScrollParent {\n if (!this.scrollParent) {\n this.scrollParent = createScrollParent(\n this.treeElement,\n this.refreshHitAreas,\n );\n }\n\n return this.scrollParent;\n }\n}\n","import { Node } from \"./node\";\nimport { GetNodeById } from \"./jqtreeMethodTypes\";\n\ninterface SelectNodeHandlerParameters {\n getNodeById: GetNodeById;\n}\n\nexport default class SelectNodeHandler {\n private getNodeById: GetNodeById;\n private selectedNodes: Set;\n private selectedSingleNode: Node | null;\n\n constructor({ getNodeById }: SelectNodeHandlerParameters) {\n this.getNodeById = getNodeById;\n this.selectedNodes = new Set();\n this.clear();\n }\n\n public getSelectedNode(): Node | false {\n const selectedNodes = this.getSelectedNodes();\n\n if (selectedNodes.length) {\n return selectedNodes[0] || false;\n } else {\n return false;\n }\n }\n\n public getSelectedNodes(): Node[] {\n if (this.selectedSingleNode) {\n return [this.selectedSingleNode];\n } else {\n const selectedNodes: Node[] = [];\n\n this.selectedNodes.forEach((id) => {\n const node = this.getNodeById(id);\n if (node) {\n selectedNodes.push(node);\n }\n });\n\n return selectedNodes;\n }\n }\n\n public getSelectedNodesUnder(parent: Node): Node[] {\n if (this.selectedSingleNode) {\n if (parent.isParentOf(this.selectedSingleNode)) {\n return [this.selectedSingleNode];\n } else {\n return [];\n }\n } else {\n const selectedNodes = [];\n\n for (const id in this.selectedNodes) {\n if (\n Object.prototype.hasOwnProperty.call(this.selectedNodes, id)\n ) {\n const node = this.getNodeById(id);\n if (node && parent.isParentOf(node)) {\n selectedNodes.push(node);\n }\n }\n }\n\n return selectedNodes;\n }\n }\n\n public isNodeSelected(node: Node): boolean {\n if (node.id != null) {\n return this.selectedNodes.has(node.id);\n } else if (this.selectedSingleNode) {\n return this.selectedSingleNode.element === node.element;\n } else {\n return false;\n }\n }\n\n public clear(): void {\n this.selectedNodes.clear();\n this.selectedSingleNode = null;\n }\n\n public removeFromSelection(node: Node, includeChildren = false): void {\n if (node.id == null) {\n if (\n this.selectedSingleNode &&\n node.element === this.selectedSingleNode.element\n ) {\n this.selectedSingleNode = null;\n }\n } else {\n this.selectedNodes.delete(node.id);\n\n if (includeChildren) {\n node.iterate(() => {\n if (node.id != null) {\n this.selectedNodes.delete(node.id);\n }\n return true;\n });\n }\n }\n }\n\n public addToSelection(node: Node): void {\n if (node.id != null) {\n this.selectedNodes.add(node.id);\n } else {\n this.selectedSingleNode = node;\n }\n }\n}\n","const register = (widgetClass: unknown, widgetName: string): void => {\n const getDataKey = (): string => `simple_widget_${widgetName}`;\n\n const getWidgetData = (\n el: HTMLElement,\n dataKey: string\n ): SimpleWidget | null => {\n const widget = jQuery.data(el, dataKey) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n return widget;\n } else {\n return null;\n }\n };\n\n const createWidget = ($el: JQuery, options: unknown): JQuery => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const existingWidget = getWidgetData(el, dataKey);\n\n if (!existingWidget) {\n const simpleWidgetClass = widgetClass as typeof SimpleWidget;\n const widget = new simpleWidgetClass(el, options);\n\n if (!jQuery.data(el, dataKey)) {\n jQuery.data(el, dataKey, widget);\n }\n\n // Call init after setting data, so we can call methods\n widget.init();\n }\n }\n\n return $el;\n };\n\n const destroyWidget = ($el: JQuery): void => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const widget = getWidgetData(el, dataKey);\n\n if (widget) {\n widget.destroy();\n }\n\n jQuery.removeData(el, dataKey);\n }\n };\n\n const callFunction = (\n $el: JQuery,\n functionName: string,\n args: unknown[]\n ): unknown => {\n let result = null;\n\n for (const el of $el.get()) {\n const widget = jQuery.data(el, getDataKey()) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n const simpleWidget = widget as SimpleWidget;\n const widgetFunction = simpleWidget[functionName];\n\n if (widgetFunction && typeof widgetFunction === \"function\") {\n result = widgetFunction.apply(widget, args) as unknown;\n }\n }\n }\n\n return result;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (jQuery.fn as any)[widgetName] = function (\n this: JQuery,\n argument1: unknown,\n ...args: unknown[]\n ) {\n if (!argument1) {\n return createWidget(this, null);\n } else if (typeof argument1 === \"object\") {\n const options = argument1 as unknown;\n return createWidget(this, options);\n } else if (typeof argument1 === \"string\" && argument1[0] !== \"_\") {\n const functionName = argument1;\n\n if (functionName === \"destroy\") {\n return destroyWidget(this);\n } else if (functionName === \"get_widget_class\") {\n return widgetClass;\n } else {\n return callFunction(this, functionName, args);\n }\n } else {\n return undefined;\n }\n };\n};\n\nexport default class SimpleWidget {\n public static register(widgetClass: unknown, widgetName: string): void {\n register(widgetClass, widgetName);\n }\n\n [key: string]: unknown;\n\n protected static defaults: unknown = {};\n\n public options: WidgetOptions;\n\n public $el: JQuery;\n\n constructor(el: HTMLElement, options: WidgetOptions) {\n this.$el = jQuery(el);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const defaults = (this.constructor as any)[\"defaults\"] as WidgetOptions;\n this.options = { ...defaults, ...options };\n }\n\n public destroy(): void {\n this.deinit();\n }\n\n public init(): void {\n //\n }\n\n public deinit(): void {\n //\n }\n}\n","interface NodeRecordWithChildren extends NodeRecord {\n children: NodeData[];\n}\n\nexport const isNodeRecordWithChildren = (\n data: NodeData,\n): data is NodeRecordWithChildren =>\n typeof data === \"object\" &&\n \"children\" in data &&\n data[\"children\"] instanceof Array;\n","import { isNodeRecordWithChildren } from \"./nodeUtils\";\nimport { Position } from \"./position\";\n\ntype IterateCallback = (node: Node, level: number) => boolean;\n\nexport class Node implements INode {\n public id?: NodeId;\n public name: string;\n public children: Node[];\n public parent: Node | null;\n public idMapping: Map;\n public tree?: Node;\n public nodeClass?: typeof Node;\n public load_on_demand: boolean;\n public is_open: boolean;\n public element: HTMLElement;\n public is_loading: boolean;\n public isEmptyFolder: boolean;\n\n [key: string]: unknown;\n\n constructor(\n nodeData: NodeData | null = null,\n isRoot = false,\n nodeClass = Node,\n ) {\n this.name = \"\";\n this.load_on_demand = false;\n\n this.isEmptyFolder =\n nodeData != null &&\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length === 0;\n\n this.setData(nodeData);\n\n this.children = [];\n this.parent = null;\n\n if (isRoot) {\n this.idMapping = new Map();\n this.tree = this;\n this.nodeClass = nodeClass;\n }\n }\n\n /*\n Set the data of this node.\n\n setData(string): set the name of the node\n setData(object): set attributes of the node\n\n Examples:\n setData('node1')\n\n setData({ name: 'node1', id: 1});\n\n setData({ name: 'node2', id: 2, color: 'green'});\n\n * This is an internal function; it is not in the docs\n * Does not remove existing node values\n */\n public setData(o: NodeData | null): void {\n if (!o) {\n return;\n } else if (typeof o === \"string\") {\n this.name = o;\n } else if (typeof o === \"object\") {\n for (const key in o) {\n if (Object.prototype.hasOwnProperty.call(o, key)) {\n const value = o[key];\n\n if (key === \"label\" || key === \"name\") {\n // You can use the 'label' key instead of 'name'; this is a legacy feature\n if (typeof value === \"string\") {\n this.name = value;\n }\n } else if (key !== \"children\" && key !== \"parent\") {\n // You can't update the children or the parent using this function\n this[key] = value;\n }\n }\n }\n }\n }\n\n /*\n Create tree from data.\n\n Structure of data is:\n [\n {\n name: 'node1',\n children: [\n { name: 'child1' },\n { name: 'child2' }\n ]\n },\n {\n name: 'node2'\n }\n ]\n */\n public loadFromData(data: NodeData[]): Node {\n this.removeChildren();\n\n for (const childData of data) {\n const node = this.createNode(childData);\n this.addChild(node);\n\n if (isNodeRecordWithChildren(childData)) {\n node.loadFromData(childData.children);\n }\n }\n\n return this;\n }\n\n /*\n Add child.\n\n tree.addChild(\n new Node('child1')\n );\n */\n public addChild(node: Node): void {\n this.children.push(node);\n node.setParent(this);\n }\n\n /*\n Add child at position. Index starts at 0.\n\n tree.addChildAtPosition(\n new Node('abc'),\n 1\n );\n */\n public addChildAtPosition(node: Node, index: number): void {\n this.children.splice(index, 0, node);\n node.setParent(this);\n }\n\n /*\n Remove child. This also removes the children of the node.\n\n tree.removeChild(tree.children[0]);\n */\n public removeChild(node: Node): void {\n // remove children from the index\n node.removeChildren();\n\n this.doRemoveChild(node);\n }\n\n /*\n Get child index.\n\n var index = getChildIndex(node);\n */\n public getChildIndex(node: Node): number {\n return this.children.indexOf(node);\n }\n\n /*\n Does the tree have children?\n\n if (tree.hasChildren()) {\n //\n }\n */\n public hasChildren(): boolean {\n return this.children.length !== 0;\n }\n\n public isFolder(): boolean {\n return this.hasChildren() || this.load_on_demand;\n }\n\n /*\n Iterate over all the nodes in the tree.\n\n Calls callback with (node, level).\n\n The callback must return true to continue the iteration on current node.\n\n tree.iterate(\n function(node, level) {\n console.log(node.name);\n\n // stop iteration after level 2\n return (level <= 2);\n }\n );\n\n */\n public iterate(callback: IterateCallback): void {\n const _iterate = (node: Node, level: number): void => {\n if (node.children) {\n for (const child of node.children) {\n const result = callback(child, level);\n\n if (result && child.hasChildren()) {\n _iterate(child, level + 1);\n }\n }\n }\n };\n\n _iterate(this, 0);\n }\n\n /*\n Move node relative to another node.\n\n Argument position: Position.BEFORE, Position.AFTER or Position.Inside\n\n // move node1 after node2\n tree.moveNode(node1, node2, Position.AFTER);\n */\n public moveNode(\n movedNode: Node,\n targetNode: Node,\n position: Position,\n ): boolean {\n if (!movedNode.parent || movedNode.isParentOf(targetNode)) {\n // - Node is parent of target node\n // - Or, parent is empty\n return false;\n } else {\n movedNode.parent.doRemoveChild(movedNode);\n\n switch (position) {\n case Position.After: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode) + 1,\n );\n return true;\n }\n return false;\n }\n\n case Position.Before: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode),\n );\n return true;\n }\n return false;\n }\n\n case Position.Inside: {\n // move inside as first child\n targetNode.addChildAtPosition(movedNode, 0);\n return true;\n }\n\n default:\n return false;\n }\n }\n }\n\n /*\n Get the tree as data.\n */\n public getData(includeParent = false): NodeRecord[] {\n const getDataFromNodes = (nodes: Node[]): Record[] => {\n return nodes.map((node) => {\n const tmpNode: Record = {};\n\n for (const k in node) {\n if (\n [\n \"parent\",\n \"children\",\n \"element\",\n \"idMapping\",\n \"load_on_demand\",\n \"nodeClass\",\n \"tree\",\n \"isEmptyFolder\",\n ].indexOf(k) === -1 &&\n Object.prototype.hasOwnProperty.call(node, k)\n ) {\n const v = node[k];\n tmpNode[k] = v;\n }\n }\n\n if (node.hasChildren()) {\n tmpNode[\"children\"] = getDataFromNodes(node.children);\n }\n\n return tmpNode;\n });\n };\n\n if (includeParent) {\n return getDataFromNodes([this]);\n } else {\n return getDataFromNodes(this.children);\n }\n }\n\n public getNodeByName(name: string): Node | null {\n return this.getNodeByCallback((node: Node) => node.name === name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n const node = this.getNodeByCallback((n: Node) => n.name === name);\n\n if (!node) {\n throw `Node with name ${name} not found`;\n }\n\n return node;\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n let result: Node | null = null;\n\n this.iterate((node: Node) => {\n if (result) {\n return false;\n } else if (callback(node)) {\n result = node;\n return false;\n } else {\n return true;\n }\n });\n\n return result;\n }\n\n public addAfter(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex + 1);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addBefore(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addParent(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const newParent = this.createNode(nodeInfo);\n\n if (this.tree) {\n newParent.setParent(this.tree);\n }\n const originalParent = this.parent;\n\n for (const child of originalParent.children) {\n newParent.addChild(child);\n }\n\n originalParent.children = [];\n originalParent.addChild(newParent);\n return newParent;\n }\n }\n\n public remove(): void {\n if (this.parent) {\n this.parent.removeChild(this);\n this.parent = null;\n }\n }\n\n public append(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChild(node);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public prepend(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChildAtPosition(node, 0);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public isParentOf(node: Node): boolean {\n let parent = node.parent;\n\n while (parent) {\n if (parent === this) {\n return true;\n }\n\n parent = parent.parent;\n }\n\n return false;\n }\n\n public getLevel(): number {\n let level = 0;\n let node: Node = this; // eslint-disable-line @typescript-eslint/no-this-alias\n\n while (node.parent) {\n level += 1;\n node = node.parent;\n }\n\n return level;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.idMapping.get(nodeId) || null;\n }\n\n public addNodeToIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.set(node.id, node);\n }\n }\n\n public removeNodeFromIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.delete(node.id);\n }\n }\n\n public removeChildren(): void {\n this.iterate((child: Node) => {\n this.tree?.removeNodeFromIndex(child);\n return true;\n });\n\n this.children = [];\n }\n\n public getPreviousSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousIndex = this.parent.getChildIndex(this) - 1;\n if (previousIndex >= 0) {\n return this.parent.children[previousIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNextSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const nextIndex = this.parent.getChildIndex(this) + 1;\n if (nextIndex < this.parent.children.length) {\n return this.parent.children[nextIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.filter((node: Node) => node[key] === value);\n }\n\n public filter(f: (node: Node) => boolean): Node[] {\n const result: Node[] = [];\n\n this.iterate((node: Node) => {\n if (f(node)) {\n result.push(node);\n }\n\n return true;\n });\n\n return result;\n }\n\n public getNextNode(includeChildren = true): Node | null {\n if (includeChildren && this.hasChildren()) {\n return this.children[0] || null;\n } else if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n\n if (nextSibling) {\n return nextSibling;\n } else {\n return this.parent.getNextNode(false);\n }\n }\n }\n\n public getNextVisibleNode(): Node | null {\n if (this.hasChildren() && this.is_open) {\n // First child\n return this.children[0] || null;\n } else {\n if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n if (nextSibling) {\n // Next sibling\n return nextSibling;\n } else {\n // Next node of parent\n return this.parent.getNextNode(false);\n }\n }\n }\n }\n\n public getPreviousNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (previousSibling.hasChildren()) {\n return previousSibling.getLastChild();\n } else {\n return previousSibling;\n }\n }\n }\n\n public getPreviousVisibleNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (\n !previousSibling.hasChildren() ||\n !previousSibling.is_open\n ) {\n // Previous sibling\n return previousSibling;\n } else {\n // Last child of previous sibling\n return previousSibling.getLastChild();\n }\n }\n }\n\n public getParent(): Node | null {\n // Return parent except if it is the root node\n if (!this.parent) {\n return null;\n } else if (!this.parent.parent) {\n // Root node -> null\n return null;\n } else {\n return this.parent;\n }\n }\n\n public getLastChild(): Node | null {\n if (!this.hasChildren()) {\n return null;\n } else {\n const lastChild = this.children[this.children.length - 1];\n\n if (!lastChild) {\n return null;\n }\n\n if (!(lastChild.hasChildren() && lastChild.is_open)) {\n return lastChild;\n } else {\n return lastChild?.getLastChild();\n }\n }\n }\n\n // Init Node from data without making it the root of the tree\n public initFromData(data: NodeData): void {\n const addNode = (nodeData: NodeData): void => {\n this.setData(nodeData);\n\n if (\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length\n ) {\n addChildren(nodeData.children);\n }\n };\n\n const addChildren = (childrenData: NodeData[]): void => {\n for (const child of childrenData) {\n const node = this.createNode();\n node.initFromData(child);\n this.addChild(node);\n }\n };\n\n addNode(data);\n }\n\n private setParent(parent: Node): void {\n this.parent = parent;\n this.tree = parent.tree;\n this.tree?.addNodeToIndex(this);\n }\n\n private doRemoveChild(node: Node): void {\n this.children.splice(this.getChildIndex(node), 1);\n this.tree?.removeNodeFromIndex(node);\n }\n\n private getNodeClass(): typeof Node {\n return this.nodeClass || this?.tree?.nodeClass || Node;\n }\n\n private createNode(nodeData?: NodeData): Node {\n const nodeClass = this.getNodeClass();\n return new nodeClass(nodeData);\n }\n\n // Load children data from nodeInfo if it has children\n private loadChildrenFromData(nodeInfo: NodeData) {\n if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {\n this.loadFromData(nodeInfo.children);\n }\n }\n}\n","import { DropHint } from \"../dragAndDropHandler/types\";\n\nclass BorderDropHint implements DropHint {\n private hint?: HTMLElement;\n\n constructor(element: HTMLElement, scrollLeft: number) {\n const div = element.querySelector(\":scope > .jqtree-element\");\n\n if (!div) {\n this.hint = undefined;\n return;\n }\n\n const width = Math.max(element.offsetWidth + scrollLeft - 4, 0);\n const height = Math.max(element.clientHeight - 4, 0);\n\n const hint = document.createElement(\"span\");\n hint.className = \"jqtree-border\";\n hint.style.width = `${width}px`;\n hint.style.height = `${height}px`;\n\n this.hint = hint;\n\n div.append(this.hint);\n }\n\n public remove(): void {\n this.hint?.remove();\n }\n}\n\nexport default BorderDropHint;\n","import { Node } from \"../node\";\nimport { Position } from \"../position\";\nimport { DropHint } from \"../dragAndDropHandler/types\";\n\nclass GhostDropHint implements DropHint {\n private element: HTMLElement;\n private node: Node;\n private ghost: HTMLElement;\n\n constructor(node: Node, element: HTMLElement, position: Position) {\n this.element = element;\n this.node = node;\n this.ghost = this.createGhostElement();\n\n if (position === Position.After) {\n this.moveAfter();\n } else if (position === Position.Before) {\n this.moveBefore();\n } else if (position === Position.Inside) {\n if (node.isFolder() && node.is_open) {\n this.moveInsideOpenFolder();\n } else {\n this.moveInside();\n }\n }\n }\n\n public remove(): void {\n this.ghost.remove();\n }\n\n private moveAfter(): void {\n this.element.after(this.ghost);\n }\n\n private moveBefore(): void {\n this.element.before(this.ghost);\n }\n\n private moveInsideOpenFolder(): void {\n const childElement = this.node.children[0]?.element;\n\n if (childElement) {\n childElement.before(this.ghost);\n }\n }\n\n private moveInside(): void {\n this.element.after(this.ghost);\n this.ghost.classList.add(\"jqtree-inside\");\n }\n\n private createGhostElement() {\n const ghost = document.createElement(\"li\");\n ghost.className = \"jqtree_common jqtree-ghost\";\n\n const circleSpan = document.createElement(\"span\");\n circleSpan.className = \"jqtree_common jqtree-circle\";\n ghost.append(circleSpan);\n\n const lineSpan = document.createElement(\"span\");\n lineSpan.className = \"jqtree_common jqtree-line\";\n ghost.append(lineSpan);\n\n return ghost;\n }\n}\n\nexport default GhostDropHint;\n","import { Node } from \"../node\";\nimport { Position } from \"../position\";\nimport { DropHint } from \"../dragAndDropHandler/types\";\nimport BorderDropHint from \"./borderDropHint\";\nimport GhostDropHint from \"./ghostDropHint\";\nimport { GetScrollLeft } from \"../jqtreeMethodTypes\";\n\nexport interface NodeElementParams {\n getScrollLeft: GetScrollLeft;\n node: Node;\n tabIndex?: number;\n $treeElement: JQuery;\n}\n\nclass NodeElement {\n public node: Node;\n public element: HTMLElement;\n private getScrollLeft: GetScrollLeft;\n private tabIndex?: number;\n private $treeElement: JQuery;\n\n constructor({\n getScrollLeft,\n node,\n tabIndex,\n $treeElement,\n }: NodeElementParams) {\n this.getScrollLeft = getScrollLeft;\n this.tabIndex = tabIndex;\n this.$treeElement = $treeElement;\n\n this.init(node);\n }\n\n public init(node: Node): void {\n this.node = node;\n\n if (!node.element) {\n const element = this.$treeElement.get(0);\n\n if (element) {\n node.element = element;\n }\n }\n\n if (node.element) {\n this.element = node.element;\n }\n }\n\n public addDropHint(position: number): DropHint {\n if (this.mustShowBorderDropHint(position)) {\n return new BorderDropHint(this.element, this.getScrollLeft());\n } else {\n return new GhostDropHint(this.node, this.element, position);\n }\n }\n\n public select(mustSetFocus: boolean): void {\n this.element.classList.add(\"jqtree-selected\");\n\n const titleSpan = this.getTitleSpan();\n const tabIndex = this.tabIndex;\n\n // Check for null or undefined\n if (tabIndex != null) {\n titleSpan.setAttribute(\"tabindex\", tabIndex.toString());\n }\n\n titleSpan.setAttribute(\"aria-selected\", \"true\");\n\n if (mustSetFocus) {\n titleSpan.focus();\n }\n }\n\n public deselect(): void {\n this.element.classList.remove(\"jqtree-selected\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.removeAttribute(\"tabindex\");\n titleSpan.setAttribute(\"aria-selected\", \"false\");\n\n titleSpan.blur();\n }\n\n protected getUl(): HTMLUListElement {\n return this.element.querySelector(\":scope > ul\") as HTMLUListElement;\n }\n\n protected getTitleSpan(): HTMLSpanElement {\n return this.element.querySelector(\n \":scope > .jqtree-element > span.jqtree-title\",\n ) as HTMLSpanElement;\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return position === Position.Inside;\n }\n}\n\nexport default NodeElement;\n","import { Position } from \"../position\";\nimport NodeElement, { NodeElementParams } from \"./index\";\nimport { OnFinishOpenNode, TriggerEvent } from \"../jqtreeMethodTypes\";\n\ninterface FolderElementParams extends NodeElementParams {\n closedIconElement?: HTMLElement | Text;\n openedIconElement?: HTMLElement | Text;\n triggerEvent: TriggerEvent;\n}\n\nclass FolderElement extends NodeElement {\n private closedIconElement?: HTMLElement | Text;\n private openedIconElement?: HTMLElement | Text;\n private triggerEvent: TriggerEvent;\n\n constructor({\n closedIconElement,\n getScrollLeft,\n node,\n openedIconElement,\n tabIndex,\n $treeElement,\n triggerEvent,\n }: FolderElementParams) {\n super({\n getScrollLeft,\n node,\n tabIndex,\n $treeElement,\n });\n\n this.closedIconElement = closedIconElement;\n this.openedIconElement = openedIconElement;\n this.triggerEvent = triggerEvent;\n }\n\n public open(\n onFinished: OnFinishOpenNode | undefined,\n slide = true,\n animationSpeed: JQuery.Duration = \"fast\",\n ): void {\n if (this.node.is_open) {\n return;\n }\n\n this.node.is_open = true;\n\n const button = this.getButton();\n button.classList.remove(\"jqtree-closed\");\n button.innerHTML = \"\";\n\n const openedIconElement = this.openedIconElement;\n\n if (openedIconElement) {\n const icon = openedIconElement.cloneNode(true);\n button.appendChild(icon);\n }\n\n const doOpen = (): void => {\n this.element.classList.remove(\"jqtree-closed\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"true\");\n\n if (onFinished) {\n onFinished(this.node);\n }\n\n this.triggerEvent(\"tree.open\", {\n node: this.node,\n });\n };\n\n if (slide) {\n jQuery(this.getUl()).slideDown(animationSpeed, doOpen);\n } else {\n jQuery(this.getUl()).show();\n doOpen();\n }\n }\n\n public close(\n slide = true,\n animationSpeed: JQuery.Duration | undefined = \"fast\",\n ): void {\n if (!this.node.is_open) {\n return;\n }\n\n this.node.is_open = false;\n\n const button = this.getButton();\n button.classList.add(\"jqtree-closed\");\n button.innerHTML = \"\";\n\n const closedIconElement = this.closedIconElement;\n\n if (closedIconElement) {\n const icon = closedIconElement.cloneNode(true);\n button.appendChild(icon);\n }\n\n const doClose = (): void => {\n this.element.classList.add(\"jqtree-closed\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"false\");\n\n this.triggerEvent(\"tree.close\", {\n node: this.node,\n });\n };\n\n if (slide) {\n jQuery(this.getUl()).slideUp(animationSpeed, doClose);\n } else {\n jQuery(this.getUl()).hide();\n doClose();\n }\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return !this.node.is_open && position === Position.Inside;\n }\n\n private getButton(): HTMLLinkElement {\n return this.element.querySelector(\n \":scope > .jqtree-element > a.jqtree-toggler\",\n ) as HTMLLinkElement;\n }\n}\n\nexport default FolderElement;\n","import __version__ from \"./version\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport DataLoader, { HandleFinishedLoading } from \"./dataLoader\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseHandler from \"./mouseHandler\";\nimport { PositionInfo } from \"./mouseUtils\";\nimport SaveStateHandler, { SavedState } from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport SimpleWidget from \"./simple.widget\";\nimport { getOffsetTop, isFunction } from \"./util\";\nimport { Node } from \"./node\";\nimport { getPosition } from \"./position\";\nimport NodeElement from \"./nodeElement\";\nimport FolderElement from \"./nodeElement/folderElement\";\nimport { OnFinishOpenNode } from \"./jqtreeMethodTypes\";\nimport { JQTreeOptions } from \"./jqtreeOptions\";\n\ninterface SelectNodeOptions {\n mustToggle?: boolean;\n mustSetFocus?: boolean;\n}\n\nconst NODE_PARAM_IS_EMPTY = \"Node parameter is empty\";\nconst PARAM_IS_EMPTY = \"Parameter is empty: \";\n\nexport class JqTreeWidget extends SimpleWidget {\n protected static defaults: JQTreeOptions = {\n animationSpeed: \"fast\",\n autoEscape: true,\n autoOpen: false, // true / false / int (open n levels starting at 0)\n buttonLeft: true,\n // The symbol to use for a closed node - â–º BLACK RIGHT-POINTING POINTER\n // http://www.fileformat.info/info/unicode/char/25ba/index.htm\n closedIcon: undefined,\n data: undefined,\n dataFilter: undefined,\n dataUrl: undefined,\n dragAndDrop: false,\n keyboardSupport: true,\n nodeClass: Node,\n onCanMove: undefined, // Can this node be moved?\n onCanMoveTo: undefined, // Can this node be moved to this position? function(moved_node, target_node, position)\n onCanSelectNode: undefined,\n onCreateLi: undefined,\n onDragMove: undefined,\n onDragStop: undefined,\n onGetStateFromStorage: undefined,\n onIsMoveHandle: undefined,\n onLoadFailed: undefined,\n onLoading: undefined,\n onSetStateFromStorage: undefined,\n openedIcon: \"▼\",\n openFolderDelay: 500, // The delay for opening a folder during drag and drop; the value is in milliseconds\n // The symbol to use for an open node - â–¼ BLACK DOWN-POINTING TRIANGLE\n // http://www.fileformat.info/info/unicode/char/25bc/index.htm\n rtl: undefined, // right-to-left support; true / false (default)\n saveState: false, // true / false / string (cookie name)\n selectable: true,\n showEmptyFolder: false,\n slide: true, // must display slide animation?\n startDndDelay: 300, // The delay for starting dnd (in milliseconds)\n tabIndex: 0,\n useContextMenu: true,\n };\n\n private element: JQuery;\n private isInitialized: boolean;\n private tree: Node;\n\n private dataLoader: DataLoader;\n private dndHandler: DragAndDropHandler;\n private keyHandler: KeyHandler;\n private mouseHandler: MouseHandler;\n private renderer: ElementsRenderer;\n private saveStateHandler: SaveStateHandler;\n private scrollHandler: ScrollHandler;\n private selectNodeHandler: SelectNodeHandler;\n\n public toggle(node: Node, slideParam: null | boolean = null): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.is_open) {\n this.closeNode(node, slide);\n } else {\n this.openNode(node, slide);\n }\n\n return this.element;\n }\n\n public getTree(): Node {\n return this.tree;\n }\n\n public selectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): JQuery {\n this.doSelectNode(node, optionsParam);\n return this.element;\n }\n\n public getSelectedNode(): Node | false {\n return this.selectNodeHandler.getSelectedNode();\n }\n\n public toJson(): string {\n return JSON.stringify(this.tree.getData());\n }\n\n public loadData(data: NodeData[], parentNode: Node | null): JQuery {\n this.doLoadData(data, parentNode);\n return this.element;\n }\n\n /*\n signatures:\n - loadDataFromUrl(url, parent_node=null, on_finished=null)\n loadDataFromUrl('/my_data');\n loadDataFromUrl('/my_data', node1);\n loadDataFromUrl('/my_data', node1, function() { console.log('finished'); });\n loadDataFromUrl('/my_data', null, function() { console.log('finished'); });\n\n - loadDataFromUrl(parent_node=null, on_finished=null)\n loadDataFromUrl();\n loadDataFromUrl(node1);\n loadDataFromUrl(null, function() { console.log('finished'); });\n loadDataFromUrl(node1, function() { console.log('finished'); });\n */\n public loadDataFromUrl(\n param1: string | null | Node,\n param2?: Node | null | HandleFinishedLoading,\n param3?: HandleFinishedLoading,\n ): JQuery {\n if (typeof param1 === \"string\") {\n // first parameter is url\n this.doLoadDataFromUrl(\n param1,\n param2 as Node | null,\n param3 ?? null,\n );\n } else {\n // first parameter is not url\n this.doLoadDataFromUrl(\n null,\n param1,\n param2 as HandleFinishedLoading | null,\n );\n }\n\n return this.element;\n }\n\n public reload(onFinished: HandleFinishedLoading | null): JQuery {\n this.doLoadDataFromUrl(null, null, onFinished);\n return this.element;\n }\n\n public refresh(): JQuery {\n this.refreshElements(null);\n return this.element;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.tree.getNodeById(nodeId);\n }\n\n public getNodeByName(name: string): Node | null {\n return this.tree.getNodeByName(name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n return this.tree.getNodeByNameMustExist(name);\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.tree.getNodesByProperty(key, value);\n }\n\n public getNodeByHtmlElement(\n inputElement: HTMLElement | JQuery,\n ): Node | null {\n const element =\n inputElement instanceof HTMLElement\n ? inputElement\n : inputElement[0];\n\n if (!element) {\n return null;\n }\n\n return this.getNode(element);\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n return this.tree.getNodeByCallback(callback);\n }\n\n public openNode(\n node: Node,\n param1?: boolean | OnFinishOpenNode,\n param2?: OnFinishOpenNode,\n ): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const parseParams = (): [boolean, OnFinishOpenNode | undefined] => {\n let onFinished: OnFinishOpenNode | null;\n let slide: boolean | null;\n\n if (isFunction(param1)) {\n onFinished = param1 as OnFinishOpenNode;\n slide = null;\n } else {\n slide = param1 as boolean;\n onFinished = param2 as OnFinishOpenNode;\n }\n\n if (slide == null) {\n slide = this.options.slide ?? false;\n }\n\n return [slide, onFinished];\n };\n\n const [slide, onFinished] = parseParams();\n\n this.openNodeInternal(node, slide, onFinished);\n return this.element;\n }\n\n public closeNode(node: Node, slideParam?: null | boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.isFolder() || node.isEmptyFolder) {\n this.createFolderElement(node).close(\n slide,\n this.options.animationSpeed,\n );\n\n this.saveState();\n }\n\n return this.element;\n }\n\n public isDragging(): boolean {\n return this.dndHandler.isDragging;\n }\n\n public refreshHitAreas(): JQuery {\n this.dndHandler.refresh();\n return this.element;\n }\n\n public addNodeAfter(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n const newNode = existingNode.addAfter(newNodeInfo);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addNodeBefore(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addBefore(newNodeInfo);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addParentNode(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addParent(newNodeInfo);\n\n if (newNode) {\n this.refreshElements(newNode.parent);\n }\n\n return newNode;\n }\n\n public removeNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!node.parent) {\n throw Error(\"Node has no parent\");\n }\n\n this.selectNodeHandler.removeFromSelection(node, true); // including children\n\n const parent = node.parent;\n node.remove();\n this.refreshElements(parent);\n\n return this.element;\n }\n\n public appendNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam || this.tree;\n\n const node = parentNode.append(newNodeInfo);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n public prependNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam ?? this.tree;\n\n const node = parentNode.prepend(newNodeInfo);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n public updateNode(node: Node, data: NodeData): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\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 as Node[]);\n }\n }\n\n this.refreshElements(node);\n\n return this.element;\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 public moveNode(node: Node, targetNode: Node, position: string): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!targetNode) {\n throw Error(PARAM_IS_EMPTY + \"targetNode\");\n }\n\n const positionIndex = getPosition(position);\n\n if (positionIndex !== undefined) {\n this.tree.moveNode(node, targetNode, positionIndex);\n this.refreshElements(null);\n }\n\n return this.element;\n }\n\n public getStateFromStorage(): SavedState | null {\n return this.saveStateHandler.getStateFromStorage();\n }\n\n public addToSelection(node: Node, mustSetFocus?: boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.addToSelection(node);\n this.openParents(node);\n\n this.getNodeElementForNode(node).select(\n mustSetFocus === undefined ? true : mustSetFocus,\n );\n\n this.saveState();\n\n return this.element;\n }\n\n public getSelectedNodes(): Node[] {\n return this.selectNodeHandler.getSelectedNodes();\n }\n\n public isNodeSelected(node: Node): boolean {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n return this.selectNodeHandler.isNodeSelected(node);\n }\n\n public removeFromSelection(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.removeFromSelection(node);\n\n this.getNodeElementForNode(node).deselect();\n this.saveState();\n\n return this.element;\n }\n\n public scrollToNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const top =\n getOffsetTop(node.element) -\n getOffsetTop(this.$el.get(0) as HTMLElement);\n\n this.scrollHandler.scrollToY(top);\n\n return this.element;\n }\n\n public getState(): SavedState | null {\n return this.saveStateHandler.getState();\n }\n\n public setState(state: SavedState): JQuery {\n this.saveStateHandler.setInitialState(state);\n this.refreshElements(null);\n\n return this.element;\n }\n\n public setOption(option: string, value: unknown): JQuery {\n (this.options as unknown as Record)[option] = value;\n return this.element;\n }\n\n public moveDown(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveDown(selectedNode);\n }\n\n return this.element;\n }\n\n public moveUp(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveUp(selectedNode);\n }\n\n return this.element;\n }\n\n public getVersion(): string {\n return __version__;\n }\n\n private openNodeInternal(\n node: Node,\n slide = true,\n onFinished?: OnFinishOpenNode,\n ): void {\n const doOpenNode = (\n _node: Node,\n _slide: boolean,\n _onFinished?: OnFinishOpenNode,\n ): void => {\n const folderElement = this.createFolderElement(_node);\n folderElement.open(\n _onFinished,\n _slide,\n this.options.animationSpeed,\n );\n };\n\n if (node.isFolder() || node.isEmptyFolder) {\n if (node.load_on_demand) {\n this.loadFolderOnDemand(node, slide, onFinished);\n } else {\n let parent = node.parent;\n\n while (parent) {\n // nb: do not open root element\n if (parent.parent) {\n doOpenNode(parent, false);\n }\n parent = parent.parent;\n }\n\n doOpenNode(node, slide, onFinished);\n this.saveState();\n }\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 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 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 public init(): void {\n super.init();\n\n this.element = this.$el;\n this.isInitialized = false;\n\n this.options.rtl = this.getRtlOption();\n\n if (this.options.closedIcon == null) {\n this.options.closedIcon = this.getDefaultClosedIcon();\n }\n\n this.connectHandlers();\n\n this.initData();\n }\n\n public deinit(): void {\n this.element.empty();\n this.element.off();\n\n this.keyHandler.deinit();\n this.mouseHandler.deinit();\n\n this.tree = new Node({}, true);\n\n super.deinit();\n }\n\n private triggerEvent(\n eventName: string,\n values?: Record,\n ): JQuery.Event {\n const event = jQuery.Event(eventName, values);\n this.element.trigger(event);\n return event;\n }\n\n private mouseCapture(positionInfo: PositionInfo): boolean | null {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseCapture(positionInfo);\n } else {\n return false;\n }\n }\n\n private mouseStart(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseStart(positionInfo);\n } else {\n return false;\n }\n }\n\n private mouseDrag(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n const result = this.dndHandler.mouseDrag(positionInfo);\n\n this.scrollHandler.checkScrolling(positionInfo);\n return result;\n } else {\n return false;\n }\n }\n\n private mouseStop(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n this.scrollHandler.stopScrolling();\n return this.dndHandler.mouseStop(positionInfo);\n } else {\n return false;\n }\n }\n\n private initData(): void {\n if (this.options.data) {\n this.doLoadData(this.options.data, null);\n } else {\n const dataUrl = this.getDataUrlInfo(null);\n\n if (dataUrl) {\n this.doLoadDataFromUrl(null, null, null);\n } else {\n this.doLoadData([], null);\n }\n }\n }\n\n private getDataUrlInfo(node: Node | null): JQuery.AjaxSettings | null {\n const dataUrl =\n this.options.dataUrl || (this.element.data(\"url\") as string | null);\n\n const getUrlFromString = (url: string): JQuery.AjaxSettings => {\n const urlInfo: JQuery.AjaxSettings = { url };\n\n setUrlInfoData(urlInfo);\n\n return urlInfo;\n };\n\n const setUrlInfoData = (urlInfo: JQuery.AjaxSettings): void => {\n if (node?.id) {\n // Load on demand of a subtree; add node parameter\n const data = { node: node.id };\n urlInfo[\"data\"] = data;\n } else {\n // Add selected_node parameter\n const selectedNodeId = this.getNodeIdToBeSelected();\n if (selectedNodeId) {\n const data = { selected_node: selectedNodeId };\n urlInfo[\"data\"] = data;\n }\n }\n };\n\n if (typeof dataUrl === \"function\") {\n return dataUrl(node);\n } else if (typeof dataUrl === \"string\") {\n return getUrlFromString(dataUrl);\n } else if (dataUrl && typeof dataUrl === \"object\") {\n setUrlInfoData(dataUrl);\n return dataUrl;\n } else {\n return null;\n }\n }\n\n private getNodeIdToBeSelected(): NodeId | null {\n if (this.options.saveState) {\n return this.saveStateHandler.getNodeIdToBeSelected();\n } else {\n return null;\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 if (!this.options.nodeClass) {\n return;\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 doInit();\n } else {\n // Load data on demand and then init the tree\n this.setInitialStateOnDemand(doInit);\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 if (!this.options.saveState) {\n return [false, false];\n } else {\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\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 // Call cb_finished when done\n private setInitialStateOnDemand(cbFinished: () => void): void {\n const restoreState = (): boolean => {\n if (!this.options.saveState) {\n return false;\n } else {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (!state) {\n return false;\n } else {\n this.saveStateHandler.setInitialStateOnDemand(\n state,\n cbFinished,\n );\n\n return true;\n }\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 this.openNodeInternal(node, false, () => {\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 this.openNodeInternal(node, false);\n\n return level !== maxLevel;\n }\n });\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n openNodes();\n };\n\n if (!restoreState()) {\n autoOpenNodes();\n }\n }\n\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 } else {\n return 0;\n }\n }\n\n private getNode(element: HTMLElement): null | Node {\n const liElement = element.closest(\"li.jqtree_common\");\n\n if (liElement) {\n return jQuery(liElement).data(\"node\") as Node;\n } else {\n return null;\n }\n }\n\n private saveState(): void {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n }\n\n private selectCurrentNode(mustSetFocus: boolean): void {\n const node = this.getSelectedNode();\n if (node) {\n const nodeElement = this.getNodeElementForNode(node);\n if (nodeElement) {\n nodeElement.select(mustSetFocus);\n }\n }\n }\n\n private deselectCurrentNode(): void {\n const node = this.getSelectedNode();\n if (node) {\n this.removeFromSelection(node);\n }\n }\n\n private getDefaultClosedIcon(): string {\n if (this.options.rtl) {\n // triangle to the left\n return \"◀\";\n } else {\n // triangle to the right\n return \"►\";\n }\n }\n\n private getRtlOption(): boolean {\n if (this.options.rtl != null) {\n return this.options.rtl;\n } else {\n const dataRtl = this.element.data(\"rtl\") as unknown;\n\n if (\n dataRtl !== null &&\n dataRtl !== false &&\n dataRtl !== undefined\n ) {\n return true;\n } else {\n return false;\n }\n }\n }\n\n private doSelectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): void {\n const saveState = (): void => {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n };\n\n if (!node) {\n // Called with empty node -> deselect current node\n this.deselectCurrentNode();\n saveState();\n return;\n }\n const defaultOptions = { mustSetFocus: true, mustToggle: true };\n const selectOptions = { ...defaultOptions, ...(optionsParam || {}) };\n\n const canSelect = (): boolean => {\n if (this.options.onCanSelectNode) {\n return (\n this.options.selectable === true &&\n this.options.onCanSelectNode(node)\n );\n } else {\n return this.options.selectable === true;\n }\n };\n\n if (!canSelect()) {\n return;\n }\n\n if (this.selectNodeHandler.isNodeSelected(node)) {\n if (selectOptions.mustToggle) {\n this.deselectCurrentNode();\n this.triggerEvent(\"tree.select\", {\n node: null,\n previous_node: node,\n });\n }\n } else {\n const deselectedNode = this.getSelectedNode() || null;\n this.deselectCurrentNode();\n this.addToSelection(node, selectOptions.mustSetFocus);\n\n this.triggerEvent(\"tree.select\", {\n node,\n deselected_node: deselectedNode,\n });\n this.openParents(node);\n }\n\n saveState();\n }\n\n private doLoadData(data: NodeData[] | null, parentNode: Node | null): 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.load_data\", {\n tree_data: data,\n parent_node: parentNode,\n });\n }\n\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 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 doLoadDataFromUrl(\n urlInfoParam: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null,\n ): void {\n const urlInfo = urlInfoParam || this.getDataUrlInfo(parentNode);\n\n this.dataLoader.loadFromUrl(urlInfo, parentNode, onFinished);\n }\n\n private loadFolderOnDemand(\n node: Node,\n slide = true,\n onFinished?: OnFinishOpenNode,\n ): void {\n node.is_loading = true;\n\n this.doLoadDataFromUrl(null, node, () => {\n this.openNodeInternal(node, slide, onFinished);\n });\n }\n\n private containsElement(element: HTMLElement): boolean {\n const node = this.getNode(element);\n\n return node != null && node.tree === this.tree;\n }\n\n private isFocusOnTree(): boolean {\n const activeElement = document.activeElement;\n\n return Boolean(\n activeElement &&\n activeElement.tagName === \"SPAN\" &&\n this.containsElement(activeElement as HTMLElement),\n );\n }\n\n private connectHandlers() {\n const {\n autoEscape,\n buttonLeft,\n closedIcon,\n dataFilter,\n dragAndDrop,\n keyboardSupport,\n onCanMove,\n onCreateLi,\n onDragMove,\n onDragStop,\n onGetStateFromStorage,\n onIsMoveHandle,\n onLoadFailed,\n onLoading,\n onSetStateFromStorage,\n openedIcon,\n openFolderDelay,\n rtl,\n saveState,\n showEmptyFolder,\n slide,\n tabIndex,\n } = this.options;\n\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.openNodeInternal.bind(this);\n const refreshElements = this.refreshElements.bind(this);\n const refreshHitAreas = this.refreshHitAreas.bind(this);\n const selectNode = this.selectNode.bind(this);\n const $treeElement = this.element;\n const treeElement = this.element.get(0) as HTMLElement;\n const triggerEvent = this.triggerEvent.bind(this);\n\n const selectNodeHandler = new SelectNodeHandler({\n getNodeById,\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 getMouseDelay = () => this.options.startDndDelay ?? 0;\n\n const dataLoader = new DataLoader({\n dataFilter,\n loadData,\n onLoadFailed,\n onLoading,\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,\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 getNodeElement,\n getNodeElementForNode,\n getScrollLeft,\n getTree,\n onCanMove,\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 closedIcon,\n dragAndDrop,\n $element: $treeElement,\n getTree,\n isNodeSelected,\n onCreateLi,\n openedIcon,\n rtl,\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 element: treeElement,\n getMouseDelay,\n getNode,\n onClickButton: this.toggle.bind(this),\n onClickTitle: this.doSelectNode.bind(this),\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\n private createFolderElement(node: Node) {\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.element;\n const triggerEvent = this.triggerEvent.bind(this);\n\n return new FolderElement({\n closedIconElement,\n getScrollLeft,\n node,\n openedIconElement,\n tabIndex,\n $treeElement,\n triggerEvent,\n });\n }\n\n private createNodeElement(node: Node) {\n const getScrollLeft = this.scrollHandler.getScrollLeft.bind(\n this.scrollHandler,\n );\n const tabIndex = this.options.tabIndex;\n const $treeElement = this.element;\n\n return new NodeElement({\n getScrollLeft,\n node,\n tabIndex,\n $treeElement,\n });\n }\n\n private openParents(node: Node) {\n const parent = node.parent;\n\n if (parent && parent.parent && !parent.is_open) {\n this.openNode(parent, false);\n }\n }\n}\n\nSimpleWidget.register(JqTreeWidget, \"tree\");\n"],"names":["version","Position","positionNames","before","Before","after","After","inside","Inside","none","None","getPositionName","position","name","Object","prototype","hasOwnProperty","call","getPosition","DragElement","constructor","_ref","autoEscape","nodeName","offsetX","offsetY","treeElement","element","createElement","appendChild","move","pageX","pageY","style","left","top","remove","document","classList","add","textContent","innerHTML","isInt","n","isFunction","v","getBoolString","value","getOffsetTop","getElementPosition","rect","getBoundingClientRect","x","window","scrollX","y","scrollY","iterateVisibleNodes","tree","handleAfterOpenFolder","handleClosedFolder","handleFirstNode","handleNode","handleOpenFolder","isFirstNode","iterate","node","nextNode","mustIterateInside","is_open","hasChildren","offsetParent","childrenLength","children","length","forEach","_","i","child","nextChild","generatePositions","currentNode","positions","lastTop","addPosition","area","bottom","push","generateHitAreasForGroup","hitAreas","positionsInGroup","positionCount","Math","min","areaHeight","round","areaTop","generateHitAreasFromPositions","treeBottom","previousTop","group","generateHitAreas","DragAndDropHandler","getNodeElement","getNodeElementForNode","getScrollLeft","getTree","onCanMove","onCanMoveTo","onDragMove","onDragStop","onIsMoveHandle","openNode","refreshElements","slide","triggerEvent","hoveredArea","isDragging","currentItem","mouseCapture","positionInfo","target","mustCaptureElement","jQuery","nodeElement","mouseStart","refresh","dragElement","mouseDrag","findHoveredArea","canMoveToArea","isFolder","stopOpenFolderTimer","mustOpenFolderTimer","startOpenFolderTimer","updateDropHint","removeDropHint","originalEvent","mouseStop","moveItem","clear","removeHover","removeHitAreas","getTreeDimensions","positionName","previousGhost","dimensions","right","low","high","mid","addDropHint","folder","openFolder","openFolderDelay","openFolderTimer","setTimeout","clearTimeout","movedNode","targetNode","previousParent","parent","doMove","moveNode","event","move_info","moved_node","target_node","previous_parent","do_move","original_event","isDefaultPrevented","treePosition","clientWidth","clientHeight","ElementsRenderer","buttonLeft","closedIcon","onCreateLi","dragAndDrop","$element","isNodeSelected","openedIcon","rtl","showEmptyFolder","tabIndex","openedIconElement","createButtonElement","closedIconElement","render","fromNode","renderFromNode","renderFromRoot","empty","createDomElements","$previousLi","li","createLi","getLevel","attachNodeData","isRootNode","level","ul","createUl","data","classString","role","className","setAttribute","isSelected","Boolean","mustShowFolder","isEmptyFolder","createFolderLi","createNodeLi","setTreeItemAriaAttributes","buttonClasses","getButtonClasses","folderClasses","getFolderClasses","iconElement","div","buttonLink","cloneNode","titleSpan","createTitleSpan","liClasses","join","classes","undefined","is_loading","createTextNode","nodeType","DataLoader","dataFilter","loadData","onLoadFailed","onLoading","loadFromUrl","urlInfo","parentNode","onFinished","getDomElement","addLoadingClass","notifyLoading","stopLoading","removeLoadingClass","handleSuccess","parseData","handleError","jqXHR","submitRequest","isLoading","$el","urlInfoInput","url","ajaxSettings","method","cache","dataType","success","error","toUpperCase","ajax","getParsedData","JSON","parse","parsedData","KeyHandler","closeNode","getSelectedNode","isFocusOnTree","keyboardSupport","selectNode","originalSelectNode","handleKeyDownHandler","handleKeyDown","bind","addEventListener","deinit","removeEventListener","moveDown","selectedNode","getNextVisibleNode","moveUp","getPreviousVisibleNode","moveRight","moveLeft","getParent","e","canHandleKeyboard","key","getPositionInfoFromMouseEvent","getPositionInfoFromTouch","touch","MouseHandler","getMouseDelay","getNode","onClickButton","onClickTitle","onMouseCapture","onMouseDrag","onMouseStart","onMouseStop","useContextMenu","handleClick","handleDblclick","mouseDown","passive","touchStart","handleContextmenu","isMouseStarted","mouseDelayTimer","isMouseDelayMet","mouseDownInfo","removeMouseMoveEventListeners","button","result","handleMouseDown","cancelable","preventDefault","handleMouseUp","handleStartMouse","mouseMove","touchMove","mouseUp","touchEnd","mouseDelay","startMouseDelayTimer","handleMouseMove","touches","clickTarget","getClickTarget","type","stopPropagation","click_event","closest","jqTreeElement","SaveStateHandler","addToSelection","getNodeById","getSelectedNodes","onGetStateFromStorage","onSetStateFromStorage","removeFromSelection","saveState","saveStateOption","state","stringify","getState","supportsLocalStorage","localStorage","setItem","getKeyName","getStateFromStorage","jsonData","loadFromStorage","parseState","getOpenNodeIds","openNodes","id","getSelectedNodeIds","selectedNodeIds","open_nodes","selected_node","setInitialState","mustLoadOnDemand","openInitialNodes","resetSelection","selectInitialNodes","setInitialStateOnDemand","cbFinished","doSetInitialStateOnDemand","getNodeIdToBeSelected","getItem","nodeIds","nodeId","load_on_demand","selectCount","selectedNodes","nodeIdsParam","loadingCount","newNodesIds","loadAndOpenNode","testSupport","sessionStorage","removeItem","_supportsLocalStorage","ContainerScrollParent","container","refreshHitAreas","checkHorizontalScrolling","newHorizontalScrollDirection","getNewHorizontalScrollDirection","horizontalScrollDirection","horizontalScrollTimeout","verticalScrollTimeout","scrollHorizontally","checkVerticalScrolling","newVerticalScrollDirection","getNewVerticalScrollDirection","verticalScrollDirection","scrollVertically","scrollLeft","scrollToY","scrollTop","stopScrolling","scrollParentTop","scrollParentBottom","scrollParentOffset","rightEdge","leftEdge","isNearRightEdge","isNearLeftEdge","getScrollParentTop","getScrollParentBottom","distance","scrollBy","behavior","DocumentScrollParent","documentElement","treeTop","documentScrollHeight","documentScrollWidth","windowWidth","innerWidth","canScrollRight","getDocumentScrollWidth","canScrollDown","getDocumentScrollHeight","scrollHeight","scrollWidth","distanceTop","windowHeight","innerHeight","isOverflow","overflowValue","hasOverFlow","getComputedStyle","overflowX","overflowY","getParentWithOverflow","parentElement","createScrollParent","tagName","ScrollHandler","scrollParent","checkScrolling","getScrollParent","SelectNodeHandler","Set","selectedSingleNode","getSelectedNodesUnder","isParentOf","has","includeChildren","arguments","delete","register","widgetClass","widgetName","getDataKey","getWidgetData","el","dataKey","widget","SimpleWidget","createWidget","options","get","existingWidget","simpleWidgetClass","init","destroyWidget","destroy","removeData","callFunction","functionName","args","simpleWidget","widgetFunction","apply","fn","argument1","_len","Array","_key","defaults","isNodeRecordWithChildren","Node","nodeData","isRoot","nodeClass","setData","idMapping","Map","o","loadFromData","removeChildren","childData","createNode","addChild","setParent","addChildAtPosition","index","splice","removeChild","doRemoveChild","getChildIndex","indexOf","callback","_iterate","getData","includeParent","getDataFromNodes","nodes","map","tmpNode","k","getNodeByName","getNodeByCallback","getNodeByNameMustExist","addAfter","nodeInfo","childIndex","loadChildrenFromData","addBefore","addParent","newParent","originalParent","append","prepend","addNodeToIndex","set","removeNodeFromIndex","getPreviousSibling","previousIndex","getNextSibling","nextIndex","getNodesByProperty","filter","f","getNextNode","nextSibling","getPreviousNode","previousSibling","getLastChild","lastChild","initFromData","addNode","addChildren","childrenData","getNodeClass","BorderDropHint","querySelector","hint","width","max","offsetWidth","height","GhostDropHint","ghost","createGhostElement","moveAfter","moveBefore","moveInsideOpenFolder","moveInside","childElement","circleSpan","lineSpan","NodeElement","$treeElement","mustShowBorderDropHint","select","mustSetFocus","getTitleSpan","toString","focus","deselect","removeAttribute","blur","getUl","FolderElement","open","animationSpeed","getButton","icon","doOpen","slideDown","show","close","doClose","slideUp","hide","NODE_PARAM_IS_EMPTY","PARAM_IS_EMPTY","JqTreeWidget","autoOpen","dataUrl","onCanSelectNode","selectable","startDndDelay","toggle","slideParam","Error","optionsParam","doSelectNode","selectNodeHandler","toJson","doLoadData","loadDataFromUrl","param1","param2","param3","doLoadDataFromUrl","reload","getNodeByHtmlElement","inputElement","HTMLElement","parseParams","openNodeInternal","createFolderElement","dndHandler","addNodeAfter","newNodeInfo","existingNode","newNode","addNodeBefore","addParentNode","removeNode","appendNode","parentNodeParam","prependNode","updateNode","idIsChanged","isSelectedNodeInSubtree","subtree","positionIndex","saveStateHandler","openParents","scrollToNode","scrollHandler","setState","setOption","option","keyHandler","getVersion","__version__","doOpenNode","_node","_slide","_onFinished","folderElement","loadFolderOnDemand","mustSelect","renderer","selectCurrentNode","createNodeElement","isInitialized","getRtlOption","getDefaultClosedIcon","connectHandlers","initData","off","mouseHandler","eventName","values","Event","trigger","getDataUrlInfo","getUrlFromString","setUrlInfoData","selectedNodeId","initTree","doInit","restoreState","autoOpenNodes","maxLevel","getAutoOpenMaxLevel","isRestored","parseInt","liElement","deselectCurrentNode","dataRtl","defaultOptions","mustToggle","selectOptions","canSelect","previous_node","deselectedNode","deselected_node","deselectNodes","loadSubtree","tree_data","parent_node","selectedNodesUnderParent","urlInfoParam","dataLoader","containsElement","activeElement"],"mappings":"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"} \ No newline at end of file diff --git a/tree.jquery.js b/tree.jquery.js index 6c2e7eb6..5801d776 100644 --- a/tree.jquery.js +++ b/tree.jquery.js @@ -17,5 +17,5 @@ limitations under the License. @license */ -var jqtree=function(e){"use strict";let t=function(e){return e[e.Before=1]="Before",e[e.After=2]="After",e[e.Inside=3]="Inside",e[e.None=4]="None",e}({});const o={before:t.Before,after:t.After,inside:t.Inside,none:t.None},n=e=>{for(const t in o)if(Object.prototype.hasOwnProperty.call(o,t)&&o[t]===e)return t;return""};class r{constructor(e){let{autoEscape:t,nodeName:o,offsetX:n,offsetY:r,treeElement:s}=e;this.offsetX=n,this.offsetY=r,this.element=this.createElement(o,t),s.appendChild(this.element)}move(e,t){this.element.style.left=e-this.offsetX+"px",this.element.style.top=t-this.offsetY+"px"}remove(){this.element.remove()}createElement(e,t){const o=document.createElement("span");return o.classList.add("jqtree-title","jqtree-dragging"),t?o.textContent=e:o.innerHTML=e,o.style.position="absolute",o}}const s=e=>e?"true":"false",i=e=>l(e).top,l=e=>{const t=e.getBoundingClientRect();return{left:t.x+window.scrollX,top:t.y+window.scrollY}},d=(e,t,o,n)=>{const r=Math.min(t.length,4),s=Math.round((n-o)/r);let i=o,l=0;for(;l{const r=((e,o)=>{const n=[];let r=0;const s=(e,t,o)=>{const s={top:o,bottom:0,node:e,position:t};n.push(s),r=o};return((e,t)=>{let{handleAfterOpenFolder:o,handleClosedFolder:n,handleFirstNode:r,handleNode:s,handleOpenFolder:i}=t,l=!0;const d=(e,t)=>{let a=(e.is_open||!e.element)&&e.hasChildren(),h=null;if(e.element?.offsetParent&&(h=e.element,l&&(r(e),l=!1),e.hasChildren()?e.is_open?i(e,e.element)||(a=!1):n(e,t,h):s(e,t,e.element)),a){const n=e.children.length;e.children.forEach(((t,o)=>{const r=e.children[o];if(r)if(o===n-1)d(r,null);else{const t=e.children[o+1];t&&d(r,t)}})),e.is_open&&h&&o(e,t)}};d(e,null)})(e,{handleAfterOpenFolder:(e,n)=>{s(e,e===o||n===o?t.None:t.After,r)},handleClosedFolder:(e,n,r)=>{const l=i(r);e===o?s(e,t.None,l):(s(e,t.Inside,l),n!==o&&s(e,t.After,l))},handleFirstNode:e=>{e!==o&&s(e,t.Before,i(e.element))},handleNode:(e,n,r)=>{const l=i(r);s(e,e===o?t.None:t.Inside,l),s(e,n===o||e===o?t.None:t.After,l)},handleOpenFolder:(e,n)=>e!==o&&(e.children[0]!==o&&s(e,t.Inside,i(n)),!0)}),n})(e,o);return((e,t)=>{let o=e[0]?.top??0,n=[];const r=[];for(const t of e)t.top!==o&&n.length&&(d(r,n,o,t.top),o=t.top,n=[]),n.push(t);return d(r,n,o,t),r})(r,n)};class h{constructor(e){let{autoEscape:t,getNodeElement:o,getNodeElementForNode:n,getScrollLeft:r,getTree:s,onCanMove:i,onCanMoveTo:l,onDragMove:d,onDragStop:a,onIsMoveHandle:h,openNode:c,refreshElements:u,slide:m,treeElement:g,triggerEvent:p}=e;this.autoEscape=t,this.getNodeElement=o,this.getNodeElementForNode=n,this.getScrollLeft=r,this.getTree=s,this.onCanMove=i,this.onCanMoveTo=l,this.onDragMove=d,this.onDragStop=a,this.onIsMoveHandle=h,this.openNode=c,this.refreshElements=u,this.slide=m,this.treeElement=g,this.triggerEvent=p,this.hoveredArea=null,this.hitAreas=[],this.isDragging=!1,this.currentItem=null}mouseCapture(e){const t=e.target;if(!this.mustCaptureElement(t))return null;if(this.onIsMoveHandle&&!this.onIsMoveHandle(jQuery(t)))return null;let o=this.getNodeElement(t);return o&&this.onCanMove&&(this.onCanMove(o.node)||(o=null)),this.currentItem=o,null!=this.currentItem}mouseStart(e){if(!this.currentItem)return!1;this.refresh();const{left:t,top:o}=l(e.target),n=this.currentItem.node;return this.dragElement=new r({autoEscape:this.autoEscape??!0,nodeName:n.name,offsetX:e.pageX-t,offsetY:e.pageY-o,treeElement:this.treeElement}),this.isDragging=!0,this.currentItem.element.classList.add("jqtree-moving"),!0}mouseDrag(e){if(!this.currentItem||!this.dragElement)return!1;this.dragElement.move(e.pageX,e.pageY);const t=this.findHoveredArea(e.pageX,e.pageY);return t&&this.canMoveToArea(t)?(t.node.isFolder()||this.stopOpenFolderTimer(),this.hoveredArea!==t&&(this.hoveredArea=t,this.mustOpenFolderTimer(t)?this.startOpenFolderTimer(t.node):this.stopOpenFolderTimer(),this.updateDropHint())):(this.removeDropHint(),this.stopOpenFolderTimer(),this.hoveredArea=t),t||this.onDragMove&&this.onDragMove(this.currentItem.node,e.originalEvent),!0}mouseStop(e){this.moveItem(e),this.clear(),this.removeHover(),this.removeDropHint(),this.removeHitAreas();const t=this.currentItem;return this.currentItem&&(this.currentItem.element.classList.remove("jqtree-moving"),this.currentItem=null),this.isDragging=!1,!this.hoveredArea&&t&&this.onDragStop&&this.onDragStop(t.node,e.originalEvent),!1}refresh(){this.removeHitAreas(),this.currentItem&&(this.generateHitAreas(),this.currentItem=this.getNodeElementForNode(this.currentItem.node),this.isDragging&&this.currentItem.element.classList.add("jqtree-moving"))}generateHitAreas(){const e=this.getTree();this.currentItem&&e?this.hitAreas=a(e,this.currentItem.node,this.getTreeDimensions().bottom):this.hitAreas=[]}mustCaptureElement(e){const t=e.nodeName;return"INPUT"!==t&&"SELECT"!==t&&"TEXTAREA"!==t}canMoveToArea(e){if(!this.onCanMoveTo)return!0;if(!this.currentItem)return!1;const t=n(e.position);return this.onCanMoveTo(this.currentItem.node,e.node,t)}removeHitAreas(){this.hitAreas=[]}clear(){this.dragElement&&(this.dragElement.remove(),this.dragElement=null)}removeDropHint(){this.previousGhost&&this.previousGhost.remove()}removeHover(){this.hoveredArea=null}findHoveredArea(e,t){const o=this.getTreeDimensions();if(eo.right||t>o.bottom)return null;let n=0,r=this.hitAreas.length;for(;n>1,o=this.hitAreas[e];if(!o)return null;if(to.bottom))return o;n=e+1}}return null}mustOpenFolderTimer(e){const o=e.node;return o.isFolder()&&!o.is_open&&e.position===t.Inside}updateDropHint(){if(!this.hoveredArea)return;this.removeDropHint();const e=this.getNodeElementForNode(this.hoveredArea.node);this.previousGhost=e.addDropHint(this.hoveredArea.position)}startOpenFolderTimer(e){const t=()=>{this.openNode(e,this.slide,(()=>{this.refresh(),this.updateDropHint()}))};this.stopOpenFolderTimer();const o=this.openFolderDelay;!1!==o&&(this.openFolderTimer=window.setTimeout(t,o))}stopOpenFolderTimer(){this.openFolderTimer&&(clearTimeout(this.openFolderTimer),this.openFolderTimer=null)}moveItem(e){if(this.currentItem&&this.hoveredArea&&this.hoveredArea.position!==t.None&&this.canMoveToArea(this.hoveredArea)){const o=this.currentItem.node,r=this.hoveredArea.node,s=this.hoveredArea.position,i=o.parent;s===t.Inside&&(this.hoveredArea.node.is_open=!0);const l=()=>{const e=this.getTree();e&&(e.moveNode(o,r,s),this.treeElement.textContent="",this.refreshElements(null))};this.triggerEvent("tree.move",{move_info:{moved_node:o,target_node:r,position:n(s),previous_parent:i,do_move:l,original_event:e.originalEvent}}).isDefaultPrevented()||l()}}getTreeDimensions(){const e=l(this.treeElement),t=e.left+this.getScrollLeft(),o=e.top;return{left:t,top:o,right:t+this.treeElement.clientWidth,bottom:o+this.treeElement.clientHeight+16}}}class c{constructor(e){let{autoEscape:t,buttonLeft:o,closedIcon:n,onCreateLi:r,dragAndDrop:s,$element:i,getTree:l,isNodeSelected:d,openedIcon:a,rtl:h,showEmptyFolder:c,tabIndex:u}=e;this.autoEscape=t,this.buttonLeft=o,this.dragAndDrop=s,this.$element=i,this.getTree=l,this.isNodeSelected=d,this.onCreateLi=r,this.rtl=h,this.showEmptyFolder=c,this.tabIndex=u,this.openedIconElement=this.createButtonElement(a||"+"),this.closedIconElement=this.createButtonElement(n||"-")}render(e){e&&e.parent?this.renderFromNode(e):this.renderFromRoot()}renderFromRoot(){this.$element.empty();const e=this.getTree();this.$element[0]&&e&&this.createDomElements(this.$element[0],e.children,!0,1)}renderFromNode(e){const t=jQuery(e.element),o=this.createLi(e,e.getLevel());this.attachNodeData(e,o),t.after(o),t.remove(),e.children&&this.createDomElements(o,e.children,!1,e.getLevel()+1)}createDomElements(e,t,o,n){const r=this.createUl(o);e.appendChild(r);for(const e of t){const t=this.createLi(e,n);r.appendChild(t),this.attachNodeData(e,t),e.hasChildren()&&this.createDomElements(t,e.children,!1,n+1)}}attachNodeData(e,t){e.element=t,jQuery(t).data("node",e)}createUl(e){let t,o;e?(t="jqtree-tree",o="tree",this.rtl&&(t+=" jqtree-rtl")):(t="",o="group"),this.dragAndDrop&&(t+=" jqtree-dnd");const n=document.createElement("ul");return n.className=`jqtree_common ${t}`,n.setAttribute("role",o),n}createLi(e,t){const o=Boolean(this.isNodeSelected(e)),n=e.isFolder()||e.isEmptyFolder&&this.showEmptyFolder?this.createFolderLi(e,t,o):this.createNodeLi(e,t,o);return this.onCreateLi&&this.onCreateLi(e,jQuery(n),o),n}setTreeItemAriaAttributes(e,t,o,n){e.setAttribute("aria-label",t),e.setAttribute("aria-level",`${o}`),e.setAttribute("aria-selected",s(n)),e.setAttribute("role","treeitem")}createFolderLi(e,t,o){const n=this.getButtonClasses(e),r=this.getFolderClasses(e,o),i=e.is_open?this.openedIconElement:this.closedIconElement,l=document.createElement("li");l.className=`jqtree_common ${r}`,l.setAttribute("role","none");const d=document.createElement("div");d.className="jqtree-element jqtree_common",d.setAttribute("role","none"),l.appendChild(d);const a=document.createElement("a");a.className=n,i&&a.appendChild(i.cloneNode(!0)),this.buttonLeft&&d.appendChild(a);const h=this.createTitleSpan(e.name,o,!0,t);return h.setAttribute("aria-expanded",s(e.is_open)),d.appendChild(h),this.buttonLeft||d.appendChild(a),l}createNodeLi(e,t,o){const n=["jqtree_common"];o&&n.push("jqtree-selected");const r=n.join(" "),s=document.createElement("li");s.className=r,s.setAttribute("role","none");const i=document.createElement("div");i.className="jqtree-element jqtree_common",i.setAttribute("role","none"),s.appendChild(i);const l=this.createTitleSpan(e.name,o,!1,t);return i.appendChild(l),s}createTitleSpan(e,t,o,n){const r=document.createElement("span");let s="jqtree-title jqtree_common";if(o&&(s+=" jqtree-title-folder"),s+=" jqtree-title-button-"+(this.buttonLeft?"left":"right"),r.className=s,t){const e=this.tabIndex;void 0!==e&&r.setAttribute("tabindex",`${e}`)}return this.setTreeItemAriaAttributes(r,e,n,t),this.autoEscape?r.textContent=e:r.innerHTML=e,r}getButtonClasses(e){const t=["jqtree-toggler","jqtree_common"];return e.is_open||t.push("jqtree-closed"),this.buttonLeft?t.push("jqtree-toggler-left"):t.push("jqtree-toggler-right"),t.join(" ")}getFolderClasses(e,t){const o=["jqtree-folder"];return e.is_open||o.push("jqtree-closed"),t&&o.push("jqtree-selected"),e.is_loading&&o.push("jqtree-loading"),o.join(" ")}createButtonElement(e){if("string"==typeof e){const t=document.createElement("div");return t.innerHTML=e,document.createTextNode(t.innerHTML)}return null==e?void 0:e.nodeType?e:jQuery(e)[0]}}class u{constructor(e){let{dataFilter:t,loadData:o,onLoadFailed:n,treeElement:r,triggerEvent:s}=e;this.dataFilter=t,this.loadData=o,this.onLoadFailed=n,this.treeElement=r,this.triggerEvent=s}loadFromUrl(e,t,o){if(!e)return;const n=this.getDomElement(t);this.addLoadingClass(n),this.notifyLoading(!0,t);const r=()=>{this.removeLoadingClass(n),this.notifyLoading(!1,t)};this.submitRequest(e,(e=>{r(),this.loadData(this.parseData(e),t),o&&"function"==typeof o&&o()}),(e=>{r(),this.onLoadFailed&&this.onLoadFailed(e)}))}addLoadingClass(e){e.classList.add("jqtree-loading")}removeLoadingClass(e){e.classList.remove("jqtree-loading")}getDomElement(e){return e?e.element:this.treeElement}notifyLoading(e,t){this.triggerEvent("tree.loading_data",{isLoading:e,node:t})}submitRequest(e,t,o){const n={method:"GET",cache:!1,dataType:"json",success:t,error:o,..."string"==typeof e?{url:e}:e};n.method=n.method?.toUpperCase()||"GET",jQuery.ajax(n)}parseData(e){const t="string"==typeof e?JSON.parse(e):e;return this.dataFilter?this.dataFilter(t):t}}class m{constructor(e){let{closeNode:t,getSelectedNode:o,isFocusOnTree:n,keyboardSupport:r,openNode:s,selectNode:i}=e;this.closeNode=t,this.getSelectedNode=o,this.isFocusOnTree=n,this.keyboardSupport=r,this.openNode=s,this.originalSelectNode=i,r&&(this.handleKeyDownHandler=this.handleKeyDown.bind(this),document.addEventListener("keydown",this.handleKeyDownHandler))}deinit(){this.handleKeyDownHandler&&document.removeEventListener("keydown",this.handleKeyDownHandler)}moveDown(e){return this.selectNode(e.getNextVisibleNode())}moveUp(e){return this.selectNode(e.getPreviousVisibleNode())}moveRight(e){return!e.isFolder()||(e.is_open?this.selectNode(e.getNextVisibleNode()):(this.openNode(e),!1))}moveLeft(e){return e.isFolder()&&e.is_open?(this.closeNode(e),!1):this.selectNode(e.getParent())}selectNode(e){return!e||(this.originalSelectNode(e),!1)}handleKeyDown=e=>{if(!this.canHandleKeyboard())return!0;const t=this.getSelectedNode();if(!t)return!0;switch(e.key){case"ArrowDown":return this.moveDown(t);case"ArrowUp":return this.moveUp(t);case"ArrowRight":return this.moveRight(t);case"ArrowLeft":return this.moveLeft(t);default:return!0}};canHandleKeyboard(){return this.keyboardSupport&&this.isFocusOnTree()}}const g=e=>({originalEvent:e,pageX:e.pageX,pageY:e.pageY,target:e.target}),p=(e,t)=>({originalEvent:t,pageX:e.pageX,pageY:e.pageY,target:e.target});class f{constructor(e){let{element:t,getMouseDelay:o,getNode:n,onClickButton:r,onClickTitle:s,onMouseCapture:i,onMouseDrag:l,onMouseStart:d,onMouseStop:a,triggerEvent:h,useContextMenu:c}=e;this.element=t,this.getMouseDelay=o,this.getNode=n,this.onClickButton=r,this.onClickTitle=s,this.onMouseCapture=i,this.onMouseDrag=l,this.onMouseStart=d,this.onMouseStop=a,this.triggerEvent=h,this.useContextMenu=c,t.addEventListener("click",this.handleClick),t.addEventListener("dblclick",this.handleDblclick),t.addEventListener("mousedown",this.mouseDown,{passive:!1}),t.addEventListener("touchstart",this.touchStart,{passive:!1}),c&&t.addEventListener("contextmenu",this.handleContextmenu),this.isMouseStarted=!1,this.mouseDelayTimer=null,this.isMouseDelayMet=!1,this.mouseDownInfo=null}deinit(){this.element.removeEventListener("click",this.handleClick),this.element.removeEventListener("dblclick",this.handleDblclick),this.useContextMenu&&this.element.removeEventListener("contextmenu",this.handleContextmenu),this.element.removeEventListener("mousedown",this.mouseDown),this.element.removeEventListener("touchstart",this.touchStart),this.removeMouseMoveEventListeners()}mouseDown=e=>{if(0!==e.button)return;this.handleMouseDown(g(e))&&e.cancelable&&e.preventDefault()};handleMouseDown(e){return this.isMouseStarted&&this.handleMouseUp(e),this.mouseDownInfo=e,!!this.onMouseCapture(e)&&(this.handleStartMouse(),!0)}handleStartMouse(){document.addEventListener("mousemove",this.mouseMove,{passive:!1}),document.addEventListener("touchmove",this.touchMove,{passive:!1}),document.addEventListener("mouseup",this.mouseUp,{passive:!1}),document.addEventListener("touchend",this.touchEnd,{passive:!1});const e=this.getMouseDelay();e?this.startMouseDelayTimer(e):this.isMouseDelayMet=!0}startMouseDelayTimer(e){this.mouseDelayTimer&&clearTimeout(this.mouseDelayTimer),this.mouseDelayTimer=window.setTimeout((()=>{this.mouseDownInfo&&(this.isMouseDelayMet=!0)}),e),this.isMouseDelayMet=!1}mouseMove=e=>{this.handleMouseMove(e,g(e))};handleMouseMove(e,t){if(this.isMouseStarted)return this.onMouseDrag(t),void(e.cancelable&&e.preventDefault());this.isMouseDelayMet&&(this.mouseDownInfo&&(this.isMouseStarted=!1!==this.onMouseStart(this.mouseDownInfo)),this.isMouseStarted?(this.onMouseDrag(t),e.cancelable&&e.preventDefault()):this.handleMouseUp(t))}mouseUp=e=>{this.handleMouseUp(g(e))};handleMouseUp(e){this.removeMouseMoveEventListeners(),this.isMouseDelayMet=!1,this.mouseDownInfo=null,this.isMouseStarted&&(this.isMouseStarted=!1,this.onMouseStop(e))}removeMouseMoveEventListeners(){document.removeEventListener("mousemove",this.mouseMove),document.removeEventListener("touchmove",this.touchMove),document.removeEventListener("mouseup",this.mouseUp),document.removeEventListener("touchend",this.touchEnd)}touchStart=e=>{if(!e)return;if(e.touches.length>1)return;const t=e.touches[0];t&&this.handleMouseDown(p(t,e))};touchMove=e=>{if(!e)return;if(e.touches.length>1)return;const t=e.touches[0];t&&this.handleMouseMove(e,p(t,e))};touchEnd=e=>{if(!e)return;if(e.touches.length>1)return;const t=e.touches[0];t&&this.handleMouseUp(p(t,e))};handleClick=e=>{if(!e.target)return;const t=this.getClickTarget(e.target);if(t)if("button"===t.type)this.onClickButton(t.node),e.preventDefault(),e.stopPropagation();else if("label"===t.type){this.triggerEvent("tree.click",{node:t.node,click_event:e}).isDefaultPrevented()||this.onClickTitle(t.node)}};handleDblclick=e=>{if(!e.target)return;const t=this.getClickTarget(e.target);"label"===t?.type&&this.triggerEvent("tree.dblclick",{node:t.node,click_event:e})};handleContextmenu=e=>{if(!e.target)return;const t=e.target.closest("ul.jqtree-tree .jqtree-element");if(t){const o=this.getNode(t);if(o)return e.preventDefault(),e.stopPropagation(),this.triggerEvent("tree.contextmenu",{node:o,click_event:e}),!1}return null};getClickTarget(e){const t=e.closest(".jqtree-toggler");if(t){const e=this.getNode(t);if(e)return{type:"button",node:e}}else{const t=e.closest(".jqtree-element");if(t){const e=this.getNode(t);if(e)return{type:"label",node:e}}}return null}}class S{constructor(e){let{addToSelection:t,getNodeById:o,getSelectedNodes:n,getTree:r,onGetStateFromStorage:s,onSetStateFromStorage:i,openNode:l,refreshElements:d,removeFromSelection:a,saveState:h}=e;this.addToSelection=t,this.getNodeById=o,this.getSelectedNodes=n,this.getTree=r,this.onGetStateFromStorage=s,this.onSetStateFromStorage=i,this.openNode=l,this.refreshElements=d,this.removeFromSelection=a,this.saveStateOption=h}saveState(){const e=JSON.stringify(this.getState());this.onSetStateFromStorage?this.onSetStateFromStorage(e):this.supportsLocalStorage()&&localStorage.setItem(this.getKeyName(),e)}getStateFromStorage(){const e=this.loadFromStorage();return e?this.parseState(e):null}getState(){return{open_nodes:(()=>{const e=[];return this.getTree()?.iterate((t=>(t.is_open&&t.id&&t.hasChildren()&&e.push(t.id),!0))),e})(),selected_node:(()=>{const e=[];return this.getSelectedNodes().forEach((t=>{null!=t.id&&e.push(t.id)})),e})()}}setInitialState(e){if(e){let t=!1;return e.open_nodes&&(t=this.openInitialNodes(e.open_nodes)),e.selected_node&&(this.resetSelection(),this.selectInitialNodes(e.selected_node)),t}return!1}setInitialStateOnDemand(e,t){e?this.doSetInitialStateOnDemand(e.open_nodes,e.selected_node,t):t()}getNodeIdToBeSelected(){const e=this.getStateFromStorage();return e&&e.selected_node&&e.selected_node[0]||null}parseState(e){const t=JSON.parse(e);var o;return t&&t.selected_node&&("number"==typeof(o=t.selected_node)&&o%1==0)&&(t.selected_node=[t.selected_node]),t}loadFromStorage(){return this.onGetStateFromStorage?this.onGetStateFromStorage():this.supportsLocalStorage()?localStorage.getItem(this.getKeyName()):null}openInitialNodes(e){let t=!1;for(const o of e){const e=this.getNodeById(o);e&&(e.load_on_demand?t=!0:e.is_open=!0)}return t}selectInitialNodes(e){let t=0;for(const o of e){const e=this.getNodeById(o);e&&(t+=1,this.addToSelection(e))}return 0!==t}resetSelection(){this.getSelectedNodes().forEach((e=>{this.removeFromSelection(e)}))}doSetInitialStateOnDemand(e,t,o){let n=0,r=e;const s=()=>{const e=[];for(const t of r){const o=this.getNodeById(t);o?o.is_loading||(o.load_on_demand?i(o):this.openNode(o,!1)):e.push(t)}r=e,this.selectInitialNodes(t)&&this.refreshElements(null),0===n&&o()},i=e=>{n+=1,this.openNode(e,!1,(()=>{n-=1,s()}))};s()}getKeyName(){return"string"==typeof this.saveStateOption?this.saveStateOption:"tree"}supportsLocalStorage(){return null==this._supportsLocalStorage&&(this._supportsLocalStorage=(()=>{if(null==localStorage)return!1;try{const e="_storage_test";sessionStorage.setItem(e,"value"),sessionStorage.removeItem(e)}catch(e){return!1}return!0})()),this._supportsLocalStorage}}class v{constructor(e){let{container:t,refreshHitAreas:o}=e;this.container=t,this.refreshHitAreas=o}checkHorizontalScrolling(e){const t=this.getNewHorizontalScrollDirection(e);this.horizontalScrollDirection!==t&&(this.horizontalScrollDirection=t,null!=this.horizontalScrollTimeout&&window.clearTimeout(this.verticalScrollTimeout),t&&(this.horizontalScrollTimeout=window.setTimeout(this.scrollHorizontally.bind(this),40)))}checkVerticalScrolling(e){const t=this.getNewVerticalScrollDirection(e);this.verticalScrollDirection!==t&&(this.verticalScrollDirection=t,null!=this.verticalScrollTimeout&&(window.clearTimeout(this.verticalScrollTimeout),this.verticalScrollTimeout=void 0),t&&(this.verticalScrollTimeout=window.setTimeout(this.scrollVertically.bind(this),40)))}getScrollLeft(){return this.container.scrollLeft}scrollToY(e){this.container.scrollTop=e}stopScrolling(){this.horizontalScrollDirection=void 0,this.verticalScrollDirection=void 0,this.scrollParentTop=void 0,this.scrollParentBottom=void 0}getNewHorizontalScrollDirection(e){const t=l(this.container),o=t.left+this.container.clientWidth,n=t.left;return e>o-20?"right":ethis.getScrollParentBottom()?"bottom":void 0}scrollHorizontally(){if(!this.horizontalScrollDirection)return;const e="left"===this.horizontalScrollDirection?-20:20;this.container.scrollBy({left:e,top:0,behavior:"instant"}),this.refreshHitAreas(),setTimeout(this.scrollHorizontally.bind(this),40)}scrollVertically(){if(!this.verticalScrollDirection)return;const e="top"===this.verticalScrollDirection?-20:20;this.container.scrollBy({left:0,top:e,behavior:"instant"}),this.refreshHitAreas(),setTimeout(this.scrollVertically.bind(this),40)}getScrollParentTop(){return null==this.scrollParentTop&&(this.scrollParentTop=i(this.container)),this.scrollParentTop}getScrollParentBottom(){return null==this.scrollParentBottom&&(this.scrollParentBottom=this.getScrollParentTop()+this.container.clientHeight),this.scrollParentBottom}}class N{constructor(e){let{refreshHitAreas:t,treeElement:o}=e;this.refreshHitAreas=t,this.treeElement=o}checkHorizontalScrolling(e){const t=this.getNewHorizontalScrollDirection(e);this.horizontalScrollDirection!==t&&(this.horizontalScrollDirection=t,null!=this.horizontalScrollTimeout&&window.clearTimeout(this.horizontalScrollTimeout),t&&(this.horizontalScrollTimeout=window.setTimeout(this.scrollHorizontally.bind(this),40)))}checkVerticalScrolling(e){const t=this.getNewVerticalScrollDirection(e);this.verticalScrollDirection!==t&&(this.verticalScrollDirection=t,null!=this.verticalScrollTimeout&&(window.clearTimeout(this.verticalScrollTimeout),this.verticalScrollTimeout=void 0),t&&(this.verticalScrollTimeout=window.setTimeout(this.scrollVertically.bind(this),40)))}getScrollLeft(){return document.documentElement.scrollLeft}scrollToY(e){const t=i(this.treeElement);document.documentElement.scrollTop=e+t}stopScrolling(){this.horizontalScrollDirection=void 0,this.verticalScrollDirection=void 0,this.documentScrollHeight=void 0,this.documentScrollWidth=void 0}getNewHorizontalScrollDirection(e){const t=e-document.documentElement.scrollLeft<20;return e>window.innerWidth-20&&this.canScrollRight()?"right":t?"left":void 0}canScrollRight(){const e=document.documentElement;return e.scrollLeft+e.clientWidth"auto"===e||"scroll"===e,D=e=>{const t=getComputedStyle(e);return E(t.overflowX)||E(t.overflowY)},y=(e,t)=>{const o=(e=>{if(D(e))return e;let t=e.parentElement;for(;t;){if(D(t))return t;t=t.parentElement}return null})(e);return o&&"HTML"!==o.tagName?new v({container:o,refreshHitAreas:t}):new N({refreshHitAreas:t,treeElement:e})};class b{constructor(e){let{refreshHitAreas:t,treeElement:o}=e;this.refreshHitAreas=t,this.scrollParent=void 0,this.treeElement=o}checkScrolling(e){this.checkVerticalScrolling(e),this.checkHorizontalScrolling(e)}stopScrolling(){this.getScrollParent().stopScrolling()}scrollToY(e){this.getScrollParent().scrollToY(e)}getScrollLeft(){return this.getScrollParent().getScrollLeft()}checkVerticalScrolling(e){this.getScrollParent().checkVerticalScrolling(e.pageY)}checkHorizontalScrolling(e){this.getScrollParent().checkHorizontalScrolling(e.pageX)}getScrollParent(){return this.scrollParent||(this.scrollParent=y(this.treeElement,this.refreshHitAreas)),this.scrollParent}}class I{constructor(e){let{getNodeById:t}=e;this.getNodeById=t,this.selectedNodes=new Set,this.clear()}getSelectedNode(){const e=this.getSelectedNodes();return e.length&&e[0]||!1}getSelectedNodes(){if(this.selectedSingleNode)return[this.selectedSingleNode];{const e=[];return this.selectedNodes.forEach((t=>{const o=this.getNodeById(t);o&&e.push(o)})),e}}getSelectedNodesUnder(e){if(this.selectedSingleNode)return e.isParentOf(this.selectedSingleNode)?[this.selectedSingleNode]:[];{const t=[];for(const o in this.selectedNodes)if(Object.prototype.hasOwnProperty.call(this.selectedNodes,o)){const n=this.getNodeById(o);n&&e.isParentOf(n)&&t.push(n)}return t}}isNodeSelected(e){return null!=e.id?this.selectedNodes.has(e.id):!!this.selectedSingleNode&&this.selectedSingleNode.element===e.element}clear(){this.selectedNodes.clear(),this.selectedSingleNode=null}removeFromSelection(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];null==e.id?this.selectedSingleNode&&e.element===this.selectedSingleNode.element&&(this.selectedSingleNode=null):(this.selectedNodes.delete(e.id),t&&e.iterate((()=>(null!=e.id&&this.selectedNodes.delete(e.id),!0))))}addToSelection(e){null!=e.id?this.selectedNodes.add(e.id):this.selectedSingleNode=e}}const C=(e,t)=>{const o=()=>`simple_widget_${t}`,n=(e,t)=>{const o=jQuery.data(e,t);return o&&o instanceof F?o:null},r=(t,r)=>{const s=o();for(const o of t.get()){if(!n(o,s)){const t=new e(o,r);jQuery.data(o,s)||jQuery.data(o,s,t),t.init()}}return t};jQuery.fn[t]=function(t){if(!t)return r(this,null);if("object"==typeof t){return r(this,t)}if("string"==typeof t&&"_"!==t[0]){const r=t;if("destroy"===r)return(e=>{const t=o();for(const o of e.get()){const e=n(o,t);e&&e.destroy(),jQuery.removeData(o,t)}})(this);if("get_widget_class"===r)return e;for(var s=arguments.length,i=new Array(s>1?s-1:0),l=1;l{let r=null;for(const s of e.get()){const e=jQuery.data(s,o());if(e&&e instanceof F){const o=e[t];o&&"function"==typeof o&&(r=o.apply(e,n))}}return r})(this,r,i)}}};class F{static register(e,t){C(e,t)}static defaults={};constructor(e,t){this.$el=jQuery(e);const o=this.constructor.defaults;this.options={...o,...t}}destroy(){this.deinit()}init(){}deinit(){}}const T=e=>"object"==typeof e&&"children"in e&&e.children instanceof Array;class L{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:L;this.name="",this.load_on_demand=!1,this.isEmptyFolder=null!=e&&T(e)&&0===e.children.length,this.setData(e),this.children=[],this.parent=null,t&&(this.idMapping=new Map,this.tree=this,this.nodeClass=o)}setData(e){if(e)if("string"==typeof e)this.name=e;else if("object"==typeof e)for(const t in e)if(Object.prototype.hasOwnProperty.call(e,t)){const o=e[t];"label"===t||"name"===t?"string"==typeof o&&(this.name=o):"children"!==t&&"parent"!==t&&(this[t]=o)}}loadFromData(e){this.removeChildren();for(const t of e){const e=this.createNode(t);this.addChild(e),T(t)&&e.loadFromData(t.children)}return this}addChild(e){this.children.push(e),e.setParent(this)}addChildAtPosition(e,t){this.children.splice(t,0,e),e.setParent(this)}removeChild(e){e.removeChildren(),this.doRemoveChild(e)}getChildIndex(e){return this.children.indexOf(e)}hasChildren(){return 0!==this.children.length}isFolder(){return this.hasChildren()||this.load_on_demand}iterate(e){const t=(o,n)=>{if(o.children)for(const r of o.children){e(r,n)&&r.hasChildren()&&t(r,n+1)}};t(this,0)}moveNode(e,o,n){if(!e.parent||e.isParentOf(o))return!1;switch(e.parent.doRemoveChild(e),n){case t.After:return!!o.parent&&(o.parent.addChildAtPosition(e,o.parent.getChildIndex(o)+1),!0);case t.Before:return!!o.parent&&(o.parent.addChildAtPosition(e,o.parent.getChildIndex(o)),!0);case t.Inside:return o.addChildAtPosition(e,0),!0;default:return!1}}getData(){const e=t=>t.map((t=>{const o={};for(const e in t)if(-1===["parent","children","element","idMapping","load_on_demand","nodeClass","tree","isEmptyFolder"].indexOf(e)&&Object.prototype.hasOwnProperty.call(t,e)){const n=t[e];o[e]=n}return t.hasChildren()&&(o.children=e(t.children)),o}));return e(arguments.length>0&&void 0!==arguments[0]&&arguments[0]?[this]:this.children)}getNodeByName(e){return this.getNodeByCallback((t=>t.name===e))}getNodeByNameMustExist(e){const t=this.getNodeByCallback((t=>t.name===e));if(!t)throw`Node with name ${e} not found`;return t}getNodeByCallback(e){let t=null;return this.iterate((o=>!t&&(!e(o)||(t=o,!1)))),t}addAfter(e){if(this.parent){const t=this.createNode(e),o=this.parent.getChildIndex(this);return this.parent.addChildAtPosition(t,o+1),t.loadChildrenFromData(e),t}return null}addBefore(e){if(this.parent){const t=this.createNode(e),o=this.parent.getChildIndex(this);return this.parent.addChildAtPosition(t,o),t.loadChildrenFromData(e),t}return null}addParent(e){if(this.parent){const t=this.createNode(e);this.tree&&t.setParent(this.tree);const o=this.parent;for(const e of o.children)t.addChild(e);return o.children=[],o.addChild(t),t}return null}remove(){this.parent&&(this.parent.removeChild(this),this.parent=null)}append(e){const t=this.createNode(e);return this.addChild(t),t.loadChildrenFromData(e),t}prepend(e){const t=this.createNode(e);return this.addChildAtPosition(t,0),t.loadChildrenFromData(e),t}isParentOf(e){let t=e.parent;for(;t;){if(t===this)return!0;t=t.parent}return!1}getLevel(){let e=0,t=this;for(;t.parent;)e+=1,t=t.parent;return e}getNodeById(e){return this.idMapping.get(e)||null}addNodeToIndex(e){null!=e.id&&this.idMapping.set(e.id,e)}removeNodeFromIndex(e){null!=e.id&&this.idMapping.delete(e.id)}removeChildren(){this.iterate((e=>(this.tree?.removeNodeFromIndex(e),!0))),this.children=[]}getPreviousSibling(){if(this.parent){const e=this.parent.getChildIndex(this)-1;return e>=0&&this.parent.children[e]||null}return null}getNextSibling(){if(this.parent){const e=this.parent.getChildIndex(this)+1;return eo[e]===t))}filter(e){const t=[];return this.iterate((o=>(e(o)&&t.push(o),!0))),t}getNextNode(){if((!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&this.hasChildren())return this.children[0]||null;if(this.parent){const e=this.getNextSibling();return e||this.parent.getNextNode(!1)}return null}getNextVisibleNode(){if(this.hasChildren()&&this.is_open)return this.children[0]||null;if(this.parent){const e=this.getNextSibling();return e||this.parent.getNextNode(!1)}return null}getPreviousNode(){if(this.parent){const e=this.getPreviousSibling();return e?e.hasChildren()?e.getLastChild():e:this.getParent()}return null}getPreviousVisibleNode(){if(this.parent){const e=this.getPreviousSibling();return e?e.hasChildren()&&e.is_open?e.getLastChild():e:this.getParent()}return null}getParent(){return this.parent&&this.parent.parent?this.parent:null}getLastChild(){if(this.hasChildren()){const e=this.children[this.children.length-1];return e?e.hasChildren()&&e.is_open?e?.getLastChild():e:null}return null}initFromData(e){const t=e=>{for(const t of e){const e=this.createNode();e.initFromData(t),this.addChild(e)}};(e=>{this.setData(e),T(e)&&e.children.length&&t(e.children)})(e)}setParent(e){this.parent=e,this.tree=e.tree,this.tree?.addNodeToIndex(this)}doRemoveChild(e){this.children.splice(this.getChildIndex(e),1),this.tree?.removeNodeFromIndex(e)}getNodeClass(){return this.nodeClass||this?.tree?.nodeClass||L}createNode(e){return new(this.getNodeClass())(e)}loadChildrenFromData(e){T(e)&&e.children.length&&this.loadFromData(e.children)}}class w{constructor(e,t){const o=e.querySelector(":scope > .jqtree-element");if(!o)return void(this.hint=void 0);const n=Math.max(e.offsetWidth+t-4,0),r=Math.max(e.clientHeight-4,0),s=document.createElement("span");s.className="jqtree-border",s.style.width=`${n}px`,s.style.height=`${r}px`,this.hint=s,o.append(this.hint)}remove(){this.hint?.remove()}}class H{constructor(e,o,n){this.element=o,this.node=e,this.ghost=this.createGhostElement(),n===t.After?this.moveAfter():n===t.Before?this.moveBefore():n===t.Inside&&(e.isFolder()&&e.is_open?this.moveInsideOpenFolder():this.moveInside())}remove(){this.ghost.remove()}moveAfter(){this.element.after(this.ghost)}moveBefore(){this.element.before(this.ghost)}moveInsideOpenFolder(){const e=this.node.children[0]?.element;e&&e.before(this.ghost)}moveInside(){this.element.after(this.ghost),this.ghost.classList.add("jqtree-inside")}createGhostElement(){const e=document.createElement("li");e.className="jqtree_common jqtree-ghost";const t=document.createElement("span");t.className="jqtree_common jqtree-circle",e.append(t);const o=document.createElement("span");return o.className="jqtree_common jqtree-line",e.append(o),e}}class M{constructor(e){let{getScrollLeft:t,node:o,tabIndex:n,$treeElement:r}=e;this.getScrollLeft=t,this.tabIndex=n,this.$treeElement=r,this.init(o)}init(e){if(this.node=e,!e.element){const t=this.$treeElement.get(0);t&&(e.element=t)}e.element&&(this.element=e.element)}addDropHint(e){return this.mustShowBorderDropHint(e)?new w(this.element,this.getScrollLeft()):new H(this.node,this.element,e)}select(e){this.element.classList.add("jqtree-selected");const t=this.getTitleSpan(),o=this.tabIndex;null!=o&&t.setAttribute("tabindex",o.toString()),t.setAttribute("aria-selected","true"),e&&t.focus()}deselect(){this.element.classList.remove("jqtree-selected");const e=this.getTitleSpan();e.removeAttribute("tabindex"),e.setAttribute("aria-selected","false"),e.blur()}getUl(){return this.element.querySelector(":scope > ul")}getTitleSpan(){return this.element.querySelector(":scope > .jqtree-element > span.jqtree-title")}mustShowBorderDropHint(e){return e===t.Inside}}class A extends M{constructor(e){let{closedIconElement:t,getScrollLeft:o,node:n,openedIconElement:r,tabIndex:s,$treeElement:i,triggerEvent:l}=e;super({getScrollLeft:o,node:n,tabIndex:s,$treeElement:i}),this.closedIconElement=t,this.openedIconElement=r,this.triggerEvent=l}open(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"fast";if(this.node.is_open)return;this.node.is_open=!0;const n=this.getButton();n.classList.remove("jqtree-closed"),n.innerHTML="";const r=this.openedIconElement;if(r){const e=r.cloneNode(!0);n.appendChild(e)}const s=()=>{this.element.classList.remove("jqtree-closed");this.getTitleSpan().setAttribute("aria-expanded","true"),e&&e(this.node),this.triggerEvent("tree.open",{node:this.node})};t?jQuery(this.getUl()).slideDown(o,s):(jQuery(this.getUl()).show(),s())}close(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fast";if(!this.node.is_open)return;this.node.is_open=!1;const o=this.getButton();o.classList.add("jqtree-closed"),o.innerHTML="";const n=this.closedIconElement;if(n){const e=n.cloneNode(!0);o.appendChild(e)}const r=()=>{this.element.classList.add("jqtree-closed");this.getTitleSpan().setAttribute("aria-expanded","false"),this.triggerEvent("tree.close",{node:this.node})};e?jQuery(this.getUl()).slideUp(t,r):(jQuery(this.getUl()).hide(),r())}mustShowBorderDropHint(e){return!this.node.is_open&&e===t.Inside}getButton(){return this.element.querySelector(":scope > .jqtree-element > a.jqtree-toggler")}}const _="Node parameter is empty",j="Parameter is empty: ";class x extends F{static defaults={animationSpeed:"fast",autoEscape:!0,autoOpen:!1,buttonLeft:!0,closedIcon:void 0,data:void 0,dataFilter:void 0,dataUrl:void 0,dragAndDrop:!1,keyboardSupport:!0,nodeClass:L,onCanMove:void 0,onCanMoveTo:void 0,onCanSelectNode:void 0,onCreateLi:void 0,onDragMove:void 0,onDragStop:void 0,onGetStateFromStorage:void 0,onIsMoveHandle:void 0,onLoadFailed:void 0,onSetStateFromStorage:void 0,openedIcon:"▼",openFolderDelay:500,rtl:void 0,saveState:!1,selectable:!0,showEmptyFolder:!1,slide:!0,startDndDelay:300,tabIndex:0,useContextMenu:!0};toggle(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(!e)throw Error(_);const o=t??this.options.slide;return e.is_open?this.closeNode(e,o):this.openNode(e,o),this.element}getTree(){return this.tree}selectNode(e,t){return this.doSelectNode(e,t),this.element}getSelectedNode(){return this.selectNodeHandler.getSelectedNode()}toJson(){return JSON.stringify(this.tree.getData())}loadData(e,t){return this.doLoadData(e,t),this.element}loadDataFromUrl(e,t,o){return"string"==typeof e?this.doLoadDataFromUrl(e,t,o??null):this.doLoadDataFromUrl(null,e,t),this.element}reload(e){return this.doLoadDataFromUrl(null,null,e),this.element}refresh(){return this.refreshElements(null),this.element}getNodeById(e){return this.tree.getNodeById(e)}getNodeByName(e){return this.tree.getNodeByName(e)}getNodeByNameMustExist(e){return this.tree.getNodeByNameMustExist(e)}getNodesByProperty(e,t){return this.tree.getNodesByProperty(e,t)}getNodeByHtmlElement(e){const t=e instanceof HTMLElement?e:e[0];return t?this.getNode(t):null}getNodeByCallback(e){return this.tree.getNodeByCallback(e)}openNode(e,t,o){if(!e)throw Error(_);const[n,r]=(()=>{let e,n;return"function"==typeof t?(e=t,n=null):(n=t,e=o),null==n&&(n=this.options.slide??!1),[n,e]})();return this.openNodeInternal(e,n,r),this.element}closeNode(e,t){if(!e)throw Error(_);const o=t??this.options.slide;return(e.isFolder()||e.isEmptyFolder)&&(this.createFolderElement(e).close(o,this.options.animationSpeed),this.saveState()),this.element}isDragging(){return this.dndHandler.isDragging}refreshHitAreas(){return this.dndHandler.refresh(),this.element}addNodeAfter(e,t){const o=t.addAfter(e);return o&&this.refreshElements(t.parent),o}addNodeBefore(e,t){if(!t)throw Error(j+"existingNode");const o=t.addBefore(e);return o&&this.refreshElements(t.parent),o}addParentNode(e,t){if(!t)throw Error(j+"existingNode");const o=t.addParent(e);return o&&this.refreshElements(o.parent),o}removeNode(e){if(!e)throw Error(_);if(!e.parent)throw Error("Node has no parent");this.selectNodeHandler.removeFromSelection(e,!0);const t=e.parent;return e.remove(),this.refreshElements(t),this.element}appendNode(e,t){const o=t||this.tree,n=o.append(e);return this.refreshElements(o),n}prependNode(e,t){const o=t??this.tree,n=o.prepend(e);return this.refreshElements(o),n}updateNode(e,t){if(!e)throw Error(_);const o="object"==typeof t&&t.id&&t.id!==e.id;return o&&this.tree.removeNodeFromIndex(e),e.setData(t),o&&this.tree.addNodeToIndex(e),"object"==typeof t&&t.children&&t.children instanceof Array&&(e.removeChildren(),t.children.length&&e.loadFromData(t.children)),this.refreshElements(e),this.element}isSelectedNodeInSubtree(e){const t=this.getSelectedNode();return!!t&&(e===t||e.isParentOf(t))}moveNode(e,t,n){if(!e)throw Error(_);if(!t)throw Error(j+"targetNode");const r=o[n];return void 0!==r&&(this.tree.moveNode(e,t,r),this.refreshElements(null)),this.element}getStateFromStorage(){return this.saveStateHandler.getStateFromStorage()}addToSelection(e,t){if(!e)throw Error(_);return this.selectNodeHandler.addToSelection(e),this.openParents(e),this.getNodeElementForNode(e).select(void 0===t||t),this.saveState(),this.element}getSelectedNodes(){return this.selectNodeHandler.getSelectedNodes()}isNodeSelected(e){if(!e)throw Error(_);return this.selectNodeHandler.isNodeSelected(e)}removeFromSelection(e){if(!e)throw Error(_);return this.selectNodeHandler.removeFromSelection(e),this.getNodeElementForNode(e).deselect(),this.saveState(),this.element}scrollToNode(e){if(!e)throw Error(_);const t=i(e.element)-i(this.$el.get(0));return this.scrollHandler.scrollToY(t),this.element}getState(){return this.saveStateHandler.getState()}setState(e){return this.saveStateHandler.setInitialState(e),this.refreshElements(null),this.element}setOption(e,t){return this.options[e]=t,this.element}moveDown(){const e=this.getSelectedNode();return e&&this.keyHandler.moveDown(e),this.element}moveUp(){const e=this.getSelectedNode();return e&&this.keyHandler.moveUp(e),this.element}getVersion(){return"1.8.0"}openNodeInternal(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2?arguments[2]:void 0;const n=(e,t,o)=>{this.createFolderElement(e).open(o,t,this.options.animationSpeed)};if(e.isFolder()||e.isEmptyFolder)if(e.load_on_demand)this.loadFolderOnDemand(e,t,o);else{let r=e.parent;for(;r;)r.parent&&n(r,!1),r=r.parent;n(e,t,o),this.saveState()}}refreshElements(e){const t=this.isFocusOnTree(),o=!!e&&this.isSelectedNodeInSubtree(e);this.renderer.render(e),o&&this.selectCurrentNode(t),this.triggerEvent("tree.refresh")}getNodeElementForNode(e){return e.isFolder()?this.createFolderElement(e):this.createNodeElement(e)}getNodeElement(e){const t=this.getNode(e);return t?this.getNodeElementForNode(t):null}init(){super.init(),this.element=this.$el,this.isInitialized=!1,this.options.rtl=this.getRtlOption(),null==this.options.closedIcon&&(this.options.closedIcon=this.getDefaultClosedIcon()),this.connectHandlers(),this.initData()}deinit(){this.element.empty(),this.element.off(),this.keyHandler.deinit(),this.mouseHandler.deinit(),this.tree=new L({},!0),super.deinit()}triggerEvent(e,t){const o=jQuery.Event(e,t);return this.element.trigger(o),o}mouseCapture(e){return!!this.options.dragAndDrop&&this.dndHandler.mouseCapture(e)}mouseStart(e){return!!this.options.dragAndDrop&&this.dndHandler.mouseStart(e)}mouseDrag(e){if(this.options.dragAndDrop){const t=this.dndHandler.mouseDrag(e);return this.scrollHandler.checkScrolling(e),t}return!1}mouseStop(e){return!!this.options.dragAndDrop&&(this.scrollHandler.stopScrolling(),this.dndHandler.mouseStop(e))}initData(){if(this.options.data)this.doLoadData(this.options.data,null);else{this.getDataUrlInfo(null)?this.doLoadDataFromUrl(null,null,null):this.doLoadData([],null)}}getDataUrlInfo(e){const t=this.options.dataUrl||this.element.data("url"),o=t=>{if(e?.id){const o={node:e.id};t.data=o}else{const e=this.getNodeIdToBeSelected();if(e){const o={selected_node:e};t.data=o}}};return"function"==typeof t?t(e):"string"==typeof t?(e=>{const t={url:e};return o(t),t})(t):t&&"object"==typeof t?(o(t),t):null}getNodeIdToBeSelected(){return this.options.saveState?this.saveStateHandler.getNodeIdToBeSelected():null}initTree(e){const t=()=>{this.isInitialized||(this.isInitialized=!0,this.triggerEvent("tree.init"))};if(!this.options.nodeClass)return;this.tree=new this.options.nodeClass(null,!0,this.options.nodeClass),this.selectNodeHandler.clear(),this.tree.loadFromData(e);const o=this.setInitialState();this.refreshElements(null),o?this.setInitialStateOnDemand(t):t()}setInitialState(){const e=()=>{if(!1===this.options.autoOpen)return!1;const e=this.getAutoOpenMaxLevel();let t=!1;return this.tree.iterate(((o,n)=>o.load_on_demand?(t=!0,!1):!!o.hasChildren()&&(o.is_open=!0,n!==e))),t};let[t,o]=(()=>{if(this.options.saveState){const e=this.saveStateHandler.getStateFromStorage();if(e){return[!0,this.saveStateHandler.setInitialState(e)]}return[!1,!1]}return[!1,!1]})();return t||(o=e()),o}setInitialStateOnDemand(e){const t=()=>{const t=this.getAutoOpenMaxLevel();let o=0;const n=e=>{o+=1,this.openNodeInternal(e,!1,(()=>{o-=1,r()}))},r=()=>{this.tree.iterate(((e,o)=>e.load_on_demand?(e.is_loading||n(e),!1):(this.openNodeInternal(e,!1),o!==t))),0===o&&e()};r()};(()=>{if(this.options.saveState){const t=this.saveStateHandler.getStateFromStorage();return!!t&&(this.saveStateHandler.setInitialStateOnDemand(t,e),!0)}return!1})()||t()}getAutoOpenMaxLevel(){return!0===this.options.autoOpen?-1:"number"==typeof this.options.autoOpen?this.options.autoOpen:"string"==typeof this.options.autoOpen?parseInt(this.options.autoOpen,10):0}getNode(e){const t=e.closest("li.jqtree_common");return t?jQuery(t).data("node"):null}saveState(){this.options.saveState&&this.saveStateHandler.saveState()}selectCurrentNode(e){const t=this.getSelectedNode();if(t){const o=this.getNodeElementForNode(t);o&&o.select(e)}}deselectCurrentNode(){const e=this.getSelectedNode();e&&this.removeFromSelection(e)}getDefaultClosedIcon(){return this.options.rtl?"◀":"►"}getRtlOption(){if(null!=this.options.rtl)return this.options.rtl;{const e=this.element.data("rtl");return null!==e&&!1!==e&&void 0!==e}}doSelectNode(e,t){const o=()=>{this.options.saveState&&this.saveStateHandler.saveState()};if(!e)return this.deselectCurrentNode(),void o();const n={mustSetFocus:!0,mustToggle:!0,...t||{}};if((()=>this.options.onCanSelectNode?!0===this.options.selectable&&this.options.onCanSelectNode(e):!0===this.options.selectable)()){if(this.selectNodeHandler.isNodeSelected(e))n.mustToggle&&(this.deselectCurrentNode(),this.triggerEvent("tree.select",{node:null,previous_node:e}));else{const t=this.getSelectedNode()||null;this.deselectCurrentNode(),this.addToSelection(e,n.mustSetFocus),this.triggerEvent("tree.select",{node:e,deselected_node:t}),this.openParents(e)}o()}}doLoadData(e,t){e&&(t?(this.deselectNodes(t),this.loadSubtree(e,t)):this.initTree(e),this.isDragging()&&this.dndHandler.refresh()),this.triggerEvent("tree.load_data",{tree_data:e,parent_node:t})}deselectNodes(e){const t=this.selectNodeHandler.getSelectedNodesUnder(e);for(const e of t)this.selectNodeHandler.removeFromSelection(e)}loadSubtree(e,t){t.loadFromData(e),t.load_on_demand=!1,t.is_loading=!1,this.refreshElements(t)}doLoadDataFromUrl(e,t,o){const n=e||this.getDataUrlInfo(t);this.dataLoader.loadFromUrl(n,t,o)}loadFolderOnDemand(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2?arguments[2]:void 0;e.is_loading=!0,this.doLoadDataFromUrl(null,e,(()=>{this.openNodeInternal(e,t,o)}))}containsElement(e){const t=this.getNode(e);return null!=t&&t.tree===this.tree}isFocusOnTree(){const e=document.activeElement;return Boolean(e&&"SPAN"===e.tagName&&this.containsElement(e))}connectHandlers(){const{autoEscape:e,buttonLeft:t,closedIcon:o,dataFilter:n,dragAndDrop:r,keyboardSupport:s,onCanMove:i,onCreateLi:l,onDragMove:d,onDragStop:a,onGetStateFromStorage:g,onIsMoveHandle:p,onLoadFailed:v,onSetStateFromStorage:N,openedIcon:E,openFolderDelay:D,rtl:y,saveState:C,showEmptyFolder:F,slide:T,tabIndex:L}=this.options,w=this.closeNode.bind(this),H=this.getNodeElement.bind(this),M=this.getNodeElementForNode.bind(this),A=this.getNodeById.bind(this),_=this.getSelectedNode.bind(this),j=this.getTree.bind(this),x=this.isFocusOnTree.bind(this),B=this.loadData.bind(this),P=this.openNodeInternal.bind(this),O=this.refreshElements.bind(this),q=this.refreshHitAreas.bind(this),k=this.selectNode.bind(this),U=this.element,z=this.element.get(0),$=this.triggerEvent.bind(this),V=new I({getNodeById:A}),Q=V.addToSelection.bind(V),Y=V.getSelectedNodes.bind(V),R=V.isNodeSelected.bind(V),X=V.removeFromSelection.bind(V),G=new u({dataFilter:n,loadData:B,onLoadFailed:v,treeElement:z,triggerEvent:$}),W=new S({addToSelection:Q,getNodeById:A,getSelectedNodes:Y,getTree:j,onGetStateFromStorage:g,onSetStateFromStorage:N,openNode:P,refreshElements:O,removeFromSelection:X,saveState:C}),K=new b({refreshHitAreas:q,treeElement:z}),J=K.getScrollLeft.bind(K),Z=new h({autoEscape:e,getNodeElement:H,getNodeElementForNode:M,getScrollLeft:J,getTree:j,onCanMove:i,onDragMove:d,onDragStop:a,onIsMoveHandle:p,openFolderDelay:D,openNode:P,refreshElements:O,slide:T,treeElement:z,triggerEvent:$}),ee=new m({closeNode:w,getSelectedNode:_,isFocusOnTree:x,keyboardSupport:s,openNode:P,selectNode:k}),te=new c({autoEscape:e,buttonLeft:t,closedIcon:o,dragAndDrop:r,$element:U,getTree:j,isNodeSelected:R,onCreateLi:l,openedIcon:E,rtl:y,showEmptyFolder:F,tabIndex:L}),oe=this.getNode.bind(this),ne=this.mouseCapture.bind(this),re=this.mouseDrag.bind(this),se=this.mouseStart.bind(this),ie=this.mouseStop.bind(this),le=new f({element:z,getMouseDelay:()=>this.options.startDndDelay??0,getNode:oe,onClickButton:this.toggle.bind(this),onClickTitle:this.doSelectNode.bind(this),onMouseCapture:ne,onMouseDrag:re,onMouseStart:se,onMouseStop:ie,triggerEvent:$,useContextMenu:this.options.useContextMenu});this.dataLoader=G,this.dndHandler=Z,this.keyHandler=ee,this.mouseHandler=le,this.renderer=te,this.saveStateHandler=W,this.scrollHandler=K,this.selectNodeHandler=V}createFolderElement(e){const t=this.renderer.closedIconElement,o=this.scrollHandler.getScrollLeft.bind(this.scrollHandler),n=this.renderer.openedIconElement,r=this.options.tabIndex,s=this.element,i=this.triggerEvent.bind(this);return new A({closedIconElement:t,getScrollLeft:o,node:e,openedIconElement:n,tabIndex:r,$treeElement:s,triggerEvent:i})}createNodeElement(e){const t=this.scrollHandler.getScrollLeft.bind(this.scrollHandler),o=this.options.tabIndex,n=this.element;return new M({getScrollLeft:t,node:e,tabIndex:o,$treeElement:n})}openParents(e){const t=e.parent;t&&t.parent&&!t.is_open&&this.openNode(t,!1)}}return F.register(x,"tree"),e.JqTreeWidget=x,e}({}); +var jqtree=function(e){"use strict";let t=function(e){return e[e.Before=1]="Before",e[e.After=2]="After",e[e.Inside=3]="Inside",e[e.None=4]="None",e}({});const o={before:t.Before,after:t.After,inside:t.Inside,none:t.None},n=e=>{for(const t in o)if(Object.prototype.hasOwnProperty.call(o,t)&&o[t]===e)return t;return""};class r{constructor(e){let{autoEscape:t,nodeName:o,offsetX:n,offsetY:r,treeElement:s}=e;this.offsetX=n,this.offsetY=r,this.element=this.createElement(o,t),s.appendChild(this.element)}move(e,t){this.element.style.left=e-this.offsetX+"px",this.element.style.top=t-this.offsetY+"px"}remove(){this.element.remove()}createElement(e,t){const o=document.createElement("span");return o.classList.add("jqtree-title","jqtree-dragging"),t?o.textContent=e:o.innerHTML=e,o.style.position="absolute",o}}const s=e=>e?"true":"false",i=e=>l(e).top,l=e=>{const t=e.getBoundingClientRect();return{left:t.x+window.scrollX,top:t.y+window.scrollY}},d=(e,t,o,n)=>{const r=Math.min(t.length,4),s=Math.round((n-o)/r);let i=o,l=0;for(;l{const r=((e,o)=>{const n=[];let r=0;const s=(e,t,o)=>{const s={top:o,bottom:0,node:e,position:t};n.push(s),r=o};return((e,t)=>{let{handleAfterOpenFolder:o,handleClosedFolder:n,handleFirstNode:r,handleNode:s,handleOpenFolder:i}=t,l=!0;const d=(e,t)=>{let a=(e.is_open||!e.element)&&e.hasChildren(),h=null;if(e.element?.offsetParent&&(h=e.element,l&&(r(e),l=!1),e.hasChildren()?e.is_open?i(e,e.element)||(a=!1):n(e,t,h):s(e,t,e.element)),a){const n=e.children.length;e.children.forEach(((t,o)=>{const r=e.children[o];if(r)if(o===n-1)d(r,null);else{const t=e.children[o+1];t&&d(r,t)}})),e.is_open&&h&&o(e,t)}};d(e,null)})(e,{handleAfterOpenFolder:(e,n)=>{s(e,e===o||n===o?t.None:t.After,r)},handleClosedFolder:(e,n,r)=>{const l=i(r);e===o?s(e,t.None,l):(s(e,t.Inside,l),n!==o&&s(e,t.After,l))},handleFirstNode:e=>{e!==o&&s(e,t.Before,i(e.element))},handleNode:(e,n,r)=>{const l=i(r);s(e,e===o?t.None:t.Inside,l),s(e,n===o||e===o?t.None:t.After,l)},handleOpenFolder:(e,n)=>e!==o&&(e.children[0]!==o&&s(e,t.Inside,i(n)),!0)}),n})(e,o);return((e,t)=>{let o=e[0]?.top??0,n=[];const r=[];for(const t of e)t.top!==o&&n.length&&(d(r,n,o,t.top),o=t.top,n=[]),n.push(t);return d(r,n,o,t),r})(r,n)};class h{constructor(e){let{autoEscape:t,getNodeElement:o,getNodeElementForNode:n,getScrollLeft:r,getTree:s,onCanMove:i,onCanMoveTo:l,onDragMove:d,onDragStop:a,onIsMoveHandle:h,openNode:c,refreshElements:u,slide:m,treeElement:g,triggerEvent:p}=e;this.autoEscape=t,this.getNodeElement=o,this.getNodeElementForNode=n,this.getScrollLeft=r,this.getTree=s,this.onCanMove=i,this.onCanMoveTo=l,this.onDragMove=d,this.onDragStop=a,this.onIsMoveHandle=h,this.openNode=c,this.refreshElements=u,this.slide=m,this.treeElement=g,this.triggerEvent=p,this.hoveredArea=null,this.hitAreas=[],this.isDragging=!1,this.currentItem=null}mouseCapture(e){const t=e.target;if(!this.mustCaptureElement(t))return null;if(this.onIsMoveHandle&&!this.onIsMoveHandle(jQuery(t)))return null;let o=this.getNodeElement(t);return o&&this.onCanMove&&(this.onCanMove(o.node)||(o=null)),this.currentItem=o,null!=this.currentItem}mouseStart(e){if(!this.currentItem)return!1;this.refresh();const{left:t,top:o}=l(e.target),n=this.currentItem.node;return this.dragElement=new r({autoEscape:this.autoEscape??!0,nodeName:n.name,offsetX:e.pageX-t,offsetY:e.pageY-o,treeElement:this.treeElement}),this.isDragging=!0,this.currentItem.element.classList.add("jqtree-moving"),!0}mouseDrag(e){if(!this.currentItem||!this.dragElement)return!1;this.dragElement.move(e.pageX,e.pageY);const t=this.findHoveredArea(e.pageX,e.pageY);return t&&this.canMoveToArea(t)?(t.node.isFolder()||this.stopOpenFolderTimer(),this.hoveredArea!==t&&(this.hoveredArea=t,this.mustOpenFolderTimer(t)?this.startOpenFolderTimer(t.node):this.stopOpenFolderTimer(),this.updateDropHint())):(this.removeDropHint(),this.stopOpenFolderTimer(),this.hoveredArea=t),t||this.onDragMove&&this.onDragMove(this.currentItem.node,e.originalEvent),!0}mouseStop(e){this.moveItem(e),this.clear(),this.removeHover(),this.removeDropHint(),this.removeHitAreas();const t=this.currentItem;return this.currentItem&&(this.currentItem.element.classList.remove("jqtree-moving"),this.currentItem=null),this.isDragging=!1,!this.hoveredArea&&t&&this.onDragStop&&this.onDragStop(t.node,e.originalEvent),!1}refresh(){this.removeHitAreas(),this.currentItem&&(this.generateHitAreas(),this.currentItem=this.getNodeElementForNode(this.currentItem.node),this.isDragging&&this.currentItem.element.classList.add("jqtree-moving"))}generateHitAreas(){const e=this.getTree();this.currentItem&&e?this.hitAreas=a(e,this.currentItem.node,this.getTreeDimensions().bottom):this.hitAreas=[]}mustCaptureElement(e){const t=e.nodeName;return"INPUT"!==t&&"SELECT"!==t&&"TEXTAREA"!==t}canMoveToArea(e){if(!this.onCanMoveTo)return!0;if(!this.currentItem)return!1;const t=n(e.position);return this.onCanMoveTo(this.currentItem.node,e.node,t)}removeHitAreas(){this.hitAreas=[]}clear(){this.dragElement&&(this.dragElement.remove(),this.dragElement=null)}removeDropHint(){this.previousGhost&&this.previousGhost.remove()}removeHover(){this.hoveredArea=null}findHoveredArea(e,t){const o=this.getTreeDimensions();if(eo.right||t>o.bottom)return null;let n=0,r=this.hitAreas.length;for(;n>1,o=this.hitAreas[e];if(!o)return null;if(to.bottom))return o;n=e+1}}return null}mustOpenFolderTimer(e){const o=e.node;return o.isFolder()&&!o.is_open&&e.position===t.Inside}updateDropHint(){if(!this.hoveredArea)return;this.removeDropHint();const e=this.getNodeElementForNode(this.hoveredArea.node);this.previousGhost=e.addDropHint(this.hoveredArea.position)}startOpenFolderTimer(e){const t=()=>{this.openNode(e,this.slide,(()=>{this.refresh(),this.updateDropHint()}))};this.stopOpenFolderTimer();const o=this.openFolderDelay;!1!==o&&(this.openFolderTimer=window.setTimeout(t,o))}stopOpenFolderTimer(){this.openFolderTimer&&(clearTimeout(this.openFolderTimer),this.openFolderTimer=null)}moveItem(e){if(this.currentItem&&this.hoveredArea&&this.hoveredArea.position!==t.None&&this.canMoveToArea(this.hoveredArea)){const o=this.currentItem.node,r=this.hoveredArea.node,s=this.hoveredArea.position,i=o.parent;s===t.Inside&&(this.hoveredArea.node.is_open=!0);const l=()=>{const e=this.getTree();e&&(e.moveNode(o,r,s),this.treeElement.textContent="",this.refreshElements(null))};this.triggerEvent("tree.move",{move_info:{moved_node:o,target_node:r,position:n(s),previous_parent:i,do_move:l,original_event:e.originalEvent}}).isDefaultPrevented()||l()}}getTreeDimensions(){const e=l(this.treeElement),t=e.left+this.getScrollLeft(),o=e.top;return{left:t,top:o,right:t+this.treeElement.clientWidth,bottom:o+this.treeElement.clientHeight+16}}}class c{constructor(e){let{autoEscape:t,buttonLeft:o,closedIcon:n,onCreateLi:r,dragAndDrop:s,$element:i,getTree:l,isNodeSelected:d,openedIcon:a,rtl:h,showEmptyFolder:c,tabIndex:u}=e;this.autoEscape=t,this.buttonLeft=o,this.dragAndDrop=s,this.$element=i,this.getTree=l,this.isNodeSelected=d,this.onCreateLi=r,this.rtl=h,this.showEmptyFolder=c,this.tabIndex=u,this.openedIconElement=this.createButtonElement(a||"+"),this.closedIconElement=this.createButtonElement(n||"-")}render(e){e&&e.parent?this.renderFromNode(e):this.renderFromRoot()}renderFromRoot(){this.$element.empty();const e=this.getTree();this.$element[0]&&e&&this.createDomElements(this.$element[0],e.children,!0,1)}renderFromNode(e){const t=jQuery(e.element),o=this.createLi(e,e.getLevel());this.attachNodeData(e,o),t.after(o),t.remove(),e.children&&this.createDomElements(o,e.children,!1,e.getLevel()+1)}createDomElements(e,t,o,n){const r=this.createUl(o);e.appendChild(r);for(const e of t){const t=this.createLi(e,n);r.appendChild(t),this.attachNodeData(e,t),e.hasChildren()&&this.createDomElements(t,e.children,!1,n+1)}}attachNodeData(e,t){e.element=t,jQuery(t).data("node",e)}createUl(e){let t,o;e?(t="jqtree-tree",o="tree",this.rtl&&(t+=" jqtree-rtl")):(t="",o="group"),this.dragAndDrop&&(t+=" jqtree-dnd");const n=document.createElement("ul");return n.className=`jqtree_common ${t}`,n.setAttribute("role",o),n}createLi(e,t){const o=Boolean(this.isNodeSelected(e)),n=e.isFolder()||e.isEmptyFolder&&this.showEmptyFolder?this.createFolderLi(e,t,o):this.createNodeLi(e,t,o);return this.onCreateLi&&this.onCreateLi(e,jQuery(n),o),n}setTreeItemAriaAttributes(e,t,o,n){e.setAttribute("aria-label",t),e.setAttribute("aria-level",`${o}`),e.setAttribute("aria-selected",s(n)),e.setAttribute("role","treeitem")}createFolderLi(e,t,o){const n=this.getButtonClasses(e),r=this.getFolderClasses(e,o),i=e.is_open?this.openedIconElement:this.closedIconElement,l=document.createElement("li");l.className=`jqtree_common ${r}`,l.setAttribute("role","none");const d=document.createElement("div");d.className="jqtree-element jqtree_common",d.setAttribute("role","none"),l.appendChild(d);const a=document.createElement("a");a.className=n,i&&a.appendChild(i.cloneNode(!0)),this.buttonLeft&&d.appendChild(a);const h=this.createTitleSpan(e.name,o,!0,t);return h.setAttribute("aria-expanded",s(e.is_open)),d.appendChild(h),this.buttonLeft||d.appendChild(a),l}createNodeLi(e,t,o){const n=["jqtree_common"];o&&n.push("jqtree-selected");const r=n.join(" "),s=document.createElement("li");s.className=r,s.setAttribute("role","none");const i=document.createElement("div");i.className="jqtree-element jqtree_common",i.setAttribute("role","none"),s.appendChild(i);const l=this.createTitleSpan(e.name,o,!1,t);return i.appendChild(l),s}createTitleSpan(e,t,o,n){const r=document.createElement("span");let s="jqtree-title jqtree_common";if(o&&(s+=" jqtree-title-folder"),s+=" jqtree-title-button-"+(this.buttonLeft?"left":"right"),r.className=s,t){const e=this.tabIndex;void 0!==e&&r.setAttribute("tabindex",`${e}`)}return this.setTreeItemAriaAttributes(r,e,n,t),this.autoEscape?r.textContent=e:r.innerHTML=e,r}getButtonClasses(e){const t=["jqtree-toggler","jqtree_common"];return e.is_open||t.push("jqtree-closed"),this.buttonLeft?t.push("jqtree-toggler-left"):t.push("jqtree-toggler-right"),t.join(" ")}getFolderClasses(e,t){const o=["jqtree-folder"];return e.is_open||o.push("jqtree-closed"),t&&o.push("jqtree-selected"),e.is_loading&&o.push("jqtree-loading"),o.join(" ")}createButtonElement(e){if("string"==typeof e){const t=document.createElement("div");return t.innerHTML=e,document.createTextNode(t.innerHTML)}return null==e?void 0:e.nodeType?e:jQuery(e)[0]}}class u{constructor(e){let{dataFilter:t,loadData:o,onLoadFailed:n,onLoading:r,treeElement:s,triggerEvent:i}=e;this.dataFilter=t,this.loadData=o,this.onLoadFailed=n,this.onLoading=r,this.treeElement=s,this.triggerEvent=i}loadFromUrl(e,t,o){if(!e)return;const n=this.getDomElement(t);this.addLoadingClass(n),this.notifyLoading(!0,t,n);const r=()=>{this.removeLoadingClass(n),this.notifyLoading(!1,t,n)};this.submitRequest(e,(e=>{r(),this.loadData(this.parseData(e),t),o&&"function"==typeof o&&o()}),(e=>{r(),this.onLoadFailed&&this.onLoadFailed(e)}))}addLoadingClass(e){e.classList.add("jqtree-loading")}removeLoadingClass(e){e.classList.remove("jqtree-loading")}getDomElement(e){return e?e.element:this.treeElement}notifyLoading(e,t,o){const n=jQuery(o);this.onLoading&&this.onLoading(e,t,n),this.triggerEvent("tree.loading_data",{isLoading:e,node:t,$el:n})}submitRequest(e,t,o){const n={method:"GET",cache:!1,dataType:"json",success:t,error:o,..."string"==typeof e?{url:e}:e};n.method=n.method?.toUpperCase()||"GET",jQuery.ajax(n)}parseData(e){const t="string"==typeof e?JSON.parse(e):e;return this.dataFilter?this.dataFilter(t):t}}class m{constructor(e){let{closeNode:t,getSelectedNode:o,isFocusOnTree:n,keyboardSupport:r,openNode:s,selectNode:i}=e;this.closeNode=t,this.getSelectedNode=o,this.isFocusOnTree=n,this.keyboardSupport=r,this.openNode=s,this.originalSelectNode=i,r&&(this.handleKeyDownHandler=this.handleKeyDown.bind(this),document.addEventListener("keydown",this.handleKeyDownHandler))}deinit(){this.handleKeyDownHandler&&document.removeEventListener("keydown",this.handleKeyDownHandler)}moveDown(e){return this.selectNode(e.getNextVisibleNode())}moveUp(e){return this.selectNode(e.getPreviousVisibleNode())}moveRight(e){return!e.isFolder()||(e.is_open?this.selectNode(e.getNextVisibleNode()):(this.openNode(e),!1))}moveLeft(e){return e.isFolder()&&e.is_open?(this.closeNode(e),!1):this.selectNode(e.getParent())}selectNode(e){return!e||(this.originalSelectNode(e),!1)}handleKeyDown=e=>{if(!this.canHandleKeyboard())return!0;const t=this.getSelectedNode();if(!t)return!0;switch(e.key){case"ArrowDown":return this.moveDown(t);case"ArrowUp":return this.moveUp(t);case"ArrowRight":return this.moveRight(t);case"ArrowLeft":return this.moveLeft(t);default:return!0}};canHandleKeyboard(){return this.keyboardSupport&&this.isFocusOnTree()}}const g=e=>({originalEvent:e,pageX:e.pageX,pageY:e.pageY,target:e.target}),p=(e,t)=>({originalEvent:t,pageX:e.pageX,pageY:e.pageY,target:e.target});class f{constructor(e){let{element:t,getMouseDelay:o,getNode:n,onClickButton:r,onClickTitle:s,onMouseCapture:i,onMouseDrag:l,onMouseStart:d,onMouseStop:a,triggerEvent:h,useContextMenu:c}=e;this.element=t,this.getMouseDelay=o,this.getNode=n,this.onClickButton=r,this.onClickTitle=s,this.onMouseCapture=i,this.onMouseDrag=l,this.onMouseStart=d,this.onMouseStop=a,this.triggerEvent=h,this.useContextMenu=c,t.addEventListener("click",this.handleClick),t.addEventListener("dblclick",this.handleDblclick),t.addEventListener("mousedown",this.mouseDown,{passive:!1}),t.addEventListener("touchstart",this.touchStart,{passive:!1}),c&&t.addEventListener("contextmenu",this.handleContextmenu),this.isMouseStarted=!1,this.mouseDelayTimer=null,this.isMouseDelayMet=!1,this.mouseDownInfo=null}deinit(){this.element.removeEventListener("click",this.handleClick),this.element.removeEventListener("dblclick",this.handleDblclick),this.useContextMenu&&this.element.removeEventListener("contextmenu",this.handleContextmenu),this.element.removeEventListener("mousedown",this.mouseDown),this.element.removeEventListener("touchstart",this.touchStart),this.removeMouseMoveEventListeners()}mouseDown=e=>{if(0!==e.button)return;this.handleMouseDown(g(e))&&e.cancelable&&e.preventDefault()};handleMouseDown(e){return this.isMouseStarted&&this.handleMouseUp(e),this.mouseDownInfo=e,!!this.onMouseCapture(e)&&(this.handleStartMouse(),!0)}handleStartMouse(){document.addEventListener("mousemove",this.mouseMove,{passive:!1}),document.addEventListener("touchmove",this.touchMove,{passive:!1}),document.addEventListener("mouseup",this.mouseUp,{passive:!1}),document.addEventListener("touchend",this.touchEnd,{passive:!1});const e=this.getMouseDelay();e?this.startMouseDelayTimer(e):this.isMouseDelayMet=!0}startMouseDelayTimer(e){this.mouseDelayTimer&&clearTimeout(this.mouseDelayTimer),this.mouseDelayTimer=window.setTimeout((()=>{this.mouseDownInfo&&(this.isMouseDelayMet=!0)}),e),this.isMouseDelayMet=!1}mouseMove=e=>{this.handleMouseMove(e,g(e))};handleMouseMove(e,t){if(this.isMouseStarted)return this.onMouseDrag(t),void(e.cancelable&&e.preventDefault());this.isMouseDelayMet&&(this.mouseDownInfo&&(this.isMouseStarted=!1!==this.onMouseStart(this.mouseDownInfo)),this.isMouseStarted?(this.onMouseDrag(t),e.cancelable&&e.preventDefault()):this.handleMouseUp(t))}mouseUp=e=>{this.handleMouseUp(g(e))};handleMouseUp(e){this.removeMouseMoveEventListeners(),this.isMouseDelayMet=!1,this.mouseDownInfo=null,this.isMouseStarted&&(this.isMouseStarted=!1,this.onMouseStop(e))}removeMouseMoveEventListeners(){document.removeEventListener("mousemove",this.mouseMove),document.removeEventListener("touchmove",this.touchMove),document.removeEventListener("mouseup",this.mouseUp),document.removeEventListener("touchend",this.touchEnd)}touchStart=e=>{if(!e)return;if(e.touches.length>1)return;const t=e.touches[0];t&&this.handleMouseDown(p(t,e))};touchMove=e=>{if(!e)return;if(e.touches.length>1)return;const t=e.touches[0];t&&this.handleMouseMove(e,p(t,e))};touchEnd=e=>{if(!e)return;if(e.touches.length>1)return;const t=e.touches[0];t&&this.handleMouseUp(p(t,e))};handleClick=e=>{if(!e.target)return;const t=this.getClickTarget(e.target);if(t)if("button"===t.type)this.onClickButton(t.node),e.preventDefault(),e.stopPropagation();else if("label"===t.type){this.triggerEvent("tree.click",{node:t.node,click_event:e}).isDefaultPrevented()||this.onClickTitle(t.node)}};handleDblclick=e=>{if(!e.target)return;const t=this.getClickTarget(e.target);"label"===t?.type&&this.triggerEvent("tree.dblclick",{node:t.node,click_event:e})};handleContextmenu=e=>{if(!e.target)return;const t=e.target.closest("ul.jqtree-tree .jqtree-element");if(t){const o=this.getNode(t);if(o)return e.preventDefault(),e.stopPropagation(),this.triggerEvent("tree.contextmenu",{node:o,click_event:e}),!1}return null};getClickTarget(e){const t=e.closest(".jqtree-toggler");if(t){const e=this.getNode(t);if(e)return{type:"button",node:e}}else{const t=e.closest(".jqtree-element");if(t){const e=this.getNode(t);if(e)return{type:"label",node:e}}}return null}}class S{constructor(e){let{addToSelection:t,getNodeById:o,getSelectedNodes:n,getTree:r,onGetStateFromStorage:s,onSetStateFromStorage:i,openNode:l,refreshElements:d,removeFromSelection:a,saveState:h}=e;this.addToSelection=t,this.getNodeById=o,this.getSelectedNodes=n,this.getTree=r,this.onGetStateFromStorage=s,this.onSetStateFromStorage=i,this.openNode=l,this.refreshElements=d,this.removeFromSelection=a,this.saveStateOption=h}saveState(){const e=JSON.stringify(this.getState());this.onSetStateFromStorage?this.onSetStateFromStorage(e):this.supportsLocalStorage()&&localStorage.setItem(this.getKeyName(),e)}getStateFromStorage(){const e=this.loadFromStorage();return e?this.parseState(e):null}getState(){return{open_nodes:(()=>{const e=[];return this.getTree()?.iterate((t=>(t.is_open&&t.id&&t.hasChildren()&&e.push(t.id),!0))),e})(),selected_node:(()=>{const e=[];return this.getSelectedNodes().forEach((t=>{null!=t.id&&e.push(t.id)})),e})()}}setInitialState(e){if(e){let t=!1;return e.open_nodes&&(t=this.openInitialNodes(e.open_nodes)),e.selected_node&&(this.resetSelection(),this.selectInitialNodes(e.selected_node)),t}return!1}setInitialStateOnDemand(e,t){e?this.doSetInitialStateOnDemand(e.open_nodes,e.selected_node,t):t()}getNodeIdToBeSelected(){const e=this.getStateFromStorage();return e&&e.selected_node&&e.selected_node[0]||null}parseState(e){const t=JSON.parse(e);var o;return t&&t.selected_node&&("number"==typeof(o=t.selected_node)&&o%1==0)&&(t.selected_node=[t.selected_node]),t}loadFromStorage(){return this.onGetStateFromStorage?this.onGetStateFromStorage():this.supportsLocalStorage()?localStorage.getItem(this.getKeyName()):null}openInitialNodes(e){let t=!1;for(const o of e){const e=this.getNodeById(o);e&&(e.load_on_demand?t=!0:e.is_open=!0)}return t}selectInitialNodes(e){let t=0;for(const o of e){const e=this.getNodeById(o);e&&(t+=1,this.addToSelection(e))}return 0!==t}resetSelection(){this.getSelectedNodes().forEach((e=>{this.removeFromSelection(e)}))}doSetInitialStateOnDemand(e,t,o){let n=0,r=e;const s=()=>{const e=[];for(const t of r){const o=this.getNodeById(t);o?o.is_loading||(o.load_on_demand?i(o):this.openNode(o,!1)):e.push(t)}r=e,this.selectInitialNodes(t)&&this.refreshElements(null),0===n&&o()},i=e=>{n+=1,this.openNode(e,!1,(()=>{n-=1,s()}))};s()}getKeyName(){return"string"==typeof this.saveStateOption?this.saveStateOption:"tree"}supportsLocalStorage(){return null==this._supportsLocalStorage&&(this._supportsLocalStorage=(()=>{if(null==localStorage)return!1;try{const e="_storage_test";sessionStorage.setItem(e,"value"),sessionStorage.removeItem(e)}catch(e){return!1}return!0})()),this._supportsLocalStorage}}class v{constructor(e){let{container:t,refreshHitAreas:o}=e;this.container=t,this.refreshHitAreas=o}checkHorizontalScrolling(e){const t=this.getNewHorizontalScrollDirection(e);this.horizontalScrollDirection!==t&&(this.horizontalScrollDirection=t,null!=this.horizontalScrollTimeout&&window.clearTimeout(this.verticalScrollTimeout),t&&(this.horizontalScrollTimeout=window.setTimeout(this.scrollHorizontally.bind(this),40)))}checkVerticalScrolling(e){const t=this.getNewVerticalScrollDirection(e);this.verticalScrollDirection!==t&&(this.verticalScrollDirection=t,null!=this.verticalScrollTimeout&&(window.clearTimeout(this.verticalScrollTimeout),this.verticalScrollTimeout=void 0),t&&(this.verticalScrollTimeout=window.setTimeout(this.scrollVertically.bind(this),40)))}getScrollLeft(){return this.container.scrollLeft}scrollToY(e){this.container.scrollTop=e}stopScrolling(){this.horizontalScrollDirection=void 0,this.verticalScrollDirection=void 0,this.scrollParentTop=void 0,this.scrollParentBottom=void 0}getNewHorizontalScrollDirection(e){const t=l(this.container),o=t.left+this.container.clientWidth,n=t.left;return e>o-20?"right":ethis.getScrollParentBottom()?"bottom":void 0}scrollHorizontally(){if(!this.horizontalScrollDirection)return;const e="left"===this.horizontalScrollDirection?-20:20;this.container.scrollBy({left:e,top:0,behavior:"instant"}),this.refreshHitAreas(),setTimeout(this.scrollHorizontally.bind(this),40)}scrollVertically(){if(!this.verticalScrollDirection)return;const e="top"===this.verticalScrollDirection?-20:20;this.container.scrollBy({left:0,top:e,behavior:"instant"}),this.refreshHitAreas(),setTimeout(this.scrollVertically.bind(this),40)}getScrollParentTop(){return null==this.scrollParentTop&&(this.scrollParentTop=i(this.container)),this.scrollParentTop}getScrollParentBottom(){return null==this.scrollParentBottom&&(this.scrollParentBottom=this.getScrollParentTop()+this.container.clientHeight),this.scrollParentBottom}}class N{constructor(e){let{refreshHitAreas:t,treeElement:o}=e;this.refreshHitAreas=t,this.treeElement=o}checkHorizontalScrolling(e){const t=this.getNewHorizontalScrollDirection(e);this.horizontalScrollDirection!==t&&(this.horizontalScrollDirection=t,null!=this.horizontalScrollTimeout&&window.clearTimeout(this.horizontalScrollTimeout),t&&(this.horizontalScrollTimeout=window.setTimeout(this.scrollHorizontally.bind(this),40)))}checkVerticalScrolling(e){const t=this.getNewVerticalScrollDirection(e);this.verticalScrollDirection!==t&&(this.verticalScrollDirection=t,null!=this.verticalScrollTimeout&&(window.clearTimeout(this.verticalScrollTimeout),this.verticalScrollTimeout=void 0),t&&(this.verticalScrollTimeout=window.setTimeout(this.scrollVertically.bind(this),40)))}getScrollLeft(){return document.documentElement.scrollLeft}scrollToY(e){const t=i(this.treeElement);document.documentElement.scrollTop=e+t}stopScrolling(){this.horizontalScrollDirection=void 0,this.verticalScrollDirection=void 0,this.documentScrollHeight=void 0,this.documentScrollWidth=void 0}getNewHorizontalScrollDirection(e){const t=e-document.documentElement.scrollLeft<20;return e>window.innerWidth-20&&this.canScrollRight()?"right":t?"left":void 0}canScrollRight(){const e=document.documentElement;return e.scrollLeft+e.clientWidth"auto"===e||"scroll"===e,D=e=>{const t=getComputedStyle(e);return E(t.overflowX)||E(t.overflowY)},y=(e,t)=>{const o=(e=>{if(D(e))return e;let t=e.parentElement;for(;t;){if(D(t))return t;t=t.parentElement}return null})(e);return o&&"HTML"!==o.tagName?new v({container:o,refreshHitAreas:t}):new N({refreshHitAreas:t,treeElement:e})};class b{constructor(e){let{refreshHitAreas:t,treeElement:o}=e;this.refreshHitAreas=t,this.scrollParent=void 0,this.treeElement=o}checkScrolling(e){this.checkVerticalScrolling(e),this.checkHorizontalScrolling(e)}stopScrolling(){this.getScrollParent().stopScrolling()}scrollToY(e){this.getScrollParent().scrollToY(e)}getScrollLeft(){return this.getScrollParent().getScrollLeft()}checkVerticalScrolling(e){this.getScrollParent().checkVerticalScrolling(e.pageY)}checkHorizontalScrolling(e){this.getScrollParent().checkHorizontalScrolling(e.pageX)}getScrollParent(){return this.scrollParent||(this.scrollParent=y(this.treeElement,this.refreshHitAreas)),this.scrollParent}}class I{constructor(e){let{getNodeById:t}=e;this.getNodeById=t,this.selectedNodes=new Set,this.clear()}getSelectedNode(){const e=this.getSelectedNodes();return e.length&&e[0]||!1}getSelectedNodes(){if(this.selectedSingleNode)return[this.selectedSingleNode];{const e=[];return this.selectedNodes.forEach((t=>{const o=this.getNodeById(t);o&&e.push(o)})),e}}getSelectedNodesUnder(e){if(this.selectedSingleNode)return e.isParentOf(this.selectedSingleNode)?[this.selectedSingleNode]:[];{const t=[];for(const o in this.selectedNodes)if(Object.prototype.hasOwnProperty.call(this.selectedNodes,o)){const n=this.getNodeById(o);n&&e.isParentOf(n)&&t.push(n)}return t}}isNodeSelected(e){return null!=e.id?this.selectedNodes.has(e.id):!!this.selectedSingleNode&&this.selectedSingleNode.element===e.element}clear(){this.selectedNodes.clear(),this.selectedSingleNode=null}removeFromSelection(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];null==e.id?this.selectedSingleNode&&e.element===this.selectedSingleNode.element&&(this.selectedSingleNode=null):(this.selectedNodes.delete(e.id),t&&e.iterate((()=>(null!=e.id&&this.selectedNodes.delete(e.id),!0))))}addToSelection(e){null!=e.id?this.selectedNodes.add(e.id):this.selectedSingleNode=e}}const C=(e,t)=>{const o=()=>`simple_widget_${t}`,n=(e,t)=>{const o=jQuery.data(e,t);return o&&o instanceof F?o:null},r=(t,r)=>{const s=o();for(const o of t.get()){if(!n(o,s)){const t=new e(o,r);jQuery.data(o,s)||jQuery.data(o,s,t),t.init()}}return t};jQuery.fn[t]=function(t){if(!t)return r(this,null);if("object"==typeof t){return r(this,t)}if("string"==typeof t&&"_"!==t[0]){const r=t;if("destroy"===r)return(e=>{const t=o();for(const o of e.get()){const e=n(o,t);e&&e.destroy(),jQuery.removeData(o,t)}})(this);if("get_widget_class"===r)return e;for(var s=arguments.length,i=new Array(s>1?s-1:0),l=1;l{let r=null;for(const s of e.get()){const e=jQuery.data(s,o());if(e&&e instanceof F){const o=e[t];o&&"function"==typeof o&&(r=o.apply(e,n))}}return r})(this,r,i)}}};class F{static register(e,t){C(e,t)}static defaults={};constructor(e,t){this.$el=jQuery(e);const o=this.constructor.defaults;this.options={...o,...t}}destroy(){this.deinit()}init(){}deinit(){}}const T=e=>"object"==typeof e&&"children"in e&&e.children instanceof Array;class L{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:L;this.name="",this.load_on_demand=!1,this.isEmptyFolder=null!=e&&T(e)&&0===e.children.length,this.setData(e),this.children=[],this.parent=null,t&&(this.idMapping=new Map,this.tree=this,this.nodeClass=o)}setData(e){if(e)if("string"==typeof e)this.name=e;else if("object"==typeof e)for(const t in e)if(Object.prototype.hasOwnProperty.call(e,t)){const o=e[t];"label"===t||"name"===t?"string"==typeof o&&(this.name=o):"children"!==t&&"parent"!==t&&(this[t]=o)}}loadFromData(e){this.removeChildren();for(const t of e){const e=this.createNode(t);this.addChild(e),T(t)&&e.loadFromData(t.children)}return this}addChild(e){this.children.push(e),e.setParent(this)}addChildAtPosition(e,t){this.children.splice(t,0,e),e.setParent(this)}removeChild(e){e.removeChildren(),this.doRemoveChild(e)}getChildIndex(e){return this.children.indexOf(e)}hasChildren(){return 0!==this.children.length}isFolder(){return this.hasChildren()||this.load_on_demand}iterate(e){const t=(o,n)=>{if(o.children)for(const r of o.children){e(r,n)&&r.hasChildren()&&t(r,n+1)}};t(this,0)}moveNode(e,o,n){if(!e.parent||e.isParentOf(o))return!1;switch(e.parent.doRemoveChild(e),n){case t.After:return!!o.parent&&(o.parent.addChildAtPosition(e,o.parent.getChildIndex(o)+1),!0);case t.Before:return!!o.parent&&(o.parent.addChildAtPosition(e,o.parent.getChildIndex(o)),!0);case t.Inside:return o.addChildAtPosition(e,0),!0;default:return!1}}getData(){const e=t=>t.map((t=>{const o={};for(const e in t)if(-1===["parent","children","element","idMapping","load_on_demand","nodeClass","tree","isEmptyFolder"].indexOf(e)&&Object.prototype.hasOwnProperty.call(t,e)){const n=t[e];o[e]=n}return t.hasChildren()&&(o.children=e(t.children)),o}));return e(arguments.length>0&&void 0!==arguments[0]&&arguments[0]?[this]:this.children)}getNodeByName(e){return this.getNodeByCallback((t=>t.name===e))}getNodeByNameMustExist(e){const t=this.getNodeByCallback((t=>t.name===e));if(!t)throw`Node with name ${e} not found`;return t}getNodeByCallback(e){let t=null;return this.iterate((o=>!t&&(!e(o)||(t=o,!1)))),t}addAfter(e){if(this.parent){const t=this.createNode(e),o=this.parent.getChildIndex(this);return this.parent.addChildAtPosition(t,o+1),t.loadChildrenFromData(e),t}return null}addBefore(e){if(this.parent){const t=this.createNode(e),o=this.parent.getChildIndex(this);return this.parent.addChildAtPosition(t,o),t.loadChildrenFromData(e),t}return null}addParent(e){if(this.parent){const t=this.createNode(e);this.tree&&t.setParent(this.tree);const o=this.parent;for(const e of o.children)t.addChild(e);return o.children=[],o.addChild(t),t}return null}remove(){this.parent&&(this.parent.removeChild(this),this.parent=null)}append(e){const t=this.createNode(e);return this.addChild(t),t.loadChildrenFromData(e),t}prepend(e){const t=this.createNode(e);return this.addChildAtPosition(t,0),t.loadChildrenFromData(e),t}isParentOf(e){let t=e.parent;for(;t;){if(t===this)return!0;t=t.parent}return!1}getLevel(){let e=0,t=this;for(;t.parent;)e+=1,t=t.parent;return e}getNodeById(e){return this.idMapping.get(e)||null}addNodeToIndex(e){null!=e.id&&this.idMapping.set(e.id,e)}removeNodeFromIndex(e){null!=e.id&&this.idMapping.delete(e.id)}removeChildren(){this.iterate((e=>(this.tree?.removeNodeFromIndex(e),!0))),this.children=[]}getPreviousSibling(){if(this.parent){const e=this.parent.getChildIndex(this)-1;return e>=0&&this.parent.children[e]||null}return null}getNextSibling(){if(this.parent){const e=this.parent.getChildIndex(this)+1;return eo[e]===t))}filter(e){const t=[];return this.iterate((o=>(e(o)&&t.push(o),!0))),t}getNextNode(){if((!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&this.hasChildren())return this.children[0]||null;if(this.parent){const e=this.getNextSibling();return e||this.parent.getNextNode(!1)}return null}getNextVisibleNode(){if(this.hasChildren()&&this.is_open)return this.children[0]||null;if(this.parent){const e=this.getNextSibling();return e||this.parent.getNextNode(!1)}return null}getPreviousNode(){if(this.parent){const e=this.getPreviousSibling();return e?e.hasChildren()?e.getLastChild():e:this.getParent()}return null}getPreviousVisibleNode(){if(this.parent){const e=this.getPreviousSibling();return e?e.hasChildren()&&e.is_open?e.getLastChild():e:this.getParent()}return null}getParent(){return this.parent&&this.parent.parent?this.parent:null}getLastChild(){if(this.hasChildren()){const e=this.children[this.children.length-1];return e?e.hasChildren()&&e.is_open?e?.getLastChild():e:null}return null}initFromData(e){const t=e=>{for(const t of e){const e=this.createNode();e.initFromData(t),this.addChild(e)}};(e=>{this.setData(e),T(e)&&e.children.length&&t(e.children)})(e)}setParent(e){this.parent=e,this.tree=e.tree,this.tree?.addNodeToIndex(this)}doRemoveChild(e){this.children.splice(this.getChildIndex(e),1),this.tree?.removeNodeFromIndex(e)}getNodeClass(){return this.nodeClass||this?.tree?.nodeClass||L}createNode(e){return new(this.getNodeClass())(e)}loadChildrenFromData(e){T(e)&&e.children.length&&this.loadFromData(e.children)}}class w{constructor(e,t){const o=e.querySelector(":scope > .jqtree-element");if(!o)return void(this.hint=void 0);const n=Math.max(e.offsetWidth+t-4,0),r=Math.max(e.clientHeight-4,0),s=document.createElement("span");s.className="jqtree-border",s.style.width=`${n}px`,s.style.height=`${r}px`,this.hint=s,o.append(this.hint)}remove(){this.hint?.remove()}}class H{constructor(e,o,n){this.element=o,this.node=e,this.ghost=this.createGhostElement(),n===t.After?this.moveAfter():n===t.Before?this.moveBefore():n===t.Inside&&(e.isFolder()&&e.is_open?this.moveInsideOpenFolder():this.moveInside())}remove(){this.ghost.remove()}moveAfter(){this.element.after(this.ghost)}moveBefore(){this.element.before(this.ghost)}moveInsideOpenFolder(){const e=this.node.children[0]?.element;e&&e.before(this.ghost)}moveInside(){this.element.after(this.ghost),this.ghost.classList.add("jqtree-inside")}createGhostElement(){const e=document.createElement("li");e.className="jqtree_common jqtree-ghost";const t=document.createElement("span");t.className="jqtree_common jqtree-circle",e.append(t);const o=document.createElement("span");return o.className="jqtree_common jqtree-line",e.append(o),e}}class M{constructor(e){let{getScrollLeft:t,node:o,tabIndex:n,$treeElement:r}=e;this.getScrollLeft=t,this.tabIndex=n,this.$treeElement=r,this.init(o)}init(e){if(this.node=e,!e.element){const t=this.$treeElement.get(0);t&&(e.element=t)}e.element&&(this.element=e.element)}addDropHint(e){return this.mustShowBorderDropHint(e)?new w(this.element,this.getScrollLeft()):new H(this.node,this.element,e)}select(e){this.element.classList.add("jqtree-selected");const t=this.getTitleSpan(),o=this.tabIndex;null!=o&&t.setAttribute("tabindex",o.toString()),t.setAttribute("aria-selected","true"),e&&t.focus()}deselect(){this.element.classList.remove("jqtree-selected");const e=this.getTitleSpan();e.removeAttribute("tabindex"),e.setAttribute("aria-selected","false"),e.blur()}getUl(){return this.element.querySelector(":scope > ul")}getTitleSpan(){return this.element.querySelector(":scope > .jqtree-element > span.jqtree-title")}mustShowBorderDropHint(e){return e===t.Inside}}class A extends M{constructor(e){let{closedIconElement:t,getScrollLeft:o,node:n,openedIconElement:r,tabIndex:s,$treeElement:i,triggerEvent:l}=e;super({getScrollLeft:o,node:n,tabIndex:s,$treeElement:i}),this.closedIconElement=t,this.openedIconElement=r,this.triggerEvent=l}open(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"fast";if(this.node.is_open)return;this.node.is_open=!0;const n=this.getButton();n.classList.remove("jqtree-closed"),n.innerHTML="";const r=this.openedIconElement;if(r){const e=r.cloneNode(!0);n.appendChild(e)}const s=()=>{this.element.classList.remove("jqtree-closed");this.getTitleSpan().setAttribute("aria-expanded","true"),e&&e(this.node),this.triggerEvent("tree.open",{node:this.node})};t?jQuery(this.getUl()).slideDown(o,s):(jQuery(this.getUl()).show(),s())}close(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fast";if(!this.node.is_open)return;this.node.is_open=!1;const o=this.getButton();o.classList.add("jqtree-closed"),o.innerHTML="";const n=this.closedIconElement;if(n){const e=n.cloneNode(!0);o.appendChild(e)}const r=()=>{this.element.classList.add("jqtree-closed");this.getTitleSpan().setAttribute("aria-expanded","false"),this.triggerEvent("tree.close",{node:this.node})};e?jQuery(this.getUl()).slideUp(t,r):(jQuery(this.getUl()).hide(),r())}mustShowBorderDropHint(e){return!this.node.is_open&&e===t.Inside}getButton(){return this.element.querySelector(":scope > .jqtree-element > a.jqtree-toggler")}}const _="Node parameter is empty",j="Parameter is empty: ";class x extends F{static defaults={animationSpeed:"fast",autoEscape:!0,autoOpen:!1,buttonLeft:!0,closedIcon:void 0,data:void 0,dataFilter:void 0,dataUrl:void 0,dragAndDrop:!1,keyboardSupport:!0,nodeClass:L,onCanMove:void 0,onCanMoveTo:void 0,onCanSelectNode:void 0,onCreateLi:void 0,onDragMove:void 0,onDragStop:void 0,onGetStateFromStorage:void 0,onIsMoveHandle:void 0,onLoadFailed:void 0,onLoading:void 0,onSetStateFromStorage:void 0,openedIcon:"▼",openFolderDelay:500,rtl:void 0,saveState:!1,selectable:!0,showEmptyFolder:!1,slide:!0,startDndDelay:300,tabIndex:0,useContextMenu:!0};toggle(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(!e)throw Error(_);const o=t??this.options.slide;return e.is_open?this.closeNode(e,o):this.openNode(e,o),this.element}getTree(){return this.tree}selectNode(e,t){return this.doSelectNode(e,t),this.element}getSelectedNode(){return this.selectNodeHandler.getSelectedNode()}toJson(){return JSON.stringify(this.tree.getData())}loadData(e,t){return this.doLoadData(e,t),this.element}loadDataFromUrl(e,t,o){return"string"==typeof e?this.doLoadDataFromUrl(e,t,o??null):this.doLoadDataFromUrl(null,e,t),this.element}reload(e){return this.doLoadDataFromUrl(null,null,e),this.element}refresh(){return this.refreshElements(null),this.element}getNodeById(e){return this.tree.getNodeById(e)}getNodeByName(e){return this.tree.getNodeByName(e)}getNodeByNameMustExist(e){return this.tree.getNodeByNameMustExist(e)}getNodesByProperty(e,t){return this.tree.getNodesByProperty(e,t)}getNodeByHtmlElement(e){const t=e instanceof HTMLElement?e:e[0];return t?this.getNode(t):null}getNodeByCallback(e){return this.tree.getNodeByCallback(e)}openNode(e,t,o){if(!e)throw Error(_);const[n,r]=(()=>{let e,n;return"function"==typeof t?(e=t,n=null):(n=t,e=o),null==n&&(n=this.options.slide??!1),[n,e]})();return this.openNodeInternal(e,n,r),this.element}closeNode(e,t){if(!e)throw Error(_);const o=t??this.options.slide;return(e.isFolder()||e.isEmptyFolder)&&(this.createFolderElement(e).close(o,this.options.animationSpeed),this.saveState()),this.element}isDragging(){return this.dndHandler.isDragging}refreshHitAreas(){return this.dndHandler.refresh(),this.element}addNodeAfter(e,t){const o=t.addAfter(e);return o&&this.refreshElements(t.parent),o}addNodeBefore(e,t){if(!t)throw Error(j+"existingNode");const o=t.addBefore(e);return o&&this.refreshElements(t.parent),o}addParentNode(e,t){if(!t)throw Error(j+"existingNode");const o=t.addParent(e);return o&&this.refreshElements(o.parent),o}removeNode(e){if(!e)throw Error(_);if(!e.parent)throw Error("Node has no parent");this.selectNodeHandler.removeFromSelection(e,!0);const t=e.parent;return e.remove(),this.refreshElements(t),this.element}appendNode(e,t){const o=t||this.tree,n=o.append(e);return this.refreshElements(o),n}prependNode(e,t){const o=t??this.tree,n=o.prepend(e);return this.refreshElements(o),n}updateNode(e,t){if(!e)throw Error(_);const o="object"==typeof t&&t.id&&t.id!==e.id;return o&&this.tree.removeNodeFromIndex(e),e.setData(t),o&&this.tree.addNodeToIndex(e),"object"==typeof t&&t.children&&t.children instanceof Array&&(e.removeChildren(),t.children.length&&e.loadFromData(t.children)),this.refreshElements(e),this.element}isSelectedNodeInSubtree(e){const t=this.getSelectedNode();return!!t&&(e===t||e.isParentOf(t))}moveNode(e,t,n){if(!e)throw Error(_);if(!t)throw Error(j+"targetNode");const r=o[n];return void 0!==r&&(this.tree.moveNode(e,t,r),this.refreshElements(null)),this.element}getStateFromStorage(){return this.saveStateHandler.getStateFromStorage()}addToSelection(e,t){if(!e)throw Error(_);return this.selectNodeHandler.addToSelection(e),this.openParents(e),this.getNodeElementForNode(e).select(void 0===t||t),this.saveState(),this.element}getSelectedNodes(){return this.selectNodeHandler.getSelectedNodes()}isNodeSelected(e){if(!e)throw Error(_);return this.selectNodeHandler.isNodeSelected(e)}removeFromSelection(e){if(!e)throw Error(_);return this.selectNodeHandler.removeFromSelection(e),this.getNodeElementForNode(e).deselect(),this.saveState(),this.element}scrollToNode(e){if(!e)throw Error(_);const t=i(e.element)-i(this.$el.get(0));return this.scrollHandler.scrollToY(t),this.element}getState(){return this.saveStateHandler.getState()}setState(e){return this.saveStateHandler.setInitialState(e),this.refreshElements(null),this.element}setOption(e,t){return this.options[e]=t,this.element}moveDown(){const e=this.getSelectedNode();return e&&this.keyHandler.moveDown(e),this.element}moveUp(){const e=this.getSelectedNode();return e&&this.keyHandler.moveUp(e),this.element}getVersion(){return"1.8.0"}openNodeInternal(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2?arguments[2]:void 0;const n=(e,t,o)=>{this.createFolderElement(e).open(o,t,this.options.animationSpeed)};if(e.isFolder()||e.isEmptyFolder)if(e.load_on_demand)this.loadFolderOnDemand(e,t,o);else{let r=e.parent;for(;r;)r.parent&&n(r,!1),r=r.parent;n(e,t,o),this.saveState()}}refreshElements(e){const t=this.isFocusOnTree(),o=!!e&&this.isSelectedNodeInSubtree(e);this.renderer.render(e),o&&this.selectCurrentNode(t),this.triggerEvent("tree.refresh")}getNodeElementForNode(e){return e.isFolder()?this.createFolderElement(e):this.createNodeElement(e)}getNodeElement(e){const t=this.getNode(e);return t?this.getNodeElementForNode(t):null}init(){super.init(),this.element=this.$el,this.isInitialized=!1,this.options.rtl=this.getRtlOption(),null==this.options.closedIcon&&(this.options.closedIcon=this.getDefaultClosedIcon()),this.connectHandlers(),this.initData()}deinit(){this.element.empty(),this.element.off(),this.keyHandler.deinit(),this.mouseHandler.deinit(),this.tree=new L({},!0),super.deinit()}triggerEvent(e,t){const o=jQuery.Event(e,t);return this.element.trigger(o),o}mouseCapture(e){return!!this.options.dragAndDrop&&this.dndHandler.mouseCapture(e)}mouseStart(e){return!!this.options.dragAndDrop&&this.dndHandler.mouseStart(e)}mouseDrag(e){if(this.options.dragAndDrop){const t=this.dndHandler.mouseDrag(e);return this.scrollHandler.checkScrolling(e),t}return!1}mouseStop(e){return!!this.options.dragAndDrop&&(this.scrollHandler.stopScrolling(),this.dndHandler.mouseStop(e))}initData(){if(this.options.data)this.doLoadData(this.options.data,null);else{this.getDataUrlInfo(null)?this.doLoadDataFromUrl(null,null,null):this.doLoadData([],null)}}getDataUrlInfo(e){const t=this.options.dataUrl||this.element.data("url"),o=t=>{if(e?.id){const o={node:e.id};t.data=o}else{const e=this.getNodeIdToBeSelected();if(e){const o={selected_node:e};t.data=o}}};return"function"==typeof t?t(e):"string"==typeof t?(e=>{const t={url:e};return o(t),t})(t):t&&"object"==typeof t?(o(t),t):null}getNodeIdToBeSelected(){return this.options.saveState?this.saveStateHandler.getNodeIdToBeSelected():null}initTree(e){const t=()=>{this.isInitialized||(this.isInitialized=!0,this.triggerEvent("tree.init"))};if(!this.options.nodeClass)return;this.tree=new this.options.nodeClass(null,!0,this.options.nodeClass),this.selectNodeHandler.clear(),this.tree.loadFromData(e);const o=this.setInitialState();this.refreshElements(null),o?this.setInitialStateOnDemand(t):t()}setInitialState(){const e=()=>{if(!1===this.options.autoOpen)return!1;const e=this.getAutoOpenMaxLevel();let t=!1;return this.tree.iterate(((o,n)=>o.load_on_demand?(t=!0,!1):!!o.hasChildren()&&(o.is_open=!0,n!==e))),t};let[t,o]=(()=>{if(this.options.saveState){const e=this.saveStateHandler.getStateFromStorage();if(e){return[!0,this.saveStateHandler.setInitialState(e)]}return[!1,!1]}return[!1,!1]})();return t||(o=e()),o}setInitialStateOnDemand(e){const t=()=>{const t=this.getAutoOpenMaxLevel();let o=0;const n=e=>{o+=1,this.openNodeInternal(e,!1,(()=>{o-=1,r()}))},r=()=>{this.tree.iterate(((e,o)=>e.load_on_demand?(e.is_loading||n(e),!1):(this.openNodeInternal(e,!1),o!==t))),0===o&&e()};r()};(()=>{if(this.options.saveState){const t=this.saveStateHandler.getStateFromStorage();return!!t&&(this.saveStateHandler.setInitialStateOnDemand(t,e),!0)}return!1})()||t()}getAutoOpenMaxLevel(){return!0===this.options.autoOpen?-1:"number"==typeof this.options.autoOpen?this.options.autoOpen:"string"==typeof this.options.autoOpen?parseInt(this.options.autoOpen,10):0}getNode(e){const t=e.closest("li.jqtree_common");return t?jQuery(t).data("node"):null}saveState(){this.options.saveState&&this.saveStateHandler.saveState()}selectCurrentNode(e){const t=this.getSelectedNode();if(t){const o=this.getNodeElementForNode(t);o&&o.select(e)}}deselectCurrentNode(){const e=this.getSelectedNode();e&&this.removeFromSelection(e)}getDefaultClosedIcon(){return this.options.rtl?"◀":"►"}getRtlOption(){if(null!=this.options.rtl)return this.options.rtl;{const e=this.element.data("rtl");return null!==e&&!1!==e&&void 0!==e}}doSelectNode(e,t){const o=()=>{this.options.saveState&&this.saveStateHandler.saveState()};if(!e)return this.deselectCurrentNode(),void o();const n={mustSetFocus:!0,mustToggle:!0,...t||{}};if((()=>this.options.onCanSelectNode?!0===this.options.selectable&&this.options.onCanSelectNode(e):!0===this.options.selectable)()){if(this.selectNodeHandler.isNodeSelected(e))n.mustToggle&&(this.deselectCurrentNode(),this.triggerEvent("tree.select",{node:null,previous_node:e}));else{const t=this.getSelectedNode()||null;this.deselectCurrentNode(),this.addToSelection(e,n.mustSetFocus),this.triggerEvent("tree.select",{node:e,deselected_node:t}),this.openParents(e)}o()}}doLoadData(e,t){e&&(t?(this.deselectNodes(t),this.loadSubtree(e,t)):this.initTree(e),this.isDragging()&&this.dndHandler.refresh()),this.triggerEvent("tree.load_data",{tree_data:e,parent_node:t})}deselectNodes(e){const t=this.selectNodeHandler.getSelectedNodesUnder(e);for(const e of t)this.selectNodeHandler.removeFromSelection(e)}loadSubtree(e,t){t.loadFromData(e),t.load_on_demand=!1,t.is_loading=!1,this.refreshElements(t)}doLoadDataFromUrl(e,t,o){const n=e||this.getDataUrlInfo(t);this.dataLoader.loadFromUrl(n,t,o)}loadFolderOnDemand(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2?arguments[2]:void 0;e.is_loading=!0,this.doLoadDataFromUrl(null,e,(()=>{this.openNodeInternal(e,t,o)}))}containsElement(e){const t=this.getNode(e);return null!=t&&t.tree===this.tree}isFocusOnTree(){const e=document.activeElement;return Boolean(e&&"SPAN"===e.tagName&&this.containsElement(e))}connectHandlers(){const{autoEscape:e,buttonLeft:t,closedIcon:o,dataFilter:n,dragAndDrop:r,keyboardSupport:s,onCanMove:i,onCreateLi:l,onDragMove:d,onDragStop:a,onGetStateFromStorage:g,onIsMoveHandle:p,onLoadFailed:v,onLoading:N,onSetStateFromStorage:E,openedIcon:D,openFolderDelay:y,rtl:C,saveState:F,showEmptyFolder:T,slide:L,tabIndex:w}=this.options,H=this.closeNode.bind(this),M=this.getNodeElement.bind(this),A=this.getNodeElementForNode.bind(this),_=this.getNodeById.bind(this),j=this.getSelectedNode.bind(this),x=this.getTree.bind(this),B=this.isFocusOnTree.bind(this),P=this.loadData.bind(this),O=this.openNodeInternal.bind(this),q=this.refreshElements.bind(this),k=this.refreshHitAreas.bind(this),U=this.selectNode.bind(this),z=this.element,$=this.element.get(0),Q=this.triggerEvent.bind(this),V=new I({getNodeById:_}),Y=V.addToSelection.bind(V),R=V.getSelectedNodes.bind(V),X=V.isNodeSelected.bind(V),G=V.removeFromSelection.bind(V),W=new u({dataFilter:n,loadData:P,onLoadFailed:v,onLoading:N,treeElement:$,triggerEvent:Q}),K=new S({addToSelection:Y,getNodeById:_,getSelectedNodes:R,getTree:x,onGetStateFromStorage:g,onSetStateFromStorage:E,openNode:O,refreshElements:q,removeFromSelection:G,saveState:F}),J=new b({refreshHitAreas:k,treeElement:$}),Z=J.getScrollLeft.bind(J),ee=new h({autoEscape:e,getNodeElement:M,getNodeElementForNode:A,getScrollLeft:Z,getTree:x,onCanMove:i,onDragMove:d,onDragStop:a,onIsMoveHandle:p,openFolderDelay:y,openNode:O,refreshElements:q,slide:L,treeElement:$,triggerEvent:Q}),te=new m({closeNode:H,getSelectedNode:j,isFocusOnTree:B,keyboardSupport:s,openNode:O,selectNode:U}),oe=new c({autoEscape:e,buttonLeft:t,closedIcon:o,dragAndDrop:r,$element:z,getTree:x,isNodeSelected:X,onCreateLi:l,openedIcon:D,rtl:C,showEmptyFolder:T,tabIndex:w}),ne=this.getNode.bind(this),re=this.mouseCapture.bind(this),se=this.mouseDrag.bind(this),ie=this.mouseStart.bind(this),le=this.mouseStop.bind(this),de=new f({element:$,getMouseDelay:()=>this.options.startDndDelay??0,getNode:ne,onClickButton:this.toggle.bind(this),onClickTitle:this.doSelectNode.bind(this),onMouseCapture:re,onMouseDrag:se,onMouseStart:ie,onMouseStop:le,triggerEvent:Q,useContextMenu:this.options.useContextMenu});this.dataLoader=W,this.dndHandler=ee,this.keyHandler=te,this.mouseHandler=de,this.renderer=oe,this.saveStateHandler=K,this.scrollHandler=J,this.selectNodeHandler=V}createFolderElement(e){const t=this.renderer.closedIconElement,o=this.scrollHandler.getScrollLeft.bind(this.scrollHandler),n=this.renderer.openedIconElement,r=this.options.tabIndex,s=this.element,i=this.triggerEvent.bind(this);return new A({closedIconElement:t,getScrollLeft:o,node:e,openedIconElement:n,tabIndex:r,$treeElement:s,triggerEvent:i})}createNodeElement(e){const t=this.scrollHandler.getScrollLeft.bind(this.scrollHandler),o=this.options.tabIndex,n=this.element;return new M({getScrollLeft:t,node:e,tabIndex:o,$treeElement:n})}openParents(e){const t=e.parent;t&&t.parent&&!t.is_open&&this.openNode(t,!1)}}return F.register(x,"tree"),e.JqTreeWidget=x,e}({}); //# sourceMappingURL=tree.jquery.js.map diff --git a/tree.jquery.js.map b/tree.jquery.js.map index d3fc6959..035f62d9 100644 --- a/tree.jquery.js.map +++ b/tree.jquery.js.map @@ -1 +1 @@ -{"version":3,"file":"tree.jquery.js","sources":["src/position.ts","src/dragAndDropHandler/dragElement.ts","src/util.ts","src/dragAndDropHandler/generateHitAreas.ts","src/dragAndDropHandler/iterateVisibleNodes.ts","src/dragAndDropHandler/index.ts","src/elementsRenderer.ts","src/dataLoader.ts","src/keyHandler.ts","src/mouseUtils.ts","src/mouseHandler.ts","src/saveStateHandler.ts","src/scrollHandler/containerScrollParent.ts","src/scrollHandler/documentScrollParent.ts","src/scrollHandler/createScrollParent.ts","src/scrollHandler.ts","src/selectNodeHandler.ts","src/simple.widget.ts","src/nodeUtils.ts","src/node.ts","src/nodeElement/borderDropHint.ts","src/nodeElement/ghostDropHint.ts","src/nodeElement/index.ts","src/nodeElement/folderElement.ts","src/tree.jquery.ts","src/version.ts"],"sourcesContent":["export enum Position {\n Before = 1,\n After,\n Inside,\n None,\n}\n\nconst positionNames: Record = {\n before: Position.Before,\n after: Position.After,\n inside: Position.Inside,\n none: Position.None,\n};\n\nexport const getPositionName = (position: Position): string => {\n for (const name in positionNames) {\n if (Object.prototype.hasOwnProperty.call(positionNames, name)) {\n if (positionNames[name] === position) {\n return name;\n }\n }\n }\n\n return \"\";\n};\n\nexport const getPosition = (name: string): Position | undefined =>\n positionNames[name];\n","interface DragElementParams {\n autoEscape: boolean;\n nodeName: string;\n offsetX: number;\n offsetY: number;\n treeElement: HTMLElement;\n}\n\nclass DragElement {\n private offsetX: number;\n private offsetY: number;\n private element: HTMLElement;\n\n constructor({\n autoEscape,\n nodeName,\n offsetX,\n offsetY,\n treeElement,\n }: DragElementParams) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n this.element = this.createElement(nodeName, autoEscape);\n\n treeElement.appendChild(this.element);\n }\n\n public move(pageX: number, pageY: number): void {\n this.element.style.left = `${pageX - this.offsetX}px`;\n this.element.style.top = `${pageY - this.offsetY}px`;\n }\n\n public remove(): void {\n this.element.remove();\n }\n\n private createElement(nodeName: string, autoEscape: boolean) {\n const element = document.createElement(\"span\");\n element.classList.add(\"jqtree-title\", \"jqtree-dragging\");\n\n if (autoEscape) {\n element.textContent = nodeName;\n } else {\n element.innerHTML = nodeName;\n }\n\n element.style.position = \"absolute\";\n\n return element;\n }\n}\n\nexport default DragElement;\n","export const isInt = (n: unknown): boolean =>\n typeof n === \"number\" && n % 1 === 0;\n\nexport const isFunction = (v: unknown): boolean => typeof v === \"function\";\n\nexport const getBoolString = (value: unknown): string =>\n value ? \"true\" : \"false\";\n\nexport const getOffsetTop = (element: HTMLElement) =>\n getElementPosition(element).top;\n\nexport const getElementPosition = (element: HTMLElement) => {\n const rect = element.getBoundingClientRect();\n\n return {\n left: rect.x + window.scrollX,\n top: rect.y + window.scrollY,\n };\n};\n","import { HitArea } from \"./types\";\nimport { Node } from \"../node\";\nimport { Position } from \"../position\";\nimport { getOffsetTop } from \"../util\";\nimport iterateVisibleNodes from \"./iterateVisibleNodes\";\n\nconst generatePositions = (tree: Node, currentNode: Node): HitArea[] => {\n const positions: HitArea[] = [];\n let lastTop = 0;\n\n const addPosition = (node: Node, position: number, top: number) => {\n const area = {\n top,\n bottom: 0,\n node,\n position,\n };\n\n positions.push(area);\n lastTop = top;\n };\n\n const handleAfterOpenFolder = (node: Node, nextNode: Node | null) => {\n if (node === currentNode || nextNode === currentNode) {\n // Cannot move before or after current item\n addPosition(node, Position.None, lastTop);\n } else {\n addPosition(node, Position.After, lastTop);\n }\n };\n\n const handleClosedFolder = (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => {\n const top = getOffsetTop(element);\n\n if (node === currentNode) {\n // Cannot move after current item\n addPosition(node, Position.None, top);\n } else {\n addPosition(node, Position.Inside, top);\n\n // Cannot move before current item\n if (nextNode !== currentNode) {\n addPosition(node, Position.After, top);\n }\n }\n };\n\n const handleFirstNode = (node: Node) => {\n if (node !== currentNode) {\n addPosition(node, Position.Before, getOffsetTop(node.element));\n }\n };\n\n const handleNode = (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => {\n const top = getOffsetTop(element);\n\n if (node === currentNode) {\n // Cannot move inside current item\n addPosition(node, Position.None, top);\n } else {\n addPosition(node, Position.Inside, top);\n }\n\n if (nextNode === currentNode || node === currentNode) {\n // Cannot move before or after current item\n addPosition(node, Position.None, top);\n } else {\n addPosition(node, Position.After, top);\n }\n };\n\n const handleOpenFolder = (node: Node, element: HTMLElement) => {\n if (node === currentNode) {\n // Cannot move inside current item\n // Stop iterating\n return false;\n }\n\n // Cannot move before current item\n if (node.children[0] !== currentNode) {\n addPosition(node, Position.Inside, getOffsetTop(element));\n }\n\n // Continue iterating\n return true;\n };\n\n iterateVisibleNodes(tree, {\n handleAfterOpenFolder,\n handleClosedFolder,\n handleFirstNode,\n handleNode,\n handleOpenFolder,\n });\n\n return positions;\n};\n\nconst generateHitAreasForGroup = (\n hitAreas: HitArea[],\n positionsInGroup: HitArea[],\n top: number,\n bottom: number,\n) => {\n // limit positions in group\n const positionCount = Math.min(positionsInGroup.length, 4);\n\n const areaHeight = Math.round((bottom - top) / positionCount);\n let areaTop = top;\n\n let i = 0;\n while (i < positionCount) {\n const position = positionsInGroup[i];\n\n if (position) {\n hitAreas.push({\n top: areaTop,\n bottom: areaTop + areaHeight,\n node: position.node,\n position: position.position,\n });\n }\n\n areaTop += areaHeight;\n i += 1;\n }\n};\n\nconst generateHitAreasFromPositions = (\n positions: HitArea[],\n treeBottom: number,\n): HitArea[] => {\n let previousTop = positions[0]?.top ?? 0;\n let group = [];\n const hitAreas: HitArea[] = [];\n\n for (const position of positions) {\n if (position.top !== previousTop && group.length) {\n generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n position.top,\n );\n\n previousTop = position.top;\n group = [];\n }\n\n group.push(position);\n }\n\n generateHitAreasForGroup(hitAreas, group, previousTop, treeBottom);\n\n return hitAreas;\n};\n\nconst generateHitAreas = (\n tree: Node,\n currentNode: Node,\n treeBottom: number,\n) => {\n const positions = generatePositions(tree, currentNode);\n\n return generateHitAreasFromPositions(positions, treeBottom);\n};\n\nexport default generateHitAreas;\n","import { Node } from \"../node\";\n\ninterface Options {\n handleAfterOpenFolder: (node: Node, nextNode: Node | null) => void;\n handleClosedFolder: (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => void;\n handleFirstNode: (node: Node) => void;\n handleNode: (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => void;\n\n /*\n override\n return\n - true: continue iterating\n - false: stop iterating\n */\n handleOpenFolder: (node: Node, element: HTMLElement) => boolean;\n}\n\nconst iterateVisibleNodes = (\n tree: Node,\n {\n handleAfterOpenFolder,\n handleClosedFolder,\n handleFirstNode,\n handleNode,\n handleOpenFolder,\n }: Options,\n) => {\n let isFirstNode = true;\n\n const iterate = (node: Node, nextNode: Node | null): void => {\n let mustIterateInside =\n (node.is_open || !node.element) && node.hasChildren();\n\n let element: HTMLElement | null = null;\n\n // Is the element visible?\n if (node.element?.offsetParent) {\n element = node.element;\n\n if (isFirstNode) {\n handleFirstNode(node);\n isFirstNode = false;\n }\n\n if (!node.hasChildren()) {\n handleNode(node, nextNode, node.element);\n } else if (node.is_open) {\n if (!handleOpenFolder(node, node.element)) {\n mustIterateInside = false;\n }\n } else {\n handleClosedFolder(node, nextNode, element);\n }\n }\n\n if (mustIterateInside) {\n const childrenLength = node.children.length;\n node.children.forEach((_, i) => {\n const child = node.children[i];\n\n if (child) {\n if (i === childrenLength - 1) {\n iterate(child, null);\n } else {\n const nextChild = node.children[i + 1];\n\n if (nextChild) {\n iterate(child, nextChild);\n }\n }\n }\n });\n\n if (node.is_open && element) {\n handleAfterOpenFolder(node, nextNode);\n }\n }\n };\n\n iterate(tree, null);\n};\n\nexport default iterateVisibleNodes;\n","import { Node } from \"../node\";\nimport { getPositionName, Position } from \"../position\";\nimport { DropHint, HitArea } from \"./types\";\nimport { PositionInfo } from \"../mouseUtils\";\nimport NodeElement from \"../nodeElement\";\nimport DragElement from \"./dragElement\";\nimport generateHitAreas from \"./generateHitAreas\";\nimport { getElementPosition } from \"../util\";\nimport {\n OnCanMove,\n OnCanMoveTo,\n OnIsMoveHandle,\n DragMethod,\n} from \"../jqtreeOptions\";\nimport {\n GetScrollLeft,\n GetTree,\n OpenNode,\n RefreshElements,\n TriggerEvent,\n} from \"../jqtreeMethodTypes\";\n\ninterface Dimensions {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\ntype GetNodeElement = (element: HTMLElement) => NodeElement | null;\ntype GetNodeElementForNode = (node: Node) => NodeElement;\n\ninterface DragAndDropHandlerParams {\n autoEscape?: boolean;\n getNodeElement: GetNodeElement;\n getNodeElementForNode: GetNodeElementForNode;\n getScrollLeft: GetScrollLeft;\n getTree: GetTree;\n onCanMove?: OnCanMove;\n onCanMoveTo?: OnCanMoveTo;\n onDragMove?: DragMethod;\n onDragStop?: DragMethod;\n onIsMoveHandle?: OnIsMoveHandle;\n openFolderDelay: number | false;\n openNode: OpenNode;\n refreshElements: RefreshElements;\n slide: boolean;\n treeElement: HTMLElement;\n triggerEvent: TriggerEvent;\n}\n\nexport class DragAndDropHandler {\n public hitAreas: HitArea[];\n public isDragging: boolean;\n public currentItem: NodeElement | null;\n public hoveredArea: HitArea | null;\n\n private autoEscape?: boolean;\n private dragElement: DragElement | null;\n private getNodeElement: GetNodeElement;\n private getNodeElementForNode: GetNodeElementForNode;\n private getScrollLeft: GetScrollLeft;\n private getTree: GetTree;\n private onCanMove?: OnCanMove;\n private onCanMoveTo?: OnCanMoveTo;\n private onDragMove?: DragMethod;\n private onDragStop?: DragMethod;\n private onIsMoveHandle?: OnIsMoveHandle;\n private openFolderDelay: number | false;\n private openFolderTimer: number | null;\n private openNode: OpenNode;\n private previousGhost: DropHint | null;\n private refreshElements: RefreshElements;\n private slide: boolean;\n private treeElement: HTMLElement;\n private triggerEvent: TriggerEvent;\n\n constructor({\n autoEscape,\n getNodeElement,\n getNodeElementForNode,\n getScrollLeft,\n getTree,\n onCanMove,\n onCanMoveTo,\n onDragMove,\n onDragStop,\n onIsMoveHandle,\n openNode,\n refreshElements,\n slide,\n treeElement,\n triggerEvent,\n }: DragAndDropHandlerParams) {\n this.autoEscape = autoEscape;\n this.getNodeElement = getNodeElement;\n this.getNodeElementForNode = getNodeElementForNode;\n this.getScrollLeft = getScrollLeft;\n this.getTree = getTree;\n this.onCanMove = onCanMove;\n this.onCanMoveTo = onCanMoveTo;\n this.onDragMove = onDragMove;\n this.onDragStop = onDragStop;\n this.onIsMoveHandle = onIsMoveHandle;\n this.openNode = openNode;\n this.refreshElements = refreshElements;\n this.slide = slide;\n this.treeElement = treeElement;\n this.triggerEvent = triggerEvent;\n\n this.hoveredArea = null;\n this.hitAreas = [];\n this.isDragging = false;\n this.currentItem = null;\n }\n\n public mouseCapture(positionInfo: PositionInfo): boolean | null {\n const element = positionInfo.target;\n\n if (!this.mustCaptureElement(element)) {\n return null;\n }\n\n if (this.onIsMoveHandle && !this.onIsMoveHandle(jQuery(element))) {\n return null;\n }\n\n let nodeElement = this.getNodeElement(element);\n\n if (nodeElement && this.onCanMove) {\n if (!this.onCanMove(nodeElement.node)) {\n nodeElement = null;\n }\n }\n\n this.currentItem = nodeElement;\n return this.currentItem != null;\n }\n\n public mouseStart(positionInfo: PositionInfo): boolean {\n if (!this.currentItem) {\n return false;\n }\n\n this.refresh();\n\n const { left, top } = getElementPosition(positionInfo.target);\n\n const node = this.currentItem.node;\n\n this.dragElement = new DragElement({\n autoEscape: this.autoEscape ?? true,\n nodeName: node.name,\n offsetX: positionInfo.pageX - left,\n offsetY: positionInfo.pageY - top,\n treeElement: this.treeElement,\n });\n\n this.isDragging = true;\n this.currentItem.element.classList.add(\"jqtree-moving\");\n\n return true;\n }\n\n public mouseDrag(positionInfo: PositionInfo): boolean {\n if (!this.currentItem || !this.dragElement) {\n return false;\n }\n\n this.dragElement.move(positionInfo.pageX, positionInfo.pageY);\n\n const area = this.findHoveredArea(\n positionInfo.pageX,\n positionInfo.pageY,\n );\n\n if (area && this.canMoveToArea(area)) {\n if (!area.node.isFolder()) {\n this.stopOpenFolderTimer();\n }\n\n if (this.hoveredArea !== area) {\n this.hoveredArea = area;\n\n // If this is a closed folder, start timer to open it\n if (this.mustOpenFolderTimer(area)) {\n this.startOpenFolderTimer(area.node);\n } else {\n this.stopOpenFolderTimer();\n }\n\n this.updateDropHint();\n }\n } else {\n this.removeDropHint();\n this.stopOpenFolderTimer();\n this.hoveredArea = area;\n }\n\n if (!area) {\n if (this.onDragMove) {\n this.onDragMove(\n this.currentItem.node,\n positionInfo.originalEvent,\n );\n }\n }\n\n return true;\n }\n\n public mouseStop(positionInfo: PositionInfo): boolean {\n this.moveItem(positionInfo);\n this.clear();\n this.removeHover();\n this.removeDropHint();\n this.removeHitAreas();\n\n const currentItem = this.currentItem;\n\n if (this.currentItem) {\n this.currentItem.element.classList.remove(\"jqtree-moving\");\n this.currentItem = null;\n }\n\n this.isDragging = false;\n\n if (!this.hoveredArea && currentItem) {\n if (this.onDragStop) {\n this.onDragStop(currentItem.node, positionInfo.originalEvent);\n }\n }\n\n return false;\n }\n\n public refresh(): void {\n this.removeHitAreas();\n\n if (this.currentItem) {\n this.generateHitAreas();\n\n this.currentItem = this.getNodeElementForNode(\n this.currentItem.node,\n );\n\n if (this.isDragging) {\n this.currentItem.element.classList.add(\"jqtree-moving\");\n }\n }\n }\n\n private generateHitAreas(): void {\n const tree = this.getTree();\n\n if (!this.currentItem || !tree) {\n this.hitAreas = [];\n } else {\n this.hitAreas = generateHitAreas(\n tree,\n this.currentItem.node,\n this.getTreeDimensions().bottom,\n );\n }\n }\n\n private mustCaptureElement(element: HTMLElement): boolean {\n const nodeName = element.nodeName;\n\n return (\n nodeName !== \"INPUT\" &&\n nodeName !== \"SELECT\" &&\n nodeName !== \"TEXTAREA\"\n );\n }\n\n private canMoveToArea(area: HitArea): boolean {\n if (!this.onCanMoveTo) {\n return true;\n }\n\n if (!this.currentItem) {\n return false;\n }\n\n const positionName = getPositionName(area.position);\n\n return this.onCanMoveTo(this.currentItem.node, area.node, positionName);\n }\n\n private removeHitAreas(): void {\n this.hitAreas = [];\n }\n\n private clear(): void {\n if (this.dragElement) {\n this.dragElement.remove();\n this.dragElement = null;\n }\n }\n\n private removeDropHint(): void {\n if (this.previousGhost) {\n this.previousGhost.remove();\n }\n }\n\n private removeHover(): void {\n this.hoveredArea = null;\n }\n\n private findHoveredArea(x: number, y: number): HitArea | null {\n const dimensions = this.getTreeDimensions();\n\n if (\n x < dimensions.left ||\n y < dimensions.top ||\n x > dimensions.right ||\n y > dimensions.bottom\n ) {\n return null;\n }\n\n let low = 0;\n let high = this.hitAreas.length;\n while (low < high) {\n const mid = (low + high) >> 1;\n const area = this.hitAreas[mid];\n\n if (!area) {\n return null;\n }\n\n if (y < area.top) {\n high = mid;\n } else if (y > area.bottom) {\n low = mid + 1;\n } else {\n return area;\n }\n }\n\n return null;\n }\n\n private mustOpenFolderTimer(area: HitArea): boolean {\n const node = area.node;\n\n return (\n node.isFolder() &&\n !node.is_open &&\n area.position === Position.Inside\n );\n }\n\n private updateDropHint(): void {\n if (!this.hoveredArea) {\n return;\n }\n\n // remove previous drop hint\n this.removeDropHint();\n\n // add new drop hint\n const nodeElement = this.getNodeElementForNode(this.hoveredArea.node);\n this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);\n }\n\n private startOpenFolderTimer(folder: Node): void {\n const openFolder = (): void => {\n this.openNode(folder, this.slide, () => {\n this.refresh();\n this.updateDropHint();\n });\n };\n\n this.stopOpenFolderTimer();\n\n const openFolderDelay = this.openFolderDelay;\n\n if (openFolderDelay !== false) {\n this.openFolderTimer = window.setTimeout(\n openFolder,\n openFolderDelay,\n );\n }\n }\n\n private stopOpenFolderTimer(): void {\n if (this.openFolderTimer) {\n clearTimeout(this.openFolderTimer);\n this.openFolderTimer = null;\n }\n }\n\n private moveItem(positionInfo: PositionInfo): void {\n if (\n this.currentItem &&\n this.hoveredArea &&\n this.hoveredArea.position !== Position.None &&\n this.canMoveToArea(this.hoveredArea)\n ) {\n const movedNode = this.currentItem.node;\n const targetNode = this.hoveredArea.node;\n const position = this.hoveredArea.position;\n const previousParent = movedNode.parent;\n\n if (position === Position.Inside) {\n this.hoveredArea.node.is_open = true;\n }\n\n const doMove = (): void => {\n const tree = this.getTree();\n\n if (tree) {\n tree.moveNode(movedNode, targetNode, position);\n\n this.treeElement.textContent = \"\";\n this.refreshElements(null);\n }\n };\n\n const event = this.triggerEvent(\"tree.move\", {\n move_info: {\n moved_node: movedNode,\n target_node: targetNode,\n position: getPositionName(position),\n previous_parent: previousParent,\n do_move: doMove,\n original_event: positionInfo.originalEvent,\n },\n });\n\n if (!event.isDefaultPrevented()) {\n doMove();\n }\n }\n }\n\n private getTreeDimensions(): Dimensions {\n // Return the dimensions of the tree. Add a margin to the bottom to allow\n // to drag-and-drop after the last element.\n const treePosition = getElementPosition(this.treeElement);\n const left = treePosition.left + this.getScrollLeft();\n const top = treePosition.top;\n\n return {\n left,\n top,\n right: left + this.treeElement.clientWidth,\n bottom: top + this.treeElement.clientHeight + 16,\n };\n }\n}\n","import { getBoolString } from \"./util\";\nimport { Node } from \"./node\";\nimport { IconElement, OnCreateLi } from \"./jqtreeOptions\";\nimport { GetTree, IsNodeSelected } from \"./jqtreeMethodTypes\";\n\ninterface ElementsRendererParams {\n autoEscape: boolean;\n buttonLeft: boolean;\n closedIcon?: IconElement;\n dragAndDrop: boolean;\n $element: JQuery;\n getTree: GetTree;\n isNodeSelected: IsNodeSelected;\n onCreateLi?: OnCreateLi;\n openedIcon?: IconElement;\n rtl?: boolean;\n showEmptyFolder: boolean;\n tabIndex?: number;\n}\n\nexport default class ElementsRenderer {\n public openedIconElement?: HTMLElement | Text;\n public closedIconElement?: HTMLElement | Text;\n private autoEscape: boolean;\n private buttonLeft: boolean;\n private dragAndDrop: boolean;\n private $element: JQuery;\n private getTree: GetTree;\n private isNodeSelected: IsNodeSelected;\n private onCreateLi?: OnCreateLi;\n private rtl?: boolean;\n private showEmptyFolder: boolean;\n private tabIndex?: number;\n\n constructor({\n autoEscape,\n buttonLeft,\n closedIcon,\n onCreateLi,\n dragAndDrop,\n $element,\n getTree,\n isNodeSelected,\n openedIcon,\n rtl,\n showEmptyFolder,\n tabIndex,\n }: ElementsRendererParams) {\n this.autoEscape = autoEscape;\n this.buttonLeft = buttonLeft;\n this.dragAndDrop = dragAndDrop;\n this.$element = $element;\n this.getTree = getTree;\n this.isNodeSelected = isNodeSelected;\n this.onCreateLi = onCreateLi;\n this.rtl = rtl;\n this.showEmptyFolder = showEmptyFolder;\n this.tabIndex = tabIndex;\n this.openedIconElement = this.createButtonElement(openedIcon || \"+\");\n this.closedIconElement = this.createButtonElement(closedIcon || \"-\");\n }\n\n public render(fromNode: Node | null): void {\n if (fromNode && fromNode.parent) {\n this.renderFromNode(fromNode);\n } else {\n this.renderFromRoot();\n }\n }\n\n public renderFromRoot(): void {\n this.$element.empty();\n\n const tree = this.getTree();\n\n if (this.$element[0] && tree) {\n this.createDomElements(this.$element[0], tree.children, true, 1);\n }\n }\n\n public renderFromNode(node: Node): void {\n // remember current li\n const $previousLi = jQuery(node.element);\n\n // create element\n const li = this.createLi(node, node.getLevel());\n this.attachNodeData(node, li);\n\n // add element to dom\n $previousLi.after(li);\n\n // remove previous li\n $previousLi.remove();\n\n // create children\n if (node.children) {\n this.createDomElements(\n li,\n node.children,\n false,\n node.getLevel() + 1,\n );\n }\n }\n\n private createDomElements(\n element: Element,\n children: Node[],\n isRootNode: boolean,\n level: number,\n ): void {\n const ul = this.createUl(isRootNode);\n element.appendChild(ul);\n\n for (const child of children) {\n const li = this.createLi(child, level);\n ul.appendChild(li);\n\n this.attachNodeData(child, li);\n\n if (child.hasChildren()) {\n this.createDomElements(li, child.children, false, level + 1);\n }\n }\n }\n\n private attachNodeData(node: Node, li: HTMLElement): void {\n node.element = li;\n jQuery(li).data(\"node\", node);\n }\n\n private createUl(isRootNode: boolean): HTMLUListElement {\n let classString;\n let role;\n\n if (!isRootNode) {\n classString = \"\";\n role = \"group\";\n } else {\n classString = \"jqtree-tree\";\n role = \"tree\";\n\n if (this.rtl) {\n classString += \" jqtree-rtl\";\n }\n }\n\n if (this.dragAndDrop) {\n classString += \" jqtree-dnd\";\n }\n\n const ul = document.createElement(\"ul\");\n ul.className = `jqtree_common ${classString}`;\n\n ul.setAttribute(\"role\", role);\n\n return ul;\n }\n\n private createLi(node: Node, level: number): HTMLLIElement {\n const isSelected = Boolean(this.isNodeSelected(node));\n\n const mustShowFolder =\n node.isFolder() || (node.isEmptyFolder && this.showEmptyFolder);\n\n const li = mustShowFolder\n ? this.createFolderLi(node, level, isSelected)\n : this.createNodeLi(node, level, isSelected);\n\n if (this.onCreateLi) {\n this.onCreateLi(node, jQuery(li), isSelected);\n }\n\n return li;\n }\n\n private setTreeItemAriaAttributes(\n element: HTMLElement,\n name: string,\n level: number,\n isSelected: boolean,\n ) {\n element.setAttribute(\"aria-label\", name);\n element.setAttribute(\"aria-level\", `${level}`);\n element.setAttribute(\"aria-selected\", getBoolString(isSelected));\n element.setAttribute(\"role\", \"treeitem\");\n }\n\n private createFolderLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const buttonClasses = this.getButtonClasses(node);\n const folderClasses = this.getFolderClasses(node, isSelected);\n\n const iconElement = node.is_open\n ? this.openedIconElement\n : this.closedIconElement;\n\n // li\n const li = document.createElement(\"li\");\n li.className = `jqtree_common ${folderClasses}`;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // button link\n const buttonLink = document.createElement(\"a\");\n buttonLink.className = buttonClasses;\n\n if (iconElement) {\n buttonLink.appendChild(iconElement.cloneNode(true));\n }\n\n if (this.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n true,\n level,\n );\n titleSpan.setAttribute(\"aria-expanded\", getBoolString(node.is_open));\n div.appendChild(titleSpan);\n\n if (!this.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n return li;\n }\n\n private createNodeLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const liClasses = [\"jqtree_common\"];\n\n if (isSelected) {\n liClasses.push(\"jqtree-selected\");\n }\n\n const classString = liClasses.join(\" \");\n\n // li\n const li = document.createElement(\"li\");\n li.className = classString;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n false,\n level,\n );\n div.appendChild(titleSpan);\n\n return li;\n }\n\n private createTitleSpan(\n nodeName: string,\n isSelected: boolean,\n isFolder: boolean,\n level: number,\n ): HTMLSpanElement {\n const titleSpan = document.createElement(\"span\");\n\n let classes = \"jqtree-title jqtree_common\";\n\n if (isFolder) {\n classes += \" jqtree-title-folder\";\n }\n\n classes += ` jqtree-title-button-${this.buttonLeft ? \"left\" : \"right\"}`;\n\n titleSpan.className = classes;\n\n if (isSelected) {\n const tabIndex = this.tabIndex;\n\n if (tabIndex !== undefined) {\n titleSpan.setAttribute(\"tabindex\", `${tabIndex}`);\n }\n }\n\n this.setTreeItemAriaAttributes(titleSpan, nodeName, level, isSelected);\n\n if (this.autoEscape) {\n titleSpan.textContent = nodeName;\n } else {\n titleSpan.innerHTML = nodeName;\n }\n\n return titleSpan;\n }\n\n private getButtonClasses(node: Node): string {\n const classes = [\"jqtree-toggler\", \"jqtree_common\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (this.buttonLeft) {\n classes.push(\"jqtree-toggler-left\");\n } else {\n classes.push(\"jqtree-toggler-right\");\n }\n\n return classes.join(\" \");\n }\n\n private getFolderClasses(node: Node, isSelected: boolean): string {\n const classes = [\"jqtree-folder\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (isSelected) {\n classes.push(\"jqtree-selected\");\n }\n\n if (node.is_loading) {\n classes.push(\"jqtree-loading\");\n }\n\n return classes.join(\" \");\n }\n\n private createButtonElement(\n value: IconElement,\n ): HTMLElement | Text | undefined {\n if (typeof value === \"string\") {\n // convert value to html\n const div = document.createElement(\"div\");\n div.innerHTML = value;\n\n return document.createTextNode(div.innerHTML);\n } else if (value == null) {\n return undefined;\n } else if ((value as HTMLElement).nodeType) {\n return value as HTMLElement;\n } else {\n return jQuery(value)[0];\n }\n }\n}\n","import { Node } from \"./node\";\nimport { DataFilter, OnLoadFailed } from \"./jqtreeOptions\";\nimport { LoadData, TriggerEvent } from \"./jqtreeMethodTypes\";\n\nexport type HandleFinishedLoading = () => void;\n\ninterface DataLoaderParams {\n dataFilter?: DataFilter;\n loadData: LoadData;\n onLoadFailed?: OnLoadFailed;\n treeElement: HTMLElement;\n triggerEvent: TriggerEvent;\n}\n\nexport default class DataLoader {\n private dataFilter?: DataFilter;\n private loadData: LoadData;\n private onLoadFailed?: OnLoadFailed;\n private treeElement: HTMLElement;\n private triggerEvent: TriggerEvent;\n\n constructor({\n dataFilter,\n loadData,\n onLoadFailed,\n treeElement,\n triggerEvent,\n }: DataLoaderParams) {\n this.dataFilter = dataFilter;\n this.loadData = loadData;\n this.onLoadFailed = onLoadFailed;\n this.treeElement = treeElement;\n this.triggerEvent = triggerEvent;\n }\n\n public loadFromUrl(\n urlInfo: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null,\n ): void {\n if (!urlInfo) {\n return;\n }\n\n const element = this.getDomElement(parentNode);\n this.addLoadingClass(element);\n this.notifyLoading(true, parentNode);\n\n const stopLoading = (): void => {\n this.removeLoadingClass(element);\n this.notifyLoading(false, parentNode);\n };\n\n const handleSuccess = (data: string | NodeData[]): void => {\n stopLoading();\n this.loadData(this.parseData(data), parentNode);\n\n if (onFinished && typeof onFinished === \"function\") {\n onFinished();\n }\n };\n\n const handleError = (jqXHR: JQuery.jqXHR): void => {\n stopLoading();\n\n if (this.onLoadFailed) {\n this.onLoadFailed(jqXHR);\n }\n };\n\n this.submitRequest(urlInfo, handleSuccess, handleError);\n }\n\n private addLoadingClass(element: HTMLElement): void {\n element.classList.add(\"jqtree-loading\");\n }\n\n private removeLoadingClass(element: HTMLElement): void {\n element.classList.remove(\"jqtree-loading\");\n }\n\n private getDomElement(parentNode: Node | null): HTMLElement {\n if (parentNode) {\n return parentNode.element;\n } else {\n return this.treeElement;\n }\n }\n\n private notifyLoading(isLoading: boolean, node: Node | null): void {\n this.triggerEvent(\"tree.loading_data\", {\n isLoading,\n node,\n });\n }\n\n private submitRequest(\n urlInfoInput: string | JQuery.AjaxSettings,\n handleSuccess: JQuery.Ajax.SuccessCallback,\n handleError: JQuery.Ajax.ErrorCallback,\n ): void {\n const urlInfo =\n typeof urlInfoInput === \"string\"\n ? { url: urlInfoInput }\n : urlInfoInput;\n\n const ajaxSettings: JQuery.AjaxSettings = {\n method: \"GET\",\n cache: false,\n dataType: \"json\",\n success: handleSuccess,\n error: handleError,\n ...urlInfo,\n };\n\n ajaxSettings.method = ajaxSettings.method?.toUpperCase() || \"GET\";\n\n void jQuery.ajax(ajaxSettings);\n }\n\n private parseData(data: string | NodeData[]): NodeData[] {\n const getParsedData = () => {\n if (typeof data === \"string\") {\n return JSON.parse(data) as NodeData[];\n } else {\n return data;\n }\n };\n\n const parsedData = getParsedData();\n\n if (this.dataFilter) {\n return this.dataFilter(parsedData);\n } else {\n return parsedData;\n }\n }\n}\n","import { Node } from \"./node\";\nimport {\n CloseNode,\n GetSelectedNode,\n IsFocusOnTree,\n OpenNode,\n SelectNode,\n} from \"./jqtreeMethodTypes\";\n\ntype KeyboardEventHandler = (event: KeyboardEvent) => boolean;\n\ninterface KeyHandlerParams {\n closeNode: CloseNode;\n getSelectedNode: GetSelectedNode;\n isFocusOnTree: IsFocusOnTree;\n keyboardSupport: boolean;\n openNode: OpenNode;\n selectNode: SelectNode;\n}\n\nexport default class KeyHandler {\n private closeNode: CloseNode;\n private getSelectedNode: GetSelectedNode;\n private handleKeyDownHandler?: KeyboardEventHandler;\n private isFocusOnTree: IsFocusOnTree;\n private keyboardSupport: boolean;\n private openNode: OpenNode;\n private originalSelectNode: SelectNode;\n\n constructor({\n closeNode,\n getSelectedNode,\n isFocusOnTree,\n keyboardSupport,\n openNode,\n selectNode,\n }: KeyHandlerParams) {\n this.closeNode = closeNode;\n this.getSelectedNode = getSelectedNode;\n this.isFocusOnTree = isFocusOnTree;\n this.keyboardSupport = keyboardSupport;\n this.openNode = openNode;\n this.originalSelectNode = selectNode;\n\n if (keyboardSupport) {\n this.handleKeyDownHandler = this.handleKeyDown.bind(this);\n\n document.addEventListener(\"keydown\", this.handleKeyDownHandler);\n }\n }\n\n public deinit(): void {\n if (this.handleKeyDownHandler) {\n document.removeEventListener(\"keydown\", this.handleKeyDownHandler);\n }\n }\n\n public moveDown(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getNextVisibleNode());\n }\n\n public moveUp(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getPreviousVisibleNode());\n }\n\n public moveRight(selectedNode: Node): boolean {\n if (!selectedNode.isFolder()) {\n return true;\n } else {\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 } else {\n // Right expands a closed node\n this.openNode(selectedNode);\n return false;\n }\n }\n }\n\n public moveLeft(selectedNode: Node): boolean {\n if (selectedNode.isFolder() && selectedNode.is_open) {\n // Left on an open node closes the node\n this.closeNode(selectedNode);\n return false;\n } else {\n // Left on a closed or end node moves focus to the node's parent\n return this.selectNode(selectedNode.getParent());\n }\n }\n\n public selectNode(node: Node | null): boolean {\n if (!node) {\n return true;\n } else {\n this.originalSelectNode(node);\n\n return false;\n }\n }\n\n private handleKeyDown = (e: KeyboardEvent): boolean => {\n if (!this.canHandleKeyboard()) {\n return true;\n }\n\n const selectedNode = this.getSelectedNode();\n if (!selectedNode) {\n return true;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n return this.moveDown(selectedNode);\n\n case \"ArrowUp\":\n return this.moveUp(selectedNode);\n\n case \"ArrowRight\":\n return this.moveRight(selectedNode);\n\n case \"ArrowLeft\":\n return this.moveLeft(selectedNode);\n\n default:\n return true;\n }\n };\n\n private canHandleKeyboard(): boolean {\n return this.keyboardSupport && this.isFocusOnTree();\n }\n}\n","export interface PositionInfo {\n originalEvent: Event;\n pageX: number;\n pageY: number;\n target: HTMLElement;\n}\n\nexport const getPositionInfoFromMouseEvent = (e: MouseEvent): PositionInfo => ({\n originalEvent: e,\n pageX: e.pageX,\n pageY: e.pageY,\n target: e.target as HTMLElement,\n});\n\nexport const getPositionInfoFromTouch = (\n touch: Touch,\n e: TouchEvent,\n): PositionInfo => ({\n originalEvent: e,\n pageX: touch.pageX,\n pageY: touch.pageY,\n target: touch.target as HTMLElement,\n});\n","import {\n getPositionInfoFromMouseEvent,\n getPositionInfoFromTouch,\n PositionInfo,\n} from \"./mouseUtils\";\nimport { Node } from \"./node\";\nimport { TriggerEvent } from \"./jqtreeMethodTypes\";\n\ninterface ClickTarget {\n node: Node;\n type: \"button\" | \"label\";\n}\n\ntype GetNode = (element: HTMLElement) => null | Node;\n\ninterface MouseHandlerParams {\n element: HTMLElement;\n getMouseDelay: () => number;\n getNode: GetNode;\n onClickButton: (node: Node) => void;\n onClickTitle: (node: Node) => void;\n onMouseCapture: (positionInfo: PositionInfo) => boolean | null;\n onMouseDrag: (positionInfo: PositionInfo) => void;\n onMouseStart: (positionInfo: PositionInfo) => boolean;\n onMouseStop: (positionInfo: PositionInfo) => void;\n triggerEvent: TriggerEvent;\n useContextMenu: boolean;\n}\n\nclass MouseHandler {\n private element: HTMLElement;\n private getMouseDelay: () => number;\n private getNode: GetNode;\n private isMouseDelayMet: boolean;\n private isMouseStarted: boolean;\n private mouseDelayTimer: number | null;\n private mouseDownInfo: PositionInfo | null;\n private onClickButton: (node: Node) => void;\n private onClickTitle: (node: Node) => void;\n private onMouseCapture: (positionInfo: PositionInfo) => boolean | null;\n private onMouseDrag: (positionInfo: PositionInfo) => void;\n private onMouseStart: (positionInfo: PositionInfo) => boolean;\n private onMouseStop: (positionInfo: PositionInfo) => void;\n private triggerEvent: TriggerEvent;\n private useContextMenu: boolean;\n\n constructor({\n element,\n getMouseDelay,\n getNode,\n onClickButton,\n onClickTitle,\n onMouseCapture,\n onMouseDrag,\n onMouseStart,\n onMouseStop,\n triggerEvent,\n useContextMenu,\n }: MouseHandlerParams) {\n this.element = element;\n this.getMouseDelay = getMouseDelay;\n this.getNode = getNode;\n this.onClickButton = onClickButton;\n this.onClickTitle = onClickTitle;\n this.onMouseCapture = onMouseCapture;\n this.onMouseDrag = onMouseDrag;\n this.onMouseStart = onMouseStart;\n this.onMouseStop = onMouseStop;\n this.triggerEvent = triggerEvent;\n this.useContextMenu = useContextMenu;\n\n element.addEventListener(\"click\", this.handleClick);\n element.addEventListener(\"dblclick\", this.handleDblclick);\n element.addEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n element.addEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n\n if (useContextMenu) {\n element.addEventListener(\"contextmenu\", this.handleContextmenu);\n }\n\n this.isMouseStarted = false;\n this.mouseDelayTimer = null;\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n }\n\n public deinit(): void {\n this.element.removeEventListener(\"click\", this.handleClick);\n this.element.removeEventListener(\"dblclick\", this.handleDblclick);\n\n if (this.useContextMenu) {\n this.element.removeEventListener(\n \"contextmenu\",\n this.handleContextmenu,\n );\n }\n\n this.element.removeEventListener(\"mousedown\", this.mouseDown);\n this.element.removeEventListener(\"touchstart\", this.touchStart);\n this.removeMouseMoveEventListeners();\n }\n\n private mouseDown = (e: MouseEvent): void => {\n // Left mouse button?\n if (e.button !== 0) {\n return;\n }\n\n const result = this.handleMouseDown(getPositionInfoFromMouseEvent(e));\n\n if (result && e.cancelable) {\n e.preventDefault();\n }\n };\n\n private handleMouseDown(positionInfo: PositionInfo): boolean {\n // We may have missed mouseup (out of window)\n if (this.isMouseStarted) {\n this.handleMouseUp(positionInfo);\n }\n\n this.mouseDownInfo = positionInfo;\n\n if (!this.onMouseCapture(positionInfo)) {\n return false;\n }\n\n this.handleStartMouse();\n\n return true;\n }\n\n private handleStartMouse(): void {\n document.addEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n document.addEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n document.addEventListener(\"mouseup\", this.mouseUp, { passive: false });\n document.addEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\n\n const mouseDelay = this.getMouseDelay();\n\n if (mouseDelay) {\n this.startMouseDelayTimer(mouseDelay);\n } else {\n this.isMouseDelayMet = true;\n }\n }\n\n private startMouseDelayTimer(mouseDelay: number): void {\n if (this.mouseDelayTimer) {\n clearTimeout(this.mouseDelayTimer);\n }\n\n this.mouseDelayTimer = window.setTimeout(() => {\n if (this.mouseDownInfo) {\n this.isMouseDelayMet = true;\n }\n }, mouseDelay);\n\n this.isMouseDelayMet = false;\n }\n\n private mouseMove = (e: MouseEvent): void => {\n this.handleMouseMove(e, getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseMove(\n e: MouseEvent | TouchEvent,\n positionInfo: PositionInfo,\n ): void {\n if (this.isMouseStarted) {\n this.onMouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n return;\n }\n\n if (!this.isMouseDelayMet) {\n return;\n }\n\n if (this.mouseDownInfo) {\n this.isMouseStarted =\n this.onMouseStart(this.mouseDownInfo) !== false;\n }\n\n if (this.isMouseStarted) {\n this.onMouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n } else {\n this.handleMouseUp(positionInfo);\n }\n }\n\n private mouseUp = (e: MouseEvent): void => {\n this.handleMouseUp(getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseUp(positionInfo: PositionInfo): void {\n this.removeMouseMoveEventListeners();\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n\n if (this.isMouseStarted) {\n this.isMouseStarted = false;\n this.onMouseStop(positionInfo);\n }\n }\n\n private removeMouseMoveEventListeners() {\n document.removeEventListener(\"mousemove\", this.mouseMove);\n document.removeEventListener(\"touchmove\", this.touchMove);\n document.removeEventListener(\"mouseup\", this.mouseUp);\n document.removeEventListener(\"touchend\", this.touchEnd);\n }\n\n private touchStart = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.touches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseDown(getPositionInfoFromTouch(touch, e));\n };\n\n private touchMove = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.touches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseMove(e, getPositionInfoFromTouch(touch, e));\n };\n\n private touchEnd = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.touches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseUp(getPositionInfoFromTouch(touch, e));\n };\n\n private handleClick = (e: MouseEvent): void => {\n if (!e.target) {\n return;\n }\n\n const clickTarget = this.getClickTarget(e.target as HTMLElement);\n\n if (!clickTarget) {\n return;\n }\n\n if (clickTarget.type === \"button\") {\n this.onClickButton(clickTarget.node);\n\n e.preventDefault();\n e.stopPropagation();\n } else if (clickTarget.type === \"label\") {\n const event = this.triggerEvent(\"tree.click\", {\n node: clickTarget.node,\n click_event: e,\n });\n\n if (!event.isDefaultPrevented()) {\n this.onClickTitle(clickTarget.node);\n }\n }\n };\n\n private handleDblclick = (e: MouseEvent): void => {\n if (!e.target) {\n return;\n }\n\n const clickTarget = this.getClickTarget(e.target as HTMLElement);\n\n if (clickTarget?.type === \"label\") {\n this.triggerEvent(\"tree.dblclick\", {\n node: clickTarget.node,\n click_event: e,\n });\n }\n };\n\n private handleContextmenu = (e: MouseEvent) => {\n if (!e.target) {\n return;\n }\n\n const div = (e.target as HTMLElement).closest(\n \"ul.jqtree-tree .jqtree-element\",\n );\n\n if (div) {\n const node = this.getNode(div);\n if (node) {\n e.preventDefault();\n e.stopPropagation();\n\n this.triggerEvent(\"tree.contextmenu\", {\n node,\n click_event: e,\n });\n return false;\n }\n }\n\n return null;\n };\n\n private getClickTarget(element: HTMLElement): ClickTarget | null {\n const button = element.closest(\".jqtree-toggler\");\n\n if (button) {\n const node = this.getNode(button);\n\n if (node) {\n return {\n type: \"button\",\n node,\n };\n }\n } else {\n const jqTreeElement =\n element.closest(\".jqtree-element\");\n\n if (jqTreeElement) {\n const node = this.getNode(jqTreeElement);\n if (node) {\n return {\n type: \"label\",\n node,\n };\n }\n }\n }\n\n return null;\n }\n}\n\nexport default MouseHandler;\n","import { isInt } from \"./util\";\nimport { Node } from \"./node\";\nimport { OnGetStateFromStorage, OnSetStateFromStorage } from \"./jqtreeOptions\";\nimport {\n AddToSelection,\n GetNodeById,\n GetSelectedNodes,\n GetTree,\n OpenNode,\n RefreshElements,\n RemoveFromSelection,\n} from \"./jqtreeMethodTypes\";\n\nexport interface SavedState {\n open_nodes: NodeId[];\n selected_node: NodeId[];\n}\n\ninterface SaveStateHandlerParams {\n addToSelection: AddToSelection;\n getNodeById: GetNodeById;\n getSelectedNodes: GetSelectedNodes;\n getTree: GetTree;\n onGetStateFromStorage?: OnGetStateFromStorage;\n onSetStateFromStorage?: OnSetStateFromStorage;\n openNode: OpenNode;\n refreshElements: RefreshElements;\n removeFromSelection: RemoveFromSelection;\n saveState: boolean | string;\n}\n\nexport default class SaveStateHandler {\n private addToSelection: AddToSelection;\n private getNodeById: GetNodeById;\n private getSelectedNodes: GetSelectedNodes;\n private getTree: GetTree;\n private onGetStateFromStorage?: OnGetStateFromStorage;\n private onSetStateFromStorage?: OnSetStateFromStorage;\n private openNode: OpenNode;\n private refreshElements: RefreshElements;\n private removeFromSelection: RemoveFromSelection;\n private saveStateOption: boolean | string;\n private _supportsLocalStorage: boolean | null;\n\n constructor({\n addToSelection,\n getNodeById,\n getSelectedNodes,\n getTree,\n onGetStateFromStorage,\n onSetStateFromStorage,\n openNode,\n refreshElements,\n removeFromSelection,\n saveState,\n }: SaveStateHandlerParams) {\n this.addToSelection = addToSelection;\n this.getNodeById = getNodeById;\n this.getSelectedNodes = getSelectedNodes;\n this.getTree = getTree;\n this.onGetStateFromStorage = onGetStateFromStorage;\n this.onSetStateFromStorage = onSetStateFromStorage;\n this.openNode = openNode;\n this.refreshElements = refreshElements;\n this.removeFromSelection = removeFromSelection;\n this.saveStateOption = saveState;\n }\n\n public saveState(): void {\n const state = JSON.stringify(this.getState());\n\n if (this.onSetStateFromStorage) {\n this.onSetStateFromStorage(state);\n } else if (this.supportsLocalStorage()) {\n localStorage.setItem(this.getKeyName(), state);\n }\n }\n\n public getStateFromStorage(): SavedState | null {\n const jsonData = this.loadFromStorage();\n\n if (jsonData) {\n return this.parseState(jsonData) as unknown as SavedState;\n } else {\n return null;\n }\n }\n\n public getState(): SavedState {\n const getOpenNodeIds = (): NodeId[] => {\n const openNodes: NodeId[] = [];\n\n this.getTree()?.iterate((node: Node) => {\n if (node.is_open && node.id && node.hasChildren()) {\n openNodes.push(node.id);\n }\n return true;\n });\n\n return openNodes;\n };\n\n const getSelectedNodeIds = (): NodeId[] => {\n const selectedNodeIds: NodeId[] = [];\n\n this.getSelectedNodes().forEach((node) => {\n if (node.id != null) {\n selectedNodeIds.push(node.id);\n }\n });\n\n return selectedNodeIds;\n };\n\n return {\n open_nodes: getOpenNodeIds(),\n selected_node: getSelectedNodeIds(),\n };\n }\n\n /*\n Set initial state\n Don't handle nodes that are loaded on demand\n\n result: must load on demand\n */\n public setInitialState(state: SavedState): boolean {\n if (!state) {\n return false;\n } else {\n let mustLoadOnDemand = false;\n\n if (state.open_nodes) {\n mustLoadOnDemand = this.openInitialNodes(state.open_nodes);\n }\n\n if (state.selected_node) {\n this.resetSelection();\n this.selectInitialNodes(state.selected_node);\n }\n\n return mustLoadOnDemand;\n }\n }\n\n public setInitialStateOnDemand(\n state: SavedState,\n cbFinished: () => void,\n ): void {\n if (state) {\n this.doSetInitialStateOnDemand(\n state.open_nodes,\n state.selected_node,\n cbFinished,\n );\n } else {\n cbFinished();\n }\n }\n\n public getNodeIdToBeSelected(): NodeId | null {\n const state = this.getStateFromStorage();\n\n if (state && state.selected_node) {\n return state.selected_node[0] || null;\n } else {\n return null;\n }\n }\n\n private parseState(jsonData: string): SavedState {\n const state = JSON.parse(jsonData) as Record;\n\n // Check if selected_node is an int (instead of an array)\n if (state && state.selected_node && isInt(state.selected_node)) {\n // Convert to array\n state.selected_node = [state.selected_node];\n }\n\n return state as unknown as SavedState;\n }\n\n private loadFromStorage(): string | null {\n if (this.onGetStateFromStorage) {\n return this.onGetStateFromStorage();\n } else if (this.supportsLocalStorage()) {\n return localStorage.getItem(this.getKeyName());\n } else {\n return null;\n }\n }\n\n private openInitialNodes(nodeIds: NodeId[]): boolean {\n let mustLoadOnDemand = false;\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (node) {\n if (!node.load_on_demand) {\n node.is_open = true;\n } else {\n mustLoadOnDemand = true;\n }\n }\n }\n\n return mustLoadOnDemand;\n }\n\n private selectInitialNodes(nodeIds: NodeId[]): boolean {\n let selectCount = 0;\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (node) {\n selectCount += 1;\n\n this.addToSelection(node);\n }\n }\n\n return selectCount !== 0;\n }\n\n private resetSelection(): void {\n const selectedNodes = this.getSelectedNodes();\n\n selectedNodes.forEach((node) => {\n this.removeFromSelection(node);\n });\n }\n\n private doSetInitialStateOnDemand(\n nodeIdsParam: NodeId[],\n selectedNodes: NodeId[],\n cbFinished: () => void,\n ): void {\n let loadingCount = 0;\n let nodeIds = nodeIdsParam;\n\n const openNodes = (): void => {\n const newNodesIds = [];\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (!node) {\n newNodesIds.push(nodeId);\n } else {\n if (!node.is_loading) {\n if (node.load_on_demand) {\n loadAndOpenNode(node);\n } else {\n this.openNode(node, false);\n }\n }\n }\n }\n\n nodeIds = newNodesIds;\n\n if (this.selectInitialNodes(selectedNodes)) {\n this.refreshElements(null);\n }\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this.openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n openNodes();\n }\n\n private getKeyName(): string {\n if (typeof this.saveStateOption === \"string\") {\n return this.saveStateOption;\n } else {\n return \"tree\";\n }\n }\n\n private supportsLocalStorage(): boolean {\n const testSupport = (): boolean => {\n // Is local storage supported?\n if (localStorage == null) {\n return false;\n } else {\n // Check if it's possible to store an item. Safari does not allow this in private browsing mode.\n try {\n const key = \"_storage_test\";\n sessionStorage.setItem(key, \"value\");\n sessionStorage.removeItem(key);\n } catch (error) {\n return false;\n }\n\n return true;\n }\n };\n\n if (this._supportsLocalStorage == null) {\n this._supportsLocalStorage = testSupport();\n }\n\n return this._supportsLocalStorage;\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport { getElementPosition, getOffsetTop } from '../util'\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\ninterface Params {\n container: HTMLElement;\n refreshHitAreas: () => void;\n}\n\nexport default class ContainerScrollParent implements ScrollParent {\n private container: HTMLElement;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private scrollParentBottom?: number;\n private scrollParentTop?: number;\n private verticalScrollTimeout?: number;\n private verticalScrollDirection?: VerticalScrollDirection;\n\n constructor({ container, refreshHitAreas }: Params) {\n this.container = container;\n this.refreshHitAreas = refreshHitAreas;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return this.container.scrollLeft;\n }\n\n public scrollToY(top: number): void {\n this.container.scrollTop = top;\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.scrollParentTop = undefined;\n this.scrollParentBottom = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const scrollParentOffset = getElementPosition(this.container);\n\n const rightEdge = scrollParentOffset.left + this.container.clientWidth;\n const leftEdge = scrollParentOffset.left;\n const isNearRightEdge = pageX > rightEdge - 20;\n const isNearLeftEdge = pageX < leftEdge + 20;\n\n if (isNearRightEdge) {\n return \"right\";\n } else if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n if (pageY < this.getScrollParentTop()) {\n return \"top\";\n }\n\n if (pageY > this.getScrollParentBottom()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n\n this.container.scrollBy({\n left: distance,\n top: 0,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n\n this.container.scrollBy({\n left: 0,\n top: distance,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n\n private getScrollParentTop() {\n if (this.scrollParentTop == null) {\n this.scrollParentTop = getOffsetTop(this.container)\n }\n\n return this.scrollParentTop;\n }\n\n private getScrollParentBottom() {\n if (this.scrollParentBottom == null) {\n this.scrollParentBottom = this.getScrollParentTop() + this.container.clientHeight;\n }\n\n return this.scrollParentBottom;\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport { getOffsetTop } from '../util'\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\ninterface Params {\n refreshHitAreas: () => void;\n treeElement: HTMLElement;\n}\n\nexport default class DocumentScrollParent implements ScrollParent {\n private documentScrollHeight?: number;\n private documentScrollWidth?: number;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private treeElement: HTMLElement;\n private verticalScrollDirection?: VerticalScrollDirection;\n private verticalScrollTimeout?: number;\n\n constructor({ refreshHitAreas, treeElement }: Params) {\n this.refreshHitAreas = refreshHitAreas;\n this.treeElement = treeElement;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.horizontalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return document.documentElement.scrollLeft;\n }\n\n public scrollToY(top: number): void {\n const treeTop = getOffsetTop(this.treeElement);\n\n document.documentElement.scrollTop = top + treeTop;\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.documentScrollHeight = undefined;\n this.documentScrollWidth = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const scrollLeft = document.documentElement.scrollLeft;\n const windowWidth = window.innerWidth;\n\n const isNearRightEdge = pageX > windowWidth - 20;\n const isNearLeftEdge = pageX - scrollLeft < 20;\n\n if (isNearRightEdge && this.canScrollRight()) {\n return \"right\";\n }\n\n if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private canScrollRight() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollLeft + documentElement.clientWidth <\n this.getDocumentScrollWidth()\n );\n }\n\n private canScrollDown() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollTop + documentElement.clientHeight <\n this.getDocumentScrollHeight()\n );\n }\n\n private getDocumentScrollHeight() {\n // Store the original scroll height because the scroll height can increase when the drag element is moved beyond the scroll height.\n if (this.documentScrollHeight == null) {\n this.documentScrollHeight = document.documentElement.scrollHeight;\n }\n\n return this.documentScrollHeight;\n }\n\n private getDocumentScrollWidth() {\n // Store the original scroll width because the scroll width can increase when the drag element is moved beyond the scroll width.\n if (this.documentScrollWidth == null) {\n this.documentScrollWidth = document.documentElement.scrollWidth;\n }\n\n return this.documentScrollWidth;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n const scrollTop = jQuery(document).scrollTop() || 0;\n const distanceTop = pageY - scrollTop;\n\n if (distanceTop < 20) {\n return \"top\";\n }\n\n const windowHeight = window.innerHeight;\n\n if (windowHeight - (pageY - scrollTop) < 20 && this.canScrollDown()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n window.scrollBy({ left: distance, top: 0, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n window.scrollBy({ left: 0, top: distance, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport ContainerScrollParent from \"./containerScrollParent\";\nimport DocumentScrollParent from \"./documentScrollParent\";\n\nconst isOverflow = (overflowValue: string) =>\n overflowValue === \"auto\" || overflowValue === \"scroll\";\n\nconst hasOverFlow = (element: HTMLElement): boolean => {\n const style = getComputedStyle(element);\n\n return isOverflow(style.overflowX) || isOverflow(style.overflowY);\n};\n\nconst getParentWithOverflow = (\n treeElement: HTMLElement,\n): HTMLElement | null => {\n if (hasOverFlow(treeElement)) {\n return treeElement;\n }\n\n let parent = treeElement.parentElement;\n\n while (parent) {\n if (hasOverFlow(parent)) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return null;\n};\n\nconst createScrollParent = (\n treeElement: HTMLElement,\n refreshHitAreas: () => void,\n): ScrollParent => {\n const container = getParentWithOverflow(treeElement);\n\n if (container && container.tagName !== \"HTML\") {\n return new ContainerScrollParent({\n container,\n refreshHitAreas,\n });\n } else {\n return new DocumentScrollParent({ refreshHitAreas, treeElement });\n }\n};\n\nexport default createScrollParent;\n","import { PositionInfo } from \"./mouseUtils\";\nimport { ScrollParent } from \"./scrollHandler/types\";\nimport createScrollParent from \"./scrollHandler/createScrollParent\";\n\ninterface ScrollHandlerParams {\n refreshHitAreas: () => void;\n treeElement: HTMLElement;\n}\n\nexport default class ScrollHandler {\n private refreshHitAreas: () => void;\n private scrollParent?: ScrollParent;\n private treeElement: HTMLElement;\n\n constructor({ refreshHitAreas, treeElement }: ScrollHandlerParams) {\n this.refreshHitAreas = refreshHitAreas;\n this.scrollParent = undefined;\n this.treeElement = treeElement;\n }\n\n public checkScrolling(positionInfo: PositionInfo): void {\n this.checkVerticalScrolling(positionInfo);\n this.checkHorizontalScrolling(positionInfo);\n }\n\n public stopScrolling() {\n this.getScrollParent().stopScrolling();\n }\n\n public scrollToY(top: number): void {\n this.getScrollParent().scrollToY(top);\n }\n\n public getScrollLeft(): number {\n return this.getScrollParent().getScrollLeft();\n }\n\n private checkVerticalScrolling(positionInfo: PositionInfo): void {\n this.getScrollParent().checkVerticalScrolling(positionInfo.pageY);\n }\n\n private checkHorizontalScrolling(positionInfo: PositionInfo): void {\n this.getScrollParent().checkHorizontalScrolling(positionInfo.pageX);\n }\n\n private getScrollParent(): ScrollParent {\n if (!this.scrollParent) {\n this.scrollParent = createScrollParent(\n this.treeElement,\n this.refreshHitAreas,\n );\n }\n\n return this.scrollParent;\n }\n}\n","import { Node } from \"./node\";\nimport { GetNodeById } from \"./jqtreeMethodTypes\";\n\ninterface SelectNodeHandlerParameters {\n getNodeById: GetNodeById;\n}\n\nexport default class SelectNodeHandler {\n private getNodeById: GetNodeById;\n private selectedNodes: Set;\n private selectedSingleNode: Node | null;\n\n constructor({ getNodeById }: SelectNodeHandlerParameters) {\n this.getNodeById = getNodeById;\n this.selectedNodes = new Set();\n this.clear();\n }\n\n public getSelectedNode(): Node | false {\n const selectedNodes = this.getSelectedNodes();\n\n if (selectedNodes.length) {\n return selectedNodes[0] || false;\n } else {\n return false;\n }\n }\n\n public getSelectedNodes(): Node[] {\n if (this.selectedSingleNode) {\n return [this.selectedSingleNode];\n } else {\n const selectedNodes: Node[] = [];\n\n this.selectedNodes.forEach((id) => {\n const node = this.getNodeById(id);\n if (node) {\n selectedNodes.push(node);\n }\n });\n\n return selectedNodes;\n }\n }\n\n public getSelectedNodesUnder(parent: Node): Node[] {\n if (this.selectedSingleNode) {\n if (parent.isParentOf(this.selectedSingleNode)) {\n return [this.selectedSingleNode];\n } else {\n return [];\n }\n } else {\n const selectedNodes = [];\n\n for (const id in this.selectedNodes) {\n if (\n Object.prototype.hasOwnProperty.call(this.selectedNodes, id)\n ) {\n const node = this.getNodeById(id);\n if (node && parent.isParentOf(node)) {\n selectedNodes.push(node);\n }\n }\n }\n\n return selectedNodes;\n }\n }\n\n public isNodeSelected(node: Node): boolean {\n if (node.id != null) {\n return this.selectedNodes.has(node.id);\n } else if (this.selectedSingleNode) {\n return this.selectedSingleNode.element === node.element;\n } else {\n return false;\n }\n }\n\n public clear(): void {\n this.selectedNodes.clear();\n this.selectedSingleNode = null;\n }\n\n public removeFromSelection(node: Node, includeChildren = false): void {\n if (node.id == null) {\n if (\n this.selectedSingleNode &&\n node.element === this.selectedSingleNode.element\n ) {\n this.selectedSingleNode = null;\n }\n } else {\n this.selectedNodes.delete(node.id);\n\n if (includeChildren) {\n node.iterate(() => {\n if (node.id != null) {\n this.selectedNodes.delete(node.id);\n }\n return true;\n });\n }\n }\n }\n\n public addToSelection(node: Node): void {\n if (node.id != null) {\n this.selectedNodes.add(node.id);\n } else {\n this.selectedSingleNode = node;\n }\n }\n}\n","const register = (widgetClass: unknown, widgetName: string): void => {\n const getDataKey = (): string => `simple_widget_${widgetName}`;\n\n const getWidgetData = (\n el: HTMLElement,\n dataKey: string\n ): SimpleWidget | null => {\n const widget = jQuery.data(el, dataKey) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n return widget;\n } else {\n return null;\n }\n };\n\n const createWidget = ($el: JQuery, options: unknown): JQuery => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const existingWidget = getWidgetData(el, dataKey);\n\n if (!existingWidget) {\n const simpleWidgetClass = widgetClass as typeof SimpleWidget;\n const widget = new simpleWidgetClass(el, options);\n\n if (!jQuery.data(el, dataKey)) {\n jQuery.data(el, dataKey, widget);\n }\n\n // Call init after setting data, so we can call methods\n widget.init();\n }\n }\n\n return $el;\n };\n\n const destroyWidget = ($el: JQuery): void => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const widget = getWidgetData(el, dataKey);\n\n if (widget) {\n widget.destroy();\n }\n\n jQuery.removeData(el, dataKey);\n }\n };\n\n const callFunction = (\n $el: JQuery,\n functionName: string,\n args: unknown[]\n ): unknown => {\n let result = null;\n\n for (const el of $el.get()) {\n const widget = jQuery.data(el, getDataKey()) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n const simpleWidget = widget as SimpleWidget;\n const widgetFunction = simpleWidget[functionName];\n\n if (widgetFunction && typeof widgetFunction === \"function\") {\n result = widgetFunction.apply(widget, args) as unknown;\n }\n }\n }\n\n return result;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (jQuery.fn as any)[widgetName] = function (\n this: JQuery,\n argument1: unknown,\n ...args: unknown[]\n ) {\n if (!argument1) {\n return createWidget(this, null);\n } else if (typeof argument1 === \"object\") {\n const options = argument1 as unknown;\n return createWidget(this, options);\n } else if (typeof argument1 === \"string\" && argument1[0] !== \"_\") {\n const functionName = argument1;\n\n if (functionName === \"destroy\") {\n return destroyWidget(this);\n } else if (functionName === \"get_widget_class\") {\n return widgetClass;\n } else {\n return callFunction(this, functionName, args);\n }\n } else {\n return undefined;\n }\n };\n};\n\nexport default class SimpleWidget {\n public static register(widgetClass: unknown, widgetName: string): void {\n register(widgetClass, widgetName);\n }\n\n [key: string]: unknown;\n\n protected static defaults: unknown = {};\n\n public options: WidgetOptions;\n\n public $el: JQuery;\n\n constructor(el: HTMLElement, options: WidgetOptions) {\n this.$el = jQuery(el);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const defaults = (this.constructor as any)[\"defaults\"] as WidgetOptions;\n this.options = { ...defaults, ...options };\n }\n\n public destroy(): void {\n this.deinit();\n }\n\n public init(): void {\n //\n }\n\n public deinit(): void {\n //\n }\n}\n","interface NodeRecordWithChildren extends NodeRecord {\n children: NodeData[];\n}\n\nexport const isNodeRecordWithChildren = (\n data: NodeData,\n): data is NodeRecordWithChildren =>\n typeof data === \"object\" &&\n \"children\" in data &&\n data[\"children\"] instanceof Array;\n","import { isNodeRecordWithChildren } from \"./nodeUtils\";\nimport { Position } from \"./position\";\n\ntype IterateCallback = (node: Node, level: number) => boolean;\n\nexport class Node implements INode {\n public id?: NodeId;\n public name: string;\n public children: Node[];\n public parent: Node | null;\n public idMapping: Map;\n public tree?: Node;\n public nodeClass?: typeof Node;\n public load_on_demand: boolean;\n public is_open: boolean;\n public element: HTMLElement;\n public is_loading: boolean;\n public isEmptyFolder: boolean;\n\n [key: string]: unknown;\n\n constructor(\n nodeData: NodeData | null = null,\n isRoot = false,\n nodeClass = Node,\n ) {\n this.name = \"\";\n this.load_on_demand = false;\n\n this.isEmptyFolder =\n nodeData != null &&\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length === 0;\n\n this.setData(nodeData);\n\n this.children = [];\n this.parent = null;\n\n if (isRoot) {\n this.idMapping = new Map();\n this.tree = this;\n this.nodeClass = nodeClass;\n }\n }\n\n /*\n Set the data of this node.\n\n setData(string): set the name of the node\n setData(object): set attributes of the node\n\n Examples:\n setData('node1')\n\n setData({ name: 'node1', id: 1});\n\n setData({ name: 'node2', id: 2, color: 'green'});\n\n * This is an internal function; it is not in the docs\n * Does not remove existing node values\n */\n public setData(o: NodeData | null): void {\n if (!o) {\n return;\n } else if (typeof o === \"string\") {\n this.name = o;\n } else if (typeof o === \"object\") {\n for (const key in o) {\n if (Object.prototype.hasOwnProperty.call(o, key)) {\n const value = o[key];\n\n if (key === \"label\" || key === \"name\") {\n // You can use the 'label' key instead of 'name'; this is a legacy feature\n if (typeof value === \"string\") {\n this.name = value;\n }\n } else if (key !== \"children\" && key !== \"parent\") {\n // You can't update the children or the parent using this function\n this[key] = value;\n }\n }\n }\n }\n }\n\n /*\n Create tree from data.\n\n Structure of data is:\n [\n {\n name: 'node1',\n children: [\n { name: 'child1' },\n { name: 'child2' }\n ]\n },\n {\n name: 'node2'\n }\n ]\n */\n public loadFromData(data: NodeData[]): Node {\n this.removeChildren();\n\n for (const childData of data) {\n const node = this.createNode(childData);\n this.addChild(node);\n\n if (isNodeRecordWithChildren(childData)) {\n node.loadFromData(childData.children);\n }\n }\n\n return this;\n }\n\n /*\n Add child.\n\n tree.addChild(\n new Node('child1')\n );\n */\n public addChild(node: Node): void {\n this.children.push(node);\n node.setParent(this);\n }\n\n /*\n Add child at position. Index starts at 0.\n\n tree.addChildAtPosition(\n new Node('abc'),\n 1\n );\n */\n public addChildAtPosition(node: Node, index: number): void {\n this.children.splice(index, 0, node);\n node.setParent(this);\n }\n\n /*\n Remove child. This also removes the children of the node.\n\n tree.removeChild(tree.children[0]);\n */\n public removeChild(node: Node): void {\n // remove children from the index\n node.removeChildren();\n\n this.doRemoveChild(node);\n }\n\n /*\n Get child index.\n\n var index = getChildIndex(node);\n */\n public getChildIndex(node: Node): number {\n return this.children.indexOf(node);\n }\n\n /*\n Does the tree have children?\n\n if (tree.hasChildren()) {\n //\n }\n */\n public hasChildren(): boolean {\n return this.children.length !== 0;\n }\n\n public isFolder(): boolean {\n return this.hasChildren() || this.load_on_demand;\n }\n\n /*\n Iterate over all the nodes in the tree.\n\n Calls callback with (node, level).\n\n The callback must return true to continue the iteration on current node.\n\n tree.iterate(\n function(node, level) {\n console.log(node.name);\n\n // stop iteration after level 2\n return (level <= 2);\n }\n );\n\n */\n public iterate(callback: IterateCallback): void {\n const _iterate = (node: Node, level: number): void => {\n if (node.children) {\n for (const child of node.children) {\n const result = callback(child, level);\n\n if (result && child.hasChildren()) {\n _iterate(child, level + 1);\n }\n }\n }\n };\n\n _iterate(this, 0);\n }\n\n /*\n Move node relative to another node.\n\n Argument position: Position.BEFORE, Position.AFTER or Position.Inside\n\n // move node1 after node2\n tree.moveNode(node1, node2, Position.AFTER);\n */\n public moveNode(\n movedNode: Node,\n targetNode: Node,\n position: Position,\n ): boolean {\n if (!movedNode.parent || movedNode.isParentOf(targetNode)) {\n // - Node is parent of target node\n // - Or, parent is empty\n return false;\n } else {\n movedNode.parent.doRemoveChild(movedNode);\n\n switch (position) {\n case Position.After: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode) + 1,\n );\n return true;\n }\n return false;\n }\n\n case Position.Before: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode),\n );\n return true;\n }\n return false;\n }\n\n case Position.Inside: {\n // move inside as first child\n targetNode.addChildAtPosition(movedNode, 0);\n return true;\n }\n\n default:\n return false;\n }\n }\n }\n\n /*\n Get the tree as data.\n */\n public getData(includeParent = false): NodeRecord[] {\n const getDataFromNodes = (nodes: Node[]): Record[] => {\n return nodes.map((node) => {\n const tmpNode: Record = {};\n\n for (const k in node) {\n if (\n [\n \"parent\",\n \"children\",\n \"element\",\n \"idMapping\",\n \"load_on_demand\",\n \"nodeClass\",\n \"tree\",\n \"isEmptyFolder\",\n ].indexOf(k) === -1 &&\n Object.prototype.hasOwnProperty.call(node, k)\n ) {\n const v = node[k];\n tmpNode[k] = v;\n }\n }\n\n if (node.hasChildren()) {\n tmpNode[\"children\"] = getDataFromNodes(node.children);\n }\n\n return tmpNode;\n });\n };\n\n if (includeParent) {\n return getDataFromNodes([this]);\n } else {\n return getDataFromNodes(this.children);\n }\n }\n\n public getNodeByName(name: string): Node | null {\n return this.getNodeByCallback((node: Node) => node.name === name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n const node = this.getNodeByCallback((n: Node) => n.name === name);\n\n if (!node) {\n throw `Node with name ${name} not found`;\n }\n\n return node;\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n let result: Node | null = null;\n\n this.iterate((node: Node) => {\n if (result) {\n return false;\n } else if (callback(node)) {\n result = node;\n return false;\n } else {\n return true;\n }\n });\n\n return result;\n }\n\n public addAfter(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex + 1);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addBefore(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addParent(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const newParent = this.createNode(nodeInfo);\n\n if (this.tree) {\n newParent.setParent(this.tree);\n }\n const originalParent = this.parent;\n\n for (const child of originalParent.children) {\n newParent.addChild(child);\n }\n\n originalParent.children = [];\n originalParent.addChild(newParent);\n return newParent;\n }\n }\n\n public remove(): void {\n if (this.parent) {\n this.parent.removeChild(this);\n this.parent = null;\n }\n }\n\n public append(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChild(node);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public prepend(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChildAtPosition(node, 0);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public isParentOf(node: Node): boolean {\n let parent = node.parent;\n\n while (parent) {\n if (parent === this) {\n return true;\n }\n\n parent = parent.parent;\n }\n\n return false;\n }\n\n public getLevel(): number {\n let level = 0;\n let node: Node = this; // eslint-disable-line @typescript-eslint/no-this-alias\n\n while (node.parent) {\n level += 1;\n node = node.parent;\n }\n\n return level;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.idMapping.get(nodeId) || null;\n }\n\n public addNodeToIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.set(node.id, node);\n }\n }\n\n public removeNodeFromIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.delete(node.id);\n }\n }\n\n public removeChildren(): void {\n this.iterate((child: Node) => {\n this.tree?.removeNodeFromIndex(child);\n return true;\n });\n\n this.children = [];\n }\n\n public getPreviousSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousIndex = this.parent.getChildIndex(this) - 1;\n if (previousIndex >= 0) {\n return this.parent.children[previousIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNextSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const nextIndex = this.parent.getChildIndex(this) + 1;\n if (nextIndex < this.parent.children.length) {\n return this.parent.children[nextIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.filter((node: Node) => node[key] === value);\n }\n\n public filter(f: (node: Node) => boolean): Node[] {\n const result: Node[] = [];\n\n this.iterate((node: Node) => {\n if (f(node)) {\n result.push(node);\n }\n\n return true;\n });\n\n return result;\n }\n\n public getNextNode(includeChildren = true): Node | null {\n if (includeChildren && this.hasChildren()) {\n return this.children[0] || null;\n } else if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n\n if (nextSibling) {\n return nextSibling;\n } else {\n return this.parent.getNextNode(false);\n }\n }\n }\n\n public getNextVisibleNode(): Node | null {\n if (this.hasChildren() && this.is_open) {\n // First child\n return this.children[0] || null;\n } else {\n if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n if (nextSibling) {\n // Next sibling\n return nextSibling;\n } else {\n // Next node of parent\n return this.parent.getNextNode(false);\n }\n }\n }\n }\n\n public getPreviousNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (previousSibling.hasChildren()) {\n return previousSibling.getLastChild();\n } else {\n return previousSibling;\n }\n }\n }\n\n public getPreviousVisibleNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (\n !previousSibling.hasChildren() ||\n !previousSibling.is_open\n ) {\n // Previous sibling\n return previousSibling;\n } else {\n // Last child of previous sibling\n return previousSibling.getLastChild();\n }\n }\n }\n\n public getParent(): Node | null {\n // Return parent except if it is the root node\n if (!this.parent) {\n return null;\n } else if (!this.parent.parent) {\n // Root node -> null\n return null;\n } else {\n return this.parent;\n }\n }\n\n public getLastChild(): Node | null {\n if (!this.hasChildren()) {\n return null;\n } else {\n const lastChild = this.children[this.children.length - 1];\n\n if (!lastChild) {\n return null;\n }\n\n if (!(lastChild.hasChildren() && lastChild.is_open)) {\n return lastChild;\n } else {\n return lastChild?.getLastChild();\n }\n }\n }\n\n // Init Node from data without making it the root of the tree\n public initFromData(data: NodeData): void {\n const addNode = (nodeData: NodeData): void => {\n this.setData(nodeData);\n\n if (\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length\n ) {\n addChildren(nodeData.children);\n }\n };\n\n const addChildren = (childrenData: NodeData[]): void => {\n for (const child of childrenData) {\n const node = this.createNode();\n node.initFromData(child);\n this.addChild(node);\n }\n };\n\n addNode(data);\n }\n\n private setParent(parent: Node): void {\n this.parent = parent;\n this.tree = parent.tree;\n this.tree?.addNodeToIndex(this);\n }\n\n private doRemoveChild(node: Node): void {\n this.children.splice(this.getChildIndex(node), 1);\n this.tree?.removeNodeFromIndex(node);\n }\n\n private getNodeClass(): typeof Node {\n return this.nodeClass || this?.tree?.nodeClass || Node;\n }\n\n private createNode(nodeData?: NodeData): Node {\n const nodeClass = this.getNodeClass();\n return new nodeClass(nodeData);\n }\n\n // Load children data from nodeInfo if it has children\n private loadChildrenFromData(nodeInfo: NodeData) {\n if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {\n this.loadFromData(nodeInfo.children);\n }\n }\n}\n","import { DropHint } from \"../dragAndDropHandler/types\";\n\nclass BorderDropHint implements DropHint {\n private hint?: HTMLElement;\n\n constructor(element: HTMLElement, scrollLeft: number) {\n const div = element.querySelector(\":scope > .jqtree-element\");\n\n if (!div) {\n this.hint = undefined;\n return;\n }\n\n const width = Math.max(element.offsetWidth + scrollLeft - 4, 0);\n const height = Math.max(element.clientHeight - 4, 0);\n\n const hint = document.createElement(\"span\");\n hint.className = \"jqtree-border\";\n hint.style.width = `${width}px`;\n hint.style.height = `${height}px`;\n\n this.hint = hint;\n\n div.append(this.hint);\n }\n\n public remove(): void {\n this.hint?.remove();\n }\n}\n\nexport default BorderDropHint;\n","import { Node } from \"../node\";\nimport { Position } from \"../position\";\nimport { DropHint } from \"../dragAndDropHandler/types\";\n\nclass GhostDropHint implements DropHint {\n private element: HTMLElement;\n private node: Node;\n private ghost: HTMLElement;\n\n constructor(node: Node, element: HTMLElement, position: Position) {\n this.element = element;\n this.node = node;\n this.ghost = this.createGhostElement();\n\n if (position === Position.After) {\n this.moveAfter();\n } else if (position === Position.Before) {\n this.moveBefore();\n } else if (position === Position.Inside) {\n if (node.isFolder() && node.is_open) {\n this.moveInsideOpenFolder();\n } else {\n this.moveInside();\n }\n }\n }\n\n public remove(): void {\n this.ghost.remove();\n }\n\n private moveAfter(): void {\n this.element.after(this.ghost);\n }\n\n private moveBefore(): void {\n this.element.before(this.ghost);\n }\n\n private moveInsideOpenFolder(): void {\n const childElement = this.node.children[0]?.element;\n\n if (childElement) {\n childElement.before(this.ghost);\n }\n }\n\n private moveInside(): void {\n this.element.after(this.ghost);\n this.ghost.classList.add(\"jqtree-inside\");\n }\n\n private createGhostElement() {\n const ghost = document.createElement(\"li\");\n ghost.className = \"jqtree_common jqtree-ghost\";\n\n const circleSpan = document.createElement(\"span\");\n circleSpan.className = \"jqtree_common jqtree-circle\";\n ghost.append(circleSpan);\n\n const lineSpan = document.createElement(\"span\");\n lineSpan.className = \"jqtree_common jqtree-line\";\n ghost.append(lineSpan);\n\n return ghost;\n }\n}\n\nexport default GhostDropHint;\n","import { Node } from \"../node\";\nimport { Position } from \"../position\";\nimport { DropHint } from \"../dragAndDropHandler/types\";\nimport BorderDropHint from \"./borderDropHint\";\nimport GhostDropHint from \"./ghostDropHint\";\nimport { GetScrollLeft } from \"../jqtreeMethodTypes\";\n\nexport interface NodeElementParams {\n getScrollLeft: GetScrollLeft;\n node: Node;\n tabIndex?: number;\n $treeElement: JQuery;\n}\n\nclass NodeElement {\n public node: Node;\n public element: HTMLElement;\n private getScrollLeft: GetScrollLeft;\n private tabIndex?: number;\n private $treeElement: JQuery;\n\n constructor({\n getScrollLeft,\n node,\n tabIndex,\n $treeElement,\n }: NodeElementParams) {\n this.getScrollLeft = getScrollLeft;\n this.tabIndex = tabIndex;\n this.$treeElement = $treeElement;\n\n this.init(node);\n }\n\n public init(node: Node): void {\n this.node = node;\n\n if (!node.element) {\n const element = this.$treeElement.get(0);\n\n if (element) {\n node.element = element;\n }\n }\n\n if (node.element) {\n this.element = node.element;\n }\n }\n\n public addDropHint(position: number): DropHint {\n if (this.mustShowBorderDropHint(position)) {\n return new BorderDropHint(this.element, this.getScrollLeft());\n } else {\n return new GhostDropHint(this.node, this.element, position);\n }\n }\n\n public select(mustSetFocus: boolean): void {\n this.element.classList.add(\"jqtree-selected\");\n\n const titleSpan = this.getTitleSpan();\n const tabIndex = this.tabIndex;\n\n // Check for null or undefined\n if (tabIndex != null) {\n titleSpan.setAttribute(\"tabindex\", tabIndex.toString());\n }\n\n titleSpan.setAttribute(\"aria-selected\", \"true\");\n\n if (mustSetFocus) {\n titleSpan.focus();\n }\n }\n\n public deselect(): void {\n this.element.classList.remove(\"jqtree-selected\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.removeAttribute(\"tabindex\");\n titleSpan.setAttribute(\"aria-selected\", \"false\");\n\n titleSpan.blur();\n }\n\n protected getUl(): HTMLUListElement {\n return this.element.querySelector(\":scope > ul\") as HTMLUListElement;\n }\n\n protected getTitleSpan(): HTMLSpanElement {\n return this.element.querySelector(\n \":scope > .jqtree-element > span.jqtree-title\",\n ) as HTMLSpanElement;\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return position === Position.Inside;\n }\n}\n\nexport default NodeElement;\n","import { Position } from \"../position\";\nimport NodeElement, { NodeElementParams } from \"./index\";\nimport { OnFinishOpenNode, TriggerEvent } from \"../jqtreeMethodTypes\";\n\ninterface FolderElementParams extends NodeElementParams {\n closedIconElement?: HTMLElement | Text;\n openedIconElement?: HTMLElement | Text;\n triggerEvent: TriggerEvent;\n}\n\nclass FolderElement extends NodeElement {\n private closedIconElement?: HTMLElement | Text;\n private openedIconElement?: HTMLElement | Text;\n private triggerEvent: TriggerEvent;\n\n constructor({\n closedIconElement,\n getScrollLeft,\n node,\n openedIconElement,\n tabIndex,\n $treeElement,\n triggerEvent,\n }: FolderElementParams) {\n super({\n getScrollLeft,\n node,\n tabIndex,\n $treeElement,\n });\n\n this.closedIconElement = closedIconElement;\n this.openedIconElement = openedIconElement;\n this.triggerEvent = triggerEvent;\n }\n\n public open(\n onFinished: OnFinishOpenNode | undefined,\n slide = true,\n animationSpeed: JQuery.Duration = \"fast\",\n ): void {\n if (this.node.is_open) {\n return;\n }\n\n this.node.is_open = true;\n\n const button = this.getButton();\n button.classList.remove(\"jqtree-closed\");\n button.innerHTML = \"\";\n\n const openedIconElement = this.openedIconElement;\n\n if (openedIconElement) {\n const icon = openedIconElement.cloneNode(true);\n button.appendChild(icon);\n }\n\n const doOpen = (): void => {\n this.element.classList.remove(\"jqtree-closed\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"true\");\n\n if (onFinished) {\n onFinished(this.node);\n }\n\n this.triggerEvent(\"tree.open\", {\n node: this.node,\n });\n };\n\n if (slide) {\n jQuery(this.getUl()).slideDown(animationSpeed, doOpen);\n } else {\n jQuery(this.getUl()).show();\n doOpen();\n }\n }\n\n public close(\n slide = true,\n animationSpeed: JQuery.Duration | undefined = \"fast\",\n ): void {\n if (!this.node.is_open) {\n return;\n }\n\n this.node.is_open = false;\n\n const button = this.getButton();\n button.classList.add(\"jqtree-closed\");\n button.innerHTML = \"\";\n\n const closedIconElement = this.closedIconElement;\n\n if (closedIconElement) {\n const icon = closedIconElement.cloneNode(true);\n button.appendChild(icon);\n }\n\n const doClose = (): void => {\n this.element.classList.add(\"jqtree-closed\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"false\");\n\n this.triggerEvent(\"tree.close\", {\n node: this.node,\n });\n };\n\n if (slide) {\n jQuery(this.getUl()).slideUp(animationSpeed, doClose);\n } else {\n jQuery(this.getUl()).hide();\n doClose();\n }\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return !this.node.is_open && position === Position.Inside;\n }\n\n private getButton(): HTMLLinkElement {\n return this.element.querySelector(\n \":scope > .jqtree-element > a.jqtree-toggler\",\n ) as HTMLLinkElement;\n }\n}\n\nexport default FolderElement;\n","import __version__ from \"./version\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport DataLoader, { HandleFinishedLoading } from \"./dataLoader\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseHandler from \"./mouseHandler\";\nimport { PositionInfo } from \"./mouseUtils\";\nimport SaveStateHandler, { SavedState } from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport SimpleWidget from \"./simple.widget\";\nimport { getOffsetTop, isFunction } from \"./util\";\nimport { Node } from \"./node\";\nimport { getPosition } from \"./position\";\nimport NodeElement from \"./nodeElement\";\nimport FolderElement from \"./nodeElement/folderElement\";\nimport { OnFinishOpenNode } from \"./jqtreeMethodTypes\";\nimport { JQTreeOptions } from \"./jqtreeOptions\";\n\ninterface SelectNodeOptions {\n mustToggle?: boolean;\n mustSetFocus?: boolean;\n}\n\nconst NODE_PARAM_IS_EMPTY = \"Node parameter is empty\";\nconst PARAM_IS_EMPTY = \"Parameter is empty: \";\n\nexport class JqTreeWidget extends SimpleWidget {\n protected static defaults: JQTreeOptions = {\n animationSpeed: \"fast\",\n autoEscape: true,\n autoOpen: false, // true / false / int (open n levels starting at 0)\n buttonLeft: true,\n // The symbol to use for a closed node - â–º BLACK RIGHT-POINTING POINTER\n // http://www.fileformat.info/info/unicode/char/25ba/index.htm\n closedIcon: undefined,\n data: undefined,\n dataFilter: undefined,\n dataUrl: undefined,\n dragAndDrop: false,\n keyboardSupport: true,\n nodeClass: Node,\n onCanMove: undefined, // Can this node be moved?\n onCanMoveTo: undefined, // Can this node be moved to this position? function(moved_node, target_node, position)\n onCanSelectNode: undefined,\n onCreateLi: undefined,\n onDragMove: undefined,\n onDragStop: undefined,\n onGetStateFromStorage: undefined,\n onIsMoveHandle: undefined,\n onLoadFailed: undefined,\n onSetStateFromStorage: undefined,\n openedIcon: \"▼\",\n openFolderDelay: 500, // The delay for opening a folder during drag and drop; the value is in milliseconds\n // The symbol to use for an open node - â–¼ BLACK DOWN-POINTING TRIANGLE\n // http://www.fileformat.info/info/unicode/char/25bc/index.htm\n rtl: undefined, // right-to-left support; true / false (default)\n saveState: false, // true / false / string (cookie name)\n selectable: true,\n showEmptyFolder: false,\n slide: true, // must display slide animation?\n startDndDelay: 300, // The delay for starting dnd (in milliseconds)\n tabIndex: 0,\n useContextMenu: true,\n };\n\n private element: JQuery;\n private isInitialized: boolean;\n private tree: Node;\n\n private dataLoader: DataLoader;\n private dndHandler: DragAndDropHandler;\n private keyHandler: KeyHandler;\n private mouseHandler: MouseHandler;\n private renderer: ElementsRenderer;\n private saveStateHandler: SaveStateHandler;\n private scrollHandler: ScrollHandler;\n private selectNodeHandler: SelectNodeHandler;\n\n public toggle(node: Node, slideParam: null | boolean = null): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.is_open) {\n this.closeNode(node, slide);\n } else {\n this.openNode(node, slide);\n }\n\n return this.element;\n }\n\n public getTree(): Node {\n return this.tree;\n }\n\n public selectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): JQuery {\n this.doSelectNode(node, optionsParam);\n return this.element;\n }\n\n public getSelectedNode(): Node | false {\n return this.selectNodeHandler.getSelectedNode();\n }\n\n public toJson(): string {\n return JSON.stringify(this.tree.getData());\n }\n\n public loadData(data: NodeData[], parentNode: Node | null): JQuery {\n this.doLoadData(data, parentNode);\n return this.element;\n }\n\n /*\n signatures:\n - loadDataFromUrl(url, parent_node=null, on_finished=null)\n loadDataFromUrl('/my_data');\n loadDataFromUrl('/my_data', node1);\n loadDataFromUrl('/my_data', node1, function() { console.log('finished'); });\n loadDataFromUrl('/my_data', null, function() { console.log('finished'); });\n\n - loadDataFromUrl(parent_node=null, on_finished=null)\n loadDataFromUrl();\n loadDataFromUrl(node1);\n loadDataFromUrl(null, function() { console.log('finished'); });\n loadDataFromUrl(node1, function() { console.log('finished'); });\n */\n public loadDataFromUrl(\n param1: string | null | Node,\n param2?: Node | null | HandleFinishedLoading,\n param3?: HandleFinishedLoading,\n ): JQuery {\n if (typeof param1 === \"string\") {\n // first parameter is url\n this.doLoadDataFromUrl(\n param1,\n param2 as Node | null,\n param3 ?? null,\n );\n } else {\n // first parameter is not url\n this.doLoadDataFromUrl(\n null,\n param1,\n param2 as HandleFinishedLoading | null,\n );\n }\n\n return this.element;\n }\n\n public reload(onFinished: HandleFinishedLoading | null): JQuery {\n this.doLoadDataFromUrl(null, null, onFinished);\n return this.element;\n }\n\n public refresh(): JQuery {\n this.refreshElements(null);\n return this.element;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.tree.getNodeById(nodeId);\n }\n\n public getNodeByName(name: string): Node | null {\n return this.tree.getNodeByName(name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n return this.tree.getNodeByNameMustExist(name);\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.tree.getNodesByProperty(key, value);\n }\n\n public getNodeByHtmlElement(\n inputElement: HTMLElement | JQuery,\n ): Node | null {\n const element =\n inputElement instanceof HTMLElement\n ? inputElement\n : inputElement[0];\n\n if (!element) {\n return null;\n }\n\n return this.getNode(element);\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n return this.tree.getNodeByCallback(callback);\n }\n\n public openNode(\n node: Node,\n param1?: boolean | OnFinishOpenNode,\n param2?: OnFinishOpenNode,\n ): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const parseParams = (): [boolean, OnFinishOpenNode | undefined] => {\n let onFinished: OnFinishOpenNode | null;\n let slide: boolean | null;\n\n if (isFunction(param1)) {\n onFinished = param1 as OnFinishOpenNode;\n slide = null;\n } else {\n slide = param1 as boolean;\n onFinished = param2 as OnFinishOpenNode;\n }\n\n if (slide == null) {\n slide = this.options.slide ?? false;\n }\n\n return [slide, onFinished];\n };\n\n const [slide, onFinished] = parseParams();\n\n this.openNodeInternal(node, slide, onFinished);\n return this.element;\n }\n\n public closeNode(node: Node, slideParam?: null | boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.isFolder() || node.isEmptyFolder) {\n this.createFolderElement(node).close(\n slide,\n this.options.animationSpeed,\n );\n\n this.saveState();\n }\n\n return this.element;\n }\n\n public isDragging(): boolean {\n return this.dndHandler.isDragging;\n }\n\n public refreshHitAreas(): JQuery {\n this.dndHandler.refresh();\n return this.element;\n }\n\n public addNodeAfter(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n const newNode = existingNode.addAfter(newNodeInfo);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addNodeBefore(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addBefore(newNodeInfo);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addParentNode(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addParent(newNodeInfo);\n\n if (newNode) {\n this.refreshElements(newNode.parent);\n }\n\n return newNode;\n }\n\n public removeNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!node.parent) {\n throw Error(\"Node has no parent\");\n }\n\n this.selectNodeHandler.removeFromSelection(node, true); // including children\n\n const parent = node.parent;\n node.remove();\n this.refreshElements(parent);\n\n return this.element;\n }\n\n public appendNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam || this.tree;\n\n const node = parentNode.append(newNodeInfo);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n public prependNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam ?? this.tree;\n\n const node = parentNode.prepend(newNodeInfo);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n public updateNode(node: Node, data: NodeData): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\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 as Node[]);\n }\n }\n\n this.refreshElements(node);\n\n return this.element;\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 public moveNode(node: Node, targetNode: Node, position: string): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!targetNode) {\n throw Error(PARAM_IS_EMPTY + \"targetNode\");\n }\n\n const positionIndex = getPosition(position);\n\n if (positionIndex !== undefined) {\n this.tree.moveNode(node, targetNode, positionIndex);\n this.refreshElements(null);\n }\n\n return this.element;\n }\n\n public getStateFromStorage(): SavedState | null {\n return this.saveStateHandler.getStateFromStorage();\n }\n\n public addToSelection(node: Node, mustSetFocus?: boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.addToSelection(node);\n this.openParents(node);\n\n this.getNodeElementForNode(node).select(\n mustSetFocus === undefined ? true : mustSetFocus,\n );\n\n this.saveState();\n\n return this.element;\n }\n\n public getSelectedNodes(): Node[] {\n return this.selectNodeHandler.getSelectedNodes();\n }\n\n public isNodeSelected(node: Node): boolean {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n return this.selectNodeHandler.isNodeSelected(node);\n }\n\n public removeFromSelection(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.removeFromSelection(node);\n\n this.getNodeElementForNode(node).deselect();\n this.saveState();\n\n return this.element;\n }\n\n public scrollToNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const top =\n getOffsetTop(node.element) -\n getOffsetTop(this.$el.get(0) as HTMLElement);\n\n this.scrollHandler.scrollToY(top);\n\n return this.element;\n }\n\n public getState(): SavedState | null {\n return this.saveStateHandler.getState();\n }\n\n public setState(state: SavedState): JQuery {\n this.saveStateHandler.setInitialState(state);\n this.refreshElements(null);\n\n return this.element;\n }\n\n public setOption(option: string, value: unknown): JQuery {\n (this.options as unknown as Record)[option] = value;\n return this.element;\n }\n\n public moveDown(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveDown(selectedNode);\n }\n\n return this.element;\n }\n\n public moveUp(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveUp(selectedNode);\n }\n\n return this.element;\n }\n\n public getVersion(): string {\n return __version__;\n }\n\n private openNodeInternal(\n node: Node,\n slide = true,\n onFinished?: OnFinishOpenNode,\n ): void {\n const doOpenNode = (\n _node: Node,\n _slide: boolean,\n _onFinished?: OnFinishOpenNode,\n ): void => {\n const folderElement = this.createFolderElement(_node);\n folderElement.open(\n _onFinished,\n _slide,\n this.options.animationSpeed,\n );\n };\n\n if (node.isFolder() || node.isEmptyFolder) {\n if (node.load_on_demand) {\n this.loadFolderOnDemand(node, slide, onFinished);\n } else {\n let parent = node.parent;\n\n while (parent) {\n // nb: do not open root element\n if (parent.parent) {\n doOpenNode(parent, false);\n }\n parent = parent.parent;\n }\n\n doOpenNode(node, slide, onFinished);\n this.saveState();\n }\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 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 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 public init(): void {\n super.init();\n\n this.element = this.$el;\n this.isInitialized = false;\n\n this.options.rtl = this.getRtlOption();\n\n if (this.options.closedIcon == null) {\n this.options.closedIcon = this.getDefaultClosedIcon();\n }\n\n this.connectHandlers();\n\n this.initData();\n }\n\n public deinit(): void {\n this.element.empty();\n this.element.off();\n\n this.keyHandler.deinit();\n this.mouseHandler.deinit();\n\n this.tree = new Node({}, true);\n\n super.deinit();\n }\n\n private triggerEvent(\n eventName: string,\n values?: Record,\n ): JQuery.Event {\n const event = jQuery.Event(eventName, values);\n this.element.trigger(event);\n return event;\n }\n\n private mouseCapture(positionInfo: PositionInfo): boolean | null {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseCapture(positionInfo);\n } else {\n return false;\n }\n }\n\n private mouseStart(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseStart(positionInfo);\n } else {\n return false;\n }\n }\n\n private mouseDrag(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n const result = this.dndHandler.mouseDrag(positionInfo);\n\n this.scrollHandler.checkScrolling(positionInfo);\n return result;\n } else {\n return false;\n }\n }\n\n private mouseStop(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n this.scrollHandler.stopScrolling();\n return this.dndHandler.mouseStop(positionInfo);\n } else {\n return false;\n }\n }\n\n private initData(): void {\n if (this.options.data) {\n this.doLoadData(this.options.data, null);\n } else {\n const dataUrl = this.getDataUrlInfo(null);\n\n if (dataUrl) {\n this.doLoadDataFromUrl(null, null, null);\n } else {\n this.doLoadData([], null);\n }\n }\n }\n\n private getDataUrlInfo(node: Node | null): JQuery.AjaxSettings | null {\n const dataUrl =\n this.options.dataUrl || (this.element.data(\"url\") as string | null);\n\n const getUrlFromString = (url: string): JQuery.AjaxSettings => {\n const urlInfo: JQuery.AjaxSettings = { url };\n\n setUrlInfoData(urlInfo);\n\n return urlInfo;\n };\n\n const setUrlInfoData = (urlInfo: JQuery.AjaxSettings): void => {\n if (node?.id) {\n // Load on demand of a subtree; add node parameter\n const data = { node: node.id };\n urlInfo[\"data\"] = data;\n } else {\n // Add selected_node parameter\n const selectedNodeId = this.getNodeIdToBeSelected();\n if (selectedNodeId) {\n const data = { selected_node: selectedNodeId };\n urlInfo[\"data\"] = data;\n }\n }\n };\n\n if (typeof dataUrl === \"function\") {\n return dataUrl(node);\n } else if (typeof dataUrl === \"string\") {\n return getUrlFromString(dataUrl);\n } else if (dataUrl && typeof dataUrl === \"object\") {\n setUrlInfoData(dataUrl);\n return dataUrl;\n } else {\n return null;\n }\n }\n\n private getNodeIdToBeSelected(): NodeId | null {\n if (this.options.saveState) {\n return this.saveStateHandler.getNodeIdToBeSelected();\n } else {\n return null;\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 if (!this.options.nodeClass) {\n return;\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 doInit();\n } else {\n // Load data on demand and then init the tree\n this.setInitialStateOnDemand(doInit);\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 if (!this.options.saveState) {\n return [false, false];\n } else {\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\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 // Call cb_finished when done\n private setInitialStateOnDemand(cbFinished: () => void): void {\n const restoreState = (): boolean => {\n if (!this.options.saveState) {\n return false;\n } else {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (!state) {\n return false;\n } else {\n this.saveStateHandler.setInitialStateOnDemand(\n state,\n cbFinished,\n );\n\n return true;\n }\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 this.openNodeInternal(node, false, () => {\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 this.openNodeInternal(node, false);\n\n return level !== maxLevel;\n }\n });\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n openNodes();\n };\n\n if (!restoreState()) {\n autoOpenNodes();\n }\n }\n\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 } else {\n return 0;\n }\n }\n\n private getNode(element: HTMLElement): null | Node {\n const liElement = element.closest(\"li.jqtree_common\");\n\n if (liElement) {\n return jQuery(liElement).data(\"node\") as Node;\n } else {\n return null;\n }\n }\n\n private saveState(): void {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n }\n\n private selectCurrentNode(mustSetFocus: boolean): void {\n const node = this.getSelectedNode();\n if (node) {\n const nodeElement = this.getNodeElementForNode(node);\n if (nodeElement) {\n nodeElement.select(mustSetFocus);\n }\n }\n }\n\n private deselectCurrentNode(): void {\n const node = this.getSelectedNode();\n if (node) {\n this.removeFromSelection(node);\n }\n }\n\n private getDefaultClosedIcon(): string {\n if (this.options.rtl) {\n // triangle to the left\n return \"◀\";\n } else {\n // triangle to the right\n return \"►\";\n }\n }\n\n private getRtlOption(): boolean {\n if (this.options.rtl != null) {\n return this.options.rtl;\n } else {\n const dataRtl = this.element.data(\"rtl\") as unknown;\n\n if (\n dataRtl !== null &&\n dataRtl !== false &&\n dataRtl !== undefined\n ) {\n return true;\n } else {\n return false;\n }\n }\n }\n\n private doSelectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): void {\n const saveState = (): void => {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n };\n\n if (!node) {\n // Called with empty node -> deselect current node\n this.deselectCurrentNode();\n saveState();\n return;\n }\n const defaultOptions = { mustSetFocus: true, mustToggle: true };\n const selectOptions = { ...defaultOptions, ...(optionsParam || {}) };\n\n const canSelect = (): boolean => {\n if (this.options.onCanSelectNode) {\n return (\n this.options.selectable === true &&\n this.options.onCanSelectNode(node)\n );\n } else {\n return this.options.selectable === true;\n }\n };\n\n if (!canSelect()) {\n return;\n }\n\n if (this.selectNodeHandler.isNodeSelected(node)) {\n if (selectOptions.mustToggle) {\n this.deselectCurrentNode();\n this.triggerEvent(\"tree.select\", {\n node: null,\n previous_node: node,\n });\n }\n } else {\n const deselectedNode = this.getSelectedNode() || null;\n this.deselectCurrentNode();\n this.addToSelection(node, selectOptions.mustSetFocus);\n\n this.triggerEvent(\"tree.select\", {\n node,\n deselected_node: deselectedNode,\n });\n this.openParents(node);\n }\n\n saveState();\n }\n\n private doLoadData(data: NodeData[] | null, parentNode: Node | null): 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.load_data\", {\n tree_data: data,\n parent_node: parentNode,\n });\n }\n\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 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 doLoadDataFromUrl(\n urlInfoParam: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null,\n ): void {\n const urlInfo = urlInfoParam || this.getDataUrlInfo(parentNode);\n\n this.dataLoader.loadFromUrl(urlInfo, parentNode, onFinished);\n }\n\n private loadFolderOnDemand(\n node: Node,\n slide = true,\n onFinished?: OnFinishOpenNode,\n ): void {\n node.is_loading = true;\n\n this.doLoadDataFromUrl(null, node, () => {\n this.openNodeInternal(node, slide, onFinished);\n });\n }\n\n private containsElement(element: HTMLElement): boolean {\n const node = this.getNode(element);\n\n return node != null && node.tree === this.tree;\n }\n\n private isFocusOnTree(): boolean {\n const activeElement = document.activeElement;\n\n return Boolean(\n activeElement &&\n activeElement.tagName === \"SPAN\" &&\n this.containsElement(activeElement as HTMLElement),\n );\n }\n\n private connectHandlers() {\n const {\n autoEscape,\n buttonLeft,\n closedIcon,\n dataFilter,\n dragAndDrop,\n keyboardSupport,\n onCanMove,\n onCreateLi,\n onDragMove,\n onDragStop,\n onGetStateFromStorage,\n onIsMoveHandle,\n onLoadFailed,\n onSetStateFromStorage,\n openedIcon,\n openFolderDelay,\n rtl,\n saveState,\n showEmptyFolder,\n slide,\n tabIndex,\n } = this.options;\n\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.openNodeInternal.bind(this);\n const refreshElements = this.refreshElements.bind(this);\n const refreshHitAreas = this.refreshHitAreas.bind(this);\n const selectNode = this.selectNode.bind(this);\n const $treeElement = this.element;\n const treeElement = this.element.get(0) as HTMLElement;\n const triggerEvent = this.triggerEvent.bind(this);\n\n const selectNodeHandler = new SelectNodeHandler({\n getNodeById,\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 getMouseDelay = () => this.options.startDndDelay ?? 0;\n\n const dataLoader = new DataLoader({\n dataFilter,\n loadData,\n onLoadFailed,\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,\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 getNodeElement,\n getNodeElementForNode,\n getScrollLeft,\n getTree,\n onCanMove,\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 closedIcon,\n dragAndDrop,\n $element: $treeElement,\n getTree,\n isNodeSelected,\n onCreateLi,\n openedIcon,\n rtl,\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 element: treeElement,\n getMouseDelay,\n getNode,\n onClickButton: this.toggle.bind(this),\n onClickTitle: this.doSelectNode.bind(this),\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\n private createFolderElement(node: Node) {\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.element;\n const triggerEvent = this.triggerEvent.bind(this);\n\n return new FolderElement({\n closedIconElement,\n getScrollLeft,\n node,\n openedIconElement,\n tabIndex,\n $treeElement,\n triggerEvent,\n });\n }\n\n private createNodeElement(node: Node) {\n const getScrollLeft = this.scrollHandler.getScrollLeft.bind(\n this.scrollHandler,\n );\n const tabIndex = this.options.tabIndex;\n const $treeElement = this.element;\n\n return new NodeElement({\n getScrollLeft,\n node,\n tabIndex,\n $treeElement,\n });\n }\n\n private openParents(node: Node) {\n const parent = node.parent;\n\n if (parent && parent.parent && !parent.is_open) {\n this.openNode(parent, false);\n }\n }\n}\n\nSimpleWidget.register(JqTreeWidget, \"tree\");\n","const version = \"1.8.0\";\n\nexport default version;\n"],"names":["Position","positionNames","before","Before","after","After","inside","Inside","none","None","getPositionName","position","name","Object","prototype","hasOwnProperty","call","DragElement","constructor","_ref","autoEscape","nodeName","offsetX","offsetY","treeElement","this","element","createElement","appendChild","move","pageX","pageY","style","left","top","remove","document","classList","add","textContent","innerHTML","getBoolString","value","getOffsetTop","getElementPosition","rect","getBoundingClientRect","x","window","scrollX","y","scrollY","generateHitAreasForGroup","hitAreas","positionsInGroup","bottom","positionCount","Math","min","length","areaHeight","round","areaTop","i","push","node","generateHitAreas","tree","currentNode","treeBottom","positions","generatePositions","lastTop","addPosition","area","iterateVisibleNodes","handleAfterOpenFolder","handleClosedFolder","handleFirstNode","handleNode","handleOpenFolder","isFirstNode","iterate","nextNode","mustIterateInside","is_open","hasChildren","offsetParent","childrenLength","children","forEach","_","child","nextChild","generateHitAreasFromPositions","previousTop","group","DragAndDropHandler","getNodeElement","getNodeElementForNode","getScrollLeft","getTree","onCanMove","onCanMoveTo","onDragMove","onDragStop","onIsMoveHandle","openNode","refreshElements","slide","triggerEvent","hoveredArea","isDragging","currentItem","mouseCapture","positionInfo","target","mustCaptureElement","jQuery","nodeElement","mouseStart","refresh","dragElement","mouseDrag","findHoveredArea","canMoveToArea","isFolder","stopOpenFolderTimer","mustOpenFolderTimer","startOpenFolderTimer","updateDropHint","removeDropHint","originalEvent","mouseStop","moveItem","clear","removeHover","removeHitAreas","getTreeDimensions","positionName","previousGhost","dimensions","right","low","high","mid","addDropHint","folder","openFolder","openFolderDelay","openFolderTimer","setTimeout","clearTimeout","movedNode","targetNode","previousParent","parent","doMove","moveNode","move_info","moved_node","target_node","previous_parent","do_move","original_event","isDefaultPrevented","treePosition","clientWidth","clientHeight","ElementsRenderer","buttonLeft","closedIcon","onCreateLi","dragAndDrop","$element","isNodeSelected","openedIcon","rtl","showEmptyFolder","tabIndex","openedIconElement","createButtonElement","closedIconElement","render","fromNode","renderFromNode","renderFromRoot","empty","createDomElements","$previousLi","li","createLi","getLevel","attachNodeData","isRootNode","level","ul","createUl","data","classString","role","className","setAttribute","isSelected","Boolean","isEmptyFolder","createFolderLi","createNodeLi","setTreeItemAriaAttributes","buttonClasses","getButtonClasses","folderClasses","getFolderClasses","iconElement","div","buttonLink","cloneNode","titleSpan","createTitleSpan","liClasses","join","classes","undefined","is_loading","createTextNode","nodeType","DataLoader","dataFilter","loadData","onLoadFailed","loadFromUrl","urlInfo","parentNode","onFinished","getDomElement","addLoadingClass","notifyLoading","stopLoading","removeLoadingClass","submitRequest","parseData","jqXHR","isLoading","urlInfoInput","handleSuccess","handleError","ajaxSettings","method","cache","dataType","success","error","url","toUpperCase","ajax","parsedData","JSON","parse","KeyHandler","closeNode","getSelectedNode","isFocusOnTree","keyboardSupport","selectNode","originalSelectNode","handleKeyDownHandler","handleKeyDown","bind","addEventListener","deinit","removeEventListener","moveDown","selectedNode","getNextVisibleNode","moveUp","getPreviousVisibleNode","moveRight","moveLeft","getParent","e","canHandleKeyboard","key","getPositionInfoFromMouseEvent","getPositionInfoFromTouch","touch","MouseHandler","getMouseDelay","getNode","onClickButton","onClickTitle","onMouseCapture","onMouseDrag","onMouseStart","onMouseStop","useContextMenu","handleClick","handleDblclick","mouseDown","passive","touchStart","handleContextmenu","isMouseStarted","mouseDelayTimer","isMouseDelayMet","mouseDownInfo","removeMouseMoveEventListeners","button","handleMouseDown","cancelable","preventDefault","handleMouseUp","handleStartMouse","mouseMove","touchMove","mouseUp","touchEnd","mouseDelay","startMouseDelayTimer","handleMouseMove","touches","clickTarget","getClickTarget","type","stopPropagation","click_event","closest","jqTreeElement","SaveStateHandler","addToSelection","getNodeById","getSelectedNodes","onGetStateFromStorage","onSetStateFromStorage","removeFromSelection","saveState","saveStateOption","state","stringify","getState","supportsLocalStorage","localStorage","setItem","getKeyName","getStateFromStorage","jsonData","loadFromStorage","parseState","open_nodes","getOpenNodeIds","openNodes","id","selected_node","getSelectedNodeIds","selectedNodeIds","setInitialState","mustLoadOnDemand","openInitialNodes","resetSelection","selectInitialNodes","setInitialStateOnDemand","cbFinished","doSetInitialStateOnDemand","getNodeIdToBeSelected","n","getItem","nodeIds","nodeId","load_on_demand","selectCount","nodeIdsParam","selectedNodes","loadingCount","newNodesIds","loadAndOpenNode","_supportsLocalStorage","testSupport","sessionStorage","removeItem","ContainerScrollParent","container","refreshHitAreas","checkHorizontalScrolling","newHorizontalScrollDirection","getNewHorizontalScrollDirection","horizontalScrollDirection","horizontalScrollTimeout","verticalScrollTimeout","scrollHorizontally","checkVerticalScrolling","newVerticalScrollDirection","getNewVerticalScrollDirection","verticalScrollDirection","scrollVertically","scrollLeft","scrollToY","scrollTop","stopScrolling","scrollParentTop","scrollParentBottom","scrollParentOffset","rightEdge","leftEdge","getScrollParentTop","getScrollParentBottom","distance","scrollBy","behavior","DocumentScrollParent","documentElement","treeTop","documentScrollHeight","documentScrollWidth","isNearLeftEdge","innerWidth","canScrollRight","getDocumentScrollWidth","canScrollDown","getDocumentScrollHeight","scrollHeight","scrollWidth","innerHeight","isOverflow","overflowValue","hasOverFlow","getComputedStyle","overflowX","overflowY","createScrollParent","parentElement","getParentWithOverflow","tagName","ScrollHandler","scrollParent","checkScrolling","getScrollParent","SelectNodeHandler","Set","selectedSingleNode","getSelectedNodesUnder","isParentOf","has","includeChildren","arguments","delete","register","widgetClass","widgetName","getDataKey","getWidgetData","el","dataKey","widget","SimpleWidget","createWidget","$el","options","get","init","fn","argument1","functionName","destroy","removeData","destroyWidget","_len","args","Array","_key","callFunction","result","widgetFunction","apply","static","defaults","isNodeRecordWithChildren","Node","nodeData","isRoot","nodeClass","setData","idMapping","Map","o","loadFromData","removeChildren","childData","createNode","addChild","setParent","addChildAtPosition","index","splice","removeChild","doRemoveChild","getChildIndex","indexOf","callback","_iterate","getData","getDataFromNodes","nodes","map","tmpNode","k","v","getNodeByName","getNodeByCallback","getNodeByNameMustExist","addAfter","nodeInfo","childIndex","loadChildrenFromData","addBefore","addParent","newParent","originalParent","append","prepend","addNodeToIndex","set","removeNodeFromIndex","getPreviousSibling","previousIndex","getNextSibling","nextIndex","getNodesByProperty","filter","f","getNextNode","nextSibling","getPreviousNode","previousSibling","getLastChild","lastChild","initFromData","addChildren","childrenData","addNode","getNodeClass","BorderDropHint","querySelector","hint","width","max","offsetWidth","height","GhostDropHint","ghost","createGhostElement","moveAfter","moveBefore","moveInsideOpenFolder","moveInside","childElement","circleSpan","lineSpan","NodeElement","$treeElement","mustShowBorderDropHint","select","mustSetFocus","getTitleSpan","toString","focus","deselect","removeAttribute","blur","getUl","FolderElement","super","open","animationSpeed","getButton","icon","doOpen","slideDown","show","close","doClose","slideUp","hide","NODE_PARAM_IS_EMPTY","PARAM_IS_EMPTY","JqTreeWidget","autoOpen","dataUrl","onCanSelectNode","selectable","startDndDelay","toggle","slideParam","Error","optionsParam","doSelectNode","selectNodeHandler","toJson","doLoadData","loadDataFromUrl","param1","param2","param3","doLoadDataFromUrl","reload","getNodeByHtmlElement","inputElement","HTMLElement","parseParams","openNodeInternal","createFolderElement","dndHandler","addNodeAfter","newNodeInfo","existingNode","newNode","addNodeBefore","addParentNode","removeNode","appendNode","parentNodeParam","prependNode","updateNode","idIsChanged","isSelectedNodeInSubtree","subtree","positionIndex","saveStateHandler","openParents","scrollToNode","scrollHandler","setState","setOption","option","keyHandler","getVersion","doOpenNode","_node","_slide","_onFinished","loadFolderOnDemand","mustSelect","renderer","selectCurrentNode","createNodeElement","isInitialized","getRtlOption","getDefaultClosedIcon","connectHandlers","initData","off","mouseHandler","eventName","values","event","Event","trigger","getDataUrlInfo","setUrlInfoData","selectedNodeId","getUrlFromString","initTree","doInit","autoOpenNodes","maxLevel","getAutoOpenMaxLevel","isRestored","restoreState","parseInt","liElement","deselectCurrentNode","dataRtl","selectOptions","mustToggle","canSelect","previous_node","deselectedNode","deselected_node","deselectNodes","loadSubtree","tree_data","parent_node","selectedNodesUnderParent","urlInfoParam","dataLoader","containsElement","activeElement"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tree.jquery.js","sources":["src/position.ts","src/dragAndDropHandler/dragElement.ts","src/util.ts","src/dragAndDropHandler/generateHitAreas.ts","src/dragAndDropHandler/iterateVisibleNodes.ts","src/dragAndDropHandler/index.ts","src/elementsRenderer.ts","src/dataLoader.ts","src/keyHandler.ts","src/mouseUtils.ts","src/mouseHandler.ts","src/saveStateHandler.ts","src/scrollHandler/containerScrollParent.ts","src/scrollHandler/documentScrollParent.ts","src/scrollHandler/createScrollParent.ts","src/scrollHandler.ts","src/selectNodeHandler.ts","src/simple.widget.ts","src/nodeUtils.ts","src/node.ts","src/nodeElement/borderDropHint.ts","src/nodeElement/ghostDropHint.ts","src/nodeElement/index.ts","src/nodeElement/folderElement.ts","src/tree.jquery.ts","src/version.ts"],"sourcesContent":["export enum Position {\n Before = 1,\n After,\n Inside,\n None,\n}\n\nconst positionNames: Record = {\n before: Position.Before,\n after: Position.After,\n inside: Position.Inside,\n none: Position.None,\n};\n\nexport const getPositionName = (position: Position): string => {\n for (const name in positionNames) {\n if (Object.prototype.hasOwnProperty.call(positionNames, name)) {\n if (positionNames[name] === position) {\n return name;\n }\n }\n }\n\n return \"\";\n};\n\nexport const getPosition = (name: string): Position | undefined =>\n positionNames[name];\n","interface DragElementParams {\n autoEscape: boolean;\n nodeName: string;\n offsetX: number;\n offsetY: number;\n treeElement: HTMLElement;\n}\n\nclass DragElement {\n private offsetX: number;\n private offsetY: number;\n private element: HTMLElement;\n\n constructor({\n autoEscape,\n nodeName,\n offsetX,\n offsetY,\n treeElement,\n }: DragElementParams) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n this.element = this.createElement(nodeName, autoEscape);\n\n treeElement.appendChild(this.element);\n }\n\n public move(pageX: number, pageY: number): void {\n this.element.style.left = `${pageX - this.offsetX}px`;\n this.element.style.top = `${pageY - this.offsetY}px`;\n }\n\n public remove(): void {\n this.element.remove();\n }\n\n private createElement(nodeName: string, autoEscape: boolean) {\n const element = document.createElement(\"span\");\n element.classList.add(\"jqtree-title\", \"jqtree-dragging\");\n\n if (autoEscape) {\n element.textContent = nodeName;\n } else {\n element.innerHTML = nodeName;\n }\n\n element.style.position = \"absolute\";\n\n return element;\n }\n}\n\nexport default DragElement;\n","export const isInt = (n: unknown): boolean =>\n typeof n === \"number\" && n % 1 === 0;\n\nexport const isFunction = (v: unknown): boolean => typeof v === \"function\";\n\nexport const getBoolString = (value: unknown): string =>\n value ? \"true\" : \"false\";\n\nexport const getOffsetTop = (element: HTMLElement) =>\n getElementPosition(element).top;\n\nexport const getElementPosition = (element: HTMLElement) => {\n const rect = element.getBoundingClientRect();\n\n return {\n left: rect.x + window.scrollX,\n top: rect.y + window.scrollY,\n };\n};\n","import { HitArea } from \"./types\";\nimport { Node } from \"../node\";\nimport { Position } from \"../position\";\nimport { getOffsetTop } from \"../util\";\nimport iterateVisibleNodes from \"./iterateVisibleNodes\";\n\nconst generatePositions = (tree: Node, currentNode: Node): HitArea[] => {\n const positions: HitArea[] = [];\n let lastTop = 0;\n\n const addPosition = (node: Node, position: number, top: number) => {\n const area = {\n top,\n bottom: 0,\n node,\n position,\n };\n\n positions.push(area);\n lastTop = top;\n };\n\n const handleAfterOpenFolder = (node: Node, nextNode: Node | null) => {\n if (node === currentNode || nextNode === currentNode) {\n // Cannot move before or after current item\n addPosition(node, Position.None, lastTop);\n } else {\n addPosition(node, Position.After, lastTop);\n }\n };\n\n const handleClosedFolder = (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => {\n const top = getOffsetTop(element);\n\n if (node === currentNode) {\n // Cannot move after current item\n addPosition(node, Position.None, top);\n } else {\n addPosition(node, Position.Inside, top);\n\n // Cannot move before current item\n if (nextNode !== currentNode) {\n addPosition(node, Position.After, top);\n }\n }\n };\n\n const handleFirstNode = (node: Node) => {\n if (node !== currentNode) {\n addPosition(node, Position.Before, getOffsetTop(node.element));\n }\n };\n\n const handleNode = (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => {\n const top = getOffsetTop(element);\n\n if (node === currentNode) {\n // Cannot move inside current item\n addPosition(node, Position.None, top);\n } else {\n addPosition(node, Position.Inside, top);\n }\n\n if (nextNode === currentNode || node === currentNode) {\n // Cannot move before or after current item\n addPosition(node, Position.None, top);\n } else {\n addPosition(node, Position.After, top);\n }\n };\n\n const handleOpenFolder = (node: Node, element: HTMLElement) => {\n if (node === currentNode) {\n // Cannot move inside current item\n // Stop iterating\n return false;\n }\n\n // Cannot move before current item\n if (node.children[0] !== currentNode) {\n addPosition(node, Position.Inside, getOffsetTop(element));\n }\n\n // Continue iterating\n return true;\n };\n\n iterateVisibleNodes(tree, {\n handleAfterOpenFolder,\n handleClosedFolder,\n handleFirstNode,\n handleNode,\n handleOpenFolder,\n });\n\n return positions;\n};\n\nconst generateHitAreasForGroup = (\n hitAreas: HitArea[],\n positionsInGroup: HitArea[],\n top: number,\n bottom: number,\n) => {\n // limit positions in group\n const positionCount = Math.min(positionsInGroup.length, 4);\n\n const areaHeight = Math.round((bottom - top) / positionCount);\n let areaTop = top;\n\n let i = 0;\n while (i < positionCount) {\n const position = positionsInGroup[i];\n\n if (position) {\n hitAreas.push({\n top: areaTop,\n bottom: areaTop + areaHeight,\n node: position.node,\n position: position.position,\n });\n }\n\n areaTop += areaHeight;\n i += 1;\n }\n};\n\nconst generateHitAreasFromPositions = (\n positions: HitArea[],\n treeBottom: number,\n): HitArea[] => {\n let previousTop = positions[0]?.top ?? 0;\n let group = [];\n const hitAreas: HitArea[] = [];\n\n for (const position of positions) {\n if (position.top !== previousTop && group.length) {\n generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n position.top,\n );\n\n previousTop = position.top;\n group = [];\n }\n\n group.push(position);\n }\n\n generateHitAreasForGroup(hitAreas, group, previousTop, treeBottom);\n\n return hitAreas;\n};\n\nconst generateHitAreas = (\n tree: Node,\n currentNode: Node,\n treeBottom: number,\n) => {\n const positions = generatePositions(tree, currentNode);\n\n return generateHitAreasFromPositions(positions, treeBottom);\n};\n\nexport default generateHitAreas;\n","import { Node } from \"../node\";\n\ninterface Options {\n handleAfterOpenFolder: (node: Node, nextNode: Node | null) => void;\n handleClosedFolder: (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => void;\n handleFirstNode: (node: Node) => void;\n handleNode: (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => void;\n\n /*\n override\n return\n - true: continue iterating\n - false: stop iterating\n */\n handleOpenFolder: (node: Node, element: HTMLElement) => boolean;\n}\n\nconst iterateVisibleNodes = (\n tree: Node,\n {\n handleAfterOpenFolder,\n handleClosedFolder,\n handleFirstNode,\n handleNode,\n handleOpenFolder,\n }: Options,\n) => {\n let isFirstNode = true;\n\n const iterate = (node: Node, nextNode: Node | null): void => {\n let mustIterateInside =\n (node.is_open || !node.element) && node.hasChildren();\n\n let element: HTMLElement | null = null;\n\n // Is the element visible?\n if (node.element?.offsetParent) {\n element = node.element;\n\n if (isFirstNode) {\n handleFirstNode(node);\n isFirstNode = false;\n }\n\n if (!node.hasChildren()) {\n handleNode(node, nextNode, node.element);\n } else if (node.is_open) {\n if (!handleOpenFolder(node, node.element)) {\n mustIterateInside = false;\n }\n } else {\n handleClosedFolder(node, nextNode, element);\n }\n }\n\n if (mustIterateInside) {\n const childrenLength = node.children.length;\n node.children.forEach((_, i) => {\n const child = node.children[i];\n\n if (child) {\n if (i === childrenLength - 1) {\n iterate(child, null);\n } else {\n const nextChild = node.children[i + 1];\n\n if (nextChild) {\n iterate(child, nextChild);\n }\n }\n }\n });\n\n if (node.is_open && element) {\n handleAfterOpenFolder(node, nextNode);\n }\n }\n };\n\n iterate(tree, null);\n};\n\nexport default iterateVisibleNodes;\n","import { Node } from \"../node\";\nimport { getPositionName, Position } from \"../position\";\nimport { DropHint, HitArea } from \"./types\";\nimport { PositionInfo } from \"../mouseUtils\";\nimport NodeElement from \"../nodeElement\";\nimport DragElement from \"./dragElement\";\nimport generateHitAreas from \"./generateHitAreas\";\nimport { getElementPosition } from \"../util\";\nimport {\n OnCanMove,\n OnCanMoveTo,\n OnIsMoveHandle,\n DragMethod,\n} from \"../jqtreeOptions\";\nimport {\n GetScrollLeft,\n GetTree,\n OpenNode,\n RefreshElements,\n TriggerEvent,\n} from \"../jqtreeMethodTypes\";\n\ninterface Dimensions {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\ntype GetNodeElement = (element: HTMLElement) => NodeElement | null;\ntype GetNodeElementForNode = (node: Node) => NodeElement;\n\ninterface DragAndDropHandlerParams {\n autoEscape?: boolean;\n getNodeElement: GetNodeElement;\n getNodeElementForNode: GetNodeElementForNode;\n getScrollLeft: GetScrollLeft;\n getTree: GetTree;\n onCanMove?: OnCanMove;\n onCanMoveTo?: OnCanMoveTo;\n onDragMove?: DragMethod;\n onDragStop?: DragMethod;\n onIsMoveHandle?: OnIsMoveHandle;\n openFolderDelay: number | false;\n openNode: OpenNode;\n refreshElements: RefreshElements;\n slide: boolean;\n treeElement: HTMLElement;\n triggerEvent: TriggerEvent;\n}\n\nexport class DragAndDropHandler {\n public hitAreas: HitArea[];\n public isDragging: boolean;\n public currentItem: NodeElement | null;\n public hoveredArea: HitArea | null;\n\n private autoEscape?: boolean;\n private dragElement: DragElement | null;\n private getNodeElement: GetNodeElement;\n private getNodeElementForNode: GetNodeElementForNode;\n private getScrollLeft: GetScrollLeft;\n private getTree: GetTree;\n private onCanMove?: OnCanMove;\n private onCanMoveTo?: OnCanMoveTo;\n private onDragMove?: DragMethod;\n private onDragStop?: DragMethod;\n private onIsMoveHandle?: OnIsMoveHandle;\n private openFolderDelay: number | false;\n private openFolderTimer: number | null;\n private openNode: OpenNode;\n private previousGhost: DropHint | null;\n private refreshElements: RefreshElements;\n private slide: boolean;\n private treeElement: HTMLElement;\n private triggerEvent: TriggerEvent;\n\n constructor({\n autoEscape,\n getNodeElement,\n getNodeElementForNode,\n getScrollLeft,\n getTree,\n onCanMove,\n onCanMoveTo,\n onDragMove,\n onDragStop,\n onIsMoveHandle,\n openNode,\n refreshElements,\n slide,\n treeElement,\n triggerEvent,\n }: DragAndDropHandlerParams) {\n this.autoEscape = autoEscape;\n this.getNodeElement = getNodeElement;\n this.getNodeElementForNode = getNodeElementForNode;\n this.getScrollLeft = getScrollLeft;\n this.getTree = getTree;\n this.onCanMove = onCanMove;\n this.onCanMoveTo = onCanMoveTo;\n this.onDragMove = onDragMove;\n this.onDragStop = onDragStop;\n this.onIsMoveHandle = onIsMoveHandle;\n this.openNode = openNode;\n this.refreshElements = refreshElements;\n this.slide = slide;\n this.treeElement = treeElement;\n this.triggerEvent = triggerEvent;\n\n this.hoveredArea = null;\n this.hitAreas = [];\n this.isDragging = false;\n this.currentItem = null;\n }\n\n public mouseCapture(positionInfo: PositionInfo): boolean | null {\n const element = positionInfo.target;\n\n if (!this.mustCaptureElement(element)) {\n return null;\n }\n\n if (this.onIsMoveHandle && !this.onIsMoveHandle(jQuery(element))) {\n return null;\n }\n\n let nodeElement = this.getNodeElement(element);\n\n if (nodeElement && this.onCanMove) {\n if (!this.onCanMove(nodeElement.node)) {\n nodeElement = null;\n }\n }\n\n this.currentItem = nodeElement;\n return this.currentItem != null;\n }\n\n public mouseStart(positionInfo: PositionInfo): boolean {\n if (!this.currentItem) {\n return false;\n }\n\n this.refresh();\n\n const { left, top } = getElementPosition(positionInfo.target);\n\n const node = this.currentItem.node;\n\n this.dragElement = new DragElement({\n autoEscape: this.autoEscape ?? true,\n nodeName: node.name,\n offsetX: positionInfo.pageX - left,\n offsetY: positionInfo.pageY - top,\n treeElement: this.treeElement,\n });\n\n this.isDragging = true;\n this.currentItem.element.classList.add(\"jqtree-moving\");\n\n return true;\n }\n\n public mouseDrag(positionInfo: PositionInfo): boolean {\n if (!this.currentItem || !this.dragElement) {\n return false;\n }\n\n this.dragElement.move(positionInfo.pageX, positionInfo.pageY);\n\n const area = this.findHoveredArea(\n positionInfo.pageX,\n positionInfo.pageY,\n );\n\n if (area && this.canMoveToArea(area)) {\n if (!area.node.isFolder()) {\n this.stopOpenFolderTimer();\n }\n\n if (this.hoveredArea !== area) {\n this.hoveredArea = area;\n\n // If this is a closed folder, start timer to open it\n if (this.mustOpenFolderTimer(area)) {\n this.startOpenFolderTimer(area.node);\n } else {\n this.stopOpenFolderTimer();\n }\n\n this.updateDropHint();\n }\n } else {\n this.removeDropHint();\n this.stopOpenFolderTimer();\n this.hoveredArea = area;\n }\n\n if (!area) {\n if (this.onDragMove) {\n this.onDragMove(\n this.currentItem.node,\n positionInfo.originalEvent,\n );\n }\n }\n\n return true;\n }\n\n public mouseStop(positionInfo: PositionInfo): boolean {\n this.moveItem(positionInfo);\n this.clear();\n this.removeHover();\n this.removeDropHint();\n this.removeHitAreas();\n\n const currentItem = this.currentItem;\n\n if (this.currentItem) {\n this.currentItem.element.classList.remove(\"jqtree-moving\");\n this.currentItem = null;\n }\n\n this.isDragging = false;\n\n if (!this.hoveredArea && currentItem) {\n if (this.onDragStop) {\n this.onDragStop(currentItem.node, positionInfo.originalEvent);\n }\n }\n\n return false;\n }\n\n public refresh(): void {\n this.removeHitAreas();\n\n if (this.currentItem) {\n this.generateHitAreas();\n\n this.currentItem = this.getNodeElementForNode(\n this.currentItem.node,\n );\n\n if (this.isDragging) {\n this.currentItem.element.classList.add(\"jqtree-moving\");\n }\n }\n }\n\n private generateHitAreas(): void {\n const tree = this.getTree();\n\n if (!this.currentItem || !tree) {\n this.hitAreas = [];\n } else {\n this.hitAreas = generateHitAreas(\n tree,\n this.currentItem.node,\n this.getTreeDimensions().bottom,\n );\n }\n }\n\n private mustCaptureElement(element: HTMLElement): boolean {\n const nodeName = element.nodeName;\n\n return (\n nodeName !== \"INPUT\" &&\n nodeName !== \"SELECT\" &&\n nodeName !== \"TEXTAREA\"\n );\n }\n\n private canMoveToArea(area: HitArea): boolean {\n if (!this.onCanMoveTo) {\n return true;\n }\n\n if (!this.currentItem) {\n return false;\n }\n\n const positionName = getPositionName(area.position);\n\n return this.onCanMoveTo(this.currentItem.node, area.node, positionName);\n }\n\n private removeHitAreas(): void {\n this.hitAreas = [];\n }\n\n private clear(): void {\n if (this.dragElement) {\n this.dragElement.remove();\n this.dragElement = null;\n }\n }\n\n private removeDropHint(): void {\n if (this.previousGhost) {\n this.previousGhost.remove();\n }\n }\n\n private removeHover(): void {\n this.hoveredArea = null;\n }\n\n private findHoveredArea(x: number, y: number): HitArea | null {\n const dimensions = this.getTreeDimensions();\n\n if (\n x < dimensions.left ||\n y < dimensions.top ||\n x > dimensions.right ||\n y > dimensions.bottom\n ) {\n return null;\n }\n\n let low = 0;\n let high = this.hitAreas.length;\n while (low < high) {\n const mid = (low + high) >> 1;\n const area = this.hitAreas[mid];\n\n if (!area) {\n return null;\n }\n\n if (y < area.top) {\n high = mid;\n } else if (y > area.bottom) {\n low = mid + 1;\n } else {\n return area;\n }\n }\n\n return null;\n }\n\n private mustOpenFolderTimer(area: HitArea): boolean {\n const node = area.node;\n\n return (\n node.isFolder() &&\n !node.is_open &&\n area.position === Position.Inside\n );\n }\n\n private updateDropHint(): void {\n if (!this.hoveredArea) {\n return;\n }\n\n // remove previous drop hint\n this.removeDropHint();\n\n // add new drop hint\n const nodeElement = this.getNodeElementForNode(this.hoveredArea.node);\n this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);\n }\n\n private startOpenFolderTimer(folder: Node): void {\n const openFolder = (): void => {\n this.openNode(folder, this.slide, () => {\n this.refresh();\n this.updateDropHint();\n });\n };\n\n this.stopOpenFolderTimer();\n\n const openFolderDelay = this.openFolderDelay;\n\n if (openFolderDelay !== false) {\n this.openFolderTimer = window.setTimeout(\n openFolder,\n openFolderDelay,\n );\n }\n }\n\n private stopOpenFolderTimer(): void {\n if (this.openFolderTimer) {\n clearTimeout(this.openFolderTimer);\n this.openFolderTimer = null;\n }\n }\n\n private moveItem(positionInfo: PositionInfo): void {\n if (\n this.currentItem &&\n this.hoveredArea &&\n this.hoveredArea.position !== Position.None &&\n this.canMoveToArea(this.hoveredArea)\n ) {\n const movedNode = this.currentItem.node;\n const targetNode = this.hoveredArea.node;\n const position = this.hoveredArea.position;\n const previousParent = movedNode.parent;\n\n if (position === Position.Inside) {\n this.hoveredArea.node.is_open = true;\n }\n\n const doMove = (): void => {\n const tree = this.getTree();\n\n if (tree) {\n tree.moveNode(movedNode, targetNode, position);\n\n this.treeElement.textContent = \"\";\n this.refreshElements(null);\n }\n };\n\n const event = this.triggerEvent(\"tree.move\", {\n move_info: {\n moved_node: movedNode,\n target_node: targetNode,\n position: getPositionName(position),\n previous_parent: previousParent,\n do_move: doMove,\n original_event: positionInfo.originalEvent,\n },\n });\n\n if (!event.isDefaultPrevented()) {\n doMove();\n }\n }\n }\n\n private getTreeDimensions(): Dimensions {\n // Return the dimensions of the tree. Add a margin to the bottom to allow\n // to drag-and-drop after the last element.\n const treePosition = getElementPosition(this.treeElement);\n const left = treePosition.left + this.getScrollLeft();\n const top = treePosition.top;\n\n return {\n left,\n top,\n right: left + this.treeElement.clientWidth,\n bottom: top + this.treeElement.clientHeight + 16,\n };\n }\n}\n","import { getBoolString } from \"./util\";\nimport { Node } from \"./node\";\nimport { IconElement, OnCreateLi } from \"./jqtreeOptions\";\nimport { GetTree, IsNodeSelected } from \"./jqtreeMethodTypes\";\n\ninterface ElementsRendererParams {\n autoEscape: boolean;\n buttonLeft: boolean;\n closedIcon?: IconElement;\n dragAndDrop: boolean;\n $element: JQuery;\n getTree: GetTree;\n isNodeSelected: IsNodeSelected;\n onCreateLi?: OnCreateLi;\n openedIcon?: IconElement;\n rtl?: boolean;\n showEmptyFolder: boolean;\n tabIndex?: number;\n}\n\nexport default class ElementsRenderer {\n public openedIconElement?: HTMLElement | Text;\n public closedIconElement?: HTMLElement | Text;\n private autoEscape: boolean;\n private buttonLeft: boolean;\n private dragAndDrop: boolean;\n private $element: JQuery;\n private getTree: GetTree;\n private isNodeSelected: IsNodeSelected;\n private onCreateLi?: OnCreateLi;\n private rtl?: boolean;\n private showEmptyFolder: boolean;\n private tabIndex?: number;\n\n constructor({\n autoEscape,\n buttonLeft,\n closedIcon,\n onCreateLi,\n dragAndDrop,\n $element,\n getTree,\n isNodeSelected,\n openedIcon,\n rtl,\n showEmptyFolder,\n tabIndex,\n }: ElementsRendererParams) {\n this.autoEscape = autoEscape;\n this.buttonLeft = buttonLeft;\n this.dragAndDrop = dragAndDrop;\n this.$element = $element;\n this.getTree = getTree;\n this.isNodeSelected = isNodeSelected;\n this.onCreateLi = onCreateLi;\n this.rtl = rtl;\n this.showEmptyFolder = showEmptyFolder;\n this.tabIndex = tabIndex;\n this.openedIconElement = this.createButtonElement(openedIcon || \"+\");\n this.closedIconElement = this.createButtonElement(closedIcon || \"-\");\n }\n\n public render(fromNode: Node | null): void {\n if (fromNode && fromNode.parent) {\n this.renderFromNode(fromNode);\n } else {\n this.renderFromRoot();\n }\n }\n\n public renderFromRoot(): void {\n this.$element.empty();\n\n const tree = this.getTree();\n\n if (this.$element[0] && tree) {\n this.createDomElements(this.$element[0], tree.children, true, 1);\n }\n }\n\n public renderFromNode(node: Node): void {\n // remember current li\n const $previousLi = jQuery(node.element);\n\n // create element\n const li = this.createLi(node, node.getLevel());\n this.attachNodeData(node, li);\n\n // add element to dom\n $previousLi.after(li);\n\n // remove previous li\n $previousLi.remove();\n\n // create children\n if (node.children) {\n this.createDomElements(\n li,\n node.children,\n false,\n node.getLevel() + 1,\n );\n }\n }\n\n private createDomElements(\n element: Element,\n children: Node[],\n isRootNode: boolean,\n level: number,\n ): void {\n const ul = this.createUl(isRootNode);\n element.appendChild(ul);\n\n for (const child of children) {\n const li = this.createLi(child, level);\n ul.appendChild(li);\n\n this.attachNodeData(child, li);\n\n if (child.hasChildren()) {\n this.createDomElements(li, child.children, false, level + 1);\n }\n }\n }\n\n private attachNodeData(node: Node, li: HTMLElement): void {\n node.element = li;\n jQuery(li).data(\"node\", node);\n }\n\n private createUl(isRootNode: boolean): HTMLUListElement {\n let classString;\n let role;\n\n if (!isRootNode) {\n classString = \"\";\n role = \"group\";\n } else {\n classString = \"jqtree-tree\";\n role = \"tree\";\n\n if (this.rtl) {\n classString += \" jqtree-rtl\";\n }\n }\n\n if (this.dragAndDrop) {\n classString += \" jqtree-dnd\";\n }\n\n const ul = document.createElement(\"ul\");\n ul.className = `jqtree_common ${classString}`;\n\n ul.setAttribute(\"role\", role);\n\n return ul;\n }\n\n private createLi(node: Node, level: number): HTMLLIElement {\n const isSelected = Boolean(this.isNodeSelected(node));\n\n const mustShowFolder =\n node.isFolder() || (node.isEmptyFolder && this.showEmptyFolder);\n\n const li = mustShowFolder\n ? this.createFolderLi(node, level, isSelected)\n : this.createNodeLi(node, level, isSelected);\n\n if (this.onCreateLi) {\n this.onCreateLi(node, jQuery(li), isSelected);\n }\n\n return li;\n }\n\n private setTreeItemAriaAttributes(\n element: HTMLElement,\n name: string,\n level: number,\n isSelected: boolean,\n ) {\n element.setAttribute(\"aria-label\", name);\n element.setAttribute(\"aria-level\", `${level}`);\n element.setAttribute(\"aria-selected\", getBoolString(isSelected));\n element.setAttribute(\"role\", \"treeitem\");\n }\n\n private createFolderLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const buttonClasses = this.getButtonClasses(node);\n const folderClasses = this.getFolderClasses(node, isSelected);\n\n const iconElement = node.is_open\n ? this.openedIconElement\n : this.closedIconElement;\n\n // li\n const li = document.createElement(\"li\");\n li.className = `jqtree_common ${folderClasses}`;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // button link\n const buttonLink = document.createElement(\"a\");\n buttonLink.className = buttonClasses;\n\n if (iconElement) {\n buttonLink.appendChild(iconElement.cloneNode(true));\n }\n\n if (this.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n true,\n level,\n );\n titleSpan.setAttribute(\"aria-expanded\", getBoolString(node.is_open));\n div.appendChild(titleSpan);\n\n if (!this.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n return li;\n }\n\n private createNodeLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const liClasses = [\"jqtree_common\"];\n\n if (isSelected) {\n liClasses.push(\"jqtree-selected\");\n }\n\n const classString = liClasses.join(\" \");\n\n // li\n const li = document.createElement(\"li\");\n li.className = classString;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n false,\n level,\n );\n div.appendChild(titleSpan);\n\n return li;\n }\n\n private createTitleSpan(\n nodeName: string,\n isSelected: boolean,\n isFolder: boolean,\n level: number,\n ): HTMLSpanElement {\n const titleSpan = document.createElement(\"span\");\n\n let classes = \"jqtree-title jqtree_common\";\n\n if (isFolder) {\n classes += \" jqtree-title-folder\";\n }\n\n classes += ` jqtree-title-button-${this.buttonLeft ? \"left\" : \"right\"}`;\n\n titleSpan.className = classes;\n\n if (isSelected) {\n const tabIndex = this.tabIndex;\n\n if (tabIndex !== undefined) {\n titleSpan.setAttribute(\"tabindex\", `${tabIndex}`);\n }\n }\n\n this.setTreeItemAriaAttributes(titleSpan, nodeName, level, isSelected);\n\n if (this.autoEscape) {\n titleSpan.textContent = nodeName;\n } else {\n titleSpan.innerHTML = nodeName;\n }\n\n return titleSpan;\n }\n\n private getButtonClasses(node: Node): string {\n const classes = [\"jqtree-toggler\", \"jqtree_common\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (this.buttonLeft) {\n classes.push(\"jqtree-toggler-left\");\n } else {\n classes.push(\"jqtree-toggler-right\");\n }\n\n return classes.join(\" \");\n }\n\n private getFolderClasses(node: Node, isSelected: boolean): string {\n const classes = [\"jqtree-folder\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (isSelected) {\n classes.push(\"jqtree-selected\");\n }\n\n if (node.is_loading) {\n classes.push(\"jqtree-loading\");\n }\n\n return classes.join(\" \");\n }\n\n private createButtonElement(\n value: IconElement,\n ): HTMLElement | Text | undefined {\n if (typeof value === \"string\") {\n // convert value to html\n const div = document.createElement(\"div\");\n div.innerHTML = value;\n\n return document.createTextNode(div.innerHTML);\n } else if (value == null) {\n return undefined;\n } else if ((value as HTMLElement).nodeType) {\n return value as HTMLElement;\n } else {\n return jQuery(value)[0];\n }\n }\n}\n","import { Node } from \"./node\";\nimport { DataFilter, OnLoadFailed, OnLoading } from \"./jqtreeOptions\";\nimport { LoadData, TriggerEvent } from \"./jqtreeMethodTypes\";\n\nexport type HandleFinishedLoading = () => void;\n\ninterface DataLoaderParams {\n dataFilter?: DataFilter;\n loadData: LoadData;\n onLoadFailed?: OnLoadFailed;\n onLoading?: OnLoading;\n treeElement: HTMLElement;\n triggerEvent: TriggerEvent;\n}\n\nexport default class DataLoader {\n private dataFilter?: DataFilter;\n private loadData: LoadData;\n private onLoadFailed?: OnLoadFailed;\n private onLoading?: OnLoading;\n private treeElement: HTMLElement;\n private triggerEvent: TriggerEvent;\n\n constructor({\n dataFilter,\n loadData,\n onLoadFailed,\n onLoading,\n treeElement,\n triggerEvent,\n }: DataLoaderParams) {\n this.dataFilter = dataFilter;\n this.loadData = loadData;\n this.onLoadFailed = onLoadFailed;\n this.onLoading = onLoading;\n this.treeElement = treeElement;\n this.triggerEvent = triggerEvent;\n }\n\n public loadFromUrl(\n urlInfo: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null,\n ): void {\n if (!urlInfo) {\n return;\n }\n\n const element = this.getDomElement(parentNode);\n this.addLoadingClass(element);\n this.notifyLoading(true, parentNode, element);\n\n const stopLoading = (): void => {\n this.removeLoadingClass(element);\n this.notifyLoading(false, parentNode, element);\n };\n\n const handleSuccess = (data: string | NodeData[]): void => {\n stopLoading();\n this.loadData(this.parseData(data), parentNode);\n\n if (onFinished && typeof onFinished === \"function\") {\n onFinished();\n }\n };\n\n const handleError = (jqXHR: JQuery.jqXHR): void => {\n stopLoading();\n\n if (this.onLoadFailed) {\n this.onLoadFailed(jqXHR);\n }\n };\n\n this.submitRequest(urlInfo, handleSuccess, handleError);\n }\n\n private addLoadingClass(element: HTMLElement): void {\n element.classList.add(\"jqtree-loading\");\n }\n\n private removeLoadingClass(element: HTMLElement): void {\n element.classList.remove(\"jqtree-loading\");\n }\n\n private getDomElement(parentNode: Node | null): HTMLElement {\n if (parentNode) {\n return parentNode.element;\n } else {\n return this.treeElement;\n }\n }\n\n private notifyLoading(\n isLoading: boolean,\n node: Node | null,\n element: HTMLElement,\n ): void {\n const $el = jQuery(element);\n\n if (this.onLoading) {\n this.onLoading(isLoading, node, $el);\n }\n\n this.triggerEvent(\"tree.loading_data\", {\n isLoading,\n node,\n $el,\n });\n }\n\n private submitRequest(\n urlInfoInput: string | JQuery.AjaxSettings,\n handleSuccess: JQuery.Ajax.SuccessCallback,\n handleError: JQuery.Ajax.ErrorCallback,\n ): void {\n const urlInfo =\n typeof urlInfoInput === \"string\"\n ? { url: urlInfoInput }\n : urlInfoInput;\n\n const ajaxSettings: JQuery.AjaxSettings = {\n method: \"GET\",\n cache: false,\n dataType: \"json\",\n success: handleSuccess,\n error: handleError,\n ...urlInfo,\n };\n\n ajaxSettings.method = ajaxSettings.method?.toUpperCase() || \"GET\";\n\n void jQuery.ajax(ajaxSettings);\n }\n\n private parseData(data: string | NodeData[]): NodeData[] {\n const getParsedData = () => {\n if (typeof data === \"string\") {\n return JSON.parse(data) as NodeData[];\n } else {\n return data;\n }\n };\n\n const parsedData = getParsedData();\n\n if (this.dataFilter) {\n return this.dataFilter(parsedData);\n } else {\n return parsedData;\n }\n }\n}\n","import { Node } from \"./node\";\nimport {\n CloseNode,\n GetSelectedNode,\n IsFocusOnTree,\n OpenNode,\n SelectNode,\n} from \"./jqtreeMethodTypes\";\n\ntype KeyboardEventHandler = (event: KeyboardEvent) => boolean;\n\ninterface KeyHandlerParams {\n closeNode: CloseNode;\n getSelectedNode: GetSelectedNode;\n isFocusOnTree: IsFocusOnTree;\n keyboardSupport: boolean;\n openNode: OpenNode;\n selectNode: SelectNode;\n}\n\nexport default class KeyHandler {\n private closeNode: CloseNode;\n private getSelectedNode: GetSelectedNode;\n private handleKeyDownHandler?: KeyboardEventHandler;\n private isFocusOnTree: IsFocusOnTree;\n private keyboardSupport: boolean;\n private openNode: OpenNode;\n private originalSelectNode: SelectNode;\n\n constructor({\n closeNode,\n getSelectedNode,\n isFocusOnTree,\n keyboardSupport,\n openNode,\n selectNode,\n }: KeyHandlerParams) {\n this.closeNode = closeNode;\n this.getSelectedNode = getSelectedNode;\n this.isFocusOnTree = isFocusOnTree;\n this.keyboardSupport = keyboardSupport;\n this.openNode = openNode;\n this.originalSelectNode = selectNode;\n\n if (keyboardSupport) {\n this.handleKeyDownHandler = this.handleKeyDown.bind(this);\n\n document.addEventListener(\"keydown\", this.handleKeyDownHandler);\n }\n }\n\n public deinit(): void {\n if (this.handleKeyDownHandler) {\n document.removeEventListener(\"keydown\", this.handleKeyDownHandler);\n }\n }\n\n public moveDown(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getNextVisibleNode());\n }\n\n public moveUp(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getPreviousVisibleNode());\n }\n\n public moveRight(selectedNode: Node): boolean {\n if (!selectedNode.isFolder()) {\n return true;\n } else {\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 } else {\n // Right expands a closed node\n this.openNode(selectedNode);\n return false;\n }\n }\n }\n\n public moveLeft(selectedNode: Node): boolean {\n if (selectedNode.isFolder() && selectedNode.is_open) {\n // Left on an open node closes the node\n this.closeNode(selectedNode);\n return false;\n } else {\n // Left on a closed or end node moves focus to the node's parent\n return this.selectNode(selectedNode.getParent());\n }\n }\n\n public selectNode(node: Node | null): boolean {\n if (!node) {\n return true;\n } else {\n this.originalSelectNode(node);\n\n return false;\n }\n }\n\n private handleKeyDown = (e: KeyboardEvent): boolean => {\n if (!this.canHandleKeyboard()) {\n return true;\n }\n\n const selectedNode = this.getSelectedNode();\n if (!selectedNode) {\n return true;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n return this.moveDown(selectedNode);\n\n case \"ArrowUp\":\n return this.moveUp(selectedNode);\n\n case \"ArrowRight\":\n return this.moveRight(selectedNode);\n\n case \"ArrowLeft\":\n return this.moveLeft(selectedNode);\n\n default:\n return true;\n }\n };\n\n private canHandleKeyboard(): boolean {\n return this.keyboardSupport && this.isFocusOnTree();\n }\n}\n","export interface PositionInfo {\n originalEvent: Event;\n pageX: number;\n pageY: number;\n target: HTMLElement;\n}\n\nexport const getPositionInfoFromMouseEvent = (e: MouseEvent): PositionInfo => ({\n originalEvent: e,\n pageX: e.pageX,\n pageY: e.pageY,\n target: e.target as HTMLElement,\n});\n\nexport const getPositionInfoFromTouch = (\n touch: Touch,\n e: TouchEvent,\n): PositionInfo => ({\n originalEvent: e,\n pageX: touch.pageX,\n pageY: touch.pageY,\n target: touch.target as HTMLElement,\n});\n","import {\n getPositionInfoFromMouseEvent,\n getPositionInfoFromTouch,\n PositionInfo,\n} from \"./mouseUtils\";\nimport { Node } from \"./node\";\nimport { TriggerEvent } from \"./jqtreeMethodTypes\";\n\ninterface ClickTarget {\n node: Node;\n type: \"button\" | \"label\";\n}\n\ntype GetNode = (element: HTMLElement) => null | Node;\n\ninterface MouseHandlerParams {\n element: HTMLElement;\n getMouseDelay: () => number;\n getNode: GetNode;\n onClickButton: (node: Node) => void;\n onClickTitle: (node: Node) => void;\n onMouseCapture: (positionInfo: PositionInfo) => boolean | null;\n onMouseDrag: (positionInfo: PositionInfo) => void;\n onMouseStart: (positionInfo: PositionInfo) => boolean;\n onMouseStop: (positionInfo: PositionInfo) => void;\n triggerEvent: TriggerEvent;\n useContextMenu: boolean;\n}\n\nclass MouseHandler {\n private element: HTMLElement;\n private getMouseDelay: () => number;\n private getNode: GetNode;\n private isMouseDelayMet: boolean;\n private isMouseStarted: boolean;\n private mouseDelayTimer: number | null;\n private mouseDownInfo: PositionInfo | null;\n private onClickButton: (node: Node) => void;\n private onClickTitle: (node: Node) => void;\n private onMouseCapture: (positionInfo: PositionInfo) => boolean | null;\n private onMouseDrag: (positionInfo: PositionInfo) => void;\n private onMouseStart: (positionInfo: PositionInfo) => boolean;\n private onMouseStop: (positionInfo: PositionInfo) => void;\n private triggerEvent: TriggerEvent;\n private useContextMenu: boolean;\n\n constructor({\n element,\n getMouseDelay,\n getNode,\n onClickButton,\n onClickTitle,\n onMouseCapture,\n onMouseDrag,\n onMouseStart,\n onMouseStop,\n triggerEvent,\n useContextMenu,\n }: MouseHandlerParams) {\n this.element = element;\n this.getMouseDelay = getMouseDelay;\n this.getNode = getNode;\n this.onClickButton = onClickButton;\n this.onClickTitle = onClickTitle;\n this.onMouseCapture = onMouseCapture;\n this.onMouseDrag = onMouseDrag;\n this.onMouseStart = onMouseStart;\n this.onMouseStop = onMouseStop;\n this.triggerEvent = triggerEvent;\n this.useContextMenu = useContextMenu;\n\n element.addEventListener(\"click\", this.handleClick);\n element.addEventListener(\"dblclick\", this.handleDblclick);\n element.addEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n element.addEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n\n if (useContextMenu) {\n element.addEventListener(\"contextmenu\", this.handleContextmenu);\n }\n\n this.isMouseStarted = false;\n this.mouseDelayTimer = null;\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n }\n\n public deinit(): void {\n this.element.removeEventListener(\"click\", this.handleClick);\n this.element.removeEventListener(\"dblclick\", this.handleDblclick);\n\n if (this.useContextMenu) {\n this.element.removeEventListener(\n \"contextmenu\",\n this.handleContextmenu,\n );\n }\n\n this.element.removeEventListener(\"mousedown\", this.mouseDown);\n this.element.removeEventListener(\"touchstart\", this.touchStart);\n this.removeMouseMoveEventListeners();\n }\n\n private mouseDown = (e: MouseEvent): void => {\n // Left mouse button?\n if (e.button !== 0) {\n return;\n }\n\n const result = this.handleMouseDown(getPositionInfoFromMouseEvent(e));\n\n if (result && e.cancelable) {\n e.preventDefault();\n }\n };\n\n private handleMouseDown(positionInfo: PositionInfo): boolean {\n // We may have missed mouseup (out of window)\n if (this.isMouseStarted) {\n this.handleMouseUp(positionInfo);\n }\n\n this.mouseDownInfo = positionInfo;\n\n if (!this.onMouseCapture(positionInfo)) {\n return false;\n }\n\n this.handleStartMouse();\n\n return true;\n }\n\n private handleStartMouse(): void {\n document.addEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n document.addEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n document.addEventListener(\"mouseup\", this.mouseUp, { passive: false });\n document.addEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\n\n const mouseDelay = this.getMouseDelay();\n\n if (mouseDelay) {\n this.startMouseDelayTimer(mouseDelay);\n } else {\n this.isMouseDelayMet = true;\n }\n }\n\n private startMouseDelayTimer(mouseDelay: number): void {\n if (this.mouseDelayTimer) {\n clearTimeout(this.mouseDelayTimer);\n }\n\n this.mouseDelayTimer = window.setTimeout(() => {\n if (this.mouseDownInfo) {\n this.isMouseDelayMet = true;\n }\n }, mouseDelay);\n\n this.isMouseDelayMet = false;\n }\n\n private mouseMove = (e: MouseEvent): void => {\n this.handleMouseMove(e, getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseMove(\n e: MouseEvent | TouchEvent,\n positionInfo: PositionInfo,\n ): void {\n if (this.isMouseStarted) {\n this.onMouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n return;\n }\n\n if (!this.isMouseDelayMet) {\n return;\n }\n\n if (this.mouseDownInfo) {\n this.isMouseStarted =\n this.onMouseStart(this.mouseDownInfo) !== false;\n }\n\n if (this.isMouseStarted) {\n this.onMouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n } else {\n this.handleMouseUp(positionInfo);\n }\n }\n\n private mouseUp = (e: MouseEvent): void => {\n this.handleMouseUp(getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseUp(positionInfo: PositionInfo): void {\n this.removeMouseMoveEventListeners();\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n\n if (this.isMouseStarted) {\n this.isMouseStarted = false;\n this.onMouseStop(positionInfo);\n }\n }\n\n private removeMouseMoveEventListeners() {\n document.removeEventListener(\"mousemove\", this.mouseMove);\n document.removeEventListener(\"touchmove\", this.touchMove);\n document.removeEventListener(\"mouseup\", this.mouseUp);\n document.removeEventListener(\"touchend\", this.touchEnd);\n }\n\n private touchStart = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.touches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseDown(getPositionInfoFromTouch(touch, e));\n };\n\n private touchMove = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.touches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseMove(e, getPositionInfoFromTouch(touch, e));\n };\n\n private touchEnd = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.touches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseUp(getPositionInfoFromTouch(touch, e));\n };\n\n private handleClick = (e: MouseEvent): void => {\n if (!e.target) {\n return;\n }\n\n const clickTarget = this.getClickTarget(e.target as HTMLElement);\n\n if (!clickTarget) {\n return;\n }\n\n if (clickTarget.type === \"button\") {\n this.onClickButton(clickTarget.node);\n\n e.preventDefault();\n e.stopPropagation();\n } else if (clickTarget.type === \"label\") {\n const event = this.triggerEvent(\"tree.click\", {\n node: clickTarget.node,\n click_event: e,\n });\n\n if (!event.isDefaultPrevented()) {\n this.onClickTitle(clickTarget.node);\n }\n }\n };\n\n private handleDblclick = (e: MouseEvent): void => {\n if (!e.target) {\n return;\n }\n\n const clickTarget = this.getClickTarget(e.target as HTMLElement);\n\n if (clickTarget?.type === \"label\") {\n this.triggerEvent(\"tree.dblclick\", {\n node: clickTarget.node,\n click_event: e,\n });\n }\n };\n\n private handleContextmenu = (e: MouseEvent) => {\n if (!e.target) {\n return;\n }\n\n const div = (e.target as HTMLElement).closest(\n \"ul.jqtree-tree .jqtree-element\",\n );\n\n if (div) {\n const node = this.getNode(div);\n if (node) {\n e.preventDefault();\n e.stopPropagation();\n\n this.triggerEvent(\"tree.contextmenu\", {\n node,\n click_event: e,\n });\n return false;\n }\n }\n\n return null;\n };\n\n private getClickTarget(element: HTMLElement): ClickTarget | null {\n const button = element.closest(\".jqtree-toggler\");\n\n if (button) {\n const node = this.getNode(button);\n\n if (node) {\n return {\n type: \"button\",\n node,\n };\n }\n } else {\n const jqTreeElement =\n element.closest(\".jqtree-element\");\n\n if (jqTreeElement) {\n const node = this.getNode(jqTreeElement);\n if (node) {\n return {\n type: \"label\",\n node,\n };\n }\n }\n }\n\n return null;\n }\n}\n\nexport default MouseHandler;\n","import { isInt } from \"./util\";\nimport { Node } from \"./node\";\nimport { OnGetStateFromStorage, OnSetStateFromStorage } from \"./jqtreeOptions\";\nimport {\n AddToSelection,\n GetNodeById,\n GetSelectedNodes,\n GetTree,\n OpenNode,\n RefreshElements,\n RemoveFromSelection,\n} from \"./jqtreeMethodTypes\";\n\nexport interface SavedState {\n open_nodes: NodeId[];\n selected_node: NodeId[];\n}\n\ninterface SaveStateHandlerParams {\n addToSelection: AddToSelection;\n getNodeById: GetNodeById;\n getSelectedNodes: GetSelectedNodes;\n getTree: GetTree;\n onGetStateFromStorage?: OnGetStateFromStorage;\n onSetStateFromStorage?: OnSetStateFromStorage;\n openNode: OpenNode;\n refreshElements: RefreshElements;\n removeFromSelection: RemoveFromSelection;\n saveState: boolean | string;\n}\n\nexport default class SaveStateHandler {\n private addToSelection: AddToSelection;\n private getNodeById: GetNodeById;\n private getSelectedNodes: GetSelectedNodes;\n private getTree: GetTree;\n private onGetStateFromStorage?: OnGetStateFromStorage;\n private onSetStateFromStorage?: OnSetStateFromStorage;\n private openNode: OpenNode;\n private refreshElements: RefreshElements;\n private removeFromSelection: RemoveFromSelection;\n private saveStateOption: boolean | string;\n private _supportsLocalStorage: boolean | null;\n\n constructor({\n addToSelection,\n getNodeById,\n getSelectedNodes,\n getTree,\n onGetStateFromStorage,\n onSetStateFromStorage,\n openNode,\n refreshElements,\n removeFromSelection,\n saveState,\n }: SaveStateHandlerParams) {\n this.addToSelection = addToSelection;\n this.getNodeById = getNodeById;\n this.getSelectedNodes = getSelectedNodes;\n this.getTree = getTree;\n this.onGetStateFromStorage = onGetStateFromStorage;\n this.onSetStateFromStorage = onSetStateFromStorage;\n this.openNode = openNode;\n this.refreshElements = refreshElements;\n this.removeFromSelection = removeFromSelection;\n this.saveStateOption = saveState;\n }\n\n public saveState(): void {\n const state = JSON.stringify(this.getState());\n\n if (this.onSetStateFromStorage) {\n this.onSetStateFromStorage(state);\n } else if (this.supportsLocalStorage()) {\n localStorage.setItem(this.getKeyName(), state);\n }\n }\n\n public getStateFromStorage(): SavedState | null {\n const jsonData = this.loadFromStorage();\n\n if (jsonData) {\n return this.parseState(jsonData) as unknown as SavedState;\n } else {\n return null;\n }\n }\n\n public getState(): SavedState {\n const getOpenNodeIds = (): NodeId[] => {\n const openNodes: NodeId[] = [];\n\n this.getTree()?.iterate((node: Node) => {\n if (node.is_open && node.id && node.hasChildren()) {\n openNodes.push(node.id);\n }\n return true;\n });\n\n return openNodes;\n };\n\n const getSelectedNodeIds = (): NodeId[] => {\n const selectedNodeIds: NodeId[] = [];\n\n this.getSelectedNodes().forEach((node) => {\n if (node.id != null) {\n selectedNodeIds.push(node.id);\n }\n });\n\n return selectedNodeIds;\n };\n\n return {\n open_nodes: getOpenNodeIds(),\n selected_node: getSelectedNodeIds(),\n };\n }\n\n /*\n Set initial state\n Don't handle nodes that are loaded on demand\n\n result: must load on demand\n */\n public setInitialState(state: SavedState): boolean {\n if (!state) {\n return false;\n } else {\n let mustLoadOnDemand = false;\n\n if (state.open_nodes) {\n mustLoadOnDemand = this.openInitialNodes(state.open_nodes);\n }\n\n if (state.selected_node) {\n this.resetSelection();\n this.selectInitialNodes(state.selected_node);\n }\n\n return mustLoadOnDemand;\n }\n }\n\n public setInitialStateOnDemand(\n state: SavedState,\n cbFinished: () => void,\n ): void {\n if (state) {\n this.doSetInitialStateOnDemand(\n state.open_nodes,\n state.selected_node,\n cbFinished,\n );\n } else {\n cbFinished();\n }\n }\n\n public getNodeIdToBeSelected(): NodeId | null {\n const state = this.getStateFromStorage();\n\n if (state && state.selected_node) {\n return state.selected_node[0] || null;\n } else {\n return null;\n }\n }\n\n private parseState(jsonData: string): SavedState {\n const state = JSON.parse(jsonData) as Record;\n\n // Check if selected_node is an int (instead of an array)\n if (state && state.selected_node && isInt(state.selected_node)) {\n // Convert to array\n state.selected_node = [state.selected_node];\n }\n\n return state as unknown as SavedState;\n }\n\n private loadFromStorage(): string | null {\n if (this.onGetStateFromStorage) {\n return this.onGetStateFromStorage();\n } else if (this.supportsLocalStorage()) {\n return localStorage.getItem(this.getKeyName());\n } else {\n return null;\n }\n }\n\n private openInitialNodes(nodeIds: NodeId[]): boolean {\n let mustLoadOnDemand = false;\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (node) {\n if (!node.load_on_demand) {\n node.is_open = true;\n } else {\n mustLoadOnDemand = true;\n }\n }\n }\n\n return mustLoadOnDemand;\n }\n\n private selectInitialNodes(nodeIds: NodeId[]): boolean {\n let selectCount = 0;\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (node) {\n selectCount += 1;\n\n this.addToSelection(node);\n }\n }\n\n return selectCount !== 0;\n }\n\n private resetSelection(): void {\n const selectedNodes = this.getSelectedNodes();\n\n selectedNodes.forEach((node) => {\n this.removeFromSelection(node);\n });\n }\n\n private doSetInitialStateOnDemand(\n nodeIdsParam: NodeId[],\n selectedNodes: NodeId[],\n cbFinished: () => void,\n ): void {\n let loadingCount = 0;\n let nodeIds = nodeIdsParam;\n\n const openNodes = (): void => {\n const newNodesIds = [];\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (!node) {\n newNodesIds.push(nodeId);\n } else {\n if (!node.is_loading) {\n if (node.load_on_demand) {\n loadAndOpenNode(node);\n } else {\n this.openNode(node, false);\n }\n }\n }\n }\n\n nodeIds = newNodesIds;\n\n if (this.selectInitialNodes(selectedNodes)) {\n this.refreshElements(null);\n }\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this.openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n openNodes();\n }\n\n private getKeyName(): string {\n if (typeof this.saveStateOption === \"string\") {\n return this.saveStateOption;\n } else {\n return \"tree\";\n }\n }\n\n private supportsLocalStorage(): boolean {\n const testSupport = (): boolean => {\n // Is local storage supported?\n if (localStorage == null) {\n return false;\n } else {\n // Check if it's possible to store an item. Safari does not allow this in private browsing mode.\n try {\n const key = \"_storage_test\";\n sessionStorage.setItem(key, \"value\");\n sessionStorage.removeItem(key);\n } catch (error) {\n return false;\n }\n\n return true;\n }\n };\n\n if (this._supportsLocalStorage == null) {\n this._supportsLocalStorage = testSupport();\n }\n\n return this._supportsLocalStorage;\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport { getElementPosition, getOffsetTop } from '../util'\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\ninterface Params {\n container: HTMLElement;\n refreshHitAreas: () => void;\n}\n\nexport default class ContainerScrollParent implements ScrollParent {\n private container: HTMLElement;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private scrollParentBottom?: number;\n private scrollParentTop?: number;\n private verticalScrollTimeout?: number;\n private verticalScrollDirection?: VerticalScrollDirection;\n\n constructor({ container, refreshHitAreas }: Params) {\n this.container = container;\n this.refreshHitAreas = refreshHitAreas;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return this.container.scrollLeft;\n }\n\n public scrollToY(top: number): void {\n this.container.scrollTop = top;\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.scrollParentTop = undefined;\n this.scrollParentBottom = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const scrollParentOffset = getElementPosition(this.container);\n\n const rightEdge = scrollParentOffset.left + this.container.clientWidth;\n const leftEdge = scrollParentOffset.left;\n const isNearRightEdge = pageX > rightEdge - 20;\n const isNearLeftEdge = pageX < leftEdge + 20;\n\n if (isNearRightEdge) {\n return \"right\";\n } else if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n if (pageY < this.getScrollParentTop()) {\n return \"top\";\n }\n\n if (pageY > this.getScrollParentBottom()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n\n this.container.scrollBy({\n left: distance,\n top: 0,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n\n this.container.scrollBy({\n left: 0,\n top: distance,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n\n private getScrollParentTop() {\n if (this.scrollParentTop == null) {\n this.scrollParentTop = getOffsetTop(this.container)\n }\n\n return this.scrollParentTop;\n }\n\n private getScrollParentBottom() {\n if (this.scrollParentBottom == null) {\n this.scrollParentBottom = this.getScrollParentTop() + this.container.clientHeight;\n }\n\n return this.scrollParentBottom;\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport { getOffsetTop } from '../util'\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\ninterface Params {\n refreshHitAreas: () => void;\n treeElement: HTMLElement;\n}\n\nexport default class DocumentScrollParent implements ScrollParent {\n private documentScrollHeight?: number;\n private documentScrollWidth?: number;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private treeElement: HTMLElement;\n private verticalScrollDirection?: VerticalScrollDirection;\n private verticalScrollTimeout?: number;\n\n constructor({ refreshHitAreas, treeElement }: Params) {\n this.refreshHitAreas = refreshHitAreas;\n this.treeElement = treeElement;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.horizontalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return document.documentElement.scrollLeft;\n }\n\n public scrollToY(top: number): void {\n const treeTop = getOffsetTop(this.treeElement);\n\n document.documentElement.scrollTop = top + treeTop;\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.documentScrollHeight = undefined;\n this.documentScrollWidth = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const scrollLeft = document.documentElement.scrollLeft;\n const windowWidth = window.innerWidth;\n\n const isNearRightEdge = pageX > windowWidth - 20;\n const isNearLeftEdge = pageX - scrollLeft < 20;\n\n if (isNearRightEdge && this.canScrollRight()) {\n return \"right\";\n }\n\n if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private canScrollRight() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollLeft + documentElement.clientWidth <\n this.getDocumentScrollWidth()\n );\n }\n\n private canScrollDown() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollTop + documentElement.clientHeight <\n this.getDocumentScrollHeight()\n );\n }\n\n private getDocumentScrollHeight() {\n // Store the original scroll height because the scroll height can increase when the drag element is moved beyond the scroll height.\n if (this.documentScrollHeight == null) {\n this.documentScrollHeight = document.documentElement.scrollHeight;\n }\n\n return this.documentScrollHeight;\n }\n\n private getDocumentScrollWidth() {\n // Store the original scroll width because the scroll width can increase when the drag element is moved beyond the scroll width.\n if (this.documentScrollWidth == null) {\n this.documentScrollWidth = document.documentElement.scrollWidth;\n }\n\n return this.documentScrollWidth;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n const scrollTop = jQuery(document).scrollTop() || 0;\n const distanceTop = pageY - scrollTop;\n\n if (distanceTop < 20) {\n return \"top\";\n }\n\n const windowHeight = window.innerHeight;\n\n if (windowHeight - (pageY - scrollTop) < 20 && this.canScrollDown()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n window.scrollBy({ left: distance, top: 0, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n window.scrollBy({ left: 0, top: distance, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport ContainerScrollParent from \"./containerScrollParent\";\nimport DocumentScrollParent from \"./documentScrollParent\";\n\nconst isOverflow = (overflowValue: string) =>\n overflowValue === \"auto\" || overflowValue === \"scroll\";\n\nconst hasOverFlow = (element: HTMLElement): boolean => {\n const style = getComputedStyle(element);\n\n return isOverflow(style.overflowX) || isOverflow(style.overflowY);\n};\n\nconst getParentWithOverflow = (\n treeElement: HTMLElement,\n): HTMLElement | null => {\n if (hasOverFlow(treeElement)) {\n return treeElement;\n }\n\n let parent = treeElement.parentElement;\n\n while (parent) {\n if (hasOverFlow(parent)) {\n return parent;\n }\n\n parent = parent.parentElement;\n }\n\n return null;\n};\n\nconst createScrollParent = (\n treeElement: HTMLElement,\n refreshHitAreas: () => void,\n): ScrollParent => {\n const container = getParentWithOverflow(treeElement);\n\n if (container && container.tagName !== \"HTML\") {\n return new ContainerScrollParent({\n container,\n refreshHitAreas,\n });\n } else {\n return new DocumentScrollParent({ refreshHitAreas, treeElement });\n }\n};\n\nexport default createScrollParent;\n","import { PositionInfo } from \"./mouseUtils\";\nimport { ScrollParent } from \"./scrollHandler/types\";\nimport createScrollParent from \"./scrollHandler/createScrollParent\";\n\ninterface ScrollHandlerParams {\n refreshHitAreas: () => void;\n treeElement: HTMLElement;\n}\n\nexport default class ScrollHandler {\n private refreshHitAreas: () => void;\n private scrollParent?: ScrollParent;\n private treeElement: HTMLElement;\n\n constructor({ refreshHitAreas, treeElement }: ScrollHandlerParams) {\n this.refreshHitAreas = refreshHitAreas;\n this.scrollParent = undefined;\n this.treeElement = treeElement;\n }\n\n public checkScrolling(positionInfo: PositionInfo): void {\n this.checkVerticalScrolling(positionInfo);\n this.checkHorizontalScrolling(positionInfo);\n }\n\n public stopScrolling() {\n this.getScrollParent().stopScrolling();\n }\n\n public scrollToY(top: number): void {\n this.getScrollParent().scrollToY(top);\n }\n\n public getScrollLeft(): number {\n return this.getScrollParent().getScrollLeft();\n }\n\n private checkVerticalScrolling(positionInfo: PositionInfo): void {\n this.getScrollParent().checkVerticalScrolling(positionInfo.pageY);\n }\n\n private checkHorizontalScrolling(positionInfo: PositionInfo): void {\n this.getScrollParent().checkHorizontalScrolling(positionInfo.pageX);\n }\n\n private getScrollParent(): ScrollParent {\n if (!this.scrollParent) {\n this.scrollParent = createScrollParent(\n this.treeElement,\n this.refreshHitAreas,\n );\n }\n\n return this.scrollParent;\n }\n}\n","import { Node } from \"./node\";\nimport { GetNodeById } from \"./jqtreeMethodTypes\";\n\ninterface SelectNodeHandlerParameters {\n getNodeById: GetNodeById;\n}\n\nexport default class SelectNodeHandler {\n private getNodeById: GetNodeById;\n private selectedNodes: Set;\n private selectedSingleNode: Node | null;\n\n constructor({ getNodeById }: SelectNodeHandlerParameters) {\n this.getNodeById = getNodeById;\n this.selectedNodes = new Set();\n this.clear();\n }\n\n public getSelectedNode(): Node | false {\n const selectedNodes = this.getSelectedNodes();\n\n if (selectedNodes.length) {\n return selectedNodes[0] || false;\n } else {\n return false;\n }\n }\n\n public getSelectedNodes(): Node[] {\n if (this.selectedSingleNode) {\n return [this.selectedSingleNode];\n } else {\n const selectedNodes: Node[] = [];\n\n this.selectedNodes.forEach((id) => {\n const node = this.getNodeById(id);\n if (node) {\n selectedNodes.push(node);\n }\n });\n\n return selectedNodes;\n }\n }\n\n public getSelectedNodesUnder(parent: Node): Node[] {\n if (this.selectedSingleNode) {\n if (parent.isParentOf(this.selectedSingleNode)) {\n return [this.selectedSingleNode];\n } else {\n return [];\n }\n } else {\n const selectedNodes = [];\n\n for (const id in this.selectedNodes) {\n if (\n Object.prototype.hasOwnProperty.call(this.selectedNodes, id)\n ) {\n const node = this.getNodeById(id);\n if (node && parent.isParentOf(node)) {\n selectedNodes.push(node);\n }\n }\n }\n\n return selectedNodes;\n }\n }\n\n public isNodeSelected(node: Node): boolean {\n if (node.id != null) {\n return this.selectedNodes.has(node.id);\n } else if (this.selectedSingleNode) {\n return this.selectedSingleNode.element === node.element;\n } else {\n return false;\n }\n }\n\n public clear(): void {\n this.selectedNodes.clear();\n this.selectedSingleNode = null;\n }\n\n public removeFromSelection(node: Node, includeChildren = false): void {\n if (node.id == null) {\n if (\n this.selectedSingleNode &&\n node.element === this.selectedSingleNode.element\n ) {\n this.selectedSingleNode = null;\n }\n } else {\n this.selectedNodes.delete(node.id);\n\n if (includeChildren) {\n node.iterate(() => {\n if (node.id != null) {\n this.selectedNodes.delete(node.id);\n }\n return true;\n });\n }\n }\n }\n\n public addToSelection(node: Node): void {\n if (node.id != null) {\n this.selectedNodes.add(node.id);\n } else {\n this.selectedSingleNode = node;\n }\n }\n}\n","const register = (widgetClass: unknown, widgetName: string): void => {\n const getDataKey = (): string => `simple_widget_${widgetName}`;\n\n const getWidgetData = (\n el: HTMLElement,\n dataKey: string\n ): SimpleWidget | null => {\n const widget = jQuery.data(el, dataKey) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n return widget;\n } else {\n return null;\n }\n };\n\n const createWidget = ($el: JQuery, options: unknown): JQuery => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const existingWidget = getWidgetData(el, dataKey);\n\n if (!existingWidget) {\n const simpleWidgetClass = widgetClass as typeof SimpleWidget;\n const widget = new simpleWidgetClass(el, options);\n\n if (!jQuery.data(el, dataKey)) {\n jQuery.data(el, dataKey, widget);\n }\n\n // Call init after setting data, so we can call methods\n widget.init();\n }\n }\n\n return $el;\n };\n\n const destroyWidget = ($el: JQuery): void => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const widget = getWidgetData(el, dataKey);\n\n if (widget) {\n widget.destroy();\n }\n\n jQuery.removeData(el, dataKey);\n }\n };\n\n const callFunction = (\n $el: JQuery,\n functionName: string,\n args: unknown[]\n ): unknown => {\n let result = null;\n\n for (const el of $el.get()) {\n const widget = jQuery.data(el, getDataKey()) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n const simpleWidget = widget as SimpleWidget;\n const widgetFunction = simpleWidget[functionName];\n\n if (widgetFunction && typeof widgetFunction === \"function\") {\n result = widgetFunction.apply(widget, args) as unknown;\n }\n }\n }\n\n return result;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (jQuery.fn as any)[widgetName] = function (\n this: JQuery,\n argument1: unknown,\n ...args: unknown[]\n ) {\n if (!argument1) {\n return createWidget(this, null);\n } else if (typeof argument1 === \"object\") {\n const options = argument1 as unknown;\n return createWidget(this, options);\n } else if (typeof argument1 === \"string\" && argument1[0] !== \"_\") {\n const functionName = argument1;\n\n if (functionName === \"destroy\") {\n return destroyWidget(this);\n } else if (functionName === \"get_widget_class\") {\n return widgetClass;\n } else {\n return callFunction(this, functionName, args);\n }\n } else {\n return undefined;\n }\n };\n};\n\nexport default class SimpleWidget {\n public static register(widgetClass: unknown, widgetName: string): void {\n register(widgetClass, widgetName);\n }\n\n [key: string]: unknown;\n\n protected static defaults: unknown = {};\n\n public options: WidgetOptions;\n\n public $el: JQuery;\n\n constructor(el: HTMLElement, options: WidgetOptions) {\n this.$el = jQuery(el);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const defaults = (this.constructor as any)[\"defaults\"] as WidgetOptions;\n this.options = { ...defaults, ...options };\n }\n\n public destroy(): void {\n this.deinit();\n }\n\n public init(): void {\n //\n }\n\n public deinit(): void {\n //\n }\n}\n","interface NodeRecordWithChildren extends NodeRecord {\n children: NodeData[];\n}\n\nexport const isNodeRecordWithChildren = (\n data: NodeData,\n): data is NodeRecordWithChildren =>\n typeof data === \"object\" &&\n \"children\" in data &&\n data[\"children\"] instanceof Array;\n","import { isNodeRecordWithChildren } from \"./nodeUtils\";\nimport { Position } from \"./position\";\n\ntype IterateCallback = (node: Node, level: number) => boolean;\n\nexport class Node implements INode {\n public id?: NodeId;\n public name: string;\n public children: Node[];\n public parent: Node | null;\n public idMapping: Map;\n public tree?: Node;\n public nodeClass?: typeof Node;\n public load_on_demand: boolean;\n public is_open: boolean;\n public element: HTMLElement;\n public is_loading: boolean;\n public isEmptyFolder: boolean;\n\n [key: string]: unknown;\n\n constructor(\n nodeData: NodeData | null = null,\n isRoot = false,\n nodeClass = Node,\n ) {\n this.name = \"\";\n this.load_on_demand = false;\n\n this.isEmptyFolder =\n nodeData != null &&\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length === 0;\n\n this.setData(nodeData);\n\n this.children = [];\n this.parent = null;\n\n if (isRoot) {\n this.idMapping = new Map();\n this.tree = this;\n this.nodeClass = nodeClass;\n }\n }\n\n /*\n Set the data of this node.\n\n setData(string): set the name of the node\n setData(object): set attributes of the node\n\n Examples:\n setData('node1')\n\n setData({ name: 'node1', id: 1});\n\n setData({ name: 'node2', id: 2, color: 'green'});\n\n * This is an internal function; it is not in the docs\n * Does not remove existing node values\n */\n public setData(o: NodeData | null): void {\n if (!o) {\n return;\n } else if (typeof o === \"string\") {\n this.name = o;\n } else if (typeof o === \"object\") {\n for (const key in o) {\n if (Object.prototype.hasOwnProperty.call(o, key)) {\n const value = o[key];\n\n if (key === \"label\" || key === \"name\") {\n // You can use the 'label' key instead of 'name'; this is a legacy feature\n if (typeof value === \"string\") {\n this.name = value;\n }\n } else if (key !== \"children\" && key !== \"parent\") {\n // You can't update the children or the parent using this function\n this[key] = value;\n }\n }\n }\n }\n }\n\n /*\n Create tree from data.\n\n Structure of data is:\n [\n {\n name: 'node1',\n children: [\n { name: 'child1' },\n { name: 'child2' }\n ]\n },\n {\n name: 'node2'\n }\n ]\n */\n public loadFromData(data: NodeData[]): Node {\n this.removeChildren();\n\n for (const childData of data) {\n const node = this.createNode(childData);\n this.addChild(node);\n\n if (isNodeRecordWithChildren(childData)) {\n node.loadFromData(childData.children);\n }\n }\n\n return this;\n }\n\n /*\n Add child.\n\n tree.addChild(\n new Node('child1')\n );\n */\n public addChild(node: Node): void {\n this.children.push(node);\n node.setParent(this);\n }\n\n /*\n Add child at position. Index starts at 0.\n\n tree.addChildAtPosition(\n new Node('abc'),\n 1\n );\n */\n public addChildAtPosition(node: Node, index: number): void {\n this.children.splice(index, 0, node);\n node.setParent(this);\n }\n\n /*\n Remove child. This also removes the children of the node.\n\n tree.removeChild(tree.children[0]);\n */\n public removeChild(node: Node): void {\n // remove children from the index\n node.removeChildren();\n\n this.doRemoveChild(node);\n }\n\n /*\n Get child index.\n\n var index = getChildIndex(node);\n */\n public getChildIndex(node: Node): number {\n return this.children.indexOf(node);\n }\n\n /*\n Does the tree have children?\n\n if (tree.hasChildren()) {\n //\n }\n */\n public hasChildren(): boolean {\n return this.children.length !== 0;\n }\n\n public isFolder(): boolean {\n return this.hasChildren() || this.load_on_demand;\n }\n\n /*\n Iterate over all the nodes in the tree.\n\n Calls callback with (node, level).\n\n The callback must return true to continue the iteration on current node.\n\n tree.iterate(\n function(node, level) {\n console.log(node.name);\n\n // stop iteration after level 2\n return (level <= 2);\n }\n );\n\n */\n public iterate(callback: IterateCallback): void {\n const _iterate = (node: Node, level: number): void => {\n if (node.children) {\n for (const child of node.children) {\n const result = callback(child, level);\n\n if (result && child.hasChildren()) {\n _iterate(child, level + 1);\n }\n }\n }\n };\n\n _iterate(this, 0);\n }\n\n /*\n Move node relative to another node.\n\n Argument position: Position.BEFORE, Position.AFTER or Position.Inside\n\n // move node1 after node2\n tree.moveNode(node1, node2, Position.AFTER);\n */\n public moveNode(\n movedNode: Node,\n targetNode: Node,\n position: Position,\n ): boolean {\n if (!movedNode.parent || movedNode.isParentOf(targetNode)) {\n // - Node is parent of target node\n // - Or, parent is empty\n return false;\n } else {\n movedNode.parent.doRemoveChild(movedNode);\n\n switch (position) {\n case Position.After: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode) + 1,\n );\n return true;\n }\n return false;\n }\n\n case Position.Before: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode),\n );\n return true;\n }\n return false;\n }\n\n case Position.Inside: {\n // move inside as first child\n targetNode.addChildAtPosition(movedNode, 0);\n return true;\n }\n\n default:\n return false;\n }\n }\n }\n\n /*\n Get the tree as data.\n */\n public getData(includeParent = false): NodeRecord[] {\n const getDataFromNodes = (nodes: Node[]): Record[] => {\n return nodes.map((node) => {\n const tmpNode: Record = {};\n\n for (const k in node) {\n if (\n [\n \"parent\",\n \"children\",\n \"element\",\n \"idMapping\",\n \"load_on_demand\",\n \"nodeClass\",\n \"tree\",\n \"isEmptyFolder\",\n ].indexOf(k) === -1 &&\n Object.prototype.hasOwnProperty.call(node, k)\n ) {\n const v = node[k];\n tmpNode[k] = v;\n }\n }\n\n if (node.hasChildren()) {\n tmpNode[\"children\"] = getDataFromNodes(node.children);\n }\n\n return tmpNode;\n });\n };\n\n if (includeParent) {\n return getDataFromNodes([this]);\n } else {\n return getDataFromNodes(this.children);\n }\n }\n\n public getNodeByName(name: string): Node | null {\n return this.getNodeByCallback((node: Node) => node.name === name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n const node = this.getNodeByCallback((n: Node) => n.name === name);\n\n if (!node) {\n throw `Node with name ${name} not found`;\n }\n\n return node;\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n let result: Node | null = null;\n\n this.iterate((node: Node) => {\n if (result) {\n return false;\n } else if (callback(node)) {\n result = node;\n return false;\n } else {\n return true;\n }\n });\n\n return result;\n }\n\n public addAfter(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex + 1);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addBefore(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addParent(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const newParent = this.createNode(nodeInfo);\n\n if (this.tree) {\n newParent.setParent(this.tree);\n }\n const originalParent = this.parent;\n\n for (const child of originalParent.children) {\n newParent.addChild(child);\n }\n\n originalParent.children = [];\n originalParent.addChild(newParent);\n return newParent;\n }\n }\n\n public remove(): void {\n if (this.parent) {\n this.parent.removeChild(this);\n this.parent = null;\n }\n }\n\n public append(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChild(node);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public prepend(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChildAtPosition(node, 0);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public isParentOf(node: Node): boolean {\n let parent = node.parent;\n\n while (parent) {\n if (parent === this) {\n return true;\n }\n\n parent = parent.parent;\n }\n\n return false;\n }\n\n public getLevel(): number {\n let level = 0;\n let node: Node = this; // eslint-disable-line @typescript-eslint/no-this-alias\n\n while (node.parent) {\n level += 1;\n node = node.parent;\n }\n\n return level;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.idMapping.get(nodeId) || null;\n }\n\n public addNodeToIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.set(node.id, node);\n }\n }\n\n public removeNodeFromIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.delete(node.id);\n }\n }\n\n public removeChildren(): void {\n this.iterate((child: Node) => {\n this.tree?.removeNodeFromIndex(child);\n return true;\n });\n\n this.children = [];\n }\n\n public getPreviousSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousIndex = this.parent.getChildIndex(this) - 1;\n if (previousIndex >= 0) {\n return this.parent.children[previousIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNextSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const nextIndex = this.parent.getChildIndex(this) + 1;\n if (nextIndex < this.parent.children.length) {\n return this.parent.children[nextIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.filter((node: Node) => node[key] === value);\n }\n\n public filter(f: (node: Node) => boolean): Node[] {\n const result: Node[] = [];\n\n this.iterate((node: Node) => {\n if (f(node)) {\n result.push(node);\n }\n\n return true;\n });\n\n return result;\n }\n\n public getNextNode(includeChildren = true): Node | null {\n if (includeChildren && this.hasChildren()) {\n return this.children[0] || null;\n } else if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n\n if (nextSibling) {\n return nextSibling;\n } else {\n return this.parent.getNextNode(false);\n }\n }\n }\n\n public getNextVisibleNode(): Node | null {\n if (this.hasChildren() && this.is_open) {\n // First child\n return this.children[0] || null;\n } else {\n if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n if (nextSibling) {\n // Next sibling\n return nextSibling;\n } else {\n // Next node of parent\n return this.parent.getNextNode(false);\n }\n }\n }\n }\n\n public getPreviousNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (previousSibling.hasChildren()) {\n return previousSibling.getLastChild();\n } else {\n return previousSibling;\n }\n }\n }\n\n public getPreviousVisibleNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (\n !previousSibling.hasChildren() ||\n !previousSibling.is_open\n ) {\n // Previous sibling\n return previousSibling;\n } else {\n // Last child of previous sibling\n return previousSibling.getLastChild();\n }\n }\n }\n\n public getParent(): Node | null {\n // Return parent except if it is the root node\n if (!this.parent) {\n return null;\n } else if (!this.parent.parent) {\n // Root node -> null\n return null;\n } else {\n return this.parent;\n }\n }\n\n public getLastChild(): Node | null {\n if (!this.hasChildren()) {\n return null;\n } else {\n const lastChild = this.children[this.children.length - 1];\n\n if (!lastChild) {\n return null;\n }\n\n if (!(lastChild.hasChildren() && lastChild.is_open)) {\n return lastChild;\n } else {\n return lastChild?.getLastChild();\n }\n }\n }\n\n // Init Node from data without making it the root of the tree\n public initFromData(data: NodeData): void {\n const addNode = (nodeData: NodeData): void => {\n this.setData(nodeData);\n\n if (\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length\n ) {\n addChildren(nodeData.children);\n }\n };\n\n const addChildren = (childrenData: NodeData[]): void => {\n for (const child of childrenData) {\n const node = this.createNode();\n node.initFromData(child);\n this.addChild(node);\n }\n };\n\n addNode(data);\n }\n\n private setParent(parent: Node): void {\n this.parent = parent;\n this.tree = parent.tree;\n this.tree?.addNodeToIndex(this);\n }\n\n private doRemoveChild(node: Node): void {\n this.children.splice(this.getChildIndex(node), 1);\n this.tree?.removeNodeFromIndex(node);\n }\n\n private getNodeClass(): typeof Node {\n return this.nodeClass || this?.tree?.nodeClass || Node;\n }\n\n private createNode(nodeData?: NodeData): Node {\n const nodeClass = this.getNodeClass();\n return new nodeClass(nodeData);\n }\n\n // Load children data from nodeInfo if it has children\n private loadChildrenFromData(nodeInfo: NodeData) {\n if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {\n this.loadFromData(nodeInfo.children);\n }\n }\n}\n","import { DropHint } from \"../dragAndDropHandler/types\";\n\nclass BorderDropHint implements DropHint {\n private hint?: HTMLElement;\n\n constructor(element: HTMLElement, scrollLeft: number) {\n const div = element.querySelector(\":scope > .jqtree-element\");\n\n if (!div) {\n this.hint = undefined;\n return;\n }\n\n const width = Math.max(element.offsetWidth + scrollLeft - 4, 0);\n const height = Math.max(element.clientHeight - 4, 0);\n\n const hint = document.createElement(\"span\");\n hint.className = \"jqtree-border\";\n hint.style.width = `${width}px`;\n hint.style.height = `${height}px`;\n\n this.hint = hint;\n\n div.append(this.hint);\n }\n\n public remove(): void {\n this.hint?.remove();\n }\n}\n\nexport default BorderDropHint;\n","import { Node } from \"../node\";\nimport { Position } from \"../position\";\nimport { DropHint } from \"../dragAndDropHandler/types\";\n\nclass GhostDropHint implements DropHint {\n private element: HTMLElement;\n private node: Node;\n private ghost: HTMLElement;\n\n constructor(node: Node, element: HTMLElement, position: Position) {\n this.element = element;\n this.node = node;\n this.ghost = this.createGhostElement();\n\n if (position === Position.After) {\n this.moveAfter();\n } else if (position === Position.Before) {\n this.moveBefore();\n } else if (position === Position.Inside) {\n if (node.isFolder() && node.is_open) {\n this.moveInsideOpenFolder();\n } else {\n this.moveInside();\n }\n }\n }\n\n public remove(): void {\n this.ghost.remove();\n }\n\n private moveAfter(): void {\n this.element.after(this.ghost);\n }\n\n private moveBefore(): void {\n this.element.before(this.ghost);\n }\n\n private moveInsideOpenFolder(): void {\n const childElement = this.node.children[0]?.element;\n\n if (childElement) {\n childElement.before(this.ghost);\n }\n }\n\n private moveInside(): void {\n this.element.after(this.ghost);\n this.ghost.classList.add(\"jqtree-inside\");\n }\n\n private createGhostElement() {\n const ghost = document.createElement(\"li\");\n ghost.className = \"jqtree_common jqtree-ghost\";\n\n const circleSpan = document.createElement(\"span\");\n circleSpan.className = \"jqtree_common jqtree-circle\";\n ghost.append(circleSpan);\n\n const lineSpan = document.createElement(\"span\");\n lineSpan.className = \"jqtree_common jqtree-line\";\n ghost.append(lineSpan);\n\n return ghost;\n }\n}\n\nexport default GhostDropHint;\n","import { Node } from \"../node\";\nimport { Position } from \"../position\";\nimport { DropHint } from \"../dragAndDropHandler/types\";\nimport BorderDropHint from \"./borderDropHint\";\nimport GhostDropHint from \"./ghostDropHint\";\nimport { GetScrollLeft } from \"../jqtreeMethodTypes\";\n\nexport interface NodeElementParams {\n getScrollLeft: GetScrollLeft;\n node: Node;\n tabIndex?: number;\n $treeElement: JQuery;\n}\n\nclass NodeElement {\n public node: Node;\n public element: HTMLElement;\n private getScrollLeft: GetScrollLeft;\n private tabIndex?: number;\n private $treeElement: JQuery;\n\n constructor({\n getScrollLeft,\n node,\n tabIndex,\n $treeElement,\n }: NodeElementParams) {\n this.getScrollLeft = getScrollLeft;\n this.tabIndex = tabIndex;\n this.$treeElement = $treeElement;\n\n this.init(node);\n }\n\n public init(node: Node): void {\n this.node = node;\n\n if (!node.element) {\n const element = this.$treeElement.get(0);\n\n if (element) {\n node.element = element;\n }\n }\n\n if (node.element) {\n this.element = node.element;\n }\n }\n\n public addDropHint(position: number): DropHint {\n if (this.mustShowBorderDropHint(position)) {\n return new BorderDropHint(this.element, this.getScrollLeft());\n } else {\n return new GhostDropHint(this.node, this.element, position);\n }\n }\n\n public select(mustSetFocus: boolean): void {\n this.element.classList.add(\"jqtree-selected\");\n\n const titleSpan = this.getTitleSpan();\n const tabIndex = this.tabIndex;\n\n // Check for null or undefined\n if (tabIndex != null) {\n titleSpan.setAttribute(\"tabindex\", tabIndex.toString());\n }\n\n titleSpan.setAttribute(\"aria-selected\", \"true\");\n\n if (mustSetFocus) {\n titleSpan.focus();\n }\n }\n\n public deselect(): void {\n this.element.classList.remove(\"jqtree-selected\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.removeAttribute(\"tabindex\");\n titleSpan.setAttribute(\"aria-selected\", \"false\");\n\n titleSpan.blur();\n }\n\n protected getUl(): HTMLUListElement {\n return this.element.querySelector(\":scope > ul\") as HTMLUListElement;\n }\n\n protected getTitleSpan(): HTMLSpanElement {\n return this.element.querySelector(\n \":scope > .jqtree-element > span.jqtree-title\",\n ) as HTMLSpanElement;\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return position === Position.Inside;\n }\n}\n\nexport default NodeElement;\n","import { Position } from \"../position\";\nimport NodeElement, { NodeElementParams } from \"./index\";\nimport { OnFinishOpenNode, TriggerEvent } from \"../jqtreeMethodTypes\";\n\ninterface FolderElementParams extends NodeElementParams {\n closedIconElement?: HTMLElement | Text;\n openedIconElement?: HTMLElement | Text;\n triggerEvent: TriggerEvent;\n}\n\nclass FolderElement extends NodeElement {\n private closedIconElement?: HTMLElement | Text;\n private openedIconElement?: HTMLElement | Text;\n private triggerEvent: TriggerEvent;\n\n constructor({\n closedIconElement,\n getScrollLeft,\n node,\n openedIconElement,\n tabIndex,\n $treeElement,\n triggerEvent,\n }: FolderElementParams) {\n super({\n getScrollLeft,\n node,\n tabIndex,\n $treeElement,\n });\n\n this.closedIconElement = closedIconElement;\n this.openedIconElement = openedIconElement;\n this.triggerEvent = triggerEvent;\n }\n\n public open(\n onFinished: OnFinishOpenNode | undefined,\n slide = true,\n animationSpeed: JQuery.Duration = \"fast\",\n ): void {\n if (this.node.is_open) {\n return;\n }\n\n this.node.is_open = true;\n\n const button = this.getButton();\n button.classList.remove(\"jqtree-closed\");\n button.innerHTML = \"\";\n\n const openedIconElement = this.openedIconElement;\n\n if (openedIconElement) {\n const icon = openedIconElement.cloneNode(true);\n button.appendChild(icon);\n }\n\n const doOpen = (): void => {\n this.element.classList.remove(\"jqtree-closed\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"true\");\n\n if (onFinished) {\n onFinished(this.node);\n }\n\n this.triggerEvent(\"tree.open\", {\n node: this.node,\n });\n };\n\n if (slide) {\n jQuery(this.getUl()).slideDown(animationSpeed, doOpen);\n } else {\n jQuery(this.getUl()).show();\n doOpen();\n }\n }\n\n public close(\n slide = true,\n animationSpeed: JQuery.Duration | undefined = \"fast\",\n ): void {\n if (!this.node.is_open) {\n return;\n }\n\n this.node.is_open = false;\n\n const button = this.getButton();\n button.classList.add(\"jqtree-closed\");\n button.innerHTML = \"\";\n\n const closedIconElement = this.closedIconElement;\n\n if (closedIconElement) {\n const icon = closedIconElement.cloneNode(true);\n button.appendChild(icon);\n }\n\n const doClose = (): void => {\n this.element.classList.add(\"jqtree-closed\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"false\");\n\n this.triggerEvent(\"tree.close\", {\n node: this.node,\n });\n };\n\n if (slide) {\n jQuery(this.getUl()).slideUp(animationSpeed, doClose);\n } else {\n jQuery(this.getUl()).hide();\n doClose();\n }\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return !this.node.is_open && position === Position.Inside;\n }\n\n private getButton(): HTMLLinkElement {\n return this.element.querySelector(\n \":scope > .jqtree-element > a.jqtree-toggler\",\n ) as HTMLLinkElement;\n }\n}\n\nexport default FolderElement;\n","import __version__ from \"./version\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport DataLoader, { HandleFinishedLoading } from \"./dataLoader\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseHandler from \"./mouseHandler\";\nimport { PositionInfo } from \"./mouseUtils\";\nimport SaveStateHandler, { SavedState } from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport SimpleWidget from \"./simple.widget\";\nimport { getOffsetTop, isFunction } from \"./util\";\nimport { Node } from \"./node\";\nimport { getPosition } from \"./position\";\nimport NodeElement from \"./nodeElement\";\nimport FolderElement from \"./nodeElement/folderElement\";\nimport { OnFinishOpenNode } from \"./jqtreeMethodTypes\";\nimport { JQTreeOptions } from \"./jqtreeOptions\";\n\ninterface SelectNodeOptions {\n mustToggle?: boolean;\n mustSetFocus?: boolean;\n}\n\nconst NODE_PARAM_IS_EMPTY = \"Node parameter is empty\";\nconst PARAM_IS_EMPTY = \"Parameter is empty: \";\n\nexport class JqTreeWidget extends SimpleWidget {\n protected static defaults: JQTreeOptions = {\n animationSpeed: \"fast\",\n autoEscape: true,\n autoOpen: false, // true / false / int (open n levels starting at 0)\n buttonLeft: true,\n // The symbol to use for a closed node - â–º BLACK RIGHT-POINTING POINTER\n // http://www.fileformat.info/info/unicode/char/25ba/index.htm\n closedIcon: undefined,\n data: undefined,\n dataFilter: undefined,\n dataUrl: undefined,\n dragAndDrop: false,\n keyboardSupport: true,\n nodeClass: Node,\n onCanMove: undefined, // Can this node be moved?\n onCanMoveTo: undefined, // Can this node be moved to this position? function(moved_node, target_node, position)\n onCanSelectNode: undefined,\n onCreateLi: undefined,\n onDragMove: undefined,\n onDragStop: undefined,\n onGetStateFromStorage: undefined,\n onIsMoveHandle: undefined,\n onLoadFailed: undefined,\n onLoading: undefined,\n onSetStateFromStorage: undefined,\n openedIcon: \"▼\",\n openFolderDelay: 500, // The delay for opening a folder during drag and drop; the value is in milliseconds\n // The symbol to use for an open node - â–¼ BLACK DOWN-POINTING TRIANGLE\n // http://www.fileformat.info/info/unicode/char/25bc/index.htm\n rtl: undefined, // right-to-left support; true / false (default)\n saveState: false, // true / false / string (cookie name)\n selectable: true,\n showEmptyFolder: false,\n slide: true, // must display slide animation?\n startDndDelay: 300, // The delay for starting dnd (in milliseconds)\n tabIndex: 0,\n useContextMenu: true,\n };\n\n private element: JQuery;\n private isInitialized: boolean;\n private tree: Node;\n\n private dataLoader: DataLoader;\n private dndHandler: DragAndDropHandler;\n private keyHandler: KeyHandler;\n private mouseHandler: MouseHandler;\n private renderer: ElementsRenderer;\n private saveStateHandler: SaveStateHandler;\n private scrollHandler: ScrollHandler;\n private selectNodeHandler: SelectNodeHandler;\n\n public toggle(node: Node, slideParam: null | boolean = null): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.is_open) {\n this.closeNode(node, slide);\n } else {\n this.openNode(node, slide);\n }\n\n return this.element;\n }\n\n public getTree(): Node {\n return this.tree;\n }\n\n public selectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): JQuery {\n this.doSelectNode(node, optionsParam);\n return this.element;\n }\n\n public getSelectedNode(): Node | false {\n return this.selectNodeHandler.getSelectedNode();\n }\n\n public toJson(): string {\n return JSON.stringify(this.tree.getData());\n }\n\n public loadData(data: NodeData[], parentNode: Node | null): JQuery {\n this.doLoadData(data, parentNode);\n return this.element;\n }\n\n /*\n signatures:\n - loadDataFromUrl(url, parent_node=null, on_finished=null)\n loadDataFromUrl('/my_data');\n loadDataFromUrl('/my_data', node1);\n loadDataFromUrl('/my_data', node1, function() { console.log('finished'); });\n loadDataFromUrl('/my_data', null, function() { console.log('finished'); });\n\n - loadDataFromUrl(parent_node=null, on_finished=null)\n loadDataFromUrl();\n loadDataFromUrl(node1);\n loadDataFromUrl(null, function() { console.log('finished'); });\n loadDataFromUrl(node1, function() { console.log('finished'); });\n */\n public loadDataFromUrl(\n param1: string | null | Node,\n param2?: Node | null | HandleFinishedLoading,\n param3?: HandleFinishedLoading,\n ): JQuery {\n if (typeof param1 === \"string\") {\n // first parameter is url\n this.doLoadDataFromUrl(\n param1,\n param2 as Node | null,\n param3 ?? null,\n );\n } else {\n // first parameter is not url\n this.doLoadDataFromUrl(\n null,\n param1,\n param2 as HandleFinishedLoading | null,\n );\n }\n\n return this.element;\n }\n\n public reload(onFinished: HandleFinishedLoading | null): JQuery {\n this.doLoadDataFromUrl(null, null, onFinished);\n return this.element;\n }\n\n public refresh(): JQuery {\n this.refreshElements(null);\n return this.element;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.tree.getNodeById(nodeId);\n }\n\n public getNodeByName(name: string): Node | null {\n return this.tree.getNodeByName(name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n return this.tree.getNodeByNameMustExist(name);\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.tree.getNodesByProperty(key, value);\n }\n\n public getNodeByHtmlElement(\n inputElement: HTMLElement | JQuery,\n ): Node | null {\n const element =\n inputElement instanceof HTMLElement\n ? inputElement\n : inputElement[0];\n\n if (!element) {\n return null;\n }\n\n return this.getNode(element);\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n return this.tree.getNodeByCallback(callback);\n }\n\n public openNode(\n node: Node,\n param1?: boolean | OnFinishOpenNode,\n param2?: OnFinishOpenNode,\n ): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const parseParams = (): [boolean, OnFinishOpenNode | undefined] => {\n let onFinished: OnFinishOpenNode | null;\n let slide: boolean | null;\n\n if (isFunction(param1)) {\n onFinished = param1 as OnFinishOpenNode;\n slide = null;\n } else {\n slide = param1 as boolean;\n onFinished = param2 as OnFinishOpenNode;\n }\n\n if (slide == null) {\n slide = this.options.slide ?? false;\n }\n\n return [slide, onFinished];\n };\n\n const [slide, onFinished] = parseParams();\n\n this.openNodeInternal(node, slide, onFinished);\n return this.element;\n }\n\n public closeNode(node: Node, slideParam?: null | boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.isFolder() || node.isEmptyFolder) {\n this.createFolderElement(node).close(\n slide,\n this.options.animationSpeed,\n );\n\n this.saveState();\n }\n\n return this.element;\n }\n\n public isDragging(): boolean {\n return this.dndHandler.isDragging;\n }\n\n public refreshHitAreas(): JQuery {\n this.dndHandler.refresh();\n return this.element;\n }\n\n public addNodeAfter(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n const newNode = existingNode.addAfter(newNodeInfo);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addNodeBefore(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addBefore(newNodeInfo);\n\n if (newNode) {\n this.refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addParentNode(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addParent(newNodeInfo);\n\n if (newNode) {\n this.refreshElements(newNode.parent);\n }\n\n return newNode;\n }\n\n public removeNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!node.parent) {\n throw Error(\"Node has no parent\");\n }\n\n this.selectNodeHandler.removeFromSelection(node, true); // including children\n\n const parent = node.parent;\n node.remove();\n this.refreshElements(parent);\n\n return this.element;\n }\n\n public appendNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam || this.tree;\n\n const node = parentNode.append(newNodeInfo);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n public prependNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam ?? this.tree;\n\n const node = parentNode.prepend(newNodeInfo);\n\n this.refreshElements(parentNode);\n\n return node;\n }\n\n public updateNode(node: Node, data: NodeData): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\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 as Node[]);\n }\n }\n\n this.refreshElements(node);\n\n return this.element;\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 public moveNode(node: Node, targetNode: Node, position: string): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!targetNode) {\n throw Error(PARAM_IS_EMPTY + \"targetNode\");\n }\n\n const positionIndex = getPosition(position);\n\n if (positionIndex !== undefined) {\n this.tree.moveNode(node, targetNode, positionIndex);\n this.refreshElements(null);\n }\n\n return this.element;\n }\n\n public getStateFromStorage(): SavedState | null {\n return this.saveStateHandler.getStateFromStorage();\n }\n\n public addToSelection(node: Node, mustSetFocus?: boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.addToSelection(node);\n this.openParents(node);\n\n this.getNodeElementForNode(node).select(\n mustSetFocus === undefined ? true : mustSetFocus,\n );\n\n this.saveState();\n\n return this.element;\n }\n\n public getSelectedNodes(): Node[] {\n return this.selectNodeHandler.getSelectedNodes();\n }\n\n public isNodeSelected(node: Node): boolean {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n return this.selectNodeHandler.isNodeSelected(node);\n }\n\n public removeFromSelection(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.removeFromSelection(node);\n\n this.getNodeElementForNode(node).deselect();\n this.saveState();\n\n return this.element;\n }\n\n public scrollToNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const top =\n getOffsetTop(node.element) -\n getOffsetTop(this.$el.get(0) as HTMLElement);\n\n this.scrollHandler.scrollToY(top);\n\n return this.element;\n }\n\n public getState(): SavedState | null {\n return this.saveStateHandler.getState();\n }\n\n public setState(state: SavedState): JQuery {\n this.saveStateHandler.setInitialState(state);\n this.refreshElements(null);\n\n return this.element;\n }\n\n public setOption(option: string, value: unknown): JQuery {\n (this.options as unknown as Record)[option] = value;\n return this.element;\n }\n\n public moveDown(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveDown(selectedNode);\n }\n\n return this.element;\n }\n\n public moveUp(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveUp(selectedNode);\n }\n\n return this.element;\n }\n\n public getVersion(): string {\n return __version__;\n }\n\n private openNodeInternal(\n node: Node,\n slide = true,\n onFinished?: OnFinishOpenNode,\n ): void {\n const doOpenNode = (\n _node: Node,\n _slide: boolean,\n _onFinished?: OnFinishOpenNode,\n ): void => {\n const folderElement = this.createFolderElement(_node);\n folderElement.open(\n _onFinished,\n _slide,\n this.options.animationSpeed,\n );\n };\n\n if (node.isFolder() || node.isEmptyFolder) {\n if (node.load_on_demand) {\n this.loadFolderOnDemand(node, slide, onFinished);\n } else {\n let parent = node.parent;\n\n while (parent) {\n // nb: do not open root element\n if (parent.parent) {\n doOpenNode(parent, false);\n }\n parent = parent.parent;\n }\n\n doOpenNode(node, slide, onFinished);\n this.saveState();\n }\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 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 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 public init(): void {\n super.init();\n\n this.element = this.$el;\n this.isInitialized = false;\n\n this.options.rtl = this.getRtlOption();\n\n if (this.options.closedIcon == null) {\n this.options.closedIcon = this.getDefaultClosedIcon();\n }\n\n this.connectHandlers();\n\n this.initData();\n }\n\n public deinit(): void {\n this.element.empty();\n this.element.off();\n\n this.keyHandler.deinit();\n this.mouseHandler.deinit();\n\n this.tree = new Node({}, true);\n\n super.deinit();\n }\n\n private triggerEvent(\n eventName: string,\n values?: Record,\n ): JQuery.Event {\n const event = jQuery.Event(eventName, values);\n this.element.trigger(event);\n return event;\n }\n\n private mouseCapture(positionInfo: PositionInfo): boolean | null {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseCapture(positionInfo);\n } else {\n return false;\n }\n }\n\n private mouseStart(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseStart(positionInfo);\n } else {\n return false;\n }\n }\n\n private mouseDrag(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n const result = this.dndHandler.mouseDrag(positionInfo);\n\n this.scrollHandler.checkScrolling(positionInfo);\n return result;\n } else {\n return false;\n }\n }\n\n private mouseStop(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n this.scrollHandler.stopScrolling();\n return this.dndHandler.mouseStop(positionInfo);\n } else {\n return false;\n }\n }\n\n private initData(): void {\n if (this.options.data) {\n this.doLoadData(this.options.data, null);\n } else {\n const dataUrl = this.getDataUrlInfo(null);\n\n if (dataUrl) {\n this.doLoadDataFromUrl(null, null, null);\n } else {\n this.doLoadData([], null);\n }\n }\n }\n\n private getDataUrlInfo(node: Node | null): JQuery.AjaxSettings | null {\n const dataUrl =\n this.options.dataUrl || (this.element.data(\"url\") as string | null);\n\n const getUrlFromString = (url: string): JQuery.AjaxSettings => {\n const urlInfo: JQuery.AjaxSettings = { url };\n\n setUrlInfoData(urlInfo);\n\n return urlInfo;\n };\n\n const setUrlInfoData = (urlInfo: JQuery.AjaxSettings): void => {\n if (node?.id) {\n // Load on demand of a subtree; add node parameter\n const data = { node: node.id };\n urlInfo[\"data\"] = data;\n } else {\n // Add selected_node parameter\n const selectedNodeId = this.getNodeIdToBeSelected();\n if (selectedNodeId) {\n const data = { selected_node: selectedNodeId };\n urlInfo[\"data\"] = data;\n }\n }\n };\n\n if (typeof dataUrl === \"function\") {\n return dataUrl(node);\n } else if (typeof dataUrl === \"string\") {\n return getUrlFromString(dataUrl);\n } else if (dataUrl && typeof dataUrl === \"object\") {\n setUrlInfoData(dataUrl);\n return dataUrl;\n } else {\n return null;\n }\n }\n\n private getNodeIdToBeSelected(): NodeId | null {\n if (this.options.saveState) {\n return this.saveStateHandler.getNodeIdToBeSelected();\n } else {\n return null;\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 if (!this.options.nodeClass) {\n return;\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 doInit();\n } else {\n // Load data on demand and then init the tree\n this.setInitialStateOnDemand(doInit);\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 if (!this.options.saveState) {\n return [false, false];\n } else {\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\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 // Call cb_finished when done\n private setInitialStateOnDemand(cbFinished: () => void): void {\n const restoreState = (): boolean => {\n if (!this.options.saveState) {\n return false;\n } else {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (!state) {\n return false;\n } else {\n this.saveStateHandler.setInitialStateOnDemand(\n state,\n cbFinished,\n );\n\n return true;\n }\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 this.openNodeInternal(node, false, () => {\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 this.openNodeInternal(node, false);\n\n return level !== maxLevel;\n }\n });\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n openNodes();\n };\n\n if (!restoreState()) {\n autoOpenNodes();\n }\n }\n\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 } else {\n return 0;\n }\n }\n\n private getNode(element: HTMLElement): null | Node {\n const liElement = element.closest(\"li.jqtree_common\");\n\n if (liElement) {\n return jQuery(liElement).data(\"node\") as Node;\n } else {\n return null;\n }\n }\n\n private saveState(): void {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n }\n\n private selectCurrentNode(mustSetFocus: boolean): void {\n const node = this.getSelectedNode();\n if (node) {\n const nodeElement = this.getNodeElementForNode(node);\n if (nodeElement) {\n nodeElement.select(mustSetFocus);\n }\n }\n }\n\n private deselectCurrentNode(): void {\n const node = this.getSelectedNode();\n if (node) {\n this.removeFromSelection(node);\n }\n }\n\n private getDefaultClosedIcon(): string {\n if (this.options.rtl) {\n // triangle to the left\n return \"◀\";\n } else {\n // triangle to the right\n return \"►\";\n }\n }\n\n private getRtlOption(): boolean {\n if (this.options.rtl != null) {\n return this.options.rtl;\n } else {\n const dataRtl = this.element.data(\"rtl\") as unknown;\n\n if (\n dataRtl !== null &&\n dataRtl !== false &&\n dataRtl !== undefined\n ) {\n return true;\n } else {\n return false;\n }\n }\n }\n\n private doSelectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): void {\n const saveState = (): void => {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n };\n\n if (!node) {\n // Called with empty node -> deselect current node\n this.deselectCurrentNode();\n saveState();\n return;\n }\n const defaultOptions = { mustSetFocus: true, mustToggle: true };\n const selectOptions = { ...defaultOptions, ...(optionsParam || {}) };\n\n const canSelect = (): boolean => {\n if (this.options.onCanSelectNode) {\n return (\n this.options.selectable === true &&\n this.options.onCanSelectNode(node)\n );\n } else {\n return this.options.selectable === true;\n }\n };\n\n if (!canSelect()) {\n return;\n }\n\n if (this.selectNodeHandler.isNodeSelected(node)) {\n if (selectOptions.mustToggle) {\n this.deselectCurrentNode();\n this.triggerEvent(\"tree.select\", {\n node: null,\n previous_node: node,\n });\n }\n } else {\n const deselectedNode = this.getSelectedNode() || null;\n this.deselectCurrentNode();\n this.addToSelection(node, selectOptions.mustSetFocus);\n\n this.triggerEvent(\"tree.select\", {\n node,\n deselected_node: deselectedNode,\n });\n this.openParents(node);\n }\n\n saveState();\n }\n\n private doLoadData(data: NodeData[] | null, parentNode: Node | null): 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.load_data\", {\n tree_data: data,\n parent_node: parentNode,\n });\n }\n\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 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 doLoadDataFromUrl(\n urlInfoParam: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null,\n ): void {\n const urlInfo = urlInfoParam || this.getDataUrlInfo(parentNode);\n\n this.dataLoader.loadFromUrl(urlInfo, parentNode, onFinished);\n }\n\n private loadFolderOnDemand(\n node: Node,\n slide = true,\n onFinished?: OnFinishOpenNode,\n ): void {\n node.is_loading = true;\n\n this.doLoadDataFromUrl(null, node, () => {\n this.openNodeInternal(node, slide, onFinished);\n });\n }\n\n private containsElement(element: HTMLElement): boolean {\n const node = this.getNode(element);\n\n return node != null && node.tree === this.tree;\n }\n\n private isFocusOnTree(): boolean {\n const activeElement = document.activeElement;\n\n return Boolean(\n activeElement &&\n activeElement.tagName === \"SPAN\" &&\n this.containsElement(activeElement as HTMLElement),\n );\n }\n\n private connectHandlers() {\n const {\n autoEscape,\n buttonLeft,\n closedIcon,\n dataFilter,\n dragAndDrop,\n keyboardSupport,\n onCanMove,\n onCreateLi,\n onDragMove,\n onDragStop,\n onGetStateFromStorage,\n onIsMoveHandle,\n onLoadFailed,\n onLoading,\n onSetStateFromStorage,\n openedIcon,\n openFolderDelay,\n rtl,\n saveState,\n showEmptyFolder,\n slide,\n tabIndex,\n } = this.options;\n\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.openNodeInternal.bind(this);\n const refreshElements = this.refreshElements.bind(this);\n const refreshHitAreas = this.refreshHitAreas.bind(this);\n const selectNode = this.selectNode.bind(this);\n const $treeElement = this.element;\n const treeElement = this.element.get(0) as HTMLElement;\n const triggerEvent = this.triggerEvent.bind(this);\n\n const selectNodeHandler = new SelectNodeHandler({\n getNodeById,\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 getMouseDelay = () => this.options.startDndDelay ?? 0;\n\n const dataLoader = new DataLoader({\n dataFilter,\n loadData,\n onLoadFailed,\n onLoading,\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,\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 getNodeElement,\n getNodeElementForNode,\n getScrollLeft,\n getTree,\n onCanMove,\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 closedIcon,\n dragAndDrop,\n $element: $treeElement,\n getTree,\n isNodeSelected,\n onCreateLi,\n openedIcon,\n rtl,\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 element: treeElement,\n getMouseDelay,\n getNode,\n onClickButton: this.toggle.bind(this),\n onClickTitle: this.doSelectNode.bind(this),\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\n private createFolderElement(node: Node) {\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.element;\n const triggerEvent = this.triggerEvent.bind(this);\n\n return new FolderElement({\n closedIconElement,\n getScrollLeft,\n node,\n openedIconElement,\n tabIndex,\n $treeElement,\n triggerEvent,\n });\n }\n\n private createNodeElement(node: Node) {\n const getScrollLeft = this.scrollHandler.getScrollLeft.bind(\n this.scrollHandler,\n );\n const tabIndex = this.options.tabIndex;\n const $treeElement = this.element;\n\n return new NodeElement({\n getScrollLeft,\n node,\n tabIndex,\n $treeElement,\n });\n }\n\n private openParents(node: Node) {\n const parent = node.parent;\n\n if (parent && parent.parent && !parent.is_open) {\n this.openNode(parent, false);\n }\n }\n}\n\nSimpleWidget.register(JqTreeWidget, \"tree\");\n","const version = \"1.8.0\";\n\nexport default version;\n"],"names":["Position","positionNames","before","Before","after","After","inside","Inside","none","None","getPositionName","position","name","Object","prototype","hasOwnProperty","call","DragElement","constructor","_ref","autoEscape","nodeName","offsetX","offsetY","treeElement","this","element","createElement","appendChild","move","pageX","pageY","style","left","top","remove","document","classList","add","textContent","innerHTML","getBoolString","value","getOffsetTop","getElementPosition","rect","getBoundingClientRect","x","window","scrollX","y","scrollY","generateHitAreasForGroup","hitAreas","positionsInGroup","bottom","positionCount","Math","min","length","areaHeight","round","areaTop","i","push","node","generateHitAreas","tree","currentNode","treeBottom","positions","generatePositions","lastTop","addPosition","area","iterateVisibleNodes","handleAfterOpenFolder","handleClosedFolder","handleFirstNode","handleNode","handleOpenFolder","isFirstNode","iterate","nextNode","mustIterateInside","is_open","hasChildren","offsetParent","childrenLength","children","forEach","_","child","nextChild","generateHitAreasFromPositions","previousTop","group","DragAndDropHandler","getNodeElement","getNodeElementForNode","getScrollLeft","getTree","onCanMove","onCanMoveTo","onDragMove","onDragStop","onIsMoveHandle","openNode","refreshElements","slide","triggerEvent","hoveredArea","isDragging","currentItem","mouseCapture","positionInfo","target","mustCaptureElement","jQuery","nodeElement","mouseStart","refresh","dragElement","mouseDrag","findHoveredArea","canMoveToArea","isFolder","stopOpenFolderTimer","mustOpenFolderTimer","startOpenFolderTimer","updateDropHint","removeDropHint","originalEvent","mouseStop","moveItem","clear","removeHover","removeHitAreas","getTreeDimensions","positionName","previousGhost","dimensions","right","low","high","mid","addDropHint","folder","openFolder","openFolderDelay","openFolderTimer","setTimeout","clearTimeout","movedNode","targetNode","previousParent","parent","doMove","moveNode","move_info","moved_node","target_node","previous_parent","do_move","original_event","isDefaultPrevented","treePosition","clientWidth","clientHeight","ElementsRenderer","buttonLeft","closedIcon","onCreateLi","dragAndDrop","$element","isNodeSelected","openedIcon","rtl","showEmptyFolder","tabIndex","openedIconElement","createButtonElement","closedIconElement","render","fromNode","renderFromNode","renderFromRoot","empty","createDomElements","$previousLi","li","createLi","getLevel","attachNodeData","isRootNode","level","ul","createUl","data","classString","role","className","setAttribute","isSelected","Boolean","isEmptyFolder","createFolderLi","createNodeLi","setTreeItemAriaAttributes","buttonClasses","getButtonClasses","folderClasses","getFolderClasses","iconElement","div","buttonLink","cloneNode","titleSpan","createTitleSpan","liClasses","join","classes","undefined","is_loading","createTextNode","nodeType","DataLoader","dataFilter","loadData","onLoadFailed","onLoading","loadFromUrl","urlInfo","parentNode","onFinished","getDomElement","addLoadingClass","notifyLoading","stopLoading","removeLoadingClass","submitRequest","parseData","jqXHR","isLoading","$el","urlInfoInput","handleSuccess","handleError","ajaxSettings","method","cache","dataType","success","error","url","toUpperCase","ajax","parsedData","JSON","parse","KeyHandler","closeNode","getSelectedNode","isFocusOnTree","keyboardSupport","selectNode","originalSelectNode","handleKeyDownHandler","handleKeyDown","bind","addEventListener","deinit","removeEventListener","moveDown","selectedNode","getNextVisibleNode","moveUp","getPreviousVisibleNode","moveRight","moveLeft","getParent","e","canHandleKeyboard","key","getPositionInfoFromMouseEvent","getPositionInfoFromTouch","touch","MouseHandler","getMouseDelay","getNode","onClickButton","onClickTitle","onMouseCapture","onMouseDrag","onMouseStart","onMouseStop","useContextMenu","handleClick","handleDblclick","mouseDown","passive","touchStart","handleContextmenu","isMouseStarted","mouseDelayTimer","isMouseDelayMet","mouseDownInfo","removeMouseMoveEventListeners","button","handleMouseDown","cancelable","preventDefault","handleMouseUp","handleStartMouse","mouseMove","touchMove","mouseUp","touchEnd","mouseDelay","startMouseDelayTimer","handleMouseMove","touches","clickTarget","getClickTarget","type","stopPropagation","click_event","closest","jqTreeElement","SaveStateHandler","addToSelection","getNodeById","getSelectedNodes","onGetStateFromStorage","onSetStateFromStorage","removeFromSelection","saveState","saveStateOption","state","stringify","getState","supportsLocalStorage","localStorage","setItem","getKeyName","getStateFromStorage","jsonData","loadFromStorage","parseState","open_nodes","getOpenNodeIds","openNodes","id","selected_node","getSelectedNodeIds","selectedNodeIds","setInitialState","mustLoadOnDemand","openInitialNodes","resetSelection","selectInitialNodes","setInitialStateOnDemand","cbFinished","doSetInitialStateOnDemand","getNodeIdToBeSelected","n","getItem","nodeIds","nodeId","load_on_demand","selectCount","nodeIdsParam","selectedNodes","loadingCount","newNodesIds","loadAndOpenNode","_supportsLocalStorage","testSupport","sessionStorage","removeItem","ContainerScrollParent","container","refreshHitAreas","checkHorizontalScrolling","newHorizontalScrollDirection","getNewHorizontalScrollDirection","horizontalScrollDirection","horizontalScrollTimeout","verticalScrollTimeout","scrollHorizontally","checkVerticalScrolling","newVerticalScrollDirection","getNewVerticalScrollDirection","verticalScrollDirection","scrollVertically","scrollLeft","scrollToY","scrollTop","stopScrolling","scrollParentTop","scrollParentBottom","scrollParentOffset","rightEdge","leftEdge","getScrollParentTop","getScrollParentBottom","distance","scrollBy","behavior","DocumentScrollParent","documentElement","treeTop","documentScrollHeight","documentScrollWidth","isNearLeftEdge","innerWidth","canScrollRight","getDocumentScrollWidth","canScrollDown","getDocumentScrollHeight","scrollHeight","scrollWidth","innerHeight","isOverflow","overflowValue","hasOverFlow","getComputedStyle","overflowX","overflowY","createScrollParent","parentElement","getParentWithOverflow","tagName","ScrollHandler","scrollParent","checkScrolling","getScrollParent","SelectNodeHandler","Set","selectedSingleNode","getSelectedNodesUnder","isParentOf","has","includeChildren","arguments","delete","register","widgetClass","widgetName","getDataKey","getWidgetData","el","dataKey","widget","SimpleWidget","createWidget","options","get","init","fn","argument1","functionName","destroy","removeData","destroyWidget","_len","args","Array","_key","callFunction","result","widgetFunction","apply","static","defaults","isNodeRecordWithChildren","Node","nodeData","isRoot","nodeClass","setData","idMapping","Map","o","loadFromData","removeChildren","childData","createNode","addChild","setParent","addChildAtPosition","index","splice","removeChild","doRemoveChild","getChildIndex","indexOf","callback","_iterate","getData","getDataFromNodes","nodes","map","tmpNode","k","v","getNodeByName","getNodeByCallback","getNodeByNameMustExist","addAfter","nodeInfo","childIndex","loadChildrenFromData","addBefore","addParent","newParent","originalParent","append","prepend","addNodeToIndex","set","removeNodeFromIndex","getPreviousSibling","previousIndex","getNextSibling","nextIndex","getNodesByProperty","filter","f","getNextNode","nextSibling","getPreviousNode","previousSibling","getLastChild","lastChild","initFromData","addChildren","childrenData","addNode","getNodeClass","BorderDropHint","querySelector","hint","width","max","offsetWidth","height","GhostDropHint","ghost","createGhostElement","moveAfter","moveBefore","moveInsideOpenFolder","moveInside","childElement","circleSpan","lineSpan","NodeElement","$treeElement","mustShowBorderDropHint","select","mustSetFocus","getTitleSpan","toString","focus","deselect","removeAttribute","blur","getUl","FolderElement","super","open","animationSpeed","getButton","icon","doOpen","slideDown","show","close","doClose","slideUp","hide","NODE_PARAM_IS_EMPTY","PARAM_IS_EMPTY","JqTreeWidget","autoOpen","dataUrl","onCanSelectNode","selectable","startDndDelay","toggle","slideParam","Error","optionsParam","doSelectNode","selectNodeHandler","toJson","doLoadData","loadDataFromUrl","param1","param2","param3","doLoadDataFromUrl","reload","getNodeByHtmlElement","inputElement","HTMLElement","parseParams","openNodeInternal","createFolderElement","dndHandler","addNodeAfter","newNodeInfo","existingNode","newNode","addNodeBefore","addParentNode","removeNode","appendNode","parentNodeParam","prependNode","updateNode","idIsChanged","isSelectedNodeInSubtree","subtree","positionIndex","saveStateHandler","openParents","scrollToNode","scrollHandler","setState","setOption","option","keyHandler","getVersion","doOpenNode","_node","_slide","_onFinished","loadFolderOnDemand","mustSelect","renderer","selectCurrentNode","createNodeElement","isInitialized","getRtlOption","getDefaultClosedIcon","connectHandlers","initData","off","mouseHandler","eventName","values","event","Event","trigger","getDataUrlInfo","setUrlInfoData","selectedNodeId","getUrlFromString","initTree","doInit","autoOpenNodes","maxLevel","getAutoOpenMaxLevel","isRestored","restoreState","parseInt","liElement","deselectCurrentNode","dataRtl","selectOptions","mustToggle","canSelect","previous_node","deselectedNode","deselected_node","deselectNodes","loadSubtree","tree_data","parent_node","selectedNodesUnderParent","urlInfoParam","dataLoader","containsElement","activeElement"],"mappings":"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"} \ No newline at end of file