tree-element 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -6
- package/lib/animation.d.ts +2 -2
- package/lib/animation.d.ts.map +1 -1
- package/lib/animation.js +13 -9
- package/lib/animation.js.map +1 -1
- package/lib/dataLoader.d.ts +1 -0
- package/lib/dataLoader.d.ts.map +1 -1
- package/lib/dataLoader.js +8 -0
- package/lib/dataLoader.js.map +1 -1
- package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -1
- package/lib/dragAndDropHandler/dragElement.js +2 -1
- package/lib/dragAndDropHandler/dragElement.js.map +1 -1
- package/lib/dragAndDropHandler/index.d.ts.map +1 -1
- package/lib/dragAndDropHandler/index.js +56 -65
- package/lib/dragAndDropHandler/index.js.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.js +16 -15
- package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
- package/lib/elementsRenderer.d.ts +5 -1
- package/lib/elementsRenderer.d.ts.map +1 -1
- package/lib/elementsRenderer.js +62 -39
- package/lib/elementsRenderer.js.map +1 -1
- package/lib/events.d.ts +44 -11
- package/lib/events.d.ts.map +1 -1
- package/lib/index.d.ts +31 -8
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +162 -122
- package/lib/index.js.map +1 -1
- package/lib/keyHandler.d.ts +11 -5
- package/lib/keyHandler.d.ts.map +1 -1
- package/lib/keyHandler.js +87 -33
- package/lib/keyHandler.js.map +1 -1
- package/lib/methodTypes.d.ts +2 -2
- package/lib/methodTypes.d.ts.map +1 -1
- package/lib/mouseHandler.d.ts +1 -1
- package/lib/mouseHandler.d.ts.map +1 -1
- package/lib/mouseHandler.js +10 -7
- package/lib/mouseHandler.js.map +1 -1
- package/lib/node.d.ts +45 -15
- package/lib/node.d.ts.map +1 -1
- package/lib/node.js +136 -139
- package/lib/node.js.map +1 -1
- package/lib/nodeElement/folderElement.d.ts +1 -1
- package/lib/nodeElement/folderElement.d.ts.map +1 -1
- package/lib/nodeElement/folderElement.js +46 -57
- package/lib/nodeElement/folderElement.js.map +1 -1
- package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
- package/lib/nodeElement/ghostDropHint.js +8 -4
- package/lib/nodeElement/ghostDropHint.js.map +1 -1
- package/lib/nodeElement/index.d.ts.map +1 -1
- package/lib/nodeElement/index.js +6 -6
- package/lib/nodeElement/index.js.map +1 -1
- package/lib/nodeUtils.d.ts.map +1 -1
- package/lib/nodeUtils.js +1 -1
- package/lib/nodeUtils.js.map +1 -1
- package/lib/options.d.ts +23 -6
- package/lib/options.d.ts.map +1 -1
- package/lib/requestUrl.d.ts +0 -1
- package/lib/requestUrl.d.ts.map +1 -1
- package/lib/requestUrl.js +4 -22
- package/lib/requestUrl.js.map +1 -1
- package/lib/saveStateHandler.d.ts.map +1 -1
- package/lib/saveStateHandler.js +21 -41
- package/lib/saveStateHandler.js.map +1 -1
- package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/containerScrollParent.js +3 -8
- package/lib/scrollHandler/containerScrollParent.js.map +1 -1
- package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/createScrollParent.js +4 -5
- package/lib/scrollHandler/createScrollParent.js.map +1 -1
- package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/documentScrollParent.js +3 -9
- package/lib/scrollHandler/documentScrollParent.js.map +1 -1
- package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/scrollParent.js +19 -17
- package/lib/scrollHandler/scrollParent.js.map +1 -1
- package/lib/selectNodeHandler.d.ts +3 -1
- package/lib/selectNodeHandler.d.ts.map +1 -1
- package/lib/selectNodeHandler.js +27 -37
- package/lib/selectNodeHandler.js.map +1 -1
- package/lib/setDefaultOptions.d.ts +3 -0
- package/lib/setDefaultOptions.d.ts.map +1 -1
- package/lib/setDefaultOptions.js +21 -20
- package/lib/setDefaultOptions.js.map +1 -1
- package/lib/util.d.ts.map +1 -1
- package/lib/util.js +1 -1
- package/lib/util.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +44 -35
- package/src/animation.ts +13 -11
- package/src/dataLoader.ts +11 -0
- package/src/dragAndDropHandler/dragElement.ts +2 -1
- package/src/dragAndDropHandler/index.ts +70 -75
- package/src/dragAndDropHandler/iterateVisibleNodes.ts +18 -16
- package/src/elementsRenderer.ts +76 -46
- package/src/events.ts +44 -11
- package/src/index.ts +210 -150
- package/src/keyHandler.ts +95 -41
- package/src/methodTypes.ts +3 -3
- package/src/mouseHandler.ts +10 -7
- package/src/node.ts +155 -148
- package/src/nodeElement/folderElement.ts +54 -63
- package/src/nodeElement/ghostDropHint.ts +4 -2
- package/src/nodeElement/index.ts +9 -15
- package/src/nodeUtils.ts +1 -1
- package/src/options.ts +23 -6
- package/src/requestUrl.ts +4 -25
- package/src/saveStateHandler.ts +29 -43
- package/src/scrollHandler/containerScrollParent.ts +3 -9
- package/src/scrollHandler/createScrollParent.ts +1 -2
- package/src/scrollHandler/documentScrollParent.ts +5 -11
- package/src/scrollHandler/scrollParent.ts +29 -25
- package/src/selectNodeHandler.ts +34 -38
- package/src/setDefaultOptions.ts +31 -19
- package/src/util.ts +1 -2
- package/src/version.ts +1 -1
- package/tree_element.css +87 -69
- package/tree_element.debug.js +717 -659
- package/tree_element.debug.js.map +1 -1
- package/tree_element.js +2 -2
- package/tree_element.js.map +1 -1
package/src/keyHandler.ts
CHANGED
|
@@ -1,45 +1,54 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
CloseNode,
|
|
3
|
+
GetFocusedNode,
|
|
3
4
|
GetSelectedNode,
|
|
4
|
-
|
|
5
|
+
GetTree,
|
|
5
6
|
OpenNode,
|
|
6
7
|
SelectNode,
|
|
8
|
+
TriggerEvent,
|
|
7
9
|
} from "./methodTypes";
|
|
8
10
|
import type { Node } from "./node";
|
|
9
11
|
|
|
10
12
|
interface KeyHandlerParams {
|
|
11
13
|
closeNode: CloseNode;
|
|
14
|
+
getFocusedNode: GetFocusedNode;
|
|
12
15
|
getSelectedNode: GetSelectedNode;
|
|
13
|
-
|
|
16
|
+
getTree: GetTree;
|
|
14
17
|
keyboardSupport: boolean;
|
|
15
18
|
openNode: OpenNode;
|
|
16
19
|
selectNode: SelectNode;
|
|
20
|
+
triggerEvent: TriggerEvent;
|
|
17
21
|
}
|
|
18
22
|
|
|
19
23
|
export default class KeyHandler {
|
|
20
24
|
private closeNode: CloseNode;
|
|
25
|
+
private getFocusedNode: GetFocusedNode;
|
|
21
26
|
private getSelectedNode: GetSelectedNode;
|
|
22
|
-
|
|
23
|
-
private isFocusOnTree: IsFocusOnTree;
|
|
27
|
+
private getTree: GetTree;
|
|
24
28
|
|
|
25
29
|
private keyboardSupport: boolean;
|
|
26
30
|
private openNode: OpenNode;
|
|
27
31
|
private originalSelectNode: SelectNode;
|
|
32
|
+
private triggerEvent: TriggerEvent;
|
|
28
33
|
|
|
29
34
|
constructor({
|
|
30
35
|
closeNode,
|
|
36
|
+
getFocusedNode,
|
|
31
37
|
getSelectedNode,
|
|
32
|
-
|
|
38
|
+
getTree,
|
|
33
39
|
keyboardSupport,
|
|
34
40
|
openNode,
|
|
35
41
|
selectNode,
|
|
42
|
+
triggerEvent,
|
|
36
43
|
}: KeyHandlerParams) {
|
|
37
44
|
this.closeNode = closeNode;
|
|
45
|
+
this.getFocusedNode = getFocusedNode;
|
|
38
46
|
this.getSelectedNode = getSelectedNode;
|
|
39
|
-
this.
|
|
47
|
+
this.getTree = getTree;
|
|
40
48
|
this.keyboardSupport = keyboardSupport;
|
|
41
49
|
this.openNode = openNode;
|
|
42
50
|
this.originalSelectNode = selectNode;
|
|
51
|
+
this.triggerEvent = triggerEvent;
|
|
43
52
|
|
|
44
53
|
if (keyboardSupport) {
|
|
45
54
|
document.addEventListener("keydown", this.handleKeyDown);
|
|
@@ -60,35 +69,68 @@ export default class KeyHandler {
|
|
|
60
69
|
return this.selectNode(this.getSelectedNode()?.getPreviousVisibleNode());
|
|
61
70
|
}
|
|
62
71
|
|
|
63
|
-
|
|
64
|
-
|
|
72
|
+
// Activate the node, for example to open its edit page.
|
|
73
|
+
private activate(node: Node, originalEvent: KeyboardEvent): boolean {
|
|
74
|
+
this.triggerEvent("tree.activate", { node, originalEvent });
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private handleArrowKey(key: string): boolean {
|
|
79
|
+
switch (key) {
|
|
80
|
+
case "ArrowDown": {
|
|
81
|
+
return this.moveDown();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
case "ArrowLeft": {
|
|
85
|
+
return this.moveLeft();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
case "ArrowRight": {
|
|
89
|
+
return this.moveRight();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
case "ArrowUp": {
|
|
93
|
+
return this.moveUp();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
default: {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
65
100
|
}
|
|
66
101
|
|
|
67
102
|
private handleKeyDown = (e: KeyboardEvent): void => {
|
|
68
|
-
|
|
103
|
+
const focusedNode = this.getFocusedNode();
|
|
104
|
+
|
|
105
|
+
if (!focusedNode) {
|
|
69
106
|
return;
|
|
70
107
|
}
|
|
71
108
|
|
|
72
|
-
let isKeyHandled
|
|
109
|
+
let isKeyHandled: boolean;
|
|
73
110
|
|
|
74
111
|
const selectedNode = this.getSelectedNode();
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
112
|
+
|
|
113
|
+
switch (e.key) {
|
|
114
|
+
case "End": {
|
|
115
|
+
isKeyHandled = this.selectNode(this.getTree()?.getLastChild());
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
case "Enter": {
|
|
120
|
+
// Without a selected node, activate the focused node
|
|
121
|
+
isKeyHandled = this.activate(selectedNode ?? focusedNode, e);
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
case "Home": {
|
|
126
|
+
isKeyHandled = this.selectNode(this.getTree()?.children[0]);
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
default: {
|
|
131
|
+
isKeyHandled = selectedNode
|
|
132
|
+
? this.handleArrowKey(e.key)
|
|
133
|
+
: this.handleKeyWithoutSelection(e.key, focusedNode);
|
|
92
134
|
}
|
|
93
135
|
}
|
|
94
136
|
|
|
@@ -97,6 +139,22 @@ export default class KeyHandler {
|
|
|
97
139
|
}
|
|
98
140
|
};
|
|
99
141
|
|
|
142
|
+
// No node is selected. These keys select the focused node, which is
|
|
143
|
+
// usually the first node, see TreeElement.updateTabStop.
|
|
144
|
+
private handleKeyWithoutSelection(key: string, focusedNode: Node): boolean {
|
|
145
|
+
switch (key) {
|
|
146
|
+
case " ":
|
|
147
|
+
case "ArrowDown":
|
|
148
|
+
case "ArrowRight": {
|
|
149
|
+
return this.selectNode(focusedNode);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
default: {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
100
158
|
private moveLeft(): boolean {
|
|
101
159
|
const selectedNode = this.getSelectedNode();
|
|
102
160
|
|
|
@@ -107,30 +165,27 @@ export default class KeyHandler {
|
|
|
107
165
|
|
|
108
166
|
if (selectedNode.isFolder() && selectedNode.is_open) {
|
|
109
167
|
// Left on an open node closes the node
|
|
110
|
-
this.closeNode(selectedNode);
|
|
168
|
+
void this.closeNode(selectedNode);
|
|
111
169
|
return true;
|
|
112
|
-
} else {
|
|
113
|
-
// Left on a closed or end node moves focus to the node's parent
|
|
114
|
-
return this.selectNode(selectedNode.getParent());
|
|
115
170
|
}
|
|
171
|
+
// Left on a closed or end node moves focus to the node's parent
|
|
172
|
+
return this.selectNode(selectedNode.getParent());
|
|
116
173
|
}
|
|
117
174
|
|
|
118
175
|
private moveRight(): boolean {
|
|
119
176
|
const selectedNode = this.getSelectedNode();
|
|
120
177
|
|
|
121
|
-
if (
|
|
122
|
-
return false;
|
|
123
|
-
} else {
|
|
178
|
+
if (selectedNode?.isFolder()) {
|
|
124
179
|
// folder node
|
|
125
180
|
if (selectedNode.is_open) {
|
|
126
181
|
// Right moves to the first child of an open node
|
|
127
182
|
return this.selectNode(selectedNode.getNextVisibleNode());
|
|
128
|
-
} else {
|
|
129
|
-
// Right expands a closed node
|
|
130
|
-
void this.openNode(selectedNode);
|
|
131
|
-
return true;
|
|
132
183
|
}
|
|
184
|
+
// Right expands a closed node
|
|
185
|
+
void this.openNode(selectedNode);
|
|
186
|
+
return true;
|
|
133
187
|
}
|
|
188
|
+
return false;
|
|
134
189
|
}
|
|
135
190
|
|
|
136
191
|
/* Select the node.
|
|
@@ -138,12 +193,11 @@ export default class KeyHandler {
|
|
|
138
193
|
* Result: a different node was selected.
|
|
139
194
|
*/
|
|
140
195
|
private selectNode(node?: Node | null): boolean {
|
|
141
|
-
if (
|
|
142
|
-
return false;
|
|
143
|
-
} else {
|
|
196
|
+
if (node) {
|
|
144
197
|
this.originalSelectNode(node);
|
|
145
198
|
|
|
146
199
|
return true;
|
|
147
200
|
}
|
|
201
|
+
return false;
|
|
148
202
|
}
|
|
149
203
|
}
|
package/src/methodTypes.ts
CHANGED
|
@@ -4,7 +4,9 @@ import type NodeElement from "./nodeElement";
|
|
|
4
4
|
|
|
5
5
|
export type AddToSelection = (node: Node) => void;
|
|
6
6
|
|
|
7
|
-
export type CloseNode = (node: Node) => void
|
|
7
|
+
export type CloseNode = (node: Node) => Promise<void>;
|
|
8
|
+
|
|
9
|
+
export type GetFocusedNode = () => Node | null;
|
|
8
10
|
|
|
9
11
|
export type GetNodeById = (nodeId: NodeId) => Node | null;
|
|
10
12
|
|
|
@@ -18,8 +20,6 @@ export type GetSelectedNodes = () => Node[];
|
|
|
18
20
|
|
|
19
21
|
export type GetTree = () => Node | null;
|
|
20
22
|
|
|
21
|
-
export type IsFocusOnTree = () => boolean;
|
|
22
|
-
|
|
23
23
|
export type IsNodeSelected = (node: Node) => boolean;
|
|
24
24
|
|
|
25
25
|
export type LoadData = (data: NodeData[], parentNode?: Node) => void;
|
package/src/mouseHandler.ts
CHANGED
|
@@ -23,7 +23,7 @@ interface MouseHandlerParams {
|
|
|
23
23
|
element: HTMLElement;
|
|
24
24
|
getMouseDelay: () => number;
|
|
25
25
|
getNode: GetNode;
|
|
26
|
-
onClickButton: (node: Node) => void
|
|
26
|
+
onClickButton: (node: Node) => Promise<void>;
|
|
27
27
|
onClickTitle: (node: Node) => void;
|
|
28
28
|
onMouseCapture: MouseCapture;
|
|
29
29
|
onMouseDrag: (positionInfo: PositionInfo) => void;
|
|
@@ -46,7 +46,7 @@ class MouseHandler {
|
|
|
46
46
|
private mouseDelayTimer: null | number;
|
|
47
47
|
|
|
48
48
|
private mouseDownInfo: null | PositionInfo;
|
|
49
|
-
private onClickButton: (node: Node) => void
|
|
49
|
+
private onClickButton: (node: Node) => Promise<void>;
|
|
50
50
|
private onClickTitle: (node: Node) => void;
|
|
51
51
|
|
|
52
52
|
private onMouseCapture: MouseCapture;
|
|
@@ -158,12 +158,13 @@ class MouseHandler {
|
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
switch (clickTarget.type) {
|
|
161
|
-
case "button":
|
|
162
|
-
this.onClickButton(clickTarget.node);
|
|
161
|
+
case "button": {
|
|
162
|
+
void this.onClickButton(clickTarget.node);
|
|
163
163
|
|
|
164
164
|
e.preventDefault();
|
|
165
165
|
e.stopPropagation();
|
|
166
166
|
break;
|
|
167
|
+
}
|
|
167
168
|
|
|
168
169
|
case "label": {
|
|
169
170
|
if (
|
|
@@ -273,10 +274,12 @@ class MouseHandler {
|
|
|
273
274
|
this.isMouseDelayMet = false;
|
|
274
275
|
this.mouseDownInfo = null;
|
|
275
276
|
|
|
276
|
-
if (this.isMouseStarted) {
|
|
277
|
-
|
|
278
|
-
this.onMouseStop(positionInfo);
|
|
277
|
+
if (!this.isMouseStarted) {
|
|
278
|
+
return;
|
|
279
279
|
}
|
|
280
|
+
|
|
281
|
+
this.isMouseStarted = false;
|
|
282
|
+
this.onMouseStop(positionInfo);
|
|
280
283
|
}
|
|
281
284
|
|
|
282
285
|
private handleStartMouse(): void {
|