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.
Files changed (123) hide show
  1. package/README.md +14 -6
  2. package/lib/animation.d.ts +2 -2
  3. package/lib/animation.d.ts.map +1 -1
  4. package/lib/animation.js +13 -9
  5. package/lib/animation.js.map +1 -1
  6. package/lib/dataLoader.d.ts +1 -0
  7. package/lib/dataLoader.d.ts.map +1 -1
  8. package/lib/dataLoader.js +8 -0
  9. package/lib/dataLoader.js.map +1 -1
  10. package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -1
  11. package/lib/dragAndDropHandler/dragElement.js +2 -1
  12. package/lib/dragAndDropHandler/dragElement.js.map +1 -1
  13. package/lib/dragAndDropHandler/index.d.ts.map +1 -1
  14. package/lib/dragAndDropHandler/index.js +56 -65
  15. package/lib/dragAndDropHandler/index.js.map +1 -1
  16. package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
  17. package/lib/dragAndDropHandler/iterateVisibleNodes.js +16 -15
  18. package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
  19. package/lib/elementsRenderer.d.ts +5 -1
  20. package/lib/elementsRenderer.d.ts.map +1 -1
  21. package/lib/elementsRenderer.js +62 -39
  22. package/lib/elementsRenderer.js.map +1 -1
  23. package/lib/events.d.ts +44 -11
  24. package/lib/events.d.ts.map +1 -1
  25. package/lib/index.d.ts +31 -8
  26. package/lib/index.d.ts.map +1 -1
  27. package/lib/index.js +162 -122
  28. package/lib/index.js.map +1 -1
  29. package/lib/keyHandler.d.ts +11 -5
  30. package/lib/keyHandler.d.ts.map +1 -1
  31. package/lib/keyHandler.js +87 -33
  32. package/lib/keyHandler.js.map +1 -1
  33. package/lib/methodTypes.d.ts +2 -2
  34. package/lib/methodTypes.d.ts.map +1 -1
  35. package/lib/mouseHandler.d.ts +1 -1
  36. package/lib/mouseHandler.d.ts.map +1 -1
  37. package/lib/mouseHandler.js +10 -7
  38. package/lib/mouseHandler.js.map +1 -1
  39. package/lib/node.d.ts +45 -15
  40. package/lib/node.d.ts.map +1 -1
  41. package/lib/node.js +136 -139
  42. package/lib/node.js.map +1 -1
  43. package/lib/nodeElement/folderElement.d.ts +1 -1
  44. package/lib/nodeElement/folderElement.d.ts.map +1 -1
  45. package/lib/nodeElement/folderElement.js +46 -57
  46. package/lib/nodeElement/folderElement.js.map +1 -1
  47. package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
  48. package/lib/nodeElement/ghostDropHint.js +8 -4
  49. package/lib/nodeElement/ghostDropHint.js.map +1 -1
  50. package/lib/nodeElement/index.d.ts.map +1 -1
  51. package/lib/nodeElement/index.js +6 -6
  52. package/lib/nodeElement/index.js.map +1 -1
  53. package/lib/nodeUtils.d.ts.map +1 -1
  54. package/lib/nodeUtils.js +1 -1
  55. package/lib/nodeUtils.js.map +1 -1
  56. package/lib/options.d.ts +23 -6
  57. package/lib/options.d.ts.map +1 -1
  58. package/lib/requestUrl.d.ts +0 -1
  59. package/lib/requestUrl.d.ts.map +1 -1
  60. package/lib/requestUrl.js +4 -22
  61. package/lib/requestUrl.js.map +1 -1
  62. package/lib/saveStateHandler.d.ts.map +1 -1
  63. package/lib/saveStateHandler.js +21 -41
  64. package/lib/saveStateHandler.js.map +1 -1
  65. package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
  66. package/lib/scrollHandler/containerScrollParent.js +3 -8
  67. package/lib/scrollHandler/containerScrollParent.js.map +1 -1
  68. package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
  69. package/lib/scrollHandler/createScrollParent.js +4 -5
  70. package/lib/scrollHandler/createScrollParent.js.map +1 -1
  71. package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
  72. package/lib/scrollHandler/documentScrollParent.js +3 -9
  73. package/lib/scrollHandler/documentScrollParent.js.map +1 -1
  74. package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
  75. package/lib/scrollHandler/scrollParent.js +19 -17
  76. package/lib/scrollHandler/scrollParent.js.map +1 -1
  77. package/lib/selectNodeHandler.d.ts +3 -1
  78. package/lib/selectNodeHandler.d.ts.map +1 -1
  79. package/lib/selectNodeHandler.js +27 -37
  80. package/lib/selectNodeHandler.js.map +1 -1
  81. package/lib/setDefaultOptions.d.ts +3 -0
  82. package/lib/setDefaultOptions.d.ts.map +1 -1
  83. package/lib/setDefaultOptions.js +21 -20
  84. package/lib/setDefaultOptions.js.map +1 -1
  85. package/lib/util.d.ts.map +1 -1
  86. package/lib/util.js +1 -1
  87. package/lib/util.js.map +1 -1
  88. package/lib/version.d.ts +1 -1
  89. package/lib/version.js +1 -1
  90. package/lib/version.js.map +1 -1
  91. package/package.json +44 -35
  92. package/src/animation.ts +13 -11
  93. package/src/dataLoader.ts +11 -0
  94. package/src/dragAndDropHandler/dragElement.ts +2 -1
  95. package/src/dragAndDropHandler/index.ts +70 -75
  96. package/src/dragAndDropHandler/iterateVisibleNodes.ts +18 -16
  97. package/src/elementsRenderer.ts +76 -46
  98. package/src/events.ts +44 -11
  99. package/src/index.ts +210 -150
  100. package/src/keyHandler.ts +95 -41
  101. package/src/methodTypes.ts +3 -3
  102. package/src/mouseHandler.ts +10 -7
  103. package/src/node.ts +155 -148
  104. package/src/nodeElement/folderElement.ts +54 -63
  105. package/src/nodeElement/ghostDropHint.ts +4 -2
  106. package/src/nodeElement/index.ts +9 -15
  107. package/src/nodeUtils.ts +1 -1
  108. package/src/options.ts +23 -6
  109. package/src/requestUrl.ts +4 -25
  110. package/src/saveStateHandler.ts +29 -43
  111. package/src/scrollHandler/containerScrollParent.ts +3 -9
  112. package/src/scrollHandler/createScrollParent.ts +1 -2
  113. package/src/scrollHandler/documentScrollParent.ts +5 -11
  114. package/src/scrollHandler/scrollParent.ts +29 -25
  115. package/src/selectNodeHandler.ts +34 -38
  116. package/src/setDefaultOptions.ts +31 -19
  117. package/src/util.ts +1 -2
  118. package/src/version.ts +1 -1
  119. package/tree_element.css +87 -69
  120. package/tree_element.debug.js +717 -659
  121. package/tree_element.debug.js.map +1 -1
  122. package/tree_element.js +2 -2
  123. 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
- IsFocusOnTree,
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
- isFocusOnTree: IsFocusOnTree;
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
- isFocusOnTree,
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.isFocusOnTree = isFocusOnTree;
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
- private canHandleKeyboard(): boolean {
64
- return this.keyboardSupport && this.isFocusOnTree();
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
- if (!this.canHandleKeyboard()) {
103
+ const focusedNode = this.getFocusedNode();
104
+
105
+ if (!focusedNode) {
69
106
  return;
70
107
  }
71
108
 
72
- let isKeyHandled = false;
109
+ let isKeyHandled: boolean;
73
110
 
74
111
  const selectedNode = this.getSelectedNode();
75
- if (selectedNode) {
76
- switch (e.key) {
77
- case "ArrowDown":
78
- isKeyHandled = this.moveDown();
79
- break;
80
-
81
- case "ArrowLeft":
82
- isKeyHandled = this.moveLeft();
83
- break;
84
-
85
- case "ArrowRight":
86
- isKeyHandled = this.moveRight();
87
- break;
88
-
89
- case "ArrowUp":
90
- isKeyHandled = this.moveUp();
91
- break;
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 (!selectedNode?.isFolder()) {
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 (!node) {
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
  }
@@ -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;
@@ -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
- this.isMouseStarted = false;
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 {