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,166 @@
|
|
|
1
|
+
class SelectNodeHandler {
|
|
2
|
+
_getNodeById;
|
|
3
|
+
_getNodeElementForNode;
|
|
4
|
+
_getOnCanSelectNode;
|
|
5
|
+
_getSelectable;
|
|
6
|
+
_openParents;
|
|
7
|
+
_saveState;
|
|
8
|
+
_selectedNodes;
|
|
9
|
+
_selectedSingleNode;
|
|
10
|
+
_triggerEvent;
|
|
11
|
+
constructor({
|
|
12
|
+
getNodeById,
|
|
13
|
+
getNodeElementForNode,
|
|
14
|
+
getOnCanSelectNode,
|
|
15
|
+
getSelectable,
|
|
16
|
+
openParents,
|
|
17
|
+
saveState,
|
|
18
|
+
triggerEvent
|
|
19
|
+
}) {
|
|
20
|
+
this._getNodeById = getNodeById;
|
|
21
|
+
this._getNodeElementForNode = getNodeElementForNode;
|
|
22
|
+
this._getOnCanSelectNode = getOnCanSelectNode;
|
|
23
|
+
this._getSelectable = getSelectable;
|
|
24
|
+
this._openParents = openParents;
|
|
25
|
+
this._saveState = saveState;
|
|
26
|
+
this._selectedNodes = new Set();
|
|
27
|
+
this._selectedSingleNode = null;
|
|
28
|
+
this._triggerEvent = triggerEvent;
|
|
29
|
+
}
|
|
30
|
+
addToSelection(node) {
|
|
31
|
+
if (node.id != null) {
|
|
32
|
+
this._selectedNodes.add(node.id);
|
|
33
|
+
} else {
|
|
34
|
+
this._selectedSingleNode = node;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
clear() {
|
|
38
|
+
this._selectedNodes.clear();
|
|
39
|
+
this._selectedSingleNode = null;
|
|
40
|
+
}
|
|
41
|
+
getSelectedNode() {
|
|
42
|
+
const selectedNodes = this.getSelectedNodes();
|
|
43
|
+
if (selectedNodes.length) {
|
|
44
|
+
return selectedNodes[0] ?? false;
|
|
45
|
+
} else {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
getSelectedNodes() {
|
|
50
|
+
if (this._selectedSingleNode) {
|
|
51
|
+
return [this._selectedSingleNode];
|
|
52
|
+
} else {
|
|
53
|
+
const selectedNodes = [];
|
|
54
|
+
this._selectedNodes.forEach(id => {
|
|
55
|
+
const node = this._getNodeById(id);
|
|
56
|
+
if (node) {
|
|
57
|
+
selectedNodes.push(node);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return selectedNodes;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
getSelectedNodesUnder(parent) {
|
|
64
|
+
if (this._selectedSingleNode) {
|
|
65
|
+
if (parent.isParentOf(this._selectedSingleNode)) {
|
|
66
|
+
return [this._selectedSingleNode];
|
|
67
|
+
} else {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
const selectedNodes = [];
|
|
72
|
+
this._selectedNodes.forEach(id => {
|
|
73
|
+
const node = this._getNodeById(id);
|
|
74
|
+
if (node && parent.isParentOf(node)) {
|
|
75
|
+
selectedNodes.push(node);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
return selectedNodes;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
isNodeSelected(node) {
|
|
82
|
+
if (node.id != null) {
|
|
83
|
+
return this._selectedNodes.has(node.id);
|
|
84
|
+
} else if (this._selectedSingleNode) {
|
|
85
|
+
return this._selectedSingleNode.element === node.element;
|
|
86
|
+
} else {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
removeFromSelection(node, includeChildren = false) {
|
|
91
|
+
if (node.id == null) {
|
|
92
|
+
if (this._selectedSingleNode && node.element === this._selectedSingleNode.element) {
|
|
93
|
+
this._selectedSingleNode = null;
|
|
94
|
+
}
|
|
95
|
+
} else {
|
|
96
|
+
this._selectedNodes.delete(node.id);
|
|
97
|
+
if (includeChildren) {
|
|
98
|
+
node.iterate(() => {
|
|
99
|
+
if (node.id != null) {
|
|
100
|
+
this._selectedNodes.delete(node.id);
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* Select a single node.
|
|
109
|
+
* Renders the changed elements.
|
|
110
|
+
* Deselects if the node is currently selected (if the mustToggle is on).
|
|
111
|
+
* Deselects the previously selected node.
|
|
112
|
+
* Check if the node is selectable.
|
|
113
|
+
* Saves the state.
|
|
114
|
+
* Options:
|
|
115
|
+
* mustSetFocus: set the focus to the selected node
|
|
116
|
+
* mustToggle: support deselecting the selected node
|
|
117
|
+
*/
|
|
118
|
+
selectSingleNode(node, optionsParam) {
|
|
119
|
+
const defaultOptions = {
|
|
120
|
+
mustSetFocus: true,
|
|
121
|
+
mustToggle: true
|
|
122
|
+
};
|
|
123
|
+
const selectOptions = {
|
|
124
|
+
...defaultOptions,
|
|
125
|
+
...(optionsParam ?? {})
|
|
126
|
+
};
|
|
127
|
+
const canSelect = () => {
|
|
128
|
+
if (!this._getSelectable()) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
const onCanSelectNode = this._getOnCanSelectNode();
|
|
132
|
+
return onCanSelectNode ? onCanSelectNode(node) : true;
|
|
133
|
+
};
|
|
134
|
+
if (!canSelect()) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const deselectCurrentNode = deselectedNode => {
|
|
138
|
+
this.removeFromSelection(deselectedNode);
|
|
139
|
+
this._getNodeElementForNode(deselectedNode).deselect();
|
|
140
|
+
};
|
|
141
|
+
if (this.isNodeSelected(node)) {
|
|
142
|
+
if (selectOptions.mustToggle) {
|
|
143
|
+
deselectCurrentNode(node);
|
|
144
|
+
this._triggerEvent("tree.deselect", {
|
|
145
|
+
node
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
} else {
|
|
149
|
+
const deselectedNode = this.getSelectedNode();
|
|
150
|
+
if (deselectedNode) {
|
|
151
|
+
deselectCurrentNode(deselectedNode);
|
|
152
|
+
}
|
|
153
|
+
this.addToSelection(node);
|
|
154
|
+
this._openParents(node);
|
|
155
|
+
this._getNodeElementForNode(node).select(selectOptions.mustSetFocus);
|
|
156
|
+
this._triggerEvent("tree.select", {
|
|
157
|
+
deselectedNode: deselectedNode || null,
|
|
158
|
+
node
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
this._saveState();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export { SelectNodeHandler as default };
|
|
166
|
+
//# sourceMappingURL=selectNodeHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectNodeHandler.js","sources":["../src/selectNodeHandler.ts"],"sourcesContent":["import type { GetNodeById, GetNodeElementForNode, OpenParents, TriggerEvent } from \"./methodTypes\";\nimport type { Node, NodeId } from \"./node\";\nimport type { OnCanSelectNode } from \"./options\";\n\nexport interface SelectNodeOptions {\n mustSetFocus?: boolean;\n mustToggle?: boolean;\n}\n\ninterface SelectNodeHandlerParameters {\n getNodeById: GetNodeById;\n getNodeElementForNode: GetNodeElementForNode;\n getOnCanSelectNode: () => OnCanSelectNode | undefined;\n getSelectable: () => boolean;\n openParents: OpenParents;\n saveState: () => void;\n triggerEvent: TriggerEvent;\n}\n\nexport default class SelectNodeHandler {\n private getNodeById: GetNodeById;\n private getNodeElementForNode: GetNodeElementForNode;\n private getOnCanSelectNode: () => OnCanSelectNode | undefined;\n private getSelectable: () => boolean;\n private openParents: OpenParents;\n private saveState: () => void;\n private selectedNodes: Set<NodeId>;\n private selectedSingleNode: Node | null;\n private triggerEvent: TriggerEvent;\n\n constructor({ getNodeById, getNodeElementForNode, getOnCanSelectNode, getSelectable, openParents, saveState, triggerEvent }: SelectNodeHandlerParameters) {\n this.getNodeById = getNodeById;\n this.getNodeElementForNode = getNodeElementForNode;\n this.getOnCanSelectNode = getOnCanSelectNode;\n this.getSelectable = getSelectable;\n this.openParents = openParents;\n this.saveState = saveState;\n this.selectedNodes = new Set<NodeId>();\n this.selectedSingleNode = null;\n this.triggerEvent = triggerEvent;\n }\n\n public addToSelection(node: Node): void {\n if (node.id != null) {\n this.selectedNodes.add(node.id);\n } else {\n this.selectedSingleNode = node;\n }\n }\n\n public clear(): void {\n this.selectedNodes.clear();\n this.selectedSingleNode = null;\n }\n\n public getSelectedNode(): false | Node {\n const selectedNodes = this.getSelectedNodes();\n\n if (selectedNodes.length) {\n return selectedNodes[0] ?? false;\n } else {\n return false;\n }\n }\n\n public getSelectedNodes(): Node[] {\n if (this.selectedSingleNode) {\n return [this.selectedSingleNode];\n } else {\n const selectedNodes: Node[] = [];\n\n this.selectedNodes.forEach((id) => {\n const node = this.getNodeById(id);\n if (node) {\n selectedNodes.push(node);\n }\n });\n\n return selectedNodes;\n }\n }\n\n public getSelectedNodesUnder(parent: Node): Node[] {\n if (this.selectedSingleNode) {\n if (parent.isParentOf(this.selectedSingleNode)) {\n return [this.selectedSingleNode];\n } else {\n return [];\n }\n } else {\n const selectedNodes: Node[] = [];\n\n this.selectedNodes.forEach((id) => {\n const node = this.getNodeById(id);\n if (node && parent.isParentOf(node)) {\n selectedNodes.push(node);\n }\n });\n\n return selectedNodes;\n }\n }\n\n public isNodeSelected(node: Node): boolean {\n if (node.id != null) {\n return this.selectedNodes.has(node.id);\n } else if (this.selectedSingleNode) {\n return this.selectedSingleNode.element === node.element;\n } else {\n return false;\n }\n }\n\n public removeFromSelection(node: Node, includeChildren = false): void {\n if (node.id == null) {\n if (\n this.selectedSingleNode &&\n node.element === this.selectedSingleNode.element\n ) {\n this.selectedSingleNode = null;\n }\n } else {\n this.selectedNodes.delete(node.id);\n\n if (includeChildren) {\n node.iterate(() => {\n if (node.id != null) {\n this.selectedNodes.delete(node.id);\n }\n return true;\n });\n }\n }\n }\n\n /* Select a single node.\n * Renders the changed elements.\n * Deselects if the node is currently selected (if the mustToggle is on).\n * Deselects the previously selected node.\n * Check if the node is selectable.\n * Saves the state.\n * Options:\n * mustSetFocus: set the focus to the selected node\n * mustToggle: support deselecting the selected node\n */\n public selectSingleNode(node: Node, optionsParam?: SelectNodeOptions) {\n const defaultOptions = { mustSetFocus: true, mustToggle: true };\n const selectOptions = { ...defaultOptions, ...(optionsParam ?? {}) };\n\n const canSelect = (): boolean => {\n if (!this.getSelectable()) {\n return false;\n }\n\n const onCanSelectNode = this.getOnCanSelectNode();\n return onCanSelectNode ? onCanSelectNode(node) : true;\n };\n\n if (!canSelect()) {\n return;\n }\n\n const deselectCurrentNode = (deselectedNode: Node) => {\n this.removeFromSelection(deselectedNode);\n this.getNodeElementForNode(deselectedNode).deselect();\n };\n\n if (this.isNodeSelected(node)) {\n if (selectOptions.mustToggle) {\n deselectCurrentNode(node);\n this.triggerEvent(\"tree.deselect\", { node });\n }\n } else {\n const deselectedNode = this.getSelectedNode();\n\n if (deselectedNode) {\n deselectCurrentNode(deselectedNode);\n }\n\n this.addToSelection(node);\n this.openParents(node);\n this.getNodeElementForNode(node).select(selectOptions.mustSetFocus);\n\n this.triggerEvent(\"tree.select\", {\n deselectedNode: deselectedNode || null,\n node,\n });\n }\n\n this.saveState();\n }\n}\n"],"names":["getNodeById","getNodeElementForNode","getOnCanSelectNode","getSelectable","openParents","saveState","selectedNodes","selectedSingleNode","triggerEvent"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setDefaultOptions.d.ts","sourceRoot":"","sources":["../src/setDefaultOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AA6CpD,QAAA,MAAM,iBAAiB,GAAI,aAAa,WAAW,EAAE,cAAc,OAAO,CAAC,kBAAkB,CAAC,KAAG,kBAShG,CAAA;AAwBD,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { DEFAULT_CLASS_PREFIX } from './classNames.js';
|
|
2
|
+
import { Node } from './node.js';
|
|
3
|
+
|
|
4
|
+
const defaults = {
|
|
5
|
+
animationSpeed: "fast",
|
|
6
|
+
autoEscape: true,
|
|
7
|
+
autoOpen: false,
|
|
8
|
+
// true / false / int (open n levels starting at 0)
|
|
9
|
+
buttonLeft: true,
|
|
10
|
+
classPrefix: DEFAULT_CLASS_PREFIX,
|
|
11
|
+
// 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,
|
|
16
|
+
// the class of every element; the default is "<classPrefix>-common"
|
|
17
|
+
data: undefined,
|
|
18
|
+
dataFilter: undefined,
|
|
19
|
+
dataUrl: undefined,
|
|
20
|
+
dragAndDrop: false,
|
|
21
|
+
keyboardSupport: true,
|
|
22
|
+
nodeClass: Node,
|
|
23
|
+
onCanMove: undefined,
|
|
24
|
+
// Can this node be moved?
|
|
25
|
+
onCanMoveTo: undefined,
|
|
26
|
+
// Can this node be moved to this position? function(moved_node, target_node, position)
|
|
27
|
+
onCanSelectNode: undefined,
|
|
28
|
+
onCreateLi: undefined,
|
|
29
|
+
onDragMove: undefined,
|
|
30
|
+
onDragStop: undefined,
|
|
31
|
+
onGetStateFromStorage: undefined,
|
|
32
|
+
onIsMoveHandle: undefined,
|
|
33
|
+
onSetStateFromStorage: undefined,
|
|
34
|
+
openedIcon: undefined,
|
|
35
|
+
openFolderDelay: 500,
|
|
36
|
+
// The delay for opening a folder during drag and drop; the value is in milliseconds
|
|
37
|
+
// The symbol to use for an open node - ▼ BLACK DOWN-POINTING TRIANGLE
|
|
38
|
+
// http://www.fileformat.info/info/unicode/char/25bc/index.htm
|
|
39
|
+
rtl: undefined,
|
|
40
|
+
// right-to-left support; true / false (default)
|
|
41
|
+
saveState: false,
|
|
42
|
+
// true / false / string (local storage key; the default key is "tree")
|
|
43
|
+
selectable: true,
|
|
44
|
+
showEmptyFolder: false,
|
|
45
|
+
slide: true,
|
|
46
|
+
// must display slide animation?
|
|
47
|
+
startDndDelay: 300,
|
|
48
|
+
// The delay for starting dnd (in milliseconds)
|
|
49
|
+
tabIndex: 0,
|
|
50
|
+
treeClassName: undefined,
|
|
51
|
+
// the class of the root element; the default is classPrefix
|
|
52
|
+
useContextMenu: true
|
|
53
|
+
};
|
|
54
|
+
const setDefaultOptions = (htmlElement, inputOptions) => {
|
|
55
|
+
const options = {
|
|
56
|
+
...defaults,
|
|
57
|
+
...inputOptions
|
|
58
|
+
};
|
|
59
|
+
options.dataUrl ??= htmlElement.dataset.url;
|
|
60
|
+
options.rtl ??= getRtlOptionFromHTMLElement(htmlElement);
|
|
61
|
+
options.closedIcon ??= getDefaultClosedIcon(options);
|
|
62
|
+
options.openedIcon ??= "▼";
|
|
63
|
+
return options;
|
|
64
|
+
};
|
|
65
|
+
const getDefaultClosedIcon = options => {
|
|
66
|
+
if (options.rtl) {
|
|
67
|
+
// triangle to the left
|
|
68
|
+
return "◀";
|
|
69
|
+
} else {
|
|
70
|
+
// triangle to the right
|
|
71
|
+
return "►";
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
const getRtlOptionFromHTMLElement = htmlElement => {
|
|
75
|
+
const dataRtl = htmlElement.dataset.rtl;
|
|
76
|
+
if (dataRtl == "") {
|
|
77
|
+
return true;
|
|
78
|
+
} else if (dataRtl === "false") {
|
|
79
|
+
return false;
|
|
80
|
+
} else {
|
|
81
|
+
return Boolean(dataRtl);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export { setDefaultOptions as default };
|
|
86
|
+
//# sourceMappingURL=setDefaultOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setDefaultOptions.js","sources":["../src/setDefaultOptions.ts"],"sourcesContent":["import type { TreeElementOptions } from \"./options\";\n\nimport { DEFAULT_CLASS_PREFIX } from \"./classNames\";\nimport { Node } from \"./node\";\n\nconst defaults: TreeElementOptions = {\n animationSpeed: \"fast\",\n autoEscape: true,\n autoOpen: false, // true / false / int (open n levels starting at 0)\n buttonLeft: true,\n classPrefix: DEFAULT_CLASS_PREFIX, // the prefix of all css classes\n // The symbol to use for a closed node - ► BLACK RIGHT-POINTING POINTER\n // http://www.fileformat.info/info/unicode/char/25ba/index.htm\n closedIcon: undefined,\n commonClassName: undefined, // the class of every element; the default is \"<classPrefix>-common\"\n data: undefined,\n dataFilter: undefined,\n dataUrl: undefined,\n dragAndDrop: false,\n keyboardSupport: true,\n nodeClass: Node,\n onCanMove: undefined, // Can this node be moved?\n onCanMoveTo: undefined, // Can this node be moved to this position? function(moved_node, target_node, position)\n onCanSelectNode: undefined,\n onCreateLi: undefined,\n onDragMove: undefined,\n onDragStop: undefined,\n onGetStateFromStorage: undefined,\n onIsMoveHandle: undefined,\n onSetStateFromStorage: undefined,\n openedIcon: undefined,\n openFolderDelay: 500, // The delay for opening a folder during drag and drop; the value is in milliseconds\n // The symbol to use for an open node - ▼ BLACK DOWN-POINTING TRIANGLE\n // http://www.fileformat.info/info/unicode/char/25bc/index.htm\n rtl: undefined, // right-to-left support; true / false (default)\n saveState: false, // true / false / string (local storage key; the default key is \"tree\")\n selectable: true,\n showEmptyFolder: false,\n slide: true, // must display slide animation?\n startDndDelay: 300, // The delay for starting dnd (in milliseconds)\n tabIndex: 0,\n treeClassName: undefined, // the class of the root element; the default is classPrefix\n useContextMenu: true,\n};\n\nconst setDefaultOptions = (htmlElement: HTMLElement, inputOptions: Partial<TreeElementOptions>): TreeElementOptions => {\n const options = { ...defaults, ...inputOptions };\n\n options.dataUrl ??= htmlElement.dataset.url;\n options.rtl ??= getRtlOptionFromHTMLElement(htmlElement);\n options.closedIcon ??= getDefaultClosedIcon(options);\n options.openedIcon ??= \"▼\";\n\n return options;\n}\n\nconst getDefaultClosedIcon = (options: TreeElementOptions): string => {\n if (options.rtl) {\n // triangle to the left\n return \"◀\";\n } else {\n // triangle to the right\n return \"►\";\n }\n}\n\nconst getRtlOptionFromHTMLElement = (htmlElement: HTMLElement): boolean => {\n const dataRtl = htmlElement.dataset.rtl;\n\n if (dataRtl == \"\") {\n return true;\n } else if (dataRtl === \"false\") {\n return false;\n } else {\n return Boolean(dataRtl);\n }\n}\n\nexport default setDefaultOptions;"],"names":[],"mappings":";;;AAKA,MAAM,QAA4B,GAAG;AACnC,EAAA,cAAc,EAAE,MAAM;AACtB,EAAA,UAAU,EAAE,IAAI;AAChB,EAAA,QAAQ,EAAE,KAAK;AAAE;AACjB,EAAA,UAAU,EAAE,IAAI;AAChB,EAAA,WAAW,EAAE,oBAAoB;AAAE;AACnC;AACA;AACA,EAAA,UAAU,EAAE,SAAS;AACrB,EAAA,eAAe,EAAE,SAAS;AAAE;AAC5B,EAAA,IAAI,EAAE,SAAS;AACf,EAAA,UAAU,EAAE,SAAS;AACrB,EAAA,OAAO,EAAE,SAAS;AAClB,EAAA,WAAW,EAAE,KAAK;AAClB,EAAA,eAAe,EAAE,IAAI;AACrB,EAAA,SAAS,EAAE,IAAI;AACf,EAAA,SAAS,EAAE,SAAS;AAAE;AACtB,EAAA,WAAW,EAAE,SAAS;AAAE;AACxB,EAAA,eAAe,EAAE,SAAS;AAC1B,EAAA,UAAU,EAAE,SAAS;AACrB,EAAA,UAAU,EAAE,SAAS;AACrB,EAAA,UAAU,EAAE,SAAS;AACrB,EAAA,qBAAqB,EAAE,SAAS;AAChC,EAAA,cAAc,EAAE,SAAS;AACzB,EAAA,qBAAqB,EAAE,SAAS;AAChC,EAAA,UAAU,EAAE,SAAS;AACrB,EAAA,eAAe,EAAE,GAAG;AAAE;AACtB;AACA;AACA,EAAA,GAAG,EAAE,SAAS;AAAE;AAChB,EAAA,SAAS,EAAE,KAAK;AAAE;AAClB,EAAA,UAAU,EAAE,IAAI;AAChB,EAAA,eAAe,EAAE,KAAK;AACtB,EAAA,KAAK,EAAE,IAAI;AAAE;AACb,EAAA,aAAa,EAAE,GAAG;AAAE;AACpB,EAAA,QAAQ,EAAE,CAAC;AACX,EAAA,aAAa,EAAE,SAAS;AAAE;AAC1B,EAAA,cAAc,EAAE;AAClB,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,WAAwB,EAAE,YAAyC,KAAyB;AACrH,EAAA,MAAM,OAAO,GAAG;AAAE,IAAA,GAAG,QAAQ;IAAE,GAAG;GAAc;AAEhD,EAAA,OAAO,CAAC,OAAO,KAAK,WAAW,CAAC,OAAO,CAAC,GAAG;AAC3C,EAAA,OAAO,CAAC,GAAG,KAAK,2BAA2B,CAAC,WAAW,CAAC;AACxD,EAAA,OAAO,CAAC,UAAU,KAAK,oBAAoB,CAAC,OAAO,CAAC;EACpD,OAAO,CAAC,UAAU,KAAK,UAAU;AAEjC,EAAA,OAAO,OAAO;AAChB;AAEA,MAAM,oBAAoB,GAAI,OAA2B,IAAa;EACpE,IAAI,OAAO,CAAC,GAAG,EAAE;AACf;AACA,IAAA,OAAO,UAAU;AACnB,EAAA,CAAC,MAAM;AACL;AACA,IAAA,OAAO,UAAU;AACnB,EAAA;AACF,CAAC;AAED,MAAM,2BAA2B,GAAI,WAAwB,IAAc;AACzE,EAAA,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG;EAEvC,IAAI,OAAO,IAAI,EAAE,EAAE;AACjB,IAAA,OAAO,IAAI;AACb,EAAA,CAAC,MAAM,IAAI,OAAO,KAAK,OAAO,EAAE;AAC9B,IAAA,OAAO,KAAK;AACd,EAAA,CAAC,MAAM;IACL,OAAO,OAAO,CAAC,OAAO,CAAC;AACzB,EAAA;AACF,CAAC;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggerCustomEvent.d.ts","sourceRoot":"","sources":["../src/triggerCustomEvent.ts"],"names":[],"mappings":"AACA,QAAA,MAAM,kBAAkB,GAAI,SAAS,WAAW,EAAE,WAAW,MAAM,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAUvG,CAAA;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Trigger a CustomEvent. Return if the event is processed (true) or cancelled (false).
|
|
2
|
+
const triggerCustomEvent = (element, eventName, values) => {
|
|
3
|
+
const event = new CustomEvent(eventName, {
|
|
4
|
+
bubbles: true,
|
|
5
|
+
cancelable: true,
|
|
6
|
+
detail: values
|
|
7
|
+
});
|
|
8
|
+
element.dispatchEvent(event);
|
|
9
|
+
return !event.defaultPrevented;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export { triggerCustomEvent as default };
|
|
13
|
+
//# sourceMappingURL=triggerCustomEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggerCustomEvent.js","sources":["../src/triggerCustomEvent.ts"],"sourcesContent":["// Trigger a CustomEvent. Return if the event is processed (true) or cancelled (false).\nconst triggerCustomEvent = (element: HTMLElement, eventName: string, values?: Record<string, unknown>): boolean => {\n const event = new CustomEvent(eventName, {\n bubbles: true,\n cancelable: true,\n detail: values,\n });\n\n element.dispatchEvent(event);\n\n return !event.defaultPrevented;\n}\n\nexport default triggerCustomEvent;"],"names":[],"mappings":"AAAA;AACA,MAAM,kBAAkB,GAAG,CAAC,OAAoB,EAAE,SAAiB,EAAE,MAAgC,KAAc;AACjH,EAAA,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,EAAE;AACvC,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,MAAM,EAAE;AACV,GAAC,CAAC;AAEF,EAAA,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC;EAE5B,OAAO,CAAC,KAAK,CAAC,gBAAgB;AAChC;;"}
|
package/lib/util.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,GAAI,GAAG,OAAO,KAAG,OACK,CAAC;AAEzC,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,MACnB,CAAC"}
|
package/lib/util.js
ADDED
package/lib/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sources":["../src/util.ts"],"sourcesContent":["export const isInt = (n: unknown): boolean =>\n typeof n === \"number\" && n % 1 === 0;\n\nexport const getBoolString = (value: unknown): string =>\n value ? \"true\" : \"false\";\n"],"names":[],"mappings":"AAAO,MAAM,KAAK,GAAI,CAAU,IAC5B,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,KAAK;AAEhC,MAAM,aAAa,GAAI,KAAc,IACxC,KAAK,GAAG,MAAM,GAAG;;"}
|
package/lib/version.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AACA,QAAA,MAAM,OAAO,UAAU,CAAC;AAExB,eAAe,OAAO,CAAC"}
|
package/lib/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sources":["../src/version.ts"],"sourcesContent":["// Generated by config/generateVersion.mjs. Do not edit.\nconst version = \"0.1.0\";\n\nexport default version;\n"],"names":[],"mappings":"AAAA;AACA,MAAM,OAAO,GAAG;;"}
|
package/package.json
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tree-element",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Tree widget in plain javascript",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"tree"
|
|
7
|
+
],
|
|
8
|
+
"license": "Apache-2.0",
|
|
9
|
+
"browser": "./tree_element.js",
|
|
10
|
+
"main": "./tree_element.js",
|
|
11
|
+
"module": "./lib/index.js",
|
|
12
|
+
"types": "./lib/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./lib/index.d.ts",
|
|
16
|
+
"import": "./lib/index.js",
|
|
17
|
+
"default": "./tree_element.js"
|
|
18
|
+
},
|
|
19
|
+
"./tree_element.css": "./tree_element.css",
|
|
20
|
+
"./package.json": "./package.json"
|
|
21
|
+
},
|
|
22
|
+
"sideEffects": false,
|
|
23
|
+
"files": [
|
|
24
|
+
"tree_element.css",
|
|
25
|
+
"tree_element.debug.js",
|
|
26
|
+
"tree_element.debug.js.map",
|
|
27
|
+
"tree_element.js",
|
|
28
|
+
"tree_element.js.map",
|
|
29
|
+
"lib",
|
|
30
|
+
"src"
|
|
31
|
+
],
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/mbraak/tree-element.git"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"ci": "pnpm lint && pnpm tsc && pnpm docs-check && pnpm test",
|
|
38
|
+
"vitest": "vitest run --coverage --config test/vitest.config.mjs",
|
|
39
|
+
"vitest-watch": "vitest --config test/vitest.config.mjs",
|
|
40
|
+
"lint": "eslint config src playwright test",
|
|
41
|
+
"production": "./config/production",
|
|
42
|
+
"devserver": "SERVE=true rollup --config config/rollup.config.mjs --watch",
|
|
43
|
+
"docs-api": "typedoc && node docs/scripts/fixApiLinks.mjs",
|
|
44
|
+
"docs-dev": "pnpm docs-api && vitepress dev docs",
|
|
45
|
+
"docs-build": "pnpm docs-api && vitepress build docs",
|
|
46
|
+
"docs-preview": "vitepress preview docs",
|
|
47
|
+
"devserver-with-coverage": "COVERAGE=true SERVE=true rollup --config config/rollup.config.mjs",
|
|
48
|
+
"build-with-coverage": "COVERAGE=true rollup --config config/rollup.config.mjs",
|
|
49
|
+
"prettier": "prettier src/*.ts --write --tab-width 4",
|
|
50
|
+
"tsc": "tsc --noEmit --project tsconfig.json",
|
|
51
|
+
"version": "node config/generateVersion.mjs && git add src/version.ts",
|
|
52
|
+
"playwright": "pnpm build-with-coverage && playwright test --config playwright/playwright.config.js",
|
|
53
|
+
"test": "pnpm vitest && pnpm playwright",
|
|
54
|
+
"docs-check": "kiira check"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@babel/cli": "^8.0.4",
|
|
58
|
+
"@babel/core": "^8.0.1",
|
|
59
|
+
"@babel/preset-env": "^8.0.2",
|
|
60
|
+
"@babel/preset-typescript": "^8.0.1",
|
|
61
|
+
"@cspell/eslint-plugin": "^10.2.0",
|
|
62
|
+
"@eslint/js": "^10",
|
|
63
|
+
"@playwright/test": "^1.62.1",
|
|
64
|
+
"@rollup/plugin-babel": "^7.1.0",
|
|
65
|
+
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
66
|
+
"@rollup/plugin-terser": "^1.0.0",
|
|
67
|
+
"@testing-library/dom": "^10.4.1",
|
|
68
|
+
"@testing-library/jest-dom": "^7.0.1",
|
|
69
|
+
"@testing-library/user-event": "^14.6.6",
|
|
70
|
+
"@types/debug": "^4.1.13",
|
|
71
|
+
"@types/node": "^26.4.0",
|
|
72
|
+
"@vitest/coverage-istanbul": "^4.1.11",
|
|
73
|
+
"@vitest/eslint-plugin": "^1.6.27",
|
|
74
|
+
"autoprefixer": "^10.5.4",
|
|
75
|
+
"axe-core": "^4.13.0",
|
|
76
|
+
"babel-plugin-istanbul": "^8.0.0",
|
|
77
|
+
"eslint": "^10",
|
|
78
|
+
"eslint-import-resolver-typescript": "^4.4.5",
|
|
79
|
+
"eslint-plugin-import-x": "^4.17.1",
|
|
80
|
+
"eslint-plugin-jest-dom": "^5.10.1",
|
|
81
|
+
"eslint-plugin-jest-extended": "^3.0.1",
|
|
82
|
+
"eslint-plugin-perfectionist": "^5.11.0",
|
|
83
|
+
"eslint-plugin-playwright": "^2.11.0",
|
|
84
|
+
"eslint-plugin-testing-library": "^7.16.2",
|
|
85
|
+
"jest-extended": "^7.0.0",
|
|
86
|
+
"jsdom": "^30",
|
|
87
|
+
"jsdom-testing-mocks": "^1.16.0",
|
|
88
|
+
"jsonfile": "^6.2.1",
|
|
89
|
+
"kiira": "^0.6.0",
|
|
90
|
+
"kiira-core": "^0.6.0",
|
|
91
|
+
"lodash": "^4.18.1",
|
|
92
|
+
"msw": "^2.15.0",
|
|
93
|
+
"postcss": "^8.5.26",
|
|
94
|
+
"postcss-cli": "^11.0.1",
|
|
95
|
+
"postcss-import": "^17",
|
|
96
|
+
"postcss-load-config": "^6.0.1",
|
|
97
|
+
"postcss-nested": "^8",
|
|
98
|
+
"prettier": "^3.9.6",
|
|
99
|
+
"rollup": "^4.63.1",
|
|
100
|
+
"rollup-plugin-serve": "^3.0.0",
|
|
101
|
+
"rollup-plugin-tsconfig-paths": "^1.5.2",
|
|
102
|
+
"tslib": "^2.8.1",
|
|
103
|
+
"typedoc": "^0.28.20",
|
|
104
|
+
"typedoc-plugin-markdown": "^4.13.0",
|
|
105
|
+
"typescript": "^6.0.3",
|
|
106
|
+
"typescript-eslint": "^8.69.0",
|
|
107
|
+
"vitepress": "^1.6.4",
|
|
108
|
+
"vitest": "^4.1.11"
|
|
109
|
+
}
|
|
110
|
+
}
|
package/src/animation.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export type AnimationSpeed = "fast" | "slow" | number;
|
|
2
|
+
|
|
3
|
+
export const getAnimationDuration = (duration: AnimationSpeed): number => {
|
|
4
|
+
if (typeof duration === "number") {
|
|
5
|
+
return duration;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
return duration === "slow" ? 600 : 200;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const slideDown = (
|
|
12
|
+
element: HTMLElement,
|
|
13
|
+
animationSpeed: AnimationSpeed,
|
|
14
|
+
onFinished: () => void,
|
|
15
|
+
): void => {
|
|
16
|
+
element.style.display = "block";
|
|
17
|
+
|
|
18
|
+
const animation = element.animate(
|
|
19
|
+
[
|
|
20
|
+
{ height: "0", overflow: "hidden" },
|
|
21
|
+
{ height: `${element.scrollHeight}px`, overflow: "hidden" },
|
|
22
|
+
],
|
|
23
|
+
{ duration: getAnimationDuration(animationSpeed) },
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
animation.onfinish = () => {
|
|
27
|
+
onFinished();
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const slideUp = (
|
|
32
|
+
element: HTMLElement,
|
|
33
|
+
animationSpeed: AnimationSpeed,
|
|
34
|
+
onFinished: () => void,
|
|
35
|
+
): void => {
|
|
36
|
+
const animation = element.animate(
|
|
37
|
+
[
|
|
38
|
+
{ height: `${element.scrollHeight}px`, overflow: "hidden" },
|
|
39
|
+
{ height: "0", overflow: "hidden" },
|
|
40
|
+
],
|
|
41
|
+
{ duration: getAnimationDuration(animationSpeed) },
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
animation.onfinish = () => {
|
|
45
|
+
element.style.display = "none";
|
|
46
|
+
onFinished();
|
|
47
|
+
};
|
|
48
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export interface ClassNames {
|
|
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
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ClassNamesOptions {
|
|
28
|
+
classPrefix: string;
|
|
29
|
+
commonClassName?: string;
|
|
30
|
+
treeClassName?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const DEFAULT_CLASS_PREFIX = "tree-element";
|
|
34
|
+
|
|
35
|
+
/* Create the class names that the widget puts on the elements it creates.
|
|
36
|
+
* They are all derived from classPrefix, except for the class of the root
|
|
37
|
+
* element and the class that every element gets, which have an option of
|
|
38
|
+
* their own.
|
|
39
|
+
*/
|
|
40
|
+
const createClassNames = ({
|
|
41
|
+
classPrefix,
|
|
42
|
+
commonClassName,
|
|
43
|
+
treeClassName,
|
|
44
|
+
}: ClassNamesOptions): ClassNames => ({
|
|
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
|
+
});
|
|
69
|
+
|
|
70
|
+
export default createClassNames;
|