jqtree 1.6.2 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/.eslintrc +3 -12
  2. package/.github/workflows/ci.yml +57 -30
  3. package/.github/workflows/codeql-analysis.yml +9 -5
  4. package/.prettier +3 -0
  5. package/.tool-versions +1 -0
  6. package/README.md +12 -9
  7. package/bower.json +10 -3
  8. package/{.postcssrc → config/.postcssrc} +0 -0
  9. package/{babel.config.json → config/babel.config.json} +0 -0
  10. package/{babel.coverage.config.json → config/babel.coverage.config.json} +0 -0
  11. package/{jest-jsdom.config.js → config/jest.config.js} +8 -3
  12. package/config/playwright.config.js +18 -0
  13. package/config/production +4 -0
  14. package/{rollup.config.js → config/rollup.config.mjs} +3 -8
  15. package/{jqtree.postcss → css/jqtree.postcss} +0 -0
  16. package/devserver/index.html +1 -9
  17. package/docs/Gemfile +2 -0
  18. package/docs/Gemfile.lock +263 -0
  19. package/{_config.yml → docs/_config.yml} +8 -1
  20. package/{_entries → docs/_entries}/01_general.md +0 -0
  21. package/{_entries → docs/_entries}/02_introduction.md +0 -0
  22. package/{_entries → docs/_entries}/03_features.md +1 -1
  23. package/{_entries → docs/_entries}/04_demo.html +1 -7
  24. package/{_entries → docs/_entries}/05_requirements.md +0 -0
  25. package/{_entries → docs/_entries}/06_downloads.md +0 -0
  26. package/{_entries → docs/_entries}/07_tutorial.md +0 -0
  27. package/{_entries → docs/_entries}/08_examples.md +0 -0
  28. package/{_entries → docs/_entries}/09_usecases.md +0 -0
  29. package/{_entries → docs/_entries}/10_changelog.md +13 -0
  30. package/{_entries → docs/_entries}/11_options.md +0 -0
  31. package/{_entries → docs/_entries}/12_animationspeed.md +0 -0
  32. package/{_entries → docs/_entries}/13_autoescape.md +0 -0
  33. package/{_entries → docs/_entries}/14_autoopen.md +0 -0
  34. package/{_entries → docs/_entries}/15_buttonleft.md +0 -0
  35. package/{_entries → docs/_entries}/16_closedicon.md +0 -0
  36. package/{_entries → docs/_entries}/17_data.md +0 -0
  37. package/{_entries → docs/_entries}/18_datafilter.md +0 -0
  38. package/{_entries → docs/_entries}/19_data-url.md +0 -0
  39. package/{_entries → docs/_entries}/20_draganddrop.md +0 -0
  40. package/{_entries → docs/_entries}/21_keyboardsupport.md +0 -0
  41. package/{_entries → docs/_entries}/22_oncanmove.md +0 -0
  42. package/{_entries → docs/_entries}/23_oncanmoveto.md +2 -2
  43. package/{_entries → docs/_entries}/24_oncanselectnode.md +0 -0
  44. package/{_entries → docs/_entries}/25_oncreateli.md +2 -2
  45. package/{_entries → docs/_entries}/26_ondragmove.md +0 -0
  46. package/{_entries → docs/_entries}/27_ondragstop.md +0 -0
  47. package/{_entries → docs/_entries}/28_onismovehandle.md +0 -0
  48. package/{_entries → docs/_entries}/29_onloadfailed.md +0 -0
  49. package/{_entries → docs/_entries}/30_onloading.md +2 -2
  50. package/{_entries → docs/_entries}/31_openedicon.md +0 -0
  51. package/{_entries → docs/_entries}/32_openfolderdelay.md +2 -0
  52. package/{_entries → docs/_entries}/33_rtl.md +0 -0
  53. package/{_entries → docs/_entries}/34_savestate.md +0 -0
  54. package/{_entries → docs/_entries}/35_selectable.md +0 -0
  55. package/{_entries → docs/_entries}/36_showemptyfolder.md +0 -0
  56. package/{_entries → docs/_entries}/37_slide.md +0 -0
  57. package/{_entries → docs/_entries}/38_start_dnd_delay.md +0 -0
  58. package/{_entries → docs/_entries}/39_tabindex.md +0 -0
  59. package/{_entries → docs/_entries}/40_usecontextmenu.md +0 -0
  60. package/{_entries → docs/_entries}/41_functions.md +0 -0
  61. package/{_entries → docs/_entries}/42_addparentnode.md +1 -1
  62. package/{_entries → docs/_entries}/43_addnodeafter.md +1 -1
  63. package/{_entries → docs/_entries}/44_addnodebefore.md +1 -1
  64. package/{_entries → docs/_entries}/45_appendnode.md +5 -5
  65. package/{_entries → docs/_entries}/46_closenode.md +0 -0
  66. package/{_entries → docs/_entries}/47_destroy.md +0 -0
  67. package/{_entries → docs/_entries}/48_getnodebycallback.md +0 -0
  68. package/{_entries → docs/_entries}/49_getnodebyid.md +0 -0
  69. package/{_entries → docs/_entries}/50_getnodebyhtmlelement.md +2 -2
  70. package/{_entries → docs/_entries}/51_getselectednode.md +0 -0
  71. package/{_entries → docs/_entries}/52_getstate.md +0 -0
  72. package/{_entries → docs/_entries}/53_gettree.md +1 -1
  73. package/{_entries → docs/_entries}/54_isdragging.md +1 -1
  74. package/{_entries → docs/_entries}/55_loaddata.md +3 -3
  75. package/{_entries → docs/_entries}/56_loaddatafromurl.md +4 -4
  76. package/{_entries → docs/_entries}/57_movedown.md +0 -0
  77. package/{_entries → docs/_entries}/58_movenode.md +3 -3
  78. package/{_entries → docs/_entries}/59_moveup.md +0 -0
  79. package/{_entries → docs/_entries}/60_opennode.md +3 -3
  80. package/docs/_entries/61_prependnode.md +21 -0
  81. package/{_entries → docs/_entries}/62_refresh.md +0 -0
  82. package/{_entries → docs/_entries}/63_reload.md +2 -2
  83. package/{_entries → docs/_entries}/64_removenode.md +0 -0
  84. package/{_entries → docs/_entries}/65_selectnode.md +0 -0
  85. package/{_entries → docs/_entries}/66_scrolltonode.md +0 -0
  86. package/{_entries → docs/_entries}/67_setoption.md +0 -0
  87. package/{_entries → docs/_entries}/68_setstate.md +0 -0
  88. package/{_entries → docs/_entries}/69_toggle.md +0 -0
  89. package/{_entries → docs/_entries}/70_tojson.md +0 -0
  90. package/{_entries → docs/_entries}/71_updatenode.md +1 -1
  91. package/{_entries → docs/_entries}/72_events.md +0 -0
  92. package/{_entries → docs/_entries}/73_tree-click.md +0 -0
  93. package/{_entries → docs/_entries}/74_tree-close.md +0 -0
  94. package/{_entries → docs/_entries}/75_tree-contextmenu.md +0 -0
  95. package/{_entries → docs/_entries}/76_tree-dblclick.md +0 -0
  96. package/{_entries → docs/_entries}/77_tree-init.md +0 -0
  97. package/{_entries → docs/_entries}/78_tree-load-data.md +0 -0
  98. package/{_entries → docs/_entries}/79_tree-loading-data.md +0 -0
  99. package/{_entries → docs/_entries}/80_tree-move.md +0 -0
  100. package/{_entries → docs/_entries}/81_tree-refresh.md +0 -0
  101. package/{_entries → docs/_entries}/82_tree-open.md +0 -0
  102. package/{_entries → docs/_entries}/83_tree-select.md +0 -0
  103. package/{_entries → docs/_entries}/84_multiple-selection.md +0 -0
  104. package/{_entries → docs/_entries}/85_add-to-selection.md +0 -0
  105. package/{_entries → docs/_entries}/86_get-selected-nodes.md +0 -0
  106. package/{_entries → docs/_entries}/87_is-node-selected.md +1 -1
  107. package/{_entries → docs/_entries}/88_remove-from-selection.md +0 -0
  108. package/{_entries → docs/_entries}/89_node-functions.md +0 -0
  109. package/{_entries → docs/_entries}/90_children.md +0 -0
  110. package/{_entries → docs/_entries}/91_getdata.md +2 -2
  111. package/{_entries → docs/_entries}/92_getlevel.md +0 -0
  112. package/docs/_entries/93_getnextnode.md +15 -0
  113. package/{_entries → docs/_entries}/94_getnextsibling.md +0 -0
  114. package/{_entries/95_getpreviousnode.md → docs/_entries/95_getnextvisiblenode.md} +1 -1
  115. package/docs/_entries/96_getpreviousnode.md +0 -0
  116. package/{_entries/96_getprevioussibling.md → docs/_entries/97_getprevioussibling.md} +0 -0
  117. package/docs/_entries/98_getpreviousvisiblenode.md +14 -0
  118. package/{_entries/97_parent.md → docs/_entries/99_parent.md} +1 -1
  119. package/{_entries → docs/_entries}/insert.py +0 -0
  120. package/{_entries → docs/_entries}/renumber.py +0 -0
  121. package/{_examples → docs/_examples}/01_load_json_data.html +3 -5
  122. package/{_examples → docs/_examples}/02_load_json_data_from_server.html +3 -5
  123. package/{_examples → docs/_examples}/03_drag_and_drop.html +3 -5
  124. package/{_examples → docs/_examples}/04_save_state.html +3 -5
  125. package/{_examples → docs/_examples}/05_load_on_demand.html +3 -5
  126. package/{_examples → docs/_examples}/06_autoescape.html +3 -5
  127. package/{_examples → docs/_examples}/07_autoscroll.html +3 -5
  128. package/{_examples → docs/_examples}/08_multiple_select.html +3 -5
  129. package/{_examples → docs/_examples}/09_custom_html.html +3 -5
  130. package/{_examples → docs/_examples}/10_icon_buttons.html +3 -5
  131. package/{_examples → docs/_examples}/11_right-to-left.html +3 -5
  132. package/{_examples → docs/_examples}/12_button_on_right.html +3 -5
  133. package/docs/_examples/13_drag_outside.html +48 -0
  134. package/{_examples → docs/_examples}/14_filter.html +7 -9
  135. package/docs/_layouts/example.html +7 -0
  136. package/{_layouts/base.html → docs/_layouts/page.html} +4 -11
  137. package/docs/documentation.css +3 -0
  138. package/docs/index.html +65 -0
  139. package/docs/jqtree.css +189 -0
  140. package/docs/package.json +22 -0
  141. package/docs/pnpm-lock.yaml +798 -0
  142. package/docs/postcss.config.js +7 -0
  143. package/{static → docs/static}/bower.json +1 -2
  144. package/{static → docs/static}/bower_components/fontawesome/css/all.min.css +0 -0
  145. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.eot +0 -0
  146. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.svg +0 -0
  147. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  148. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.woff +0 -0
  149. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  150. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.eot +0 -0
  151. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.svg +0 -0
  152. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  153. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.woff +0 -0
  154. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  155. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.eot +0 -0
  156. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.svg +0 -0
  157. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  158. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.woff +0 -0
  159. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  160. package/{static → docs/static}/bower_components/jquery/dist/jquery.js +209 -97
  161. package/docs/static/bower_components/jquery/dist/jquery.min.js +2 -0
  162. package/{static → docs/static}/bower_components/jquery-mockjax/dist/jquery.mockjax.js +0 -0
  163. package/docs/static/documentation.css +1453 -0
  164. package/docs/static/documentation.js +26 -0
  165. package/{static → docs/static}/example.css +5 -38
  166. package/{static → docs/static}/example.postcss +5 -35
  167. package/{static → docs/static}/example_data.js +0 -0
  168. package/{static → docs/static}/examples/autoescape.js +0 -0
  169. package/{static → docs/static}/examples/autoscroll.js +0 -0
  170. package/{static → docs/static}/examples/button-on-right.js +0 -0
  171. package/{static → docs/static}/examples/custom_html.js +5 -9
  172. package/{static → docs/static}/examples/drag-outside.js +0 -0
  173. package/{static → docs/static}/examples/drag_and_drop.js +0 -0
  174. package/{static → docs/static}/examples/filter.js +2 -2
  175. package/{static → docs/static}/examples/icon_buttons.js +0 -0
  176. package/{static → docs/static}/examples/load_json_data.js +0 -0
  177. package/{static → docs/static}/examples/load_json_data_from_server.js +0 -0
  178. package/{static → docs/static}/examples/load_on_demand.js +0 -0
  179. package/{static → docs/static}/examples/multiple_select.js +0 -0
  180. package/{static → docs/static}/examples/right-to-left.js +0 -0
  181. package/{static → docs/static}/examples/save_state.js +0 -0
  182. package/{static → docs/static}/monokai.css +0 -0
  183. package/{static → docs/static}/spinner.gif +0 -0
  184. package/docs/tailwind.config.js +16 -0
  185. package/docs/tree.jquery.js +21 -0
  186. package/lib/dataLoader.js +5 -31
  187. package/lib/dragAndDropHandler.js +26 -135
  188. package/lib/elementsRenderer.js +29 -59
  189. package/lib/keyHandler.js +8 -32
  190. package/lib/mouse.widget.js +16 -77
  191. package/lib/node.js +60 -125
  192. package/lib/nodeElement.js +8 -75
  193. package/lib/playwright/coverage.js +101 -0
  194. package/lib/playwright/playwright.test.js +212 -182
  195. package/lib/playwright/testUtils.js +201 -0
  196. package/lib/saveStateHandler.js +12 -61
  197. package/lib/scrollHandler.js +17 -74
  198. package/lib/selectNodeHandler.js +5 -24
  199. package/lib/simple.widget.js +18 -53
  200. package/lib/test/jqTree/create.test.js +0 -4
  201. package/lib/test/jqTree/events.test.js +10 -16
  202. package/lib/test/jqTree/keyboard.test.js +0 -6
  203. package/lib/test/jqTree/loadOnDemand.test.js +107 -139
  204. package/lib/test/jqTree/methods.test.js +136 -159
  205. package/lib/test/jqTree/options.test.js +53 -63
  206. package/lib/test/node.test.js +127 -72
  207. package/lib/test/nodeUtil.test.js +0 -1
  208. package/lib/test/support/jqTreeMatchers.js +4 -9
  209. package/lib/test/support/setupTests.js +0 -4
  210. package/lib/test/support/testUtil.js +2 -11
  211. package/lib/test/support/treeStructure.js +0 -6
  212. package/lib/test/util.test.js +0 -1
  213. package/lib/tree.jquery.js +32 -243
  214. package/lib/util.js +0 -6
  215. package/lib/version.js +1 -1
  216. package/package.json +54 -54
  217. package/src/dragAndDropHandler.ts +8 -4
  218. package/src/jqtreeOptions.ts +1 -1
  219. package/src/keyHandler.ts +3 -3
  220. package/src/node.ts +43 -12
  221. package/src/playwright/.eslintrc +2 -2
  222. package/src/playwright/coverage.ts +41 -0
  223. package/src/playwright/playwright.test.ts +50 -52
  224. package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-darwin.png +0 -0
  225. package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-linux.png +0 -0
  226. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-darwin.png +0 -0
  227. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-linux.png +0 -0
  228. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-darwin.png +0 -0
  229. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-linux.png +0 -0
  230. package/src/playwright/testUtils.ts +122 -0
  231. package/src/test/.eslintrc +15 -3
  232. package/src/test/jqTree/events.test.ts +10 -9
  233. package/src/test/jqTree/loadOnDemand.test.ts +10 -10
  234. package/src/test/jqTree/methods.test.ts +37 -45
  235. package/src/test/jqTree/options.test.ts +26 -28
  236. package/src/test/node.test.ts +146 -54
  237. package/src/tree.jquery.d.ts +1 -1
  238. package/src/tree.jquery.ts +6 -5
  239. package/src/version.ts +1 -1
  240. package/tree.jquery.debug.js +217 -867
  241. package/tree.jquery.debug.js.map +1 -1
  242. package/tree.jquery.js +3 -3
  243. package/tree.jquery.js.map +1 -1
  244. package/_entries/61_prependnode.md +0 -21
  245. package/_entries/93_getnextnode.md +0 -12
  246. package/_examples/13_drag_outside.html +0 -26
  247. package/_layouts/frontpage.html +0 -20
  248. package/_layouts/page.html +0 -7
  249. package/index.html +0 -48
  250. package/jest-browser.config.js +0 -15
  251. package/jest-playwright.config.js +0 -21
  252. package/jest.config.js +0 -8
  253. package/lib/playwright/testUtil.js +0 -459
  254. package/lib/playwright/visualRegression.js +0 -193
  255. package/production +0 -5
  256. package/src/playwright/screenshots/displays_a_tree_Desktop.png +0 -0
  257. package/src/playwright/screenshots/displays_a_tree_iPhone 6.png +0 -0
  258. package/src/playwright/screenshots/moves_a_node_Desktop.png +0 -0
  259. package/src/playwright/screenshots/moves_a_node_iPhone 6.png +0 -0
  260. package/src/playwright/screenshots/opens_a_node_Desktop.png +0 -0
  261. package/src/playwright/screenshots/opens_a_node_iPhone 6.png +0 -0
  262. package/src/playwright/screenshots/selects_a_node_Desktop.png +0 -0
  263. package/src/playwright/screenshots/selects_a_node_iPhone 6.png +0 -0
  264. package/src/playwright/testUtil.ts +0 -170
  265. package/src/playwright/visualRegression.ts +0 -88
  266. package/static/bower_components/bootstrap/dist/css/bootstrap-theme.min.css +0 -6
  267. package/static/bower_components/bootstrap/dist/css/bootstrap.min.css +0 -6
  268. package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  269. package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg +0 -288
  270. package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  271. package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  272. package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
  273. package/static/bower_components/bootstrap/dist/js/bootstrap.min.js +0 -6
  274. package/static/bower_components/jquery/dist/jquery.min.js +0 -2
  275. package/static/documentation.css +0 -171
  276. package/static/documentation.js +0 -48
@@ -1 +1 @@
1
- {"version":3,"file":"tree.jquery.js","sources":["src/version.ts","src/node.ts","src/dragAndDropHandler.ts","src/util.ts","src/elementsRenderer.ts","src/dataLoader.ts","src/keyHandler.ts","src/simple.widget.ts","src/mouse.widget.ts","src/saveStateHandler.ts","src/scrollHandler.ts","src/selectNodeHandler.ts","src/nodeElement.ts","src/tree.jquery.ts"],"sourcesContent":["const version = \"1.6.2\";\n\nexport default version;\n","interface NodeRecordWithChildren extends NodeRecord {\n children: NodeData[];\n}\n\nexport 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\ntype IterateCallback = (node: Node, level: number) => boolean;\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\nconst isNodeRecordWithChildren = (\n data: NodeData\n): data is NodeRecordWithChildren =>\n typeof data === \"object\" &&\n \"children\" in data &&\n data[\"children\"] instanceof Array;\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(o: NodeData | null = null, isRoot = false, nodeClass = Node) {\n this.name = \"\";\n this.isEmptyFolder = false;\n this.load_on_demand = false;\n\n this.setData(o);\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 o of data) {\n const node = this.createNode(o);\n this.addChild(node);\n\n if (isNodeRecordWithChildren(o)) {\n if (o.children.length === 0) {\n node.isEmptyFolder = true;\n } else {\n node.loadFromData(o.children);\n }\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 if (\n isNodeRecordWithChildren(nodeInfo) &&\n nodeInfo.children.length\n ) {\n node.loadFromData(nodeInfo.children);\n }\n\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 if (\n isNodeRecordWithChildren(nodeInfo) &&\n nodeInfo.children.length\n ) {\n node.loadFromData(nodeInfo.children);\n }\n\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 if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {\n node.loadFromData(nodeInfo.children);\n }\n\n return node;\n }\n\n public prepend(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChildAtPosition(node, 0);\n\n if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {\n node.loadFromData(nodeInfo.children);\n }\n\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];\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];\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() && this.is_open) {\n // First child\n return this.children[0];\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 if (previousSibling) {\n 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 } else {\n return this.getParent();\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 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","import { getPositionName, Node, Position } from \"./node\";\nimport { DropHint, HitArea, PositionInfo } from \"./types\";\nimport { NodeElement } from \"./nodeElement\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\ninterface Dimensions {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport class DragAndDropHandler {\n public hitAreas: HitArea[];\n public isDragging: boolean;\n public currentItem: NodeElement | null;\n public hoveredArea: HitArea | null;\n public positionInfo: PositionInfo | null;\n\n private treeWidget: JqTreeWidget;\n private dragElement: DragElement | null;\n private previousGhost: DropHint | null;\n private openFolderTimer: number | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n this.hoveredArea = null;\n this.hitAreas = [];\n this.isDragging = false;\n this.currentItem = null;\n this.positionInfo = null;\n }\n\n public mouseCapture(positionInfo: PositionInfo): boolean | null {\n const $element = jQuery(positionInfo.target);\n\n if (!this.mustCaptureElement($element)) {\n return null;\n }\n\n if (\n this.treeWidget.options.onIsMoveHandle &&\n !this.treeWidget.options.onIsMoveHandle($element)\n ) {\n return null;\n }\n\n let nodeElement = this.treeWidget._getNodeElement($element);\n\n if (nodeElement && this.treeWidget.options.onCanMove) {\n if (!this.treeWidget.options.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 (\n !this.currentItem ||\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return false;\n }\n\n this.refresh();\n\n const offset = jQuery(positionInfo.target).offset();\n const left = offset ? offset.left : 0;\n const top = offset ? offset.top : 0;\n\n const node = this.currentItem.node;\n\n this.dragElement = new DragElement(\n node.name,\n positionInfo.pageX - left,\n positionInfo.pageY - top,\n this.treeWidget.element,\n this.treeWidget.options.autoEscape ?? true\n );\n\n this.isDragging = true;\n this.positionInfo = positionInfo;\n this.currentItem.$element.addClass(\"jqtree-moving\");\n return true;\n }\n\n public mouseDrag(positionInfo: PositionInfo): boolean {\n if (\n !this.currentItem ||\n !this.dragElement ||\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return false;\n }\n\n this.dragElement.move(positionInfo.pageX, positionInfo.pageY);\n this.positionInfo = positionInfo;\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.treeWidget.options.onDragMove) {\n this.treeWidget.options.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.removeClass(\"jqtree-moving\");\n this.currentItem = null;\n }\n\n this.isDragging = false;\n this.positionInfo = null;\n\n if (!this.hoveredArea && currentItem) {\n if (this.treeWidget.options.onDragStop) {\n this.treeWidget.options.onDragStop(\n currentItem.node,\n positionInfo.originalEvent\n );\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.treeWidget._getNodeElementForNode(\n this.currentItem.node\n );\n\n if (this.isDragging) {\n this.currentItem.$element.addClass(\"jqtree-moving\");\n }\n }\n }\n\n private generateHitAreas(): void {\n if (!this.currentItem) {\n this.hitAreas = [];\n } else {\n const hitAreasGenerator = new HitAreasGenerator(\n this.treeWidget.tree,\n this.currentItem.node,\n this.getTreeDimensions().bottom\n );\n this.hitAreas = hitAreasGenerator.generate();\n }\n }\n\n private mustCaptureElement($element: JQuery<HTMLElement>): boolean {\n return !$element.is(\"input,select,textarea\");\n }\n\n private canMoveToArea(area: HitArea): boolean {\n if (!this.treeWidget.options.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.treeWidget.options.onCanMoveTo(\n this.currentItem.node,\n area.node,\n positionName\n );\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 (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.treeWidget._getNodeElementForNode(\n this.hoveredArea.node\n );\n this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);\n }\n\n private startOpenFolderTimer(folder: Node): void {\n const openFolder = (): void => {\n this.treeWidget._openNode(\n folder,\n this.treeWidget.options.slide,\n () => {\n this.refresh();\n this.updateDropHint();\n }\n );\n };\n\n this.stopOpenFolderTimer();\n\n this.openFolderTimer = window.setTimeout(\n openFolder,\n this.treeWidget.options.openFolderDelay\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 this.treeWidget.tree.moveNode(movedNode, targetNode, position);\n this.treeWidget.element.empty();\n this.treeWidget._refreshElements(null);\n };\n\n const event = this.treeWidget._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 offset = this.treeWidget.element.offset();\n\n if (!offset) {\n return { left: 0, top: 0, right: 0, bottom: 0 };\n } else {\n const el = this.treeWidget.element;\n const width = el.width() || 0;\n const height = el.height() || 0;\n const left = offset.left + this.treeWidget._getScrollLeft();\n\n return {\n left,\n top: offset.top,\n right: left + width,\n bottom: offset.top + height + 16,\n };\n }\n }\n}\n\nabstract class VisibleNodeIterator {\n private tree: Node;\n\n constructor(tree: Node) {\n this.tree = tree;\n }\n\n protected iterate(): void {\n let isFirstNode = true;\n\n const _iterateNode = (node: Node, nextNode: Node | null): void => {\n let mustIterateInside =\n (node.is_open || !node.element) && node.hasChildren();\n\n let $element: JQuery<HTMLElement> | null = null;\n\n if (node.element) {\n $element = jQuery(node.element);\n\n if (!$element.is(\":visible\")) {\n return;\n }\n\n if (isFirstNode) {\n this.handleFirstNode(node);\n isFirstNode = false;\n }\n\n if (!node.hasChildren()) {\n this.handleNode(node, nextNode, $element);\n } else if (node.is_open) {\n if (!this.handleOpenFolder(node, $element)) {\n mustIterateInside = false;\n }\n } else {\n this.handleClosedFolder(node, nextNode, $element);\n }\n }\n\n if (mustIterateInside) {\n const childrenLength = node.children.length;\n node.children.forEach((_, i) => {\n if (i === childrenLength - 1) {\n _iterateNode(node.children[i], null);\n } else {\n _iterateNode(node.children[i], node.children[i + 1]);\n }\n });\n\n if (node.is_open && $element) {\n this.handleAfterOpenFolder(node, nextNode);\n }\n }\n };\n\n _iterateNode(this.tree, null);\n }\n\n protected abstract handleNode(\n node: Node,\n nextNode: Node | null,\n $element: JQuery\n ): void;\n\n /*\n override\n return\n - true: continue iterating\n - false: stop iterating\n */\n protected abstract handleOpenFolder(node: Node, $element: JQuery): boolean;\n\n protected abstract handleClosedFolder(\n node: Node,\n nextNode: Node | null,\n $element: JQuery\n ): void;\n\n protected abstract handleAfterOpenFolder(\n node: Node,\n nextNode: Node | null\n ): void;\n\n protected abstract handleFirstNode(node: Node): void;\n}\n\nexport class HitAreasGenerator extends VisibleNodeIterator {\n private currentNode: Node;\n private treeBottom: number;\n private positions: HitArea[];\n private lastTop: number;\n\n constructor(tree: Node, currentNode: Node, treeBottom: number) {\n super(tree);\n\n this.currentNode = currentNode;\n this.treeBottom = treeBottom;\n }\n\n public generate(): HitArea[] {\n this.positions = [];\n this.lastTop = 0;\n\n this.iterate();\n\n return this.generateHitAreas(this.positions);\n }\n\n protected generateHitAreas(positions: HitArea[]): HitArea[] {\n let previousTop = -1;\n let group = [];\n const hitAreas: HitArea[] = [];\n\n for (const position of positions) {\n if (position.top !== previousTop && group.length) {\n if (group.length) {\n this.generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n position.top\n );\n }\n\n previousTop = position.top;\n group = [];\n }\n\n group.push(position);\n }\n\n this.generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n this.treeBottom\n );\n\n return hitAreas;\n }\n\n protected handleOpenFolder(node: Node, $element: JQuery): boolean {\n if (node === this.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] !== this.currentNode) {\n this.addPosition(node, Position.Inside, this.getTop($element));\n }\n\n // Continue iterating\n return true;\n }\n\n protected handleClosedFolder(\n node: Node,\n nextNode: Node,\n $element: JQuery\n ): void {\n const top = this.getTop($element);\n\n if (node === this.currentNode) {\n // Cannot move after current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.Inside, top);\n\n // Cannot move before current item\n if (nextNode !== this.currentNode) {\n this.addPosition(node, Position.After, top);\n }\n }\n }\n\n protected handleFirstNode(node: Node): void {\n if (node !== this.currentNode) {\n this.addPosition(\n node,\n Position.Before,\n this.getTop(jQuery(node.element))\n );\n }\n }\n\n protected handleAfterOpenFolder(node: Node, nextNode: Node): void {\n if (node === this.currentNode || nextNode === this.currentNode) {\n // Cannot move before or after current item\n this.addPosition(node, Position.None, this.lastTop);\n } else {\n this.addPosition(node, Position.After, this.lastTop);\n }\n }\n\n protected handleNode(node: Node, nextNode: Node, $element: JQuery): void {\n const top = this.getTop($element);\n\n if (node === this.currentNode) {\n // Cannot move inside current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.Inside, top);\n }\n\n if (nextNode === this.currentNode || node === this.currentNode) {\n // Cannot move before or after current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.After, top);\n }\n }\n\n private getTop($element: JQuery<HTMLElement>): number {\n const offset = $element.offset();\n\n return offset ? offset.top : 0;\n }\n\n private addPosition(node: Node, position: number, top: number): void {\n const area = {\n top,\n bottom: 0,\n node,\n position,\n };\n\n this.positions.push(area);\n this.lastTop = top;\n }\n\n private generateHitAreasForGroup(\n hitAreas: HitArea[],\n positionsInGroup: HitArea[],\n top: number,\n bottom: number\n ): void {\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 hitAreas.push({\n top: areaTop,\n bottom: areaTop + areaHeight,\n node: position.node,\n position: position.position,\n });\n\n areaTop += areaHeight;\n i += 1;\n }\n }\n}\n\nclass DragElement {\n private offsetX: number;\n private offsetY: number;\n private $element: JQuery;\n\n constructor(\n nodeName: string,\n offsetX: number,\n offsetY: number,\n $tree: JQuery,\n autoEscape: boolean\n ) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n this.$element = jQuery(\"<span>\").addClass(\n \"jqtree-title jqtree-dragging\"\n );\n\n if (autoEscape) {\n this.$element.text(nodeName);\n } else {\n this.$element.html(nodeName);\n }\n\n this.$element.css(\"position\", \"absolute\");\n $tree.append(this.$element);\n }\n\n public move(pageX: number, pageY: number): void {\n this.$element.offset({\n left: pageX - this.offsetX,\n top: pageY - this.offsetY,\n });\n }\n\n public remove(): void {\n this.$element.remove();\n }\n}\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","import { getBoolString } from \"./util\";\nimport { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\ntype IconElement = Text | Element;\n\nexport default class ElementsRenderer {\n public openedIconElement: IconElement;\n public closedIconElement: IconElement;\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n this.openedIconElement = this.createButtonElement(\n treeWidget.options.openedIcon || \"+\"\n );\n this.closedIconElement = this.createButtonElement(\n treeWidget.options.closedIcon || \"-\"\n );\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 const $element = this.treeWidget.element;\n $element.empty();\n\n this.createDomElements(\n $element[0],\n this.treeWidget.tree.children,\n true,\n 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.treeWidget.options.rtl) {\n classString += \" jqtree-rtl\";\n }\n }\n\n if (this.treeWidget.options.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(\n this.treeWidget.selectNodeHandler.isNodeSelected(node)\n );\n\n const mustShowFolder =\n node.isFolder() ||\n (node.isEmptyFolder && this.treeWidget.options.showEmptyFolder);\n\n const li = mustShowFolder\n ? this.createFolderLi(node, level, isSelected)\n : this.createNodeLi(node, level, isSelected);\n\n if (this.treeWidget.options.onCreateLi) {\n this.treeWidget.options.onCreateLi(node, jQuery(li), isSelected);\n }\n\n return li;\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\", \"presentation\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"presentation\");\n\n li.appendChild(div);\n\n // button link\n const buttonLink = document.createElement(\"a\");\n buttonLink.className = buttonClasses;\n\n buttonLink.appendChild(iconElement.cloneNode(true));\n\n buttonLink.setAttribute(\"role\", \"presentation\");\n buttonLink.setAttribute(\"aria-hidden\", \"true\");\n\n if (this.treeWidget.options.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n // title span\n div.appendChild(\n this.createTitleSpan(\n node.name,\n level,\n isSelected,\n node.is_open,\n true\n )\n );\n\n if (!this.treeWidget.options.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\", \"presentation\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"presentation\");\n\n li.appendChild(div);\n\n // title span\n div.appendChild(\n this.createTitleSpan(\n node.name,\n level,\n isSelected,\n node.is_open,\n false\n )\n );\n\n return li;\n }\n\n private createTitleSpan(\n nodeName: string,\n level: number,\n isSelected: boolean,\n isOpen: boolean,\n isFolder: boolean\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-${\n this.treeWidget.options.buttonLeft ? \"left\" : \"right\"\n }`;\n\n titleSpan.className = classes;\n\n titleSpan.setAttribute(\"role\", \"treeitem\");\n titleSpan.setAttribute(\"aria-level\", `${level}`);\n\n titleSpan.setAttribute(\"aria-selected\", getBoolString(isSelected));\n titleSpan.setAttribute(\"aria-expanded\", getBoolString(isOpen));\n\n if (isSelected) {\n const tabIndex = this.treeWidget.options.tabIndex;\n\n if (tabIndex !== undefined) {\n titleSpan.setAttribute(\"tabindex\", `${tabIndex}`);\n }\n }\n\n if (this.treeWidget.options.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.treeWidget.options.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(value: string | Element): IconElement {\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 {\n return jQuery(value)[0];\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport type HandleFinishedLoading = () => void;\n\nexport default class DataLoader {\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\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 $el = this.getDomElement(parentNode);\n this.addLoadingClass($el);\n this.notifyLoading(true, parentNode, $el);\n\n const stopLoading = (): void => {\n this.removeLoadingClass($el);\n this.notifyLoading(false, parentNode, $el);\n };\n\n const handleSuccess = (data: string | NodeData[]): void => {\n stopLoading();\n this.treeWidget.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.treeWidget.options.onLoadFailed) {\n this.treeWidget.options.onLoadFailed(jqXHR);\n }\n };\n\n this.submitRequest(urlInfo, handleSuccess, handleError);\n }\n\n private addLoadingClass($el: JQuery<HTMLElement>): void {\n if ($el) {\n $el.addClass(\"jqtree-loading\");\n }\n }\n\n private removeLoadingClass($el: JQuery<HTMLElement>): void {\n if ($el) {\n $el.removeClass(\"jqtree-loading\");\n }\n }\n\n private getDomElement(parentNode: Node | null): JQuery<HTMLElement> {\n if (parentNode) {\n return jQuery(parentNode.element);\n } else {\n return this.treeWidget.element;\n }\n }\n\n private notifyLoading(\n isLoading: boolean,\n node: Node | null,\n $el: JQuery\n ): void {\n if (this.treeWidget.options.onLoading) {\n this.treeWidget.options.onLoading(isLoading, node, $el);\n }\n\n this.treeWidget._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 { dataFilter } = this.treeWidget.options;\n\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 (dataFilter) {\n return dataFilter(parsedData);\n } else {\n return parsedData;\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport default class KeyHandler {\n private static LEFT = 37;\n private static UP = 38;\n private static RIGHT = 39;\n private static DOWN = 40;\n\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n if (treeWidget.options.keyboardSupport) {\n jQuery(document).on(\"keydown.jqtree\", this.handleKeyDown);\n }\n }\n\n public deinit(): void {\n jQuery(document).off(\"keydown.jqtree\");\n }\n\n public moveDown(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getNextNode());\n }\n\n public moveUp(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getPreviousNode());\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.getNextNode());\n } else {\n // Right expands a closed node\n this.treeWidget.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.treeWidget.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.treeWidget.selectNode(node);\n\n if (\n !this.treeWidget.scrollHandler.isScrolledIntoView(\n jQuery(node.element).find(\".jqtree-element\")\n )\n ) {\n this.treeWidget.scrollToNode(node);\n }\n\n return false;\n }\n }\n\n private handleKeyDown = (e: JQuery.Event): boolean => {\n if (!this.canHandleKeyboard()) {\n return true;\n }\n\n const selectedNode = this.treeWidget.getSelectedNode();\n if (!selectedNode) {\n return true;\n }\n\n const key = e.which;\n\n switch (key) {\n case KeyHandler.DOWN:\n return this.moveDown(selectedNode);\n\n case KeyHandler.UP:\n return this.moveUp(selectedNode);\n\n case KeyHandler.RIGHT:\n return this.moveRight(selectedNode);\n\n case KeyHandler.LEFT:\n return this.moveLeft(selectedNode);\n\n default:\n return true;\n }\n };\n\n private canHandleKeyboard(): boolean {\n return (\n (this.treeWidget.options.keyboardSupport || false) &&\n this.treeWidget.selectNodeHandler.isFocusOnTree()\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 }\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","/*\nThis widget does the same a the mouse widget in jqueryui.\n*/\nimport SimpleWidget from \"./simple.widget\";\nimport { PositionInfo } from \"./types\";\n\nconst getPositionInfoFromMouseEvent = (e: MouseEvent): PositionInfo => ({\n pageX: e.pageX,\n pageY: e.pageY,\n target: e.target as HTMLElement,\n originalEvent: e,\n});\n\nconst getPositionInfoFromTouch = (\n touch: Touch,\n e: TouchEvent\n): PositionInfo => ({\n pageX: touch.pageX,\n pageY: touch.pageY,\n target: touch.target as HTMLElement,\n originalEvent: e,\n});\n\nabstract class MouseWidget<WidgetOptions> extends SimpleWidget<WidgetOptions> {\n protected isMouseStarted: boolean;\n protected mouseDownInfo: PositionInfo | null;\n private mouseDelayTimer: number | null;\n private isMouseDelayMet: boolean;\n\n public init(): void {\n const element = this.$el.get(0);\n\n if (element) {\n element.addEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n element.addEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\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 const el = this.$el.get(0);\n\n if (el) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (el as any).removeEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (el as any).removeEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n }\n\n this.removeMouseMoveEventListeners();\n }\n\n protected abstract mouseCapture(positionInfo: PositionInfo): boolean | null;\n\n protected abstract mouseStart(positionInfo: PositionInfo): boolean;\n\n protected abstract mouseDrag(positionInfo: PositionInfo): void;\n\n protected abstract mouseStop(positionInfo: PositionInfo): void;\n\n protected abstract getMouseDelay(): number;\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.mouseCapture(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.mouseDrag(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 = this.mouseStart(this.mouseDownInfo) !== false;\n }\n\n if (this.isMouseStarted) {\n this.mouseDrag(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.mouseStop(positionInfo);\n }\n }\n\n private removeMouseMoveEventListeners() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"mouseup\", this.mouseUp, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\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.changedTouches[0];\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.changedTouches[0];\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.changedTouches[0];\n\n this.handleMouseUp(getPositionInfoFromTouch(touch, e));\n };\n}\n\nexport default MouseWidget;\n","import { isInt } from \"./util\";\nimport { JqTreeWidget } from \"./tree.jquery\";\nimport { Node } from \"./node\";\n\nexport interface SavedState {\n open_nodes: NodeId[];\n selected_node: NodeId[];\n}\n\nexport default class SaveStateHandler {\n private treeWidget: JqTreeWidget;\n private _supportsLocalStorage: boolean | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n }\n\n public saveState(): void {\n const state = JSON.stringify(this.getState());\n\n if (this.treeWidget.options.onSetStateFromStorage) {\n this.treeWidget.options.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.treeWidget.tree.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.treeWidget.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];\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.treeWidget.options.onGetStateFromStorage) {\n return this.treeWidget.options.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.treeWidget.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.treeWidget.getNodeById(nodeId);\n\n if (node) {\n selectCount += 1;\n\n this.treeWidget.selectNodeHandler.addToSelection(node);\n }\n }\n\n return selectCount !== 0;\n }\n\n private resetSelection(): void {\n const selectNodeHandler = this.treeWidget.selectNodeHandler;\n\n const selectedNodes = selectNodeHandler.getSelectedNodes();\n\n selectedNodes.forEach((node) => {\n selectNodeHandler.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.treeWidget.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.treeWidget._openNode(node, false, null);\n }\n }\n }\n }\n\n nodeIds = newNodesIds;\n\n if (this.selectInitialNodes(selectedNodes)) {\n this.treeWidget._refreshElements(null);\n }\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this.treeWidget._openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n openNodes();\n }\n\n private getKeyName(): string {\n if (typeof this.treeWidget.options.saveState === \"string\") {\n return this.treeWidget.options.saveState;\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 { JqTreeWidget } from \"./tree.jquery\";\nimport { HitArea, PositionInfo } from \"./types\";\n\nexport default class ScrollHandler {\n private treeWidget: JqTreeWidget;\n private previousTop: number;\n private isInitialized: boolean;\n private $scrollParent: JQuery | null;\n private scrollParentTop: number;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n this.previousTop = -1;\n this.isInitialized = false;\n }\n\n public checkScrolling(): void {\n this.ensureInit();\n this.checkVerticalScrolling();\n this.checkHorizontalScrolling();\n }\n\n public scrollToY(top: number): void {\n this.ensureInit();\n\n if (this.$scrollParent) {\n this.$scrollParent[0].scrollTop = top;\n } else {\n const offset = this.treeWidget.$el.offset();\n const treeTop = offset ? offset.top : 0;\n\n jQuery(document).scrollTop(top + treeTop);\n }\n }\n\n public isScrolledIntoView($element: JQuery): boolean {\n this.ensureInit();\n\n let elementBottom: number;\n let viewBottom: number;\n let elementTop: number;\n let viewTop: number;\n\n const elHeight = $element.height() || 0;\n\n if (this.$scrollParent) {\n viewTop = 0;\n viewBottom = this.$scrollParent.height() || 0;\n\n const offset = $element.offset();\n const originalTop = offset ? offset.top : 0;\n\n elementTop = originalTop - this.scrollParentTop;\n elementBottom = elementTop + elHeight;\n } else {\n viewTop = jQuery(window).scrollTop() || 0;\n\n const windowHeight = jQuery(window).height() || 0;\n viewBottom = viewTop + windowHeight;\n\n const offset = $element.offset();\n\n elementTop = offset ? offset.top : 0;\n elementBottom = elementTop + elHeight;\n }\n\n return elementBottom <= viewBottom && elementTop >= viewTop;\n }\n\n public getScrollLeft(): number {\n if (!this.$scrollParent) {\n return 0;\n } else {\n return this.$scrollParent.scrollLeft() || 0;\n }\n }\n\n private initScrollParent(): void {\n const getParentWithOverflow = (): JQuery | null => {\n const cssAttributes = [\"overflow\", \"overflow-y\"];\n\n const hasOverFlow = ($el: JQuery): boolean => {\n for (const attr of cssAttributes) {\n const overflowValue = $el.css(attr);\n if (\n overflowValue === \"auto\" ||\n overflowValue === \"scroll\"\n ) {\n return true;\n }\n }\n\n return false;\n };\n\n if (hasOverFlow(this.treeWidget.$el)) {\n return this.treeWidget.$el;\n }\n\n for (const el of this.treeWidget.$el.parents().get()) {\n const $el = jQuery(el);\n if (hasOverFlow($el)) {\n return $el;\n }\n }\n\n return null;\n };\n\n const setDocumentAsScrollParent = (): void => {\n this.scrollParentTop = 0;\n this.$scrollParent = null;\n };\n\n if (this.treeWidget.$el.css(\"position\") === \"fixed\") {\n setDocumentAsScrollParent();\n }\n\n const $scrollParent = getParentWithOverflow();\n\n if (\n $scrollParent &&\n $scrollParent.length &&\n $scrollParent[0].tagName !== \"HTML\"\n ) {\n this.$scrollParent = $scrollParent;\n\n const offset = this.$scrollParent.offset();\n this.scrollParentTop = offset ? offset.top : 0;\n } else {\n setDocumentAsScrollParent();\n }\n\n this.isInitialized = true;\n }\n\n private ensureInit(): void {\n if (!this.isInitialized) {\n this.initScrollParent();\n }\n }\n\n private handleVerticalScrollingWithScrollParent(area: HitArea): void {\n const scrollParent = this.$scrollParent && this.$scrollParent[0];\n\n if (!scrollParent) {\n return;\n }\n\n const distanceBottom =\n this.scrollParentTop + scrollParent.offsetHeight - area.bottom;\n\n if (distanceBottom < 20) {\n scrollParent.scrollTop += 20;\n this.treeWidget.refreshHitAreas();\n this.previousTop = -1;\n } else if (area.top - this.scrollParentTop < 20) {\n scrollParent.scrollTop -= 20;\n this.treeWidget.refreshHitAreas();\n this.previousTop = -1;\n }\n }\n\n private handleVerticalScrollingWithDocument(area: HitArea): void {\n const scrollTop = jQuery(document).scrollTop() || 0;\n const distanceTop = area.top - scrollTop;\n\n if (distanceTop < 20) {\n jQuery(document).scrollTop(scrollTop - 20);\n } else {\n const windowHeight = jQuery(window).height() || 0;\n\n if (windowHeight - (area.bottom - scrollTop) < 20) {\n jQuery(document).scrollTop(scrollTop + 20);\n }\n }\n }\n\n private checkVerticalScrolling(): void {\n const hoveredArea = this.treeWidget.dndHandler.hoveredArea;\n\n if (hoveredArea && hoveredArea.top !== this.previousTop) {\n this.previousTop = hoveredArea.top;\n\n if (this.$scrollParent) {\n this.handleVerticalScrollingWithScrollParent(hoveredArea);\n } else {\n this.handleVerticalScrollingWithDocument(hoveredArea);\n }\n }\n }\n\n private checkHorizontalScrolling(): void {\n const positionInfo = this.treeWidget.dndHandler.positionInfo;\n\n if (!positionInfo) {\n return;\n }\n\n if (this.$scrollParent) {\n this.handleHorizontalScrollingWithParent(positionInfo);\n } else {\n this.handleHorizontalScrollingWithDocument(positionInfo);\n }\n }\n\n private handleHorizontalScrollingWithParent(\n positionInfo: PositionInfo\n ): void {\n if (\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return;\n }\n\n const $scrollParent = this.$scrollParent;\n const scrollParentOffset = $scrollParent && $scrollParent.offset();\n\n if (!($scrollParent && scrollParentOffset)) {\n return;\n }\n\n const scrollParent = $scrollParent[0];\n\n const canScrollRight =\n scrollParent.scrollLeft + scrollParent.clientWidth <\n scrollParent.scrollWidth;\n const canScrollLeft = scrollParent.scrollLeft > 0;\n\n const rightEdge = scrollParentOffset.left + scrollParent.clientWidth;\n const leftEdge = scrollParentOffset.left;\n const isNearRightEdge = positionInfo.pageX > rightEdge - 20;\n const isNearLeftEdge = positionInfo.pageX < leftEdge + 20;\n\n if (isNearRightEdge && canScrollRight) {\n scrollParent.scrollLeft = Math.min(\n scrollParent.scrollLeft + 20,\n scrollParent.scrollWidth\n );\n } else if (isNearLeftEdge && canScrollLeft) {\n scrollParent.scrollLeft = Math.max(scrollParent.scrollLeft - 20, 0);\n }\n }\n\n private handleHorizontalScrollingWithDocument(\n positionInfo: PositionInfo\n ): void {\n if (\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return;\n }\n\n const $document = jQuery(document);\n\n const scrollLeft = $document.scrollLeft() || 0;\n const windowWidth = jQuery(window).width() || 0;\n\n const canScrollLeft = scrollLeft > 0;\n\n const isNearRightEdge = positionInfo.pageX > windowWidth - 20;\n const isNearLeftEdge = positionInfo.pageX - scrollLeft < 20;\n\n if (isNearRightEdge) {\n $document.scrollLeft(scrollLeft + 20);\n } else if (isNearLeftEdge && canScrollLeft) {\n $document.scrollLeft(Math.max(scrollLeft - 20, 0));\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport default class SelectNodeHandler {\n private treeWidget: JqTreeWidget;\n private selectedNodes: Set<NodeId>;\n private selectedSingleNode: Node | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\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];\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.treeWidget.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.treeWidget.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 public isFocusOnTree(): boolean {\n const activeElement = document.activeElement;\n\n return Boolean(\n activeElement &&\n activeElement.tagName === \"SPAN\" &&\n this.treeWidget._containsElement(activeElement as HTMLElement)\n );\n }\n}\n","import { Position, Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\nimport { DropHint } from \"./types\";\n\nexport type OnFinishOpenNode = (node: Node) => void;\n\nexport class NodeElement {\n public node: Node;\n public $element: JQuery<HTMLElement>;\n protected treeWidget: JqTreeWidget;\n\n constructor(node: Node, treeWidget: JqTreeWidget) {\n this.init(node, treeWidget);\n }\n\n public init(node: Node, treeWidget: JqTreeWidget): void {\n this.node = node;\n this.treeWidget = treeWidget;\n\n if (!node.element) {\n const element = this.treeWidget.element.get(0);\n\n if (element) {\n node.element = element;\n }\n }\n\n if (node.element) {\n this.$element = jQuery(node.element);\n }\n }\n\n public addDropHint(position: number): DropHint {\n if (this.mustShowBorderDropHint(position)) {\n return new BorderDropHint(\n this.$element,\n this.treeWidget._getScrollLeft()\n );\n } else {\n return new GhostDropHint(this.node, this.$element, position);\n }\n }\n\n public select(mustSetFocus: boolean): void {\n const $li = this.getLi();\n\n $li.addClass(\"jqtree-selected\");\n $li.attr(\"aria-selected\", \"true\");\n\n const $span = this.getSpan();\n $span.attr(\"tabindex\", this.treeWidget.options.tabIndex ?? null);\n\n if (mustSetFocus) {\n $span.trigger(\"focus\");\n }\n }\n\n public deselect(): void {\n const $li = this.getLi();\n\n $li.removeClass(\"jqtree-selected\");\n $li.attr(\"aria-selected\", \"false\");\n\n const $span = this.getSpan();\n $span.removeAttr(\"tabindex\");\n\n $span.blur();\n }\n\n protected getUl(): JQuery<HTMLElement> {\n return this.$element.children(\"ul:first\");\n }\n\n protected getSpan(): JQuery<HTMLElement> {\n return this.$element\n .children(\".jqtree-element\")\n .find(\"span.jqtree-title\");\n }\n\n protected getLi(): JQuery<HTMLElement> {\n return this.$element;\n }\n\n protected mustShowBorderDropHint(position: number): boolean {\n return position === Position.Inside;\n }\n}\n\nexport class FolderElement extends NodeElement {\n public open(\n onFinished: OnFinishOpenNode | null,\n slide = true,\n animationSpeed: JQuery.Duration | string = \"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.removeClass(\"jqtree-closed\");\n $button.html(\"\");\n\n const buttonEl = $button.get(0);\n\n if (buttonEl) {\n const icon =\n this.treeWidget.renderer.openedIconElement.cloneNode(true);\n\n buttonEl.appendChild(icon);\n }\n\n const doOpen = (): void => {\n const $li = this.getLi();\n $li.removeClass(\"jqtree-closed\");\n\n const $span = this.getSpan();\n $span.attr(\"aria-expanded\", \"true\");\n\n if (onFinished) {\n onFinished(this.node);\n }\n\n this.treeWidget._triggerEvent(\"tree.open\", {\n node: this.node,\n });\n };\n\n if (slide) {\n this.getUl().slideDown(animationSpeed, doOpen);\n } else {\n this.getUl().show();\n doOpen();\n }\n }\n\n public close(\n slide = true,\n animationSpeed: JQuery.Duration | string = \"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.addClass(\"jqtree-closed\");\n $button.html(\"\");\n\n const buttonEl = $button.get(0);\n\n if (buttonEl) {\n const icon =\n this.treeWidget.renderer.closedIconElement.cloneNode(true);\n\n buttonEl.appendChild(icon);\n }\n\n const doClose = (): void => {\n const $li = this.getLi();\n $li.addClass(\"jqtree-closed\");\n\n const $span = this.getSpan();\n $span.attr(\"aria-expanded\", \"false\");\n\n this.treeWidget._triggerEvent(\"tree.close\", {\n node: this.node,\n });\n };\n\n if (slide) {\n this.getUl().slideUp(animationSpeed, doClose);\n } else {\n this.getUl().hide();\n doClose();\n }\n }\n\n protected mustShowBorderDropHint(position: number): boolean {\n return !this.node.is_open && position === Position.Inside;\n }\n\n private getButton(): JQuery {\n return this.$element\n .children(\".jqtree-element\")\n .find(\"a.jqtree-toggler\");\n }\n}\n\nexport class BorderDropHint implements DropHint {\n private $hint: JQuery<Element>;\n\n constructor($element: JQuery<Element>, scrollLeft: number) {\n const $div = $element.children(\".jqtree-element\");\n\n const elWidth = $element.width() || 0;\n const width = Math.max(elWidth + scrollLeft - 4, 0);\n\n const elHeight = $div.outerHeight() || 0;\n const height = Math.max(elHeight - 4, 0);\n\n this.$hint = jQuery('<span class=\"jqtree-border\"></span>');\n $div.append(this.$hint);\n\n this.$hint.css({ width, height });\n }\n\n public remove(): void {\n this.$hint.remove();\n }\n}\n\nclass GhostDropHint implements DropHint {\n private $element: JQuery<Element>;\n private node: Node;\n private $ghost: JQuery;\n\n constructor(node: Node, $element: JQuery<Element>, position: number) {\n this.$element = $element;\n\n this.node = node;\n this.$ghost = jQuery(\n `<li class=\"jqtree_common jqtree-ghost\"><span class=\"jqtree_common jqtree-circle\"></span>\n <span class=\"jqtree_common jqtree-line\"></span></li>`\n );\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 public moveAfter(): void {\n this.$element.after(this.$ghost);\n }\n\n public moveBefore(): void {\n this.$element.before(this.$ghost);\n }\n\n public moveInsideOpenFolder(): void {\n const childElement = this.node.children[0].element;\n\n if (childElement) {\n jQuery(childElement).before(this.$ghost);\n }\n }\n\n public moveInside(): void {\n this.$element.after(this.$ghost);\n this.$ghost.addClass(\"jqtree-inside\");\n }\n}\n","import __version__ from \"./version\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport DataLoader, { HandleFinishedLoading } from \"./dataLoader\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseWidget from \"./mouse.widget\";\nimport { PositionInfo } from \"./types\";\nimport SaveStateHandler, { SavedState } from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport SimpleWidget from \"./simple.widget\";\nimport { Node, getPosition } from \"./node\";\nimport { isFunction } from \"./util\";\nimport { FolderElement, NodeElement, OnFinishOpenNode } from \"./nodeElement\";\nimport { JQTreeOptions } from \"./jqtreeOptions\";\n\ninterface ClickTarget {\n node: Node;\n type: \"button\" | \"label\";\n}\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 MouseWidget<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: \"&#x25bc;\",\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 public element: JQuery;\n public tree: Node;\n public dndHandler: DragAndDropHandler;\n public renderer: ElementsRenderer;\n public dataLoader: DataLoader;\n public scrollHandler: ScrollHandler;\n public selectNodeHandler: SelectNodeHandler;\n\n private isInitialized: boolean;\n private saveStateHandler: SaveStateHandler;\n private keyHandler: KeyHandler;\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 element: HTMLElement | JQuery<HTMLElement>\n ): Node | null {\n return this.getNode(jQuery(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 | null] => {\n let onFinished: OnFinishOpenNode | null;\n let slide: boolean | null;\n\n if (isFunction(param1)) {\n onFinished = param1 as OnFinishOpenNode | null;\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._openNode(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 new FolderElement(node, this).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\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 nodeOffset = jQuery(node.element).offset();\n const nodeTop = nodeOffset ? nodeOffset.top : 0;\n\n const treeOffset = this.$el.offset();\n const treeTop = treeOffset ? treeOffset.top : 0;\n\n const top = nodeTop - treeTop;\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 public _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 public _openNode(\n node: Node,\n slide = true,\n onFinished: OnFinishOpenNode | null\n ): void {\n const doOpenNode = (\n _node: Node,\n _slide: boolean,\n _onFinished: OnFinishOpenNode | null\n ): void => {\n const folderElement = new FolderElement(_node, this);\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, null);\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 public _refreshElements(fromNode: Node | null): void {\n const mustSetFocus = this.selectNodeHandler.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 public _getNodeElementForNode(node: Node): NodeElement {\n if (node.isFolder()) {\n return new FolderElement(node, this);\n } else {\n return new NodeElement(node, this);\n }\n }\n\n public _getNodeElement($element: JQuery<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 _containsElement(element: HTMLElement): boolean {\n const node = this.getNode(jQuery(element));\n\n return node != null && node.tree === this.tree;\n }\n\n public _getScrollLeft(): number {\n return this.scrollHandler.getScrollLeft();\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.renderer = new ElementsRenderer(this);\n this.dataLoader = new DataLoader(this);\n this.saveStateHandler = new SaveStateHandler(this);\n this.selectNodeHandler = new SelectNodeHandler(this);\n this.dndHandler = new DragAndDropHandler(this);\n this.scrollHandler = new ScrollHandler(this);\n this.keyHandler = new KeyHandler(this);\n\n this.initData();\n\n this.element.on(\"click\", this.handleClick);\n this.element.on(\"dblclick\", this.handleDblclick);\n\n if (this.options.useContextMenu) {\n this.element.on(\"contextmenu\", this.handleContextmenu);\n }\n }\n\n public deinit(): void {\n this.element.empty();\n this.element.off();\n\n this.keyHandler.deinit();\n\n this.tree = new Node({}, true);\n\n super.deinit();\n }\n\n protected 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 protected mouseStart(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseStart(positionInfo);\n } else {\n return false;\n }\n }\n\n protected mouseDrag(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n const result = this.dndHandler.mouseDrag(positionInfo);\n\n this.scrollHandler.checkScrolling();\n return result;\n } else {\n return false;\n }\n }\n\n protected mouseStop(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseStop(positionInfo);\n } else {\n return false;\n }\n }\n\n protected getMouseDelay(): number {\n return this.options.startDndDelay ?? 0;\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[] => {\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._openNode(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._openNode(node, false, null);\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 handleClick = (\n e: JQuery.ClickEvent<HTMLElement, any, HTMLElement, HTMLElement>\n ): void => {\n const clickTarget = this.getClickTarget(e.target);\n\n if (clickTarget) {\n if (clickTarget.type === \"button\") {\n this.toggle(clickTarget.node, this.options.slide);\n\n e.preventDefault();\n e.stopPropagation();\n } else if (clickTarget.type === \"label\") {\n const node = clickTarget.node;\n const event = this._triggerEvent(\"tree.click\", {\n node,\n click_event: e,\n });\n\n if (!event.isDefaultPrevented()) {\n this.doSelectNode(node);\n }\n }\n }\n };\n\n private handleDblclick = (\n e: JQuery.DoubleClickEvent<HTMLElement, any, HTMLElement, HTMLElement>\n ): void => {\n const clickTarget = this.getClickTarget(e.target);\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 getClickTarget(element: EventTarget): ClickTarget | null {\n const $target = jQuery(element);\n\n const $button = $target.closest(\".jqtree-toggler\");\n\n if ($button.length) {\n const node = this.getNode($button as JQuery<HTMLElement>);\n\n if (node) {\n return {\n type: \"button\",\n node,\n };\n }\n } else {\n const $el = $target.closest(\".jqtree-element\");\n if ($el.length) {\n const node = this.getNode($el as JQuery<HTMLElement>);\n if (node) {\n return {\n type: \"label\",\n node,\n };\n }\n }\n }\n\n return null;\n }\n\n private getNode($element: JQuery<HTMLElement>): null | Node {\n const $li = $element.closest(\"li.jqtree_common\");\n if ($li.length === 0) {\n return null;\n } else {\n return $li.data(\"node\") as Node;\n }\n }\n\n private handleContextmenu = (\n e: JQuery.ContextMenuEvent<HTMLElement, any, HTMLElement, HTMLElement>\n ) => {\n const $div = jQuery(e.target).closest(\"ul.jqtree-tree .jqtree-element\");\n if ($div.length) {\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 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 \"&#x25c0;\";\n } else {\n // triangle to the right\n return \"&#x25ba;\";\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 const openParents = (): void => {\n const parent = node.parent;\n\n if (parent && parent.parent && !parent.is_open) {\n this.openNode(parent, false);\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 openParents();\n }\n\n saveState();\n }\n\n private doLoadData(data: NodeData[] | null, parentNode: Node | null): void {\n if (!data) {\n return;\n } else {\n this._triggerEvent(\"tree.load_data\", { tree_data: data });\n\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\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 | null\n ): void {\n node.is_loading = true;\n\n this.doLoadDataFromUrl(null, node, () => {\n this._openNode(node, slide, onFinished);\n });\n }\n}\n\nSimpleWidget.register(JqTreeWidget, \"tree\");\n"],"names":["Position","positionNames","before","Before","after","After","inside","Inside","none","None","getPositionName","position","name","Object","prototype","hasOwnProperty","call","isNodeRecordWithChildren","data","_typeof","Array","Node","o","isRoot","nodeClass","isEmptyFolder","load_on_demand","setData","children","parent","idMapping","Map","tree","this","key","value","removeChildren","node","createNode","addChild","length","loadFromData","push","setParent","index","splice","doRemoveChild","indexOf","hasChildren","callback","_iterate","level","child","movedNode","targetNode","isParentOf","addChildAtPosition","getChildIndex","includeParent","getDataFromNodes","nodes","map","tmpNode","k","v","getNodeByCallback","n","result","iterate","nodeInfo","childIndex","newParent","originalParent","removeChild","nodeId","get","id","set","_this","removeNodeFromIndex","previousIndex","nextIndex","filter","f","includeChildren","is_open","nextSibling","getNextSibling","getNextNode","previousSibling","getPreviousSibling","getLastChild","getParent","lastChild","nodeData","addChildren","childrenData","_this2","initFromData","addNodeToIndex","_this$tree4","getNodeClass","DragAndDropHandler","treeWidget","hoveredArea","hitAreas","isDragging","currentItem","positionInfo","$element","jQuery","target","mustCaptureElement","options","onIsMoveHandle","nodeElement","_getNodeElement","onCanMove","undefined","pageX","pageY","refresh","offset","left","top","dragElement","DragElement","element","autoEscape","addClass","move","area","findHoveredArea","canMoveToArea","isFolder","stopOpenFolderTimer","mustOpenFolderTimer","startOpenFolderTimer","updateDropHint","removeDropHint","onDragMove","originalEvent","moveItem","clear","removeHover","removeHitAreas","removeClass","onDragStop","generateHitAreas","_getNodeElementForNode","hitAreasGenerator","HitAreasGenerator","getTreeDimensions","bottom","generate","is","onCanMoveTo","positionName","remove","previousGhost","x","y","dimensions","right","low","high","mid","addDropHint","folder","openFolderTimer","window","setTimeout","_openNode","slide","openFolderDelay","clearTimeout","previousParent","doMove","moveNode","empty","_refreshElements","_triggerEvent","move_info","moved_node","target_node","previous_parent","do_move","original_event","isDefaultPrevented","el","width","height","_getScrollLeft","currentNode","treeBottom","positions","lastTop","previousTop","group","generateHitAreasForGroup","addPosition","getTop","nextNode","positionsInGroup","positionCount","Math","min","areaHeight","round","areaTop","i","isFirstNode","_iterateNode","mustIterateInside","_this3","handleFirstNode","handleOpenFolder","handleClosedFolder","handleNode","childrenLength","forEach","_","handleAfterOpenFolder","nodeName","offsetX","offsetY","$tree","text","html","css","append","getBoolString","ElementsRenderer","openedIconElement","createButtonElement","openedIcon","closedIconElement","closedIcon","fromNode","renderFromNode","renderFromRoot","createDomElements","$previousLi","li","createLi","getLevel","attachNodeData","isRootNode","ul","createUl","appendChild","classString","role","rtl","dragAndDrop","document","createElement","className","setAttribute","isSelected","Boolean","selectNodeHandler","isNodeSelected","showEmptyFolder","createFolderLi","createNodeLi","onCreateLi","buttonClasses","getButtonClasses","folderClasses","getFolderClasses","iconElement","div","buttonLink","cloneNode","buttonLeft","createTitleSpan","liClasses","join","isOpen","titleSpan","classes","tabIndex","textContent","innerHTML","is_loading","createTextNode","DataLoader","urlInfo","parentNode","onFinished","$el","getDomElement","addLoadingClass","notifyLoading","stopLoading","removeLoadingClass","submitRequest","loadData","parseData","jqXHR","onLoadFailed","isLoading","onLoading","urlInfoInput","handleSuccess","handleError","ajaxSettings","method","cache","dataType","success","error","url","toUpperCase","ajax","dataFilter","parsedData","JSON","parse","KeyHandler","e","canHandleKeyboard","selectedNode","getSelectedNode","which","DOWN","moveDown","UP","moveUp","RIGHT","moveRight","LEFT","moveLeft","keyboardSupport","on","handleKeyDown","off","selectNode","getPreviousNode","openNode","closeNode","scrollHandler","isScrolledIntoView","find","scrollToNode","isFocusOnTree","register","widgetClass","widgetName","getDataKey","getWidgetData","dataKey","widget","SimpleWidget","createWidget","init","destroyWidget","destroy","removeData","callFunction","functionName","args","widgetFunction","apply","fn","argument1","defaults","constructor","deinit","getPositionInfoFromMouseEvent","getPositionInfoFromTouch","touch","MouseWidget","button","handleMouseDown","cancelable","preventDefault","handleMouseMove","handleMouseUp","touches","changedTouches","addEventListener","mouseDown","passive","touchStart","isMouseStarted","mouseDelayTimer","isMouseDelayMet","mouseDownInfo","removeEventListener","removeMouseMoveEventListeners","mouseCapture","handleStartMouse","mouseMove","touchMove","mouseUp","touchEnd","mouseDelay","getMouseDelay","startMouseDelayTimer","mouseDrag","mouseStart","mouseStop","SaveStateHandler","state","stringify","getState","onSetStateFromStorage","supportsLocalStorage","localStorage","setItem","getKeyName","jsonData","loadFromStorage","parseState","selectedNodeIds","openNodes","open_nodes","selected_node","getSelectedNodes","mustLoadOnDemand","openInitialNodes","resetSelection","selectInitialNodes","cbFinished","doSetInitialStateOnDemand","getStateFromStorage","onGetStateFromStorage","getItem","nodeIds","getNodeById","selectCount","addToSelection","removeFromSelection","nodeIdsParam","selectedNodes","loadingCount","newNodesIds","loadAndOpenNode","saveState","_supportsLocalStorage","sessionStorage","removeItem","testSupport","ScrollHandler","isInitialized","ensureInit","checkVerticalScrolling","checkHorizontalScrolling","$scrollParent","scrollTop","treeTop","elementBottom","viewBottom","elementTop","viewTop","elHeight","scrollParentTop","scrollLeft","setDocumentAsScrollParent","cssAttributes","hasOverFlow","attr","overflowValue","parents","getParentWithOverflow","tagName","initScrollParent","scrollParent","offsetHeight","refreshHitAreas","dndHandler","handleVerticalScrollingWithScrollParent","handleVerticalScrollingWithDocument","handleHorizontalScrollingWithParent","handleHorizontalScrollingWithDocument","scrollParentOffset","canScrollRight","clientWidth","scrollWidth","canScrollLeft","rightEdge","leftEdge","isNearRightEdge","isNearLeftEdge","max","$document","windowWidth","SelectNodeHandler","Set","selectedSingleNode","has","add","activeElement","_containsElement","NodeElement","mustShowBorderDropHint","BorderDropHint","GhostDropHint","mustSetFocus","$li","getLi","$span","getSpan","trigger","removeAttr","blur","FolderElement","animationSpeed","$button","getButton","buttonEl","icon","renderer","doOpen","getUl","slideDown","show","doClose","slideUp","hide","$div","elWidth","outerHeight","$hint","$ghost","moveAfter","moveBefore","moveInsideOpenFolder","moveInside","childElement","NODE_PARAM_IS_EMPTY","PARAM_IS_EMPTY","JqTreeWidget","clickTarget","getClickTarget","type","toggle","stopPropagation","click_event","doSelectNode","closest","getNode","slideParam","Error","optionsParam","getData","doLoadData","param1","param2","param3","doLoadDataFromUrl","getNodeByName","getNodeByNameMustExist","getNodesByProperty","parseParams","close","newNodeInfo","existingNode","newNode","addAfter","addBefore","addParent","parentNodeParam","prepend","idIsChanged","subtree","positionIndex","saveStateHandler","select","deselect","nodeOffset","nodeTop","treeOffset","scrollToY","setInitialState","option","keyHandler","eventName","values","event","Event","doOpenNode","_node","_slide","_onFinished","open","loadFolderOnDemand","mustSelect","isSelectedNodeInSubtree","render","selectCurrentNode","getScrollLeft","getRtlOption","getDefaultClosedIcon","dataLoader","initData","handleClick","handleDblclick","useContextMenu","handleContextmenu","checkScrolling","startDndDelay","getDataUrlInfo","dataUrl","setUrlInfoData","selectedNodeId","_this4","getNodeIdToBeSelected","doInit","_this5","setInitialStateOnDemand","_this6","restoreState","isRestored","autoOpen","maxLevel","getAutoOpenMaxLevel","autoOpenNodes","_this7","parseInt","$target","dataRtl","_this8","deselectCurrentNode","selectOptions","mustToggle","onCanSelectNode","selectable","previous_node","deselectedNode","deselected_node","tree_data","deselectNodes","loadSubtree","initTree","getSelectedNodesUnder","urlInfoParam","loadFromUrl","_this9"],"mappings":"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"}
1
+ {"version":3,"file":"tree.jquery.js","sources":["src/version.ts","src/node.ts","src/dragAndDropHandler.ts","src/util.ts","src/elementsRenderer.ts","src/dataLoader.ts","src/keyHandler.ts","src/simple.widget.ts","src/mouse.widget.ts","src/saveStateHandler.ts","src/scrollHandler.ts","src/selectNodeHandler.ts","src/nodeElement.ts","src/tree.jquery.ts"],"sourcesContent":["const version = \"1.7.0\";\n\nexport default version;\n","interface NodeRecordWithChildren extends NodeRecord {\n children: NodeData[];\n}\n\nexport 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\ntype IterateCallback = (node: Node, level: number) => boolean;\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\nconst isNodeRecordWithChildren = (\n data: NodeData\n): data is NodeRecordWithChildren =>\n typeof data === \"object\" &&\n \"children\" in data &&\n data[\"children\"] instanceof Array;\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(o: NodeData | null = null, isRoot = false, nodeClass = Node) {\n this.name = \"\";\n this.isEmptyFolder = false;\n this.load_on_demand = false;\n\n this.setData(o);\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 o of data) {\n const node = this.createNode(o);\n this.addChild(node);\n\n if (isNodeRecordWithChildren(o)) {\n if (o.children.length === 0) {\n node.isEmptyFolder = true;\n } else {\n node.loadFromData(o.children);\n }\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 if (\n isNodeRecordWithChildren(nodeInfo) &&\n nodeInfo.children.length\n ) {\n node.loadFromData(nodeInfo.children);\n }\n\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 if (\n isNodeRecordWithChildren(nodeInfo) &&\n nodeInfo.children.length\n ) {\n node.loadFromData(nodeInfo.children);\n }\n\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 if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {\n node.loadFromData(nodeInfo.children);\n }\n\n return node;\n }\n\n public prepend(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChildAtPosition(node, 0);\n\n if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {\n node.loadFromData(nodeInfo.children);\n }\n\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];\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];\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];\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];\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 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","import { getPositionName, Node, Position } from \"./node\";\nimport { DropHint, HitArea, PositionInfo } from \"./types\";\nimport { NodeElement } from \"./nodeElement\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\ninterface Dimensions {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport class DragAndDropHandler {\n public hitAreas: HitArea[];\n public isDragging: boolean;\n public currentItem: NodeElement | null;\n public hoveredArea: HitArea | null;\n public positionInfo: PositionInfo | null;\n\n private treeWidget: JqTreeWidget;\n private dragElement: DragElement | null;\n private previousGhost: DropHint | null;\n private openFolderTimer: number | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n this.hoveredArea = null;\n this.hitAreas = [];\n this.isDragging = false;\n this.currentItem = null;\n this.positionInfo = null;\n }\n\n public mouseCapture(positionInfo: PositionInfo): boolean | null {\n const $element = jQuery(positionInfo.target);\n\n if (!this.mustCaptureElement($element)) {\n return null;\n }\n\n if (\n this.treeWidget.options.onIsMoveHandle &&\n !this.treeWidget.options.onIsMoveHandle($element)\n ) {\n return null;\n }\n\n let nodeElement = this.treeWidget._getNodeElement($element);\n\n if (nodeElement && this.treeWidget.options.onCanMove) {\n if (!this.treeWidget.options.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 (\n !this.currentItem ||\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return false;\n }\n\n this.refresh();\n\n const offset = jQuery(positionInfo.target).offset();\n const left = offset ? offset.left : 0;\n const top = offset ? offset.top : 0;\n\n const node = this.currentItem.node;\n\n this.dragElement = new DragElement(\n node.name,\n positionInfo.pageX - left,\n positionInfo.pageY - top,\n this.treeWidget.element,\n this.treeWidget.options.autoEscape ?? true\n );\n\n this.isDragging = true;\n this.positionInfo = positionInfo;\n this.currentItem.$element.addClass(\"jqtree-moving\");\n return true;\n }\n\n public mouseDrag(positionInfo: PositionInfo): boolean {\n if (\n !this.currentItem ||\n !this.dragElement ||\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return false;\n }\n\n this.dragElement.move(positionInfo.pageX, positionInfo.pageY);\n this.positionInfo = positionInfo;\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.treeWidget.options.onDragMove) {\n this.treeWidget.options.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.removeClass(\"jqtree-moving\");\n this.currentItem = null;\n }\n\n this.isDragging = false;\n this.positionInfo = null;\n\n if (!this.hoveredArea && currentItem) {\n if (this.treeWidget.options.onDragStop) {\n this.treeWidget.options.onDragStop(\n currentItem.node,\n positionInfo.originalEvent\n );\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.treeWidget._getNodeElementForNode(\n this.currentItem.node\n );\n\n if (this.isDragging) {\n this.currentItem.$element.addClass(\"jqtree-moving\");\n }\n }\n }\n\n private generateHitAreas(): void {\n if (!this.currentItem) {\n this.hitAreas = [];\n } else {\n const hitAreasGenerator = new HitAreasGenerator(\n this.treeWidget.tree,\n this.currentItem.node,\n this.getTreeDimensions().bottom\n );\n this.hitAreas = hitAreasGenerator.generate();\n }\n }\n\n private mustCaptureElement($element: JQuery<HTMLElement>): boolean {\n return !$element.is(\"input,select,textarea\");\n }\n\n private canMoveToArea(area: HitArea): boolean {\n if (!this.treeWidget.options.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.treeWidget.options.onCanMoveTo(\n this.currentItem.node,\n area.node,\n positionName\n );\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 (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.treeWidget._getNodeElementForNode(\n this.hoveredArea.node\n );\n this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);\n }\n\n private startOpenFolderTimer(folder: Node): void {\n const openFolder = (): void => {\n this.treeWidget._openNode(\n folder,\n this.treeWidget.options.slide,\n () => {\n this.refresh();\n this.updateDropHint();\n }\n );\n };\n\n this.stopOpenFolderTimer();\n\n const openFolderDelay = this.treeWidget.options.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 this.treeWidget.tree.moveNode(movedNode, targetNode, position);\n this.treeWidget.element.empty();\n this.treeWidget._refreshElements(null);\n };\n\n const event = this.treeWidget._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 offset = this.treeWidget.element.offset();\n\n if (!offset) {\n return { left: 0, top: 0, right: 0, bottom: 0 };\n } else {\n const el = this.treeWidget.element;\n const width = el.width() || 0;\n const height = el.height() || 0;\n const left = offset.left + this.treeWidget._getScrollLeft();\n\n return {\n left,\n top: offset.top,\n right: left + width,\n bottom: offset.top + height + 16,\n };\n }\n }\n}\n\nabstract class VisibleNodeIterator {\n private tree: Node;\n\n constructor(tree: Node) {\n this.tree = tree;\n }\n\n protected iterate(): void {\n let isFirstNode = true;\n\n const _iterateNode = (node: Node, nextNode: Node | null): void => {\n let mustIterateInside =\n (node.is_open || !node.element) && node.hasChildren();\n\n let $element: JQuery<HTMLElement> | null = null;\n\n if (node.element) {\n $element = jQuery(node.element);\n\n if (!$element.is(\":visible\")) {\n return;\n }\n\n if (isFirstNode) {\n this.handleFirstNode(node);\n isFirstNode = false;\n }\n\n if (!node.hasChildren()) {\n this.handleNode(node, nextNode, $element);\n } else if (node.is_open) {\n if (!this.handleOpenFolder(node, $element)) {\n mustIterateInside = false;\n }\n } else {\n this.handleClosedFolder(node, nextNode, $element);\n }\n }\n\n if (mustIterateInside) {\n const childrenLength = node.children.length;\n node.children.forEach((_, i) => {\n if (i === childrenLength - 1) {\n _iterateNode(node.children[i], null);\n } else {\n _iterateNode(node.children[i], node.children[i + 1]);\n }\n });\n\n if (node.is_open && $element) {\n this.handleAfterOpenFolder(node, nextNode);\n }\n }\n };\n\n _iterateNode(this.tree, null);\n }\n\n protected abstract handleNode(\n node: Node,\n nextNode: Node | null,\n $element: JQuery\n ): void;\n\n /*\n override\n return\n - true: continue iterating\n - false: stop iterating\n */\n protected abstract handleOpenFolder(node: Node, $element: JQuery): boolean;\n\n protected abstract handleClosedFolder(\n node: Node,\n nextNode: Node | null,\n $element: JQuery\n ): void;\n\n protected abstract handleAfterOpenFolder(\n node: Node,\n nextNode: Node | null\n ): void;\n\n protected abstract handleFirstNode(node: Node): void;\n}\n\nexport class HitAreasGenerator extends VisibleNodeIterator {\n private currentNode: Node;\n private treeBottom: number;\n private positions: HitArea[];\n private lastTop: number;\n\n constructor(tree: Node, currentNode: Node, treeBottom: number) {\n super(tree);\n\n this.currentNode = currentNode;\n this.treeBottom = treeBottom;\n }\n\n public generate(): HitArea[] {\n this.positions = [];\n this.lastTop = 0;\n\n this.iterate();\n\n return this.generateHitAreas(this.positions);\n }\n\n protected generateHitAreas(positions: HitArea[]): HitArea[] {\n let previousTop = -1;\n let group = [];\n const hitAreas: HitArea[] = [];\n\n for (const position of positions) {\n if (position.top !== previousTop && group.length) {\n if (group.length) {\n this.generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n position.top\n );\n }\n\n previousTop = position.top;\n group = [];\n }\n\n group.push(position);\n }\n\n this.generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n this.treeBottom\n );\n\n return hitAreas;\n }\n\n protected handleOpenFolder(node: Node, $element: JQuery): boolean {\n if (node === this.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] !== this.currentNode) {\n this.addPosition(node, Position.Inside, this.getTop($element));\n }\n\n // Continue iterating\n return true;\n }\n\n protected handleClosedFolder(\n node: Node,\n nextNode: Node,\n $element: JQuery\n ): void {\n const top = this.getTop($element);\n\n if (node === this.currentNode) {\n // Cannot move after current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.Inside, top);\n\n // Cannot move before current item\n if (nextNode !== this.currentNode) {\n this.addPosition(node, Position.After, top);\n }\n }\n }\n\n protected handleFirstNode(node: Node): void {\n if (node !== this.currentNode) {\n this.addPosition(\n node,\n Position.Before,\n this.getTop(jQuery(node.element))\n );\n }\n }\n\n protected handleAfterOpenFolder(node: Node, nextNode: Node): void {\n if (node === this.currentNode || nextNode === this.currentNode) {\n // Cannot move before or after current item\n this.addPosition(node, Position.None, this.lastTop);\n } else {\n this.addPosition(node, Position.After, this.lastTop);\n }\n }\n\n protected handleNode(node: Node, nextNode: Node, $element: JQuery): void {\n const top = this.getTop($element);\n\n if (node === this.currentNode) {\n // Cannot move inside current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.Inside, top);\n }\n\n if (nextNode === this.currentNode || node === this.currentNode) {\n // Cannot move before or after current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.After, top);\n }\n }\n\n private getTop($element: JQuery<HTMLElement>): number {\n const offset = $element.offset();\n\n return offset ? offset.top : 0;\n }\n\n private addPosition(node: Node, position: number, top: number): void {\n const area = {\n top,\n bottom: 0,\n node,\n position,\n };\n\n this.positions.push(area);\n this.lastTop = top;\n }\n\n private generateHitAreasForGroup(\n hitAreas: HitArea[],\n positionsInGroup: HitArea[],\n top: number,\n bottom: number\n ): void {\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 hitAreas.push({\n top: areaTop,\n bottom: areaTop + areaHeight,\n node: position.node,\n position: position.position,\n });\n\n areaTop += areaHeight;\n i += 1;\n }\n }\n}\n\nclass DragElement {\n private offsetX: number;\n private offsetY: number;\n private $element: JQuery;\n\n constructor(\n nodeName: string,\n offsetX: number,\n offsetY: number,\n $tree: JQuery,\n autoEscape: boolean\n ) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n this.$element = jQuery(\"<span>\").addClass(\n \"jqtree-title jqtree-dragging\"\n );\n\n if (autoEscape) {\n this.$element.text(nodeName);\n } else {\n this.$element.html(nodeName);\n }\n\n this.$element.css(\"position\", \"absolute\");\n $tree.append(this.$element);\n }\n\n public move(pageX: number, pageY: number): void {\n this.$element.offset({\n left: pageX - this.offsetX,\n top: pageY - this.offsetY,\n });\n }\n\n public remove(): void {\n this.$element.remove();\n }\n}\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","import { getBoolString } from \"./util\";\nimport { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\ntype IconElement = Text | Element;\n\nexport default class ElementsRenderer {\n public openedIconElement: IconElement;\n public closedIconElement: IconElement;\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n this.openedIconElement = this.createButtonElement(\n treeWidget.options.openedIcon || \"+\"\n );\n this.closedIconElement = this.createButtonElement(\n treeWidget.options.closedIcon || \"-\"\n );\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 const $element = this.treeWidget.element;\n $element.empty();\n\n this.createDomElements(\n $element[0],\n this.treeWidget.tree.children,\n true,\n 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.treeWidget.options.rtl) {\n classString += \" jqtree-rtl\";\n }\n }\n\n if (this.treeWidget.options.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(\n this.treeWidget.selectNodeHandler.isNodeSelected(node)\n );\n\n const mustShowFolder =\n node.isFolder() ||\n (node.isEmptyFolder && this.treeWidget.options.showEmptyFolder);\n\n const li = mustShowFolder\n ? this.createFolderLi(node, level, isSelected)\n : this.createNodeLi(node, level, isSelected);\n\n if (this.treeWidget.options.onCreateLi) {\n this.treeWidget.options.onCreateLi(node, jQuery(li), isSelected);\n }\n\n return li;\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\", \"presentation\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"presentation\");\n\n li.appendChild(div);\n\n // button link\n const buttonLink = document.createElement(\"a\");\n buttonLink.className = buttonClasses;\n\n buttonLink.appendChild(iconElement.cloneNode(true));\n\n buttonLink.setAttribute(\"role\", \"presentation\");\n buttonLink.setAttribute(\"aria-hidden\", \"true\");\n\n if (this.treeWidget.options.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n // title span\n div.appendChild(\n this.createTitleSpan(\n node.name,\n level,\n isSelected,\n node.is_open,\n true\n )\n );\n\n if (!this.treeWidget.options.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\", \"presentation\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"presentation\");\n\n li.appendChild(div);\n\n // title span\n div.appendChild(\n this.createTitleSpan(\n node.name,\n level,\n isSelected,\n node.is_open,\n false\n )\n );\n\n return li;\n }\n\n private createTitleSpan(\n nodeName: string,\n level: number,\n isSelected: boolean,\n isOpen: boolean,\n isFolder: boolean\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-${\n this.treeWidget.options.buttonLeft ? \"left\" : \"right\"\n }`;\n\n titleSpan.className = classes;\n\n titleSpan.setAttribute(\"role\", \"treeitem\");\n titleSpan.setAttribute(\"aria-level\", `${level}`);\n\n titleSpan.setAttribute(\"aria-selected\", getBoolString(isSelected));\n titleSpan.setAttribute(\"aria-expanded\", getBoolString(isOpen));\n\n if (isSelected) {\n const tabIndex = this.treeWidget.options.tabIndex;\n\n if (tabIndex !== undefined) {\n titleSpan.setAttribute(\"tabindex\", `${tabIndex}`);\n }\n }\n\n if (this.treeWidget.options.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.treeWidget.options.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(value: string | Element): IconElement {\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 {\n return jQuery(value)[0];\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport type HandleFinishedLoading = () => void;\n\nexport default class DataLoader {\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\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 $el = this.getDomElement(parentNode);\n this.addLoadingClass($el);\n this.notifyLoading(true, parentNode, $el);\n\n const stopLoading = (): void => {\n this.removeLoadingClass($el);\n this.notifyLoading(false, parentNode, $el);\n };\n\n const handleSuccess = (data: string | NodeData[]): void => {\n stopLoading();\n this.treeWidget.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.treeWidget.options.onLoadFailed) {\n this.treeWidget.options.onLoadFailed(jqXHR);\n }\n };\n\n this.submitRequest(urlInfo, handleSuccess, handleError);\n }\n\n private addLoadingClass($el: JQuery<HTMLElement>): void {\n if ($el) {\n $el.addClass(\"jqtree-loading\");\n }\n }\n\n private removeLoadingClass($el: JQuery<HTMLElement>): void {\n if ($el) {\n $el.removeClass(\"jqtree-loading\");\n }\n }\n\n private getDomElement(parentNode: Node | null): JQuery<HTMLElement> {\n if (parentNode) {\n return jQuery(parentNode.element);\n } else {\n return this.treeWidget.element;\n }\n }\n\n private notifyLoading(\n isLoading: boolean,\n node: Node | null,\n $el: JQuery\n ): void {\n if (this.treeWidget.options.onLoading) {\n this.treeWidget.options.onLoading(isLoading, node, $el);\n }\n\n this.treeWidget._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 { dataFilter } = this.treeWidget.options;\n\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 (dataFilter) {\n return dataFilter(parsedData);\n } else {\n return parsedData;\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport default class KeyHandler {\n private static LEFT = 37;\n private static UP = 38;\n private static RIGHT = 39;\n private static DOWN = 40;\n\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n if (treeWidget.options.keyboardSupport) {\n jQuery(document).on(\"keydown.jqtree\", this.handleKeyDown);\n }\n }\n\n public deinit(): void {\n jQuery(document).off(\"keydown.jqtree\");\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.treeWidget.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.treeWidget.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.treeWidget.selectNode(node);\n\n if (\n !this.treeWidget.scrollHandler.isScrolledIntoView(\n jQuery(node.element).find(\".jqtree-element\")\n )\n ) {\n this.treeWidget.scrollToNode(node);\n }\n\n return false;\n }\n }\n\n private handleKeyDown = (e: JQuery.Event): boolean => {\n if (!this.canHandleKeyboard()) {\n return true;\n }\n\n const selectedNode = this.treeWidget.getSelectedNode();\n if (!selectedNode) {\n return true;\n }\n\n const key = e.which;\n\n switch (key) {\n case KeyHandler.DOWN:\n return this.moveDown(selectedNode);\n\n case KeyHandler.UP:\n return this.moveUp(selectedNode);\n\n case KeyHandler.RIGHT:\n return this.moveRight(selectedNode);\n\n case KeyHandler.LEFT:\n return this.moveLeft(selectedNode);\n\n default:\n return true;\n }\n };\n\n private canHandleKeyboard(): boolean {\n return (\n (this.treeWidget.options.keyboardSupport || false) &&\n this.treeWidget.selectNodeHandler.isFocusOnTree()\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 }\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","/*\nThis widget does the same a the mouse widget in jqueryui.\n*/\nimport SimpleWidget from \"./simple.widget\";\nimport { PositionInfo } from \"./types\";\n\nconst getPositionInfoFromMouseEvent = (e: MouseEvent): PositionInfo => ({\n pageX: e.pageX,\n pageY: e.pageY,\n target: e.target as HTMLElement,\n originalEvent: e,\n});\n\nconst getPositionInfoFromTouch = (\n touch: Touch,\n e: TouchEvent\n): PositionInfo => ({\n pageX: touch.pageX,\n pageY: touch.pageY,\n target: touch.target as HTMLElement,\n originalEvent: e,\n});\n\nabstract class MouseWidget<WidgetOptions> extends SimpleWidget<WidgetOptions> {\n protected isMouseStarted: boolean;\n protected mouseDownInfo: PositionInfo | null;\n private mouseDelayTimer: number | null;\n private isMouseDelayMet: boolean;\n\n public init(): void {\n const element = this.$el.get(0);\n\n if (element) {\n element.addEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n element.addEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\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 const el = this.$el.get(0);\n\n if (el) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (el as any).removeEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (el as any).removeEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n }\n\n this.removeMouseMoveEventListeners();\n }\n\n protected abstract mouseCapture(positionInfo: PositionInfo): boolean | null;\n\n protected abstract mouseStart(positionInfo: PositionInfo): boolean;\n\n protected abstract mouseDrag(positionInfo: PositionInfo): void;\n\n protected abstract mouseStop(positionInfo: PositionInfo): void;\n\n protected abstract getMouseDelay(): number;\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.mouseCapture(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.mouseDrag(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 = this.mouseStart(this.mouseDownInfo) !== false;\n }\n\n if (this.isMouseStarted) {\n this.mouseDrag(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.mouseStop(positionInfo);\n }\n }\n\n private removeMouseMoveEventListeners() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"mouseup\", this.mouseUp, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\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.changedTouches[0];\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.changedTouches[0];\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.changedTouches[0];\n\n this.handleMouseUp(getPositionInfoFromTouch(touch, e));\n };\n}\n\nexport default MouseWidget;\n","import { isInt } from \"./util\";\nimport { JqTreeWidget } from \"./tree.jquery\";\nimport { Node } from \"./node\";\n\nexport interface SavedState {\n open_nodes: NodeId[];\n selected_node: NodeId[];\n}\n\nexport default class SaveStateHandler {\n private treeWidget: JqTreeWidget;\n private _supportsLocalStorage: boolean | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n }\n\n public saveState(): void {\n const state = JSON.stringify(this.getState());\n\n if (this.treeWidget.options.onSetStateFromStorage) {\n this.treeWidget.options.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.treeWidget.tree.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.treeWidget.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];\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.treeWidget.options.onGetStateFromStorage) {\n return this.treeWidget.options.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.treeWidget.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.treeWidget.getNodeById(nodeId);\n\n if (node) {\n selectCount += 1;\n\n this.treeWidget.selectNodeHandler.addToSelection(node);\n }\n }\n\n return selectCount !== 0;\n }\n\n private resetSelection(): void {\n const selectNodeHandler = this.treeWidget.selectNodeHandler;\n\n const selectedNodes = selectNodeHandler.getSelectedNodes();\n\n selectedNodes.forEach((node) => {\n selectNodeHandler.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.treeWidget.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.treeWidget._openNode(node, false, null);\n }\n }\n }\n }\n\n nodeIds = newNodesIds;\n\n if (this.selectInitialNodes(selectedNodes)) {\n this.treeWidget._refreshElements(null);\n }\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this.treeWidget._openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n openNodes();\n }\n\n private getKeyName(): string {\n if (typeof this.treeWidget.options.saveState === \"string\") {\n return this.treeWidget.options.saveState;\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 { JqTreeWidget } from \"./tree.jquery\";\nimport { HitArea, PositionInfo } from \"./types\";\n\nexport default class ScrollHandler {\n private treeWidget: JqTreeWidget;\n private previousTop: number;\n private isInitialized: boolean;\n private $scrollParent: JQuery | null;\n private scrollParentTop: number;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n this.previousTop = -1;\n this.isInitialized = false;\n }\n\n public checkScrolling(): void {\n this.ensureInit();\n this.checkVerticalScrolling();\n this.checkHorizontalScrolling();\n }\n\n public scrollToY(top: number): void {\n this.ensureInit();\n\n if (this.$scrollParent) {\n this.$scrollParent[0].scrollTop = top;\n } else {\n const offset = this.treeWidget.$el.offset();\n const treeTop = offset ? offset.top : 0;\n\n jQuery(document).scrollTop(top + treeTop);\n }\n }\n\n public isScrolledIntoView($element: JQuery): boolean {\n this.ensureInit();\n\n let elementBottom: number;\n let viewBottom: number;\n let elementTop: number;\n let viewTop: number;\n\n const elHeight = $element.height() || 0;\n\n if (this.$scrollParent) {\n viewTop = 0;\n viewBottom = this.$scrollParent.height() || 0;\n\n const offset = $element.offset();\n const originalTop = offset ? offset.top : 0;\n\n elementTop = originalTop - this.scrollParentTop;\n elementBottom = elementTop + elHeight;\n } else {\n viewTop = jQuery(window).scrollTop() || 0;\n\n const windowHeight = jQuery(window).height() || 0;\n viewBottom = viewTop + windowHeight;\n\n const offset = $element.offset();\n\n elementTop = offset ? offset.top : 0;\n elementBottom = elementTop + elHeight;\n }\n\n return elementBottom <= viewBottom && elementTop >= viewTop;\n }\n\n public getScrollLeft(): number {\n if (!this.$scrollParent) {\n return 0;\n } else {\n return this.$scrollParent.scrollLeft() || 0;\n }\n }\n\n private initScrollParent(): void {\n const getParentWithOverflow = (): JQuery | null => {\n const cssAttributes = [\"overflow\", \"overflow-y\"];\n\n const hasOverFlow = ($el: JQuery): boolean => {\n for (const attr of cssAttributes) {\n const overflowValue = $el.css(attr);\n if (\n overflowValue === \"auto\" ||\n overflowValue === \"scroll\"\n ) {\n return true;\n }\n }\n\n return false;\n };\n\n if (hasOverFlow(this.treeWidget.$el)) {\n return this.treeWidget.$el;\n }\n\n for (const el of this.treeWidget.$el.parents().get()) {\n const $el = jQuery(el);\n if (hasOverFlow($el)) {\n return $el;\n }\n }\n\n return null;\n };\n\n const setDocumentAsScrollParent = (): void => {\n this.scrollParentTop = 0;\n this.$scrollParent = null;\n };\n\n if (this.treeWidget.$el.css(\"position\") === \"fixed\") {\n setDocumentAsScrollParent();\n }\n\n const $scrollParent = getParentWithOverflow();\n\n if (\n $scrollParent &&\n $scrollParent.length &&\n $scrollParent[0].tagName !== \"HTML\"\n ) {\n this.$scrollParent = $scrollParent;\n\n const offset = this.$scrollParent.offset();\n this.scrollParentTop = offset ? offset.top : 0;\n } else {\n setDocumentAsScrollParent();\n }\n\n this.isInitialized = true;\n }\n\n private ensureInit(): void {\n if (!this.isInitialized) {\n this.initScrollParent();\n }\n }\n\n private handleVerticalScrollingWithScrollParent(area: HitArea): void {\n const scrollParent = this.$scrollParent && this.$scrollParent[0];\n\n if (!scrollParent) {\n return;\n }\n\n const distanceBottom =\n this.scrollParentTop + scrollParent.offsetHeight - area.bottom;\n\n if (distanceBottom < 20) {\n scrollParent.scrollTop += 20;\n this.treeWidget.refreshHitAreas();\n this.previousTop = -1;\n } else if (area.top - this.scrollParentTop < 20) {\n scrollParent.scrollTop -= 20;\n this.treeWidget.refreshHitAreas();\n this.previousTop = -1;\n }\n }\n\n private handleVerticalScrollingWithDocument(area: HitArea): void {\n const scrollTop = jQuery(document).scrollTop() || 0;\n const distanceTop = area.top - scrollTop;\n\n if (distanceTop < 20) {\n jQuery(document).scrollTop(scrollTop - 20);\n } else {\n const windowHeight = jQuery(window).height() || 0;\n\n if (windowHeight - (area.bottom - scrollTop) < 20) {\n jQuery(document).scrollTop(scrollTop + 20);\n }\n }\n }\n\n private checkVerticalScrolling(): void {\n const hoveredArea = this.treeWidget.dndHandler.hoveredArea;\n\n if (hoveredArea && hoveredArea.top !== this.previousTop) {\n this.previousTop = hoveredArea.top;\n\n if (this.$scrollParent) {\n this.handleVerticalScrollingWithScrollParent(hoveredArea);\n } else {\n this.handleVerticalScrollingWithDocument(hoveredArea);\n }\n }\n }\n\n private checkHorizontalScrolling(): void {\n const positionInfo = this.treeWidget.dndHandler.positionInfo;\n\n if (!positionInfo) {\n return;\n }\n\n if (this.$scrollParent) {\n this.handleHorizontalScrollingWithParent(positionInfo);\n } else {\n this.handleHorizontalScrollingWithDocument(positionInfo);\n }\n }\n\n private handleHorizontalScrollingWithParent(\n positionInfo: PositionInfo\n ): void {\n if (\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return;\n }\n\n const $scrollParent = this.$scrollParent;\n const scrollParentOffset = $scrollParent && $scrollParent.offset();\n\n if (!($scrollParent && scrollParentOffset)) {\n return;\n }\n\n const scrollParent = $scrollParent[0];\n\n const canScrollRight =\n scrollParent.scrollLeft + scrollParent.clientWidth <\n scrollParent.scrollWidth;\n const canScrollLeft = scrollParent.scrollLeft > 0;\n\n const rightEdge = scrollParentOffset.left + scrollParent.clientWidth;\n const leftEdge = scrollParentOffset.left;\n const isNearRightEdge = positionInfo.pageX > rightEdge - 20;\n const isNearLeftEdge = positionInfo.pageX < leftEdge + 20;\n\n if (isNearRightEdge && canScrollRight) {\n scrollParent.scrollLeft = Math.min(\n scrollParent.scrollLeft + 20,\n scrollParent.scrollWidth\n );\n } else if (isNearLeftEdge && canScrollLeft) {\n scrollParent.scrollLeft = Math.max(scrollParent.scrollLeft - 20, 0);\n }\n }\n\n private handleHorizontalScrollingWithDocument(\n positionInfo: PositionInfo\n ): void {\n if (\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return;\n }\n\n const $document = jQuery(document);\n\n const scrollLeft = $document.scrollLeft() || 0;\n const windowWidth = jQuery(window).width() || 0;\n\n const canScrollLeft = scrollLeft > 0;\n\n const isNearRightEdge = positionInfo.pageX > windowWidth - 20;\n const isNearLeftEdge = positionInfo.pageX - scrollLeft < 20;\n\n if (isNearRightEdge) {\n $document.scrollLeft(scrollLeft + 20);\n } else if (isNearLeftEdge && canScrollLeft) {\n $document.scrollLeft(Math.max(scrollLeft - 20, 0));\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport default class SelectNodeHandler {\n private treeWidget: JqTreeWidget;\n private selectedNodes: Set<NodeId>;\n private selectedSingleNode: Node | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\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];\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.treeWidget.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.treeWidget.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 public isFocusOnTree(): boolean {\n const activeElement = document.activeElement;\n\n return Boolean(\n activeElement &&\n activeElement.tagName === \"SPAN\" &&\n this.treeWidget._containsElement(activeElement as HTMLElement)\n );\n }\n}\n","import { Position, Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\nimport { DropHint } from \"./types\";\n\nexport type OnFinishOpenNode = (node: Node) => void;\n\nexport class NodeElement {\n public node: Node;\n public $element: JQuery<HTMLElement>;\n protected treeWidget: JqTreeWidget;\n\n constructor(node: Node, treeWidget: JqTreeWidget) {\n this.init(node, treeWidget);\n }\n\n public init(node: Node, treeWidget: JqTreeWidget): void {\n this.node = node;\n this.treeWidget = treeWidget;\n\n if (!node.element) {\n const element = this.treeWidget.element.get(0);\n\n if (element) {\n node.element = element;\n }\n }\n\n if (node.element) {\n this.$element = jQuery(node.element);\n }\n }\n\n public addDropHint(position: number): DropHint {\n if (this.mustShowBorderDropHint(position)) {\n return new BorderDropHint(\n this.$element,\n this.treeWidget._getScrollLeft()\n );\n } else {\n return new GhostDropHint(this.node, this.$element, position);\n }\n }\n\n public select(mustSetFocus: boolean): void {\n const $li = this.getLi();\n\n $li.addClass(\"jqtree-selected\");\n $li.attr(\"aria-selected\", \"true\");\n\n const $span = this.getSpan();\n $span.attr(\"tabindex\", this.treeWidget.options.tabIndex ?? null);\n\n if (mustSetFocus) {\n $span.trigger(\"focus\");\n }\n }\n\n public deselect(): void {\n const $li = this.getLi();\n\n $li.removeClass(\"jqtree-selected\");\n $li.attr(\"aria-selected\", \"false\");\n\n const $span = this.getSpan();\n $span.removeAttr(\"tabindex\");\n\n $span.blur();\n }\n\n protected getUl(): JQuery<HTMLElement> {\n return this.$element.children(\"ul:first\");\n }\n\n protected getSpan(): JQuery<HTMLElement> {\n return this.$element\n .children(\".jqtree-element\")\n .find(\"span.jqtree-title\");\n }\n\n protected getLi(): JQuery<HTMLElement> {\n return this.$element;\n }\n\n protected mustShowBorderDropHint(position: number): boolean {\n return position === Position.Inside;\n }\n}\n\nexport class FolderElement extends NodeElement {\n public open(\n onFinished: OnFinishOpenNode | null,\n slide = true,\n animationSpeed: JQuery.Duration | string = \"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.removeClass(\"jqtree-closed\");\n $button.html(\"\");\n\n const buttonEl = $button.get(0);\n\n if (buttonEl) {\n const icon =\n this.treeWidget.renderer.openedIconElement.cloneNode(true);\n\n buttonEl.appendChild(icon);\n }\n\n const doOpen = (): void => {\n const $li = this.getLi();\n $li.removeClass(\"jqtree-closed\");\n\n const $span = this.getSpan();\n $span.attr(\"aria-expanded\", \"true\");\n\n if (onFinished) {\n onFinished(this.node);\n }\n\n this.treeWidget._triggerEvent(\"tree.open\", {\n node: this.node,\n });\n };\n\n if (slide) {\n this.getUl().slideDown(animationSpeed, doOpen);\n } else {\n this.getUl().show();\n doOpen();\n }\n }\n\n public close(\n slide = true,\n animationSpeed: JQuery.Duration | string = \"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.addClass(\"jqtree-closed\");\n $button.html(\"\");\n\n const buttonEl = $button.get(0);\n\n if (buttonEl) {\n const icon =\n this.treeWidget.renderer.closedIconElement.cloneNode(true);\n\n buttonEl.appendChild(icon);\n }\n\n const doClose = (): void => {\n const $li = this.getLi();\n $li.addClass(\"jqtree-closed\");\n\n const $span = this.getSpan();\n $span.attr(\"aria-expanded\", \"false\");\n\n this.treeWidget._triggerEvent(\"tree.close\", {\n node: this.node,\n });\n };\n\n if (slide) {\n this.getUl().slideUp(animationSpeed, doClose);\n } else {\n this.getUl().hide();\n doClose();\n }\n }\n\n protected mustShowBorderDropHint(position: number): boolean {\n return !this.node.is_open && position === Position.Inside;\n }\n\n private getButton(): JQuery {\n return this.$element\n .children(\".jqtree-element\")\n .find(\"a.jqtree-toggler\");\n }\n}\n\nexport class BorderDropHint implements DropHint {\n private $hint: JQuery<Element>;\n\n constructor($element: JQuery<Element>, scrollLeft: number) {\n const $div = $element.children(\".jqtree-element\");\n\n const elWidth = $element.width() || 0;\n const width = Math.max(elWidth + scrollLeft - 4, 0);\n\n const elHeight = $div.outerHeight() || 0;\n const height = Math.max(elHeight - 4, 0);\n\n this.$hint = jQuery('<span class=\"jqtree-border\"></span>');\n $div.append(this.$hint);\n\n this.$hint.css({ width, height });\n }\n\n public remove(): void {\n this.$hint.remove();\n }\n}\n\nclass GhostDropHint implements DropHint {\n private $element: JQuery<Element>;\n private node: Node;\n private $ghost: JQuery;\n\n constructor(node: Node, $element: JQuery<Element>, position: number) {\n this.$element = $element;\n\n this.node = node;\n this.$ghost = jQuery(\n `<li class=\"jqtree_common jqtree-ghost\"><span class=\"jqtree_common jqtree-circle\"></span>\n <span class=\"jqtree_common jqtree-line\"></span></li>`\n );\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 public moveAfter(): void {\n this.$element.after(this.$ghost);\n }\n\n public moveBefore(): void {\n this.$element.before(this.$ghost);\n }\n\n public moveInsideOpenFolder(): void {\n const childElement = this.node.children[0].element;\n\n if (childElement) {\n jQuery(childElement).before(this.$ghost);\n }\n }\n\n public moveInside(): void {\n this.$element.after(this.$ghost);\n this.$ghost.addClass(\"jqtree-inside\");\n }\n}\n","import __version__ from \"./version\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport DataLoader, { HandleFinishedLoading } from \"./dataLoader\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseWidget from \"./mouse.widget\";\nimport { PositionInfo } from \"./types\";\nimport SaveStateHandler, { SavedState } from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport SimpleWidget from \"./simple.widget\";\nimport { Node, getPosition } from \"./node\";\nimport { isFunction } from \"./util\";\nimport { FolderElement, NodeElement, OnFinishOpenNode } from \"./nodeElement\";\nimport { JQTreeOptions } from \"./jqtreeOptions\";\n\ninterface ClickTarget {\n node: Node;\n type: \"button\" | \"label\";\n}\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 MouseWidget<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: \"&#x25bc;\",\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 public element: JQuery;\n public tree: Node;\n public dndHandler: DragAndDropHandler;\n public renderer: ElementsRenderer;\n public dataLoader: DataLoader;\n public scrollHandler: ScrollHandler;\n public selectNodeHandler: SelectNodeHandler;\n\n private isInitialized: boolean;\n private saveStateHandler: SaveStateHandler;\n private keyHandler: KeyHandler;\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 element: HTMLElement | JQuery<HTMLElement>\n ): Node | null {\n return this.getNode(jQuery(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 | null] => {\n let onFinished: OnFinishOpenNode | null;\n let slide: boolean | null;\n\n if (isFunction(param1)) {\n onFinished = param1 as OnFinishOpenNode | null;\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._openNode(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 new FolderElement(node, this).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\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 nodeOffset = jQuery(node.element).offset();\n const nodeTop = nodeOffset ? nodeOffset.top : 0;\n\n const treeOffset = this.$el.offset();\n const treeTop = treeOffset ? treeOffset.top : 0;\n\n const top = nodeTop - treeTop;\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 public _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 public _openNode(\n node: Node,\n slide = true,\n onFinished: OnFinishOpenNode | null\n ): void {\n const doOpenNode = (\n _node: Node,\n _slide: boolean,\n _onFinished: OnFinishOpenNode | null\n ): void => {\n const folderElement = new FolderElement(_node, this);\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, null);\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 public _refreshElements(fromNode: Node | null): void {\n const mustSetFocus = this.selectNodeHandler.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 public _getNodeElementForNode(node: Node): NodeElement {\n if (node.isFolder()) {\n return new FolderElement(node, this);\n } else {\n return new NodeElement(node, this);\n }\n }\n\n public _getNodeElement($element: JQuery<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 _containsElement(element: HTMLElement): boolean {\n const node = this.getNode(jQuery(element));\n\n return node != null && node.tree === this.tree;\n }\n\n public _getScrollLeft(): number {\n return this.scrollHandler.getScrollLeft();\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.renderer = new ElementsRenderer(this);\n this.dataLoader = new DataLoader(this);\n this.saveStateHandler = new SaveStateHandler(this);\n this.selectNodeHandler = new SelectNodeHandler(this);\n this.dndHandler = new DragAndDropHandler(this);\n this.scrollHandler = new ScrollHandler(this);\n this.keyHandler = new KeyHandler(this);\n\n this.initData();\n\n this.element.on(\"click\", this.handleClick);\n this.element.on(\"dblclick\", this.handleDblclick);\n\n if (this.options.useContextMenu) {\n this.element.on(\"contextmenu\", this.handleContextmenu);\n }\n }\n\n public deinit(): void {\n this.element.empty();\n this.element.off();\n\n this.keyHandler.deinit();\n\n this.tree = new Node({}, true);\n\n super.deinit();\n }\n\n protected 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 protected mouseStart(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseStart(positionInfo);\n } else {\n return false;\n }\n }\n\n protected mouseDrag(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n const result = this.dndHandler.mouseDrag(positionInfo);\n\n this.scrollHandler.checkScrolling();\n return result;\n } else {\n return false;\n }\n }\n\n protected mouseStop(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseStop(positionInfo);\n } else {\n return false;\n }\n }\n\n protected getMouseDelay(): number {\n return this.options.startDndDelay ?? 0;\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[] => {\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._openNode(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._openNode(node, false, null);\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 handleClick = (\n e: JQuery.ClickEvent<HTMLElement, any, HTMLElement, HTMLElement>\n ): void => {\n const clickTarget = this.getClickTarget(e.target);\n\n if (clickTarget) {\n if (clickTarget.type === \"button\") {\n this.toggle(clickTarget.node, this.options.slide);\n\n e.preventDefault();\n e.stopPropagation();\n } else if (clickTarget.type === \"label\") {\n const node = clickTarget.node;\n const event = this._triggerEvent(\"tree.click\", {\n node,\n click_event: e,\n });\n\n if (!event.isDefaultPrevented()) {\n this.doSelectNode(node);\n }\n }\n }\n };\n\n private handleDblclick = (\n e: JQuery.DoubleClickEvent<HTMLElement, any, HTMLElement, HTMLElement>\n ): void => {\n const clickTarget = this.getClickTarget(e.target);\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 getClickTarget(element: EventTarget): ClickTarget | null {\n const $target = jQuery(element);\n\n const $button = $target.closest(\".jqtree-toggler\");\n\n if ($button.length) {\n const node = this.getNode($button as JQuery<HTMLElement>);\n\n if (node) {\n return {\n type: \"button\",\n node,\n };\n }\n } else {\n const $el = $target.closest(\".jqtree-element\");\n if ($el.length) {\n const node = this.getNode($el as JQuery<HTMLElement>);\n if (node) {\n return {\n type: \"label\",\n node,\n };\n }\n }\n }\n\n return null;\n }\n\n private getNode($element: JQuery<HTMLElement>): null | Node {\n const $li = $element.closest(\"li.jqtree_common\");\n if ($li.length === 0) {\n return null;\n } else {\n return $li.data(\"node\") as Node;\n }\n }\n\n private handleContextmenu = (\n e: JQuery.ContextMenuEvent<HTMLElement, any, HTMLElement, HTMLElement>\n ) => {\n const $div = jQuery(e.target).closest(\"ul.jqtree-tree .jqtree-element\");\n if ($div.length) {\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 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 \"&#x25c0;\";\n } else {\n // triangle to the right\n return \"&#x25ba;\";\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 const openParents = (): void => {\n const parent = node.parent;\n\n if (parent && parent.parent && !parent.is_open) {\n this.openNode(parent, false);\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 openParents();\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 | null\n ): void {\n node.is_loading = true;\n\n this.doLoadDataFromUrl(null, node, () => {\n this._openNode(node, slide, onFinished);\n });\n }\n}\n\nSimpleWidget.register(JqTreeWidget, \"tree\");\n"],"names":["Position","positionNames","before","Before","after","After","inside","Inside","none","None","getPositionName","position","name","Object","prototype","hasOwnProperty","call","isNodeRecordWithChildren","data","_typeof","Array","Node","o","isRoot","nodeClass","_classCallCheck","this","_defineProperty","isEmptyFolder","load_on_demand","setData","children","parent","idMapping","Map","tree","_createClass","key","value","removeChildren","_step","_iterator","_createForOfIteratorHelper","s","n","done","node","createNode","addChild","length","loadFromData","err","e","f","push","setParent","index","splice","doRemoveChild","indexOf","hasChildren","callback","_iterate","level","_step2","_iterator2","child","movedNode","targetNode","isParentOf","addChildAtPosition","getChildIndex","includeParent","getDataFromNodes","nodes","map","tmpNode","k","v","getNodeByCallback","concat","result","iterate","nodeInfo","childIndex","newParent","_step3","originalParent","_iterator3","removeChild","nodeId","get","id","set","_this","_this$tree","removeNodeFromIndex","previousIndex","nextIndex","filter","includeChildren","nextSibling","getNextSibling","getNextNode","is_open","previousSibling","getPreviousSibling","getLastChild","getParent","lastChild","nodeData","_this2","addChildren","childrenData","_step4","_iterator4","initFromData","_this$tree2","addNodeToIndex","_this$tree3","_this$tree4","getNodeClass","DragAndDropHandler","treeWidget","hoveredArea","hitAreas","isDragging","currentItem","positionInfo","$element","jQuery","target","mustCaptureElement","options","onIsMoveHandle","nodeElement","_getNodeElement","onCanMove","_this$treeWidget$opti","undefined","pageX","pageY","refresh","offset","left","top","dragElement","DragElement","element","autoEscape","addClass","move","area","findHoveredArea","canMoveToArea","isFolder","stopOpenFolderTimer","mustOpenFolderTimer","startOpenFolderTimer","updateDropHint","removeDropHint","onDragMove","originalEvent","moveItem","clear","removeHover","removeHitAreas","removeClass","onDragStop","generateHitAreas","_getNodeElementForNode","hitAreasGenerator","HitAreasGenerator","getTreeDimensions","bottom","generate","is","onCanMoveTo","positionName","remove","previousGhost","x","y","dimensions","right","low","high","mid","addDropHint","folder","openFolderDelay","openFolderTimer","window","setTimeout","_openNode","slide","clearTimeout","previousParent","doMove","moveNode","empty","_refreshElements","_triggerEvent","move_info","moved_node","target_node","previous_parent","do_move","original_event","isDefaultPrevented","el","width","height","_getScrollLeft","_VisibleNodeIterator","_inherits","_super","_createSuper","currentNode","treeBottom","_this4","_assertThisInitialized","positions","lastTop","previousTop","group","generateHitAreasForGroup","addPosition","getTop","nextNode","positionsInGroup","positionCount","Math","min","areaHeight","round","areaTop","i","VisibleNodeIterator","_this3","isFirstNode","_iterateNode","mustIterateInside","handleFirstNode","handleOpenFolder","handleClosedFolder","handleNode","childrenLength","forEach","_","handleAfterOpenFolder","nodeName","offsetX","offsetY","$tree","text","html","css","append","getBoolString","ElementsRenderer","openedIconElement","createButtonElement","openedIcon","closedIconElement","closedIcon","fromNode","renderFromNode","renderFromRoot","createDomElements","$previousLi","li","createLi","getLevel","attachNodeData","isRootNode","ul","createUl","appendChild","classString","role","rtl","dragAndDrop","document","createElement","className","setAttribute","isSelected","Boolean","selectNodeHandler","isNodeSelected","showEmptyFolder","createFolderLi","createNodeLi","onCreateLi","buttonClasses","getButtonClasses","folderClasses","getFolderClasses","iconElement","div","buttonLink","cloneNode","buttonLeft","createTitleSpan","liClasses","join","isOpen","titleSpan","classes","tabIndex","textContent","innerHTML","is_loading","createTextNode","DataLoader","urlInfo","parentNode","onFinished","$el","getDomElement","addLoadingClass","notifyLoading","stopLoading","removeLoadingClass","submitRequest","loadData","parseData","jqXHR","onLoadFailed","isLoading","onLoading","urlInfoInput","handleSuccess","handleError","_ajaxSettings$method","ajaxSettings","_objectSpread","method","cache","dataType","success","error","url","toUpperCase","ajax","dataFilter","parsedData","JSON","parse","KeyHandler","canHandleKeyboard","selectedNode","getSelectedNode","which","DOWN","moveDown","UP","moveUp","RIGHT","moveRight","LEFT","moveLeft","keyboardSupport","on","handleKeyDown","off","selectNode","getNextVisibleNode","getPreviousVisibleNode","openNode","closeNode","scrollHandler","isScrolledIntoView","find","scrollToNode","isFocusOnTree","register","widgetClass","widgetName","getDataKey","getWidgetData","dataKey","widget","SimpleWidget","createWidget","init","destroyWidget","destroy","removeData","callFunction","functionName","args","widgetFunction","apply","fn","argument1","_len","arguments","_key","defaults","constructor","deinit","getPositionInfoFromMouseEvent","getPositionInfoFromTouch","touch","MouseWidget","_SimpleWidget","button","handleMouseDown","cancelable","preventDefault","handleMouseMove","handleMouseUp","touches","changedTouches","addEventListener","mouseDown","passive","touchStart","isMouseStarted","mouseDelayTimer","isMouseDelayMet","mouseDownInfo","removeEventListener","removeMouseMoveEventListeners","mouseCapture","handleStartMouse","mouseMove","touchMove","mouseUp","touchEnd","mouseDelay","getMouseDelay","startMouseDelayTimer","mouseDrag","mouseStart","mouseStop","SaveStateHandler","state","stringify","getState","onSetStateFromStorage","supportsLocalStorage","localStorage","setItem","getKeyName","jsonData","loadFromStorage","parseState","selectedNodeIds","openNodes","open_nodes","selected_node","getSelectedNodes","mustLoadOnDemand","openInitialNodes","resetSelection","selectInitialNodes","cbFinished","doSetInitialStateOnDemand","getStateFromStorage","onGetStateFromStorage","getItem","nodeIds","getNodeById","selectCount","addToSelection","removeFromSelection","nodeIdsParam","selectedNodes","loadingCount","newNodesIds","loadAndOpenNode","saveState","_supportsLocalStorage","sessionStorage","removeItem","testSupport","ScrollHandler","isInitialized","ensureInit","checkVerticalScrolling","checkHorizontalScrolling","$scrollParent","scrollTop","treeTop","elementBottom","viewBottom","elementTop","viewTop","elHeight","scrollParentTop","scrollLeft","setDocumentAsScrollParent","cssAttributes","hasOverFlow","_i","_cssAttributes","attr","overflowValue","parents","getParentWithOverflow","tagName","initScrollParent","scrollParent","offsetHeight","refreshHitAreas","dndHandler","handleVerticalScrollingWithScrollParent","handleVerticalScrollingWithDocument","handleHorizontalScrollingWithParent","handleHorizontalScrollingWithDocument","scrollParentOffset","canScrollRight","clientWidth","scrollWidth","canScrollLeft","rightEdge","leftEdge","isNearRightEdge","isNearLeftEdge","max","$document","windowWidth","SelectNodeHandler","Set","selectedSingleNode","has","add","activeElement","_containsElement","NodeElement","mustShowBorderDropHint","BorderDropHint","GhostDropHint","mustSetFocus","$li","getLi","$span","getSpan","trigger","removeAttr","blur","FolderElement","_NodeElement","animationSpeed","$button","getButton","buttonEl","icon","renderer","doOpen","getUl","slideDown","show","doClose","slideUp","hide","$div","elWidth","outerHeight","$hint","$ghost","moveAfter","moveBefore","moveInsideOpenFolder","moveInside","childElement","NODE_PARAM_IS_EMPTY","PARAM_IS_EMPTY","JqTreeWidget","_MouseWidget","clickTarget","getClickTarget","type","toggle","stopPropagation","click_event","doSelectNode","closest","getNode","slideParam","Error","optionsParam","getData","doLoadData","param1","param2","param3","doLoadDataFromUrl","getNodeByName","getNodeByNameMustExist","getNodesByProperty","_parseParams","_this2$options$slide","parseParams","_parseParams2","_slicedToArray","close","newNodeInfo","existingNode","newNode","addAfter","addBefore","addParent","parentNodeParam","prepend","idIsChanged","subtree","positionIndex","saveStateHandler","select","deselect","nodeOffset","nodeTop","treeOffset","scrollToY","setInitialState","option","keyHandler","eventName","values","event","Event","doOpenNode","_node","_slide","_onFinished","open","loadFolderOnDemand","mustSelect","isSelectedNodeInSubtree","render","selectCurrentNode","getScrollLeft","_get","_getPrototypeOf","getRtlOption","getDefaultClosedIcon","dataLoader","initData","handleClick","handleDblclick","useContextMenu","handleContextmenu","checkScrolling","_this$options$startDn","startDndDelay","getDataUrlInfo","dataUrl","setUrlInfoData","selectedNodeId","getNodeIdToBeSelected","_this5","doInit","setInitialStateOnDemand","_this6","_restoreState2","restoreState","isRestored","autoOpen","maxLevel","getAutoOpenMaxLevel","autoOpenNodes","_this7","parseInt","$target","dataRtl","_this8","deselectCurrentNode","selectOptions","mustToggle","onCanSelectNode","selectable","previous_node","deselectedNode","deselected_node","deselectNodes","loadSubtree","initTree","tree_data","parent_node","getSelectedNodesUnder","urlInfoParam","loadFromUrl","_this9"],"mappings":"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"}