tree-element 0.1.1 → 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.
- package/README.md +43 -31
- package/lib/animation.d.ts +2 -2
- package/lib/animation.d.ts.map +1 -1
- package/lib/animation.js +16 -12
- package/lib/animation.js.map +1 -1
- package/lib/classNames.d.ts.map +1 -1
- package/lib/classNames.js +2 -2
- package/lib/classNames.js.map +1 -1
- package/lib/dataLoader.d.ts +1 -0
- package/lib/dataLoader.d.ts.map +1 -1
- package/lib/dataLoader.js +22 -20
- package/lib/dataLoader.js.map +1 -1
- package/lib/dragAndDropHandler/binarySearch.js +3 -3
- package/lib/dragAndDropHandler/binarySearch.js.map +1 -1
- package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -1
- package/lib/dragAndDropHandler/dragElement.js +11 -13
- package/lib/dragAndDropHandler/dragElement.js.map +1 -1
- package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -1
- package/lib/dragAndDropHandler/generateHitAreas.js +25 -25
- package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -1
- package/lib/dragAndDropHandler/index.d.ts.map +1 -1
- package/lib/dragAndDropHandler/index.js +125 -158
- package/lib/dragAndDropHandler/index.js.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.js +23 -22
- package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
- package/lib/dragAndDropHandler/types.d.ts.map +1 -1
- package/lib/elementsRenderer.d.ts +20 -7
- package/lib/elementsRenderer.d.ts.map +1 -1
- package/lib/elementsRenderer.js +195 -136
- 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 +36 -13
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +386 -349
- package/lib/index.js.map +1 -1
- package/lib/keyHandler.d.ts +13 -8
- package/lib/keyHandler.d.ts.map +1 -1
- package/lib/keyHandler.js +106 -51
- package/lib/keyHandler.js.map +1 -1
- package/lib/methodTypes.d.ts +3 -3
- 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 +36 -49
- package/lib/mouseHandler.js.map +1 -1
- package/lib/mouseUtils.d.ts.map +1 -1
- package/lib/mouseUtils.js +2 -2
- package/lib/mouseUtils.js.map +1 -1
- package/lib/node.d.ts +47 -16
- package/lib/node.d.ts.map +1 -1
- package/lib/node.js +169 -171
- package/lib/node.js.map +1 -1
- package/lib/nodeElement/borderDropHint.d.ts.map +1 -1
- package/lib/nodeElement/borderDropHint.js +4 -5
- package/lib/nodeElement/borderDropHint.js.map +1 -1
- package/lib/nodeElement/folderElement.d.ts +8 -5
- package/lib/nodeElement/folderElement.d.ts.map +1 -1
- package/lib/nodeElement/folderElement.js +75 -67
- package/lib/nodeElement/folderElement.js.map +1 -1
- package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
- package/lib/nodeElement/ghostDropHint.js +13 -13
- package/lib/nodeElement/ghostDropHint.js.map +1 -1
- package/lib/nodeElement/index.d.ts +2 -1
- package/lib/nodeElement/index.d.ts.map +1 -1
- package/lib/nodeElement/index.js +38 -30
- 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 +19 -3
- package/lib/options.d.ts.map +1 -1
- package/lib/positionUtils.js +3 -3
- package/lib/positionUtils.js.map +1 -1
- package/lib/requestUrl.d.ts +1 -1
- package/lib/requestUrl.d.ts.map +1 -1
- package/lib/requestUrl.js +6 -17
- package/lib/requestUrl.js.map +1 -1
- package/lib/saveStateHandler.d.ts.map +1 -1
- package/lib/saveStateHandler.js +59 -89
- package/lib/saveStateHandler.js.map +1 -1
- package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/containerScrollParent.js +11 -18
- package/lib/scrollHandler/containerScrollParent.js.map +1 -1
- package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/createScrollParent.js +12 -13
- package/lib/scrollHandler/createScrollParent.js.map +1 -1
- package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/documentScrollParent.js +18 -27
- package/lib/scrollHandler/documentScrollParent.js.map +1 -1
- package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/scrollParent.js +30 -34
- package/lib/scrollHandler/scrollParent.js.map +1 -1
- package/lib/scrollHandler.d.ts.map +1 -1
- package/lib/scrollHandler.js +11 -14
- package/lib/scrollHandler.js.map +1 -1
- package/lib/selectNodeHandler.d.ts +4 -2
- package/lib/selectNodeHandler.d.ts.map +1 -1
- package/lib/selectNodeHandler.js +64 -83
- package/lib/selectNodeHandler.js.map +1 -1
- package/lib/setDefaultOptions.d.ts.map +1 -1
- package/lib/setDefaultOptions.js +34 -38
- package/lib/setDefaultOptions.js.map +1 -1
- package/lib/triggerCustomEvent.d.ts.map +1 -1
- package/lib/triggerCustomEvent.js +2 -2
- package/lib/triggerCustomEvent.js.map +1 -1
- package/lib/util.d.ts.map +1 -1
- package/lib/util.js +2 -2
- 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 +43 -32
- package/src/animation.ts +14 -12
- package/src/classNames.ts +52 -52
- package/src/dataLoader.ts +79 -71
- package/src/dragAndDropHandler/binarySearch.ts +17 -17
- package/src/dragAndDropHandler/dragElement.ts +51 -50
- package/src/dragAndDropHandler/generateHitAreas.ts +156 -161
- package/src/dragAndDropHandler/index.ts +334 -348
- package/src/dragAndDropHandler/iterateVisibleNodes.ts +61 -63
- package/src/dragAndDropHandler/types.ts +5 -5
- package/src/elementsRenderer.ts +377 -294
- package/src/events.ts +241 -208
- package/src/header.txt +1 -1
- package/src/index.ts +259 -229
- package/src/keyHandler.ts +179 -115
- package/src/methodTypes.ts +7 -10
- package/src/mouseHandler.ts +316 -316
- package/src/mouseUtils.ts +14 -14
- package/src/node.ts +773 -771
- package/src/nodeElement/borderDropHint.ts +25 -25
- package/src/nodeElement/folderElement.ts +116 -102
- package/src/nodeElement/ghostDropHint.ts +64 -62
- package/src/nodeElement/index.ts +81 -73
- package/src/nodeUtils.ts +5 -5
- package/src/options.ts +25 -5
- package/src/requestUrl.ts +7 -14
- package/src/saveStateHandler.ts +191 -207
- package/src/scrollHandler/containerScrollParent.ts +40 -49
- package/src/scrollHandler/createScrollParent.ts +26 -27
- package/src/scrollHandler/documentScrollParent.ts +66 -72
- package/src/scrollHandler/scrollParent.ts +90 -86
- package/src/scrollHandler.ts +45 -45
- package/src/selectNodeHandler.ts +171 -165
- package/src/setDefaultOptions.ts +44 -32
- package/src/triggerCustomEvent.ts +7 -3
- package/src/util.ts +2 -3
- package/src/version.ts +1 -1
- package/tree_element.css +87 -69
- package/tree_element.debug.js +3866 -3831
- 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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Tree-element
|
|
2
2
|
|
|
3
3
|
Tree widget in plain javascript. No jQuery, no framework, no runtime dependencies.
|
|
4
4
|
|
|
@@ -11,6 +11,10 @@ Tree widget in plain javascript. No jQuery, no framework, no runtime dependencie
|
|
|
11
11
|
|
|
12
12
|
Full documentation: https://mbraak.github.io/tree-element/
|
|
13
13
|
|
|
14
|
+
npm package: https://www.npmjs.com/package/tree-element
|
|
15
|
+
|
|
16
|
+

|
|
17
|
+
|
|
14
18
|
## Install
|
|
15
19
|
|
|
16
20
|
```sh
|
|
@@ -75,32 +79,34 @@ new TreeElement({
|
|
|
75
79
|
|
|
76
80
|
## Options
|
|
77
81
|
|
|
78
|
-
| Option | Default
|
|
79
|
-
| ----------------- |
|
|
80
|
-
| `animationSpeed` | `"fast"`
|
|
81
|
-
| `
|
|
82
|
-
| `
|
|
83
|
-
| `
|
|
82
|
+
| Option | Default | Description |
|
|
83
|
+
| ----------------- | ----------------------- | --------------------------------------------------------------------------------- |
|
|
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 |
|
|
87
|
+
| `autoEscape` | `true` | Escape node names. Set to `false` to render html in a name |
|
|
88
|
+
| `autoOpen` | `false` | `true` opens everything, a number opens that many levels (`0` is the first level) |
|
|
89
|
+
| `buttonLeft` | `true` | Put the open/close button left of the title |
|
|
84
90
|
| `classPrefix` | `"tree-element"` | The prefix of all css classes |
|
|
85
|
-
| `closedIcon` | `►` (`◄` in rtl)
|
|
91
|
+
| `closedIcon` | `►` (`◄` in rtl) | Html string or element |
|
|
86
92
|
| `commonClassName` | `"tree-element-common"` | The class that every element gets |
|
|
87
|
-
| `data` |
|
|
88
|
-
| `dataFilter` |
|
|
89
|
-
| `dataUrl` | `data-url` attribute
|
|
90
|
-
| `dragAndDrop` | `false`
|
|
91
|
-
| `keyboardSupport` | `true`
|
|
92
|
-
| `nodeClass` | `Node`
|
|
93
|
-
| `openFolderDelay` | `500`
|
|
94
|
-
| `openedIcon` | `▼`
|
|
95
|
-
| `rtl` | `data-rtl` attribute
|
|
96
|
-
| `saveState` | `false`
|
|
97
|
-
| `selectable` | `true`
|
|
98
|
-
| `showEmptyFolder` | `false`
|
|
99
|
-
| `slide` | `true`
|
|
100
|
-
| `startDndDelay` | `300`
|
|
101
|
-
| `tabIndex` | `0`
|
|
93
|
+
| `data` | | The nodes to display |
|
|
94
|
+
| `dataFilter` | | Transforms the response of `dataUrl` into node data |
|
|
95
|
+
| `dataUrl` | `data-url` attribute | Url, or a function returning a url |
|
|
96
|
+
| `dragAndDrop` | `false` | Enable drag and drop |
|
|
97
|
+
| `keyboardSupport` | `true` | Navigate with the keyboard |
|
|
98
|
+
| `nodeClass` | `Node` | Subclass of `Node` to use for nodes |
|
|
99
|
+
| `openFolderDelay` | `500` | Milliseconds before a folder opens while dragging over it. `false` disables it |
|
|
100
|
+
| `openedIcon` | `▼` | Html string or element |
|
|
101
|
+
| `rtl` | `data-rtl` attribute | Right-to-left rendering |
|
|
102
|
+
| `saveState` | `false` | `true`, or a string to use as the storage key |
|
|
103
|
+
| `selectable` | `true` | Allow selecting nodes |
|
|
104
|
+
| `showEmptyFolder` | `false` | Show the open/close button for nodes without children |
|
|
105
|
+
| `slide` | `true` | Animate opening and closing |
|
|
106
|
+
| `startDndDelay` | `300` | Milliseconds to hold before a drag starts |
|
|
107
|
+
| `tabIndex` | `0` | Tab index of the tree element |
|
|
102
108
|
| `treeClassName` | `"tree-element"` | The class of the root `ul` |
|
|
103
|
-
| `useContextMenu` | `true`
|
|
109
|
+
| `useContextMenu` | `true` | Fire `tree.contextmenu` on right click |
|
|
104
110
|
|
|
105
111
|
### Callbacks
|
|
106
112
|
|
|
@@ -133,6 +139,7 @@ element.addEventListener("tree.select", (e) => {
|
|
|
133
139
|
| `tree.click` | `node`, `originalEvent` |
|
|
134
140
|
| `tree.dblclick` | `node`, `originalEvent` |
|
|
135
141
|
| `tree.contextmenu` | `node`, `originalEvent` |
|
|
142
|
+
| `tree.activate` | `node`, `originalEvent` |
|
|
136
143
|
| `tree.select` | `node`, `deselectedNode` |
|
|
137
144
|
| `tree.deselect` | `node` |
|
|
138
145
|
| `tree.open` | `node` |
|
|
@@ -158,7 +165,8 @@ Nodes are `Node` instances. Get one with `getNodeById`, `getNodeByName`,
|
|
|
158
165
|
|
|
159
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)`
|
|
160
167
|
|
|
161
|
-
**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.
|
|
162
170
|
|
|
163
171
|
**Selection**: `selectNode(node, options?)`, `getSelectedNode()`, `getSelectedNodes()`, `isNodeSelected(node)`, `addToSelection(node, mustSetFocus?)`, `removeFromSelection(node)`, `moveUp()`, `moveDown()`
|
|
164
172
|
|
|
@@ -188,11 +196,11 @@ const data: NodeData[] = [{ name: "root", id: 1 }];
|
|
|
188
196
|
|
|
189
197
|
## Entry points
|
|
190
198
|
|
|
191
|
-
|
|
|
192
|
-
|
|
|
193
|
-
| `import "tree-element"`
|
|
194
|
-
| `require`, script tag
|
|
195
|
-
| `tree-element/tree_element.css` | The stylesheet
|
|
199
|
+
| | |
|
|
200
|
+
| ------------------------------- | ------------------------------------------------------------------ |
|
|
201
|
+
| `import "tree-element"` | `lib/index.js`, unbundled es modules |
|
|
202
|
+
| `require`, script tag | `tree_element.js`, minified iife exposing the global `TreeElement` |
|
|
203
|
+
| `tree-element/tree_element.css` | The stylesheet |
|
|
196
204
|
|
|
197
205
|
`tree_element.debug.js` is the same bundle without minification.
|
|
198
206
|
|
|
@@ -214,7 +222,11 @@ pnpm docs-check # type-check the code snippets in the docs
|
|
|
214
222
|
pnpm ci # lint, typecheck, check the docs and test
|
|
215
223
|
```
|
|
216
224
|
|
|
217
|
-
`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`.
|
|
218
230
|
|
|
219
231
|
### Releasing
|
|
220
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
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
let getAnimationDuration = duration => {
|
|
2
2
|
if (typeof duration === "number") {
|
|
3
3
|
return duration;
|
|
4
4
|
}
|
|
5
5
|
return duration === "slow" ? 600 : 200;
|
|
6
6
|
};
|
|
7
|
-
|
|
7
|
+
let slideDown = (element, animationSpeed) => {
|
|
8
8
|
element.style.display = "block";
|
|
9
|
-
|
|
9
|
+
let animation = element.animate([{
|
|
10
10
|
height: "0",
|
|
11
11
|
overflow: "hidden"
|
|
12
12
|
}, {
|
|
@@ -15,12 +15,14 @@ const 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
|
-
|
|
23
|
-
|
|
24
|
+
let slideUp = (element, animationSpeed) => {
|
|
25
|
+
let animation = element.animate([{
|
|
24
26
|
height: `${element.scrollHeight}px`,
|
|
25
27
|
overflow: "hidden"
|
|
26
28
|
}, {
|
|
@@ -29,10 +31,12 @@ const 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/classNames.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classNames.d.ts","sourceRoot":"","sources":["../src/classNames.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;
|
|
1
|
+
{"version":3,"file":"classNames.d.ts","sourceRoot":"","sources":["../src/classNames.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AAOnD,QAAA,MAAM,gBAAgB,GAAI,kDAIvB,iBAAiB,KAAG,UAwBrB,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
|
package/lib/classNames.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
let DEFAULT_CLASS_PREFIX = "tree-element";
|
|
2
2
|
|
|
3
3
|
/* Create the class names that the widget puts on the elements it creates.
|
|
4
4
|
* They are all derived from classPrefix, except for the class of the root
|
|
5
5
|
* element and the class that every element gets, which have an option of
|
|
6
6
|
* their own.
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
let createClassNames = ({
|
|
9
9
|
classPrefix,
|
|
10
10
|
commonClassName,
|
|
11
11
|
treeClassName
|
package/lib/classNames.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classNames.js","sources":["../src/classNames.ts"],"sourcesContent":["export interface ClassNames {\n
|
|
1
|
+
{"version":3,"file":"classNames.js","sources":["../src/classNames.ts"],"sourcesContent":["export interface ClassNames {\n border: string;\n circle: string;\n closed: string;\n common: string;\n dnd: string;\n dragging: string;\n element: string;\n folder: string;\n ghost: string;\n inside: string;\n line: string;\n loading: string;\n moving: string;\n rtl: string;\n selected: string;\n title: string;\n titleButtonLeft: string;\n titleButtonRight: string;\n titleFolder: string;\n toggler: string;\n togglerLeft: string;\n togglerRight: string;\n tree: string;\n}\n\nexport interface ClassNamesOptions {\n classPrefix: string;\n commonClassName?: string;\n treeClassName?: string;\n}\n\nexport const DEFAULT_CLASS_PREFIX = \"tree-element\";\n\n/* Create the class names that the widget puts on the elements it creates.\n * They are all derived from classPrefix, except for the class of the root\n * element and the class that every element gets, which have an option of\n * their own.\n */\nconst createClassNames = ({\n classPrefix,\n commonClassName,\n treeClassName,\n}: ClassNamesOptions): ClassNames => ({\n border: `${classPrefix}-border`,\n circle: `${classPrefix}-circle`,\n closed: `${classPrefix}-closed`,\n common: commonClassName ?? `${classPrefix}-common`,\n dnd: `${classPrefix}-dnd`,\n dragging: `${classPrefix}-dragging`,\n element: `${classPrefix}-element`,\n folder: `${classPrefix}-folder`,\n ghost: `${classPrefix}-ghost`,\n inside: `${classPrefix}-inside`,\n line: `${classPrefix}-line`,\n loading: `${classPrefix}-loading`,\n moving: `${classPrefix}-moving`,\n rtl: `${classPrefix}-rtl`,\n selected: `${classPrefix}-selected`,\n title: `${classPrefix}-title`,\n titleButtonLeft: `${classPrefix}-title-button-left`,\n titleButtonRight: `${classPrefix}-title-button-right`,\n titleFolder: `${classPrefix}-title-folder`,\n toggler: `${classPrefix}-toggler`,\n togglerLeft: `${classPrefix}-toggler-left`,\n togglerRight: `${classPrefix}-toggler-right`,\n tree: treeClassName ?? classPrefix,\n});\n\nexport default createClassNames;\n"],"names":[],"mappings":"AAgCO,IAAM,oBAAoB,GAAG;;AAEpC;AACA;AACA;AACA;AACA;AACA,IAAM,gBAAgB,GAAG,CAAC;EACxB,WAAW;EACX,eAAe;AACf,EAAA;AACiB,CAAC,MAAkB;EACpC,MAAM,EAAE,CAAA,EAAG,WAAW,CAAA,OAAA,CAAS;EAC/B,MAAM,EAAE,CAAA,EAAG,WAAW,CAAA,OAAA,CAAS;EAC/B,MAAM,EAAE,CAAA,EAAG,WAAW,CAAA,OAAA,CAAS;AAC/B,EAAA,MAAM,EAAE,eAAe,IAAI,CAAA,EAAG,WAAW,CAAA,OAAA,CAAS;EAClD,GAAG,EAAE,CAAA,EAAG,WAAW,CAAA,IAAA,CAAM;EACzB,QAAQ,EAAE,CAAA,EAAG,WAAW,CAAA,SAAA,CAAW;EACnC,OAAO,EAAE,CAAA,EAAG,WAAW,CAAA,QAAA,CAAU;EACjC,MAAM,EAAE,CAAA,EAAG,WAAW,CAAA,OAAA,CAAS;EAC/B,KAAK,EAAE,CAAA,EAAG,WAAW,CAAA,MAAA,CAAQ;EAC7B,MAAM,EAAE,CAAA,EAAG,WAAW,CAAA,OAAA,CAAS;EAC/B,IAAI,EAAE,CAAA,EAAG,WAAW,CAAA,KAAA,CAAO;EAC3B,OAAO,EAAE,CAAA,EAAG,WAAW,CAAA,QAAA,CAAU;EACjC,MAAM,EAAE,CAAA,EAAG,WAAW,CAAA,OAAA,CAAS;EAC/B,GAAG,EAAE,CAAA,EAAG,WAAW,CAAA,IAAA,CAAM;EACzB,QAAQ,EAAE,CAAA,EAAG,WAAW,CAAA,SAAA,CAAW;EACnC,KAAK,EAAE,CAAA,EAAG,WAAW,CAAA,MAAA,CAAQ;EAC7B,eAAe,EAAE,CAAA,EAAG,WAAW,CAAA,kBAAA,CAAoB;EACnD,gBAAgB,EAAE,CAAA,EAAG,WAAW,CAAA,mBAAA,CAAqB;EACrD,WAAW,EAAE,CAAA,EAAG,WAAW,CAAA,aAAA,CAAe;EAC1C,OAAO,EAAE,CAAA,EAAG,WAAW,CAAA,QAAA,CAAU;EACjC,WAAW,EAAE,CAAA,EAAG,WAAW,CAAA,aAAA,CAAe;EAC1C,YAAY,EAAE,CAAA,EAAG,WAAW,CAAA,cAAA,CAAgB;EAC5C,IAAI,EAAE,aAAa,IAAI;AACzB,CAAC;;"}
|
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;
|
|
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
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
class DataLoader {
|
|
2
|
-
_abortController;
|
|
3
|
-
_classNames;
|
|
4
|
-
_dataFilter;
|
|
5
|
-
_loadData;
|
|
6
|
-
_treeElement;
|
|
7
|
-
_triggerEvent;
|
|
8
2
|
constructor({
|
|
9
|
-
classNames,
|
|
10
|
-
dataFilter,
|
|
11
|
-
loadData,
|
|
12
|
-
treeElement,
|
|
13
|
-
triggerEvent
|
|
3
|
+
_classNames: classNames,
|
|
4
|
+
_dataFilter: dataFilter,
|
|
5
|
+
_loadData: loadData,
|
|
6
|
+
_treeElement: treeElement,
|
|
7
|
+
_triggerEvent: triggerEvent
|
|
14
8
|
}) {
|
|
15
9
|
this._abortController = new AbortController();
|
|
16
10
|
this._classNames = classNames;
|
|
@@ -19,26 +13,31 @@ class DataLoader {
|
|
|
19
13
|
this._treeElement = treeElement;
|
|
20
14
|
this._triggerEvent = triggerEvent;
|
|
21
15
|
}
|
|
22
|
-
|
|
16
|
+
_deinit() {
|
|
23
17
|
this._abortController.abort();
|
|
24
18
|
}
|
|
25
|
-
async
|
|
26
|
-
|
|
19
|
+
async _loadFromUrl(url, node) {
|
|
20
|
+
let element = node?.element ?? this._treeElement;
|
|
27
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");
|
|
28
26
|
this._triggerEvent("tree.loading_data", {
|
|
29
27
|
element,
|
|
30
28
|
node
|
|
31
29
|
});
|
|
32
|
-
|
|
30
|
+
let stopLoading = () => {
|
|
33
31
|
element.classList.remove(this._classNames.loading);
|
|
32
|
+
titleSpan?.removeAttribute("aria-busy");
|
|
34
33
|
this._triggerEvent("tree.loaded_data", {
|
|
35
34
|
element,
|
|
36
35
|
node
|
|
37
36
|
});
|
|
38
37
|
};
|
|
39
|
-
|
|
38
|
+
let handleResponse = async response => {
|
|
40
39
|
if (response.ok) {
|
|
41
|
-
|
|
40
|
+
let data = await response.json();
|
|
42
41
|
stopLoading();
|
|
43
42
|
this._loadData(this._dataFilter ? this._dataFilter(data) : data, node);
|
|
44
43
|
} else {
|
|
@@ -48,9 +47,9 @@ class DataLoader {
|
|
|
48
47
|
});
|
|
49
48
|
}
|
|
50
49
|
};
|
|
51
|
-
|
|
52
|
-
url.
|
|
53
|
-
return fetch(url.
|
|
50
|
+
let signal = this._abortController.signal;
|
|
51
|
+
url._setSearchParam("_", Date.now().toString());
|
|
52
|
+
return fetch(url._value(), {
|
|
54
53
|
headers: {
|
|
55
54
|
"Content-Type": "application/json"
|
|
56
55
|
},
|
|
@@ -66,6 +65,9 @@ class DataLoader {
|
|
|
66
65
|
});
|
|
67
66
|
});
|
|
68
67
|
}
|
|
68
|
+
_getTitleSpan(element) {
|
|
69
|
+
return element.querySelector(`:scope > .${this._classNames.element} > .${this._classNames.title}`);
|
|
70
|
+
}
|
|
69
71
|
}
|
|
70
72
|
|
|
71
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
|
|
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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"}
|
|
@@ -2,12 +2,12 @@ function binarySearch(items, compareFn) {
|
|
|
2
2
|
let low = 0;
|
|
3
3
|
let high = items.length;
|
|
4
4
|
while (low < high) {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
let mid = low + high >> 1;
|
|
6
|
+
let item = items[mid];
|
|
7
7
|
if (item === undefined) {
|
|
8
8
|
return null;
|
|
9
9
|
}
|
|
10
|
-
|
|
10
|
+
let compareResult = compareFn(item);
|
|
11
11
|
if (compareResult > 0) {
|
|
12
12
|
high = mid;
|
|
13
13
|
} else if (compareResult < 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binarySearch.js","sources":["../../src/dragAndDropHandler/binarySearch.ts"],"sourcesContent":["function binarySearch<T>(items: T[], compareFn: (a: T) => number): null | T {\n
|
|
1
|
+
{"version":3,"file":"binarySearch.js","sources":["../../src/dragAndDropHandler/binarySearch.ts"],"sourcesContent":["function binarySearch<T>(items: T[], compareFn: (a: T) => number): null | T {\n let low = 0;\n let high = items.length;\n\n while (low < high) {\n const mid = (low + high) >> 1;\n const item = items[mid];\n\n if (item === undefined) {\n return null;\n }\n\n const compareResult = compareFn(item);\n\n if (compareResult > 0) {\n high = mid;\n } else if (compareResult < 0) {\n low = mid + 1;\n } else {\n return item;\n }\n }\n\n return null;\n}\n\nexport default binarySearch;\n"],"names":[],"mappings":"AAAA,SAAS,YAAY,CAAI,KAAU,EAAE,SAA2B,EAAY;EAC1E,IAAI,GAAG,GAAG,CAAC;AACX,EAAA,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM;EAEvB,OAAO,GAAG,GAAG,IAAI,EAAE;AACjB,IAAA,IAAM,GAAG,GAAI,GAAG,GAAG,IAAI,IAAK,CAAC;AAC7B,IAAA,IAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC;IAEvB,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,MAAA,OAAO,IAAI;AACb,IAAA;AAEA,IAAA,IAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC;IAErC,IAAI,aAAa,GAAG,CAAC,EAAE;AACrB,MAAA,IAAI,GAAG,GAAG;AACZ,IAAA,CAAC,MAAM,IAAI,aAAa,GAAG,CAAC,EAAE;MAC5B,GAAG,GAAG,GAAG,GAAG,CAAC;AACf,IAAA,CAAC,MAAM;AACL,MAAA,OAAO,IAAI;AACb,IAAA;AACF,EAAA;AAEA,EAAA,OAAO,IAAI;AACb;;"}
|
|
@@ -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;
|
|
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"}
|
|
@@ -1,33 +1,31 @@
|
|
|
1
1
|
class DragElement {
|
|
2
|
-
_element;
|
|
3
|
-
_offsetX;
|
|
4
|
-
_offsetY;
|
|
5
2
|
constructor({
|
|
6
|
-
autoEscape,
|
|
7
|
-
classNames,
|
|
8
|
-
nodeName,
|
|
9
|
-
offsetX,
|
|
10
|
-
offsetY,
|
|
11
|
-
treeElement
|
|
3
|
+
_autoEscape: autoEscape,
|
|
4
|
+
_classNames: classNames,
|
|
5
|
+
_nodeName: nodeName,
|
|
6
|
+
_offsetX: offsetX,
|
|
7
|
+
_offsetY: offsetY,
|
|
8
|
+
_treeElement: treeElement
|
|
12
9
|
}) {
|
|
13
10
|
this._offsetX = offsetX;
|
|
14
11
|
this._offsetY = offsetY;
|
|
15
12
|
this._element = this._createElement(nodeName, autoEscape, classNames);
|
|
16
|
-
treeElement.
|
|
13
|
+
treeElement.append(this._element);
|
|
17
14
|
}
|
|
18
|
-
|
|
15
|
+
_move(pageX, pageY) {
|
|
19
16
|
this._element.style.left = `${pageX - this._offsetX}px`;
|
|
20
17
|
this._element.style.top = `${pageY - this._offsetY}px`;
|
|
21
18
|
}
|
|
22
|
-
|
|
19
|
+
_remove() {
|
|
23
20
|
this._element.remove();
|
|
24
21
|
}
|
|
25
22
|
_createElement(nodeName, autoEscape, classNames) {
|
|
26
|
-
|
|
23
|
+
let element = document.createElement("span");
|
|
27
24
|
element.classList.add(classNames.title, classNames.dragging);
|
|
28
25
|
if (autoEscape) {
|
|
29
26
|
element.textContent = nodeName;
|
|
30
27
|
} else {
|
|
28
|
+
// eslint-disable-next-line no-unsanitized/property -- the user opted out of escaping with autoEscape: false
|
|
31
29
|
element.innerHTML = nodeName;
|
|
32
30
|
}
|
|
33
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
|
|
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":"generateHitAreas.d.ts","sourceRoot":"","sources":["../../src/dragAndDropHandler/generateHitAreas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAKvC,UAAU,WAAW;
|
|
1
|
+
{"version":3,"file":"generateHitAreas.d.ts","sourceRoot":"","sources":["../../src/dragAndDropHandler/generateHitAreas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAKvC,UAAU,WAAW;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,oBAAoB,GAC/B,MAAM,IAAI,EACV,aAAa,IAAI,KAChB,WAAW,EA8Gb,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,UAAU,OAAO,EAAE,EACnB,kBAAkB,WAAW,EAAE,EAC/B,KAAK,MAAM,EACX,QAAQ,MAAM,SAsBf,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,cAAc,WAAW,EAAE,EAC3B,YAAY,MAAM,KACjB,OAAO,EAuBT,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAAI,MAAM,IAAI,EAAE,aAAa,IAAI,EAAE,YAAY,MAAM,cAIxE,CAAC;AAEJ,eAAe,gBAAgB,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { getOffsetTop } from '../positionUtils.js';
|
|
2
2
|
import iterateVisibleNodes from './iterateVisibleNodes.js';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
let generateHitPositions = (tree, currentNode) => {
|
|
5
|
+
let hitPositions = [];
|
|
6
6
|
let lastTop = 0;
|
|
7
|
-
|
|
7
|
+
let addHitPosition = (node, position, top) => {
|
|
8
8
|
hitPositions.push({
|
|
9
9
|
node,
|
|
10
10
|
position,
|
|
@@ -12,7 +12,7 @@ const generateHitPositions = (tree, currentNode) => {
|
|
|
12
12
|
});
|
|
13
13
|
lastTop = top;
|
|
14
14
|
};
|
|
15
|
-
|
|
15
|
+
let handleAfterOpenFolder = (node, nextNode) => {
|
|
16
16
|
if (node === currentNode || nextNode === currentNode) {
|
|
17
17
|
// Cannot move before or after current item
|
|
18
18
|
addHitPosition(node, null, lastTop);
|
|
@@ -20,8 +20,8 @@ const generateHitPositions = (tree, currentNode) => {
|
|
|
20
20
|
addHitPosition(node, "after", lastTop);
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
let handleClosedFolder = (node, nextNode, element) => {
|
|
24
|
+
let top = getOffsetTop(element);
|
|
25
25
|
if (node === currentNode) {
|
|
26
26
|
// Cannot move after current item
|
|
27
27
|
addHitPosition(node, null, top);
|
|
@@ -34,13 +34,13 @@ const generateHitPositions = (tree, currentNode) => {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
};
|
|
37
|
-
|
|
37
|
+
let handleFirstNode = node => {
|
|
38
38
|
if (node !== currentNode && node.element) {
|
|
39
39
|
addHitPosition(node, "before", getOffsetTop(node.element));
|
|
40
40
|
}
|
|
41
41
|
};
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
let handleNode = (node, nextNode, element) => {
|
|
43
|
+
let top = getOffsetTop(element);
|
|
44
44
|
if (node === currentNode) {
|
|
45
45
|
// Cannot move inside current item
|
|
46
46
|
addHitPosition(node, null, top);
|
|
@@ -54,13 +54,13 @@ const generateHitPositions = (tree, currentNode) => {
|
|
|
54
54
|
addHitPosition(node, "after", top);
|
|
55
55
|
}
|
|
56
56
|
};
|
|
57
|
-
|
|
57
|
+
let handleOpenFolder = (node, element) => {
|
|
58
58
|
if (node === currentNode) {
|
|
59
59
|
// Cannot move inside current item
|
|
60
60
|
|
|
61
61
|
// Dnd over the current element is not possible: add a position with type None for the top and the bottom.
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
let top = getOffsetTop(element);
|
|
63
|
+
let height = element.clientHeight;
|
|
64
64
|
addHitPosition(node, null, top);
|
|
65
65
|
if (height > 5) {
|
|
66
66
|
// Subtract 5 pixels to allow more space for the next element.
|
|
@@ -80,21 +80,21 @@ const generateHitPositions = (tree, currentNode) => {
|
|
|
80
80
|
return true;
|
|
81
81
|
};
|
|
82
82
|
iterateVisibleNodes(tree, {
|
|
83
|
-
handleAfterOpenFolder,
|
|
84
|
-
handleClosedFolder,
|
|
85
|
-
handleFirstNode,
|
|
86
|
-
handleNode,
|
|
87
|
-
handleOpenFolder
|
|
83
|
+
_handleAfterOpenFolder: handleAfterOpenFolder,
|
|
84
|
+
_handleClosedFolder: handleClosedFolder,
|
|
85
|
+
_handleFirstNode: handleFirstNode,
|
|
86
|
+
_handleNode: handleNode,
|
|
87
|
+
_handleOpenFolder: handleOpenFolder
|
|
88
88
|
});
|
|
89
89
|
return hitPositions;
|
|
90
90
|
};
|
|
91
|
-
|
|
91
|
+
let generateHitAreasForGroup = (hitAreas, positionsInGroup, top, bottom) => {
|
|
92
92
|
// limit positions in group
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
let positionCount = Math.min(positionsInGroup.length, 4);
|
|
94
|
+
let areaHeight = Math.round((bottom - top) / positionCount);
|
|
95
95
|
let areaTop = top;
|
|
96
96
|
for (let i = 0; i < positionCount; i++) {
|
|
97
|
-
|
|
97
|
+
let position = positionsInGroup[i];
|
|
98
98
|
if (position.position) {
|
|
99
99
|
hitAreas.push({
|
|
100
100
|
bottom: areaTop + areaHeight,
|
|
@@ -106,14 +106,14 @@ const generateHitAreasForGroup = (hitAreas, positionsInGroup, top, bottom) => {
|
|
|
106
106
|
areaTop += areaHeight;
|
|
107
107
|
}
|
|
108
108
|
};
|
|
109
|
-
|
|
109
|
+
let generateHitAreasFromPositions = (hitPositions, treeBottom) => {
|
|
110
110
|
if (!hitPositions.length) {
|
|
111
111
|
return [];
|
|
112
112
|
}
|
|
113
113
|
let previousTop = hitPositions[0].top;
|
|
114
114
|
let group = [];
|
|
115
|
-
|
|
116
|
-
for (
|
|
115
|
+
let hitAreas = [];
|
|
116
|
+
for (let position of hitPositions) {
|
|
117
117
|
if (position.top !== previousTop && group.length) {
|
|
118
118
|
generateHitAreasForGroup(hitAreas, group, previousTop, position.top);
|
|
119
119
|
previousTop = position.top;
|
|
@@ -124,7 +124,7 @@ const generateHitAreasFromPositions = (hitPositions, treeBottom) => {
|
|
|
124
124
|
generateHitAreasForGroup(hitAreas, group, previousTop, treeBottom);
|
|
125
125
|
return hitAreas;
|
|
126
126
|
};
|
|
127
|
-
|
|
127
|
+
let generateHitAreas = (tree, currentNode, treeBottom) => generateHitAreasFromPositions(generateHitPositions(tree, currentNode), treeBottom);
|
|
128
128
|
|
|
129
129
|
export { generateHitAreas as default, generateHitAreasForGroup, generateHitAreasFromPositions, generateHitPositions };
|
|
130
130
|
//# sourceMappingURL=generateHitAreas.js.map
|