jqtree 1.8.1 → 1.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bower.json +1 -1
- package/package.json +20 -19
- package/src/dragAndDropHandler/generateHitAreas.ts +56 -41
- package/src/nodeElement/ghostDropHint.ts +3 -37
- package/src/nodeElement/index.ts +1 -1
- package/src/saveStateHandler.ts +43 -59
- package/src/version.ts +1 -1
- package/tree.jquery.debug.js +77 -104
- package/tree.jquery.debug.js.map +1 -1
- package/tree.jquery.js +2 -2
- package/tree.jquery.js.map +1 -1
- package/.editorconfig +0 -12
- package/.eslintrc +0 -48
- package/.github/workflows/ci.yml +0 -68
- package/.github/workflows/codeql-analysis.yml +0 -32
- package/.github/workflows/size.yml +0 -24
- package/.github/workflows/static.yml +0 -57
- package/.prettier +0 -3
- package/config/.postcssrc +0 -6
- package/config/babel.config.json +0 -11
- package/config/babel.coverage.config.json +0 -4
- package/config/jest.config.js +0 -24
- package/config/jest.polyfills.js +0 -14
- package/config/playwright.config.js +0 -18
- package/config/production +0 -6
- package/config/rollup.config.mjs +0 -71
- package/css/jqtree.postcss +0 -193
- package/devserver/devserver.js +0 -7
- package/devserver/devserver_scroll.js +0 -8
- package/devserver/index.html +0 -22
- package/devserver/test_index.html +0 -22
- package/devserver/test_scroll.html +0 -28
- package/devserver/test_scroll_container.html +0 -39
- package/docs/.ruby-version +0 -1
- package/docs/Gemfile +0 -5
- package/docs/Gemfile.lock +0 -82
- package/docs/_config.yml +0 -126
- package/docs/_entries/events/index.md +0 -6
- package/docs/_entries/events/tree-click.md +0 -37
- package/docs/_entries/events/tree-close.md +0 -15
- package/docs/_entries/events/tree-contextmenu.md +0 -21
- package/docs/_entries/events/tree-dblclick.md +0 -19
- package/docs/_entries/events/tree-init.md +0 -15
- package/docs/_entries/events/tree-load-data.md +0 -15
- package/docs/_entries/events/tree-loading-data.md +0 -27
- package/docs/_entries/events/tree-move.md +0 -73
- package/docs/_entries/events/tree-open.md +0 -15
- package/docs/_entries/events/tree-refresh.md +0 -12
- package/docs/_entries/events/tree-select.md +0 -28
- package/docs/_entries/functions/addnodeafter.md +0 -20
- package/docs/_entries/functions/addnodebefore.md +0 -8
- package/docs/_entries/functions/addparentnode.md +0 -20
- package/docs/_entries/functions/appendnode.md +0 -50
- package/docs/_entries/functions/closenode.md +0 -23
- package/docs/_entries/functions/destroy.md +0 -12
- package/docs/_entries/functions/getnodebycallback.md +0 -24
- package/docs/_entries/functions/getnodebyhtmlelement.md +0 -29
- package/docs/_entries/functions/getnodebyid.md +0 -21
- package/docs/_entries/functions/getselectednode.md +0 -10
- package/docs/_entries/functions/getstate.md +0 -19
- package/docs/_entries/functions/gettree.md +0 -12
- package/docs/_entries/functions/index.md +0 -6
- package/docs/_entries/functions/is-node-selected.md +0 -11
- package/docs/_entries/functions/isdragging.md +0 -12
- package/docs/_entries/functions/loaddata.md +0 -46
- package/docs/_entries/functions/loaddatafromurl.md +0 -55
- package/docs/_entries/functions/movedown.md +0 -8
- package/docs/_entries/functions/movenode.md +0 -15
- package/docs/_entries/functions/moveup.md +0 -8
- package/docs/_entries/functions/opennode.md +0 -44
- package/docs/_entries/functions/prependnode.md +0 -21
- package/docs/_entries/functions/refresh.md +0 -12
- package/docs/_entries/functions/reload.md +0 -22
- package/docs/_entries/functions/removenode.md +0 -12
- package/docs/_entries/functions/scrolltonode.md +0 -13
- package/docs/_entries/functions/selectnode.md +0 -45
- package/docs/_entries/functions/setoption.md +0 -12
- package/docs/_entries/functions/setstate.md +0 -8
- package/docs/_entries/functions/toggle.md +0 -25
- package/docs/_entries/functions/tojson.md +0 -13
- package/docs/_entries/functions/updatenode.md +0 -50
- package/docs/_entries/general/changelog.md +0 -430
- package/docs/_entries/general/demo.html +0 -28
- package/docs/_entries/general/downloads.md +0 -9
- package/docs/_entries/general/examples.md +0 -8
- package/docs/_entries/general/features.md +0 -15
- package/docs/_entries/general/index.md +0 -7
- package/docs/_entries/general/introduction.md +0 -9
- package/docs/_entries/general/requirements.md +0 -6
- package/docs/_entries/general/tutorial.md +0 -71
- package/docs/_entries/general/usecases.md +0 -15
- package/docs/_entries/multiple_selection/add-to-selection.md +0 -21
- package/docs/_entries/multiple_selection/get-selected-nodes.md +0 -10
- package/docs/_entries/multiple_selection/index.md +0 -9
- package/docs/_entries/multiple_selection/remove-from-selection.md +0 -11
- package/docs/_entries/node/children.md +0 -12
- package/docs/_entries/node/getdata.md +0 -17
- package/docs/_entries/node/getlevel.md +0 -13
- package/docs/_entries/node/getnextnode.md +0 -12
- package/docs/_entries/node/getnextsibling.md +0 -10
- package/docs/_entries/node/getnextvisiblenode.md +0 -15
- package/docs/_entries/node/getpreviousnode.md +0 -12
- package/docs/_entries/node/getprevioussibling.md +0 -10
- package/docs/_entries/node/getpreviousvisiblenode.md +0 -15
- package/docs/_entries/node/index.md +0 -13
- package/docs/_entries/node/parent.md +0 -10
- package/docs/_entries/options/animationspeed.md +0 -7
- package/docs/_entries/options/autoescape.md +0 -6
- package/docs/_entries/options/autoopen.md +0 -28
- package/docs/_entries/options/buttonleft.md +0 -12
- package/docs/_entries/options/closedicon.md +0 -26
- package/docs/_entries/options/data-url.md +0 -45
- package/docs/_entries/options/data.md +0 -46
- package/docs/_entries/options/datafilter.md +0 -17
- package/docs/_entries/options/draganddrop.md +0 -18
- package/docs/_entries/options/index.md +0 -6
- package/docs/_entries/options/keyboardsupport.md +0 -14
- package/docs/_entries/options/oncanmove.md +0 -22
- package/docs/_entries/options/oncanmoveto.md +0 -22
- package/docs/_entries/options/oncanselectnode.md +0 -26
- package/docs/_entries/options/oncreateli.md +0 -22
- package/docs/_entries/options/ondragmove.md +0 -20
- package/docs/_entries/options/ondragstop.md +0 -20
- package/docs/_entries/options/onismovehandle.md +0 -17
- package/docs/_entries/options/onloadfailed.md +0 -15
- package/docs/_entries/options/onloading.md +0 -22
- package/docs/_entries/options/openedicon.md +0 -26
- package/docs/_entries/options/openfolderdelay.md +0 -15
- package/docs/_entries/options/rtl.md +0 -18
- package/docs/_entries/options/savestate.md +0 -39
- package/docs/_entries/options/selectable.md +0 -18
- package/docs/_entries/options/showemptyfolder.md +0 -26
- package/docs/_entries/options/slide.md +0 -12
- package/docs/_entries/options/start_dnd_delay.md +0 -13
- package/docs/_entries/options/tabindex.md +0 -14
- package/docs/_entries/options/usecontextmenu.md +0 -14
- package/docs/_examples/01_load_json_data.html +0 -45
- package/docs/_examples/02_load_json_data_from_server.html +0 -29
- package/docs/_examples/03_drag_and_drop.html +0 -42
- package/docs/_examples/04_save_state.html +0 -46
- package/docs/_examples/05_load_on_demand.html +0 -68
- package/docs/_examples/06_autoescape.html +0 -45
- package/docs/_examples/07_autoscroll.html +0 -42
- package/docs/_examples/08_multiple_select.html +0 -60
- package/docs/_examples/09_custom_html.html +0 -61
- package/docs/_examples/10_icon_buttons.html +0 -26
- package/docs/_examples/11_right-to-left.html +0 -25
- package/docs/_examples/12_button_on_right.html +0 -26
- package/docs/_examples/13_drag_outside.html +0 -48
- package/docs/_examples/14_filter.html +0 -111
- package/docs/_layouts/example.html +0 -7
- package/docs/_layouts/page.html +0 -26
- package/docs/documentation.css +0 -3
- package/docs/index.html +0 -65
- package/docs/package.json +0 -22
- package/docs/pnpm-lock.yaml +0 -892
- package/docs/postcss.config.js +0 -7
- package/docs/static/bower.json +0 -8
- package/docs/static/bower_components/fontawesome/css/all.min.css +0 -9
- package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.ttf +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.ttf +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.ttf +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.ttf +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.woff2 +0 -0
- package/docs/static/bower_components/jquery/dist/jquery.js +0 -10704
- package/docs/static/bower_components/jquery/dist/jquery.min.js +0 -2
- package/docs/static/bower_components/jquery-mockjax/dist/jquery.mockjax.js +0 -1061
- package/docs/static/documentation.js +0 -26
- package/docs/static/example.postcss +0 -68
- package/docs/static/example_data.js +0 -122
- package/docs/static/examples/autoescape.js +0 -17
- package/docs/static/examples/autoscroll.js +0 -6
- package/docs/static/examples/button-on-right.js +0 -13
- package/docs/static/examples/custom_html.js +0 -27
- package/docs/static/examples/drag-outside.js +0 -37
- package/docs/static/examples/drag_and_drop.js +0 -13
- package/docs/static/examples/filter.js +0 -63
- package/docs/static/examples/icon_buttons.js +0 -12
- package/docs/static/examples/load_json_data.js +0 -16
- package/docs/static/examples/load_json_data_from_server.js +0 -9
- package/docs/static/examples/load_on_demand.js +0 -19
- package/docs/static/examples/multiple_select.js +0 -23
- package/docs/static/examples/right-to-left.js +0 -11
- package/docs/static/examples/save_state.js +0 -11
- package/docs/static/monokai.css +0 -70
- package/docs/static/spinner.gif +0 -0
- package/docs/tailwind.config.js +0 -16
- package/sitemap.txt +0 -14
- package/src/playwright/.eslintrc +0 -5
- package/src/playwright/coverage.ts +0 -38
- package/src/playwright/playwright.test.ts +0 -401
- package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-darwin.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-linux.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-darwin.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-linux.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-darwin.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-linux.png +0 -0
- package/src/playwright/testUtils.ts +0 -153
- package/src/test/.eslintrc +0 -17
- package/src/test/global.d.ts +0 -1
- package/src/test/jqTree/accessibility.test.ts +0 -25
- package/src/test/jqTree/create.test.ts +0 -54
- package/src/test/jqTree/events.test.ts +0 -290
- package/src/test/jqTree/keyboard.test.ts +0 -247
- package/src/test/jqTree/loadOnDemand.test.ts +0 -198
- package/src/test/jqTree/methods.test.ts +0 -1491
- package/src/test/jqTree/mouse.test.ts +0 -82
- package/src/test/jqTree/options.test.ts +0 -595
- package/src/test/node.test.ts +0 -1396
- package/src/test/nodeUtils.test.ts +0 -21
- package/src/test/position.test.ts +0 -30
- package/src/test/support/exampleData.ts +0 -23
- package/src/test/support/jqTreeMatchers.ts +0 -68
- package/src/test/support/matchers.d.ts +0 -31
- package/src/test/support/setupTests.ts +0 -5
- package/src/test/support/testUtil.ts +0 -30
- package/src/test/support/treeStructure.ts +0 -39
- package/src/test/util.test.ts +0 -27
- package/tsconfig.json +0 -24
package/tree.jquery.js.map
CHANGED
|
@@ -1 +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<string, Position> = {\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<HTMLElement>;\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<HTMLElement>;\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<any>,\n handleError: JQuery.Ajax.ErrorCallback<any>,\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<HTMLElement>(\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<HTMLElement>(\".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<HTMLElement>(\".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<string, unknown>;\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<NodeId>;\n private selectedSingleNode: Node | null;\n\n constructor({ getNodeById }: SelectNodeHandlerParameters) {\n this.getNodeById = getNodeById;\n this.selectedNodes = new Set<NodeId>();\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<unknown> | 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<unknown>;\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<WidgetOptions> {\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<HTMLElement>;\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<NodeId, Node>;\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<NodeId, Node>();\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<string, unknown>[] => {\n return nodes.map((node) => {\n const tmpNode: Record<string, unknown> = {};\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<HTMLElement>;\n}\n\nclass NodeElement {\n public node: Node;\n public element: HTMLElement;\n private getScrollLeft: GetScrollLeft;\n private tabIndex?: number;\n private $treeElement: JQuery<HTMLElement>;\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<JQTreeOptions> {\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<HTMLElement>,\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<string, unknown>)[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<string, unknown>,\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 onCanMoveTo,\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 onCanMoveTo,\n onDragMove,\n onDragStop,\n onIsMoveHandle,\n openFolderDelay,\n openNode,\n refreshElements,\n slide,\n treeElement,\n triggerEvent,\n });\n\n const keyHandler = new KeyHandler({\n closeNode,\n getSelectedNode,\n isFocusOnTree,\n keyboardSupport,\n openNode,\n selectNode,\n });\n\n const renderer = new ElementsRenderer({\n autoEscape,\n buttonLeft,\n 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.1\";\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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"}
|
|
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<string, Position> = {\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\ninterface HitPosition {\n top: number;\n node: Node;\n position: Position;\n}\n\nexport const generateHitPositions = (\n tree: Node,\n currentNode: Node,\n): HitPosition[] => {\n const hitPositions: HitPosition[] = [];\n let lastTop = 0;\n\n const addHitPosition = (node: Node, position: number, top: number) => {\n hitPositions.push({\n top,\n node,\n position,\n });\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 addHitPosition(node, Position.None, lastTop);\n } else {\n addHitPosition(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 addHitPosition(node, Position.None, top);\n } else {\n addHitPosition(node, Position.Inside, top);\n\n // Cannot move before current item\n if (nextNode !== currentNode) {\n addHitPosition(node, Position.After, top);\n }\n }\n };\n\n const handleFirstNode = (node: Node) => {\n if (node !== currentNode) {\n addHitPosition(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 addHitPosition(node, Position.None, top);\n } else {\n addHitPosition(node, Position.Inside, top);\n }\n\n if (nextNode === currentNode || node === currentNode) {\n // Cannot move before or after current item\n addHitPosition(node, Position.None, top);\n } else {\n addHitPosition(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\n // Dnd over the current element is not possible: add a position with type None for the top and the bottom.\n const top = getOffsetTop(element);\n const height = element.clientHeight;\n addHitPosition(node, Position.None, top);\n\n if (height > 5) {\n // Subtract 5 pixels to allow more space for the next element.\n addHitPosition(node, Position.None, top + height - 5);\n }\n\n // Stop iterating\n return false;\n }\n\n // Cannot move before current item\n if (node.children[0] !== currentNode) {\n addHitPosition(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 hitPositions;\n};\n\nexport const generateHitAreasForGroup = (\n hitAreas: HitArea[],\n positionsInGroup: HitPosition[],\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 for (let i = 0; i < positionCount; i++) {\n const position = positionsInGroup[i] as HitPosition;\n\n if (position.position !== Position.None) {\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 }\n};\n\nexport const generateHitAreasFromPositions = (\n hitPositions: HitPosition[],\n treeBottom: number,\n): HitArea[] => {\n if (!hitPositions.length) {\n return [];\n }\n\n let previousTop = (hitPositions[0] as HitPosition).top;\n let group: HitPosition[] = [];\n const hitAreas: HitArea[] = [];\n\n for (const position of hitPositions) {\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 = (tree: Node, currentNode: Node, treeBottom: number) =>\n generateHitAreasFromPositions(\n generateHitPositions(tree, currentNode),\n 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<HTMLElement>;\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<HTMLElement>;\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<any>,\n handleError: JQuery.Ajax.ErrorCallback<any>,\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<HTMLElement>(\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<HTMLElement>(\".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<HTMLElement>(\".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 let loadingCount = 0;\n let nodeIds = state.open_nodes;\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(state.selected_node)) {\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 public getNodeIdToBeSelected(): NodeId | null {\n const state = this.getStateFromStorage();\n\n if (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<string, unknown>;\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 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<NodeId>;\n private selectedSingleNode: Node | null;\n\n constructor({ getNodeById }: SelectNodeHandlerParameters) {\n this.getNodeById = getNodeById;\n this.selectedNodes = new Set<NodeId>();\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<unknown> | 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<unknown>;\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<WidgetOptions> {\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<HTMLElement>;\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<NodeId, Node>;\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<NodeId, Node>();\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<string, unknown>[] => {\n return nodes.map((node) => {\n const tmpNode: Record<string, unknown> = {};\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 { DropHint } from \"../dragAndDropHandler/types\";\n\nclass GhostDropHint implements DropHint {\n private element: HTMLElement;\n private ghost: HTMLElement;\n\n constructor(element: HTMLElement) {\n this.element = element;\n this.ghost = this.createGhostElement();\n\n this.element.after(this.ghost);\n this.ghost.classList.add(\"jqtree-inside\");\n }\n\n public remove(): void {\n this.ghost.remove();\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<HTMLElement>;\n}\n\nclass NodeElement {\n public node: Node;\n public element: HTMLElement;\n private getScrollLeft: GetScrollLeft;\n private tabIndex?: number;\n private $treeElement: JQuery<HTMLElement>;\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.element);\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<JQTreeOptions> {\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<HTMLElement>,\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<string, unknown>)[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<string, unknown>,\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 onCanMoveTo,\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 onCanMoveTo,\n onDragMove,\n onDragStop,\n onIsMoveHandle,\n openFolderDelay,\n openNode,\n refreshElements,\n slide,\n treeElement,\n triggerEvent,\n });\n\n const keyHandler = new KeyHandler({\n closeNode,\n getSelectedNode,\n isFocusOnTree,\n keyboardSupport,\n openNode,\n selectNode,\n });\n\n const renderer = new ElementsRenderer({\n autoEscape,\n buttonLeft,\n 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.3\";\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","generateHitAreasFromPositions","hitPositions","previousTop","group","generateHitPositions","lastTop","addHitPosition","iterateVisibleNodes","handleAfterOpenFolder","handleClosedFolder","handleFirstNode","handleNode","handleOpenFolder","isFirstNode","iterate","nextNode","mustIterateInside","is_open","hasChildren","offsetParent","childrenLength","children","forEach","_","child","nextChild","height","clientHeight","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","area","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","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","loadingCount","nodeIds","newNodesIds","nodeId","load_on_demand","loadAndOpenNode","getNodeIdToBeSelected","n","getItem","selectCount","_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","selectedNodes","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","GhostDropHint","ghost","createGhostElement","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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"}
|