tree-element 0.1.1 → 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 +33 -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 +14 -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 +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.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 +5 -3
- package/src/animation.ts +1 -1
- package/src/classNames.ts +52 -52
- package/src/dataLoader.ts +68 -71
- 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 -216
- 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 +3752 -3784
- package/tree_element.debug.js.map +1 -1
- package/tree_element.js +2 -2
- package/tree_element.js.map +1 -1
package/src/nodeUtils.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { NodeData, NodeRecord } from "./node";
|
|
2
2
|
|
|
3
3
|
interface NodeRecordWithChildren extends NodeRecord {
|
|
4
|
-
|
|
4
|
+
children: NodeData[];
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
export const isNodeRecordWithChildren = (
|
|
8
|
-
|
|
8
|
+
data: NodeData,
|
|
9
9
|
): data is NodeRecordWithChildren =>
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
typeof data === "object" &&
|
|
11
|
+
"children" in data &&
|
|
12
|
+
data.children instanceof Array;
|
package/src/options.ts
CHANGED
|
@@ -17,9 +17,13 @@ export type OnCanMoveTo = (
|
|
|
17
17
|
positionName: string,
|
|
18
18
|
) => boolean;
|
|
19
19
|
|
|
20
|
-
export type OnCanSelectNode = (node: Node) => boolean
|
|
20
|
+
export type OnCanSelectNode = (node: Node) => boolean;
|
|
21
21
|
|
|
22
|
-
export type OnCreateLi = (
|
|
22
|
+
export type OnCreateLi = (
|
|
23
|
+
node: Node,
|
|
24
|
+
el: HTMLElement,
|
|
25
|
+
isSelected: boolean,
|
|
26
|
+
) => void;
|
|
23
27
|
|
|
24
28
|
export type OnGetStateFromStorage = (() => string) | undefined;
|
|
25
29
|
|
package/src/requestUrl.ts
CHANGED
|
@@ -7,7 +7,7 @@ const isAbsoluteUrl = (inputUrl: string) => {
|
|
|
7
7
|
} catch {
|
|
8
8
|
return false;
|
|
9
9
|
}
|
|
10
|
-
}
|
|
10
|
+
};
|
|
11
11
|
|
|
12
12
|
const LOCALHOST = "http://localhost";
|
|
13
13
|
|
|
@@ -29,7 +29,7 @@ class RequestUrl {
|
|
|
29
29
|
this.url.searchParams.set(key, value);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
value() {
|
|
33
33
|
if (this.isAbsolute) {
|
|
34
34
|
return this.url.href;
|
|
35
35
|
} else {
|
|
@@ -38,4 +38,4 @@ class RequestUrl {
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
export default RequestUrl;
|
|
41
|
+
export default RequestUrl;
|
package/src/saveStateHandler.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
AddToSelection,
|
|
3
|
+
GetNodeById,
|
|
4
|
+
GetSelectedNodes,
|
|
5
|
+
GetTree,
|
|
6
|
+
OpenNode,
|
|
7
|
+
RefreshElements,
|
|
8
|
+
RemoveFromSelection,
|
|
9
9
|
} from "./methodTypes";
|
|
10
10
|
import type { Node, NodeId } from "./node";
|
|
11
11
|
import type { OnGetStateFromStorage, OnSetStateFromStorage } from "./options";
|
|
@@ -13,267 +13,265 @@ import type { OnGetStateFromStorage, OnSetStateFromStorage } from "./options";
|
|
|
13
13
|
import { isInt } from "./util";
|
|
14
14
|
|
|
15
15
|
export interface SavedState {
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
open_nodes?: NodeId[];
|
|
17
|
+
selected_node?: NodeId[];
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
interface SaveStateHandlerParams {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
21
|
+
addToSelection: AddToSelection;
|
|
22
|
+
getNodeById: GetNodeById;
|
|
23
|
+
getSelectedNodes: GetSelectedNodes;
|
|
24
|
+
getTree: GetTree;
|
|
25
|
+
onGetStateFromStorage?: OnGetStateFromStorage;
|
|
26
|
+
onSetStateFromStorage?: OnSetStateFromStorage;
|
|
27
|
+
openNode: OpenNode;
|
|
28
|
+
refreshElements: RefreshElements;
|
|
29
|
+
removeFromSelection: RemoveFromSelection;
|
|
30
|
+
saveState: boolean | string;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export default class SaveStateHandler {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
34
|
+
private addToSelection: AddToSelection;
|
|
35
|
+
private getNodeById: GetNodeById;
|
|
36
|
+
private getSelectedNodes: GetSelectedNodes;
|
|
37
|
+
private getTree: GetTree;
|
|
38
|
+
private onGetStateFromStorage?: OnGetStateFromStorage;
|
|
39
|
+
private onSetStateFromStorage?: OnSetStateFromStorage;
|
|
40
|
+
private openNode: OpenNode;
|
|
41
|
+
private refreshElements: RefreshElements;
|
|
42
|
+
private removeFromSelection: RemoveFromSelection;
|
|
43
|
+
private saveStateOption: boolean | string;
|
|
44
|
+
|
|
45
|
+
constructor({
|
|
46
|
+
addToSelection,
|
|
47
|
+
getNodeById,
|
|
48
|
+
getSelectedNodes,
|
|
49
|
+
getTree,
|
|
50
|
+
onGetStateFromStorage,
|
|
51
|
+
onSetStateFromStorage,
|
|
52
|
+
openNode,
|
|
53
|
+
refreshElements,
|
|
54
|
+
removeFromSelection,
|
|
55
|
+
saveState,
|
|
56
|
+
}: SaveStateHandlerParams) {
|
|
57
|
+
this.addToSelection = addToSelection;
|
|
58
|
+
this.getNodeById = getNodeById;
|
|
59
|
+
this.getSelectedNodes = getSelectedNodes;
|
|
60
|
+
this.getTree = getTree;
|
|
61
|
+
this.onGetStateFromStorage = onGetStateFromStorage;
|
|
62
|
+
this.onSetStateFromStorage = onSetStateFromStorage;
|
|
63
|
+
this.openNode = openNode;
|
|
64
|
+
this.refreshElements = refreshElements;
|
|
65
|
+
this.removeFromSelection = removeFromSelection;
|
|
66
|
+
this.saveStateOption = saveState;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public getNodeIdToBeSelected(): NodeId | null {
|
|
70
|
+
if (!this.saveStateOption) {
|
|
71
|
+
return null;
|
|
67
72
|
}
|
|
68
73
|
|
|
69
|
-
|
|
70
|
-
if (!this.saveStateOption) {
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const state = this.getStateFromStorage();
|
|
74
|
+
const state = this.getStateFromStorage();
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
76
|
+
if (state?.selected_node) {
|
|
77
|
+
return state.selected_node[0] ?? null;
|
|
78
|
+
} else {
|
|
79
|
+
return null;
|
|
81
80
|
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
public getState(): SavedState {
|
|
84
|
+
const getOpenNodeIds = (): NodeId[] => {
|
|
85
|
+
const openNodes: NodeId[] = [];
|
|
82
86
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
87
|
+
this.getTree()?.iterate((node: Node) => {
|
|
88
|
+
if (node.is_open && node.id && node.hasChildren()) {
|
|
89
|
+
openNodes.push(node.id);
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
});
|
|
86
93
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
openNodes.push(node.id);
|
|
90
|
-
}
|
|
91
|
-
return true;
|
|
92
|
-
});
|
|
94
|
+
return openNodes;
|
|
95
|
+
};
|
|
93
96
|
|
|
94
|
-
|
|
95
|
-
|
|
97
|
+
const getSelectedNodeIds = (): NodeId[] => {
|
|
98
|
+
const selectedNodeIds: NodeId[] = [];
|
|
96
99
|
|
|
97
|
-
|
|
98
|
-
|
|
100
|
+
this.getSelectedNodes().forEach((node) => {
|
|
101
|
+
if (node.id != null) {
|
|
102
|
+
selectedNodeIds.push(node.id);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
99
105
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
selectedNodeIds.push(node.id);
|
|
103
|
-
}
|
|
104
|
-
});
|
|
106
|
+
return selectedNodeIds;
|
|
107
|
+
};
|
|
105
108
|
|
|
106
|
-
|
|
107
|
-
|
|
109
|
+
return {
|
|
110
|
+
open_nodes: getOpenNodeIds(),
|
|
111
|
+
selected_node: getSelectedNodeIds(),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
108
114
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
};
|
|
115
|
+
public getStateFromStorage(): null | SavedState {
|
|
116
|
+
if (!this.saveStateOption) {
|
|
117
|
+
return null;
|
|
113
118
|
}
|
|
114
119
|
|
|
115
|
-
|
|
116
|
-
if (!this.saveStateOption) {
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
120
|
+
const jsonData = this.loadFromStorage();
|
|
119
121
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
} else {
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
122
|
+
if (jsonData) {
|
|
123
|
+
return this.parseState(jsonData);
|
|
124
|
+
} else {
|
|
125
|
+
return null;
|
|
127
126
|
}
|
|
127
|
+
}
|
|
128
128
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
129
|
+
public saveState(): void {
|
|
130
|
+
if (!this.saveStateOption) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
133
|
|
|
134
|
-
|
|
134
|
+
const state = JSON.stringify(this.getState());
|
|
135
135
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
136
|
+
if (this.onSetStateFromStorage) {
|
|
137
|
+
this.onSetStateFromStorage(state);
|
|
138
|
+
} else {
|
|
139
|
+
localStorage.setItem(this.getKeyName(), state);
|
|
141
140
|
}
|
|
141
|
+
}
|
|
142
142
|
|
|
143
|
-
|
|
143
|
+
/*
|
|
144
144
|
Set initial state
|
|
145
145
|
Don't handle nodes that are loaded on demand
|
|
146
146
|
|
|
147
147
|
result: must load on demand (boolean)
|
|
148
148
|
*/
|
|
149
|
-
|
|
150
|
-
|
|
149
|
+
public setInitialState(state: SavedState): boolean {
|
|
150
|
+
let mustLoadOnDemand = false;
|
|
151
151
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
this.resetSelection();
|
|
152
|
+
if (state.open_nodes) {
|
|
153
|
+
mustLoadOnDemand = this.openInitialNodes(state.open_nodes);
|
|
154
|
+
}
|
|
157
155
|
|
|
158
|
-
|
|
159
|
-
this.selectInitialNodes(state.selected_node);
|
|
160
|
-
}
|
|
156
|
+
this.resetSelection();
|
|
161
157
|
|
|
162
|
-
|
|
158
|
+
if (state.selected_node) {
|
|
159
|
+
this.selectInitialNodes(state.selected_node);
|
|
163
160
|
}
|
|
164
161
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
): Promise<void> {
|
|
168
|
-
let nodeIds = state.open_nodes;
|
|
162
|
+
return mustLoadOnDemand;
|
|
163
|
+
}
|
|
169
164
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
165
|
+
public async setInitialStateOnDemand(state: SavedState): Promise<void> {
|
|
166
|
+
let nodeIds = state.open_nodes;
|
|
174
167
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
if (!node) {
|
|
181
|
-
newNodesIds.push(nodeId);
|
|
182
|
-
} else {
|
|
183
|
-
if (!node.is_loading) {
|
|
184
|
-
if (node.load_on_demand) {
|
|
185
|
-
await loadAndOpenNode(node);
|
|
186
|
-
} else {
|
|
187
|
-
await this.openNode(node, false);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
168
|
+
const openNodes = async () => {
|
|
169
|
+
if (!nodeIds) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
192
172
|
|
|
193
|
-
|
|
173
|
+
const newNodesIds = [];
|
|
194
174
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
this.refreshElements(null);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
};
|
|
175
|
+
for (const nodeId of nodeIds) {
|
|
176
|
+
const node = this.getNodeById(nodeId);
|
|
201
177
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
178
|
+
if (!node) {
|
|
179
|
+
newNodesIds.push(nodeId);
|
|
180
|
+
} else {
|
|
181
|
+
if (!node.is_loading) {
|
|
182
|
+
if (node.load_on_demand) {
|
|
183
|
+
await loadAndOpenNode(node);
|
|
184
|
+
} else {
|
|
185
|
+
await this.openNode(node, false);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
206
190
|
|
|
207
|
-
|
|
208
|
-
}
|
|
191
|
+
nodeIds = newNodesIds;
|
|
209
192
|
|
|
210
|
-
|
|
211
|
-
if (
|
|
212
|
-
|
|
213
|
-
} else {
|
|
214
|
-
return "tree";
|
|
193
|
+
if (state.selected_node) {
|
|
194
|
+
if (this.selectInitialNodes(state.selected_node)) {
|
|
195
|
+
this.refreshElements(null);
|
|
215
196
|
}
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
const loadAndOpenNode = async (node: Node) => {
|
|
201
|
+
await this.openNode(node, false);
|
|
202
|
+
await openNodes();
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
await openNodes();
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
private getKeyName(): string {
|
|
209
|
+
if (typeof this.saveStateOption === "string") {
|
|
210
|
+
return this.saveStateOption;
|
|
211
|
+
} else {
|
|
212
|
+
return "tree";
|
|
216
213
|
}
|
|
214
|
+
}
|
|
217
215
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
}
|
|
216
|
+
private loadFromStorage(): null | string {
|
|
217
|
+
if (this.onGetStateFromStorage) {
|
|
218
|
+
return this.onGetStateFromStorage();
|
|
219
|
+
} else {
|
|
220
|
+
return localStorage.getItem(this.getKeyName());
|
|
224
221
|
}
|
|
222
|
+
}
|
|
225
223
|
|
|
226
|
-
|
|
227
|
-
|
|
224
|
+
private openInitialNodes(nodeIds: NodeId[]): boolean {
|
|
225
|
+
let mustLoadOnDemand = false;
|
|
228
226
|
|
|
229
|
-
|
|
230
|
-
|
|
227
|
+
for (const nodeId of nodeIds) {
|
|
228
|
+
const node = this.getNodeById(nodeId);
|
|
231
229
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
}
|
|
238
|
-
}
|
|
230
|
+
if (node) {
|
|
231
|
+
if (!node.load_on_demand) {
|
|
232
|
+
node.is_open = true;
|
|
233
|
+
} else {
|
|
234
|
+
mustLoadOnDemand = true;
|
|
239
235
|
}
|
|
240
|
-
|
|
241
|
-
return mustLoadOnDemand;
|
|
236
|
+
}
|
|
242
237
|
}
|
|
243
238
|
|
|
244
|
-
|
|
245
|
-
|
|
239
|
+
return mustLoadOnDemand;
|
|
240
|
+
}
|
|
246
241
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
// Convert to array
|
|
250
|
-
state.selected_node = [state.selected_node];
|
|
251
|
-
}
|
|
242
|
+
private parseState(jsonData: string): SavedState {
|
|
243
|
+
const state = JSON.parse(jsonData) as Record<string, unknown>;
|
|
252
244
|
|
|
253
|
-
|
|
245
|
+
// Check if selected_node is an int (instead of an array)
|
|
246
|
+
if (state.selected_node && isInt(state.selected_node)) {
|
|
247
|
+
// Convert to array
|
|
248
|
+
state.selected_node = [state.selected_node];
|
|
254
249
|
}
|
|
255
250
|
|
|
256
|
-
|
|
257
|
-
|
|
251
|
+
return state;
|
|
252
|
+
}
|
|
258
253
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
});
|
|
262
|
-
}
|
|
254
|
+
private resetSelection(): void {
|
|
255
|
+
const selectedNodes = this.getSelectedNodes();
|
|
263
256
|
|
|
264
|
-
|
|
265
|
-
|
|
257
|
+
selectedNodes.forEach((node) => {
|
|
258
|
+
this.removeFromSelection(node);
|
|
259
|
+
});
|
|
260
|
+
}
|
|
266
261
|
|
|
267
|
-
|
|
268
|
-
|
|
262
|
+
private selectInitialNodes(nodeIds: NodeId[]): boolean {
|
|
263
|
+
let selectCount = 0;
|
|
269
264
|
|
|
270
|
-
|
|
271
|
-
|
|
265
|
+
for (const nodeId of nodeIds) {
|
|
266
|
+
const node = this.getNodeById(nodeId);
|
|
272
267
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
}
|
|
268
|
+
if (node) {
|
|
269
|
+
selectCount += 1;
|
|
276
270
|
|
|
277
|
-
|
|
271
|
+
this.addToSelection(node);
|
|
272
|
+
}
|
|
278
273
|
}
|
|
274
|
+
|
|
275
|
+
return selectCount !== 0;
|
|
276
|
+
}
|
|
279
277
|
}
|
|
@@ -1,71 +1,68 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
HorizontalScrollDirection,
|
|
3
|
+
VerticalScrollDirection,
|
|
4
4
|
} from "./scrollParent";
|
|
5
5
|
|
|
6
6
|
import { getElementPosition, getOffsetTop } from "../positionUtils";
|
|
7
7
|
import { ScrollParent } from "./scrollParent";
|
|
8
8
|
|
|
9
|
-
|
|
10
9
|
export default class ContainerScrollParent extends ScrollParent {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
10
|
+
private scrollParentBottom?: number;
|
|
11
|
+
private scrollParentTop?: number;
|
|
12
|
+
|
|
13
|
+
public stopScrolling() {
|
|
14
|
+
super.stopScrolling();
|
|
15
|
+
|
|
16
|
+
this.horizontalScrollDirection = undefined;
|
|
17
|
+
this.verticalScrollDirection = undefined;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
protected getNewHorizontalScrollDirection(
|
|
21
|
+
pageX: number,
|
|
22
|
+
): HorizontalScrollDirection | undefined {
|
|
23
|
+
const scrollParentOffset = getElementPosition(this.container);
|
|
24
|
+
const containerWidth = this.container.getBoundingClientRect().width;
|
|
25
|
+
|
|
26
|
+
const rightEdge = scrollParentOffset.left + containerWidth;
|
|
27
|
+
const leftEdge = scrollParentOffset.left;
|
|
28
|
+
const isNearRightEdge = pageX > rightEdge - 20;
|
|
29
|
+
const isNearLeftEdge = pageX < leftEdge + 20;
|
|
30
|
+
|
|
31
|
+
if (isNearRightEdge) {
|
|
32
|
+
return "right";
|
|
33
|
+
} else if (isNearLeftEdge) {
|
|
34
|
+
return "left";
|
|
19
35
|
}
|
|
20
36
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
): HorizontalScrollDirection | undefined {
|
|
24
|
-
const scrollParentOffset = getElementPosition(this.container);
|
|
25
|
-
const containerWidth = this.container.getBoundingClientRect().width;
|
|
26
|
-
|
|
27
|
-
const rightEdge = scrollParentOffset.left + containerWidth;
|
|
28
|
-
const leftEdge = scrollParentOffset.left;
|
|
29
|
-
const isNearRightEdge = pageX > rightEdge - 20;
|
|
30
|
-
const isNearLeftEdge = pageX < leftEdge + 20;
|
|
31
|
-
|
|
32
|
-
if (isNearRightEdge) {
|
|
33
|
-
return "right";
|
|
34
|
-
} else if (isNearLeftEdge) {
|
|
35
|
-
return "left";
|
|
36
|
-
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
37
39
|
|
|
38
|
-
|
|
40
|
+
protected getNewVerticalScrollDirection(
|
|
41
|
+
pageY: number,
|
|
42
|
+
): undefined | VerticalScrollDirection {
|
|
43
|
+
if (pageY < this.getScrollParentTop()) {
|
|
44
|
+
return "top";
|
|
39
45
|
}
|
|
40
46
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
): undefined | VerticalScrollDirection {
|
|
44
|
-
if (pageY < this.getScrollParentTop()) {
|
|
45
|
-
return "top";
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (pageY > this.getScrollParentBottom()) {
|
|
49
|
-
return "bottom";
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return undefined;
|
|
47
|
+
if (pageY > this.getScrollParentBottom()) {
|
|
48
|
+
return "bottom";
|
|
53
49
|
}
|
|
54
50
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const containerHeight =
|
|
58
|
-
this.container.getBoundingClientRect().height;
|
|
59
|
-
this.scrollParentBottom =
|
|
60
|
-
this.getScrollParentTop() + containerHeight;
|
|
61
|
-
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
62
53
|
|
|
63
|
-
|
|
54
|
+
private getScrollParentBottom() {
|
|
55
|
+
if (this.scrollParentBottom == null) {
|
|
56
|
+
const containerHeight = this.container.getBoundingClientRect().height;
|
|
57
|
+
this.scrollParentBottom = this.getScrollParentTop() + containerHeight;
|
|
64
58
|
}
|
|
65
59
|
|
|
66
|
-
|
|
67
|
-
|
|
60
|
+
return this.scrollParentBottom;
|
|
61
|
+
}
|
|
68
62
|
|
|
69
|
-
|
|
70
|
-
|
|
63
|
+
private getScrollParentTop() {
|
|
64
|
+
this.scrollParentTop ??= getOffsetTop(this.container);
|
|
65
|
+
|
|
66
|
+
return this.scrollParentTop;
|
|
67
|
+
}
|
|
71
68
|
}
|