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.
- package/README.md +49 -29
- package/lib/animation.js +5 -5
- package/lib/animation.js.map +1 -1
- package/lib/classNames.d.ts.map +1 -1
- package/lib/classNames.js +2 -2
- package/lib/classNames.js.map +1 -1
- package/lib/dataLoader.d.ts.map +1 -1
- package/lib/dataLoader.js +18 -21
- package/lib/dataLoader.js.map +1 -1
- package/lib/dragAndDropHandler/binarySearch.js +3 -3
- package/lib/dragAndDropHandler/binarySearch.js.map +1 -1
- package/lib/dragAndDropHandler/dragElement.d.ts.map +1 -1
- package/lib/dragAndDropHandler/dragElement.js +9 -12
- package/lib/dragAndDropHandler/dragElement.js.map +1 -1
- package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -1
- package/lib/dragAndDropHandler/generateHitAreas.js +25 -25
- package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -1
- package/lib/dragAndDropHandler/index.d.ts.map +1 -1
- package/lib/dragAndDropHandler/index.js +90 -114
- package/lib/dragAndDropHandler/index.js.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.d.ts.map +1 -1
- package/lib/dragAndDropHandler/iterateVisibleNodes.js +10 -10
- package/lib/dragAndDropHandler/iterateVisibleNodes.js.map +1 -1
- package/lib/dragAndDropHandler/types.d.ts.map +1 -1
- package/lib/elementsRenderer.d.ts +15 -6
- package/lib/elementsRenderer.d.ts.map +1 -1
- package/lib/elementsRenderer.js +157 -121
- package/lib/elementsRenderer.js.map +1 -1
- package/lib/events.d.ts +11 -4
- package/lib/events.d.ts.map +1 -1
- package/lib/index.d.ts +5 -5
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +249 -252
- package/lib/index.js.map +1 -1
- package/lib/keyHandler.d.ts +2 -3
- package/lib/keyHandler.d.ts.map +1 -1
- package/lib/keyHandler.js +26 -25
- package/lib/keyHandler.js.map +1 -1
- package/lib/methodTypes.d.ts +1 -1
- package/lib/methodTypes.d.ts.map +1 -1
- package/lib/mouseHandler.d.ts.map +1 -1
- package/lib/mouseHandler.js +26 -42
- package/lib/mouseHandler.js.map +1 -1
- package/lib/mouseUtils.d.ts.map +1 -1
- package/lib/mouseUtils.js +2 -2
- package/lib/mouseUtils.js.map +1 -1
- package/lib/node.d.ts +2 -1
- package/lib/node.d.ts.map +1 -1
- package/lib/node.js +36 -35
- package/lib/node.js.map +1 -1
- package/lib/nodeElement/borderDropHint.d.ts.map +1 -1
- package/lib/nodeElement/borderDropHint.js +4 -5
- package/lib/nodeElement/borderDropHint.js.map +1 -1
- package/lib/nodeElement/folderElement.d.ts +7 -4
- package/lib/nodeElement/folderElement.d.ts.map +1 -1
- package/lib/nodeElement/folderElement.js +61 -42
- package/lib/nodeElement/folderElement.js.map +1 -1
- package/lib/nodeElement/ghostDropHint.d.ts.map +1 -1
- package/lib/nodeElement/ghostDropHint.js +5 -9
- package/lib/nodeElement/ghostDropHint.js.map +1 -1
- package/lib/nodeElement/index.d.ts +2 -1
- package/lib/nodeElement/index.d.ts.map +1 -1
- package/lib/nodeElement/index.js +34 -26
- 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.map +1 -1
- package/lib/positionUtils.js +3 -3
- package/lib/positionUtils.js.map +1 -1
- package/lib/requestUrl.d.ts +1 -1
- package/lib/requestUrl.d.ts.map +1 -1
- package/lib/requestUrl.js +4 -6
- package/lib/requestUrl.js.map +1 -1
- package/lib/saveStateHandler.d.ts.map +1 -1
- package/lib/saveStateHandler.js +38 -48
- package/lib/saveStateHandler.js.map +1 -1
- package/lib/scrollHandler/containerScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/containerScrollParent.js +9 -11
- package/lib/scrollHandler/containerScrollParent.js.map +1 -1
- package/lib/scrollHandler/createScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/createScrollParent.js +10 -10
- package/lib/scrollHandler/createScrollParent.js.map +1 -1
- package/lib/scrollHandler/documentScrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/documentScrollParent.js +16 -19
- package/lib/scrollHandler/documentScrollParent.js.map +1 -1
- package/lib/scrollHandler/scrollParent.d.ts.map +1 -1
- package/lib/scrollHandler/scrollParent.js +11 -17
- package/lib/scrollHandler/scrollParent.js.map +1 -1
- package/lib/scrollHandler.d.ts.map +1 -1
- package/lib/scrollHandler.js +11 -14
- package/lib/scrollHandler.js.map +1 -1
- package/lib/selectNodeHandler.d.ts +2 -2
- package/lib/selectNodeHandler.d.ts.map +1 -1
- package/lib/selectNodeHandler.js +45 -54
- package/lib/selectNodeHandler.js.map +1 -1
- package/lib/setDefaultOptions.d.ts.map +1 -1
- package/lib/setDefaultOptions.js +23 -28
- package/lib/setDefaultOptions.js.map +1 -1
- package/lib/triggerCustomEvent.d.ts.map +1 -1
- package/lib/triggerCustomEvent.js +2 -2
- package/lib/triggerCustomEvent.js.map +1 -1
- package/lib/util.d.ts.map +1 -1
- package/lib/util.js +2 -2
- 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 +7 -3
- package/src/animation.ts +1 -1
- package/src/classNames.ts +52 -52
- package/src/dataLoader.ts +68 -70
- package/src/dragAndDropHandler/binarySearch.ts +17 -17
- package/src/dragAndDropHandler/dragElement.ts +50 -50
- package/src/dragAndDropHandler/generateHitAreas.ts +156 -161
- package/src/dragAndDropHandler/index.ts +342 -351
- package/src/dragAndDropHandler/iterateVisibleNodes.ts +59 -63
- package/src/dragAndDropHandler/types.ts +5 -5
- package/src/elementsRenderer.ts +351 -298
- package/src/events.ts +216 -209
- package/src/header.txt +1 -1
- package/src/index.ts +52 -82
- package/src/keyHandler.ts +125 -115
- package/src/methodTypes.ts +4 -7
- package/src/mouseHandler.ts +314 -317
- package/src/mouseUtils.ts +14 -14
- package/src/node.ts +761 -766
- package/src/nodeElement/borderDropHint.ts +25 -25
- package/src/nodeElement/folderElement.ts +135 -112
- package/src/nodeElement/ghostDropHint.ts +62 -62
- package/src/nodeElement/index.ts +88 -74
- package/src/nodeUtils.ts +5 -5
- package/src/options.ts +6 -2
- package/src/requestUrl.ts +3 -3
- package/src/saveStateHandler.ts +204 -206
- package/src/scrollHandler/containerScrollParent.ts +49 -52
- package/src/scrollHandler/createScrollParent.ts +27 -27
- package/src/scrollHandler/documentScrollParent.ts +70 -70
- package/src/scrollHandler/scrollParent.ts +98 -98
- package/src/scrollHandler.ts +45 -45
- package/src/selectNodeHandler.ts +176 -166
- package/src/setDefaultOptions.ts +25 -22
- package/src/triggerCustomEvent.ts +7 -3
- package/src/util.ts +2 -2
- package/src/version.ts +1 -1
- package/tree_element.debug.js +3770 -3799
- package/tree_element.debug.js.map +1 -1
- package/tree_element.js +2 -2
- package/tree_element.js.map +1 -1
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import type { ClassNames } from "../classNames";
|
|
2
2
|
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
bottom: number;
|
|
27
|
+
left: number;
|
|
28
|
+
right: number;
|
|
29
|
+
top: number;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
interface DragAndDropHandlerParams {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
130
|
-
|
|
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
|
-
|
|
143
|
-
if (!this.onCanMove(nodeElement.node)) {
|
|
144
|
-
nodeElement = null;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
140
|
+
let nodeElement = this.getNodeElement(element);
|
|
147
141
|
|
|
148
|
-
|
|
149
|
-
|
|
142
|
+
if (nodeElement && this.onCanMove) {
|
|
143
|
+
if (!this.onCanMove(nodeElement.node)) {
|
|
144
|
+
nodeElement = null;
|
|
145
|
+
}
|
|
150
146
|
}
|
|
151
147
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
}
|
|
148
|
+
this.currentItem = nodeElement;
|
|
149
|
+
return this.currentItem != null;
|
|
150
|
+
}
|
|
156
151
|
|
|
157
|
-
|
|
152
|
+
public mouseDrag(positionInfo: PositionInfo): boolean {
|
|
153
|
+
if (!this.currentItem || !this.dragElement) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
158
156
|
|
|
159
|
-
|
|
160
|
-
positionInfo.pageX,
|
|
161
|
-
positionInfo.pageY,
|
|
162
|
-
);
|
|
157
|
+
this.dragElement.move(positionInfo.pageX, positionInfo.pageY);
|
|
163
158
|
|
|
164
|
-
|
|
165
|
-
if (!area.node.isFolder()) {
|
|
166
|
-
this.stopOpenFolderTimer();
|
|
167
|
-
}
|
|
159
|
+
const area = this.findHoveredArea(positionInfo.pageX, positionInfo.pageY);
|
|
168
160
|
|
|
169
|
-
|
|
170
|
-
|
|
161
|
+
if (area && this.canMoveToArea(area, this.currentItem)) {
|
|
162
|
+
if (!area.node.isFolder()) {
|
|
163
|
+
this.stopOpenFolderTimer();
|
|
164
|
+
}
|
|
171
165
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
this.startOpenFolderTimer(area.node);
|
|
175
|
-
} else {
|
|
176
|
-
this.stopOpenFolderTimer();
|
|
177
|
-
}
|
|
166
|
+
if (this.hoveredArea !== area) {
|
|
167
|
+
this.hoveredArea = area;
|
|
178
168
|
|
|
179
|
-
|
|
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
|
-
|
|
183
|
-
this.stopOpenFolderTimer();
|
|
184
|
-
this.hoveredArea = area;
|
|
173
|
+
this.stopOpenFolderTimer();
|
|
185
174
|
}
|
|
186
175
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}
|
|
176
|
+
this.updateDropHint();
|
|
177
|
+
}
|
|
178
|
+
} else {
|
|
179
|
+
this.removeDropHint();
|
|
180
|
+
this.stopOpenFolderTimer();
|
|
181
|
+
this.hoveredArea = area;
|
|
182
|
+
}
|
|
195
183
|
|
|
196
|
-
|
|
184
|
+
if (!area) {
|
|
185
|
+
if (this.onDragMove) {
|
|
186
|
+
this.onDragMove(this.currentItem.node, positionInfo.originalEvent);
|
|
187
|
+
}
|
|
197
188
|
}
|
|
198
189
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
return false;
|
|
202
|
-
}
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
203
192
|
|
|
204
|
-
|
|
193
|
+
public mouseStart(positionInfo: PositionInfo): boolean {
|
|
194
|
+
if (!this.currentItem) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
205
197
|
|
|
206
|
-
|
|
198
|
+
this.refresh();
|
|
207
199
|
|
|
208
|
-
|
|
200
|
+
const { left, top } = getElementPosition(positionInfo.target);
|
|
209
201
|
|
|
210
|
-
|
|
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
|
-
|
|
220
|
-
|
|
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
|
-
|
|
223
|
-
|
|
213
|
+
this.isDragging = true;
|
|
214
|
+
this.currentItem.element.classList.add(this.classNames.moving);
|
|
224
215
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
this.clear();
|
|
228
|
-
this.removeHover();
|
|
229
|
-
this.removeDropHint();
|
|
230
|
-
this.removeHitAreas();
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
231
218
|
|
|
232
|
-
|
|
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
|
-
|
|
235
|
-
this.currentItem.element.classList.remove(this.classNames.moving);
|
|
236
|
-
this.currentItem = null;
|
|
237
|
-
}
|
|
226
|
+
const currentItem = this.currentItem;
|
|
238
227
|
|
|
239
|
-
|
|
228
|
+
if (this.currentItem) {
|
|
229
|
+
this.currentItem.element.classList.remove(this.classNames.moving);
|
|
230
|
+
this.currentItem = null;
|
|
231
|
+
}
|
|
240
232
|
|
|
241
|
-
|
|
242
|
-
if (this.onDragStop) {
|
|
243
|
-
this.onDragStop(currentItem.node, positionInfo.originalEvent);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
233
|
+
this.isDragging = false;
|
|
246
234
|
|
|
247
|
-
|
|
235
|
+
if (!this.hoveredArea && currentItem) {
|
|
236
|
+
if (this.onDragStop) {
|
|
237
|
+
this.onDragStop(currentItem.node, positionInfo.originalEvent);
|
|
238
|
+
}
|
|
248
239
|
}
|
|
249
240
|
|
|
250
|
-
|
|
251
|
-
|
|
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
|
-
|
|
259
|
-
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
244
|
+
public refresh(): void {
|
|
245
|
+
this.removeHitAreas();
|
|
263
246
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
247
|
+
if (this.currentItem) {
|
|
248
|
+
const currentNode = this.currentItem.node;
|
|
249
|
+
this.generateHitAreas(currentNode);
|
|
250
|
+
this.currentItem = this.getNodeElementForNode(currentNode);
|
|
268
251
|
|
|
269
|
-
|
|
252
|
+
if (this.isDragging) {
|
|
253
|
+
this.currentItem.element.classList.add(this.classNames.moving);
|
|
254
|
+
}
|
|
270
255
|
}
|
|
256
|
+
}
|
|
271
257
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
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
|
-
|
|
280
|
-
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
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
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
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
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
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
|
-
|
|
332
|
-
|
|
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
|
-
|
|
374
|
-
|
|
369
|
+
private mustCaptureElement(element: HTMLElement): boolean {
|
|
370
|
+
const nodeName = element.nodeName;
|
|
375
371
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
);
|
|
381
|
-
}
|
|
372
|
+
return (
|
|
373
|
+
nodeName !== "INPUT" && nodeName !== "SELECT" && nodeName !== "TEXTAREA"
|
|
374
|
+
);
|
|
375
|
+
}
|
|
382
376
|
|
|
383
|
-
|
|
384
|
-
|
|
377
|
+
private mustOpenFolderTimer(area: HitArea): boolean {
|
|
378
|
+
const node = area.node;
|
|
385
379
|
|
|
386
|
-
|
|
387
|
-
|
|
380
|
+
return node.isFolder() && !node.is_open && area.position === "inside";
|
|
381
|
+
}
|
|
388
382
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
}
|
|
383
|
+
private removeDropHint(): void {
|
|
384
|
+
if (this.previousGhost) {
|
|
385
|
+
this.previousGhost.remove();
|
|
393
386
|
}
|
|
387
|
+
}
|
|
394
388
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
389
|
+
private removeHitAreas(): void {
|
|
390
|
+
this.hitAreas = [];
|
|
391
|
+
}
|
|
398
392
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
393
|
+
private removeHover(): void {
|
|
394
|
+
this.hoveredArea = null;
|
|
395
|
+
}
|
|
402
396
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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
|
-
|
|
405
|
+
this.stopOpenFolderTimer();
|
|
412
406
|
|
|
413
|
-
|
|
407
|
+
const openFolderDelay = this.openFolderDelay;
|
|
414
408
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
openFolder,
|
|
418
|
-
openFolderDelay,
|
|
419
|
-
);
|
|
420
|
-
}
|
|
409
|
+
if (openFolderDelay !== false) {
|
|
410
|
+
this.openFolderTimer = window.setTimeout(openFolder, openFolderDelay);
|
|
421
411
|
}
|
|
412
|
+
}
|
|
422
413
|
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
}
|
|
414
|
+
private stopOpenFolderTimer(): void {
|
|
415
|
+
if (this.openFolderTimer) {
|
|
416
|
+
clearTimeout(this.openFolderTimer);
|
|
417
|
+
this.openFolderTimer = null;
|
|
428
418
|
}
|
|
419
|
+
}
|
|
429
420
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
421
|
+
private updateDropHint(): void {
|
|
422
|
+
if (!this.hoveredArea) {
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
434
425
|
|
|
435
|
-
|
|
436
|
-
|
|
426
|
+
// remove previous drop hint
|
|
427
|
+
this.removeDropHint();
|
|
437
428
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
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
|
}
|