tree-element 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +12 -4
  2. package/lib/animation.d.ts +2 -2
  3. package/lib/animation.d.ts.map +1 -1
  4. package/lib/animation.js +13 -9
  5. package/lib/animation.js.map +1 -1
  6. package/lib/dataLoader.d.ts +1 -0
  7. package/lib/dataLoader.d.ts.map +1 -1
  8. package/lib/dataLoader.js +8 -0
  9. package/lib/dataLoader.js.map +1 -1
  10. package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -1
  11. package/lib/dragAndDropHandler/dragElement.js +2 -1
  12. package/lib/dragAndDropHandler/dragElement.js.map +1 -1
  13. package/lib/dragAndDropHandler/index.d.ts.map +1 -1
  14. package/lib/dragAndDropHandler/index.js +56 -65
  15. package/lib/dragAndDropHandler/index.js.map +1 -1
  16. package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
  17. package/lib/dragAndDropHandler/iterateVisibleNodes.js +16 -15
  18. package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
  19. package/lib/elementsRenderer.d.ts +5 -1
  20. package/lib/elementsRenderer.d.ts.map +1 -1
  21. package/lib/elementsRenderer.js +62 -39
  22. package/lib/elementsRenderer.js.map +1 -1
  23. package/lib/events.d.ts +44 -11
  24. package/lib/events.d.ts.map +1 -1
  25. package/lib/index.d.ts +31 -8
  26. package/lib/index.d.ts.map +1 -1
  27. package/lib/index.js +162 -122
  28. package/lib/index.js.map +1 -1
  29. package/lib/keyHandler.d.ts +11 -5
  30. package/lib/keyHandler.d.ts.map +1 -1
  31. package/lib/keyHandler.js +87 -33
  32. package/lib/keyHandler.js.map +1 -1
  33. package/lib/methodTypes.d.ts +2 -2
  34. package/lib/methodTypes.d.ts.map +1 -1
  35. package/lib/mouseHandler.d.ts +1 -1
  36. package/lib/mouseHandler.d.ts.map +1 -1
  37. package/lib/mouseHandler.js +10 -7
  38. package/lib/mouseHandler.js.map +1 -1
  39. package/lib/node.d.ts +45 -15
  40. package/lib/node.d.ts.map +1 -1
  41. package/lib/node.js +136 -139
  42. package/lib/node.js.map +1 -1
  43. package/lib/nodeElement/folderElement.d.ts +1 -1
  44. package/lib/nodeElement/folderElement.d.ts.map +1 -1
  45. package/lib/nodeElement/folderElement.js +46 -57
  46. package/lib/nodeElement/folderElement.js.map +1 -1
  47. package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
  48. package/lib/nodeElement/ghostDropHint.js +8 -4
  49. package/lib/nodeElement/ghostDropHint.js.map +1 -1
  50. package/lib/nodeElement/index.d.ts.map +1 -1
  51. package/lib/nodeElement/index.js +6 -6
  52. package/lib/nodeElement/index.js.map +1 -1
  53. package/lib/nodeUtils.d.ts.map +1 -1
  54. package/lib/nodeUtils.js +1 -1
  55. package/lib/nodeUtils.js.map +1 -1
  56. package/lib/options.d.ts +19 -3
  57. package/lib/options.d.ts.map +1 -1
  58. package/lib/requestUrl.d.ts.map +1 -1
  59. package/lib/requestUrl.js +2 -11
  60. package/lib/requestUrl.js.map +1 -1
  61. package/lib/saveStateHandler.d.ts.map +1 -1
  62. package/lib/saveStateHandler.js +21 -41
  63. package/lib/saveStateHandler.js.map +1 -1
  64. package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
  65. package/lib/scrollHandler/containerScrollParent.js +3 -8
  66. package/lib/scrollHandler/containerScrollParent.js.map +1 -1
  67. package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
  68. package/lib/scrollHandler/createScrollParent.js +4 -5
  69. package/lib/scrollHandler/createScrollParent.js.map +1 -1
  70. package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
  71. package/lib/scrollHandler/documentScrollParent.js +3 -9
  72. package/lib/scrollHandler/documentScrollParent.js.map +1 -1
  73. package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
  74. package/lib/scrollHandler/scrollParent.js +19 -17
  75. package/lib/scrollHandler/scrollParent.js.map +1 -1
  76. package/lib/selectNodeHandler.d.ts +3 -1
  77. package/lib/selectNodeHandler.d.ts.map +1 -1
  78. package/lib/selectNodeHandler.js +27 -37
  79. package/lib/selectNodeHandler.js.map +1 -1
  80. package/lib/setDefaultOptions.d.ts.map +1 -1
  81. package/lib/setDefaultOptions.js +11 -10
  82. package/lib/setDefaultOptions.js.map +1 -1
  83. package/lib/util.d.ts.map +1 -1
  84. package/lib/util.js +1 -1
  85. package/lib/util.js.map +1 -1
  86. package/lib/version.d.ts +1 -1
  87. package/lib/version.js +1 -1
  88. package/lib/version.js.map +1 -1
  89. package/package.json +42 -33
  90. package/src/animation.ts +13 -11
  91. package/src/dataLoader.ts +11 -0
  92. package/src/dragAndDropHandler/dragElement.ts +2 -1
  93. package/src/dragAndDropHandler/index.ts +70 -75
  94. package/src/dragAndDropHandler/iterateVisibleNodes.ts +18 -16
  95. package/src/elementsRenderer.ts +76 -46
  96. package/src/events.ts +44 -11
  97. package/src/index.ts +210 -150
  98. package/src/keyHandler.ts +95 -41
  99. package/src/methodTypes.ts +3 -3
  100. package/src/mouseHandler.ts +10 -7
  101. package/src/node.ts +155 -148
  102. package/src/nodeElement/folderElement.ts +54 -63
  103. package/src/nodeElement/ghostDropHint.ts +4 -2
  104. package/src/nodeElement/index.ts +9 -15
  105. package/src/nodeUtils.ts +1 -1
  106. package/src/options.ts +19 -3
  107. package/src/requestUrl.ts +4 -11
  108. package/src/saveStateHandler.ts +29 -43
  109. package/src/scrollHandler/containerScrollParent.ts +3 -9
  110. package/src/scrollHandler/createScrollParent.ts +1 -2
  111. package/src/scrollHandler/documentScrollParent.ts +5 -11
  112. package/src/scrollHandler/scrollParent.ts +29 -25
  113. package/src/selectNodeHandler.ts +34 -38
  114. package/src/setDefaultOptions.ts +19 -10
  115. package/src/util.ts +1 -2
  116. package/src/version.ts +1 -1
  117. package/tree_element.css +87 -69
  118. package/tree_element.debug.js +706 -639
  119. package/tree_element.debug.js.map +1 -1
  120. package/tree_element.js +2 -2
  121. package/tree_element.js.map +1 -1
package/README.md CHANGED
@@ -81,7 +81,9 @@ new TreeElement({
81
81
 
82
82
  | Option | Default | Description |
83
83
  | ----------------- | ----------------------- | --------------------------------------------------------------------------------- |
84
- | `animationSpeed` | `"fast"` | `"fast"`, `"slow"`, or a number of milliseconds |
84
+ | `animationSpeed` | `"fast"` | `"fast"`, `"slow"`, or a number of milliseconds. `0` for reduced motion |
85
+ | `ariaLabel` | | The accessible name of the tree |
86
+ | `ariaLabelledBy` | | The id of the element that names the tree |
85
87
  | `autoEscape` | `true` | Escape node names. Set to `false` to render html in a name |
86
88
  | `autoOpen` | `false` | `true` opens everything, a number opens that many levels (`0` is the first level) |
87
89
  | `buttonLeft` | `true` | Put the open/close button left of the title |
@@ -92,7 +94,7 @@ new TreeElement({
92
94
  | `dataFilter` | | Transforms the response of `dataUrl` into node data |
93
95
  | `dataUrl` | `data-url` attribute | Url, or a function returning a url |
94
96
  | `dragAndDrop` | `false` | Enable drag and drop |
95
- | `keyboardSupport` | `true` | Navigate with the arrow keys |
97
+ | `keyboardSupport` | `true` | Navigate with the keyboard |
96
98
  | `nodeClass` | `Node` | Subclass of `Node` to use for nodes |
97
99
  | `openFolderDelay` | `500` | Milliseconds before a folder opens while dragging over it. `false` disables it |
98
100
  | `openedIcon` | `▼` | Html string or element |
@@ -137,6 +139,7 @@ element.addEventListener("tree.select", (e) => {
137
139
  | `tree.click` | `node`, `originalEvent` |
138
140
  | `tree.dblclick` | `node`, `originalEvent` |
139
141
  | `tree.contextmenu` | `node`, `originalEvent` |
142
+ | `tree.activate` | `node`, `originalEvent` |
140
143
  | `tree.select` | `node`, `deselectedNode` |
141
144
  | `tree.deselect` | `node` |
142
145
  | `tree.open` | `node` |
@@ -162,7 +165,8 @@ Nodes are `Node` instances. Get one with `getNodeById`, `getNodeByName`,
162
165
 
163
166
  **Nodes**: `appendNode(data, parentNode)`, `prependNode(data, parentNode)`, `addNodeAfter(data, node)`, `addNodeBefore(data, node)`, `addParentNode(data, node)`, `updateNode(node, data)`, `removeNode(node)`, `moveNode(node, targetNode, position)`
164
167
 
165
- **Opening**: `openNode(node, slide?)`, `closeNode(node, slide?)`, `toggle(node, slide?)`
168
+ **Opening**: `openNode(node, slide?)`, `closeNode(node, slide?)`, `toggle(node, slide?)`.
169
+ `openNode`, `closeNode` and `toggle` return a promise that is resolved when the folder is open or closed.
166
170
 
167
171
  **Selection**: `selectNode(node, options?)`, `getSelectedNode()`, `getSelectedNodes()`, `isNodeSelected(node)`, `addToSelection(node, mustSetFocus?)`, `removeFromSelection(node)`, `moveUp()`, `moveDown()`
168
172
 
@@ -218,7 +222,11 @@ pnpm docs-check # type-check the code snippets in the docs
218
222
  pnpm ci # lint, typecheck, check the docs and test
219
223
  ```
220
224
 
221
- `pnpm test` runs the vitest unit tests and the playwright browser tests.
225
+ `pnpm test` runs the vitest unit tests and the playwright browser tests. The
226
+ browser tests include accessibility checks: axe scans the rendered tree
227
+ (including color contrast) and keyboard-only tests cover tabbing into the tree,
228
+ the arrow keys, `Home`, `End` and `Enter`. They are in
229
+ `playwright/accessibility.test.ts`.
222
230
 
223
231
  ### Releasing
224
232
 
@@ -1,5 +1,5 @@
1
1
  export type AnimationSpeed = "fast" | "slow" | number;
2
2
  export declare const getAnimationDuration: (duration: AnimationSpeed) => number;
3
- export declare const slideDown: (element: HTMLElement, animationSpeed: AnimationSpeed, onFinished: () => void) => void;
4
- export declare const slideUp: (element: HTMLElement, animationSpeed: AnimationSpeed, onFinished: () => void) => void;
3
+ export declare const slideDown: (element: HTMLElement, animationSpeed: AnimationSpeed) => Promise<void>;
4
+ export declare const slideUp: (element: HTMLElement, animationSpeed: AnimationSpeed) => Promise<void>;
5
5
  //# sourceMappingURL=animation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"animation.d.ts","sourceRoot":"","sources":["../src/animation.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtD,eAAO,MAAM,oBAAoB,GAAI,UAAU,cAAc,KAAG,MAM/D,CAAC;AAEF,eAAO,MAAM,SAAS,GACpB,SAAS,WAAW,EACpB,gBAAgB,cAAc,EAC9B,YAAY,MAAM,IAAI,KACrB,IAcF,CAAC;AAEF,eAAO,MAAM,OAAO,GAClB,SAAS,WAAW,EACpB,gBAAgB,cAAc,EAC9B,YAAY,MAAM,IAAI,KACrB,IAaF,CAAC"}
1
+ {"version":3,"file":"animation.d.ts","sourceRoot":"","sources":["../src/animation.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtD,eAAO,MAAM,oBAAoB,GAAI,UAAU,cAAc,KAAG,MAM/D,CAAC;AAEF,eAAO,MAAM,SAAS,GACpB,SAAS,WAAW,EACpB,gBAAgB,cAAc,KAC7B,OAAO,CAAC,IAAI,CAgBd,CAAC;AAEF,eAAO,MAAM,OAAO,GAClB,SAAS,WAAW,EACpB,gBAAgB,cAAc,KAC7B,OAAO,CAAC,IAAI,CAed,CAAC"}
package/lib/animation.js CHANGED
@@ -4,7 +4,7 @@ let getAnimationDuration = duration => {
4
4
  }
5
5
  return duration === "slow" ? 600 : 200;
6
6
  };
7
- let slideDown = (element, animationSpeed, onFinished) => {
7
+ let slideDown = (element, animationSpeed) => {
8
8
  element.style.display = "block";
9
9
  let animation = element.animate([{
10
10
  height: "0",
@@ -15,11 +15,13 @@ let slideDown = (element, animationSpeed, onFinished) => {
15
15
  }], {
16
16
  duration: getAnimationDuration(animationSpeed)
17
17
  });
18
- animation.onfinish = () => {
19
- onFinished();
20
- };
18
+ return new Promise(resolve => {
19
+ animation.onfinish = () => {
20
+ resolve();
21
+ };
22
+ });
21
23
  };
22
- let slideUp = (element, animationSpeed, onFinished) => {
24
+ let slideUp = (element, animationSpeed) => {
23
25
  let animation = element.animate([{
24
26
  height: `${element.scrollHeight}px`,
25
27
  overflow: "hidden"
@@ -29,10 +31,12 @@ let slideUp = (element, animationSpeed, onFinished) => {
29
31
  }], {
30
32
  duration: getAnimationDuration(animationSpeed)
31
33
  });
32
- animation.onfinish = () => {
33
- element.style.display = "none";
34
- onFinished();
35
- };
34
+ return new Promise(resolve => {
35
+ animation.onfinish = () => {
36
+ element.style.display = "none";
37
+ resolve();
38
+ };
39
+ });
36
40
  };
37
41
 
38
42
  export { getAnimationDuration, slideDown, slideUp };
@@ -1 +1 @@
1
- {"version":3,"file":"animation.js","sources":["../src/animation.ts"],"sourcesContent":["export type AnimationSpeed = \"fast\" | \"slow\" | number;\n\nexport const getAnimationDuration = (duration: AnimationSpeed): number => {\n if (typeof duration === \"number\") {\n return duration;\n }\n\n return duration === \"slow\" ? 600 : 200;\n};\n\nexport const slideDown = (\n element: HTMLElement,\n animationSpeed: AnimationSpeed,\n onFinished: () => void,\n): void => {\n element.style.display = \"block\";\n\n const animation = element.animate(\n [\n { height: \"0\", overflow: \"hidden\" },\n { height: `${element.scrollHeight}px`, overflow: \"hidden\" },\n ],\n { duration: getAnimationDuration(animationSpeed) },\n );\n\n animation.onfinish = () => {\n onFinished();\n };\n};\n\nexport const slideUp = (\n element: HTMLElement,\n animationSpeed: AnimationSpeed,\n onFinished: () => void,\n): void => {\n const animation = element.animate(\n [\n { height: `${element.scrollHeight}px`, overflow: \"hidden\" },\n { height: \"0\", overflow: \"hidden\" },\n ],\n { duration: getAnimationDuration(animationSpeed) },\n );\n\n animation.onfinish = () => {\n element.style.display = \"none\";\n onFinished();\n };\n};\n"],"names":[],"mappings":"AAEO,IAAM,oBAAoB,GAAI,QAAwB,IAAa;AACxE,EAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAChC,IAAA,OAAO,QAAQ;AACjB,EAAA;AAEA,EAAA,OAAO,QAAQ,KAAK,MAAM,GAAG,GAAG,GAAG,GAAG;AACxC;AAEO,IAAM,SAAS,GAAG,CACvB,OAAoB,EACpB,cAA8B,EAC9B,UAAsB,KACb;AACT,EAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO;AAE/B,EAAA,IAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAC/B,CACE;AAAE,IAAA,MAAM,EAAE,GAAG;AAAE,IAAA,QAAQ,EAAE;AAAS,GAAC,EACnC;AAAE,IAAA,MAAM,EAAE,CAAA,EAAG,OAAO,CAAC,YAAY,CAAA,EAAA,CAAI;AAAE,IAAA,QAAQ,EAAE;AAAS,GAAC,CAC5D,EACD;IAAE,QAAQ,EAAE,oBAAoB,CAAC,cAAc;AAAE,GACnD,CAAC;EAED,SAAS,CAAC,QAAQ,GAAG,MAAM;AACzB,IAAA,UAAU,EAAE;EACd,CAAC;AACH;AAEO,IAAM,OAAO,GAAG,CACrB,OAAoB,EACpB,cAA8B,EAC9B,UAAsB,KACb;AACT,EAAA,IAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAC/B,CACE;AAAE,IAAA,MAAM,EAAE,CAAA,EAAG,OAAO,CAAC,YAAY,CAAA,EAAA,CAAI;AAAE,IAAA,QAAQ,EAAE;AAAS,GAAC,EAC3D;AAAE,IAAA,MAAM,EAAE,GAAG;AAAE,IAAA,QAAQ,EAAE;AAAS,GAAC,CACpC,EACD;IAAE,QAAQ,EAAE,oBAAoB,CAAC,cAAc;AAAE,GACnD,CAAC;EAED,SAAS,CAAC,QAAQ,GAAG,MAAM;AACzB,IAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC9B,IAAA,UAAU,EAAE;EACd,CAAC;AACH;;"}
1
+ {"version":3,"file":"animation.js","sources":["../src/animation.ts"],"sourcesContent":["export type AnimationSpeed = \"fast\" | \"slow\" | number;\n\nexport const getAnimationDuration = (duration: AnimationSpeed): number => {\n if (typeof duration === \"number\") {\n return duration;\n }\n\n return duration === \"slow\" ? 600 : 200;\n};\n\nexport const slideDown = (\n element: HTMLElement,\n animationSpeed: AnimationSpeed,\n): Promise<void> => {\n element.style.display = \"block\";\n\n const animation = element.animate(\n [\n { height: \"0\", overflow: \"hidden\" },\n { height: `${element.scrollHeight}px`, overflow: \"hidden\" },\n ],\n { duration: getAnimationDuration(animationSpeed) },\n );\n\n return new Promise((resolve) => {\n animation.onfinish = () => {\n resolve();\n };\n });\n};\n\nexport const slideUp = (\n element: HTMLElement,\n animationSpeed: AnimationSpeed,\n): Promise<void> => {\n const animation = element.animate(\n [\n { height: `${element.scrollHeight}px`, overflow: \"hidden\" },\n { height: \"0\", overflow: \"hidden\" },\n ],\n { duration: getAnimationDuration(animationSpeed) },\n );\n\n return new Promise((resolve) => {\n animation.onfinish = () => {\n element.style.display = \"none\";\n resolve();\n };\n });\n};\n"],"names":[],"mappings":"AAEO,IAAM,oBAAoB,GAAI,QAAwB,IAAa;AACxE,EAAA,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAChC,IAAA,OAAO,QAAQ;AACjB,EAAA;AAEA,EAAA,OAAO,QAAQ,KAAK,MAAM,GAAG,GAAG,GAAG,GAAG;AACxC;IAEa,SAAS,GAAG,CACvB,OAAoB,EACpB,cAA8B,KACZ;AAClB,EAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO;AAE/B,EAAA,IAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAC/B,CACE;AAAE,IAAA,MAAM,EAAE,GAAG;AAAE,IAAA,QAAQ,EAAE;AAAS,GAAC,EACnC;AAAE,IAAA,MAAM,EAAE,CAAA,EAAG,OAAO,CAAC,YAAY,CAAA,EAAA,CAAI;AAAE,IAAA,QAAQ,EAAE;AAAS,GAAC,CAC5D,EACD;IAAE,QAAQ,EAAE,oBAAoB,CAAC,cAAc;AAAE,GACnD,CAAC;AAED,EAAA,OAAO,IAAI,OAAO,CAAE,OAAO,IAAK;IAC9B,SAAS,CAAC,QAAQ,GAAG,MAAM;AACzB,MAAA,OAAO,EAAE;IACX,CAAC;AACH,EAAA,CAAC,CAAC;AACJ;IAEa,OAAO,GAAG,CACrB,OAAoB,EACpB,cAA8B,KACZ;AAClB,EAAA,IAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAC/B,CACE;AAAE,IAAA,MAAM,EAAE,CAAA,EAAG,OAAO,CAAC,YAAY,CAAA,EAAA,CAAI;AAAE,IAAA,QAAQ,EAAE;AAAS,GAAC,EAC3D;AAAE,IAAA,MAAM,EAAE,GAAG;AAAE,IAAA,QAAQ,EAAE;AAAS,GAAC,CACpC,EACD;IAAE,QAAQ,EAAE,oBAAoB,CAAC,cAAc;AAAE,GACnD,CAAC;AAED,EAAA,OAAO,IAAI,OAAO,CAAE,OAAO,IAAK;IAC9B,SAAS,CAAC,QAAQ,GAAG,MAAM;AACzB,MAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC9B,MAAA,OAAO,EAAE;IACX,CAAC;AACH,EAAA,CAAC,CAAC;AACJ;;"}
@@ -20,6 +20,7 @@ export default class DataLoader {
20
20
  constructor({ classNames, dataFilter, loadData, treeElement, triggerEvent, }: DataLoaderParams);
21
21
  deinit(): void;
22
22
  loadFromUrl(url: RequestUrl, node?: Node): Promise<void>;
23
+ private getTitleSpan;
23
24
  }
24
25
  export {};
25
26
  //# sourceMappingURL=dataLoader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dataLoader.d.ts","sourceRoot":"","sources":["../src/dataLoader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAE3C,UAAU,gBAAgB;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAe;gBAEvB,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,YAAY,GACb,EAAE,gBAAgB;IASZ,MAAM,IAAI,IAAI;IAIR,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAgDtE"}
1
+ {"version":3,"file":"dataLoader.d.ts","sourceRoot":"","sources":["../src/dataLoader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAE3C,UAAU,gBAAgB;IACxB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAe;gBAEvB,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,YAAY,GACb,EAAE,gBAAgB;IASZ,MAAM,IAAI,IAAI;IAIR,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAsDrE,OAAO,CAAC,YAAY;CAKrB"}
package/lib/dataLoader.js CHANGED
@@ -19,12 +19,17 @@ class DataLoader {
19
19
  async _loadFromUrl(url, node) {
20
20
  let element = node?.element ?? this._treeElement;
21
21
  element.classList.add(this._classNames.loading);
22
+
23
+ // Tell screen readers that the children of the folder are loading
24
+ let titleSpan = node ? this._getTitleSpan(element) : null;
25
+ titleSpan?.setAttribute("aria-busy", "true");
22
26
  this._triggerEvent("tree.loading_data", {
23
27
  element,
24
28
  node
25
29
  });
26
30
  let stopLoading = () => {
27
31
  element.classList.remove(this._classNames.loading);
32
+ titleSpan?.removeAttribute("aria-busy");
28
33
  this._triggerEvent("tree.loaded_data", {
29
34
  element,
30
35
  node
@@ -60,6 +65,9 @@ class DataLoader {
60
65
  });
61
66
  });
62
67
  }
68
+ _getTitleSpan(element) {
69
+ return element.querySelector(`:scope > .${this._classNames.element} > .${this._classNames.title}`);
70
+ }
63
71
  }
64
72
 
65
73
  export { DataLoader as default };
@@ -1 +1 @@
1
- {"version":3,"file":"dataLoader.js","sources":["../src/dataLoader.ts"],"sourcesContent":["import type { ClassNames } from \"./classNames\";\nimport type { LoadData, TriggerEvent } from \"./methodTypes\";\nimport type { Node, NodeData } from \"./node\";\nimport type { DataFilter } from \"./options\";\nimport type RequestUrl from \"./requestUrl\";\n\ninterface DataLoaderParams {\n classNames: ClassNames;\n dataFilter?: DataFilter;\n loadData: LoadData;\n treeElement: HTMLElement;\n triggerEvent: TriggerEvent;\n}\n\nexport default class DataLoader {\n private abortController: AbortController;\n private classNames: ClassNames;\n private dataFilter?: DataFilter;\n private loadData: LoadData;\n private treeElement: HTMLElement;\n private triggerEvent: TriggerEvent;\n\n constructor({\n classNames,\n dataFilter,\n loadData,\n treeElement,\n triggerEvent,\n }: DataLoaderParams) {\n this.abortController = new AbortController();\n this.classNames = classNames;\n this.dataFilter = dataFilter;\n this.loadData = loadData;\n this.treeElement = treeElement;\n this.triggerEvent = triggerEvent;\n }\n\n public deinit(): void {\n this.abortController.abort();\n }\n\n public async loadFromUrl(url: RequestUrl, node?: Node): Promise<void> {\n const element = node?.element ?? this.treeElement;\n element.classList.add(this.classNames.loading);\n\n this.triggerEvent(\"tree.loading_data\", {\n element,\n node,\n });\n\n const stopLoading = (): void => {\n element.classList.remove(this.classNames.loading);\n this.triggerEvent(\"tree.loaded_data\", {\n element,\n node,\n });\n };\n\n const handleResponse = async (response: Response): Promise<void> => {\n if (response.ok) {\n const data = (await response.json()) as NodeData[];\n\n stopLoading();\n this.loadData(this.dataFilter ? this.dataFilter(data) : data, node);\n } else {\n stopLoading();\n\n this.triggerEvent(\"tree.load_failed\", { response });\n }\n };\n\n const signal = this.abortController.signal;\n url.setSearchParam(\"_\", Date.now().toString());\n\n return fetch(url.value(), {\n headers: { \"Content-Type\": \"application/json\" },\n signal,\n })\n .then(handleResponse)\n .catch((error: unknown) => {\n if (this.abortController.signal.aborted) {\n // The request was aborted by deinit.\n return;\n }\n\n stopLoading();\n this.triggerEvent(\"tree.load_failed\", { error });\n });\n }\n}\n"],"names":["abortController","classNames","dataFilter","loadData","treeElement","triggerEvent","deinit","loadFromUrl","setSearchParam","value"],"mappings":"AAce,MAAM,UAAU,CAAC;AAQ9B,EAAA,WAAW,CAAC;IACV,WAAA,EAAA,UAAU;IACV,WAAA,EAAA,UAAU;IACV,SAAA,EAAA,QAAQ;IACR,YAAA,EAAA,WAAW;AACX,IAAA,aAAA,EAAA;AACgB,GAAC,EAAE;AACnB,IAAA,IAAI,CAACA,gBAAe,GAAG,IAAI,eAAe,EAAE;IAC5C,IAAI,CAACC,WAAU,GAAG,UAAU;IAC5B,IAAI,CAACC,WAAU,GAAG,UAAU;IAC5B,IAAI,CAACC,SAAQ,GAAG,QAAQ;IACxB,IAAI,CAACC,YAAW,GAAG,WAAW;IAC9B,IAAI,CAACC,aAAY,GAAG,YAAY;AAClC,EAAA;AAEOC,EAAAA,OAAMA,GAAS;AACpB,IAAA,IAAI,CAACN,gBAAe,CAAC,KAAK,EAAE;AAC9B,EAAA;AAEA,EAAA,MAAaO,YAAWA,CAAC,GAAe,EAAE,IAAW,EAAiB;IACpE,IAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,CAACH,YAAW;IACjD,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAACH,WAAU,CAAC,OAAO,CAAC;AAE9C,IAAA,IAAI,CAACI,aAAY,CAAC,mBAAmB,EAAE;MACrC,OAAO;AACP,MAAA;AACF,KAAC,CAAC;IAEF,IAAM,WAAW,GAAG,MAAY;MAC9B,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAACJ,WAAU,CAAC,OAAO,CAAC;AACjD,MAAA,IAAI,CAACI,aAAY,CAAC,kBAAkB,EAAE;QACpC,OAAO;AACP,QAAA;AACF,OAAC,CAAC;IACJ,CAAC;AAED,IAAA,IAAM,cAAc,GAAG,MAAO,QAAkB,IAAoB;MAClE,IAAI,QAAQ,CAAC,EAAE,EAAE;AACf,QAAA,IAAM,IAAI,GAAI,MAAM,QAAQ,CAAC,IAAI,EAAiB;AAElD,QAAA,WAAW,EAAE;AACb,QAAA,IAAI,CAACF,SAAQ,CAAC,IAAI,CAACD,WAAU,GAAG,IAAI,CAACA,WAAU,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC;AACrE,MAAA,CAAC,MAAM;AACL,QAAA,WAAW,EAAE;AAEb,QAAA,IAAI,CAACG,aAAY,CAAC,kBAAkB,EAAE;AAAE,UAAA;AAAS,SAAC,CAAC;AACrD,MAAA;IACF,CAAC;AAED,IAAA,IAAM,MAAM,GAAG,IAAI,CAACL,gBAAe,CAAC,MAAM;AAC1C,IAAA,GAAG,CAACQ,eAAc,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;AAE9C,IAAA,OAAO,KAAK,CAAC,GAAG,CAACC,MAAK,EAAE,EAAE;AACxB,MAAA,OAAO,EAAE;AAAE,QAAA,cAAc,EAAE;OAAoB;AAC/C,MAAA;KACD,CAAC,CACC,IAAI,CAAC,cAAc,CAAC,CACpB,KAAK,CAAE,KAAc,IAAK;AACzB,MAAA,IAAI,IAAI,CAACT,gBAAe,CAAC,MAAM,CAAC,OAAO,EAAE;AACvC;AACA,QAAA;AACF,MAAA;AAEA,MAAA,WAAW,EAAE;AACb,MAAA,IAAI,CAACK,aAAY,CAAC,kBAAkB,EAAE;AAAE,QAAA;AAAM,OAAC,CAAC;AAClD,IAAA,CAAC,CAAC;AACN,EAAA;AACF;;"}
1
+ {"version":3,"file":"dataLoader.js","sources":["../src/dataLoader.ts"],"sourcesContent":["import type { ClassNames } from \"./classNames\";\nimport type { LoadData, TriggerEvent } from \"./methodTypes\";\nimport type { Node, NodeData } from \"./node\";\nimport type { DataFilter } from \"./options\";\nimport type RequestUrl from \"./requestUrl\";\n\ninterface DataLoaderParams {\n classNames: ClassNames;\n dataFilter?: DataFilter;\n loadData: LoadData;\n treeElement: HTMLElement;\n triggerEvent: TriggerEvent;\n}\n\nexport default class DataLoader {\n private abortController: AbortController;\n private classNames: ClassNames;\n private dataFilter?: DataFilter;\n private loadData: LoadData;\n private treeElement: HTMLElement;\n private triggerEvent: TriggerEvent;\n\n constructor({\n classNames,\n dataFilter,\n loadData,\n treeElement,\n triggerEvent,\n }: DataLoaderParams) {\n this.abortController = new AbortController();\n this.classNames = classNames;\n this.dataFilter = dataFilter;\n this.loadData = loadData;\n this.treeElement = treeElement;\n this.triggerEvent = triggerEvent;\n }\n\n public deinit(): void {\n this.abortController.abort();\n }\n\n public async loadFromUrl(url: RequestUrl, node?: Node): Promise<void> {\n const element = node?.element ?? this.treeElement;\n element.classList.add(this.classNames.loading);\n\n // Tell screen readers that the children of the folder are loading\n const titleSpan = node ? this.getTitleSpan(element) : null;\n titleSpan?.setAttribute(\"aria-busy\", \"true\");\n\n this.triggerEvent(\"tree.loading_data\", {\n element,\n node,\n });\n\n const stopLoading = (): void => {\n element.classList.remove(this.classNames.loading);\n titleSpan?.removeAttribute(\"aria-busy\");\n this.triggerEvent(\"tree.loaded_data\", {\n element,\n node,\n });\n };\n\n const handleResponse = async (response: Response): Promise<void> => {\n if (response.ok) {\n const data = (await response.json()) as NodeData[];\n\n stopLoading();\n this.loadData(this.dataFilter ? this.dataFilter(data) : data, node);\n } else {\n stopLoading();\n\n this.triggerEvent(\"tree.load_failed\", { response });\n }\n };\n\n const signal = this.abortController.signal;\n url.setSearchParam(\"_\", Date.now().toString());\n\n return fetch(url.value(), {\n headers: { \"Content-Type\": \"application/json\" },\n signal,\n })\n .then(handleResponse)\n .catch((error: unknown) => {\n if (this.abortController.signal.aborted) {\n // The request was aborted by deinit.\n return;\n }\n\n stopLoading();\n this.triggerEvent(\"tree.load_failed\", { error });\n });\n }\n\n private getTitleSpan(element: HTMLElement): HTMLElement | null {\n return element.querySelector<HTMLElement>(\n `:scope > .${this.classNames.element} > .${this.classNames.title}`,\n );\n }\n}\n"],"names":["abortController","classNames","dataFilter","loadData","treeElement","triggerEvent","deinit","loadFromUrl","getTitleSpan","setSearchParam","value"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dragElement.d.ts","sourceRoot":"","sources":["../../src/dragAndDropHandler/dragElement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,UAAU,iBAAiB;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,cAAM,WAAW;IACf,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;gBAEZ,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,OAAO,EACP,OAAO,EACP,WAAW,GACZ,EAAE,iBAAiB;IASb,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKxC,MAAM,IAAI,IAAI;IAIrB,OAAO,CAAC,aAAa;CAkBtB;AAED,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"dragElement.d.ts","sourceRoot":"","sources":["../../src/dragAndDropHandler/dragElement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,UAAU,iBAAiB;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,cAAM,WAAW;IACf,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;gBAEZ,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,OAAO,EACP,OAAO,EACP,WAAW,GACZ,EAAE,iBAAiB;IASb,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKxC,MAAM,IAAI,IAAI;IAIrB,OAAO,CAAC,aAAa;CAmBtB;AAED,eAAe,WAAW,CAAC"}
@@ -10,7 +10,7 @@ class DragElement {
10
10
  this._offsetX = offsetX;
11
11
  this._offsetY = offsetY;
12
12
  this._element = this._createElement(nodeName, autoEscape, classNames);
13
- treeElement.appendChild(this._element);
13
+ treeElement.append(this._element);
14
14
  }
15
15
  _move(pageX, pageY) {
16
16
  this._element.style.left = `${pageX - this._offsetX}px`;
@@ -25,6 +25,7 @@ class DragElement {
25
25
  if (autoEscape) {
26
26
  element.textContent = nodeName;
27
27
  } else {
28
+ // eslint-disable-next-line no-unsanitized/property -- the user opted out of escaping with autoEscape: false
28
29
  element.innerHTML = nodeName;
29
30
  }
30
31
  element.style.position = "absolute";
@@ -1 +1 @@
1
- {"version":3,"file":"dragElement.js","sources":["../../src/dragAndDropHandler/dragElement.ts"],"sourcesContent":["import type { ClassNames } from \"../classNames\";\n\ninterface DragElementParams {\n autoEscape: boolean;\n classNames: ClassNames;\n nodeName: string;\n offsetX: number;\n offsetY: number;\n treeElement: HTMLElement;\n}\n\nclass DragElement {\n private element: HTMLElement;\n private offsetX: number;\n private offsetY: number;\n\n constructor({\n autoEscape,\n classNames,\n nodeName,\n offsetX,\n offsetY,\n treeElement,\n }: DragElementParams) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n this.element = this.createElement(nodeName, autoEscape, classNames);\n\n treeElement.appendChild(this.element);\n }\n\n public move(pageX: number, pageY: number): void {\n this.element.style.left = `${pageX - this.offsetX}px`;\n this.element.style.top = `${pageY - this.offsetY}px`;\n }\n\n public remove(): void {\n this.element.remove();\n }\n\n private createElement(\n nodeName: string,\n autoEscape: boolean,\n classNames: ClassNames,\n ) {\n const element = document.createElement(\"span\");\n element.classList.add(classNames.title, classNames.dragging);\n\n if (autoEscape) {\n element.textContent = nodeName;\n } else {\n element.innerHTML = nodeName;\n }\n\n element.style.position = \"absolute\";\n\n return element;\n }\n}\n\nexport default DragElement;\n"],"names":["offsetX","offsetY","element","createElement","move","remove"],"mappings":"AAWA,MAAM,WAAW,CAAC;AAKhB,EAAA,WAAW,CAAC;IACV,WAAA,EAAA,UAAU;IACV,WAAA,EAAA,UAAU;IACV,SAAA,EAAA,QAAQ;IACR,QAAA,EAAA,OAAO;IACP,QAAA,EAAA,OAAO;AACP,IAAA,YAAA,EAAA;AACiB,GAAC,EAAE;IACpB,IAAI,CAACA,QAAO,GAAG,OAAO;IACtB,IAAI,CAACC,QAAO,GAAG,OAAO;AAEtB,IAAA,IAAI,CAACC,QAAO,GAAG,IAAI,CAACC,cAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC;AAEnE,IAAA,WAAW,CAAC,WAAW,CAAC,IAAI,CAACD,QAAO,CAAC;AACvC,EAAA;AAEOE,EAAAA,KAAIA,CAAC,KAAa,EAAE,KAAa,EAAQ;AAC9C,IAAA,IAAI,CAACF,QAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,KAAK,GAAG,IAAI,CAACF,QAAO,CAAA,EAAA,CAAI;AACrD,IAAA,IAAI,CAACE,QAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,KAAK,GAAG,IAAI,CAACD,QAAO,CAAA,EAAA,CAAI;AACtD,EAAA;AAEOI,EAAAA,OAAMA,GAAS;AACpB,IAAA,IAAI,CAACH,QAAO,CAAC,MAAM,EAAE;AACvB,EAAA;AAEQC,EAAAA,cAAaA,CACnB,QAAgB,EAChB,UAAmB,EACnB,UAAsB,EACtB;AACA,IAAA,IAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AAC9C,IAAA,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC;AAE5D,IAAA,IAAI,UAAU,EAAE;MACd,OAAO,CAAC,WAAW,GAAG,QAAQ;AAChC,IAAA,CAAC,MAAM;MACL,OAAO,CAAC,SAAS,GAAG,QAAQ;AAC9B,IAAA;AAEA,IAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AAEnC,IAAA,OAAO,OAAO;AAChB,EAAA;AACF;;"}
1
+ {"version":3,"file":"dragElement.js","sources":["../../src/dragAndDropHandler/dragElement.ts"],"sourcesContent":["import type { ClassNames } from \"../classNames\";\n\ninterface DragElementParams {\n autoEscape: boolean;\n classNames: ClassNames;\n nodeName: string;\n offsetX: number;\n offsetY: number;\n treeElement: HTMLElement;\n}\n\nclass DragElement {\n private element: HTMLElement;\n private offsetX: number;\n private offsetY: number;\n\n constructor({\n autoEscape,\n classNames,\n nodeName,\n offsetX,\n offsetY,\n treeElement,\n }: DragElementParams) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n this.element = this.createElement(nodeName, autoEscape, classNames);\n\n treeElement.append(this.element);\n }\n\n public move(pageX: number, pageY: number): void {\n this.element.style.left = `${pageX - this.offsetX}px`;\n this.element.style.top = `${pageY - this.offsetY}px`;\n }\n\n public remove(): void {\n this.element.remove();\n }\n\n private createElement(\n nodeName: string,\n autoEscape: boolean,\n classNames: ClassNames,\n ) {\n const element = document.createElement(\"span\");\n element.classList.add(classNames.title, classNames.dragging);\n\n if (autoEscape) {\n element.textContent = nodeName;\n } else {\n // eslint-disable-next-line no-unsanitized/property -- the user opted out of escaping with autoEscape: false\n element.innerHTML = nodeName;\n }\n\n element.style.position = \"absolute\";\n\n return element;\n }\n}\n\nexport default DragElement;\n"],"names":["offsetX","offsetY","element","createElement","move","remove"],"mappings":"AAWA,MAAM,WAAW,CAAC;AAKhB,EAAA,WAAW,CAAC;IACV,WAAA,EAAA,UAAU;IACV,WAAA,EAAA,UAAU;IACV,SAAA,EAAA,QAAQ;IACR,QAAA,EAAA,OAAO;IACP,QAAA,EAAA,OAAO;AACP,IAAA,YAAA,EAAA;AACiB,GAAC,EAAE;IACpB,IAAI,CAACA,QAAO,GAAG,OAAO;IACtB,IAAI,CAACC,QAAO,GAAG,OAAO;AAEtB,IAAA,IAAI,CAACC,QAAO,GAAG,IAAI,CAACC,cAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC;AAEnE,IAAA,WAAW,CAAC,MAAM,CAAC,IAAI,CAACD,QAAO,CAAC;AAClC,EAAA;AAEOE,EAAAA,KAAIA,CAAC,KAAa,EAAE,KAAa,EAAQ;AAC9C,IAAA,IAAI,CAACF,QAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,KAAK,GAAG,IAAI,CAACF,QAAO,CAAA,EAAA,CAAI;AACrD,IAAA,IAAI,CAACE,QAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,KAAK,GAAG,IAAI,CAACD,QAAO,CAAA,EAAA,CAAI;AACtD,EAAA;AAEOI,EAAAA,OAAMA,GAAS;AACpB,IAAA,IAAI,CAACH,QAAO,CAAC,MAAM,EAAE;AACvB,EAAA;AAEQC,EAAAA,cAAaA,CACnB,QAAgB,EAChB,UAAmB,EACnB,UAAsB,EACtB;AACA,IAAA,IAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AAC9C,IAAA,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC;AAE5D,IAAA,IAAI,UAAU,EAAE;MACd,OAAO,CAAC,WAAW,GAAG,QAAQ;AAChC,IAAA,CAAC,MAAM;AACL;MACA,OAAO,CAAC,SAAS,GAAG,QAAQ;AAC9B,IAAA;AAEA,IAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AAEnC,IAAA,OAAO,OAAO;AAChB,EAAA;AACF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dragAndDropHandler/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dragAndDropHandler/index.ts"],"names":[],"mappings":"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"}
@@ -57,10 +57,8 @@ class DragAndDropHandler {
57
57
  return null;
58
58
  }
59
59
  let nodeElement = this._getNodeElement(element);
60
- if (nodeElement && this._onCanMove) {
61
- if (!this._onCanMove(nodeElement._node)) {
62
- nodeElement = null;
63
- }
60
+ if (nodeElement && this._onCanMove && !this._onCanMove(nodeElement._node)) {
61
+ nodeElement = null;
64
62
  }
65
63
  this._currentItem = nodeElement;
66
64
  return this._currentItem != null;
@@ -91,10 +89,8 @@ class DragAndDropHandler {
91
89
  this._stopOpenFolderTimer();
92
90
  this._hoveredArea = area;
93
91
  }
94
- if (!area) {
95
- if (this._onDragMove) {
96
- this._onDragMove(this._currentItem._node, positionInfo.originalEvent);
97
- }
92
+ if (!area && this._onDragMove) {
93
+ this._onDragMove(this._currentItem._node, positionInfo.originalEvent);
98
94
  }
99
95
  return true;
100
96
  }
@@ -132,35 +128,32 @@ class DragAndDropHandler {
132
128
  this._currentItem = null;
133
129
  }
134
130
  this._isDragging = false;
135
- if (!this._hoveredArea && currentItem) {
136
- if (this._onDragStop) {
137
- this._onDragStop(currentItem._node, positionInfo.originalEvent);
138
- }
131
+ if (!this._hoveredArea && currentItem && this._onDragStop) {
132
+ this._onDragStop(currentItem._node, positionInfo.originalEvent);
139
133
  }
140
134
  return false;
141
135
  }
142
136
  _refresh() {
143
137
  this._removeHitAreas();
144
- if (this._currentItem) {
145
- let currentNode = this._currentItem._node;
146
- this._generateHitAreas(currentNode);
147
- this._currentItem = this._getNodeElementForNode(currentNode);
148
- if (this._isDragging) {
149
- this._currentItem._element.classList.add(this._classNames.moving);
150
- }
138
+ if (!this._currentItem) {
139
+ return;
140
+ }
141
+ let currentNode = this._currentItem._node;
142
+ this._generateHitAreas(currentNode);
143
+ this._currentItem = this._getNodeElementForNode(currentNode);
144
+ if (this._isDragging) {
145
+ this._currentItem._element.classList.add(this._classNames.moving);
151
146
  }
152
147
  }
153
148
  _canMoveToArea(area, currentItem) {
154
- if (!this._onCanMoveTo) {
155
- return true;
156
- }
157
- return this._onCanMoveTo(currentItem._node, area.node, area.position);
149
+ return this._onCanMoveTo ? this._onCanMoveTo(currentItem._node, area.node, area.position) : true;
158
150
  }
159
151
  _clear() {
160
- if (this._dragElement) {
161
- this._dragElement._remove();
162
- this._dragElement = null;
152
+ if (!this._dragElement) {
153
+ return;
163
154
  }
155
+ this._dragElement._remove();
156
+ this._dragElement = null;
164
157
  }
165
158
  _findHoveredArea(x, y) {
166
159
  let dimensions = this._getTreeDimensions();
@@ -170,20 +163,13 @@ class DragAndDropHandler {
170
163
  return binarySearch(this._hitAreas, area => {
171
164
  if (y < area.top) {
172
165
  return 1;
173
- } else if (y > area.bottom) {
174
- return -1;
175
- } else {
176
- return 0;
177
166
  }
167
+ return y > area.bottom ? -1 : 0;
178
168
  });
179
169
  }
180
170
  _generateHitAreas(currentNode) {
181
171
  let tree = this._getTree();
182
- if (!tree) {
183
- this._hitAreas = [];
184
- } else {
185
- this._hitAreas = generateHitAreas(tree, currentNode, this._getTreeDimensions().bottom);
186
- }
172
+ this._hitAreas = tree ? generateHitAreas(tree, currentNode, this._getTreeDimensions().bottom) : [];
187
173
  }
188
174
  _getTreeDimensions() {
189
175
  // Return the dimensions of the tree. Add a margin to the bottom to allow
@@ -199,36 +185,40 @@ class DragAndDropHandler {
199
185
  };
200
186
  }
201
187
 
202
- /* Move the dragged node to the selected position in the tree. */
188
+ /*
189
+ Move the dragged node to the selected position in the tree.
190
+ */
203
191
  _moveItem(positionInfo) {
204
- if (this._currentItem && this._hoveredArea?.position && this._canMoveToArea(this._hoveredArea, this._currentItem)) {
205
- let movedNode = this._currentItem._node;
206
- let targetNode = this._hoveredArea.node;
207
- let position = this._hoveredArea.position;
208
- let previousParent = movedNode.parent;
209
- if (position === "inside") {
210
- this._hoveredArea.node.is_open = true;
192
+ if (!(this._currentItem && this._hoveredArea?.position && this._canMoveToArea(this._hoveredArea, this._currentItem))) {
193
+ return;
194
+ }
195
+ let movedNode = this._currentItem._node;
196
+ let targetNode = this._hoveredArea.node;
197
+ let position = this._hoveredArea.position;
198
+ let previousParent = movedNode.parent;
199
+ if (position === "inside") {
200
+ this._hoveredArea.node.is_open = true;
201
+ }
202
+ let doMove = () => {
203
+ let tree = this._getTree();
204
+ if (!tree) {
205
+ return;
211
206
  }
212
- let doMove = () => {
213
- let tree = this._getTree();
214
- if (tree) {
215
- tree.moveNode(movedNode, targetNode, position);
216
- this._treeElement.textContent = "";
217
- this._refreshElements(null);
218
- }
219
- };
220
- if (this._triggerEvent("tree.move", {
221
- moveInfo: {
222
- doMove,
223
- movedNode,
224
- originalEvent: positionInfo.originalEvent,
225
- position,
226
- previousParent,
227
- targetNode
228
- }
229
- })) {
230
- doMove();
207
+ tree.moveNode(movedNode, targetNode, position);
208
+ this._treeElement.textContent = "";
209
+ this._refreshElements(null);
210
+ };
211
+ if (this._triggerEvent("tree.move", {
212
+ moveInfo: {
213
+ doMove,
214
+ movedNode,
215
+ originalEvent: positionInfo.originalEvent,
216
+ position,
217
+ previousParent,
218
+ targetNode
231
219
  }
220
+ })) {
221
+ doMove();
232
222
  }
233
223
  }
234
224
  _mustCaptureElement(element) {
@@ -264,10 +254,11 @@ class DragAndDropHandler {
264
254
  }
265
255
  }
266
256
  _stopOpenFolderTimer() {
267
- if (this._openFolderTimer) {
268
- clearTimeout(this._openFolderTimer);
269
- this._openFolderTimer = null;
257
+ if (!this._openFolderTimer) {
258
+ return;
270
259
  }
260
+ clearTimeout(this._openFolderTimer);
261
+ this._openFolderTimer = null;
271
262
  }
272
263
  _updateDropHint() {
273
264
  if (!this._hoveredArea) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/dragAndDropHandler/index.ts"],"sourcesContent":["import type { ClassNames } from \"../classNames\";\nimport type {\n GetScrollLeft,\n GetTree,\n OpenNode,\n RefreshElements,\n TriggerEvent,\n} from \"../methodTypes\";\nimport type { PositionInfo } from \"../mouseUtils\";\nimport type { Node } from \"../node\";\nimport type NodeElement from \"../nodeElement\";\nimport type {\n DragMethod,\n OnCanMove,\n OnCanMoveTo,\n OnIsMoveHandle,\n} from \"../options\";\nimport type { DropHint, HitArea } from \"./types\";\n\nimport { getElementPosition } from \"../positionUtils\";\nimport binarySearch from \"./binarySearch\";\nimport DragElement from \"./dragElement\";\nimport generateHitAreas from \"./generateHitAreas\";\n\ninterface Dimensions {\n bottom: number;\n left: number;\n right: number;\n top: number;\n}\n\ninterface DragAndDropHandlerParams {\n autoEscape?: boolean;\n classNames: ClassNames;\n getNodeElement: GetNodeElement;\n getNodeElementForNode: GetNodeElementForNode;\n getScrollLeft: GetScrollLeft;\n getTree: GetTree;\n onCanMove?: OnCanMove;\n onCanMoveTo?: OnCanMoveTo;\n onDragMove?: DragMethod;\n onDragStop?: DragMethod;\n onIsMoveHandle?: OnIsMoveHandle;\n openFolderDelay: false | number;\n openNode: OpenNode;\n refreshElements: RefreshElements;\n slide: boolean;\n treeElement: HTMLElement;\n triggerEvent: TriggerEvent;\n}\ntype GetNodeElement = (element: HTMLElement) => NodeElement | null;\n\ntype GetNodeElementForNode = (node: Node) => NodeElement;\n\nexport class DragAndDropHandler {\n public currentItem: NodeElement | null;\n public hitAreas: HitArea[];\n public hoveredArea: HitArea | null;\n public isDragging: boolean;\n\n private autoEscape?: boolean;\n private classNames: ClassNames;\n private dragElement: DragElement | null;\n private getNodeElement: GetNodeElement;\n private getNodeElementForNode: GetNodeElementForNode;\n private getScrollLeft: GetScrollLeft;\n private getTree: GetTree;\n private onCanMove?: OnCanMove;\n private onCanMoveTo?: OnCanMoveTo;\n private onDragMove?: DragMethod;\n private onDragStop?: DragMethod;\n private onIsMoveHandle?: OnIsMoveHandle;\n private openFolderDelay: false | number;\n private openFolderTimer: null | number;\n private openNode: OpenNode;\n private previousGhost: DropHint | null;\n private refreshElements: RefreshElements;\n private slide: boolean;\n private treeElement: HTMLElement;\n private triggerEvent: TriggerEvent;\n\n constructor({\n autoEscape,\n classNames,\n getNodeElement,\n getNodeElementForNode,\n getScrollLeft,\n getTree,\n onCanMove,\n onCanMoveTo,\n onDragMove,\n onDragStop,\n onIsMoveHandle,\n openFolderDelay,\n openNode,\n refreshElements,\n slide,\n treeElement,\n triggerEvent,\n }: DragAndDropHandlerParams) {\n this.autoEscape = autoEscape;\n this.classNames = classNames;\n this.getNodeElement = getNodeElement;\n this.getNodeElementForNode = getNodeElementForNode;\n this.getScrollLeft = getScrollLeft;\n this.getTree = getTree;\n this.onCanMove = onCanMove;\n this.onCanMoveTo = onCanMoveTo;\n this.onDragMove = onDragMove;\n this.onDragStop = onDragStop;\n this.onIsMoveHandle = onIsMoveHandle;\n this.openFolderDelay = openFolderDelay;\n this.openNode = openNode;\n this.refreshElements = refreshElements;\n this.slide = slide;\n this.treeElement = treeElement;\n this.triggerEvent = triggerEvent;\n\n this.hoveredArea = null;\n this.hitAreas = [];\n this.isDragging = false;\n this.currentItem = null;\n\n this.dragElement = null;\n this.openFolderTimer = null;\n this.previousGhost = null;\n }\n\n public mouseCapture(positionInfo: PositionInfo): boolean | null {\n const element = positionInfo.target;\n\n if (!this.mustCaptureElement(element)) {\n return null;\n }\n\n if (this.onIsMoveHandle && !this.onIsMoveHandle(element)) {\n return null;\n }\n\n let nodeElement = this.getNodeElement(element);\n\n if (nodeElement && this.onCanMove) {\n if (!this.onCanMove(nodeElement.node)) {\n nodeElement = null;\n }\n }\n\n this.currentItem = nodeElement;\n return this.currentItem != null;\n }\n\n public mouseDrag(positionInfo: PositionInfo): boolean {\n if (!this.currentItem || !this.dragElement) {\n return false;\n }\n\n this.dragElement.move(positionInfo.pageX, positionInfo.pageY);\n\n const area = this.findHoveredArea(positionInfo.pageX, positionInfo.pageY);\n\n if (area && this.canMoveToArea(area, this.currentItem)) {\n if (!area.node.isFolder()) {\n this.stopOpenFolderTimer();\n }\n\n if (this.hoveredArea !== area) {\n this.hoveredArea = area;\n\n // If this is a closed folder, start timer to open it\n if (this.mustOpenFolderTimer(area)) {\n this.startOpenFolderTimer(area.node);\n } else {\n this.stopOpenFolderTimer();\n }\n\n this.updateDropHint();\n }\n } else {\n this.removeDropHint();\n this.stopOpenFolderTimer();\n this.hoveredArea = area;\n }\n\n if (!area) {\n if (this.onDragMove) {\n this.onDragMove(this.currentItem.node, positionInfo.originalEvent);\n }\n }\n\n return true;\n }\n\n public mouseStart(positionInfo: PositionInfo): boolean {\n if (!this.currentItem) {\n return false;\n }\n\n this.refresh();\n\n const { left, top } = getElementPosition(positionInfo.target);\n\n const node = this.currentItem.node;\n\n this.dragElement = new DragElement({\n autoEscape: this.autoEscape ?? true,\n classNames: this.classNames,\n nodeName: node.name,\n offsetX: positionInfo.pageX - left,\n offsetY: positionInfo.pageY - top,\n treeElement: this.treeElement,\n });\n\n this.isDragging = true;\n this.currentItem.element.classList.add(this.classNames.moving);\n\n return true;\n }\n\n public mouseStop(positionInfo: PositionInfo): boolean {\n this.moveItem(positionInfo);\n this.clear();\n this.removeHover();\n this.removeDropHint();\n this.removeHitAreas();\n\n const currentItem = this.currentItem;\n\n if (this.currentItem) {\n this.currentItem.element.classList.remove(this.classNames.moving);\n this.currentItem = null;\n }\n\n this.isDragging = false;\n\n if (!this.hoveredArea && currentItem) {\n if (this.onDragStop) {\n this.onDragStop(currentItem.node, positionInfo.originalEvent);\n }\n }\n\n return false;\n }\n\n public refresh(): void {\n this.removeHitAreas();\n\n if (this.currentItem) {\n const currentNode = this.currentItem.node;\n this.generateHitAreas(currentNode);\n this.currentItem = this.getNodeElementForNode(currentNode);\n\n if (this.isDragging) {\n this.currentItem.element.classList.add(this.classNames.moving);\n }\n }\n }\n\n private canMoveToArea(area: HitArea, currentItem: NodeElement): boolean {\n if (!this.onCanMoveTo) {\n return true;\n }\n\n return this.onCanMoveTo(currentItem.node, area.node, area.position);\n }\n\n private clear(): void {\n if (this.dragElement) {\n this.dragElement.remove();\n this.dragElement = null;\n }\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 return binarySearch<HitArea>(this.hitAreas, (area) => {\n if (y < area.top) {\n return 1;\n } else if (y > area.bottom) {\n return -1;\n } else {\n return 0;\n }\n });\n }\n\n private generateHitAreas(currentNode: Node): void {\n const tree = this.getTree();\n\n if (!tree) {\n this.hitAreas = [];\n } else {\n this.hitAreas = generateHitAreas(\n tree,\n currentNode,\n this.getTreeDimensions().bottom,\n );\n }\n }\n\n private getTreeDimensions(): Dimensions {\n // Return the dimensions of the tree. Add a margin to the bottom to allow\n // to drag-and-drop after the last element.\n const treePosition = getElementPosition(this.treeElement);\n const left = treePosition.left + this.getScrollLeft();\n const top = treePosition.top;\n\n return {\n bottom: top + this.treeElement.clientHeight + 16,\n left,\n right: left + this.treeElement.clientWidth,\n top,\n };\n }\n\n /* Move the dragged node to the selected position in the tree. */\n private moveItem(positionInfo: PositionInfo): void {\n if (\n this.currentItem &&\n this.hoveredArea?.position &&\n this.canMoveToArea(this.hoveredArea, this.currentItem)\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 === \"inside\") {\n this.hoveredArea.node.is_open = true;\n }\n\n const doMove = (): void => {\n const tree = this.getTree();\n\n if (tree) {\n tree.moveNode(movedNode, targetNode, position);\n\n this.treeElement.textContent = \"\";\n this.refreshElements(null);\n }\n };\n\n if (\n this.triggerEvent(\"tree.move\", {\n moveInfo: {\n doMove,\n movedNode,\n originalEvent: positionInfo.originalEvent,\n position,\n previousParent,\n targetNode,\n },\n })\n ) {\n doMove();\n }\n }\n }\n\n private mustCaptureElement(element: HTMLElement): boolean {\n const nodeName = element.nodeName;\n\n return (\n nodeName !== \"INPUT\" && nodeName !== \"SELECT\" && nodeName !== \"TEXTAREA\"\n );\n }\n\n private mustOpenFolderTimer(area: HitArea): boolean {\n const node = area.node;\n\n return node.isFolder() && !node.is_open && area.position === \"inside\";\n }\n\n private removeDropHint(): void {\n if (this.previousGhost) {\n this.previousGhost.remove();\n }\n }\n\n private removeHitAreas(): void {\n this.hitAreas = [];\n }\n\n private removeHover(): void {\n this.hoveredArea = null;\n }\n\n private startOpenFolderTimer(folder: Node): void {\n const openFolder = (): void => {\n void this.openNode(folder, this.slide).then(() => {\n this.refresh();\n this.updateDropHint();\n });\n };\n\n this.stopOpenFolderTimer();\n\n const openFolderDelay = this.openFolderDelay;\n\n if (openFolderDelay !== false) {\n this.openFolderTimer = window.setTimeout(openFolder, 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 updateDropHint(): void {\n if (!this.hoveredArea) {\n return;\n }\n\n // remove previous drop hint\n this.removeDropHint();\n\n // add new drop hint\n const nodeElement = this.getNodeElementForNode(this.hoveredArea.node);\n this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);\n }\n}\n"],"names":["autoEscape","classNames","getNodeElement","getNodeElementForNode","getScrollLeft","getTree","onCanMove","onCanMoveTo","onDragMove","onDragStop","onIsMoveHandle","openFolderDelay","openNode","refreshElements","slide","treeElement","triggerEvent","hoveredArea","hitAreas","isDragging","currentItem","dragElement","openFolderTimer","previousGhost","mouseCapture","mustCaptureElement","node","mouseDrag","move","findHoveredArea","canMoveToArea","stopOpenFolderTimer","mustOpenFolderTimer","startOpenFolderTimer","updateDropHint","removeDropHint","mouseStart","refresh","element","mouseStop","moveItem","clear","removeHover","removeHitAreas","generateHitAreas","remove","getTreeDimensions","addDropHint"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/dragAndDropHandler/index.ts"],"sourcesContent":["import type { ClassNames } from \"../classNames\";\nimport type {\n GetScrollLeft,\n GetTree,\n OpenNode,\n RefreshElements,\n TriggerEvent,\n} from \"../methodTypes\";\nimport type { PositionInfo } from \"../mouseUtils\";\nimport type { Node } from \"../node\";\nimport type NodeElement from \"../nodeElement\";\nimport type {\n DragMethod,\n OnCanMove,\n OnCanMoveTo,\n OnIsMoveHandle,\n} from \"../options\";\nimport type { DropHint, HitArea } from \"./types\";\n\nimport { getElementPosition } from \"../positionUtils\";\nimport binarySearch from \"./binarySearch\";\nimport DragElement from \"./dragElement\";\nimport generateHitAreas from \"./generateHitAreas\";\n\ninterface Dimensions {\n bottom: number;\n left: number;\n right: number;\n top: number;\n}\n\ninterface DragAndDropHandlerParams {\n autoEscape?: boolean;\n classNames: ClassNames;\n getNodeElement: GetNodeElement;\n getNodeElementForNode: GetNodeElementForNode;\n getScrollLeft: GetScrollLeft;\n getTree: GetTree;\n onCanMove?: OnCanMove;\n onCanMoveTo?: OnCanMoveTo;\n onDragMove?: DragMethod;\n onDragStop?: DragMethod;\n onIsMoveHandle?: OnIsMoveHandle;\n openFolderDelay: false | number;\n openNode: OpenNode;\n refreshElements: RefreshElements;\n slide: boolean;\n treeElement: HTMLElement;\n triggerEvent: TriggerEvent;\n}\ntype GetNodeElement = (element: HTMLElement) => NodeElement | null;\n\ntype GetNodeElementForNode = (node: Node) => NodeElement;\n\nexport class DragAndDropHandler {\n public currentItem: NodeElement | null;\n public hitAreas: HitArea[];\n public hoveredArea: HitArea | null;\n public isDragging: boolean;\n\n private autoEscape?: boolean;\n private classNames: ClassNames;\n private dragElement: DragElement | null;\n private getNodeElement: GetNodeElement;\n private getNodeElementForNode: GetNodeElementForNode;\n private getScrollLeft: GetScrollLeft;\n private getTree: GetTree;\n private onCanMove?: OnCanMove;\n private onCanMoveTo?: OnCanMoveTo;\n private onDragMove?: DragMethod;\n private onDragStop?: DragMethod;\n private onIsMoveHandle?: OnIsMoveHandle;\n private openFolderDelay: false | number;\n private openFolderTimer: null | number;\n private openNode: OpenNode;\n private previousGhost: DropHint | null;\n private refreshElements: RefreshElements;\n private slide: boolean;\n private treeElement: HTMLElement;\n private triggerEvent: TriggerEvent;\n\n constructor({\n autoEscape,\n classNames,\n getNodeElement,\n getNodeElementForNode,\n getScrollLeft,\n getTree,\n onCanMove,\n onCanMoveTo,\n onDragMove,\n onDragStop,\n onIsMoveHandle,\n openFolderDelay,\n openNode,\n refreshElements,\n slide,\n treeElement,\n triggerEvent,\n }: DragAndDropHandlerParams) {\n this.autoEscape = autoEscape;\n this.classNames = classNames;\n this.getNodeElement = getNodeElement;\n this.getNodeElementForNode = getNodeElementForNode;\n this.getScrollLeft = getScrollLeft;\n this.getTree = getTree;\n this.onCanMove = onCanMove;\n this.onCanMoveTo = onCanMoveTo;\n this.onDragMove = onDragMove;\n this.onDragStop = onDragStop;\n this.onIsMoveHandle = onIsMoveHandle;\n this.openFolderDelay = openFolderDelay;\n this.openNode = openNode;\n this.refreshElements = refreshElements;\n this.slide = slide;\n this.treeElement = treeElement;\n this.triggerEvent = triggerEvent;\n\n this.hoveredArea = null;\n this.hitAreas = [];\n this.isDragging = false;\n this.currentItem = null;\n\n this.dragElement = null;\n this.openFolderTimer = null;\n this.previousGhost = null;\n }\n\n public mouseCapture(positionInfo: PositionInfo): boolean | null {\n const element = positionInfo.target;\n\n if (!this.mustCaptureElement(element)) {\n return null;\n }\n\n if (this.onIsMoveHandle && !this.onIsMoveHandle(element)) {\n return null;\n }\n\n let nodeElement = this.getNodeElement(element);\n\n if (nodeElement && this.onCanMove && !this.onCanMove(nodeElement.node)) {\n nodeElement = null;\n }\n\n this.currentItem = nodeElement;\n return this.currentItem != null;\n }\n\n public mouseDrag(positionInfo: PositionInfo): boolean {\n if (!this.currentItem || !this.dragElement) {\n return false;\n }\n\n this.dragElement.move(positionInfo.pageX, positionInfo.pageY);\n\n const area = this.findHoveredArea(positionInfo.pageX, positionInfo.pageY);\n\n if (area && this.canMoveToArea(area, this.currentItem)) {\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 && this.onDragMove) {\n this.onDragMove(this.currentItem.node, positionInfo.originalEvent);\n }\n\n return true;\n }\n\n public mouseStart(positionInfo: PositionInfo): boolean {\n if (!this.currentItem) {\n return false;\n }\n\n this.refresh();\n\n const { left, top } = getElementPosition(positionInfo.target);\n\n const node = this.currentItem.node;\n\n this.dragElement = new DragElement({\n autoEscape: this.autoEscape ?? true,\n classNames: this.classNames,\n nodeName: node.name,\n offsetX: positionInfo.pageX - left,\n offsetY: positionInfo.pageY - top,\n treeElement: this.treeElement,\n });\n\n this.isDragging = true;\n this.currentItem.element.classList.add(this.classNames.moving);\n\n return true;\n }\n\n public mouseStop(positionInfo: PositionInfo): boolean {\n this.moveItem(positionInfo);\n this.clear();\n this.removeHover();\n this.removeDropHint();\n this.removeHitAreas();\n\n const currentItem = this.currentItem;\n\n if (this.currentItem) {\n this.currentItem.element.classList.remove(this.classNames.moving);\n this.currentItem = null;\n }\n\n this.isDragging = false;\n\n if (!this.hoveredArea && currentItem && this.onDragStop) {\n this.onDragStop(currentItem.node, positionInfo.originalEvent);\n }\n\n return false;\n }\n\n public refresh(): void {\n this.removeHitAreas();\n\n if (!this.currentItem) {\n return;\n }\n\n const currentNode = this.currentItem.node;\n this.generateHitAreas(currentNode);\n this.currentItem = this.getNodeElementForNode(currentNode);\n\n if (this.isDragging) {\n this.currentItem.element.classList.add(this.classNames.moving);\n }\n }\n\n private canMoveToArea(area: HitArea, currentItem: NodeElement): boolean {\n return this.onCanMoveTo\n ? this.onCanMoveTo(currentItem.node, area.node, area.position)\n : true;\n }\n\n private clear(): void {\n if (!this.dragElement) {\n return;\n }\n\n this.dragElement.remove();\n this.dragElement = 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 return binarySearch<HitArea>(this.hitAreas, (area) => {\n if (y < area.top) {\n return 1;\n }\n return y > area.bottom ? -1 : 0;\n });\n }\n\n private generateHitAreas(currentNode: Node): void {\n const tree = this.getTree();\n\n this.hitAreas = tree\n ? generateHitAreas(tree, currentNode, this.getTreeDimensions().bottom)\n : [];\n }\n\n private getTreeDimensions(): Dimensions {\n // Return the dimensions of the tree. Add a margin to the bottom to allow\n // to drag-and-drop after the last element.\n const treePosition = getElementPosition(this.treeElement);\n const left = treePosition.left + this.getScrollLeft();\n const top = treePosition.top;\n\n return {\n bottom: top + this.treeElement.clientHeight + 16,\n left,\n right: left + this.treeElement.clientWidth,\n top,\n };\n }\n\n /*\n Move the dragged node to the selected position in the tree.\n */\n private moveItem(positionInfo: PositionInfo): void {\n if (!(\n this.currentItem &&\n this.hoveredArea?.position &&\n this.canMoveToArea(this.hoveredArea, this.currentItem)\n )) {\n return;\n }\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 === \"inside\") {\n this.hoveredArea.node.is_open = true;\n }\n\n const doMove = (): void => {\n const tree = this.getTree();\n\n if (!tree) {\n return;\n }\n\n tree.moveNode(movedNode, targetNode, position);\n\n this.treeElement.textContent = \"\";\n this.refreshElements(null);\n };\n\n if (\n this.triggerEvent(\"tree.move\", {\n moveInfo: {\n doMove,\n movedNode,\n originalEvent: positionInfo.originalEvent,\n position,\n previousParent,\n targetNode,\n },\n })\n ) {\n doMove();\n }\n }\n\n private mustCaptureElement(element: HTMLElement): boolean {\n const nodeName = element.nodeName;\n\n return (\n nodeName !== \"INPUT\" && nodeName !== \"SELECT\" && nodeName !== \"TEXTAREA\"\n );\n }\n\n private mustOpenFolderTimer(area: HitArea): boolean {\n const node = area.node;\n\n return node.isFolder() && !node.is_open && area.position === \"inside\";\n }\n\n private removeDropHint(): void {\n if (this.previousGhost) {\n this.previousGhost.remove();\n }\n }\n\n private removeHitAreas(): void {\n this.hitAreas = [];\n }\n\n private removeHover(): void {\n this.hoveredArea = null;\n }\n\n private startOpenFolderTimer(folder: Node): void {\n const openFolder = (): void => {\n void this.openNode(folder, this.slide).then(() => {\n this.refresh();\n this.updateDropHint();\n });\n };\n\n this.stopOpenFolderTimer();\n\n const openFolderDelay = this.openFolderDelay;\n\n if (openFolderDelay !== false) {\n this.openFolderTimer = window.setTimeout(openFolder, openFolderDelay);\n }\n }\n\n private stopOpenFolderTimer(): void {\n if (!this.openFolderTimer) {\n return;\n }\n\n clearTimeout(this.openFolderTimer);\n this.openFolderTimer = null;\n }\n\n private updateDropHint(): void {\n if (!this.hoveredArea) {\n return;\n }\n\n // remove previous drop hint\n this.removeDropHint();\n\n // add new drop hint\n const nodeElement = this.getNodeElementForNode(this.hoveredArea.node);\n this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);\n }\n}\n"],"names":["autoEscape","classNames","getNodeElement","getNodeElementForNode","getScrollLeft","getTree","onCanMove","onCanMoveTo","onDragMove","onDragStop","onIsMoveHandle","openFolderDelay","openNode","refreshElements","slide","treeElement","triggerEvent","hoveredArea","hitAreas","isDragging","currentItem","dragElement","openFolderTimer","previousGhost","mouseCapture","mustCaptureElement","node","mouseDrag","move","findHoveredArea","canMoveToArea","stopOpenFolderTimer","mustOpenFolderTimer","startOpenFolderTimer","updateDropHint","removeDropHint","mouseStart","refresh","element","mouseStop","moveItem","clear","removeHover","removeHitAreas","generateHitAreas","remove","getTreeDimensions","addDropHint"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"iterateVisibleNodes.d.ts","sourceRoot":"","sources":["../../src/dragAndDropHandler/iterateVisibleNodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC,UAAU,OAAO;IACf,qBAAqB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACnE,kBAAkB,EAAE,CAClB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,IAAI,GAAG,IAAI,EACrB,OAAO,EAAE,WAAW,KACjB,IAAI,CAAC;IACV,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACtC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAQ9E,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;CACjE;AAED,QAAA,MAAM,mBAAmB,GACvB,MAAM,IAAI,EACV,+FAMG,OAAO,SAuDX,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"iterateVisibleNodes.d.ts","sourceRoot":"","sources":["../../src/dragAndDropHandler/iterateVisibleNodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC,UAAU,OAAO;IACf,qBAAqB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACnE,kBAAkB,EAAE,CAClB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,IAAI,GAAG,IAAI,EACrB,OAAO,EAAE,WAAW,KACjB,IAAI,CAAC;IACV,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACtC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAQ9E,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;CACjE;AAED,QAAA,MAAM,mBAAmB,GACvB,MAAM,IAAI,EACV,+FAMG,OAAO,SAyDX,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -27,25 +27,26 @@ let iterateVisibleNodes = (tree, {
27
27
  handleClosedFolder(node, nextNode, element);
28
28
  }
29
29
  }
30
- if (mustIterateInside) {
31
- let childrenLength = node.children.length;
32
- node.children.forEach((_, i) => {
33
- let child = node.children[i];
34
- if (child) {
35
- if (i === childrenLength - 1) {
36
- iterate(child, null);
37
- } else {
38
- let nextChild = node.children[i + 1];
39
- if (nextChild) {
40
- iterate(child, nextChild);
41
- }
30
+ if (!mustIterateInside) {
31
+ return;
32
+ }
33
+ let childrenLength = node.children.length;
34
+ for (let i of node.children.keys()) {
35
+ let child = node.children[i];
36
+ if (child) {
37
+ if (i === childrenLength - 1) {
38
+ iterate(child, null);
39
+ } else {
40
+ let nextChild = node.children[i + 1];
41
+ if (nextChild) {
42
+ iterate(child, nextChild);
42
43
  }
43
44
  }
44
- });
45
- if (node.is_open && element) {
46
- handleAfterOpenFolder(node, nextNode);
47
45
  }
48
46
  }
47
+ if (node.is_open && element) {
48
+ handleAfterOpenFolder(node, nextNode);
49
+ }
49
50
  };
50
51
  iterate(tree, null);
51
52
  };
@@ -1 +1 @@
1
- {"version":3,"file":"iterateVisibleNodes.js","sources":["../../src/dragAndDropHandler/iterateVisibleNodes.ts"],"sourcesContent":["import type { Node } from \"../node\";\n\ninterface Options {\n handleAfterOpenFolder: (node: Node, nextNode: Node | null) => void;\n handleClosedFolder: (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => void;\n handleFirstNode: (node: Node) => void;\n handleNode: (node: Node, nextNode: Node | null, element: HTMLElement) => void;\n\n /*\n override\n return\n - true: continue iterating\n - false: stop iterating\n */\n handleOpenFolder: (node: Node, element: HTMLElement) => boolean;\n}\n\nconst iterateVisibleNodes = (\n tree: Node,\n {\n handleAfterOpenFolder,\n handleClosedFolder,\n handleFirstNode,\n handleNode,\n handleOpenFolder,\n }: Options,\n) => {\n let isFirstNode = true;\n\n const iterate = (node: Node, nextNode: Node | null): void => {\n let mustIterateInside =\n (node.is_open === true || !node.element) && node.hasChildren();\n\n let element: HTMLElement | null = null;\n\n // Is the element visible?\n if (node.element?.offsetParent) {\n element = node.element;\n\n if (isFirstNode) {\n handleFirstNode(node);\n isFirstNode = false;\n }\n\n if (!node.hasChildren()) {\n handleNode(node, nextNode, node.element);\n } else if (node.is_open) {\n if (!handleOpenFolder(node, node.element)) {\n mustIterateInside = false;\n }\n } else {\n handleClosedFolder(node, nextNode, element);\n }\n }\n\n if (mustIterateInside) {\n const childrenLength = node.children.length;\n node.children.forEach((_, i) => {\n const child = node.children[i];\n\n if (child) {\n if (i === childrenLength - 1) {\n iterate(child, null);\n } else {\n const nextChild = node.children[i + 1];\n\n if (nextChild) {\n iterate(child, nextChild);\n }\n }\n }\n });\n\n if (node.is_open && element) {\n handleAfterOpenFolder(node, nextNode);\n }\n }\n };\n\n iterate(tree, null);\n};\n\nexport default iterateVisibleNodes;\n"],"names":[],"mappings":"AAqBA,IAAM,mBAAmB,GAAG,CAC1B,IAAU,EACV;EACE,sBAAA,EAAA,qBAAqB;EACrB,mBAAA,EAAA,kBAAkB;EAClB,gBAAA,EAAA,eAAe;EACf,WAAA,EAAA,UAAU;AACV,EAAA,iBAAA,EAAA;AACO,CAAC,KACP;EACH,IAAI,WAAW,GAAG,IAAI;AAEtB,EAAA,IAAM,OAAO,GAAG,CAAC,IAAU,EAAE,QAAqB,KAAW;AAC3D,IAAA,IAAI,iBAAiB,GACnB,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,WAAW,EAAE;IAEhE,IAAI,OAA2B,GAAG,IAAI;;AAEtC;AACA,IAAA,IAAI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE;MAC9B,OAAO,GAAG,IAAI,CAAC,OAAO;AAEtB,MAAA,IAAI,WAAW,EAAE;QACf,eAAe,CAAC,IAAI,CAAC;AACrB,QAAA,WAAW,GAAG,KAAK;AACrB,MAAA;AAEA,MAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;QACvB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC;AAC1C,MAAA,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;QACvB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;AACzC,UAAA,iBAAiB,GAAG,KAAK;AAC3B,QAAA;AACF,MAAA,CAAC,MAAM;AACL,QAAA,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC7C,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,iBAAiB,EAAE;AACrB,MAAA,IAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;MAC3C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;AAC9B,QAAA,IAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAE9B,QAAA,IAAI,KAAK,EAAE;AACT,UAAA,IAAI,CAAC,KAAK,cAAc,GAAG,CAAC,EAAE;AAC5B,YAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACtB,UAAA,CAAC,MAAM;YACL,IAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;AAEtC,YAAA,IAAI,SAAS,EAAE;AACb,cAAA,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;AAC3B,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA,CAAC,CAAC;AAEF,MAAA,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE;AAC3B,QAAA,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC;AACvC,MAAA;AACF,IAAA;EACF,CAAC;AAED,EAAA,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;AACrB;;"}
1
+ {"version":3,"file":"iterateVisibleNodes.js","sources":["../../src/dragAndDropHandler/iterateVisibleNodes.ts"],"sourcesContent":["import type { Node } from \"../node\";\n\ninterface Options {\n handleAfterOpenFolder: (node: Node, nextNode: Node | null) => void;\n handleClosedFolder: (\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ) => void;\n handleFirstNode: (node: Node) => void;\n handleNode: (node: Node, nextNode: Node | null, element: HTMLElement) => void;\n\n /*\n override\n return\n - true: continue iterating\n - false: stop iterating\n */\n handleOpenFolder: (node: Node, element: HTMLElement) => boolean;\n}\n\nconst iterateVisibleNodes = (\n tree: Node,\n {\n handleAfterOpenFolder,\n handleClosedFolder,\n handleFirstNode,\n handleNode,\n handleOpenFolder,\n }: Options,\n) => {\n let isFirstNode = true;\n\n const iterate = (node: Node, nextNode: Node | null): void => {\n let mustIterateInside =\n (node.is_open === true || !node.element) && node.hasChildren();\n\n let element: HTMLElement | null = null;\n\n // Is the element visible?\n if (node.element?.offsetParent) {\n element = node.element;\n\n if (isFirstNode) {\n handleFirstNode(node);\n isFirstNode = false;\n }\n\n if (!node.hasChildren()) {\n handleNode(node, nextNode, node.element);\n } else if (node.is_open) {\n if (!handleOpenFolder(node, node.element)) {\n mustIterateInside = false;\n }\n } else {\n handleClosedFolder(node, nextNode, element);\n }\n }\n\n if (!mustIterateInside) {\n return;\n }\n\n const childrenLength = node.children.length;\n for (const i of node.children.keys()) {\n const child = node.children[i];\n\n if (child) {\n if (i === childrenLength - 1) {\n iterate(child, null);\n } else {\n const nextChild = node.children[i + 1];\n\n if (nextChild) {\n iterate(child, nextChild);\n }\n }\n }\n }\n\n if (node.is_open && element) {\n handleAfterOpenFolder(node, nextNode);\n }\n };\n\n iterate(tree, null);\n};\n\nexport default iterateVisibleNodes;\n"],"names":[],"mappings":"AAqBA,IAAM,mBAAmB,GAAG,CAC1B,IAAU,EACV;EACE,sBAAA,EAAA,qBAAqB;EACrB,mBAAA,EAAA,kBAAkB;EAClB,gBAAA,EAAA,eAAe;EACf,WAAA,EAAA,UAAU;AACV,EAAA,iBAAA,EAAA;AACO,CAAC,KACP;EACH,IAAI,WAAW,GAAG,IAAI;AAEtB,EAAA,IAAM,OAAO,GAAG,CAAC,IAAU,EAAE,QAAqB,KAAW;AAC3D,IAAA,IAAI,iBAAiB,GACnB,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,WAAW,EAAE;IAEhE,IAAI,OAA2B,GAAG,IAAI;;AAEtC;AACA,IAAA,IAAI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE;MAC9B,OAAO,GAAG,IAAI,CAAC,OAAO;AAEtB,MAAA,IAAI,WAAW,EAAE;QACf,eAAe,CAAC,IAAI,CAAC;AACrB,QAAA,WAAW,GAAG,KAAK;AACrB,MAAA;AAEA,MAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;QACvB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC;AAC1C,MAAA,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;QACvB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;AACzC,UAAA,iBAAiB,GAAG,KAAK;AAC3B,QAAA;AACF,MAAA,CAAC,MAAM;AACL,QAAA,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC7C,MAAA;AACF,IAAA;IAEA,IAAI,CAAC,iBAAiB,EAAE;AACtB,MAAA;AACF,IAAA;AAEA,IAAA,IAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;IAC3C,KAAK,IAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;AACpC,MAAA,IAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAE9B,MAAA,IAAI,KAAK,EAAE;AACT,QAAA,IAAI,CAAC,KAAK,cAAc,GAAG,CAAC,EAAE;AAC5B,UAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;AACtB,QAAA,CAAC,MAAM;UACL,IAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;AAEtC,UAAA,IAAI,SAAS,EAAE;AACb,YAAA,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;AAC3B,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE;AAC3B,MAAA,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC;AACvC,IAAA;EACF,CAAC;AAED,EAAA,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;AACrB;;"}