tree-element 0.1.0 → 0.2.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 (149) hide show
  1. package/README.md +49 -29
  2. package/lib/animation.js +5 -5
  3. package/lib/animation.js.map +1 -1
  4. package/lib/classNames.d.ts.map +1 -1
  5. package/lib/classNames.js +2 -2
  6. package/lib/classNames.js.map +1 -1
  7. package/lib/dataLoader.d.ts.map +1 -1
  8. package/lib/dataLoader.js +18 -21
  9. package/lib/dataLoader.js.map +1 -1
  10. package/lib/dragAndDropHandler/binarySearch.js +3 -3
  11. package/lib/dragAndDropHandler/binarySearch.js.map +1 -1
  12. package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -1
  13. package/lib/dragAndDropHandler/dragElement.js +9 -12
  14. package/lib/dragAndDropHandler/dragElement.js.map +1 -1
  15. package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -1
  16. package/lib/dragAndDropHandler/generateHitAreas.js +25 -25
  17. package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -1
  18. package/lib/dragAndDropHandler/index.d.ts.map +1 -1
  19. package/lib/dragAndDropHandler/index.js +90 -114
  20. package/lib/dragAndDropHandler/index.js.map +1 -1
  21. package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
  22. package/lib/dragAndDropHandler/iterateVisibleNodes.js +10 -10
  23. package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
  24. package/lib/dragAndDropHandler/types.d.ts.map +1 -1
  25. package/lib/elementsRenderer.d.ts +15 -6
  26. package/lib/elementsRenderer.d.ts.map +1 -1
  27. package/lib/elementsRenderer.js +157 -121
  28. package/lib/elementsRenderer.js.map +1 -1
  29. package/lib/events.d.ts +11 -4
  30. package/lib/events.d.ts.map +1 -1
  31. package/lib/index.d.ts +5 -5
  32. package/lib/index.d.ts.map +1 -1
  33. package/lib/index.js +249 -252
  34. package/lib/index.js.map +1 -1
  35. package/lib/keyHandler.d.ts +2 -3
  36. package/lib/keyHandler.d.ts.map +1 -1
  37. package/lib/keyHandler.js +26 -25
  38. package/lib/keyHandler.js.map +1 -1
  39. package/lib/methodTypes.d.ts +1 -1
  40. package/lib/methodTypes.d.ts.map +1 -1
  41. package/lib/mouseHandler.d.ts.map +1 -1
  42. package/lib/mouseHandler.js +26 -42
  43. package/lib/mouseHandler.js.map +1 -1
  44. package/lib/mouseUtils.d.ts.map +1 -1
  45. package/lib/mouseUtils.js +2 -2
  46. package/lib/mouseUtils.js.map +1 -1
  47. package/lib/node.d.ts +2 -1
  48. package/lib/node.d.ts.map +1 -1
  49. package/lib/node.js +36 -35
  50. package/lib/node.js.map +1 -1
  51. package/lib/nodeElement/borderDropHint.d.ts.map +1 -1
  52. package/lib/nodeElement/borderDropHint.js +4 -5
  53. package/lib/nodeElement/borderDropHint.js.map +1 -1
  54. package/lib/nodeElement/folderElement.d.ts +7 -4
  55. package/lib/nodeElement/folderElement.d.ts.map +1 -1
  56. package/lib/nodeElement/folderElement.js +61 -42
  57. package/lib/nodeElement/folderElement.js.map +1 -1
  58. package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
  59. package/lib/nodeElement/ghostDropHint.js +5 -9
  60. package/lib/nodeElement/ghostDropHint.js.map +1 -1
  61. package/lib/nodeElement/index.d.ts +2 -1
  62. package/lib/nodeElement/index.d.ts.map +1 -1
  63. package/lib/nodeElement/index.js +34 -26
  64. package/lib/nodeElement/index.js.map +1 -1
  65. package/lib/nodeUtils.d.ts.map +1 -1
  66. package/lib/nodeUtils.js +1 -1
  67. package/lib/nodeUtils.js.map +1 -1
  68. package/lib/options.d.ts.map +1 -1
  69. package/lib/positionUtils.js +3 -3
  70. package/lib/positionUtils.js.map +1 -1
  71. package/lib/requestUrl.d.ts +1 -1
  72. package/lib/requestUrl.d.ts.map +1 -1
  73. package/lib/requestUrl.js +4 -6
  74. package/lib/requestUrl.js.map +1 -1
  75. package/lib/saveStateHandler.d.ts.map +1 -1
  76. package/lib/saveStateHandler.js +38 -48
  77. package/lib/saveStateHandler.js.map +1 -1
  78. package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
  79. package/lib/scrollHandler/containerScrollParent.js +9 -11
  80. package/lib/scrollHandler/containerScrollParent.js.map +1 -1
  81. package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
  82. package/lib/scrollHandler/createScrollParent.js +10 -10
  83. package/lib/scrollHandler/createScrollParent.js.map +1 -1
  84. package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
  85. package/lib/scrollHandler/documentScrollParent.js +16 -19
  86. package/lib/scrollHandler/documentScrollParent.js.map +1 -1
  87. package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
  88. package/lib/scrollHandler/scrollParent.js +11 -17
  89. package/lib/scrollHandler/scrollParent.js.map +1 -1
  90. package/lib/scrollHandler.d.ts.map +1 -1
  91. package/lib/scrollHandler.js +11 -14
  92. package/lib/scrollHandler.js.map +1 -1
  93. package/lib/selectNodeHandler.d.ts +2 -2
  94. package/lib/selectNodeHandler.d.ts.map +1 -1
  95. package/lib/selectNodeHandler.js +45 -54
  96. package/lib/selectNodeHandler.js.map +1 -1
  97. package/lib/setDefaultOptions.d.ts.map +1 -1
  98. package/lib/setDefaultOptions.js +23 -28
  99. package/lib/setDefaultOptions.js.map +1 -1
  100. package/lib/triggerCustomEvent.d.ts.map +1 -1
  101. package/lib/triggerCustomEvent.js +2 -2
  102. package/lib/triggerCustomEvent.js.map +1 -1
  103. package/lib/util.d.ts.map +1 -1
  104. package/lib/util.js +2 -2
  105. package/lib/util.js.map +1 -1
  106. package/lib/version.d.ts +1 -1
  107. package/lib/version.js +1 -1
  108. package/lib/version.js.map +1 -1
  109. package/package.json +7 -3
  110. package/src/animation.ts +1 -1
  111. package/src/classNames.ts +52 -52
  112. package/src/dataLoader.ts +68 -70
  113. package/src/dragAndDropHandler/binarySearch.ts +17 -17
  114. package/src/dragAndDropHandler/dragElement.ts +50 -50
  115. package/src/dragAndDropHandler/generateHitAreas.ts +156 -161
  116. package/src/dragAndDropHandler/index.ts +342 -351
  117. package/src/dragAndDropHandler/iterateVisibleNodes.ts +59 -63
  118. package/src/dragAndDropHandler/types.ts +5 -5
  119. package/src/elementsRenderer.ts +351 -298
  120. package/src/events.ts +216 -209
  121. package/src/header.txt +1 -1
  122. package/src/index.ts +52 -82
  123. package/src/keyHandler.ts +125 -115
  124. package/src/methodTypes.ts +4 -7
  125. package/src/mouseHandler.ts +314 -317
  126. package/src/mouseUtils.ts +14 -14
  127. package/src/node.ts +761 -766
  128. package/src/nodeElement/borderDropHint.ts +25 -25
  129. package/src/nodeElement/folderElement.ts +135 -112
  130. package/src/nodeElement/ghostDropHint.ts +62 -62
  131. package/src/nodeElement/index.ts +88 -74
  132. package/src/nodeUtils.ts +5 -5
  133. package/src/options.ts +6 -2
  134. package/src/requestUrl.ts +3 -3
  135. package/src/saveStateHandler.ts +204 -206
  136. package/src/scrollHandler/containerScrollParent.ts +49 -52
  137. package/src/scrollHandler/createScrollParent.ts +27 -27
  138. package/src/scrollHandler/documentScrollParent.ts +70 -70
  139. package/src/scrollHandler/scrollParent.ts +98 -98
  140. package/src/scrollHandler.ts +45 -45
  141. package/src/selectNodeHandler.ts +176 -166
  142. package/src/setDefaultOptions.ts +25 -22
  143. package/src/triggerCustomEvent.ts +7 -3
  144. package/src/util.ts +2 -2
  145. package/src/version.ts +1 -1
  146. package/tree_element.debug.js +3770 -3799
  147. package/tree_element.debug.js.map +1 -1
  148. package/tree_element.js +2 -2
  149. package/tree_element.js.map +1 -1
@@ -1,19 +1,19 @@
1
1
  import type { ClassNames } from "../classNames";
2
2
  import type {
3
- GetScrollLeft,
4
- GetTree,
5
- OpenNode,
6
- RefreshElements,
7
- TriggerEvent,
3
+ GetScrollLeft,
4
+ GetTree,
5
+ OpenNode,
6
+ RefreshElements,
7
+ TriggerEvent,
8
8
  } from "../methodTypes";
9
9
  import type { PositionInfo } from "../mouseUtils";
10
10
  import type { Node } from "../node";
11
11
  import type NodeElement from "../nodeElement";
12
12
  import type {
13
- DragMethod,
14
- OnCanMove,
15
- OnCanMoveTo,
16
- OnIsMoveHandle,
13
+ DragMethod,
14
+ OnCanMove,
15
+ OnCanMoveTo,
16
+ OnIsMoveHandle,
17
17
  } from "../options";
18
18
  import type { DropHint, HitArea } from "./types";
19
19
 
@@ -23,420 +23,411 @@ import DragElement from "./dragElement";
23
23
  import generateHitAreas from "./generateHitAreas";
24
24
 
25
25
  interface Dimensions {
26
- bottom: number;
27
- left: number;
28
- right: number;
29
- top: number;
26
+ bottom: number;
27
+ left: number;
28
+ right: number;
29
+ top: number;
30
30
  }
31
31
 
32
32
  interface DragAndDropHandlerParams {
33
- autoEscape?: boolean;
34
- classNames: ClassNames;
35
- getNodeElement: GetNodeElement;
36
- getNodeElementForNode: GetNodeElementForNode;
37
- getScrollLeft: GetScrollLeft;
38
- getTree: GetTree;
39
- onCanMove?: OnCanMove;
40
- onCanMoveTo?: OnCanMoveTo;
41
- onDragMove?: DragMethod;
42
- onDragStop?: DragMethod;
43
- onIsMoveHandle?: OnIsMoveHandle;
44
- openFolderDelay: false | number;
45
- openNode: OpenNode;
46
- refreshElements: RefreshElements;
47
- slide: boolean;
48
- treeElement: HTMLElement;
49
- triggerEvent: TriggerEvent;
33
+ autoEscape?: boolean;
34
+ classNames: ClassNames;
35
+ getNodeElement: GetNodeElement;
36
+ getNodeElementForNode: GetNodeElementForNode;
37
+ getScrollLeft: GetScrollLeft;
38
+ getTree: GetTree;
39
+ onCanMove?: OnCanMove;
40
+ onCanMoveTo?: OnCanMoveTo;
41
+ onDragMove?: DragMethod;
42
+ onDragStop?: DragMethod;
43
+ onIsMoveHandle?: OnIsMoveHandle;
44
+ openFolderDelay: false | number;
45
+ openNode: OpenNode;
46
+ refreshElements: RefreshElements;
47
+ slide: boolean;
48
+ treeElement: HTMLElement;
49
+ triggerEvent: TriggerEvent;
50
50
  }
51
51
  type GetNodeElement = (element: HTMLElement) => NodeElement | null;
52
52
 
53
53
  type GetNodeElementForNode = (node: Node) => NodeElement;
54
54
 
55
55
  export class DragAndDropHandler {
56
- public currentItem: NodeElement | null;
57
- public hitAreas: HitArea[];
58
- public hoveredArea: HitArea | null;
59
- public isDragging: boolean;
60
-
61
- private autoEscape?: boolean;
62
- private classNames: ClassNames;
63
- private dragElement: DragElement | null;
64
- private getNodeElement: GetNodeElement;
65
- private getNodeElementForNode: GetNodeElementForNode;
66
- private getScrollLeft: GetScrollLeft;
67
- private getTree: GetTree;
68
- private onCanMove?: OnCanMove;
69
- private onCanMoveTo?: OnCanMoveTo;
70
- private onDragMove?: DragMethod;
71
- private onDragStop?: DragMethod;
72
- private onIsMoveHandle?: OnIsMoveHandle;
73
- private openFolderDelay: false | number;
74
- private openFolderTimer: null | number;
75
- private openNode: OpenNode;
76
- private previousGhost: DropHint | null;
77
- private refreshElements: RefreshElements;
78
- private slide: boolean;
79
- private treeElement: HTMLElement;
80
- private triggerEvent: TriggerEvent;
81
-
82
- constructor({
83
- autoEscape,
84
- classNames,
85
- getNodeElement,
86
- getNodeElementForNode,
87
- getScrollLeft,
88
- getTree,
89
- onCanMove,
90
- onCanMoveTo,
91
- onDragMove,
92
- onDragStop,
93
- onIsMoveHandle,
94
- openFolderDelay,
95
- openNode,
96
- refreshElements,
97
- slide,
98
- treeElement,
99
- triggerEvent,
100
- }: DragAndDropHandlerParams) {
101
- this.autoEscape = autoEscape;
102
- this.classNames = classNames;
103
- this.getNodeElement = getNodeElement;
104
- this.getNodeElementForNode = getNodeElementForNode;
105
- this.getScrollLeft = getScrollLeft;
106
- this.getTree = getTree;
107
- this.onCanMove = onCanMove;
108
- this.onCanMoveTo = onCanMoveTo;
109
- this.onDragMove = onDragMove;
110
- this.onDragStop = onDragStop;
111
- this.onIsMoveHandle = onIsMoveHandle;
112
- this.openFolderDelay = openFolderDelay;
113
- this.openNode = openNode;
114
- this.refreshElements = refreshElements;
115
- this.slide = slide;
116
- this.treeElement = treeElement;
117
- this.triggerEvent = triggerEvent;
118
-
119
- this.hoveredArea = null;
120
- this.hitAreas = [];
121
- this.isDragging = false;
122
- this.currentItem = null;
123
-
124
- this.dragElement = null;
125
- this.openFolderTimer = null;
126
- this.previousGhost = null;
56
+ public currentItem: NodeElement | null;
57
+ public hitAreas: HitArea[];
58
+ public hoveredArea: HitArea | null;
59
+ public isDragging: boolean;
60
+
61
+ private autoEscape?: boolean;
62
+ private classNames: ClassNames;
63
+ private dragElement: DragElement | null;
64
+ private getNodeElement: GetNodeElement;
65
+ private getNodeElementForNode: GetNodeElementForNode;
66
+ private getScrollLeft: GetScrollLeft;
67
+ private getTree: GetTree;
68
+ private onCanMove?: OnCanMove;
69
+ private onCanMoveTo?: OnCanMoveTo;
70
+ private onDragMove?: DragMethod;
71
+ private onDragStop?: DragMethod;
72
+ private onIsMoveHandle?: OnIsMoveHandle;
73
+ private openFolderDelay: false | number;
74
+ private openFolderTimer: null | number;
75
+ private openNode: OpenNode;
76
+ private previousGhost: DropHint | null;
77
+ private refreshElements: RefreshElements;
78
+ private slide: boolean;
79
+ private treeElement: HTMLElement;
80
+ private triggerEvent: TriggerEvent;
81
+
82
+ constructor({
83
+ autoEscape,
84
+ classNames,
85
+ getNodeElement,
86
+ getNodeElementForNode,
87
+ getScrollLeft,
88
+ getTree,
89
+ onCanMove,
90
+ onCanMoveTo,
91
+ onDragMove,
92
+ onDragStop,
93
+ onIsMoveHandle,
94
+ openFolderDelay,
95
+ openNode,
96
+ refreshElements,
97
+ slide,
98
+ treeElement,
99
+ triggerEvent,
100
+ }: DragAndDropHandlerParams) {
101
+ this.autoEscape = autoEscape;
102
+ this.classNames = classNames;
103
+ this.getNodeElement = getNodeElement;
104
+ this.getNodeElementForNode = getNodeElementForNode;
105
+ this.getScrollLeft = getScrollLeft;
106
+ this.getTree = getTree;
107
+ this.onCanMove = onCanMove;
108
+ this.onCanMoveTo = onCanMoveTo;
109
+ this.onDragMove = onDragMove;
110
+ this.onDragStop = onDragStop;
111
+ this.onIsMoveHandle = onIsMoveHandle;
112
+ this.openFolderDelay = openFolderDelay;
113
+ this.openNode = openNode;
114
+ this.refreshElements = refreshElements;
115
+ this.slide = slide;
116
+ this.treeElement = treeElement;
117
+ this.triggerEvent = triggerEvent;
118
+
119
+ this.hoveredArea = null;
120
+ this.hitAreas = [];
121
+ this.isDragging = false;
122
+ this.currentItem = null;
123
+
124
+ this.dragElement = null;
125
+ this.openFolderTimer = null;
126
+ this.previousGhost = null;
127
+ }
128
+
129
+ public mouseCapture(positionInfo: PositionInfo): boolean | null {
130
+ const element = positionInfo.target;
131
+
132
+ if (!this.mustCaptureElement(element)) {
133
+ return null;
127
134
  }
128
135
 
129
- public mouseCapture(positionInfo: PositionInfo): boolean | null {
130
- const element = positionInfo.target;
131
-
132
- if (!this.mustCaptureElement(element)) {
133
- return null;
134
- }
135
-
136
- if (this.onIsMoveHandle && !this.onIsMoveHandle(element)) {
137
- return null;
138
- }
139
-
140
- let nodeElement = this.getNodeElement(element);
136
+ if (this.onIsMoveHandle && !this.onIsMoveHandle(element)) {
137
+ return null;
138
+ }
141
139
 
142
- if (nodeElement && this.onCanMove) {
143
- if (!this.onCanMove(nodeElement.node)) {
144
- nodeElement = null;
145
- }
146
- }
140
+ let nodeElement = this.getNodeElement(element);
147
141
 
148
- this.currentItem = nodeElement;
149
- return this.currentItem != null;
142
+ if (nodeElement && this.onCanMove) {
143
+ if (!this.onCanMove(nodeElement.node)) {
144
+ nodeElement = null;
145
+ }
150
146
  }
151
147
 
152
- public mouseDrag(positionInfo: PositionInfo): boolean {
153
- if (!this.currentItem || !this.dragElement) {
154
- return false;
155
- }
148
+ this.currentItem = nodeElement;
149
+ return this.currentItem != null;
150
+ }
156
151
 
157
- this.dragElement.move(positionInfo.pageX, positionInfo.pageY);
152
+ public mouseDrag(positionInfo: PositionInfo): boolean {
153
+ if (!this.currentItem || !this.dragElement) {
154
+ return false;
155
+ }
158
156
 
159
- const area = this.findHoveredArea(
160
- positionInfo.pageX,
161
- positionInfo.pageY,
162
- );
157
+ this.dragElement.move(positionInfo.pageX, positionInfo.pageY);
163
158
 
164
- if (area && this.canMoveToArea(area, this.currentItem)) {
165
- if (!area.node.isFolder()) {
166
- this.stopOpenFolderTimer();
167
- }
159
+ const area = this.findHoveredArea(positionInfo.pageX, positionInfo.pageY);
168
160
 
169
- if (this.hoveredArea !== area) {
170
- this.hoveredArea = area;
161
+ if (area && this.canMoveToArea(area, this.currentItem)) {
162
+ if (!area.node.isFolder()) {
163
+ this.stopOpenFolderTimer();
164
+ }
171
165
 
172
- // If this is a closed folder, start timer to open it
173
- if (this.mustOpenFolderTimer(area)) {
174
- this.startOpenFolderTimer(area.node);
175
- } else {
176
- this.stopOpenFolderTimer();
177
- }
166
+ if (this.hoveredArea !== area) {
167
+ this.hoveredArea = area;
178
168
 
179
- this.updateDropHint();
180
- }
169
+ // If this is a closed folder, start timer to open it
170
+ if (this.mustOpenFolderTimer(area)) {
171
+ this.startOpenFolderTimer(area.node);
181
172
  } else {
182
- this.removeDropHint();
183
- this.stopOpenFolderTimer();
184
- this.hoveredArea = area;
173
+ this.stopOpenFolderTimer();
185
174
  }
186
175
 
187
- if (!area) {
188
- if (this.onDragMove) {
189
- this.onDragMove(
190
- this.currentItem.node,
191
- positionInfo.originalEvent,
192
- );
193
- }
194
- }
176
+ this.updateDropHint();
177
+ }
178
+ } else {
179
+ this.removeDropHint();
180
+ this.stopOpenFolderTimer();
181
+ this.hoveredArea = area;
182
+ }
195
183
 
196
- return true;
184
+ if (!area) {
185
+ if (this.onDragMove) {
186
+ this.onDragMove(this.currentItem.node, positionInfo.originalEvent);
187
+ }
197
188
  }
198
189
 
199
- public mouseStart(positionInfo: PositionInfo): boolean {
200
- if (!this.currentItem) {
201
- return false;
202
- }
190
+ return true;
191
+ }
203
192
 
204
- this.refresh();
193
+ public mouseStart(positionInfo: PositionInfo): boolean {
194
+ if (!this.currentItem) {
195
+ return false;
196
+ }
205
197
 
206
- const { left, top } = getElementPosition(positionInfo.target);
198
+ this.refresh();
207
199
 
208
- const node = this.currentItem.node;
200
+ const { left, top } = getElementPosition(positionInfo.target);
209
201
 
210
- this.dragElement = new DragElement({
211
- autoEscape: this.autoEscape ?? true,
212
- classNames: this.classNames,
213
- nodeName: node.name,
214
- offsetX: positionInfo.pageX - left,
215
- offsetY: positionInfo.pageY - top,
216
- treeElement: this.treeElement,
217
- });
202
+ const node = this.currentItem.node;
218
203
 
219
- this.isDragging = true;
220
- this.currentItem.element.classList.add(this.classNames.moving);
204
+ this.dragElement = new DragElement({
205
+ autoEscape: this.autoEscape ?? true,
206
+ classNames: this.classNames,
207
+ nodeName: node.name,
208
+ offsetX: positionInfo.pageX - left,
209
+ offsetY: positionInfo.pageY - top,
210
+ treeElement: this.treeElement,
211
+ });
221
212
 
222
- return true;
223
- }
213
+ this.isDragging = true;
214
+ this.currentItem.element.classList.add(this.classNames.moving);
224
215
 
225
- public mouseStop(positionInfo: PositionInfo): boolean {
226
- this.moveItem(positionInfo);
227
- this.clear();
228
- this.removeHover();
229
- this.removeDropHint();
230
- this.removeHitAreas();
216
+ return true;
217
+ }
231
218
 
232
- const currentItem = this.currentItem;
219
+ public mouseStop(positionInfo: PositionInfo): boolean {
220
+ this.moveItem(positionInfo);
221
+ this.clear();
222
+ this.removeHover();
223
+ this.removeDropHint();
224
+ this.removeHitAreas();
233
225
 
234
- if (this.currentItem) {
235
- this.currentItem.element.classList.remove(this.classNames.moving);
236
- this.currentItem = null;
237
- }
226
+ const currentItem = this.currentItem;
238
227
 
239
- this.isDragging = false;
228
+ if (this.currentItem) {
229
+ this.currentItem.element.classList.remove(this.classNames.moving);
230
+ this.currentItem = null;
231
+ }
240
232
 
241
- if (!this.hoveredArea && currentItem) {
242
- if (this.onDragStop) {
243
- this.onDragStop(currentItem.node, positionInfo.originalEvent);
244
- }
245
- }
233
+ this.isDragging = false;
246
234
 
247
- return false;
235
+ if (!this.hoveredArea && currentItem) {
236
+ if (this.onDragStop) {
237
+ this.onDragStop(currentItem.node, positionInfo.originalEvent);
238
+ }
248
239
  }
249
240
 
250
- public refresh(): void {
251
- this.removeHitAreas();
252
-
253
- if (this.currentItem) {
254
- const currentNode = this.currentItem.node;
255
- this.generateHitAreas(currentNode);
256
- this.currentItem = this.getNodeElementForNode(currentNode);
241
+ return false;
242
+ }
257
243
 
258
- if (this.isDragging) {
259
- this.currentItem.element.classList.add(this.classNames.moving);
260
- }
261
- }
262
- }
244
+ public refresh(): void {
245
+ this.removeHitAreas();
263
246
 
264
- private canMoveToArea(area: HitArea, currentItem: NodeElement): boolean {
265
- if (!this.onCanMoveTo) {
266
- return true;
267
- }
247
+ if (this.currentItem) {
248
+ const currentNode = this.currentItem.node;
249
+ this.generateHitAreas(currentNode);
250
+ this.currentItem = this.getNodeElementForNode(currentNode);
268
251
 
269
- return this.onCanMoveTo(currentItem.node, area.node, area.position);
252
+ if (this.isDragging) {
253
+ this.currentItem.element.classList.add(this.classNames.moving);
254
+ }
270
255
  }
256
+ }
271
257
 
272
- private clear(): void {
273
- if (this.dragElement) {
274
- this.dragElement.remove();
275
- this.dragElement = null;
276
- }
258
+ private canMoveToArea(area: HitArea, currentItem: NodeElement): boolean {
259
+ if (!this.onCanMoveTo) {
260
+ return true;
277
261
  }
278
262
 
279
- private findHoveredArea(x: number, y: number): HitArea | null {
280
- const dimensions = this.getTreeDimensions();
281
-
282
- if (
283
- x < dimensions.left ||
284
- y < dimensions.top ||
285
- x > dimensions.right ||
286
- y > dimensions.bottom
287
- ) {
288
- return null;
289
- }
263
+ return this.onCanMoveTo(currentItem.node, area.node, area.position);
264
+ }
290
265
 
291
- return binarySearch<HitArea>(this.hitAreas, (area) => {
292
- if (y < area.top) {
293
- return 1;
294
- } else if (y > area.bottom) {
295
- return -1;
296
- } else {
297
- return 0;
298
- }
299
- });
266
+ private clear(): void {
267
+ if (this.dragElement) {
268
+ this.dragElement.remove();
269
+ this.dragElement = null;
300
270
  }
301
-
302
- private generateHitAreas(currentNode: Node): void {
303
- const tree = this.getTree();
304
-
305
- if (!tree) {
306
- this.hitAreas = [];
307
- } else {
308
- this.hitAreas = generateHitAreas(
309
- tree,
310
- currentNode,
311
- this.getTreeDimensions().bottom,
312
- );
313
- }
271
+ }
272
+
273
+ private findHoveredArea(x: number, y: number): HitArea | null {
274
+ const dimensions = this.getTreeDimensions();
275
+
276
+ if (
277
+ x < dimensions.left ||
278
+ y < dimensions.top ||
279
+ x > dimensions.right ||
280
+ y > dimensions.bottom
281
+ ) {
282
+ return null;
314
283
  }
315
284
 
316
- private getTreeDimensions(): Dimensions {
317
- // Return the dimensions of the tree. Add a margin to the bottom to allow
318
- // to drag-and-drop after the last element.
319
- const treePosition = getElementPosition(this.treeElement);
320
- const left = treePosition.left + this.getScrollLeft();
321
- const top = treePosition.top;
322
-
323
- return {
324
- bottom: top + this.treeElement.clientHeight + 16,
325
- left,
326
- right: left + this.treeElement.clientWidth,
327
- top,
328
- };
285
+ return binarySearch<HitArea>(this.hitAreas, (area) => {
286
+ if (y < area.top) {
287
+ return 1;
288
+ } else if (y > area.bottom) {
289
+ return -1;
290
+ } else {
291
+ return 0;
292
+ }
293
+ });
294
+ }
295
+
296
+ private generateHitAreas(currentNode: Node): void {
297
+ const tree = this.getTree();
298
+
299
+ if (!tree) {
300
+ this.hitAreas = [];
301
+ } else {
302
+ this.hitAreas = generateHitAreas(
303
+ tree,
304
+ currentNode,
305
+ this.getTreeDimensions().bottom,
306
+ );
329
307
  }
308
+ }
309
+
310
+ private getTreeDimensions(): Dimensions {
311
+ // Return the dimensions of the tree. Add a margin to the bottom to allow
312
+ // to drag-and-drop after the last element.
313
+ const treePosition = getElementPosition(this.treeElement);
314
+ const left = treePosition.left + this.getScrollLeft();
315
+ const top = treePosition.top;
316
+
317
+ return {
318
+ bottom: top + this.treeElement.clientHeight + 16,
319
+ left,
320
+ right: left + this.treeElement.clientWidth,
321
+ top,
322
+ };
323
+ }
324
+
325
+ /* Move the dragged node to the selected position in the tree. */
326
+ private moveItem(positionInfo: PositionInfo): void {
327
+ if (
328
+ this.currentItem &&
329
+ this.hoveredArea?.position &&
330
+ this.canMoveToArea(this.hoveredArea, this.currentItem)
331
+ ) {
332
+ const movedNode = this.currentItem.node;
333
+ const targetNode = this.hoveredArea.node;
334
+ const position = this.hoveredArea.position;
335
+ const previousParent = movedNode.parent;
336
+
337
+ if (position === "inside") {
338
+ this.hoveredArea.node.is_open = true;
339
+ }
340
+
341
+ const doMove = (): void => {
342
+ const tree = this.getTree();
343
+
344
+ if (tree) {
345
+ tree.moveNode(movedNode, targetNode, position);
330
346
 
331
- /* Move the dragged node to the selected position in the tree. */
332
- private moveItem(positionInfo: PositionInfo): void {
333
- if (
334
- this.currentItem &&
335
- this.hoveredArea?.position &&
336
- this.canMoveToArea(this.hoveredArea, this.currentItem)
337
- ) {
338
- const movedNode = this.currentItem.node;
339
- const targetNode = this.hoveredArea.node;
340
- const position = this.hoveredArea.position;
341
- const previousParent = movedNode.parent;
342
-
343
- if (position === "inside") {
344
- this.hoveredArea.node.is_open = true;
345
- }
346
-
347
- const doMove = (): void => {
348
- const tree = this.getTree();
349
-
350
- if (tree) {
351
- tree.moveNode(movedNode, targetNode, position);
352
-
353
- this.treeElement.textContent = "";
354
- this.refreshElements(null);
355
- }
356
- };
357
-
358
- if (this.triggerEvent("tree.move", {
359
- moveInfo: {
360
- doMove,
361
- movedNode,
362
- originalEvent: positionInfo.originalEvent,
363
- position,
364
- previousParent,
365
- targetNode,
366
- },
367
- })) {
368
- doMove();
369
- }
347
+ this.treeElement.textContent = "";
348
+ this.refreshElements(null);
370
349
  }
350
+ };
351
+
352
+ if (
353
+ this.triggerEvent("tree.move", {
354
+ moveInfo: {
355
+ doMove,
356
+ movedNode,
357
+ originalEvent: positionInfo.originalEvent,
358
+ position,
359
+ previousParent,
360
+ targetNode,
361
+ },
362
+ })
363
+ ) {
364
+ doMove();
365
+ }
371
366
  }
367
+ }
372
368
 
373
- private mustCaptureElement(element: HTMLElement): boolean {
374
- const nodeName = element.nodeName;
369
+ private mustCaptureElement(element: HTMLElement): boolean {
370
+ const nodeName = element.nodeName;
375
371
 
376
- return (
377
- nodeName !== "INPUT" &&
378
- nodeName !== "SELECT" &&
379
- nodeName !== "TEXTAREA"
380
- );
381
- }
372
+ return (
373
+ nodeName !== "INPUT" && nodeName !== "SELECT" && nodeName !== "TEXTAREA"
374
+ );
375
+ }
382
376
 
383
- private mustOpenFolderTimer(area: HitArea): boolean {
384
- const node = area.node;
377
+ private mustOpenFolderTimer(area: HitArea): boolean {
378
+ const node = area.node;
385
379
 
386
- return node.isFolder() && !node.is_open && area.position === "inside";
387
- }
380
+ return node.isFolder() && !node.is_open && area.position === "inside";
381
+ }
388
382
 
389
- private removeDropHint(): void {
390
- if (this.previousGhost) {
391
- this.previousGhost.remove();
392
- }
383
+ private removeDropHint(): void {
384
+ if (this.previousGhost) {
385
+ this.previousGhost.remove();
393
386
  }
387
+ }
394
388
 
395
- private removeHitAreas(): void {
396
- this.hitAreas = [];
397
- }
389
+ private removeHitAreas(): void {
390
+ this.hitAreas = [];
391
+ }
398
392
 
399
- private removeHover(): void {
400
- this.hoveredArea = null;
401
- }
393
+ private removeHover(): void {
394
+ this.hoveredArea = null;
395
+ }
402
396
 
403
- private startOpenFolderTimer(folder: Node): void {
404
- const openFolder = (): void => {
405
- void this.openNode(folder, this.slide).then(() => {
406
- this.refresh();
407
- this.updateDropHint();
408
- });
409
- };
397
+ private startOpenFolderTimer(folder: Node): void {
398
+ const openFolder = (): void => {
399
+ void this.openNode(folder, this.slide).then(() => {
400
+ this.refresh();
401
+ this.updateDropHint();
402
+ });
403
+ };
410
404
 
411
- this.stopOpenFolderTimer();
405
+ this.stopOpenFolderTimer();
412
406
 
413
- const openFolderDelay = this.openFolderDelay;
407
+ const openFolderDelay = this.openFolderDelay;
414
408
 
415
- if (openFolderDelay !== false) {
416
- this.openFolderTimer = window.setTimeout(
417
- openFolder,
418
- openFolderDelay,
419
- );
420
- }
409
+ if (openFolderDelay !== false) {
410
+ this.openFolderTimer = window.setTimeout(openFolder, openFolderDelay);
421
411
  }
412
+ }
422
413
 
423
- private stopOpenFolderTimer(): void {
424
- if (this.openFolderTimer) {
425
- clearTimeout(this.openFolderTimer);
426
- this.openFolderTimer = null;
427
- }
414
+ private stopOpenFolderTimer(): void {
415
+ if (this.openFolderTimer) {
416
+ clearTimeout(this.openFolderTimer);
417
+ this.openFolderTimer = null;
428
418
  }
419
+ }
429
420
 
430
- private updateDropHint(): void {
431
- if (!this.hoveredArea) {
432
- return;
433
- }
421
+ private updateDropHint(): void {
422
+ if (!this.hoveredArea) {
423
+ return;
424
+ }
434
425
 
435
- // remove previous drop hint
436
- this.removeDropHint();
426
+ // remove previous drop hint
427
+ this.removeDropHint();
437
428
 
438
- // add new drop hint
439
- const nodeElement = this.getNodeElementForNode(this.hoveredArea.node);
440
- this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);
441
- }
429
+ // add new drop hint
430
+ const nodeElement = this.getNodeElementForNode(this.hoveredArea.node);
431
+ this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);
432
+ }
442
433
  }