tree-element 0.1.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/LICENSE +201 -0
- package/README.md +221 -0
- package/lib/animation.d.ts +5 -0
- package/lib/animation.d.ts.map +1 -0
- package/lib/animation.js +39 -0
- package/lib/animation.js.map +1 -0
- package/lib/classNames.d.ts +34 -0
- package/lib/classNames.d.ts.map +1 -0
- package/lib/classNames.js +39 -0
- package/lib/classNames.js.map +1 -0
- package/lib/dataLoader.d.ts +25 -0
- package/lib/dataLoader.d.ts.map +1 -0
- package/lib/dataLoader.js +69 -0
- package/lib/dataLoader.js.map +1 -0
- package/lib/dragAndDropHandler/binarySearch.d.ts +3 -0
- package/lib/dragAndDropHandler/binarySearch.d.ts.map +1 -0
- package/lib/dragAndDropHandler/binarySearch.js +23 -0
- package/lib/dragAndDropHandler/binarySearch.js.map +1 -0
- package/lib/dragAndDropHandler/dragElement.d.ts +20 -0
- package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -0
- package/lib/dragAndDropHandler/dragElement.js +39 -0
- package/lib/dragAndDropHandler/dragElement.js.map +1 -0
- package/lib/dragAndDropHandler/generateHitAreas.d.ts +13 -0
- package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -0
- package/lib/dragAndDropHandler/generateHitAreas.js +130 -0
- package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -0
- package/lib/dragAndDropHandler/index.d.ts +76 -0
- package/lib/dragAndDropHandler/index.d.ts.map +1 -0
- package/lib/dragAndDropHandler/index.js +311 -0
- package/lib/dragAndDropHandler/index.js.map +1 -0
- package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts +11 -0
- package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -0
- package/lib/dragAndDropHandler/iterateVisibleNodes.js +54 -0
- package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -0
- package/lib/dragAndDropHandler/types.d.ts +11 -0
- package/lib/dragAndDropHandler/types.d.ts.map +1 -0
- package/lib/elementsRenderer.d.ts +53 -0
- package/lib/elementsRenderer.d.ts.map +1 -0
- package/lib/elementsRenderer.js +251 -0
- package/lib/elementsRenderer.js.map +1 -0
- package/lib/events.d.ts +224 -0
- package/lib/events.d.ts.map +1 -0
- package/lib/index.d.ts +367 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +1098 -0
- package/lib/index.js.map +1 -0
- package/lib/keyHandler.d.ts +29 -0
- package/lib/keyHandler.d.ts.map +1 -0
- package/lib/keyHandler.js +107 -0
- package/lib/keyHandler.js.map +1 -0
- package/lib/methodTypes.d.ts +21 -0
- package/lib/methodTypes.d.ts.map +1 -0
- package/lib/mouseHandler.d.ts +60 -0
- package/lib/mouseHandler.d.ts.map +1 -0
- package/lib/mouseHandler.js +283 -0
- package/lib/mouseHandler.js.map +1 -0
- package/lib/mouseUtils.d.ts +9 -0
- package/lib/mouseUtils.d.ts.map +1 -0
- package/lib/mouseUtils.js +15 -0
- package/lib/mouseUtils.js.map +1 -0
- package/lib/node.d.ts +320 -0
- package/lib/node.d.ts.map +1 -0
- package/lib/node.js +737 -0
- package/lib/node.js.map +1 -0
- package/lib/nodeElement/borderDropHint.d.ts +9 -0
- package/lib/nodeElement/borderDropHint.d.ts.map +1 -0
- package/lib/nodeElement/borderDropHint.js +24 -0
- package/lib/nodeElement/borderDropHint.js.map +1 -0
- package/lib/nodeElement/folderElement.d.ts +22 -0
- package/lib/nodeElement/folderElement.d.ts.map +1 -0
- package/lib/nodeElement/folderElement.js +100 -0
- package/lib/nodeElement/folderElement.js.map +1 -0
- package/lib/nodeElement/ghostDropHint.d.ts +18 -0
- package/lib/nodeElement/ghostDropHint.d.ts.map +1 -0
- package/lib/nodeElement/ghostDropHint.js +67 -0
- package/lib/nodeElement/ghostDropHint.js.map +1 -0
- package/lib/nodeElement/index.d.ts +28 -0
- package/lib/nodeElement/index.d.ts.map +1 -0
- package/lib/nodeElement/index.js +66 -0
- package/lib/nodeElement/index.js.map +1 -0
- package/lib/nodeUtils.d.ts +7 -0
- package/lib/nodeUtils.d.ts.map +1 -0
- package/lib/nodeUtils.js +4 -0
- package/lib/nodeUtils.js.map +1 -0
- package/lib/options.d.ts +310 -0
- package/lib/options.d.ts.map +1 -0
- package/lib/package.json +3 -0
- package/lib/positionUtils.d.ts +8 -0
- package/lib/positionUtils.d.ts.map +1 -0
- package/lib/positionUtils.js +14 -0
- package/lib/positionUtils.js.map +1 -0
- package/lib/requestUrl.d.ts +9 -0
- package/lib/requestUrl.d.ts.map +1 -0
- package/lib/requestUrl.js +37 -0
- package/lib/requestUrl.js.map +1 -0
- package/lib/saveStateHandler.d.ts +46 -0
- package/lib/saveStateHandler.d.ts.map +1 -0
- package/lib/saveStateHandler.js +204 -0
- package/lib/saveStateHandler.js.map +1 -0
- package/lib/scrollHandler/containerScrollParent.d.ts +12 -0
- package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -0
- package/lib/scrollHandler/containerScrollParent.js +49 -0
- package/lib/scrollHandler/containerScrollParent.js.map +1 -0
- package/lib/scrollHandler/createScrollParent.d.ts +4 -0
- package/lib/scrollHandler/createScrollParent.d.ts.map +1 -0
- package/lib/scrollHandler/createScrollParent.js +38 -0
- package/lib/scrollHandler/createScrollParent.js.map +1 -0
- package/lib/scrollHandler/documentScrollParent.d.ts +22 -0
- package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -0
- package/lib/scrollHandler/documentScrollParent.js +71 -0
- package/lib/scrollHandler/documentScrollParent.js.map +1 -0
- package/lib/scrollHandler/scrollParent.d.ts +26 -0
- package/lib/scrollHandler/scrollParent.d.ts.map +1 -0
- package/lib/scrollHandler/scrollParent.js +79 -0
- package/lib/scrollHandler/scrollParent.js.map +1 -0
- package/lib/scrollHandler.d.ts +20 -0
- package/lib/scrollHandler.d.ts.map +1 -0
- package/lib/scrollHandler.js +41 -0
- package/lib/scrollHandler.js.map +1 -0
- package/lib/selectNodeHandler.d.ts +38 -0
- package/lib/selectNodeHandler.d.ts.map +1 -0
- package/lib/selectNodeHandler.js +166 -0
- package/lib/selectNodeHandler.js.map +1 -0
- package/lib/setDefaultOptions.d.ts +4 -0
- package/lib/setDefaultOptions.d.ts.map +1 -0
- package/lib/setDefaultOptions.js +86 -0
- package/lib/setDefaultOptions.js.map +1 -0
- package/lib/triggerCustomEvent.d.ts +3 -0
- package/lib/triggerCustomEvent.d.ts.map +1 -0
- package/lib/triggerCustomEvent.js +13 -0
- package/lib/triggerCustomEvent.js.map +1 -0
- package/lib/util.d.ts +3 -0
- package/lib/util.d.ts.map +1 -0
- package/lib/util.js +5 -0
- package/lib/util.js.map +1 -0
- package/lib/version.d.ts +3 -0
- package/lib/version.d.ts.map +1 -0
- package/lib/version.js +5 -0
- package/lib/version.js.map +1 -0
- package/package.json +110 -0
- package/src/animation.ts +48 -0
- package/src/classNames.ts +70 -0
- package/src/dataLoader.ts +92 -0
- package/src/dragAndDropHandler/binarySearch.ts +27 -0
- package/src/dragAndDropHandler/dragElement.ts +62 -0
- package/src/dragAndDropHandler/generateHitAreas.ts +195 -0
- package/src/dragAndDropHandler/index.ts +442 -0
- package/src/dragAndDropHandler/iterateVisibleNodes.ts +91 -0
- package/src/dragAndDropHandler/types.ts +12 -0
- package/src/elementsRenderer.ts +367 -0
- package/src/events.ts +237 -0
- package/src/header.txt +16 -0
- package/src/index.ts +1290 -0
- package/src/keyHandler.ts +139 -0
- package/src/methodTypes.ts +44 -0
- package/src/mouseHandler.ts +391 -0
- package/src/mouseUtils.ts +23 -0
- package/src/node.ts +831 -0
- package/src/nodeElement/borderDropHint.ts +37 -0
- package/src/nodeElement/folderElement.ts +140 -0
- package/src/nodeElement/ghostDropHint.ts +84 -0
- package/src/nodeElement/index.ts +103 -0
- package/src/nodeUtils.ts +12 -0
- package/src/options.ts +325 -0
- package/src/positionUtils.ts +18 -0
- package/src/requestUrl.ts +41 -0
- package/src/saveStateHandler.ts +279 -0
- package/src/scrollHandler/containerScrollParent.ts +71 -0
- package/src/scrollHandler/createScrollParent.ts +51 -0
- package/src/scrollHandler/documentScrollParent.ts +104 -0
- package/src/scrollHandler/scrollParent.ts +117 -0
- package/src/scrollHandler.ts +55 -0
- package/src/selectNodeHandler.ts +192 -0
- package/src/setDefaultOptions.ts +79 -0
- package/src/triggerCustomEvent.ts +14 -0
- package/src/util.ts +5 -0
- package/src/version.ts +4 -0
- package/tree_element.css +195 -0
- package/tree_element.debug.js +4153 -0
- package/tree_element.debug.js.map +1 -0
- package/tree_element.js +21 -0
- package/tree_element.js.map +1 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { PositionInfo } from "./mouseUtils";
|
|
2
|
+
import type { ScrollParent } from "./scrollHandler/scrollParent";
|
|
3
|
+
|
|
4
|
+
import createScrollParent from "./scrollHandler/createScrollParent";
|
|
5
|
+
|
|
6
|
+
interface ScrollHandlerParams {
|
|
7
|
+
refreshHitAreas: () => void;
|
|
8
|
+
treeElement: HTMLElement;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export default class ScrollHandler {
|
|
12
|
+
private refreshHitAreas: () => void;
|
|
13
|
+
private scrollParent?: ScrollParent;
|
|
14
|
+
private treeElement: HTMLElement;
|
|
15
|
+
|
|
16
|
+
constructor({ refreshHitAreas, treeElement }: ScrollHandlerParams) {
|
|
17
|
+
this.refreshHitAreas = refreshHitAreas;
|
|
18
|
+
this.scrollParent = undefined;
|
|
19
|
+
this.treeElement = treeElement;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public checkScrolling(positionInfo: PositionInfo): void {
|
|
23
|
+
this.checkVerticalScrolling(positionInfo);
|
|
24
|
+
this.checkHorizontalScrolling(positionInfo);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public getScrollLeft(): number {
|
|
28
|
+
return this.getScrollParent().getScrollLeft();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public scrollToY(top: number): void {
|
|
32
|
+
this.getScrollParent().scrollToY(top);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public stopScrolling() {
|
|
36
|
+
this.getScrollParent().stopScrolling();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private checkHorizontalScrolling(positionInfo: PositionInfo): void {
|
|
40
|
+
this.getScrollParent().checkHorizontalScrolling(positionInfo.pageX);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private checkVerticalScrolling(positionInfo: PositionInfo): void {
|
|
44
|
+
this.getScrollParent().checkVerticalScrolling(positionInfo.pageY);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private getScrollParent(): ScrollParent {
|
|
48
|
+
this.scrollParent ??= createScrollParent(
|
|
49
|
+
this.treeElement,
|
|
50
|
+
this.refreshHitAreas,
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
return this.scrollParent;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import type { GetNodeById, GetNodeElementForNode, OpenParents, TriggerEvent } from "./methodTypes";
|
|
2
|
+
import type { Node, NodeId } from "./node";
|
|
3
|
+
import type { OnCanSelectNode } from "./options";
|
|
4
|
+
|
|
5
|
+
export interface SelectNodeOptions {
|
|
6
|
+
mustSetFocus?: boolean;
|
|
7
|
+
mustToggle?: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface SelectNodeHandlerParameters {
|
|
11
|
+
getNodeById: GetNodeById;
|
|
12
|
+
getNodeElementForNode: GetNodeElementForNode;
|
|
13
|
+
getOnCanSelectNode: () => OnCanSelectNode | undefined;
|
|
14
|
+
getSelectable: () => boolean;
|
|
15
|
+
openParents: OpenParents;
|
|
16
|
+
saveState: () => void;
|
|
17
|
+
triggerEvent: TriggerEvent;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default class SelectNodeHandler {
|
|
21
|
+
private getNodeById: GetNodeById;
|
|
22
|
+
private getNodeElementForNode: GetNodeElementForNode;
|
|
23
|
+
private getOnCanSelectNode: () => OnCanSelectNode | undefined;
|
|
24
|
+
private getSelectable: () => boolean;
|
|
25
|
+
private openParents: OpenParents;
|
|
26
|
+
private saveState: () => void;
|
|
27
|
+
private selectedNodes: Set<NodeId>;
|
|
28
|
+
private selectedSingleNode: Node | null;
|
|
29
|
+
private triggerEvent: TriggerEvent;
|
|
30
|
+
|
|
31
|
+
constructor({ getNodeById, getNodeElementForNode, getOnCanSelectNode, getSelectable, openParents, saveState, triggerEvent }: SelectNodeHandlerParameters) {
|
|
32
|
+
this.getNodeById = getNodeById;
|
|
33
|
+
this.getNodeElementForNode = getNodeElementForNode;
|
|
34
|
+
this.getOnCanSelectNode = getOnCanSelectNode;
|
|
35
|
+
this.getSelectable = getSelectable;
|
|
36
|
+
this.openParents = openParents;
|
|
37
|
+
this.saveState = saveState;
|
|
38
|
+
this.selectedNodes = new Set<NodeId>();
|
|
39
|
+
this.selectedSingleNode = null;
|
|
40
|
+
this.triggerEvent = triggerEvent;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public addToSelection(node: Node): void {
|
|
44
|
+
if (node.id != null) {
|
|
45
|
+
this.selectedNodes.add(node.id);
|
|
46
|
+
} else {
|
|
47
|
+
this.selectedSingleNode = node;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public clear(): void {
|
|
52
|
+
this.selectedNodes.clear();
|
|
53
|
+
this.selectedSingleNode = null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public getSelectedNode(): false | Node {
|
|
57
|
+
const selectedNodes = this.getSelectedNodes();
|
|
58
|
+
|
|
59
|
+
if (selectedNodes.length) {
|
|
60
|
+
return selectedNodes[0] ?? false;
|
|
61
|
+
} else {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public getSelectedNodes(): Node[] {
|
|
67
|
+
if (this.selectedSingleNode) {
|
|
68
|
+
return [this.selectedSingleNode];
|
|
69
|
+
} else {
|
|
70
|
+
const selectedNodes: Node[] = [];
|
|
71
|
+
|
|
72
|
+
this.selectedNodes.forEach((id) => {
|
|
73
|
+
const node = this.getNodeById(id);
|
|
74
|
+
if (node) {
|
|
75
|
+
selectedNodes.push(node);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
return selectedNodes;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
public getSelectedNodesUnder(parent: Node): Node[] {
|
|
84
|
+
if (this.selectedSingleNode) {
|
|
85
|
+
if (parent.isParentOf(this.selectedSingleNode)) {
|
|
86
|
+
return [this.selectedSingleNode];
|
|
87
|
+
} else {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
} else {
|
|
91
|
+
const selectedNodes: Node[] = [];
|
|
92
|
+
|
|
93
|
+
this.selectedNodes.forEach((id) => {
|
|
94
|
+
const node = this.getNodeById(id);
|
|
95
|
+
if (node && parent.isParentOf(node)) {
|
|
96
|
+
selectedNodes.push(node);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
return selectedNodes;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public isNodeSelected(node: Node): boolean {
|
|
105
|
+
if (node.id != null) {
|
|
106
|
+
return this.selectedNodes.has(node.id);
|
|
107
|
+
} else if (this.selectedSingleNode) {
|
|
108
|
+
return this.selectedSingleNode.element === node.element;
|
|
109
|
+
} else {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public removeFromSelection(node: Node, includeChildren = false): void {
|
|
115
|
+
if (node.id == null) {
|
|
116
|
+
if (
|
|
117
|
+
this.selectedSingleNode &&
|
|
118
|
+
node.element === this.selectedSingleNode.element
|
|
119
|
+
) {
|
|
120
|
+
this.selectedSingleNode = null;
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
this.selectedNodes.delete(node.id);
|
|
124
|
+
|
|
125
|
+
if (includeChildren) {
|
|
126
|
+
node.iterate(() => {
|
|
127
|
+
if (node.id != null) {
|
|
128
|
+
this.selectedNodes.delete(node.id);
|
|
129
|
+
}
|
|
130
|
+
return true;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* Select a single node.
|
|
137
|
+
* Renders the changed elements.
|
|
138
|
+
* Deselects if the node is currently selected (if the mustToggle is on).
|
|
139
|
+
* Deselects the previously selected node.
|
|
140
|
+
* Check if the node is selectable.
|
|
141
|
+
* Saves the state.
|
|
142
|
+
* Options:
|
|
143
|
+
* mustSetFocus: set the focus to the selected node
|
|
144
|
+
* mustToggle: support deselecting the selected node
|
|
145
|
+
*/
|
|
146
|
+
public selectSingleNode(node: Node, optionsParam?: SelectNodeOptions) {
|
|
147
|
+
const defaultOptions = { mustSetFocus: true, mustToggle: true };
|
|
148
|
+
const selectOptions = { ...defaultOptions, ...(optionsParam ?? {}) };
|
|
149
|
+
|
|
150
|
+
const canSelect = (): boolean => {
|
|
151
|
+
if (!this.getSelectable()) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const onCanSelectNode = this.getOnCanSelectNode();
|
|
156
|
+
return onCanSelectNode ? onCanSelectNode(node) : true;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
if (!canSelect()) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const deselectCurrentNode = (deselectedNode: Node) => {
|
|
164
|
+
this.removeFromSelection(deselectedNode);
|
|
165
|
+
this.getNodeElementForNode(deselectedNode).deselect();
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
if (this.isNodeSelected(node)) {
|
|
169
|
+
if (selectOptions.mustToggle) {
|
|
170
|
+
deselectCurrentNode(node);
|
|
171
|
+
this.triggerEvent("tree.deselect", { node });
|
|
172
|
+
}
|
|
173
|
+
} else {
|
|
174
|
+
const deselectedNode = this.getSelectedNode();
|
|
175
|
+
|
|
176
|
+
if (deselectedNode) {
|
|
177
|
+
deselectCurrentNode(deselectedNode);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
this.addToSelection(node);
|
|
181
|
+
this.openParents(node);
|
|
182
|
+
this.getNodeElementForNode(node).select(selectOptions.mustSetFocus);
|
|
183
|
+
|
|
184
|
+
this.triggerEvent("tree.select", {
|
|
185
|
+
deselectedNode: deselectedNode || null,
|
|
186
|
+
node,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
this.saveState();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { TreeElementOptions } from "./options";
|
|
2
|
+
|
|
3
|
+
import { DEFAULT_CLASS_PREFIX } from "./classNames";
|
|
4
|
+
import { Node } from "./node";
|
|
5
|
+
|
|
6
|
+
const defaults: TreeElementOptions = {
|
|
7
|
+
animationSpeed: "fast",
|
|
8
|
+
autoEscape: true,
|
|
9
|
+
autoOpen: false, // true / false / int (open n levels starting at 0)
|
|
10
|
+
buttonLeft: true,
|
|
11
|
+
classPrefix: DEFAULT_CLASS_PREFIX, // the prefix of all css classes
|
|
12
|
+
// The symbol to use for a closed node - ► BLACK RIGHT-POINTING POINTER
|
|
13
|
+
// http://www.fileformat.info/info/unicode/char/25ba/index.htm
|
|
14
|
+
closedIcon: undefined,
|
|
15
|
+
commonClassName: undefined, // the class of every element; the default is "<classPrefix>-common"
|
|
16
|
+
data: undefined,
|
|
17
|
+
dataFilter: undefined,
|
|
18
|
+
dataUrl: undefined,
|
|
19
|
+
dragAndDrop: false,
|
|
20
|
+
keyboardSupport: true,
|
|
21
|
+
nodeClass: Node,
|
|
22
|
+
onCanMove: undefined, // Can this node be moved?
|
|
23
|
+
onCanMoveTo: undefined, // Can this node be moved to this position? function(moved_node, target_node, position)
|
|
24
|
+
onCanSelectNode: undefined,
|
|
25
|
+
onCreateLi: undefined,
|
|
26
|
+
onDragMove: undefined,
|
|
27
|
+
onDragStop: undefined,
|
|
28
|
+
onGetStateFromStorage: undefined,
|
|
29
|
+
onIsMoveHandle: undefined,
|
|
30
|
+
onSetStateFromStorage: undefined,
|
|
31
|
+
openedIcon: undefined,
|
|
32
|
+
openFolderDelay: 500, // The delay for opening a folder during drag and drop; the value is in milliseconds
|
|
33
|
+
// The symbol to use for an open node - ▼ BLACK DOWN-POINTING TRIANGLE
|
|
34
|
+
// http://www.fileformat.info/info/unicode/char/25bc/index.htm
|
|
35
|
+
rtl: undefined, // right-to-left support; true / false (default)
|
|
36
|
+
saveState: false, // true / false / string (local storage key; the default key is "tree")
|
|
37
|
+
selectable: true,
|
|
38
|
+
showEmptyFolder: false,
|
|
39
|
+
slide: true, // must display slide animation?
|
|
40
|
+
startDndDelay: 300, // The delay for starting dnd (in milliseconds)
|
|
41
|
+
tabIndex: 0,
|
|
42
|
+
treeClassName: undefined, // the class of the root element; the default is classPrefix
|
|
43
|
+
useContextMenu: true,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const setDefaultOptions = (htmlElement: HTMLElement, inputOptions: Partial<TreeElementOptions>): TreeElementOptions => {
|
|
47
|
+
const options = { ...defaults, ...inputOptions };
|
|
48
|
+
|
|
49
|
+
options.dataUrl ??= htmlElement.dataset.url;
|
|
50
|
+
options.rtl ??= getRtlOptionFromHTMLElement(htmlElement);
|
|
51
|
+
options.closedIcon ??= getDefaultClosedIcon(options);
|
|
52
|
+
options.openedIcon ??= "▼";
|
|
53
|
+
|
|
54
|
+
return options;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const getDefaultClosedIcon = (options: TreeElementOptions): string => {
|
|
58
|
+
if (options.rtl) {
|
|
59
|
+
// triangle to the left
|
|
60
|
+
return "◀";
|
|
61
|
+
} else {
|
|
62
|
+
// triangle to the right
|
|
63
|
+
return "►";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const getRtlOptionFromHTMLElement = (htmlElement: HTMLElement): boolean => {
|
|
68
|
+
const dataRtl = htmlElement.dataset.rtl;
|
|
69
|
+
|
|
70
|
+
if (dataRtl == "") {
|
|
71
|
+
return true;
|
|
72
|
+
} else if (dataRtl === "false") {
|
|
73
|
+
return false;
|
|
74
|
+
} else {
|
|
75
|
+
return Boolean(dataRtl);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export default setDefaultOptions;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Trigger a CustomEvent. Return if the event is processed (true) or cancelled (false).
|
|
2
|
+
const triggerCustomEvent = (element: HTMLElement, eventName: string, values?: Record<string, unknown>): boolean => {
|
|
3
|
+
const event = new CustomEvent(eventName, {
|
|
4
|
+
bubbles: true,
|
|
5
|
+
cancelable: true,
|
|
6
|
+
detail: values,
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
element.dispatchEvent(event);
|
|
10
|
+
|
|
11
|
+
return !event.defaultPrevented;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default triggerCustomEvent;
|
package/src/util.ts
ADDED
package/src/version.ts
ADDED
package/tree_element.css
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
ul.tree-element {
|
|
2
|
+
list-style: none outside;
|
|
3
|
+
margin-left: 0;
|
|
4
|
+
margin-bottom: 0;
|
|
5
|
+
padding: 0;
|
|
6
|
+
|
|
7
|
+
&.tree-element-dnd {
|
|
8
|
+
touch-action: none;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
ul.tree-element-common {
|
|
12
|
+
list-style: none outside;
|
|
13
|
+
margin-left: 12px;
|
|
14
|
+
margin-right: 0;
|
|
15
|
+
margin-bottom: 0;
|
|
16
|
+
padding: 0;
|
|
17
|
+
display: block;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
li.tree-element-closed > ul.tree-element-common {
|
|
21
|
+
display: none;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
li.tree-element-common {
|
|
25
|
+
clear: both;
|
|
26
|
+
list-style-type: none;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.tree-element-toggler {
|
|
30
|
+
border-bottom: none;
|
|
31
|
+
color: #333;
|
|
32
|
+
text-decoration: none;
|
|
33
|
+
vertical-align: middle;
|
|
34
|
+
|
|
35
|
+
&:hover {
|
|
36
|
+
color: #000;
|
|
37
|
+
text-decoration: none;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
&.tree-element-closed {
|
|
41
|
+
background-position: 0 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
&.tree-element-toggler-left {
|
|
45
|
+
margin-right: 0.5em;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
&.tree-element-toggler-right {
|
|
49
|
+
margin-left: 0.5em;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.tree-element-element {
|
|
54
|
+
cursor: pointer;
|
|
55
|
+
position: relative;
|
|
56
|
+
display: flex;
|
|
57
|
+
|
|
58
|
+
&:has(.tree-element-title-button-right) {
|
|
59
|
+
display: block;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.tree-element-title {
|
|
64
|
+
color: #1c4257;
|
|
65
|
+
vertical-align: middle;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.tree-element-title-button-left {
|
|
69
|
+
margin-left: 1.5em;
|
|
70
|
+
|
|
71
|
+
&.tree-element-title-folder {
|
|
72
|
+
margin-left: 0;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
li.tree-element-folder {
|
|
77
|
+
margin-bottom: 4px;
|
|
78
|
+
|
|
79
|
+
&.tree-element-closed {
|
|
80
|
+
margin-bottom: 1px;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
li.tree-element-ghost {
|
|
85
|
+
position: relative;
|
|
86
|
+
z-index: 10;
|
|
87
|
+
margin-right: 10px;
|
|
88
|
+
|
|
89
|
+
span {
|
|
90
|
+
display: block;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
span.tree-element-circle {
|
|
94
|
+
border: solid 2px #0000ff;
|
|
95
|
+
border-radius: 100px;
|
|
96
|
+
height: 8px;
|
|
97
|
+
width: 8px;
|
|
98
|
+
position: absolute;
|
|
99
|
+
top: -4px;
|
|
100
|
+
left: -6px;
|
|
101
|
+
box-sizing: border-box;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
span.tree-element-line {
|
|
105
|
+
background-color: #0000ff;
|
|
106
|
+
height: 2px;
|
|
107
|
+
padding: 0;
|
|
108
|
+
position: absolute;
|
|
109
|
+
top: -1px;
|
|
110
|
+
left: 2px;
|
|
111
|
+
width: 100%;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
&.tree-element-inside {
|
|
115
|
+
margin-left: 48px;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
span.tree-element-border {
|
|
120
|
+
position: absolute;
|
|
121
|
+
display: block;
|
|
122
|
+
left: -2px;
|
|
123
|
+
top: 0;
|
|
124
|
+
border: solid 2px #0000ff;
|
|
125
|
+
border-radius: 6px;
|
|
126
|
+
margin: 0;
|
|
127
|
+
box-sizing: content-box;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
li.tree-element-selected > .tree-element-element,
|
|
131
|
+
li.tree-element-selected > .tree-element-element:hover {
|
|
132
|
+
background-color: #97bdd6;
|
|
133
|
+
background: linear-gradient(#bee0f5, #89afca);
|
|
134
|
+
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.tree-element-moving > .tree-element-element .tree-element-title {
|
|
138
|
+
outline: dashed 1px #0000ff;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
ul.tree-element.tree-element-rtl {
|
|
143
|
+
direction: rtl;
|
|
144
|
+
|
|
145
|
+
ul.tree-element-common {
|
|
146
|
+
margin-left: 0;
|
|
147
|
+
margin-right: 12px;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.tree-element-toggler {
|
|
151
|
+
margin-left: 0.5em;
|
|
152
|
+
margin-right: 0;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.tree-element-title {
|
|
156
|
+
margin-left: 0;
|
|
157
|
+
margin-right: 1.5em;
|
|
158
|
+
|
|
159
|
+
&.tree-element-title-folder {
|
|
160
|
+
margin-right: 0;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
li.tree-element-ghost {
|
|
165
|
+
margin-right: 0;
|
|
166
|
+
margin-left: 10px;
|
|
167
|
+
|
|
168
|
+
span.tree-element-circle {
|
|
169
|
+
right: -6px;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
span.tree-element-line {
|
|
173
|
+
right: 2px;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
&.tree-element-inside {
|
|
177
|
+
margin-left: 0;
|
|
178
|
+
margin-right: 48px;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
span.tree-element-border {
|
|
183
|
+
right: -2px;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
span.tree-element-dragging {
|
|
188
|
+
color: #fff;
|
|
189
|
+
background: #000;
|
|
190
|
+
opacity: 0.6;
|
|
191
|
+
cursor: pointer;
|
|
192
|
+
padding: 2px 8px;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNzcy90cmVlX2VsZW1lbnQucG9zdGNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSIsImZpbGUiOiJ0cmVlX2VsZW1lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsidWwudHJlZS1lbGVtZW50IHtcbiAgbGlzdC1zdHlsZTogbm9uZSBvdXRzaWRlO1xuICBtYXJnaW4tbGVmdDogMDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgcGFkZGluZzogMDtcblxuICAmLnRyZWUtZWxlbWVudC1kbmQge1xuICAgIHRvdWNoLWFjdGlvbjogbm9uZTtcbiAgfVxuXG4gIHVsLnRyZWUtZWxlbWVudC1jb21tb24ge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmUgb3V0c2lkZTtcbiAgICBtYXJnaW4tbGVmdDogMTJweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgbGkudHJlZS1lbGVtZW50LWNsb3NlZCA+IHVsLnRyZWUtZWxlbWVudC1jb21tb24ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICBsaS50cmVlLWVsZW1lbnQtY29tbW9uIHtcbiAgICBjbGVhcjogYm90aDtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIH1cblxuICAudHJlZS1lbGVtZW50LXRvZ2dsZXIge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgY29sb3I6ICMzMzM7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGNvbG9yOiAjMDAwO1xuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIH1cblxuICAgICYudHJlZS1lbGVtZW50LWNsb3NlZCB7XG4gICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7XG4gICAgfVxuXG4gICAgJi50cmVlLWVsZW1lbnQtdG9nZ2xlci1sZWZ0IHtcbiAgICAgIG1hcmdpbi1yaWdodDogMC41ZW07XG4gICAgfVxuXG4gICAgJi50cmVlLWVsZW1lbnQtdG9nZ2xlci1yaWdodCB7XG4gICAgICBtYXJnaW4tbGVmdDogMC41ZW07XG4gICAgfVxuICB9XG5cbiAgLnRyZWUtZWxlbWVudC1lbGVtZW50IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG5cbiAgICAmOmhhcygudHJlZS1lbGVtZW50LXRpdGxlLWJ1dHRvbi1yaWdodCkge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICB9XG5cbiAgLnRyZWUtZWxlbWVudC10aXRsZSB7XG4gICAgY29sb3I6ICMxYzQyNTc7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgfVxuXG4gIC50cmVlLWVsZW1lbnQtdGl0bGUtYnV0dG9uLWxlZnQge1xuICAgIG1hcmdpbi1sZWZ0OiAxLjVlbTtcblxuICAgICYudHJlZS1lbGVtZW50LXRpdGxlLWZvbGRlciB7XG4gICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICB9XG4gIH1cblxuICBsaS50cmVlLWVsZW1lbnQtZm9sZGVyIHtcbiAgICBtYXJnaW4tYm90dG9tOiA0cHg7XG5cbiAgICAmLnRyZWUtZWxlbWVudC1jbG9zZWQge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMXB4O1xuICAgIH1cbiAgfVxuXG4gIGxpLnRyZWUtZWxlbWVudC1naG9zdCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDEwO1xuICAgIG1hcmdpbi1yaWdodDogMTBweDtcblxuICAgIHNwYW4ge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuXG4gICAgc3Bhbi50cmVlLWVsZW1lbnQtY2lyY2xlIHtcbiAgICAgIGJvcmRlcjogc29saWQgMnB4ICMwMDAwZmY7XG4gICAgICBib3JkZXItcmFkaXVzOiAxMDBweDtcbiAgICAgIGhlaWdodDogOHB4O1xuICAgICAgd2lkdGg6IDhweDtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogLTRweDtcbiAgICAgIGxlZnQ6IC02cHg7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIHNwYW4udHJlZS1lbGVtZW50LWxpbmUge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDBmZjtcbiAgICAgIGhlaWdodDogMnB4O1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogLTFweDtcbiAgICAgIGxlZnQ6IDJweDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cblxuICAgICYudHJlZS1lbGVtZW50LWluc2lkZSB7XG4gICAgICBtYXJnaW4tbGVmdDogNDhweDtcbiAgICB9XG4gIH1cblxuICBzcGFuLnRyZWUtZWxlbWVudC1ib3JkZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBsZWZ0OiAtMnB4O1xuICAgIHRvcDogMDtcbiAgICBib3JkZXI6IHNvbGlkIDJweCAjMDAwMGZmO1xuICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICBtYXJnaW46IDA7XG4gICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIH1cblxuICBsaS50cmVlLWVsZW1lbnQtc2VsZWN0ZWQgPiAudHJlZS1lbGVtZW50LWVsZW1lbnQsXG4gIGxpLnRyZWUtZWxlbWVudC1zZWxlY3RlZCA+IC50cmVlLWVsZW1lbnQtZWxlbWVudDpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzk3YmRkNjtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoI2JlZTBmNSwgIzg5YWZjYSk7XG4gICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICB9XG5cbiAgLnRyZWUtZWxlbWVudC1tb3ZpbmcgPiAudHJlZS1lbGVtZW50LWVsZW1lbnQgLnRyZWUtZWxlbWVudC10aXRsZSB7XG4gICAgb3V0bGluZTogZGFzaGVkIDFweCAjMDAwMGZmO1xuICB9XG59XG5cbnVsLnRyZWUtZWxlbWVudC50cmVlLWVsZW1lbnQtcnRsIHtcbiAgZGlyZWN0aW9uOiBydGw7XG5cbiAgdWwudHJlZS1lbGVtZW50LWNvbW1vbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAxMnB4O1xuICB9XG5cbiAgLnRyZWUtZWxlbWVudC10b2dnbGVyIHtcbiAgICBtYXJnaW4tbGVmdDogMC41ZW07XG4gICAgbWFyZ2luLXJpZ2h0OiAwO1xuICB9XG5cbiAgLnRyZWUtZWxlbWVudC10aXRsZSB7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgbWFyZ2luLXJpZ2h0OiAxLjVlbTtcblxuICAgICYudHJlZS1lbGVtZW50LXRpdGxlLWZvbGRlciB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgfVxuICB9XG5cbiAgbGkudHJlZS1lbGVtZW50LWdob3N0IHtcbiAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG5cbiAgICBzcGFuLnRyZWUtZWxlbWVudC1jaXJjbGUge1xuICAgICAgcmlnaHQ6IC02cHg7XG4gICAgfVxuXG4gICAgc3Bhbi50cmVlLWVsZW1lbnQtbGluZSB7XG4gICAgICByaWdodDogMnB4O1xuICAgIH1cblxuICAgICYudHJlZS1lbGVtZW50LWluc2lkZSB7XG4gICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICAgIG1hcmdpbi1yaWdodDogNDhweDtcbiAgICB9XG4gIH1cblxuICBzcGFuLnRyZWUtZWxlbWVudC1ib3JkZXIge1xuICAgIHJpZ2h0OiAtMnB4O1xuICB9XG59XG5cbnNwYW4udHJlZS1lbGVtZW50LWRyYWdnaW5nIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQ6ICMwMDA7XG4gIG9wYWNpdHk6IDAuNjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiAycHggOHB4O1xufVxuIl19 */
|