tree-element 0.3.2 → 0.4.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.
Files changed (59) hide show
  1. package/README.md +1 -0
  2. package/lib/classNames.js +4 -4
  3. package/lib/classNames.js.map +1 -1
  4. package/lib/dataLoader.d.ts +0 -1
  5. package/lib/dataLoader.d.ts.map +1 -1
  6. package/lib/dataLoader.js +6 -6
  7. package/lib/dataLoader.js.map +1 -1
  8. package/lib/elementsRenderer.d.ts +4 -2
  9. package/lib/elementsRenderer.d.ts.map +1 -1
  10. package/lib/elementsRenderer.js +35 -21
  11. package/lib/elementsRenderer.js.map +1 -1
  12. package/lib/index.d.ts +10 -4
  13. package/lib/index.d.ts.map +1 -1
  14. package/lib/index.js +75 -18
  15. package/lib/index.js.map +1 -1
  16. package/lib/keyHandler.d.ts +14 -3
  17. package/lib/keyHandler.d.ts.map +1 -1
  18. package/lib/keyHandler.js +61 -32
  19. package/lib/keyHandler.js.map +1 -1
  20. package/lib/methodTypes.d.ts +3 -0
  21. package/lib/methodTypes.d.ts.map +1 -1
  22. package/lib/nodeElement/folderElement.d.ts +1 -1
  23. package/lib/nodeElement/folderElement.d.ts.map +1 -1
  24. package/lib/nodeElement/folderElement.js +4 -4
  25. package/lib/nodeElement/folderElement.js.map +1 -1
  26. package/lib/nodeElement/index.d.ts +3 -2
  27. package/lib/nodeElement/index.d.ts.map +1 -1
  28. package/lib/nodeElement/index.js +15 -12
  29. package/lib/nodeElement/index.js.map +1 -1
  30. package/lib/options.d.ts +13 -0
  31. package/lib/options.d.ts.map +1 -1
  32. package/lib/selectNodeHandler.d.ts +3 -0
  33. package/lib/selectNodeHandler.d.ts.map +1 -1
  34. package/lib/selectNodeHandler.js +54 -22
  35. package/lib/selectNodeHandler.js.map +1 -1
  36. package/lib/setDefaultOptions.d.ts.map +1 -1
  37. package/lib/setDefaultOptions.js +1 -0
  38. package/lib/setDefaultOptions.js.map +1 -1
  39. package/lib/version.d.ts +1 -1
  40. package/lib/version.js +1 -1
  41. package/lib/version.js.map +1 -1
  42. package/package.json +19 -19
  43. package/src/classNames.ts +4 -4
  44. package/src/dataLoader.ts +6 -9
  45. package/src/elementsRenderer.ts +42 -24
  46. package/src/index.ts +83 -24
  47. package/src/keyHandler.ts +84 -34
  48. package/src/methodTypes.ts +6 -0
  49. package/src/nodeElement/folderElement.ts +4 -4
  50. package/src/nodeElement/index.ts +20 -17
  51. package/src/options.ts +13 -0
  52. package/src/selectNodeHandler.ts +58 -25
  53. package/src/setDefaultOptions.ts +1 -0
  54. package/src/version.ts +1 -1
  55. package/tree_element.css +16 -0
  56. package/tree_element.debug.js +256 -120
  57. package/tree_element.debug.js.map +1 -1
  58. package/tree_element.js +2 -2
  59. package/tree_element.js.map +1 -1
@@ -128,9 +128,9 @@ export default class SelectNodeHandler {
128
128
  this.selectedNodes.delete(node.id);
129
129
 
130
130
  if (includeChildren) {
131
- node.iterate(() => {
132
- if (node.id != null) {
133
- this.selectedNodes.delete(node.id);
131
+ node.iterate((child: Node) => {
132
+ if (child.id != null) {
133
+ this.selectedNodes.delete(child.id);
134
134
  }
135
135
  return true;
136
136
  });
@@ -149,37 +149,32 @@ export default class SelectNodeHandler {
149
149
  * mustToggle: support deselecting the selected node
150
150
  */
151
151
  public selectSingleNode(node: Node, optionsParam?: SelectNodeOptions) {
152
- const defaultOptions = { mustSetFocus: true, mustToggle: true };
153
- const selectOptions = { ...defaultOptions, ...optionsParam };
154
-
155
- const canSelect = (): boolean => {
156
- if (!this.getSelectable()) {
157
- return false;
158
- }
159
-
160
- const onCanSelectNode = this.getOnCanSelectNode();
161
- return onCanSelectNode ? onCanSelectNode(node) : true;
162
- };
163
-
164
- if (!canSelect()) {
152
+ if (!this.canSelect(node)) {
165
153
  return;
166
154
  }
167
155
 
168
- const deselectCurrentNode = (deselectedNode: Node) => {
169
- this.removeFromSelection(deselectedNode);
170
- this.getNodeElementForNode(deselectedNode).deselect();
171
- };
156
+ const defaultOptions = { mustSetFocus: true, mustToggle: true };
157
+ const selectOptions = { ...defaultOptions, ...optionsParam };
158
+
159
+ const otherSelectedNodes = this.getSelectedNodes().filter(
160
+ (selectedNode) => selectedNode !== node,
161
+ );
172
162
 
173
163
  if (this.isNodeSelected(node)) {
174
- if (selectOptions.mustToggle) {
175
- deselectCurrentNode(node);
164
+ if (otherSelectedNodes.length) {
165
+ // Part of a multiple selection: keep only this node selected
166
+ for (const otherNode of otherSelectedNodes) {
167
+ this.deselectNode(otherNode);
168
+ }
169
+ } else if (selectOptions.mustToggle) {
170
+ this.deselectNode(node);
176
171
  this.triggerEvent("tree.deselect", { node });
177
172
  }
178
173
  } else {
179
- const deselectedNode = this.getSelectedNode();
174
+ const deselectedNode = otherSelectedNodes[0] ?? null;
180
175
 
181
- if (deselectedNode) {
182
- deselectCurrentNode(deselectedNode);
176
+ for (const otherNode of otherSelectedNodes) {
177
+ this.deselectNode(otherNode);
183
178
  }
184
179
 
185
180
  this.addToSelection(node);
@@ -195,4 +190,42 @@ export default class SelectNodeHandler {
195
190
  this.updateTabStop();
196
191
  this.saveState();
197
192
  }
193
+
194
+ /* Add a node to the selection, or remove it when it is selected, without
195
+ * changing the other selected nodes.
196
+ * Checks if the node is selectable and saves the state.
197
+ */
198
+ public toggleNodeInSelection(node: Node, mustSetFocus = true): void {
199
+ if (!this.canSelect(node)) {
200
+ return;
201
+ }
202
+
203
+ if (this.isNodeSelected(node)) {
204
+ this.deselectNode(node);
205
+ this.triggerEvent("tree.deselect", { node });
206
+ } else {
207
+ this.addToSelection(node);
208
+ this.openParents(node);
209
+ this.getNodeElementForNode(node).select(mustSetFocus);
210
+
211
+ this.triggerEvent("tree.select", { deselectedNode: null, node });
212
+ }
213
+
214
+ this.updateTabStop();
215
+ this.saveState();
216
+ }
217
+
218
+ private canSelect(node: Node): boolean {
219
+ if (!this.getSelectable()) {
220
+ return false;
221
+ }
222
+
223
+ const onCanSelectNode = this.getOnCanSelectNode();
224
+ return onCanSelectNode ? onCanSelectNode(node) : true;
225
+ }
226
+
227
+ private deselectNode(node: Node): void {
228
+ this.removeFromSelection(node);
229
+ this.getNodeElementForNode(node).deselect();
230
+ }
198
231
  }
@@ -29,6 +29,7 @@ const defaults: TreeElementOptions = {
29
29
  // dataUrl: undefined,
30
30
  dragAndDrop: false,
31
31
  keyboardSupport: true,
32
+ multiSelect: false,
32
33
  nodeClass: Node,
33
34
  // onCanMove: undefined, // Can this node be moved?
34
35
  // onCanMoveTo: undefined, // Can this node be moved to this position? function(moved_node, target_node, position)
package/src/version.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  // Generated by config/generateVersion.mjs. Do not edit.
2
- const version = "0.3.2";
2
+ const version = "0.4.0";
3
3
 
4
4
  export default version;
package/tree_element.css CHANGED
@@ -86,6 +86,22 @@ ul.tree-element .tree-element-title {
86
86
  vertical-align: middle;
87
87
  }
88
88
 
89
+ /* The li is the treeitem, so it gets the focus. Show the focus ring around
90
+ the title, not around the li with all its children. */
91
+
92
+ ul.tree-element li.tree-element-common:focus {
93
+ outline: none;
94
+ }
95
+
96
+ ul.tree-element li.tree-element-common:focus-visible
97
+ > .tree-element-element
98
+ .tree-element-title {
99
+ /* Same as the default focus ring of the browser. Browsers without
100
+ -webkit-focus-ring-color ignore the second line. */
101
+ outline: auto;
102
+ outline-color: -webkit-focus-ring-color;
103
+ }
104
+
89
105
  /* Line up with the titles of folders, after the toggler */
90
106
 
91
107
  ul.tree-element .tree-element-title-button-left {