tree-element 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -6
- package/lib/animation.d.ts +2 -2
- package/lib/animation.d.ts.map +1 -1
- package/lib/animation.js +13 -9
- package/lib/animation.js.map +1 -1
- package/lib/dataLoader.d.ts +1 -0
- package/lib/dataLoader.d.ts.map +1 -1
- package/lib/dataLoader.js +8 -0
- package/lib/dataLoader.js.map +1 -1
- package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -1
- package/lib/dragAndDropHandler/dragElement.js +2 -1
- package/lib/dragAndDropHandler/dragElement.js.map +1 -1
- package/lib/dragAndDropHandler/index.d.ts.map +1 -1
- package/lib/dragAndDropHandler/index.js +56 -65
- package/lib/dragAndDropHandler/index.js.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.js +16 -15
- package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
- package/lib/elementsRenderer.d.ts +5 -1
- package/lib/elementsRenderer.d.ts.map +1 -1
- package/lib/elementsRenderer.js +62 -39
- package/lib/elementsRenderer.js.map +1 -1
- package/lib/events.d.ts +44 -11
- package/lib/events.d.ts.map +1 -1
- package/lib/index.d.ts +31 -8
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +162 -122
- package/lib/index.js.map +1 -1
- package/lib/keyHandler.d.ts +11 -5
- package/lib/keyHandler.d.ts.map +1 -1
- package/lib/keyHandler.js +87 -33
- package/lib/keyHandler.js.map +1 -1
- package/lib/methodTypes.d.ts +2 -2
- package/lib/methodTypes.d.ts.map +1 -1
- package/lib/mouseHandler.d.ts +1 -1
- package/lib/mouseHandler.d.ts.map +1 -1
- package/lib/mouseHandler.js +10 -7
- package/lib/mouseHandler.js.map +1 -1
- package/lib/node.d.ts +45 -15
- package/lib/node.d.ts.map +1 -1
- package/lib/node.js +136 -139
- package/lib/node.js.map +1 -1
- package/lib/nodeElement/folderElement.d.ts +1 -1
- package/lib/nodeElement/folderElement.d.ts.map +1 -1
- package/lib/nodeElement/folderElement.js +46 -57
- package/lib/nodeElement/folderElement.js.map +1 -1
- package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
- package/lib/nodeElement/ghostDropHint.js +8 -4
- package/lib/nodeElement/ghostDropHint.js.map +1 -1
- package/lib/nodeElement/index.d.ts.map +1 -1
- package/lib/nodeElement/index.js +6 -6
- package/lib/nodeElement/index.js.map +1 -1
- package/lib/nodeUtils.d.ts.map +1 -1
- package/lib/nodeUtils.js +1 -1
- package/lib/nodeUtils.js.map +1 -1
- package/lib/options.d.ts +23 -6
- package/lib/options.d.ts.map +1 -1
- package/lib/requestUrl.d.ts +0 -1
- package/lib/requestUrl.d.ts.map +1 -1
- package/lib/requestUrl.js +4 -22
- package/lib/requestUrl.js.map +1 -1
- package/lib/saveStateHandler.d.ts.map +1 -1
- package/lib/saveStateHandler.js +21 -41
- package/lib/saveStateHandler.js.map +1 -1
- package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/containerScrollParent.js +3 -8
- package/lib/scrollHandler/containerScrollParent.js.map +1 -1
- package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/createScrollParent.js +4 -5
- package/lib/scrollHandler/createScrollParent.js.map +1 -1
- package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/documentScrollParent.js +3 -9
- package/lib/scrollHandler/documentScrollParent.js.map +1 -1
- package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/scrollParent.js +19 -17
- package/lib/scrollHandler/scrollParent.js.map +1 -1
- package/lib/selectNodeHandler.d.ts +3 -1
- package/lib/selectNodeHandler.d.ts.map +1 -1
- package/lib/selectNodeHandler.js +27 -37
- package/lib/selectNodeHandler.js.map +1 -1
- package/lib/setDefaultOptions.d.ts +3 -0
- package/lib/setDefaultOptions.d.ts.map +1 -1
- package/lib/setDefaultOptions.js +21 -20
- package/lib/setDefaultOptions.js.map +1 -1
- package/lib/util.d.ts.map +1 -1
- package/lib/util.js +1 -1
- package/lib/util.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +44 -35
- package/src/animation.ts +13 -11
- package/src/dataLoader.ts +11 -0
- package/src/dragAndDropHandler/dragElement.ts +2 -1
- package/src/dragAndDropHandler/index.ts +70 -75
- package/src/dragAndDropHandler/iterateVisibleNodes.ts +18 -16
- package/src/elementsRenderer.ts +76 -46
- package/src/events.ts +44 -11
- package/src/index.ts +210 -150
- package/src/keyHandler.ts +95 -41
- package/src/methodTypes.ts +3 -3
- package/src/mouseHandler.ts +10 -7
- package/src/node.ts +155 -148
- package/src/nodeElement/folderElement.ts +54 -63
- package/src/nodeElement/ghostDropHint.ts +4 -2
- package/src/nodeElement/index.ts +9 -15
- package/src/nodeUtils.ts +1 -1
- package/src/options.ts +23 -6
- package/src/requestUrl.ts +4 -25
- package/src/saveStateHandler.ts +29 -43
- package/src/scrollHandler/containerScrollParent.ts +3 -9
- package/src/scrollHandler/createScrollParent.ts +1 -2
- package/src/scrollHandler/documentScrollParent.ts +5 -11
- package/src/scrollHandler/scrollParent.ts +29 -25
- package/src/selectNodeHandler.ts +34 -38
- package/src/setDefaultOptions.ts +31 -19
- package/src/util.ts +1 -2
- package/src/version.ts +1 -1
- package/tree_element.css +87 -69
- package/tree_element.debug.js +717 -659
- package/tree_element.debug.js.map +1 -1
- package/tree_element.js +2 -2
- package/tree_element.js.map +1 -1
package/README.md
CHANGED
|
@@ -81,21 +81,23 @@ 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 |
|
|
88
90
|
| `classPrefix` | `"tree-element"` | The prefix of all css classes |
|
|
89
|
-
| `closedIcon` |
|
|
91
|
+
| `closedIcon` | svg triangle ▶ (◀ rtl) | Html string or element |
|
|
90
92
|
| `commonClassName` | `"tree-element-common"` | The class that every element gets |
|
|
91
93
|
| `data` | | The nodes to display |
|
|
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
|
|
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
|
-
| `openedIcon` |
|
|
100
|
+
| `openedIcon` | svg triangle ▼ | Html string or element |
|
|
99
101
|
| `rtl` | `data-rtl` attribute | Right-to-left rendering |
|
|
100
102
|
| `saveState` | `false` | `true`, or a string to use as the storage key |
|
|
101
103
|
| `selectable` | `true` | Allow selecting nodes |
|
|
@@ -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
|
|
package/lib/animation.d.ts
CHANGED
|
@@ -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
|
|
4
|
-
export declare const slideUp: (element: HTMLElement, animationSpeed: AnimationSpeed
|
|
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
|
package/lib/animation.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
return new Promise(resolve => {
|
|
19
|
+
animation.onfinish = () => {
|
|
20
|
+
resolve();
|
|
21
|
+
};
|
|
22
|
+
});
|
|
21
23
|
};
|
|
22
|
-
let slideUp = (element, animationSpeed
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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 };
|
package/lib/animation.js.map
CHANGED
|
@@ -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
|
|
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;;"}
|
package/lib/dataLoader.d.ts
CHANGED
|
@@ -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
|
package/lib/dataLoader.d.ts.map
CHANGED
|
@@ -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;
|
|
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 };
|
package/lib/dataLoader.js.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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.
|
|
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.
|
|
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":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EACV,aAAa,EACb,OAAO,EACP,QAAQ,EACR,eAAe,EACf,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAY,OAAO,EAAE,MAAM,SAAS,CAAC;AAcjD,UAAU,wBAAwB;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,EAAE,KAAK,GAAG,MAAM,CAAC;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;CAC5B;AACD,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,WAAW,GAAG,IAAI,CAAC;AAEnE,KAAK,qBAAqB,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,WAAW,CAAC;AAEzD,qBAAa,kBAAkB;IACtB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;IAE3B,OAAO,CAAC,UAAU,CAAC,CAAU;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAe;gBAEvB,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,OAAO,EACP,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,cAAc,EACd,eAAe,EACf,QAAQ,EACR,eAAe,EACf,KAAK,EACL,WAAW,EACX,YAAY,GACb,EAAE,wBAAwB;IA6BpB,YAAY,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,GAAG,IAAI;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
/*
|
|
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
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
|
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;;"}
|