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