@headless-tree/core 0.0.8 → 0.0.9
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/CHANGELOG.md +6 -0
- package/lib/cjs/core/create-tree.js +4 -2
- package/lib/cjs/features/drag-and-drop/types.js +1 -1
- package/lib/cjs/features/search/feature.js +1 -1
- package/lib/cjs/mddocs-entry.d.ts +85 -5
- package/lib/esm/core/create-tree.js +4 -2
- package/lib/esm/features/drag-and-drop/utils.js +1 -1
- package/lib/esm/features/search/feature.js +1 -1
- package/lib/esm/mddocs-entry.d.ts +85 -5
- package/package.json +2 -2
- package/src/core/create-tree.ts +18 -17
- package/src/features/async-data-loader/feature.ts +3 -3
- package/src/features/async-data-loader/types.ts +1 -1
- package/src/features/drag-and-drop/types.ts +2 -2
- package/src/features/drag-and-drop/utils.ts +6 -11
- package/src/features/expand-all/feature.ts +3 -3
- package/src/features/hotkeys-core/feature.ts +5 -5
- package/src/features/hotkeys-core/types.ts +1 -1
- package/src/features/main/types.ts +1 -1
- package/src/features/search/feature.ts +5 -5
- package/src/features/selection/feature.ts +2 -2
- package/src/features/tree/feature.ts +3 -3
- package/src/features/tree/types.ts +1 -1
- package/src/mddocs-entry.ts +119 -5
- package/src/types/core.ts +12 -11
- package/src/types/deep-merge.ts +4 -4
- package/src/utilities/create-on-drop-handler.ts +1 -1
- package/src/utilities/insert-items-at-target.ts +1 -1
- package/src/utilities/remove-items-from-parents.ts +2 -2
- package/src/utils.ts +2 -2
- package/typedoc.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,7 +6,10 @@ const buildItemInstance = (features, tree, itemId) => {
|
|
|
6
6
|
var _a, _b;
|
|
7
7
|
const itemInstance = {};
|
|
8
8
|
for (const feature of features) {
|
|
9
|
-
Object.assign(
|
|
9
|
+
Object.assign(
|
|
10
|
+
// TODO dont run createItemInstance, but assign prototype objects instead?
|
|
11
|
+
// https://jsfiddle.net/bgenc58r/
|
|
12
|
+
itemInstance, (_b = (_a = feature.createItemInstance) === null || _a === void 0 ? void 0 : _a.call(feature, Object.assign({}, itemInstance), itemInstance, tree, itemId)) !== null && _b !== void 0 ? _b : {});
|
|
10
13
|
}
|
|
11
14
|
return itemInstance;
|
|
12
15
|
};
|
|
@@ -72,7 +75,6 @@ const createTree = (initialConfig) => {
|
|
|
72
75
|
itemInstances.push(itemInstancesMap[item.itemId]);
|
|
73
76
|
}
|
|
74
77
|
}
|
|
75
|
-
console.log("REBUILT");
|
|
76
78
|
};
|
|
77
79
|
const eachFeature = (fn) => {
|
|
78
80
|
for (const feature of additionalFeatures) {
|
|
@@ -6,4 +6,4 @@ var DropTargetPosition;
|
|
|
6
6
|
DropTargetPosition["Top"] = "top";
|
|
7
7
|
DropTargetPosition["Bottom"] = "bottom";
|
|
8
8
|
DropTargetPosition["Item"] = "item";
|
|
9
|
-
})(DropTargetPosition
|
|
9
|
+
})(DropTargetPosition || (exports.DropTargetPosition = DropTargetPosition = {}));
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
import { MainFeatureDef } from "./features/main/types";
|
|
2
2
|
import { DragAndDropFeatureDef } from "./features/drag-and-drop/types";
|
|
3
|
+
import { AsyncDataLoaderFeatureDef } from "./features/async-data-loader/types";
|
|
4
|
+
import { ExpandAllFeatureDef } from "./features/expand-all/types";
|
|
5
|
+
import { HotkeysCoreFeatureDef } from "./features/hotkeys-core/types";
|
|
6
|
+
import { RenamingFeatureDef } from "./features/renaming/types";
|
|
7
|
+
import { SearchFeatureDef } from "./features/search/types";
|
|
8
|
+
import { SelectionFeatureDef } from "./features/selection/types";
|
|
9
|
+
import { SyncDataLoaderFeatureDef } from "./features/sync-data-loader/types";
|
|
10
|
+
import { TreeFeatureDef } from "./features/tree/types";
|
|
3
11
|
export * from ".";
|
|
4
12
|
/** @interface */
|
|
5
|
-
export type
|
|
13
|
+
export type AsyncDataLoaderFeatureConfig<T> = AsyncDataLoaderFeatureDef<T>["config"];
|
|
6
14
|
/** @interface */
|
|
7
|
-
export type
|
|
15
|
+
export type AsyncDataLoaderFeatureState<T> = AsyncDataLoaderFeatureDef<T>["state"];
|
|
8
16
|
/** @interface */
|
|
9
|
-
export type
|
|
17
|
+
export type AsyncDataLoaderFeatureTreeInstance<T> = AsyncDataLoaderFeatureDef<T>["treeInstance"];
|
|
10
18
|
/** @interface */
|
|
11
|
-
export type
|
|
12
|
-
export type
|
|
19
|
+
export type AsyncDataLoaderFeatureItemInstance<T> = AsyncDataLoaderFeatureDef<T>["itemInstance"];
|
|
20
|
+
export type AsyncDataLoaderFeatureHotkeys<T> = AsyncDataLoaderFeatureDef<T>["hotkeys"];
|
|
13
21
|
/** @interface */
|
|
14
22
|
export type DragAndDropFeatureConfig<T> = DragAndDropFeatureDef<T>["config"];
|
|
15
23
|
/** @interface */
|
|
@@ -19,3 +27,75 @@ export type DragAndDropFeatureTreeInstance<T> = DragAndDropFeatureDef<T>["treeIn
|
|
|
19
27
|
/** @interface */
|
|
20
28
|
export type DragAndDropFeatureItemInstance<T> = DragAndDropFeatureDef<T>["itemInstance"];
|
|
21
29
|
export type DragAndDropFeatureHotkeys<T> = DragAndDropFeatureDef<T>["hotkeys"];
|
|
30
|
+
/** @interface */
|
|
31
|
+
export type ExpandAllFeatureConfig = ExpandAllFeatureDef["config"];
|
|
32
|
+
/** @interface */
|
|
33
|
+
export type ExpandAllFeatureState = ExpandAllFeatureDef["state"];
|
|
34
|
+
/** @interface */
|
|
35
|
+
export type ExpandAllFeatureTreeInstance = ExpandAllFeatureDef["treeInstance"];
|
|
36
|
+
/** @interface */
|
|
37
|
+
export type ExpandAllFeatureItemInstance = ExpandAllFeatureDef["itemInstance"];
|
|
38
|
+
export type ExpandAllFeatureHotkeys = ExpandAllFeatureDef["hotkeys"];
|
|
39
|
+
/** @interface */
|
|
40
|
+
export type HotkeysCoreFeatureConfig<T> = HotkeysCoreFeatureDef<T>["config"];
|
|
41
|
+
/** @interface */
|
|
42
|
+
export type HotkeysCoreFeatureState<T> = HotkeysCoreFeatureDef<T>["state"];
|
|
43
|
+
/** @interface */
|
|
44
|
+
export type HotkeysCoreFeatureTreeInstance<T> = HotkeysCoreFeatureDef<T>["treeInstance"];
|
|
45
|
+
/** @interface */
|
|
46
|
+
export type HotkeysCoreFeatureItemInstance<T> = HotkeysCoreFeatureDef<T>["itemInstance"];
|
|
47
|
+
export type HotkeysCoreFeatureHotkeys<T> = HotkeysCoreFeatureDef<T>["hotkeys"];
|
|
48
|
+
/** @interface */
|
|
49
|
+
export type MainFeatureConfig = MainFeatureDef["config"];
|
|
50
|
+
/** @interface */
|
|
51
|
+
export type MainFeatureState = MainFeatureDef["state"];
|
|
52
|
+
/** @interface */
|
|
53
|
+
export type MainFeatureTreeInstance = MainFeatureDef["treeInstance"];
|
|
54
|
+
/** @interface */
|
|
55
|
+
export type MainFeatureItemInstance = MainFeatureDef["itemInstance"];
|
|
56
|
+
export type MainFeatureHotkeys = MainFeatureDef["hotkeys"];
|
|
57
|
+
/** @interface */
|
|
58
|
+
export type RenamingFeatureConfig<T> = RenamingFeatureDef<T>["config"];
|
|
59
|
+
/** @interface */
|
|
60
|
+
export type RenamingFeatureState<T> = RenamingFeatureDef<T>["state"];
|
|
61
|
+
/** @interface */
|
|
62
|
+
export type RenamingFeatureTreeInstance<T> = RenamingFeatureDef<T>["treeInstance"];
|
|
63
|
+
/** @interface */
|
|
64
|
+
export type RenamingFeatureItemInstance<T> = RenamingFeatureDef<T>["itemInstance"];
|
|
65
|
+
export type RenamingFeatureHotkeys<T> = RenamingFeatureDef<T>["hotkeys"];
|
|
66
|
+
/** @interface */
|
|
67
|
+
export type SearchFeatureConfig<T> = SearchFeatureDef<T>["config"];
|
|
68
|
+
/** @interface */
|
|
69
|
+
export type SearchFeatureState<T> = SearchFeatureDef<T>["state"];
|
|
70
|
+
/** @interface */
|
|
71
|
+
export type SearchFeatureTreeInstance<T> = SearchFeatureDef<T>["treeInstance"];
|
|
72
|
+
/** @interface */
|
|
73
|
+
export type SearchFeatureItemInstance<T> = SearchFeatureDef<T>["itemInstance"];
|
|
74
|
+
export type SearchFeatureHotkeys<T> = SearchFeatureDef<T>["hotkeys"];
|
|
75
|
+
/** @interface */
|
|
76
|
+
export type SelectionFeatureConfig<T> = SelectionFeatureDef<T>["config"];
|
|
77
|
+
/** @interface */
|
|
78
|
+
export type SelectionFeatureState<T> = SelectionFeatureDef<T>["state"];
|
|
79
|
+
/** @interface */
|
|
80
|
+
export type SelectionFeatureTreeInstance<T> = SelectionFeatureDef<T>["treeInstance"];
|
|
81
|
+
/** @interface */
|
|
82
|
+
export type SelectionFeatureItemInstance<T> = SelectionFeatureDef<T>["itemInstance"];
|
|
83
|
+
export type SelectionFeatureHotkeys<T> = SelectionFeatureDef<T>["hotkeys"];
|
|
84
|
+
/** @interface */
|
|
85
|
+
export type SyncDataLoaderFeatureConfig<T> = SyncDataLoaderFeatureDef<T>["config"];
|
|
86
|
+
/** @interface */
|
|
87
|
+
export type SyncDataLoaderFeatureState<T> = SyncDataLoaderFeatureDef<T>["state"];
|
|
88
|
+
/** @interface */
|
|
89
|
+
export type SyncDataLoaderFeatureTreeInstance<T> = SyncDataLoaderFeatureDef<T>["treeInstance"];
|
|
90
|
+
/** @interface */
|
|
91
|
+
export type SyncDataLoaderFeatureItemInstance<T> = SyncDataLoaderFeatureDef<T>["itemInstance"];
|
|
92
|
+
export type SyncDataLoaderFeatureHotkeys<T> = SyncDataLoaderFeatureDef<T>["hotkeys"];
|
|
93
|
+
/** @interface */
|
|
94
|
+
export type TreeFeatureConfig<T> = TreeFeatureDef<T>["config"];
|
|
95
|
+
/** @interface */
|
|
96
|
+
export type TreeFeatureState<T> = TreeFeatureDef<T>["state"];
|
|
97
|
+
/** @interface */
|
|
98
|
+
export type TreeFeatureTreeInstance<T> = TreeFeatureDef<T>["treeInstance"];
|
|
99
|
+
/** @interface */
|
|
100
|
+
export type TreeFeatureItemInstance<T> = TreeFeatureDef<T>["itemInstance"];
|
|
101
|
+
export type TreeFeatureHotkeys<T> = TreeFeatureDef<T>["hotkeys"];
|
|
@@ -3,7 +3,10 @@ const buildItemInstance = (features, tree, itemId) => {
|
|
|
3
3
|
var _a, _b;
|
|
4
4
|
const itemInstance = {};
|
|
5
5
|
for (const feature of features) {
|
|
6
|
-
Object.assign(
|
|
6
|
+
Object.assign(
|
|
7
|
+
// TODO dont run createItemInstance, but assign prototype objects instead?
|
|
8
|
+
// https://jsfiddle.net/bgenc58r/
|
|
9
|
+
itemInstance, (_b = (_a = feature.createItemInstance) === null || _a === void 0 ? void 0 : _a.call(feature, Object.assign({}, itemInstance), itemInstance, tree, itemId)) !== null && _b !== void 0 ? _b : {});
|
|
7
10
|
}
|
|
8
11
|
return itemInstance;
|
|
9
12
|
};
|
|
@@ -69,7 +72,6 @@ export const createTree = (initialConfig) => {
|
|
|
69
72
|
itemInstances.push(itemInstancesMap[item.itemId]);
|
|
70
73
|
}
|
|
71
74
|
}
|
|
72
|
-
console.log("REBUILT");
|
|
73
75
|
};
|
|
74
76
|
const eachFeature = (fn) => {
|
|
75
77
|
for (const feature of additionalFeatures) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DropTargetPosition
|
|
1
|
+
import { DropTargetPosition } from "./types";
|
|
2
2
|
export const getDragCode = ({ item, childIndex }) => `${item.getId()}__${childIndex !== null && childIndex !== void 0 ? childIndex : "none"}`;
|
|
3
3
|
export const getDropOffset = (e, item) => {
|
|
4
4
|
var _a;
|
|
@@ -43,7 +43,7 @@ export const searchFeature = {
|
|
|
43
43
|
hotkeys: {
|
|
44
44
|
openSearch: {
|
|
45
45
|
hotkey: "LetterOrNumber",
|
|
46
|
-
preventDefault: true,
|
|
46
|
+
preventDefault: true, // TODO make true default
|
|
47
47
|
isEnabled: (tree) => !tree.isSearchOpen(),
|
|
48
48
|
handler: (e, tree) => {
|
|
49
49
|
e.stopPropagation();
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
import { MainFeatureDef } from "./features/main/types";
|
|
2
2
|
import { DragAndDropFeatureDef } from "./features/drag-and-drop/types";
|
|
3
|
+
import { AsyncDataLoaderFeatureDef } from "./features/async-data-loader/types";
|
|
4
|
+
import { ExpandAllFeatureDef } from "./features/expand-all/types";
|
|
5
|
+
import { HotkeysCoreFeatureDef } from "./features/hotkeys-core/types";
|
|
6
|
+
import { RenamingFeatureDef } from "./features/renaming/types";
|
|
7
|
+
import { SearchFeatureDef } from "./features/search/types";
|
|
8
|
+
import { SelectionFeatureDef } from "./features/selection/types";
|
|
9
|
+
import { SyncDataLoaderFeatureDef } from "./features/sync-data-loader/types";
|
|
10
|
+
import { TreeFeatureDef } from "./features/tree/types";
|
|
3
11
|
export * from ".";
|
|
4
12
|
/** @interface */
|
|
5
|
-
export type
|
|
13
|
+
export type AsyncDataLoaderFeatureConfig<T> = AsyncDataLoaderFeatureDef<T>["config"];
|
|
6
14
|
/** @interface */
|
|
7
|
-
export type
|
|
15
|
+
export type AsyncDataLoaderFeatureState<T> = AsyncDataLoaderFeatureDef<T>["state"];
|
|
8
16
|
/** @interface */
|
|
9
|
-
export type
|
|
17
|
+
export type AsyncDataLoaderFeatureTreeInstance<T> = AsyncDataLoaderFeatureDef<T>["treeInstance"];
|
|
10
18
|
/** @interface */
|
|
11
|
-
export type
|
|
12
|
-
export type
|
|
19
|
+
export type AsyncDataLoaderFeatureItemInstance<T> = AsyncDataLoaderFeatureDef<T>["itemInstance"];
|
|
20
|
+
export type AsyncDataLoaderFeatureHotkeys<T> = AsyncDataLoaderFeatureDef<T>["hotkeys"];
|
|
13
21
|
/** @interface */
|
|
14
22
|
export type DragAndDropFeatureConfig<T> = DragAndDropFeatureDef<T>["config"];
|
|
15
23
|
/** @interface */
|
|
@@ -19,3 +27,75 @@ export type DragAndDropFeatureTreeInstance<T> = DragAndDropFeatureDef<T>["treeIn
|
|
|
19
27
|
/** @interface */
|
|
20
28
|
export type DragAndDropFeatureItemInstance<T> = DragAndDropFeatureDef<T>["itemInstance"];
|
|
21
29
|
export type DragAndDropFeatureHotkeys<T> = DragAndDropFeatureDef<T>["hotkeys"];
|
|
30
|
+
/** @interface */
|
|
31
|
+
export type ExpandAllFeatureConfig = ExpandAllFeatureDef["config"];
|
|
32
|
+
/** @interface */
|
|
33
|
+
export type ExpandAllFeatureState = ExpandAllFeatureDef["state"];
|
|
34
|
+
/** @interface */
|
|
35
|
+
export type ExpandAllFeatureTreeInstance = ExpandAllFeatureDef["treeInstance"];
|
|
36
|
+
/** @interface */
|
|
37
|
+
export type ExpandAllFeatureItemInstance = ExpandAllFeatureDef["itemInstance"];
|
|
38
|
+
export type ExpandAllFeatureHotkeys = ExpandAllFeatureDef["hotkeys"];
|
|
39
|
+
/** @interface */
|
|
40
|
+
export type HotkeysCoreFeatureConfig<T> = HotkeysCoreFeatureDef<T>["config"];
|
|
41
|
+
/** @interface */
|
|
42
|
+
export type HotkeysCoreFeatureState<T> = HotkeysCoreFeatureDef<T>["state"];
|
|
43
|
+
/** @interface */
|
|
44
|
+
export type HotkeysCoreFeatureTreeInstance<T> = HotkeysCoreFeatureDef<T>["treeInstance"];
|
|
45
|
+
/** @interface */
|
|
46
|
+
export type HotkeysCoreFeatureItemInstance<T> = HotkeysCoreFeatureDef<T>["itemInstance"];
|
|
47
|
+
export type HotkeysCoreFeatureHotkeys<T> = HotkeysCoreFeatureDef<T>["hotkeys"];
|
|
48
|
+
/** @interface */
|
|
49
|
+
export type MainFeatureConfig = MainFeatureDef["config"];
|
|
50
|
+
/** @interface */
|
|
51
|
+
export type MainFeatureState = MainFeatureDef["state"];
|
|
52
|
+
/** @interface */
|
|
53
|
+
export type MainFeatureTreeInstance = MainFeatureDef["treeInstance"];
|
|
54
|
+
/** @interface */
|
|
55
|
+
export type MainFeatureItemInstance = MainFeatureDef["itemInstance"];
|
|
56
|
+
export type MainFeatureHotkeys = MainFeatureDef["hotkeys"];
|
|
57
|
+
/** @interface */
|
|
58
|
+
export type RenamingFeatureConfig<T> = RenamingFeatureDef<T>["config"];
|
|
59
|
+
/** @interface */
|
|
60
|
+
export type RenamingFeatureState<T> = RenamingFeatureDef<T>["state"];
|
|
61
|
+
/** @interface */
|
|
62
|
+
export type RenamingFeatureTreeInstance<T> = RenamingFeatureDef<T>["treeInstance"];
|
|
63
|
+
/** @interface */
|
|
64
|
+
export type RenamingFeatureItemInstance<T> = RenamingFeatureDef<T>["itemInstance"];
|
|
65
|
+
export type RenamingFeatureHotkeys<T> = RenamingFeatureDef<T>["hotkeys"];
|
|
66
|
+
/** @interface */
|
|
67
|
+
export type SearchFeatureConfig<T> = SearchFeatureDef<T>["config"];
|
|
68
|
+
/** @interface */
|
|
69
|
+
export type SearchFeatureState<T> = SearchFeatureDef<T>["state"];
|
|
70
|
+
/** @interface */
|
|
71
|
+
export type SearchFeatureTreeInstance<T> = SearchFeatureDef<T>["treeInstance"];
|
|
72
|
+
/** @interface */
|
|
73
|
+
export type SearchFeatureItemInstance<T> = SearchFeatureDef<T>["itemInstance"];
|
|
74
|
+
export type SearchFeatureHotkeys<T> = SearchFeatureDef<T>["hotkeys"];
|
|
75
|
+
/** @interface */
|
|
76
|
+
export type SelectionFeatureConfig<T> = SelectionFeatureDef<T>["config"];
|
|
77
|
+
/** @interface */
|
|
78
|
+
export type SelectionFeatureState<T> = SelectionFeatureDef<T>["state"];
|
|
79
|
+
/** @interface */
|
|
80
|
+
export type SelectionFeatureTreeInstance<T> = SelectionFeatureDef<T>["treeInstance"];
|
|
81
|
+
/** @interface */
|
|
82
|
+
export type SelectionFeatureItemInstance<T> = SelectionFeatureDef<T>["itemInstance"];
|
|
83
|
+
export type SelectionFeatureHotkeys<T> = SelectionFeatureDef<T>["hotkeys"];
|
|
84
|
+
/** @interface */
|
|
85
|
+
export type SyncDataLoaderFeatureConfig<T> = SyncDataLoaderFeatureDef<T>["config"];
|
|
86
|
+
/** @interface */
|
|
87
|
+
export type SyncDataLoaderFeatureState<T> = SyncDataLoaderFeatureDef<T>["state"];
|
|
88
|
+
/** @interface */
|
|
89
|
+
export type SyncDataLoaderFeatureTreeInstance<T> = SyncDataLoaderFeatureDef<T>["treeInstance"];
|
|
90
|
+
/** @interface */
|
|
91
|
+
export type SyncDataLoaderFeatureItemInstance<T> = SyncDataLoaderFeatureDef<T>["itemInstance"];
|
|
92
|
+
export type SyncDataLoaderFeatureHotkeys<T> = SyncDataLoaderFeatureDef<T>["hotkeys"];
|
|
93
|
+
/** @interface */
|
|
94
|
+
export type TreeFeatureConfig<T> = TreeFeatureDef<T>["config"];
|
|
95
|
+
/** @interface */
|
|
96
|
+
export type TreeFeatureState<T> = TreeFeatureDef<T>["state"];
|
|
97
|
+
/** @interface */
|
|
98
|
+
export type TreeFeatureTreeInstance<T> = TreeFeatureDef<T>["treeInstance"];
|
|
99
|
+
/** @interface */
|
|
100
|
+
export type TreeFeatureItemInstance<T> = TreeFeatureDef<T>["itemInstance"];
|
|
101
|
+
export type TreeFeatureHotkeys<T> = TreeFeatureDef<T>["hotkeys"];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@headless-tree/core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"main": "lib/cjs/index.js",
|
|
5
5
|
"module": "lib/esm/index.js",
|
|
6
6
|
"types": "lib/esm/index.d.ts",
|
|
@@ -18,6 +18,6 @@
|
|
|
18
18
|
"author": "Lukas Bach <npm@lukasbach.com>",
|
|
19
19
|
"license": "MIT",
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"typescript": "^5.
|
|
21
|
+
"typescript": "^5.4.2"
|
|
22
22
|
}
|
|
23
23
|
}
|
package/src/core/create-tree.ts
CHANGED
|
@@ -13,18 +13,20 @@ import { ItemMeta } from "../features/tree/types";
|
|
|
13
13
|
const buildItemInstance = (
|
|
14
14
|
features: FeatureImplementation[],
|
|
15
15
|
tree: TreeInstance<any>,
|
|
16
|
-
itemId: string
|
|
16
|
+
itemId: string,
|
|
17
17
|
) => {
|
|
18
18
|
const itemInstance = {} as ItemInstance<any>;
|
|
19
19
|
for (const feature of features) {
|
|
20
20
|
Object.assign(
|
|
21
|
+
// TODO dont run createItemInstance, but assign prototype objects instead?
|
|
22
|
+
// https://jsfiddle.net/bgenc58r/
|
|
21
23
|
itemInstance,
|
|
22
24
|
feature.createItemInstance?.(
|
|
23
25
|
{ ...itemInstance },
|
|
24
26
|
itemInstance,
|
|
25
27
|
tree,
|
|
26
|
-
itemId
|
|
27
|
-
) ?? {}
|
|
28
|
+
itemId,
|
|
29
|
+
) ?? {},
|
|
28
30
|
);
|
|
29
31
|
}
|
|
30
32
|
return itemInstance;
|
|
@@ -34,7 +36,7 @@ const verifyFeatures = (features: FeatureImplementation[] | undefined) => {
|
|
|
34
36
|
const loadedFeatures = features?.map((feature) => feature.key);
|
|
35
37
|
for (const feature of features ?? []) {
|
|
36
38
|
const missingDependency = feature.deps?.find(
|
|
37
|
-
(dep) => !loadedFeatures?.includes(dep)
|
|
39
|
+
(dep) => !loadedFeatures?.includes(dep),
|
|
38
40
|
);
|
|
39
41
|
if (missingDependency) {
|
|
40
42
|
throw new Error(`${feature.key} needs ${missingDependency}`);
|
|
@@ -44,7 +46,7 @@ const verifyFeatures = (features: FeatureImplementation[] | undefined) => {
|
|
|
44
46
|
|
|
45
47
|
const compareFeatures = (
|
|
46
48
|
feature1: FeatureImplementation,
|
|
47
|
-
feature2: FeatureImplementation
|
|
49
|
+
feature2: FeatureImplementation,
|
|
48
50
|
) => {
|
|
49
51
|
if (feature2.key && feature1.overwrites?.includes(feature2.key)) {
|
|
50
52
|
return 1;
|
|
@@ -56,7 +58,7 @@ const sortFeatures = (features: FeatureImplementation[] = []) =>
|
|
|
56
58
|
features.sort(compareFeatures);
|
|
57
59
|
|
|
58
60
|
export const createTree = <T>(
|
|
59
|
-
initialConfig: TreeConfig<T
|
|
61
|
+
initialConfig: TreeConfig<T>,
|
|
60
62
|
): TreeInstance<T> => {
|
|
61
63
|
const treeInstance: TreeInstance<T> = {} as any;
|
|
62
64
|
|
|
@@ -68,15 +70,15 @@ export const createTree = <T>(
|
|
|
68
70
|
|
|
69
71
|
let state = additionalFeatures.reduce(
|
|
70
72
|
(acc, feature) => feature.getInitialState?.(acc, treeInstance) ?? acc,
|
|
71
|
-
initialConfig.initialState ?? initialConfig.state ?? {}
|
|
73
|
+
initialConfig.initialState ?? initialConfig.state ?? {},
|
|
72
74
|
) as TreeState<T>;
|
|
73
75
|
let config = additionalFeatures.reduce(
|
|
74
76
|
(acc, feature) => feature.getDefaultConfig?.(acc, treeInstance) ?? acc,
|
|
75
|
-
initialConfig
|
|
77
|
+
initialConfig,
|
|
76
78
|
) as TreeConfig<T>;
|
|
77
79
|
const stateHandlerNames = additionalFeatures.reduce(
|
|
78
80
|
(acc, feature) => ({ ...acc, ...feature.stateHandlerNames }),
|
|
79
|
-
{} as Record<string, string
|
|
81
|
+
{} as Record<string, string>,
|
|
80
82
|
);
|
|
81
83
|
|
|
82
84
|
let treeElement: HTMLElement | undefined | null;
|
|
@@ -98,7 +100,7 @@ export const createTree = <T>(
|
|
|
98
100
|
const rootInstance = buildItemInstance(
|
|
99
101
|
[main, ...additionalFeatures],
|
|
100
102
|
treeInstance,
|
|
101
|
-
config.rootItemId
|
|
103
|
+
config.rootItemId,
|
|
102
104
|
);
|
|
103
105
|
itemInstancesMap[config.rootItemId] = rootInstance;
|
|
104
106
|
itemMetaMap[config.rootItemId] = {
|
|
@@ -116,7 +118,7 @@ export const createTree = <T>(
|
|
|
116
118
|
const instance = buildItemInstance(
|
|
117
119
|
[main, ...additionalFeatures],
|
|
118
120
|
treeInstance,
|
|
119
|
-
item.itemId
|
|
121
|
+
item.itemId,
|
|
120
122
|
);
|
|
121
123
|
itemInstancesMap[item.itemId] = instance;
|
|
122
124
|
itemInstances.push(instance);
|
|
@@ -124,7 +126,6 @@ export const createTree = <T>(
|
|
|
124
126
|
itemInstances.push(itemInstancesMap[item.itemId]);
|
|
125
127
|
}
|
|
126
128
|
}
|
|
127
|
-
console.log("REBUILT");
|
|
128
129
|
};
|
|
129
130
|
|
|
130
131
|
const eachFeature = (fn: (feature: FeatureImplementation<any>) => void) => {
|
|
@@ -173,11 +174,11 @@ export const createTree = <T>(
|
|
|
173
174
|
|
|
174
175
|
if (treeElement && !element) {
|
|
175
176
|
eachFeature((feature) =>
|
|
176
|
-
feature.onTreeUnmount?.(treeInstance, treeElement!)
|
|
177
|
+
feature.onTreeUnmount?.(treeInstance, treeElement!),
|
|
177
178
|
);
|
|
178
179
|
} else if (!treeElement && element) {
|
|
179
180
|
eachFeature((feature) =>
|
|
180
|
-
feature.onTreeMount?.(treeInstance, element)
|
|
181
|
+
feature.onTreeMount?.(treeInstance, element),
|
|
181
182
|
);
|
|
182
183
|
}
|
|
183
184
|
treeElement = element;
|
|
@@ -196,11 +197,11 @@ export const createTree = <T>(
|
|
|
196
197
|
const oldElement = itemElementsMap[itemId];
|
|
197
198
|
if (oldElement && !element) {
|
|
198
199
|
eachFeature((feature) =>
|
|
199
|
-
feature.onItemUnmount?.(instance, oldElement!, treeInstance)
|
|
200
|
+
feature.onItemUnmount?.(instance, oldElement!, treeInstance),
|
|
200
201
|
);
|
|
201
202
|
} else if (!oldElement && element) {
|
|
202
203
|
eachFeature((feature) =>
|
|
203
|
-
feature.onItemMount?.(instance, element!, treeInstance)
|
|
204
|
+
feature.onItemMount?.(instance, element!, treeInstance),
|
|
204
205
|
);
|
|
205
206
|
}
|
|
206
207
|
itemElementsMap[itemId] = element;
|
|
@@ -217,7 +218,7 @@ export const createTree = <T>(
|
|
|
217
218
|
for (const feature of features) {
|
|
218
219
|
Object.assign(
|
|
219
220
|
treeInstance,
|
|
220
|
-
feature.createTreeInstance?.({ ...treeInstance }, treeInstance) ?? {}
|
|
221
|
+
feature.createTreeInstance?.({ ...treeInstance }, treeInstance) ?? {},
|
|
221
222
|
);
|
|
222
223
|
Object.assign(hotkeyPresets, feature.hotkeys ?? {});
|
|
223
224
|
}
|
|
@@ -47,7 +47,7 @@ export const asyncDataLoaderFeature: FeatureImplementation<
|
|
|
47
47
|
dataRef.current.itemData[itemId] = item;
|
|
48
48
|
config.onLoadedItem?.(itemId, item);
|
|
49
49
|
instance.applySubStateUpdate("loadingItems", (loadingItems) =>
|
|
50
|
-
loadingItems.filter((id) => id !== itemId)
|
|
50
|
+
loadingItems.filter((id) => id !== itemId),
|
|
51
51
|
);
|
|
52
52
|
});
|
|
53
53
|
}
|
|
@@ -83,7 +83,7 @@ export const asyncDataLoaderFeature: FeatureImplementation<
|
|
|
83
83
|
dataRef.current.childrenIds[itemId] = childrenIds;
|
|
84
84
|
config.onLoadedChildren?.(itemId, childrenIds);
|
|
85
85
|
instance.applySubStateUpdate("loadingItems", (loadingItems) =>
|
|
86
|
-
loadingItems.filter((id) => id !== itemId)
|
|
86
|
+
loadingItems.filter((id) => id !== itemId),
|
|
87
87
|
);
|
|
88
88
|
instance.rebuildTree();
|
|
89
89
|
});
|
|
@@ -92,7 +92,7 @@ export const asyncDataLoaderFeature: FeatureImplementation<
|
|
|
92
92
|
dataRef.current.childrenIds[itemId] = childrenIds;
|
|
93
93
|
config.onLoadedChildren?.(itemId, childrenIds);
|
|
94
94
|
instance.applySubStateUpdate("loadingItems", (loadingItems) =>
|
|
95
|
-
loadingItems.filter((id) => id !== itemId)
|
|
95
|
+
loadingItems.filter((id) => id !== itemId),
|
|
96
96
|
);
|
|
97
97
|
instance.rebuildTree();
|
|
98
98
|
});
|
|
@@ -35,7 +35,7 @@ export type AsyncDataLoaderFeatureDef<T> = {
|
|
|
35
35
|
itemInstance: SyncDataLoaderFeatureDef<T>["itemInstance"] & {
|
|
36
36
|
invalidateItemData: () => void;
|
|
37
37
|
invalidateChildrenIds: () => void;
|
|
38
|
-
isLoading: () => void;
|
|
38
|
+
isLoading: () => void; // TODO! boolean?
|
|
39
39
|
};
|
|
40
40
|
hotkeys: SyncDataLoaderFeatureDef<T>["hotkeys"];
|
|
41
41
|
};
|
|
@@ -56,12 +56,12 @@ export type DragAndDropFeatureDef<T> = {
|
|
|
56
56
|
};
|
|
57
57
|
canDropForeignDragObject?: (
|
|
58
58
|
dataTransfer: DataTransfer,
|
|
59
|
-
target: DropTarget<T
|
|
59
|
+
target: DropTarget<T>,
|
|
60
60
|
) => boolean;
|
|
61
61
|
onDrop?: (items: ItemInstance<T>[], target: DropTarget<T>) => void;
|
|
62
62
|
onDropForeignDragObject?: (
|
|
63
63
|
dataTransfer: DataTransfer,
|
|
64
|
-
target: DropTarget<T
|
|
64
|
+
target: DropTarget<T>,
|
|
65
65
|
) => void;
|
|
66
66
|
|
|
67
67
|
/** Runs in the onDragEnd event, if `ev.dataTransfer.dropEffect` is not `none`, i.e. the drop
|
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
import { ItemInstance, TreeInstance } from "../../types/core";
|
|
2
|
-
import {
|
|
3
|
-
DndState,
|
|
4
|
-
DragAndDropFeatureDef,
|
|
5
|
-
DropTarget,
|
|
6
|
-
DropTargetPosition,
|
|
7
|
-
} from "./types";
|
|
2
|
+
import { DropTarget, DropTargetPosition } from "./types";
|
|
8
3
|
|
|
9
4
|
export const getDragCode = ({ item, childIndex }: DropTarget<any>) =>
|
|
10
5
|
`${item.getId()}__${childIndex ?? "none"}`;
|
|
@@ -17,7 +12,7 @@ export const getDropOffset = (e: any, item: ItemInstance<any>): number => {
|
|
|
17
12
|
export const canDrop = (
|
|
18
13
|
dataTransfer: DataTransfer | null,
|
|
19
14
|
target: DropTarget<any>,
|
|
20
|
-
tree: TreeInstance<any
|
|
15
|
+
tree: TreeInstance<any>,
|
|
21
16
|
) => {
|
|
22
17
|
const draggedItems = tree.getState().dnd?.draggedItems;
|
|
23
18
|
const config = tree.getConfig();
|
|
@@ -40,7 +35,7 @@ export const canDrop = (
|
|
|
40
35
|
const getDropTargetPosition = (
|
|
41
36
|
offset: number,
|
|
42
37
|
topLinePercentage: number,
|
|
43
|
-
bottomLinePercentage: number
|
|
38
|
+
bottomLinePercentage: number,
|
|
44
39
|
) => {
|
|
45
40
|
if (offset < topLinePercentage) {
|
|
46
41
|
return DropTargetPosition.Top;
|
|
@@ -55,7 +50,7 @@ export const getDropTarget = (
|
|
|
55
50
|
e: any,
|
|
56
51
|
item: ItemInstance<any>,
|
|
57
52
|
tree: TreeInstance<any>,
|
|
58
|
-
canDropInbetween = tree.getConfig().canDropInbetween
|
|
53
|
+
canDropInbetween = tree.getConfig().canDropInbetween,
|
|
59
54
|
): DropTarget<any> => {
|
|
60
55
|
const config = tree.getConfig();
|
|
61
56
|
const draggedItems = tree.getState().dnd?.draggedItems ?? [];
|
|
@@ -81,7 +76,7 @@ export const getDropTarget = (
|
|
|
81
76
|
? getDropTargetPosition(
|
|
82
77
|
offset,
|
|
83
78
|
config.topLinePercentage ?? 0.3,
|
|
84
|
-
config.bottomLinePercentage ?? 0.7
|
|
79
|
+
config.bottomLinePercentage ?? 0.7,
|
|
85
80
|
)
|
|
86
81
|
: getDropTargetPosition(offset, 0.5, 0.5);
|
|
87
82
|
|
|
@@ -105,7 +100,7 @@ export const getDropTarget = (
|
|
|
105
100
|
child && draggedItems?.some((i) => i.getId() === child.getId())
|
|
106
101
|
? ++counter
|
|
107
102
|
: counter,
|
|
108
|
-
0
|
|
103
|
+
0,
|
|
109
104
|
);
|
|
110
105
|
|
|
111
106
|
return {
|
|
@@ -20,7 +20,7 @@ export const expandAllFeature: FeatureImplementation<
|
|
|
20
20
|
|
|
21
21
|
expandAll: async (cancelToken) => {
|
|
22
22
|
await Promise.all(
|
|
23
|
-
tree.getItems().map((item) => item.expandAll(cancelToken))
|
|
23
|
+
tree.getItems().map((item) => item.expandAll(cancelToken)),
|
|
24
24
|
);
|
|
25
25
|
},
|
|
26
26
|
|
|
@@ -46,10 +46,10 @@ export const expandAllFeature: FeatureImplementation<
|
|
|
46
46
|
await Promise.all(
|
|
47
47
|
item.getChildren().map(async (child) => {
|
|
48
48
|
await poll(
|
|
49
|
-
() => !tree.getState().loadingItems.includes(child.getId())
|
|
49
|
+
() => !tree.getState().loadingItems.includes(child.getId()),
|
|
50
50
|
);
|
|
51
51
|
await child?.expandAll(cancelToken);
|
|
52
|
-
})
|
|
52
|
+
}),
|
|
53
53
|
);
|
|
54
54
|
},
|
|
55
55
|
|
|
@@ -18,13 +18,13 @@ const specialKeys: Record<string, RegExp> = {
|
|
|
18
18
|
const testHotkeyMatch = (
|
|
19
19
|
pressedKeys: Set<string>,
|
|
20
20
|
tree: TreeInstance<any>,
|
|
21
|
-
hotkey: HotkeyConfig<any
|
|
21
|
+
hotkey: HotkeyConfig<any>,
|
|
22
22
|
) => {
|
|
23
23
|
const supposedKeys = hotkey.hotkey.split("+");
|
|
24
24
|
const doKeysMatch = supposedKeys.every((key) =>
|
|
25
25
|
key in specialKeys
|
|
26
26
|
? [...pressedKeys].some((pressedKey) => specialKeys[key].test(pressedKey))
|
|
27
|
-
: pressedKeys.has(key)
|
|
27
|
+
: pressedKeys.has(key),
|
|
28
28
|
);
|
|
29
29
|
const isEnabled = !hotkey.isEnabled || hotkey.isEnabled(tree);
|
|
30
30
|
const equalCounts = pressedKeys.size === supposedKeys.length;
|
|
@@ -35,10 +35,10 @@ const findHotkeyMatch = (
|
|
|
35
35
|
pressedKeys: Set<string>,
|
|
36
36
|
tree: TreeInstance<any>,
|
|
37
37
|
config1: HotkeysConfig<any, any>,
|
|
38
|
-
config2: HotkeysConfig<any, any
|
|
38
|
+
config2: HotkeysConfig<any, any>,
|
|
39
39
|
) => {
|
|
40
40
|
return Object.entries({ ...config1, ...config2 }).find(([, hotkey]) =>
|
|
41
|
-
testHotkeyMatch(pressedKeys, tree, hotkey)
|
|
41
|
+
testHotkeyMatch(pressedKeys, tree, hotkey),
|
|
42
42
|
)?.[0];
|
|
43
43
|
};
|
|
44
44
|
|
|
@@ -60,7 +60,7 @@ export const hotkeysCoreFeature: FeatureImplementation<
|
|
|
60
60
|
data.current.pressedKeys,
|
|
61
61
|
tree as any,
|
|
62
62
|
tree.getHotkeyPresets(),
|
|
63
|
-
tree.getConfig().hotkeys as HotkeysConfig<any
|
|
63
|
+
tree.getConfig().hotkeys as HotkeysConfig<any>,
|
|
64
64
|
);
|
|
65
65
|
|
|
66
66
|
if (!hotkeyName) return;
|
|
@@ -21,7 +21,7 @@ export type MainFeatureDef<T = any> = {
|
|
|
21
21
|
/** @internal */
|
|
22
22
|
applySubStateUpdate: <K extends keyof TreeState<any>>(
|
|
23
23
|
stateName: K,
|
|
24
|
-
updater: Updater<TreeState<T>[K]
|
|
24
|
+
updater: Updater<TreeState<T>[K]>,
|
|
25
25
|
) => void;
|
|
26
26
|
setState: SetStateFn<TreeState<T>>;
|
|
27
27
|
getState: () => TreeState<T>;
|
|
@@ -38,7 +38,7 @@ export const searchFeature: FeatureImplementation<
|
|
|
38
38
|
.find((item) =>
|
|
39
39
|
instance
|
|
40
40
|
.getConfig()
|
|
41
|
-
.isSearchMatchingItem?.(instance.getSearchValue(), item)
|
|
41
|
+
.isSearchMatchingItem?.(instance.getSearchValue(), item),
|
|
42
42
|
)
|
|
43
43
|
?.setFocused();
|
|
44
44
|
},
|
|
@@ -76,9 +76,9 @@ export const searchFeature: FeatureImplementation<
|
|
|
76
76
|
(search, items) =>
|
|
77
77
|
items.filter(
|
|
78
78
|
(item) =>
|
|
79
|
-
search && instance.getConfig().isSearchMatchingItem?.(search, item)
|
|
79
|
+
search && instance.getConfig().isSearchMatchingItem?.(search, item),
|
|
80
80
|
),
|
|
81
|
-
() => [instance.getSearchValue(), instance.getItems()]
|
|
81
|
+
() => [instance.getSearchValue(), instance.getItems()],
|
|
82
82
|
),
|
|
83
83
|
}),
|
|
84
84
|
|
|
@@ -130,7 +130,7 @@ export const searchFeature: FeatureImplementation<
|
|
|
130
130
|
.find(
|
|
131
131
|
(item) =>
|
|
132
132
|
item.getItemMeta().index >
|
|
133
|
-
tree.getFocusedItem().getItemMeta().index
|
|
133
|
+
tree.getFocusedItem().getItemMeta().index,
|
|
134
134
|
);
|
|
135
135
|
focusItem?.setFocused();
|
|
136
136
|
focusItem?.scrollTo({ block: "nearest", inline: "nearest" });
|
|
@@ -148,7 +148,7 @@ export const searchFeature: FeatureImplementation<
|
|
|
148
148
|
.find(
|
|
149
149
|
(item) =>
|
|
150
150
|
item.getItemMeta().index <
|
|
151
|
-
tree.getFocusedItem().getItemMeta().index
|
|
151
|
+
tree.getFocusedItem().getItemMeta().index,
|
|
152
152
|
);
|
|
153
153
|
focusItem?.setFocused();
|
|
154
154
|
focusItem?.scrollTo({ block: "nearest", inline: "nearest" });
|
|
@@ -46,14 +46,14 @@ export const selectionFeature: FeatureImplementation<
|
|
|
46
46
|
tree.setSelectedItems(
|
|
47
47
|
selectedItems.includes(item.getItemMeta().itemId)
|
|
48
48
|
? selectedItems
|
|
49
|
-
: [...selectedItems, item.getItemMeta().itemId]
|
|
49
|
+
: [...selectedItems, item.getItemMeta().itemId],
|
|
50
50
|
);
|
|
51
51
|
},
|
|
52
52
|
|
|
53
53
|
deselect: () => {
|
|
54
54
|
const { selectedItems } = tree.getState();
|
|
55
55
|
tree.setSelectedItems(
|
|
56
|
-
selectedItems.filter((id) => id !== item.getItemMeta().itemId)
|
|
56
|
+
selectedItems.filter((id) => id !== item.getItemMeta().itemId),
|
|
57
57
|
);
|
|
58
58
|
},
|
|
59
59
|
|
|
@@ -56,7 +56,7 @@ export const treeFeature: FeatureImplementation<
|
|
|
56
56
|
parentId: string,
|
|
57
57
|
level: number,
|
|
58
58
|
setSize: number,
|
|
59
|
-
posInSet: number
|
|
59
|
+
posInSet: number,
|
|
60
60
|
) => {
|
|
61
61
|
flatItems.push({
|
|
62
62
|
itemId,
|
|
@@ -107,7 +107,7 @@ export const treeFeature: FeatureImplementation<
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
instance.applySubStateUpdate("expandedItems", (expandedItems) =>
|
|
110
|
-
expandedItems.filter((id) => id !== itemId)
|
|
110
|
+
expandedItems.filter((id) => id !== itemId),
|
|
111
111
|
);
|
|
112
112
|
instance.rebuildTree();
|
|
113
113
|
},
|
|
@@ -226,7 +226,7 @@ export const treeFeature: FeatureImplementation<
|
|
|
226
226
|
}
|
|
227
227
|
return tree.getItemInstance(tree.getConfig().rootItemId);
|
|
228
228
|
},
|
|
229
|
-
() => [item.getItemMeta()]
|
|
229
|
+
() => [item.getItemMeta()],
|
|
230
230
|
),
|
|
231
231
|
// TODO remove
|
|
232
232
|
getIndexInParent: () => item.getItemMeta().posInSet,
|
|
@@ -65,7 +65,7 @@ export type TreeFeatureDef<T> = {
|
|
|
65
65
|
getItemBelow: () => ItemInstance<T> | null;
|
|
66
66
|
getMemoizedProp: <X>(name: string, create: () => X, deps?: any[]) => X;
|
|
67
67
|
scrollTo: (
|
|
68
|
-
scrollIntoViewArg?: boolean | ScrollIntoViewOptions
|
|
68
|
+
scrollIntoViewArg?: boolean | ScrollIntoViewOptions,
|
|
69
69
|
) => Promise<void>;
|
|
70
70
|
};
|
|
71
71
|
hotkeys:
|
package/src/mddocs-entry.ts
CHANGED
|
@@ -1,17 +1,40 @@
|
|
|
1
1
|
import { MainFeatureDef } from "./features/main/types";
|
|
2
2
|
import { DragAndDropFeatureDef } from "./features/drag-and-drop/types";
|
|
3
|
+
import { AsyncDataLoaderFeatureDef } from "./features/async-data-loader/types";
|
|
4
|
+
import { ExpandAllFeatureDef } from "./features/expand-all/types";
|
|
5
|
+
import { HotkeysCoreFeatureDef } from "./features/hotkeys-core/types";
|
|
6
|
+
import { RenamingFeatureDef } from "./features/renaming/types";
|
|
7
|
+
import { SearchFeatureDef } from "./features/search/types";
|
|
8
|
+
import { SelectionFeatureDef } from "./features/selection/types";
|
|
9
|
+
import { SyncDataLoaderFeatureDef } from "./features/sync-data-loader/types";
|
|
10
|
+
import { TreeFeatureDef } from "./features/tree/types";
|
|
3
11
|
|
|
4
12
|
export * from ".";
|
|
5
13
|
|
|
14
|
+
// /** @interface */
|
|
15
|
+
// export type XXXFeatureConfig<T> = XFeatureDef<T>["config"];
|
|
16
|
+
// /** @interface */
|
|
17
|
+
// export type XXXFeatureState<T> = XFeatureDef<T>["state"];
|
|
18
|
+
// /** @interface */
|
|
19
|
+
// export type XXXFeatureTreeInstance<T> = XFeatureDef<T>["treeInstance"];
|
|
20
|
+
// /** @interface */
|
|
21
|
+
// export type XXXFeatureItemInstance<T> = XFeatureDef<T>["itemInstance"];
|
|
22
|
+
// export type XXXFeatureHotkeys<T> = XFeatureDef<T>["hotkeys"];
|
|
23
|
+
|
|
6
24
|
/** @interface */
|
|
7
|
-
export type
|
|
25
|
+
export type AsyncDataLoaderFeatureConfig<T> =
|
|
26
|
+
AsyncDataLoaderFeatureDef<T>["config"];
|
|
8
27
|
/** @interface */
|
|
9
|
-
export type
|
|
28
|
+
export type AsyncDataLoaderFeatureState<T> =
|
|
29
|
+
AsyncDataLoaderFeatureDef<T>["state"];
|
|
10
30
|
/** @interface */
|
|
11
|
-
export type
|
|
31
|
+
export type AsyncDataLoaderFeatureTreeInstance<T> =
|
|
32
|
+
AsyncDataLoaderFeatureDef<T>["treeInstance"];
|
|
12
33
|
/** @interface */
|
|
13
|
-
export type
|
|
14
|
-
|
|
34
|
+
export type AsyncDataLoaderFeatureItemInstance<T> =
|
|
35
|
+
AsyncDataLoaderFeatureDef<T>["itemInstance"];
|
|
36
|
+
export type AsyncDataLoaderFeatureHotkeys<T> =
|
|
37
|
+
AsyncDataLoaderFeatureDef<T>["hotkeys"];
|
|
15
38
|
|
|
16
39
|
/** @interface */
|
|
17
40
|
export type DragAndDropFeatureConfig<T> = DragAndDropFeatureDef<T>["config"];
|
|
@@ -24,3 +47,94 @@ export type DragAndDropFeatureTreeInstance<T> =
|
|
|
24
47
|
export type DragAndDropFeatureItemInstance<T> =
|
|
25
48
|
DragAndDropFeatureDef<T>["itemInstance"];
|
|
26
49
|
export type DragAndDropFeatureHotkeys<T> = DragAndDropFeatureDef<T>["hotkeys"];
|
|
50
|
+
|
|
51
|
+
/** @interface */
|
|
52
|
+
export type ExpandAllFeatureConfig = ExpandAllFeatureDef["config"];
|
|
53
|
+
/** @interface */
|
|
54
|
+
export type ExpandAllFeatureState = ExpandAllFeatureDef["state"];
|
|
55
|
+
/** @interface */
|
|
56
|
+
export type ExpandAllFeatureTreeInstance = ExpandAllFeatureDef["treeInstance"];
|
|
57
|
+
/** @interface */
|
|
58
|
+
export type ExpandAllFeatureItemInstance = ExpandAllFeatureDef["itemInstance"];
|
|
59
|
+
export type ExpandAllFeatureHotkeys = ExpandAllFeatureDef["hotkeys"];
|
|
60
|
+
|
|
61
|
+
/** @interface */
|
|
62
|
+
export type HotkeysCoreFeatureConfig<T> = HotkeysCoreFeatureDef<T>["config"];
|
|
63
|
+
/** @interface */
|
|
64
|
+
export type HotkeysCoreFeatureState<T> = HotkeysCoreFeatureDef<T>["state"];
|
|
65
|
+
/** @interface */
|
|
66
|
+
export type HotkeysCoreFeatureTreeInstance<T> =
|
|
67
|
+
HotkeysCoreFeatureDef<T>["treeInstance"];
|
|
68
|
+
/** @interface */
|
|
69
|
+
export type HotkeysCoreFeatureItemInstance<T> =
|
|
70
|
+
HotkeysCoreFeatureDef<T>["itemInstance"];
|
|
71
|
+
export type HotkeysCoreFeatureHotkeys<T> = HotkeysCoreFeatureDef<T>["hotkeys"];
|
|
72
|
+
|
|
73
|
+
/** @interface */
|
|
74
|
+
export type MainFeatureConfig = MainFeatureDef["config"];
|
|
75
|
+
/** @interface */
|
|
76
|
+
export type MainFeatureState = MainFeatureDef["state"];
|
|
77
|
+
/** @interface */
|
|
78
|
+
export type MainFeatureTreeInstance = MainFeatureDef["treeInstance"];
|
|
79
|
+
/** @interface */
|
|
80
|
+
export type MainFeatureItemInstance = MainFeatureDef["itemInstance"];
|
|
81
|
+
export type MainFeatureHotkeys = MainFeatureDef["hotkeys"];
|
|
82
|
+
|
|
83
|
+
/** @interface */
|
|
84
|
+
export type RenamingFeatureConfig<T> = RenamingFeatureDef<T>["config"];
|
|
85
|
+
/** @interface */
|
|
86
|
+
export type RenamingFeatureState<T> = RenamingFeatureDef<T>["state"];
|
|
87
|
+
/** @interface */
|
|
88
|
+
export type RenamingFeatureTreeInstance<T> =
|
|
89
|
+
RenamingFeatureDef<T>["treeInstance"];
|
|
90
|
+
/** @interface */
|
|
91
|
+
export type RenamingFeatureItemInstance<T> =
|
|
92
|
+
RenamingFeatureDef<T>["itemInstance"];
|
|
93
|
+
export type RenamingFeatureHotkeys<T> = RenamingFeatureDef<T>["hotkeys"];
|
|
94
|
+
|
|
95
|
+
/** @interface */
|
|
96
|
+
export type SearchFeatureConfig<T> = SearchFeatureDef<T>["config"];
|
|
97
|
+
/** @interface */
|
|
98
|
+
export type SearchFeatureState<T> = SearchFeatureDef<T>["state"];
|
|
99
|
+
/** @interface */
|
|
100
|
+
export type SearchFeatureTreeInstance<T> = SearchFeatureDef<T>["treeInstance"];
|
|
101
|
+
/** @interface */
|
|
102
|
+
export type SearchFeatureItemInstance<T> = SearchFeatureDef<T>["itemInstance"];
|
|
103
|
+
export type SearchFeatureHotkeys<T> = SearchFeatureDef<T>["hotkeys"];
|
|
104
|
+
|
|
105
|
+
/** @interface */
|
|
106
|
+
export type SelectionFeatureConfig<T> = SelectionFeatureDef<T>["config"];
|
|
107
|
+
/** @interface */
|
|
108
|
+
export type SelectionFeatureState<T> = SelectionFeatureDef<T>["state"];
|
|
109
|
+
/** @interface */
|
|
110
|
+
export type SelectionFeatureTreeInstance<T> =
|
|
111
|
+
SelectionFeatureDef<T>["treeInstance"];
|
|
112
|
+
/** @interface */
|
|
113
|
+
export type SelectionFeatureItemInstance<T> =
|
|
114
|
+
SelectionFeatureDef<T>["itemInstance"];
|
|
115
|
+
export type SelectionFeatureHotkeys<T> = SelectionFeatureDef<T>["hotkeys"];
|
|
116
|
+
|
|
117
|
+
/** @interface */
|
|
118
|
+
export type SyncDataLoaderFeatureConfig<T> =
|
|
119
|
+
SyncDataLoaderFeatureDef<T>["config"];
|
|
120
|
+
/** @interface */
|
|
121
|
+
export type SyncDataLoaderFeatureState<T> =
|
|
122
|
+
SyncDataLoaderFeatureDef<T>["state"];
|
|
123
|
+
/** @interface */
|
|
124
|
+
export type SyncDataLoaderFeatureTreeInstance<T> =
|
|
125
|
+
SyncDataLoaderFeatureDef<T>["treeInstance"];
|
|
126
|
+
/** @interface */
|
|
127
|
+
export type SyncDataLoaderFeatureItemInstance<T> =
|
|
128
|
+
SyncDataLoaderFeatureDef<T>["itemInstance"];
|
|
129
|
+
export type SyncDataLoaderFeatureHotkeys<T> =
|
|
130
|
+
SyncDataLoaderFeatureDef<T>["hotkeys"];
|
|
131
|
+
|
|
132
|
+
/** @interface */
|
|
133
|
+
export type TreeFeatureConfig<T> = TreeFeatureDef<T>["config"];
|
|
134
|
+
/** @interface */
|
|
135
|
+
export type TreeFeatureState<T> = TreeFeatureDef<T>["state"];
|
|
136
|
+
/** @interface */
|
|
137
|
+
export type TreeFeatureTreeInstance<T> = TreeFeatureDef<T>["treeInstance"];
|
|
138
|
+
/** @interface */
|
|
139
|
+
export type TreeFeatureItemInstance<T> = TreeFeatureDef<T>["itemInstance"];
|
|
140
|
+
export type TreeFeatureHotkeys<T> = TreeFeatureDef<T>["hotkeys"];
|
package/src/types/core.ts
CHANGED
|
@@ -32,7 +32,7 @@ export type EmptyFeatureDef = {
|
|
|
32
32
|
};
|
|
33
33
|
|
|
34
34
|
type UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (
|
|
35
|
-
x: infer R
|
|
35
|
+
x: infer R,
|
|
36
36
|
) => any
|
|
37
37
|
? R
|
|
38
38
|
: never;
|
|
@@ -52,6 +52,7 @@ export type FeatureDefs<T> =
|
|
|
52
52
|
| ExpandAllFeatureDef;
|
|
53
53
|
|
|
54
54
|
type MergedFeatures<F extends FeatureDef> = {
|
|
55
|
+
// TODO remove in favor of types below
|
|
55
56
|
state: UnionToIntersection<F["state"]>;
|
|
56
57
|
config: UnionToIntersection<F["config"]>;
|
|
57
58
|
treeInstance: UnionToIntersection<F["treeInstance"]>;
|
|
@@ -117,7 +118,7 @@ export type HotkeysConfig<T, F extends FeatureDef = FeatureDefs<T>> = Record<
|
|
|
117
118
|
|
|
118
119
|
export type CustomHotkeysConfig<
|
|
119
120
|
T,
|
|
120
|
-
F extends FeatureDef = FeatureDefs<T
|
|
121
|
+
F extends FeatureDef = FeatureDefs<T>,
|
|
121
122
|
> = Partial<
|
|
122
123
|
Record<HotkeyName<F> | `custom${string}`, Partial<HotkeyConfig<T>>>
|
|
123
124
|
>;
|
|
@@ -125,7 +126,7 @@ export type CustomHotkeysConfig<
|
|
|
125
126
|
export type FeatureImplementation<
|
|
126
127
|
T = any,
|
|
127
128
|
D extends FeatureDef = any,
|
|
128
|
-
F extends FeatureDef = EmptyFeatureDef
|
|
129
|
+
F extends FeatureDef = EmptyFeatureDef,
|
|
129
130
|
> = {
|
|
130
131
|
key?: string;
|
|
131
132
|
deps?: string[];
|
|
@@ -137,46 +138,46 @@ export type FeatureImplementation<
|
|
|
137
138
|
|
|
138
139
|
getInitialState?: (
|
|
139
140
|
initialState: Partial<MergedFeatures<F>["state"]>,
|
|
140
|
-
tree: MergedFeatures<F>["treeInstance"]
|
|
141
|
+
tree: MergedFeatures<F>["treeInstance"],
|
|
141
142
|
) => Partial<D["state"] & MergedFeatures<F>["state"]>;
|
|
142
143
|
|
|
143
144
|
getDefaultConfig?: (
|
|
144
145
|
defaultConfig: Partial<MergedFeatures<F>["config"]>,
|
|
145
|
-
tree: MergedFeatures<F>["treeInstance"]
|
|
146
|
+
tree: MergedFeatures<F>["treeInstance"],
|
|
146
147
|
) => Partial<D["config"] & MergedFeatures<F>["config"]>;
|
|
147
148
|
|
|
148
149
|
createTreeInstance?: (
|
|
149
150
|
prev: MergedFeatures<F>["treeInstance"],
|
|
150
|
-
instance: MergedFeatures<F>["treeInstance"]
|
|
151
|
+
instance: MergedFeatures<F>["treeInstance"],
|
|
151
152
|
) => D["treeInstance"] & MergedFeatures<F>["treeInstance"];
|
|
152
153
|
|
|
153
154
|
createItemInstance?: (
|
|
154
155
|
prev: MergedFeatures<F>["itemInstance"],
|
|
155
156
|
item: MergedFeatures<F>["itemInstance"],
|
|
156
157
|
tree: MergedFeatures<F>["treeInstance"],
|
|
157
|
-
itemId: string
|
|
158
|
+
itemId: string,
|
|
158
159
|
) => D["itemInstance"] & MergedFeatures<F>["itemInstance"];
|
|
159
160
|
|
|
160
161
|
onTreeMount?: (
|
|
161
162
|
instance: MergedFeatures<F>["treeInstance"],
|
|
162
|
-
treeElement: HTMLElement
|
|
163
|
+
treeElement: HTMLElement,
|
|
163
164
|
) => void;
|
|
164
165
|
|
|
165
166
|
onTreeUnmount?: (
|
|
166
167
|
instance: MergedFeatures<F>["treeInstance"],
|
|
167
|
-
treeElement: HTMLElement
|
|
168
|
+
treeElement: HTMLElement,
|
|
168
169
|
) => void;
|
|
169
170
|
|
|
170
171
|
onItemMount?: (
|
|
171
172
|
instance: MergedFeatures<F>["itemInstance"],
|
|
172
173
|
itemElement: HTMLElement,
|
|
173
|
-
tree: MergedFeatures<F>["treeInstance"]
|
|
174
|
+
tree: MergedFeatures<F>["treeInstance"],
|
|
174
175
|
) => void;
|
|
175
176
|
|
|
176
177
|
onItemUnmount?: (
|
|
177
178
|
instance: MergedFeatures<F>["itemInstance"],
|
|
178
179
|
itemElement: HTMLElement,
|
|
179
|
-
tree: MergedFeatures<F>["treeInstance"]
|
|
180
|
+
tree: MergedFeatures<F>["treeInstance"],
|
|
180
181
|
) => void;
|
|
181
182
|
|
|
182
183
|
hotkeys?: HotkeysConfig<T, D>;
|
package/src/types/deep-merge.ts
CHANGED
|
@@ -25,7 +25,7 @@ type TPrimitives =
|
|
|
25
25
|
export type TMerged<T> = [T] extends [Array<any>]
|
|
26
26
|
? { [K in keyof T]: TMerged<T[K]> }
|
|
27
27
|
: [T] extends [TPrimitives]
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
? T
|
|
29
|
+
: [T] extends [object]
|
|
30
|
+
? TPartialKeys<{ [K in TAllKeys<T>]: TMerged<TIndexValue<T, K>> }, never>
|
|
31
|
+
: T;
|
|
@@ -5,7 +5,7 @@ import { insertItemsAtTarget } from "./insert-items-at-target";
|
|
|
5
5
|
|
|
6
6
|
export const createOnDropHandler =
|
|
7
7
|
<T>(
|
|
8
|
-
onChangeChildren: (item: ItemInstance<T>, newChildren: string[]) => void
|
|
8
|
+
onChangeChildren: (item: ItemInstance<T>, newChildren: string[]) => void,
|
|
9
9
|
) =>
|
|
10
10
|
(items: ItemInstance<T>[], target: DropTarget<T>) => {
|
|
11
11
|
const itemIds = items.map((item) => item.getId());
|
|
@@ -4,7 +4,7 @@ import { DropTarget } from "../features/drag-and-drop/types";
|
|
|
4
4
|
export const insertItemsAtTarget = <T>(
|
|
5
5
|
itemIds: string[],
|
|
6
6
|
target: DropTarget<T>,
|
|
7
|
-
onChangeChildren: (item: ItemInstance<T>, newChildrenIds: string[]) => void
|
|
7
|
+
onChangeChildren: (item: ItemInstance<T>, newChildrenIds: string[]) => void,
|
|
8
8
|
) => {
|
|
9
9
|
// add moved items to new common parent, if dropped onto parent
|
|
10
10
|
if (target.childIndex === null) {
|
|
@@ -2,7 +2,7 @@ import { ItemInstance } from "../types/core";
|
|
|
2
2
|
|
|
3
3
|
export const removeItemsFromParents = <T>(
|
|
4
4
|
movedItems: ItemInstance<T>[],
|
|
5
|
-
onChangeChildren: (item: ItemInstance<T>, newChildrenIds: string[]) => void
|
|
5
|
+
onChangeChildren: (item: ItemInstance<T>, newChildrenIds: string[]) => void,
|
|
6
6
|
) => {
|
|
7
7
|
// TODO bulk sibling changes together
|
|
8
8
|
for (const item of movedItems) {
|
|
@@ -12,7 +12,7 @@ export const removeItemsFromParents = <T>(
|
|
|
12
12
|
item.getParent(),
|
|
13
13
|
siblings
|
|
14
14
|
.filter((sibling) => sibling.getId() !== item.getId())
|
|
15
|
-
.map((i) => i.getId())
|
|
15
|
+
.map((i) => i.getId()),
|
|
16
16
|
);
|
|
17
17
|
}
|
|
18
18
|
}
|
package/src/utils.ts
CHANGED
|
@@ -4,7 +4,7 @@ export type NoInfer<T> = [T][T extends any ? 0 : never];
|
|
|
4
4
|
|
|
5
5
|
export const memo = <D extends readonly any[], R>(
|
|
6
6
|
fn: (...args: [...D]) => R,
|
|
7
|
-
deps: () => [...D]
|
|
7
|
+
deps: () => [...D],
|
|
8
8
|
) => {
|
|
9
9
|
let value: R | undefined;
|
|
10
10
|
let oldDeps: D | null = null;
|
|
@@ -40,7 +40,7 @@ export function functionalUpdate<T>(updater: Updater<T>, input: T): T {
|
|
|
40
40
|
}
|
|
41
41
|
export function makeStateUpdater<K extends keyof TreeState<any>>(
|
|
42
42
|
key: K,
|
|
43
|
-
instance: unknown
|
|
43
|
+
instance: unknown,
|
|
44
44
|
) {
|
|
45
45
|
return (updater: Updater<TreeState<any>[K]>) => {
|
|
46
46
|
(instance as any).setState(<TTableState>(old: TTableState) => {
|
package/typedoc.json
CHANGED