tree-element 0.1.1 → 0.3.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 (155) hide show
  1. package/README.md +43 -31
  2. package/lib/animation.d.ts +2 -2
  3. package/lib/animation.d.ts.map +1 -1
  4. package/lib/animation.js +16 -12
  5. package/lib/animation.js.map +1 -1
  6. package/lib/classNames.d.ts.map +1 -1
  7. package/lib/classNames.js +2 -2
  8. package/lib/classNames.js.map +1 -1
  9. package/lib/dataLoader.d.ts +1 -0
  10. package/lib/dataLoader.d.ts.map +1 -1
  11. package/lib/dataLoader.js +22 -20
  12. package/lib/dataLoader.js.map +1 -1
  13. package/lib/dragAndDropHandler/binarySearch.js +3 -3
  14. package/lib/dragAndDropHandler/binarySearch.js.map +1 -1
  15. package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -1
  16. package/lib/dragAndDropHandler/dragElement.js +11 -13
  17. package/lib/dragAndDropHandler/dragElement.js.map +1 -1
  18. package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -1
  19. package/lib/dragAndDropHandler/generateHitAreas.js +25 -25
  20. package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -1
  21. package/lib/dragAndDropHandler/index.d.ts.map +1 -1
  22. package/lib/dragAndDropHandler/index.js +125 -158
  23. package/lib/dragAndDropHandler/index.js.map +1 -1
  24. package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
  25. package/lib/dragAndDropHandler/iterateVisibleNodes.js +23 -22
  26. package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
  27. package/lib/dragAndDropHandler/types.d.ts.map +1 -1
  28. package/lib/elementsRenderer.d.ts +20 -7
  29. package/lib/elementsRenderer.d.ts.map +1 -1
  30. package/lib/elementsRenderer.js +195 -136
  31. package/lib/elementsRenderer.js.map +1 -1
  32. package/lib/events.d.ts +44 -11
  33. package/lib/events.d.ts.map +1 -1
  34. package/lib/index.d.ts +36 -13
  35. package/lib/index.d.ts.map +1 -1
  36. package/lib/index.js +386 -349
  37. package/lib/index.js.map +1 -1
  38. package/lib/keyHandler.d.ts +13 -8
  39. package/lib/keyHandler.d.ts.map +1 -1
  40. package/lib/keyHandler.js +106 -51
  41. package/lib/keyHandler.js.map +1 -1
  42. package/lib/methodTypes.d.ts +3 -3
  43. package/lib/methodTypes.d.ts.map +1 -1
  44. package/lib/mouseHandler.d.ts +1 -1
  45. package/lib/mouseHandler.d.ts.map +1 -1
  46. package/lib/mouseHandler.js +36 -49
  47. package/lib/mouseHandler.js.map +1 -1
  48. package/lib/mouseUtils.d.ts.map +1 -1
  49. package/lib/mouseUtils.js +2 -2
  50. package/lib/mouseUtils.js.map +1 -1
  51. package/lib/node.d.ts +47 -16
  52. package/lib/node.d.ts.map +1 -1
  53. package/lib/node.js +169 -171
  54. package/lib/node.js.map +1 -1
  55. package/lib/nodeElement/borderDropHint.d.ts.map +1 -1
  56. package/lib/nodeElement/borderDropHint.js +4 -5
  57. package/lib/nodeElement/borderDropHint.js.map +1 -1
  58. package/lib/nodeElement/folderElement.d.ts +8 -5
  59. package/lib/nodeElement/folderElement.d.ts.map +1 -1
  60. package/lib/nodeElement/folderElement.js +75 -67
  61. package/lib/nodeElement/folderElement.js.map +1 -1
  62. package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
  63. package/lib/nodeElement/ghostDropHint.js +13 -13
  64. package/lib/nodeElement/ghostDropHint.js.map +1 -1
  65. package/lib/nodeElement/index.d.ts +2 -1
  66. package/lib/nodeElement/index.d.ts.map +1 -1
  67. package/lib/nodeElement/index.js +38 -30
  68. package/lib/nodeElement/index.js.map +1 -1
  69. package/lib/nodeUtils.d.ts.map +1 -1
  70. package/lib/nodeUtils.js +1 -1
  71. package/lib/nodeUtils.js.map +1 -1
  72. package/lib/options.d.ts +19 -3
  73. package/lib/options.d.ts.map +1 -1
  74. package/lib/positionUtils.js +3 -3
  75. package/lib/positionUtils.js.map +1 -1
  76. package/lib/requestUrl.d.ts +1 -1
  77. package/lib/requestUrl.d.ts.map +1 -1
  78. package/lib/requestUrl.js +6 -17
  79. package/lib/requestUrl.js.map +1 -1
  80. package/lib/saveStateHandler.d.ts.map +1 -1
  81. package/lib/saveStateHandler.js +59 -89
  82. package/lib/saveStateHandler.js.map +1 -1
  83. package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
  84. package/lib/scrollHandler/containerScrollParent.js +11 -18
  85. package/lib/scrollHandler/containerScrollParent.js.map +1 -1
  86. package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
  87. package/lib/scrollHandler/createScrollParent.js +12 -13
  88. package/lib/scrollHandler/createScrollParent.js.map +1 -1
  89. package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
  90. package/lib/scrollHandler/documentScrollParent.js +18 -27
  91. package/lib/scrollHandler/documentScrollParent.js.map +1 -1
  92. package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
  93. package/lib/scrollHandler/scrollParent.js +30 -34
  94. package/lib/scrollHandler/scrollParent.js.map +1 -1
  95. package/lib/scrollHandler.d.ts.map +1 -1
  96. package/lib/scrollHandler.js +11 -14
  97. package/lib/scrollHandler.js.map +1 -1
  98. package/lib/selectNodeHandler.d.ts +4 -2
  99. package/lib/selectNodeHandler.d.ts.map +1 -1
  100. package/lib/selectNodeHandler.js +64 -83
  101. package/lib/selectNodeHandler.js.map +1 -1
  102. package/lib/setDefaultOptions.d.ts.map +1 -1
  103. package/lib/setDefaultOptions.js +34 -38
  104. package/lib/setDefaultOptions.js.map +1 -1
  105. package/lib/triggerCustomEvent.d.ts.map +1 -1
  106. package/lib/triggerCustomEvent.js +2 -2
  107. package/lib/triggerCustomEvent.js.map +1 -1
  108. package/lib/util.d.ts.map +1 -1
  109. package/lib/util.js +2 -2
  110. package/lib/util.js.map +1 -1
  111. package/lib/version.d.ts +1 -1
  112. package/lib/version.js +1 -1
  113. package/lib/version.js.map +1 -1
  114. package/package.json +43 -32
  115. package/src/animation.ts +14 -12
  116. package/src/classNames.ts +52 -52
  117. package/src/dataLoader.ts +79 -71
  118. package/src/dragAndDropHandler/binarySearch.ts +17 -17
  119. package/src/dragAndDropHandler/dragElement.ts +51 -50
  120. package/src/dragAndDropHandler/generateHitAreas.ts +156 -161
  121. package/src/dragAndDropHandler/index.ts +334 -348
  122. package/src/dragAndDropHandler/iterateVisibleNodes.ts +61 -63
  123. package/src/dragAndDropHandler/types.ts +5 -5
  124. package/src/elementsRenderer.ts +377 -294
  125. package/src/events.ts +241 -208
  126. package/src/header.txt +1 -1
  127. package/src/index.ts +259 -229
  128. package/src/keyHandler.ts +179 -115
  129. package/src/methodTypes.ts +7 -10
  130. package/src/mouseHandler.ts +316 -316
  131. package/src/mouseUtils.ts +14 -14
  132. package/src/node.ts +773 -771
  133. package/src/nodeElement/borderDropHint.ts +25 -25
  134. package/src/nodeElement/folderElement.ts +116 -102
  135. package/src/nodeElement/ghostDropHint.ts +64 -62
  136. package/src/nodeElement/index.ts +81 -73
  137. package/src/nodeUtils.ts +5 -5
  138. package/src/options.ts +25 -5
  139. package/src/requestUrl.ts +7 -14
  140. package/src/saveStateHandler.ts +191 -207
  141. package/src/scrollHandler/containerScrollParent.ts +40 -49
  142. package/src/scrollHandler/createScrollParent.ts +26 -27
  143. package/src/scrollHandler/documentScrollParent.ts +66 -72
  144. package/src/scrollHandler/scrollParent.ts +90 -86
  145. package/src/scrollHandler.ts +45 -45
  146. package/src/selectNodeHandler.ts +171 -165
  147. package/src/setDefaultOptions.ts +44 -32
  148. package/src/triggerCustomEvent.ts +7 -3
  149. package/src/util.ts +2 -3
  150. package/src/version.ts +1 -1
  151. package/tree_element.css +87 -69
  152. package/tree_element.debug.js +3866 -3831
  153. package/tree_element.debug.js.map +1 -1
  154. package/tree_element.js +2 -2
  155. package/tree_element.js.map +1 -1
@@ -1,192 +1,198 @@
1
- import type { GetNodeById, GetNodeElementForNode, OpenParents, TriggerEvent } from "./methodTypes";
1
+ import type {
2
+ GetNodeById,
3
+ GetNodeElementForNode,
4
+ OpenParents,
5
+ TriggerEvent,
6
+ } from "./methodTypes";
2
7
  import type { Node, NodeId } from "./node";
3
8
  import type { OnCanSelectNode } from "./options";
4
9
 
5
10
  export interface SelectNodeOptions {
6
- mustSetFocus?: boolean;
7
- mustToggle?: boolean;
11
+ mustSetFocus?: boolean;
12
+ mustToggle?: boolean;
8
13
  }
9
14
 
10
15
  interface SelectNodeHandlerParameters {
11
- getNodeById: GetNodeById;
12
- getNodeElementForNode: GetNodeElementForNode;
13
- getOnCanSelectNode: () => OnCanSelectNode | undefined;
14
- getSelectable: () => boolean;
15
- openParents: OpenParents;
16
- saveState: () => void;
17
- triggerEvent: TriggerEvent;
16
+ getNodeById: GetNodeById;
17
+ getNodeElementForNode: GetNodeElementForNode;
18
+ getOnCanSelectNode: () => OnCanSelectNode | undefined;
19
+ getSelectable: () => boolean;
20
+ openParents: OpenParents;
21
+ saveState: () => void;
22
+ triggerEvent: TriggerEvent;
23
+ updateTabStop: () => void;
18
24
  }
19
25
 
20
26
  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;
27
+ private getNodeById: GetNodeById;
28
+ private getNodeElementForNode: GetNodeElementForNode;
29
+ private getOnCanSelectNode: () => OnCanSelectNode | undefined;
30
+ private getSelectable: () => boolean;
31
+ private openParents: OpenParents;
32
+ private saveState: () => void;
33
+ private selectedNodes: Set<NodeId>;
34
+ private selectedSingleNode: Node | null;
35
+ private triggerEvent: TriggerEvent;
36
+ private updateTabStop: () => void;
37
+
38
+ constructor({
39
+ getNodeById,
40
+ getNodeElementForNode,
41
+ getOnCanSelectNode,
42
+ getSelectable,
43
+ openParents,
44
+ saveState,
45
+ triggerEvent,
46
+ updateTabStop,
47
+ }: SelectNodeHandlerParameters) {
48
+ this.getNodeById = getNodeById;
49
+ this.getNodeElementForNode = getNodeElementForNode;
50
+ this.getOnCanSelectNode = getOnCanSelectNode;
51
+ this.getSelectable = getSelectable;
52
+ this.openParents = openParents;
53
+ this.saveState = saveState;
54
+ this.selectedNodes = new Set<NodeId>();
55
+ this.selectedSingleNode = null;
56
+ this.triggerEvent = triggerEvent;
57
+ this.updateTabStop = updateTabStop;
58
+ }
59
+
60
+ public addToSelection(node: Node): void {
61
+ if (node.id == null) {
62
+ this.selectedSingleNode = node;
63
+ } else {
64
+ this.selectedNodes.add(node.id);
41
65
  }
66
+ }
42
67
 
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
- }
68
+ public clear(): void {
69
+ this.selectedNodes.clear();
70
+ this.selectedSingleNode = null;
71
+ }
50
72
 
51
- public clear(): void {
52
- this.selectedNodes.clear();
53
- this.selectedSingleNode = null;
54
- }
73
+ public getSelectedNode(): Node | null {
74
+ const selectedNodes = this.getSelectedNodes();
55
75
 
56
- public getSelectedNode(): false | Node {
57
- const selectedNodes = this.getSelectedNodes();
76
+ return selectedNodes.length ? (selectedNodes[0] ?? null) : null;
77
+ }
58
78
 
59
- if (selectedNodes.length) {
60
- return selectedNodes[0] ?? false;
61
- } else {
62
- return false;
63
- }
79
+ public getSelectedNodes(): Node[] {
80
+ if (this.selectedSingleNode) {
81
+ return [this.selectedSingleNode];
64
82
  }
65
83
 
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
- }
84
+ const selectedNodes: Node[] = [];
85
+
86
+ this.selectedNodes.forEach((id) => {
87
+ const node = this.getNodeById(id);
88
+ if (node) {
89
+ selectedNodes.push(node);
90
+ }
91
+ });
82
92
 
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
- }
93
+ return selectedNodes;
94
+ }
95
+
96
+ public getSelectedNodesUnder(parent: Node): Node[] {
97
+ if (this.selectedSingleNode) {
98
+ return parent.isParentOf(this.selectedSingleNode)
99
+ ? [this.selectedSingleNode]
100
+ : [];
102
101
  }
103
102
 
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
- }
103
+ const selectedNodes: Node[] = [];
104
+
105
+ this.selectedNodes.forEach((id) => {
106
+ const node = this.getNodeById(id);
107
+ if (node && parent.isParentOf(node)) {
108
+ selectedNodes.push(node);
109
+ }
110
+ });
111
+
112
+ return selectedNodes;
113
+ }
114
+
115
+ public isNodeSelected(node: Node): boolean {
116
+ if (node.id != null) {
117
+ return this.selectedNodes.has(node.id);
112
118
  }
119
+ return this.selectedSingleNode ? this.selectedSingleNode === node : false;
120
+ }
113
121
 
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);
122
+ public removeFromSelection(node: Node, includeChildren = false): void {
123
+ if (node.id == null) {
124
+ if (this.selectedSingleNode === node) {
125
+ this.selectedSingleNode = null;
126
+ }
127
+ } else {
128
+ this.selectedNodes.delete(node.id);
124
129
 
125
- if (includeChildren) {
126
- node.iterate(() => {
127
- if (node.id != null) {
128
- this.selectedNodes.delete(node.id);
129
- }
130
- return true;
131
- });
132
- }
133
- }
130
+ if (includeChildren) {
131
+ node.iterate(() => {
132
+ if (node.id != null) {
133
+ this.selectedNodes.delete(node.id);
134
+ }
135
+ return true;
136
+ });
137
+ }
138
+ }
139
+ }
140
+
141
+ /* Select a single node.
142
+ * Renders the changed elements.
143
+ * Deselects if the node is currently selected (if the mustToggle is on).
144
+ * Deselects the previously selected node.
145
+ * Check if the node is selectable.
146
+ * Saves the state.
147
+ * Options:
148
+ * mustSetFocus: set the focus to the selected node
149
+ * mustToggle: support deselecting the selected node
150
+ */
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()) {
165
+ return;
134
166
  }
135
167
 
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();
168
+ const deselectCurrentNode = (deselectedNode: Node) => {
169
+ this.removeFromSelection(deselectedNode);
170
+ this.getNodeElementForNode(deselectedNode).deselect();
171
+ };
172
+
173
+ if (this.isNodeSelected(node)) {
174
+ if (selectOptions.mustToggle) {
175
+ deselectCurrentNode(node);
176
+ this.triggerEvent("tree.deselect", { node });
177
+ }
178
+ } else {
179
+ const deselectedNode = this.getSelectedNode();
180
+
181
+ if (deselectedNode) {
182
+ deselectCurrentNode(deselectedNode);
183
+ }
184
+
185
+ this.addToSelection(node);
186
+ this.openParents(node);
187
+ this.getNodeElementForNode(node).select(selectOptions.mustSetFocus);
188
+
189
+ this.triggerEvent("tree.select", {
190
+ deselectedNode,
191
+ node,
192
+ });
191
193
  }
194
+
195
+ this.updateTabStop();
196
+ this.saveState();
197
+ }
192
198
  }
@@ -1,3 +1,4 @@
1
+ import type { AnimationSpeed } from "./animation";
1
2
  import type { TreeElementOptions } from "./options";
2
3
 
3
4
  import { DEFAULT_CLASS_PREFIX } from "./classNames";
@@ -10,41 +11,48 @@ const defaults: TreeElementOptions = {
10
11
  buttonLeft: true,
11
12
  classPrefix: DEFAULT_CLASS_PREFIX, // the prefix of all css classes
12
13
  // 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,
14
+ // https://www.fileformat.info/info/unicode/char/25ba/index.htm
15
+ // closedIcon: undefined,
16
+ // commonClassName: undefined, // the class of every element; the default is "<classPrefix>-common"
17
+ // data: undefined,
18
+ // dataFilter: undefined,
19
+ // dataUrl: undefined,
19
20
  dragAndDrop: false,
20
21
  keyboardSupport: true,
21
22
  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,
23
+ // onCanMove: undefined, // Can this node be moved?
24
+ // onCanMoveTo: undefined, // Can this node be moved to this position? function(moved_node, target_node, position)
25
+ // onCanSelectNode: undefined,
26
+ // onCreateLi: undefined,
27
+ // onDragMove: undefined,
28
+ // onDragStop: undefined,
29
+ // onGetStateFromStorage: undefined,
30
+ // onIsMoveHandle: undefined,
31
+ // onSetStateFromStorage: undefined,
32
+ // openedIcon: undefined,
32
33
  openFolderDelay: 500, // The delay for opening a folder during drag and drop; the value is in milliseconds
33
34
  // 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)
35
+ // https://www.fileformat.info/info/unicode/char/25bc/index.htm
36
+ // rtl: undefined, // right-to-left support; true / false (default)
36
37
  saveState: false, // true / false / string (local storage key; the default key is "tree")
37
38
  selectable: true,
38
39
  showEmptyFolder: false,
39
40
  slide: true, // must display slide animation?
40
41
  startDndDelay: 300, // The delay for starting dnd (in milliseconds)
41
42
  tabIndex: 0,
42
- treeClassName: undefined, // the class of the root element; the default is classPrefix
43
+ // treeClassName: undefined, // the class of the root element; the default is classPrefix
43
44
  useContextMenu: true,
44
45
  };
45
46
 
46
- const setDefaultOptions = (htmlElement: HTMLElement, inputOptions: Partial<TreeElementOptions>): TreeElementOptions => {
47
- const options = { ...defaults, ...inputOptions };
47
+ const setDefaultOptions = (
48
+ htmlElement: HTMLElement,
49
+ inputOptions: Partial<TreeElementOptions>,
50
+ ): TreeElementOptions => {
51
+ const options = {
52
+ ...defaults,
53
+ ...inputOptions,
54
+ animationSpeed: inputOptions.animationSpeed ?? getDefaultAnimationSpeed(),
55
+ };
48
56
 
49
57
  options.dataUrl ??= htmlElement.dataset.url;
50
58
  options.rtl ??= getRtlOptionFromHTMLElement(htmlElement);
@@ -52,28 +60,32 @@ const setDefaultOptions = (htmlElement: HTMLElement, inputOptions: Partial<TreeE
52
60
  options.openedIcon ??= "&#x25bc;";
53
61
 
54
62
  return options;
55
- }
63
+ };
64
+
65
+ // No animation when the user asked the system for reduced motion
66
+ const getDefaultAnimationSpeed = (): AnimationSpeed =>
67
+ prefersReducedMotion() ? 0 : defaults.animationSpeed;
68
+
69
+ const prefersReducedMotion = (): boolean =>
70
+ typeof window.matchMedia === "function" &&
71
+ window.matchMedia("(prefers-reduced-motion: reduce)").matches;
56
72
 
57
73
  const getDefaultClosedIcon = (options: TreeElementOptions): string => {
58
74
  if (options.rtl) {
59
75
  // triangle to the left
60
76
  return "&#x25c0;";
61
- } else {
62
- // triangle to the right
63
- return "&#x25ba;";
64
77
  }
65
- }
78
+ // triangle to the right
79
+ return "&#x25ba;";
80
+ };
66
81
 
67
82
  const getRtlOptionFromHTMLElement = (htmlElement: HTMLElement): boolean => {
68
83
  const dataRtl = htmlElement.dataset.rtl;
69
84
 
70
85
  if (dataRtl == "") {
71
86
  return true;
72
- } else if (dataRtl === "false") {
73
- return false;
74
- } else {
75
- return Boolean(dataRtl);
76
87
  }
77
- }
88
+ return dataRtl === "false" ? false : Boolean(dataRtl);
89
+ };
78
90
 
79
- export default setDefaultOptions;
91
+ export default setDefaultOptions;
@@ -1,5 +1,9 @@
1
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 => {
2
+ const triggerCustomEvent = (
3
+ element: HTMLElement,
4
+ eventName: string,
5
+ values?: Record<string, unknown>,
6
+ ): boolean => {
3
7
  const event = new CustomEvent(eventName, {
4
8
  bubbles: true,
5
9
  cancelable: true,
@@ -9,6 +13,6 @@ const triggerCustomEvent = (element: HTMLElement, eventName: string, values?: Re
9
13
  element.dispatchEvent(event);
10
14
 
11
15
  return !event.defaultPrevented;
12
- }
16
+ };
13
17
 
14
- export default triggerCustomEvent;
18
+ export default triggerCustomEvent;
package/src/util.ts CHANGED
@@ -1,5 +1,4 @@
1
- export const isInt = (n: unknown): boolean =>
2
- typeof n === "number" && n % 1 === 0;
1
+ export const isInt = (n: unknown): boolean => Number.isInteger(n);
3
2
 
4
3
  export const getBoolString = (value: unknown): string =>
5
- value ? "true" : "false";
4
+ value ? "true" : "false";
package/src/version.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  // Generated by config/generateVersion.mjs. Do not edit.
2
- const version = "0.1.1";
2
+ const version = "0.3.0";
3
3
 
4
4
  export default version;