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/src/animation.ts
CHANGED
|
@@ -11,8 +11,7 @@ export const getAnimationDuration = (duration: AnimationSpeed): number => {
|
|
|
11
11
|
export const slideDown = (
|
|
12
12
|
element: HTMLElement,
|
|
13
13
|
animationSpeed: AnimationSpeed,
|
|
14
|
-
|
|
15
|
-
): void => {
|
|
14
|
+
): Promise<void> => {
|
|
16
15
|
element.style.display = "block";
|
|
17
16
|
|
|
18
17
|
const animation = element.animate(
|
|
@@ -23,16 +22,17 @@ export const slideDown = (
|
|
|
23
22
|
{ duration: getAnimationDuration(animationSpeed) },
|
|
24
23
|
);
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
return new Promise((resolve) => {
|
|
26
|
+
animation.onfinish = () => {
|
|
27
|
+
resolve();
|
|
28
|
+
};
|
|
29
|
+
});
|
|
29
30
|
};
|
|
30
31
|
|
|
31
32
|
export const slideUp = (
|
|
32
33
|
element: HTMLElement,
|
|
33
34
|
animationSpeed: AnimationSpeed,
|
|
34
|
-
|
|
35
|
-
): void => {
|
|
35
|
+
): Promise<void> => {
|
|
36
36
|
const animation = element.animate(
|
|
37
37
|
[
|
|
38
38
|
{ height: `${element.scrollHeight}px`, overflow: "hidden" },
|
|
@@ -41,8 +41,10 @@ export const slideUp = (
|
|
|
41
41
|
{ duration: getAnimationDuration(animationSpeed) },
|
|
42
42
|
);
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
};
|
|
44
|
+
return new Promise((resolve) => {
|
|
45
|
+
animation.onfinish = () => {
|
|
46
|
+
element.style.display = "none";
|
|
47
|
+
resolve();
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
};
|
package/src/classNames.ts
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
export interface ClassNames {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
2
|
+
border: string;
|
|
3
|
+
circle: string;
|
|
4
|
+
closed: string;
|
|
5
|
+
common: string;
|
|
6
|
+
dnd: string;
|
|
7
|
+
dragging: string;
|
|
8
|
+
element: string;
|
|
9
|
+
folder: string;
|
|
10
|
+
ghost: string;
|
|
11
|
+
inside: string;
|
|
12
|
+
line: string;
|
|
13
|
+
loading: string;
|
|
14
|
+
moving: string;
|
|
15
|
+
rtl: string;
|
|
16
|
+
selected: string;
|
|
17
|
+
title: string;
|
|
18
|
+
titleButtonLeft: string;
|
|
19
|
+
titleButtonRight: string;
|
|
20
|
+
titleFolder: string;
|
|
21
|
+
toggler: string;
|
|
22
|
+
togglerLeft: string;
|
|
23
|
+
togglerRight: string;
|
|
24
|
+
tree: string;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export interface ClassNamesOptions {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
classPrefix: string;
|
|
29
|
+
commonClassName?: string;
|
|
30
|
+
treeClassName?: string;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export const DEFAULT_CLASS_PREFIX = "tree-element";
|
|
@@ -38,33 +38,33 @@ export const DEFAULT_CLASS_PREFIX = "tree-element";
|
|
|
38
38
|
* their own.
|
|
39
39
|
*/
|
|
40
40
|
const createClassNames = ({
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
classPrefix,
|
|
42
|
+
commonClassName,
|
|
43
|
+
treeClassName,
|
|
44
44
|
}: ClassNamesOptions): ClassNames => ({
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
45
|
+
border: `${classPrefix}-border`,
|
|
46
|
+
circle: `${classPrefix}-circle`,
|
|
47
|
+
closed: `${classPrefix}-closed`,
|
|
48
|
+
common: commonClassName ?? `${classPrefix}-common`,
|
|
49
|
+
dnd: `${classPrefix}-dnd`,
|
|
50
|
+
dragging: `${classPrefix}-dragging`,
|
|
51
|
+
element: `${classPrefix}-element`,
|
|
52
|
+
folder: `${classPrefix}-folder`,
|
|
53
|
+
ghost: `${classPrefix}-ghost`,
|
|
54
|
+
inside: `${classPrefix}-inside`,
|
|
55
|
+
line: `${classPrefix}-line`,
|
|
56
|
+
loading: `${classPrefix}-loading`,
|
|
57
|
+
moving: `${classPrefix}-moving`,
|
|
58
|
+
rtl: `${classPrefix}-rtl`,
|
|
59
|
+
selected: `${classPrefix}-selected`,
|
|
60
|
+
title: `${classPrefix}-title`,
|
|
61
|
+
titleButtonLeft: `${classPrefix}-title-button-left`,
|
|
62
|
+
titleButtonRight: `${classPrefix}-title-button-right`,
|
|
63
|
+
titleFolder: `${classPrefix}-title-folder`,
|
|
64
|
+
toggler: `${classPrefix}-toggler`,
|
|
65
|
+
togglerLeft: `${classPrefix}-toggler-left`,
|
|
66
|
+
togglerRight: `${classPrefix}-toggler-right`,
|
|
67
|
+
tree: treeClassName ?? classPrefix,
|
|
68
68
|
});
|
|
69
69
|
|
|
70
70
|
export default createClassNames;
|
package/src/dataLoader.ts
CHANGED
|
@@ -5,89 +5,97 @@ import type { DataFilter } from "./options";
|
|
|
5
5
|
import type RequestUrl from "./requestUrl";
|
|
6
6
|
|
|
7
7
|
interface DataLoaderParams {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
classNames: ClassNames;
|
|
9
|
+
dataFilter?: DataFilter;
|
|
10
|
+
loadData: LoadData;
|
|
11
|
+
treeElement: HTMLElement;
|
|
12
|
+
triggerEvent: TriggerEvent;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export default class DataLoader {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
private abortController: AbortController;
|
|
17
|
+
private classNames: ClassNames;
|
|
18
|
+
private dataFilter?: DataFilter;
|
|
19
|
+
private loadData: LoadData;
|
|
20
|
+
private treeElement: HTMLElement;
|
|
21
|
+
private triggerEvent: TriggerEvent;
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
23
|
+
constructor({
|
|
24
|
+
classNames,
|
|
25
|
+
dataFilter,
|
|
26
|
+
loadData,
|
|
27
|
+
treeElement,
|
|
28
|
+
triggerEvent,
|
|
29
|
+
}: DataLoaderParams) {
|
|
30
|
+
this.abortController = new AbortController();
|
|
31
|
+
this.classNames = classNames;
|
|
32
|
+
this.dataFilter = dataFilter;
|
|
33
|
+
this.loadData = loadData;
|
|
34
|
+
this.treeElement = treeElement;
|
|
35
|
+
this.triggerEvent = triggerEvent;
|
|
36
|
+
}
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
public deinit(): void {
|
|
39
|
+
this.abortController.abort();
|
|
40
|
+
}
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
): Promise<void> {
|
|
46
|
-
const element = node?.element ?? this.treeElement;
|
|
47
|
-
element.classList.add(this.classNames.loading);
|
|
42
|
+
public async loadFromUrl(url: RequestUrl, node?: Node): Promise<void> {
|
|
43
|
+
const element = node?.element ?? this.treeElement;
|
|
44
|
+
element.classList.add(this.classNames.loading);
|
|
48
45
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
});
|
|
46
|
+
// Tell screen readers that the children of the folder are loading
|
|
47
|
+
const titleSpan = node ? this.getTitleSpan(element) : null;
|
|
48
|
+
titleSpan?.setAttribute("aria-busy", "true");
|
|
53
49
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
node,
|
|
59
|
-
});
|
|
60
|
-
};
|
|
50
|
+
this.triggerEvent("tree.loading_data", {
|
|
51
|
+
element,
|
|
52
|
+
node,
|
|
53
|
+
});
|
|
61
54
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
55
|
+
const stopLoading = (): void => {
|
|
56
|
+
element.classList.remove(this.classNames.loading);
|
|
57
|
+
titleSpan?.removeAttribute("aria-busy");
|
|
58
|
+
this.triggerEvent("tree.loaded_data", {
|
|
59
|
+
element,
|
|
60
|
+
node,
|
|
61
|
+
});
|
|
62
|
+
};
|
|
65
63
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
node
|
|
70
|
-
);
|
|
71
|
-
} else {
|
|
72
|
-
stopLoading();
|
|
64
|
+
const handleResponse = async (response: Response): Promise<void> => {
|
|
65
|
+
if (response.ok) {
|
|
66
|
+
const data = (await response.json()) as NodeData[];
|
|
73
67
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
68
|
+
stopLoading();
|
|
69
|
+
this.loadData(this.dataFilter ? this.dataFilter(data) : data, node);
|
|
70
|
+
} else {
|
|
71
|
+
stopLoading();
|
|
77
72
|
|
|
78
|
-
|
|
79
|
-
|
|
73
|
+
this.triggerEvent("tree.load_failed", { response });
|
|
74
|
+
}
|
|
75
|
+
};
|
|
80
76
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
.catch((error: unknown) => {
|
|
84
|
-
if (this.abortController.signal.aborted) {
|
|
85
|
-
// The request was aborted by deinit.
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
77
|
+
const signal = this.abortController.signal;
|
|
78
|
+
url.setSearchParam("_", Date.now().toString());
|
|
88
79
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
80
|
+
return fetch(url.value(), {
|
|
81
|
+
headers: { "Content-Type": "application/json" },
|
|
82
|
+
signal,
|
|
83
|
+
})
|
|
84
|
+
.then(handleResponse)
|
|
85
|
+
.catch((error: unknown) => {
|
|
86
|
+
if (this.abortController.signal.aborted) {
|
|
87
|
+
// The request was aborted by deinit.
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
stopLoading();
|
|
92
|
+
this.triggerEvent("tree.load_failed", { error });
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private getTitleSpan(element: HTMLElement): HTMLElement | null {
|
|
97
|
+
return element.querySelector<HTMLElement>(
|
|
98
|
+
`:scope > .${this.classNames.element} > .${this.classNames.title}`,
|
|
99
|
+
);
|
|
100
|
+
}
|
|
93
101
|
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
function binarySearch<T>(items: T[], compareFn: (a: T) => number): null | T {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
let low = 0;
|
|
3
|
+
let high = items.length;
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
while (low < high) {
|
|
6
|
+
const mid = (low + high) >> 1;
|
|
7
|
+
const item = items[mid];
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
if (item === undefined) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
const compareResult = compareFn(item);
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
15
|
+
if (compareResult > 0) {
|
|
16
|
+
high = mid;
|
|
17
|
+
} else if (compareResult < 0) {
|
|
18
|
+
low = mid + 1;
|
|
19
|
+
} else {
|
|
20
|
+
return item;
|
|
22
21
|
}
|
|
22
|
+
}
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
return null;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export default binarySearch;
|
|
@@ -1,62 +1,63 @@
|
|
|
1
1
|
import type { ClassNames } from "../classNames";
|
|
2
2
|
|
|
3
3
|
interface DragElementParams {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
autoEscape: boolean;
|
|
5
|
+
classNames: ClassNames;
|
|
6
|
+
nodeName: string;
|
|
7
|
+
offsetX: number;
|
|
8
|
+
offsetY: number;
|
|
9
|
+
treeElement: HTMLElement;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
class DragElement {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
13
|
+
private element: HTMLElement;
|
|
14
|
+
private offsetX: number;
|
|
15
|
+
private offsetY: number;
|
|
16
|
+
|
|
17
|
+
constructor({
|
|
18
|
+
autoEscape,
|
|
19
|
+
classNames,
|
|
20
|
+
nodeName,
|
|
21
|
+
offsetX,
|
|
22
|
+
offsetY,
|
|
23
|
+
treeElement,
|
|
24
|
+
}: DragElementParams) {
|
|
25
|
+
this.offsetX = offsetX;
|
|
26
|
+
this.offsetY = offsetY;
|
|
27
|
+
|
|
28
|
+
this.element = this.createElement(nodeName, autoEscape, classNames);
|
|
29
|
+
|
|
30
|
+
treeElement.append(this.element);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public move(pageX: number, pageY: number): void {
|
|
34
|
+
this.element.style.left = `${pageX - this.offsetX}px`;
|
|
35
|
+
this.element.style.top = `${pageY - this.offsetY}px`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public remove(): void {
|
|
39
|
+
this.element.remove();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private createElement(
|
|
43
|
+
nodeName: string,
|
|
44
|
+
autoEscape: boolean,
|
|
45
|
+
classNames: ClassNames,
|
|
46
|
+
) {
|
|
47
|
+
const element = document.createElement("span");
|
|
48
|
+
element.classList.add(classNames.title, classNames.dragging);
|
|
49
|
+
|
|
50
|
+
if (autoEscape) {
|
|
51
|
+
element.textContent = nodeName;
|
|
52
|
+
} else {
|
|
53
|
+
// eslint-disable-next-line no-unsanitized/property -- the user opted out of escaping with autoEscape: false
|
|
54
|
+
element.innerHTML = nodeName;
|
|
31
55
|
}
|
|
32
56
|
|
|
33
|
-
|
|
34
|
-
this.element.style.left = `${pageX - this.offsetX}px`;
|
|
35
|
-
this.element.style.top = `${pageY - this.offsetY}px`;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
public remove(): void {
|
|
39
|
-
this.element.remove();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
private createElement(
|
|
43
|
-
nodeName: string,
|
|
44
|
-
autoEscape: boolean,
|
|
45
|
-
classNames: ClassNames,
|
|
46
|
-
) {
|
|
47
|
-
const element = document.createElement("span");
|
|
48
|
-
element.classList.add(classNames.title, classNames.dragging);
|
|
57
|
+
element.style.position = "absolute";
|
|
49
58
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
} else {
|
|
53
|
-
element.innerHTML = nodeName;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
element.style.position = "absolute";
|
|
57
|
-
|
|
58
|
-
return element;
|
|
59
|
-
}
|
|
59
|
+
return element;
|
|
60
|
+
}
|
|
60
61
|
}
|
|
61
62
|
|
|
62
63
|
export default DragElement;
|