@headless-tree/core 0.0.0-20230802230636

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/lib/cjs/core/create-tree.d.ts +2 -0
  3. package/lib/cjs/core/create-tree.js +138 -0
  4. package/lib/cjs/features/async-data-loader/feature.d.ts +5 -0
  5. package/lib/cjs/features/async-data-loader/feature.js +88 -0
  6. package/lib/cjs/features/async-data-loader/types.d.ts +41 -0
  7. package/lib/cjs/features/async-data-loader/types.js +2 -0
  8. package/lib/cjs/features/drag-and-drop/feature.d.ts +3 -0
  9. package/lib/cjs/features/drag-and-drop/feature.js +138 -0
  10. package/lib/cjs/features/drag-and-drop/types.d.ts +69 -0
  11. package/lib/cjs/features/drag-and-drop/types.js +9 -0
  12. package/lib/cjs/features/drag-and-drop/utils.d.ts +6 -0
  13. package/lib/cjs/features/drag-and-drop/utils.js +79 -0
  14. package/lib/cjs/features/expand-all/feature.d.ts +6 -0
  15. package/lib/cjs/features/expand-all/feature.js +41 -0
  16. package/lib/cjs/features/expand-all/types.d.ts +17 -0
  17. package/lib/cjs/features/expand-all/types.js +2 -0
  18. package/lib/cjs/features/hotkeys-core/feature.d.ts +4 -0
  19. package/lib/cjs/features/hotkeys-core/feature.js +71 -0
  20. package/lib/cjs/features/hotkeys-core/types.d.ts +25 -0
  21. package/lib/cjs/features/hotkeys-core/types.js +2 -0
  22. package/lib/cjs/features/main/types.d.ts +39 -0
  23. package/lib/cjs/features/main/types.js +2 -0
  24. package/lib/cjs/features/renaming/feature.d.ts +5 -0
  25. package/lib/cjs/features/renaming/feature.js +64 -0
  26. package/lib/cjs/features/renaming/types.d.ts +27 -0
  27. package/lib/cjs/features/renaming/types.js +2 -0
  28. package/lib/cjs/features/search/feature.d.ts +5 -0
  29. package/lib/cjs/features/search/feature.js +103 -0
  30. package/lib/cjs/features/search/types.d.ts +33 -0
  31. package/lib/cjs/features/search/types.js +2 -0
  32. package/lib/cjs/features/selection/feature.d.ts +5 -0
  33. package/lib/cjs/features/selection/feature.js +113 -0
  34. package/lib/cjs/features/selection/types.d.ts +21 -0
  35. package/lib/cjs/features/selection/types.js +2 -0
  36. package/lib/cjs/features/sync-data-loader/feature.d.ts +4 -0
  37. package/lib/cjs/features/sync-data-loader/feature.js +14 -0
  38. package/lib/cjs/features/sync-data-loader/types.d.ts +19 -0
  39. package/lib/cjs/features/sync-data-loader/types.js +2 -0
  40. package/lib/cjs/features/tree/feature.d.ts +6 -0
  41. package/lib/cjs/features/tree/feature.js +230 -0
  42. package/lib/cjs/features/tree/types.d.ts +62 -0
  43. package/lib/cjs/features/tree/types.js +2 -0
  44. package/lib/cjs/index.d.ts +23 -0
  45. package/lib/cjs/index.js +39 -0
  46. package/lib/cjs/mddocs-entry.d.ts +21 -0
  47. package/lib/cjs/mddocs-entry.js +17 -0
  48. package/lib/cjs/types/core.d.ts +67 -0
  49. package/lib/cjs/types/core.js +2 -0
  50. package/lib/cjs/types/deep-merge.d.ts +13 -0
  51. package/lib/cjs/types/deep-merge.js +2 -0
  52. package/lib/cjs/utilities/create-on-drop-handler.d.ts +3 -0
  53. package/lib/cjs/utilities/create-on-drop-handler.js +11 -0
  54. package/lib/cjs/utilities/insert-items-at-target.d.ts +3 -0
  55. package/lib/cjs/utilities/insert-items-at-target.js +24 -0
  56. package/lib/cjs/utilities/remove-items-from-parents.d.ts +2 -0
  57. package/lib/cjs/utilities/remove-items-from-parents.js +17 -0
  58. package/lib/cjs/utils.d.ts +6 -0
  59. package/lib/cjs/utils.js +53 -0
  60. package/lib/esm/core/create-tree.d.ts +2 -0
  61. package/lib/esm/core/create-tree.js +134 -0
  62. package/lib/esm/features/async-data-loader/feature.d.ts +5 -0
  63. package/lib/esm/features/async-data-loader/feature.js +85 -0
  64. package/lib/esm/features/async-data-loader/types.d.ts +41 -0
  65. package/lib/esm/features/async-data-loader/types.js +1 -0
  66. package/lib/esm/features/drag-and-drop/feature.d.ts +3 -0
  67. package/lib/esm/features/drag-and-drop/feature.js +135 -0
  68. package/lib/esm/features/drag-and-drop/types.d.ts +69 -0
  69. package/lib/esm/features/drag-and-drop/types.js +6 -0
  70. package/lib/esm/features/drag-and-drop/utils.d.ts +6 -0
  71. package/lib/esm/features/drag-and-drop/utils.js +72 -0
  72. package/lib/esm/features/expand-all/feature.d.ts +6 -0
  73. package/lib/esm/features/expand-all/feature.js +38 -0
  74. package/lib/esm/features/expand-all/types.d.ts +17 -0
  75. package/lib/esm/features/expand-all/types.js +1 -0
  76. package/lib/esm/features/hotkeys-core/feature.d.ts +4 -0
  77. package/lib/esm/features/hotkeys-core/feature.js +68 -0
  78. package/lib/esm/features/hotkeys-core/types.d.ts +25 -0
  79. package/lib/esm/features/hotkeys-core/types.js +1 -0
  80. package/lib/esm/features/main/types.d.ts +39 -0
  81. package/lib/esm/features/main/types.js +1 -0
  82. package/lib/esm/features/renaming/feature.d.ts +5 -0
  83. package/lib/esm/features/renaming/feature.js +61 -0
  84. package/lib/esm/features/renaming/types.d.ts +27 -0
  85. package/lib/esm/features/renaming/types.js +1 -0
  86. package/lib/esm/features/search/feature.d.ts +5 -0
  87. package/lib/esm/features/search/feature.js +100 -0
  88. package/lib/esm/features/search/types.d.ts +33 -0
  89. package/lib/esm/features/search/types.js +1 -0
  90. package/lib/esm/features/selection/feature.d.ts +5 -0
  91. package/lib/esm/features/selection/feature.js +110 -0
  92. package/lib/esm/features/selection/types.d.ts +21 -0
  93. package/lib/esm/features/selection/types.js +1 -0
  94. package/lib/esm/features/sync-data-loader/feature.d.ts +4 -0
  95. package/lib/esm/features/sync-data-loader/feature.js +11 -0
  96. package/lib/esm/features/sync-data-loader/types.d.ts +19 -0
  97. package/lib/esm/features/sync-data-loader/types.js +1 -0
  98. package/lib/esm/features/tree/feature.d.ts +6 -0
  99. package/lib/esm/features/tree/feature.js +227 -0
  100. package/lib/esm/features/tree/types.d.ts +62 -0
  101. package/lib/esm/features/tree/types.js +1 -0
  102. package/lib/esm/index.d.ts +23 -0
  103. package/lib/esm/index.js +23 -0
  104. package/lib/esm/mddocs-entry.d.ts +21 -0
  105. package/lib/esm/mddocs-entry.js +1 -0
  106. package/lib/esm/types/core.d.ts +67 -0
  107. package/lib/esm/types/core.js +1 -0
  108. package/lib/esm/types/deep-merge.d.ts +13 -0
  109. package/lib/esm/types/deep-merge.js +1 -0
  110. package/lib/esm/utilities/create-on-drop-handler.d.ts +3 -0
  111. package/lib/esm/utilities/create-on-drop-handler.js +7 -0
  112. package/lib/esm/utilities/insert-items-at-target.d.ts +3 -0
  113. package/lib/esm/utilities/insert-items-at-target.js +20 -0
  114. package/lib/esm/utilities/remove-items-from-parents.d.ts +2 -0
  115. package/lib/esm/utilities/remove-items-from-parents.js +13 -0
  116. package/lib/esm/utils.d.ts +6 -0
  117. package/lib/esm/utils.js +46 -0
  118. package/package.json +23 -0
  119. package/src/core/create-tree.ts +228 -0
  120. package/src/features/async-data-loader/feature.ts +126 -0
  121. package/src/features/async-data-loader/types.ts +41 -0
  122. package/src/features/drag-and-drop/feature.ts +214 -0
  123. package/src/features/drag-and-drop/types.ts +89 -0
  124. package/src/features/drag-and-drop/utils.ts +117 -0
  125. package/src/features/expand-all/feature.ts +63 -0
  126. package/src/features/expand-all/types.ts +13 -0
  127. package/src/features/hotkeys-core/feature.ts +110 -0
  128. package/src/features/hotkeys-core/types.ts +36 -0
  129. package/src/features/main/types.ts +48 -0
  130. package/src/features/renaming/feature.ts +105 -0
  131. package/src/features/renaming/types.ts +28 -0
  132. package/src/features/search/feature.ts +158 -0
  133. package/src/features/search/types.ts +40 -0
  134. package/src/features/selection/feature.ts +157 -0
  135. package/src/features/selection/types.ts +28 -0
  136. package/src/features/sync-data-loader/feature.ts +41 -0
  137. package/src/features/sync-data-loader/types.ts +20 -0
  138. package/src/features/tree/feature.ts +326 -0
  139. package/src/features/tree/types.ts +78 -0
  140. package/src/index.ts +26 -0
  141. package/src/mddocs-entry.ts +26 -0
  142. package/src/types/core.ts +183 -0
  143. package/src/types/deep-merge.ts +31 -0
  144. package/src/utilities/create-on-drop-handler.ts +14 -0
  145. package/src/utilities/insert-items-at-target.ts +30 -0
  146. package/src/utilities/remove-items-from-parents.ts +21 -0
  147. package/src/utils.ts +68 -0
  148. package/tsconfig.json +7 -0
  149. package/typedoc.json +4 -0
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ import { FeatureImplementation } from "../../types/core";
2
+ import { TreeFeatureDef } from "./types";
3
+ import { MainFeatureDef } from "../main/types";
4
+ import { HotkeysCoreFeatureDef } from "../hotkeys-core/types";
5
+ import { SyncDataLoaderFeatureDef } from "../sync-data-loader/types";
6
+ export declare const treeFeature: FeatureImplementation<any, TreeFeatureDef<any>, MainFeatureDef | TreeFeatureDef<any> | HotkeysCoreFeatureDef<any> | SyncDataLoaderFeatureDef<any>>;
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.treeFeature = void 0;
13
+ const utils_1 = require("../../utils");
14
+ exports.treeFeature = {
15
+ key: "tree",
16
+ getInitialState: (initialState) => (Object.assign({ expandedItems: [], focusedItem: null }, initialState)),
17
+ getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setExpandedItems: (0, utils_1.makeStateUpdater)("expandedItems", tree), setFocusedItem: (0, utils_1.makeStateUpdater)("focusedItem", tree) }, defaultConfig)),
18
+ stateHandlerNames: {
19
+ expandedItems: "setExpandedItems",
20
+ focusedItem: "setFocusedItem",
21
+ },
22
+ createTreeInstance: (prev, instance) => (Object.assign(Object.assign({}, prev), { retrieveItemData: () => {
23
+ throw new Error("No data-loader registered");
24
+ }, retrieveChildrenIds: () => {
25
+ throw new Error("No data-loader registered");
26
+ }, isItemExpanded: (itemId) => instance.getState().expandedItems.includes(itemId), getItemsMeta: () => {
27
+ const { rootItemId } = instance.getConfig();
28
+ const { expandedItems } = instance.getState();
29
+ const flatItems = [];
30
+ const recursiveAdd = (itemId, parentId, level, setSize, posInSet) => {
31
+ var _a;
32
+ flatItems.push({
33
+ itemId,
34
+ level,
35
+ index: flatItems.length,
36
+ parentId,
37
+ setSize,
38
+ posInSet,
39
+ });
40
+ if (expandedItems.includes(itemId)) {
41
+ const children = (_a = instance.retrieveChildrenIds(itemId)) !== null && _a !== void 0 ? _a : [];
42
+ let i = 0;
43
+ for (const childId of children) {
44
+ recursiveAdd(childId, itemId, level + 1, children.length, i++);
45
+ }
46
+ }
47
+ };
48
+ const children = instance.retrieveChildrenIds(rootItemId);
49
+ let i = 0;
50
+ for (const itemId of children) {
51
+ recursiveAdd(itemId, rootItemId, 0, children.length, i++);
52
+ }
53
+ return flatItems;
54
+ }, expandItem: (itemId) => {
55
+ var _a;
56
+ if (!instance.getItemInstance(itemId).isFolder()) {
57
+ return;
58
+ }
59
+ if ((_a = instance.getState().loadingItems) === null || _a === void 0 ? void 0 : _a.includes(itemId)) {
60
+ return;
61
+ }
62
+ instance.applySubStateUpdate("expandedItems", (expandedItems) => [
63
+ ...expandedItems,
64
+ itemId,
65
+ ]);
66
+ instance.rebuildTree();
67
+ }, collapseItem: (itemId) => {
68
+ if (!instance.getItemInstance(itemId).isFolder()) {
69
+ return;
70
+ }
71
+ instance.applySubStateUpdate("expandedItems", (expandedItems) => expandedItems.filter((id) => id !== itemId));
72
+ instance.rebuildTree();
73
+ },
74
+ // TODO memo
75
+ getFocusedItem: () => {
76
+ var _a, _b;
77
+ return ((_b = instance.getItemInstance((_a = instance.getState().focusedItem) !== null && _a !== void 0 ? _a : "")) !== null && _b !== void 0 ? _b : instance.getItems()[0]);
78
+ }, focusItem: (itemId) => {
79
+ instance.applySubStateUpdate("focusedItem", itemId);
80
+ }, focusNextItem: () => {
81
+ const { index } = instance.getFocusedItem().getItemMeta();
82
+ const nextIndex = Math.min(index + 1, instance.getItems().length - 1);
83
+ instance.focusItem(instance.getItems()[nextIndex].getId());
84
+ }, focusPreviousItem: () => {
85
+ const { index } = instance.getFocusedItem().getItemMeta();
86
+ const nextIndex = Math.max(index - 1, 0);
87
+ instance.focusItem(instance.getItems()[nextIndex].getId());
88
+ }, updateDomFocus: () => {
89
+ // Required because if the state is managed outside in react, the state only updated during next render
90
+ setTimeout(() => __awaiter(void 0, void 0, void 0, function* () {
91
+ var _a, _b;
92
+ const focusedItem = instance.getFocusedItem();
93
+ (_b = (_a = instance.getConfig()).scrollToItem) === null || _b === void 0 ? void 0 : _b.call(_a, focusedItem);
94
+ yield (0, utils_1.poll)(() => focusedItem.getElement() !== null, 20);
95
+ const focusedElement = focusedItem.getElement();
96
+ if (!focusedElement)
97
+ return;
98
+ focusedElement.focus();
99
+ }));
100
+ }, getContainerProps: () => {
101
+ var _a;
102
+ return (Object.assign(Object.assign({}, (_a = prev.getContainerProps) === null || _a === void 0 ? void 0 : _a.call(prev)), { role: "tree", ariaLabel: "", ariaActivedescendant: "" }));
103
+ } })),
104
+ createItemInstance: (prev, item, tree) => (Object.assign(Object.assign({}, prev), { isLoading: () => {
105
+ throw new Error("No data-loader registered");
106
+ }, scrollTo: (scrollIntoViewArg) => __awaiter(void 0, void 0, void 0, function* () {
107
+ var _a, _b;
108
+ (_b = (_a = tree.getConfig()).scrollToItem) === null || _b === void 0 ? void 0 : _b.call(_a, item);
109
+ yield (0, utils_1.poll)(() => item.getElement() !== null, 20);
110
+ item.getElement().scrollIntoView(scrollIntoViewArg);
111
+ }), getId: () => item.getItemMeta().itemId, getProps: () => {
112
+ var _a;
113
+ const itemMeta = item.getItemMeta();
114
+ return Object.assign(Object.assign({}, (_a = prev.getProps) === null || _a === void 0 ? void 0 : _a.call(prev)), { role: "treeitem", "aria-setsize": itemMeta.setSize, "aria-posinset": itemMeta.posInSet, "aria-selected": "false", "aria-label": item.getItemName(), "aria-level": itemMeta.level, tabIndex: item.isFocused() ? 0 : -1, onClick: item.getMemoizedProp("tree/onClick", () => (e) => {
115
+ item.setFocused();
116
+ item.primaryAction();
117
+ if (e.ctrlKey || e.shiftKey || e.metaKey) {
118
+ return;
119
+ }
120
+ if (!item.isFolder()) {
121
+ return;
122
+ }
123
+ if (item.isExpanded()) {
124
+ item.collapse();
125
+ }
126
+ else {
127
+ item.expand();
128
+ }
129
+ }) });
130
+ }, expand: () => tree.expandItem(item.getItemMeta().itemId), collapse: () => tree.collapseItem(item.getItemMeta().itemId), getItemData: () => tree.retrieveItemData(item.getItemMeta().itemId), isExpanded: () => tree.getState().expandedItems.includes(item.getItemMeta().itemId), isFocused: () => tree.getState().focusedItem === item.getItemMeta().itemId ||
131
+ (tree.getState().focusedItem === null && item.getItemMeta().index === 0), isFolder: () => item.getItemMeta().level === -1 ||
132
+ tree.getConfig().isItemFolder(item), getItemName: () => {
133
+ const config = tree.getConfig();
134
+ return config.getItemName(item);
135
+ }, setFocused: () => tree.focusItem(item.getItemMeta().itemId), primaryAction: () => { var _a, _b; return (_b = (_a = tree.getConfig()).onPrimaryAction) === null || _b === void 0 ? void 0 : _b.call(_a, item); }, getParent: (0, utils_1.memo)((itemMeta) => {
136
+ for (let i = itemMeta.index - 1; i >= 0; i--) {
137
+ const potentialParent = tree.getItems()[i];
138
+ if (potentialParent.getItemMeta().level < itemMeta.level) {
139
+ return potentialParent;
140
+ }
141
+ }
142
+ return tree.getItemInstance(tree.getConfig().rootItemId);
143
+ }, () => [item.getItemMeta()]),
144
+ // TODO remove
145
+ getIndexInParent: () => item.getItemMeta().posInSet, getChildren: () => tree
146
+ .retrieveChildrenIds(item.getItemMeta().itemId)
147
+ .map((id) => tree.getItemInstance(id)), getTree: () => tree, getItemAbove: () => tree.getItems()[item.getItemMeta().index - 1], getItemBelow: () => tree.getItems()[item.getItemMeta().index + 1], getMemoizedProp: (name, create, deps) => {
148
+ var _a, _b, _c, _d, _e;
149
+ var _f, _g;
150
+ const data = item.getDataRef();
151
+ const memoizedValue = (_a = data.current.memoizedValues) === null || _a === void 0 ? void 0 : _a[name];
152
+ if (memoizedValue &&
153
+ (!deps ||
154
+ ((_c = (_b = data.current.memoizedDeps) === null || _b === void 0 ? void 0 : _b[name]) === null || _c === void 0 ? void 0 : _c.every((d, i) => d === deps[i])))) {
155
+ return memoizedValue;
156
+ }
157
+ (_d = (_f = data.current).memoizedDeps) !== null && _d !== void 0 ? _d : (_f.memoizedDeps = {});
158
+ (_e = (_g = data.current).memoizedValues) !== null && _e !== void 0 ? _e : (_g.memoizedValues = {});
159
+ const value = create();
160
+ data.current.memoizedDeps[name] = deps;
161
+ data.current.memoizedValues[name] = value;
162
+ return value;
163
+ } })),
164
+ hotkeys: {
165
+ focusNextItem: {
166
+ hotkey: "ArrowDown",
167
+ canRepeat: true,
168
+ preventDefault: true,
169
+ isEnabled: (tree) => { var _a, _b; return !((_b = (_a = tree.isSearchOpen) === null || _a === void 0 ? void 0 : _a.call(tree)) !== null && _b !== void 0 ? _b : false) && !tree.getState().dnd; },
170
+ handler: (e, tree) => {
171
+ tree.focusNextItem();
172
+ tree.updateDomFocus();
173
+ },
174
+ },
175
+ focusPreviousItem: {
176
+ hotkey: "ArrowUp",
177
+ canRepeat: true,
178
+ preventDefault: true,
179
+ isEnabled: (tree) => { var _a, _b; return !((_b = (_a = tree.isSearchOpen) === null || _a === void 0 ? void 0 : _a.call(tree)) !== null && _b !== void 0 ? _b : false) && !tree.getState().dnd; },
180
+ handler: (e, tree) => {
181
+ tree.focusPreviousItem();
182
+ tree.updateDomFocus();
183
+ },
184
+ },
185
+ expandOrDown: {
186
+ hotkey: "ArrowRight",
187
+ canRepeat: true,
188
+ handler: (e, tree) => {
189
+ const item = tree.getFocusedItem();
190
+ if (item.isExpanded() || !item.isFolder()) {
191
+ tree.focusNextItem();
192
+ tree.updateDomFocus();
193
+ }
194
+ else {
195
+ item.expand();
196
+ }
197
+ },
198
+ },
199
+ collapseOrUp: {
200
+ hotkey: "ArrowLeft",
201
+ canRepeat: true,
202
+ handler: (e, tree) => {
203
+ var _a;
204
+ const item = tree.getFocusedItem();
205
+ if ((!item.isExpanded() || !item.isFolder()) &&
206
+ item.getItemMeta().level !== 0) {
207
+ (_a = item.getParent()) === null || _a === void 0 ? void 0 : _a.setFocused();
208
+ tree.updateDomFocus();
209
+ }
210
+ else {
211
+ item.collapse();
212
+ }
213
+ },
214
+ },
215
+ focusFirstItem: {
216
+ hotkey: "Home",
217
+ handler: (e, tree) => {
218
+ tree.focusItem(tree.getItems()[0].getId());
219
+ tree.updateDomFocus();
220
+ },
221
+ },
222
+ focusLastItem: {
223
+ hotkey: "End",
224
+ handler: (e, tree) => {
225
+ tree.focusItem(tree.getItems()[tree.getItems().length - 1].getId());
226
+ tree.updateDomFocus();
227
+ },
228
+ },
229
+ },
230
+ };
@@ -0,0 +1,62 @@
1
+ import { ItemInstance, SetStateFn, TreeInstance } from "../../types/core";
2
+ export type ItemMeta = {
3
+ itemId: string;
4
+ parentId: string;
5
+ level: number;
6
+ index: number;
7
+ setSize: number;
8
+ posInSet: number;
9
+ };
10
+ export type TreeItemDataRef = {
11
+ memoizedValues: Record<string, any>;
12
+ memoizedDeps: Record<string, any[] | undefined>;
13
+ };
14
+ export type TreeFeatureDef<T> = {
15
+ state: {
16
+ expandedItems: string[];
17
+ focusedItem: string | null;
18
+ };
19
+ config: {
20
+ isItemFolder: (item: ItemInstance<T>) => boolean;
21
+ getItemName: (item: ItemInstance<T>) => string;
22
+ onPrimaryAction?: (item: ItemInstance<T>) => void;
23
+ scrollToItem?: (item: ItemInstance<T>) => void;
24
+ setExpandedItems?: SetStateFn<string[]>;
25
+ setFocusedItem?: SetStateFn<string | null>;
26
+ };
27
+ treeInstance: {
28
+ /** @internal */
29
+ getItemsMeta: () => ItemMeta[];
30
+ expandItem: (itemId: string) => void;
31
+ collapseItem: (itemId: string) => void;
32
+ isItemExpanded: (itemId: string) => boolean;
33
+ focusItem: (itemId: string) => void;
34
+ getFocusedItem: () => ItemInstance<any>;
35
+ focusNextItem: () => void;
36
+ focusPreviousItem: () => void;
37
+ updateDomFocus: () => void;
38
+ getContainerProps: () => Record<string, any>;
39
+ };
40
+ itemInstance: {
41
+ getId: () => string;
42
+ getProps: () => Record<string, any>;
43
+ getItemName: () => string;
44
+ getItemData: () => T;
45
+ expand: () => void;
46
+ collapse: () => void;
47
+ isExpanded: () => boolean;
48
+ isFocused: () => boolean;
49
+ isFolder: () => boolean;
50
+ setFocused: () => void;
51
+ getParent: () => ItemInstance<T>;
52
+ getChildren: () => ItemInstance<T>[];
53
+ getIndexInParent: () => number;
54
+ primaryAction: () => void;
55
+ getTree: () => TreeInstance<T>;
56
+ getItemAbove: () => ItemInstance<T> | null;
57
+ getItemBelow: () => ItemInstance<T> | null;
58
+ getMemoizedProp: <X>(name: string, create: () => X, deps?: any[]) => X;
59
+ scrollTo: (scrollIntoViewArg?: boolean | ScrollIntoViewOptions) => Promise<void>;
60
+ };
61
+ hotkeys: "focusNextItem" | "focusPreviousItem" | "expandOrDown" | "collapseOrUp" | "focusFirstItem" | "focusLastItem";
62
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,23 @@
1
+ export * from "./types/core";
2
+ export * from "./core/create-tree";
3
+ export * from "./features/tree/types";
4
+ export * from "./features/main/types";
5
+ export * from "./features/drag-and-drop/types";
6
+ export * from "./features/selection/types";
7
+ export * from "./features/async-data-loader/types";
8
+ export * from "./features/sync-data-loader/types";
9
+ export * from "./features/hotkeys-core/types";
10
+ export * from "./features/search/types";
11
+ export * from "./features/renaming/types";
12
+ export * from "./features/expand-all/types";
13
+ export * from "./features/selection/feature";
14
+ export * from "./features/hotkeys-core/feature";
15
+ export * from "./features/async-data-loader/feature";
16
+ export * from "./features/sync-data-loader/feature";
17
+ export * from "./features/drag-and-drop/feature";
18
+ export * from "./features/search/feature";
19
+ export * from "./features/renaming/feature";
20
+ export * from "./features/expand-all/feature";
21
+ export * from "./utilities/create-on-drop-handler";
22
+ export * from "./utilities/insert-items-at-target";
23
+ export * from "./utilities/remove-items-from-parents";
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types/core"), exports);
18
+ __exportStar(require("./core/create-tree"), exports);
19
+ __exportStar(require("./features/tree/types"), exports);
20
+ __exportStar(require("./features/main/types"), exports);
21
+ __exportStar(require("./features/drag-and-drop/types"), exports);
22
+ __exportStar(require("./features/selection/types"), exports);
23
+ __exportStar(require("./features/async-data-loader/types"), exports);
24
+ __exportStar(require("./features/sync-data-loader/types"), exports);
25
+ __exportStar(require("./features/hotkeys-core/types"), exports);
26
+ __exportStar(require("./features/search/types"), exports);
27
+ __exportStar(require("./features/renaming/types"), exports);
28
+ __exportStar(require("./features/expand-all/types"), exports);
29
+ __exportStar(require("./features/selection/feature"), exports);
30
+ __exportStar(require("./features/hotkeys-core/feature"), exports);
31
+ __exportStar(require("./features/async-data-loader/feature"), exports);
32
+ __exportStar(require("./features/sync-data-loader/feature"), exports);
33
+ __exportStar(require("./features/drag-and-drop/feature"), exports);
34
+ __exportStar(require("./features/search/feature"), exports);
35
+ __exportStar(require("./features/renaming/feature"), exports);
36
+ __exportStar(require("./features/expand-all/feature"), exports);
37
+ __exportStar(require("./utilities/create-on-drop-handler"), exports);
38
+ __exportStar(require("./utilities/insert-items-at-target"), exports);
39
+ __exportStar(require("./utilities/remove-items-from-parents"), exports);
@@ -0,0 +1,21 @@
1
+ import { MainFeatureDef } from "./features/main/types";
2
+ import { DragAndDropFeatureDef } from "./features/drag-and-drop/types";
3
+ export * from ".";
4
+ /** @interface */
5
+ export type MainFeatureConfig = MainFeatureDef["config"];
6
+ /** @interface */
7
+ export type MainFeatureState = MainFeatureDef["state"];
8
+ /** @interface */
9
+ export type MainFeatureTreeInstance = MainFeatureDef["treeInstance"];
10
+ /** @interface */
11
+ export type MainFeatureItemInstance = MainFeatureDef["itemInstance"];
12
+ export type MainFeatureHotkeys = MainFeatureDef["hotkeys"];
13
+ /** @interface */
14
+ export type DragAndDropFeatureConfig<T> = DragAndDropFeatureDef<T>["config"];
15
+ /** @interface */
16
+ export type DragAndDropFeatureState<T> = DragAndDropFeatureDef<T>["state"];
17
+ /** @interface */
18
+ export type DragAndDropFeatureTreeInstance<T> = DragAndDropFeatureDef<T>["treeInstance"];
19
+ /** @interface */
20
+ export type DragAndDropFeatureItemInstance<T> = DragAndDropFeatureDef<T>["itemInstance"];
21
+ export type DragAndDropFeatureHotkeys<T> = DragAndDropFeatureDef<T>["hotkeys"];
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("."), exports);
@@ -0,0 +1,67 @@
1
+ import { DragAndDropFeatureDef } from "../features/drag-and-drop/types";
2
+ import { MainFeatureDef } from "../features/main/types";
3
+ import { SelectionFeatureDef } from "../features/selection/types";
4
+ import { TreeFeatureDef } from "../features/tree/types";
5
+ import { HotkeyConfig, HotkeysCoreFeatureDef } from "../features/hotkeys-core/types";
6
+ import { SyncDataLoaderFeatureDef } from "../features/sync-data-loader/types";
7
+ import { AsyncDataLoaderFeatureDef } from "../features/async-data-loader/types";
8
+ import { SearchFeatureDef } from "../features/search/types";
9
+ import { RenamingFeatureDef } from "../features/renaming/types";
10
+ import { ExpandAllFeatureDef } from "../features/expand-all/types";
11
+ export type Updater<T> = T | ((old: T) => T);
12
+ export type SetStateFn<T> = (updaterOrValue: Updater<T>) => void;
13
+ export type FeatureDef = {
14
+ state: object;
15
+ config: object;
16
+ treeInstance: object;
17
+ itemInstance: object;
18
+ hotkeys: string;
19
+ };
20
+ export type EmptyFeatureDef = {
21
+ state: {};
22
+ config: {};
23
+ treeInstance: {};
24
+ itemInstance: {};
25
+ hotkeys: never;
26
+ };
27
+ type UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never;
28
+ export type DefaultFeatures<T> = MainFeatureDef | TreeFeatureDef<T>;
29
+ export type FeatureDefs<T> = MainFeatureDef | TreeFeatureDef<T> | SelectionFeatureDef<T> | DragAndDropFeatureDef<T> | HotkeysCoreFeatureDef<T> | SyncDataLoaderFeatureDef<T> | AsyncDataLoaderFeatureDef<T> | SearchFeatureDef<T> | RenamingFeatureDef<T> | ExpandAllFeatureDef;
30
+ type MergedFeatures<F extends FeatureDef> = {
31
+ state: UnionToIntersection<F["state"]>;
32
+ config: UnionToIntersection<F["config"]>;
33
+ treeInstance: UnionToIntersection<F["treeInstance"]>;
34
+ itemInstance: UnionToIntersection<F["itemInstance"]>;
35
+ hotkeys: F["hotkeys"];
36
+ };
37
+ type TreeStateType<T> = MainFeatureDef["state"] & TreeFeatureDef<T>["state"] & SelectionFeatureDef<T>["state"] & DragAndDropFeatureDef<T>["state"] & HotkeysCoreFeatureDef<T>["state"] & SyncDataLoaderFeatureDef<T>["state"] & AsyncDataLoaderFeatureDef<T>["state"] & SearchFeatureDef<T>["state"] & RenamingFeatureDef<T>["state"] & ExpandAllFeatureDef["state"];
38
+ export interface TreeState<T> extends TreeStateType<T> {
39
+ }
40
+ type TreeConfigType<T> = MainFeatureDef["config"] & TreeFeatureDef<T>["config"] & SelectionFeatureDef<T>["config"] & DragAndDropFeatureDef<T>["config"] & HotkeysCoreFeatureDef<T>["config"] & SyncDataLoaderFeatureDef<T>["config"] & AsyncDataLoaderFeatureDef<T>["config"] & SearchFeatureDef<T>["config"] & RenamingFeatureDef<T>["config"] & ExpandAllFeatureDef["config"];
41
+ export interface TreeConfig<T> extends TreeConfigType<T> {
42
+ }
43
+ type TreeInstanceType<T> = MainFeatureDef["treeInstance"] & TreeFeatureDef<T>["treeInstance"] & SelectionFeatureDef<T>["treeInstance"] & DragAndDropFeatureDef<T>["treeInstance"] & HotkeysCoreFeatureDef<T>["treeInstance"] & SyncDataLoaderFeatureDef<T>["treeInstance"] & AsyncDataLoaderFeatureDef<T>["treeInstance"] & SearchFeatureDef<T>["treeInstance"] & RenamingFeatureDef<T>["treeInstance"] & ExpandAllFeatureDef["treeInstance"];
44
+ export interface TreeInstance<T> extends TreeInstanceType<T> {
45
+ }
46
+ type ItemInstanceType<T> = MainFeatureDef["itemInstance"] & TreeFeatureDef<T>["itemInstance"] & SelectionFeatureDef<T>["itemInstance"] & DragAndDropFeatureDef<T>["itemInstance"] & HotkeysCoreFeatureDef<T>["itemInstance"] & SyncDataLoaderFeatureDef<T>["itemInstance"] & AsyncDataLoaderFeatureDef<T>["itemInstance"] & SearchFeatureDef<T>["itemInstance"] & RenamingFeatureDef<T>["itemInstance"] & ExpandAllFeatureDef["itemInstance"];
47
+ export interface ItemInstance<T> extends ItemInstanceType<T> {
48
+ }
49
+ export type HotkeyName<F extends FeatureDef = FeatureDefs<any>> = MergedFeatures<F>["hotkeys"];
50
+ export type HotkeysConfig<T, F extends FeatureDef = FeatureDefs<T>> = Record<HotkeyName<F>, HotkeyConfig<T>>;
51
+ export type CustomHotkeysConfig<T, F extends FeatureDef = FeatureDefs<T>> = Partial<Record<HotkeyName<F> | `custom${string}`, Partial<HotkeyConfig<T>>>>;
52
+ export type FeatureImplementation<T = any, D extends FeatureDef = any, F extends FeatureDef = EmptyFeatureDef> = {
53
+ key?: string;
54
+ deps?: string[];
55
+ overwrites?: string[];
56
+ stateHandlerNames?: Partial<Record<keyof MergedFeatures<F>["state"], keyof MergedFeatures<F>["config"]>>;
57
+ getInitialState?: (initialState: Partial<MergedFeatures<F>["state"]>, tree: MergedFeatures<F>["treeInstance"]) => Partial<D["state"] & MergedFeatures<F>["state"]>;
58
+ getDefaultConfig?: (defaultConfig: Partial<MergedFeatures<F>["config"]>, tree: MergedFeatures<F>["treeInstance"]) => Partial<D["config"] & MergedFeatures<F>["config"]>;
59
+ createTreeInstance?: (prev: MergedFeatures<F>["treeInstance"], instance: MergedFeatures<F>["treeInstance"]) => D["treeInstance"] & MergedFeatures<F>["treeInstance"];
60
+ createItemInstance?: (prev: MergedFeatures<F>["itemInstance"], item: MergedFeatures<F>["itemInstance"], tree: MergedFeatures<F>["treeInstance"], itemId: string) => D["itemInstance"] & MergedFeatures<F>["itemInstance"];
61
+ onTreeMount?: (instance: MergedFeatures<F>["treeInstance"], treeElement: HTMLElement) => void;
62
+ onTreeUnmount?: (instance: MergedFeatures<F>["treeInstance"], treeElement: HTMLElement) => void;
63
+ onItemMount?: (instance: MergedFeatures<F>["itemInstance"], itemElement: HTMLElement, tree: MergedFeatures<F>["treeInstance"]) => void;
64
+ onItemUnmount?: (instance: MergedFeatures<F>["itemInstance"], itemElement: HTMLElement, tree: MergedFeatures<F>["treeInstance"]) => void;
65
+ hotkeys?: HotkeysConfig<T, D>;
66
+ };
67
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,13 @@
1
+ type TAllKeys<T> = T extends any ? keyof T : never;
2
+ type TIndexValue<T, K extends PropertyKey, D = never> = T extends any ? K extends keyof T ? T[K] : D : never;
3
+ type TPartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>> extends infer O ? {
4
+ [P in keyof O]: O[P];
5
+ } : never;
6
+ type TFunction = (...a: any[]) => any;
7
+ type TPrimitives = string | number | boolean | bigint | symbol | Date | TFunction;
8
+ export type TMerged<T> = [T] extends [Array<any>] ? {
9
+ [K in keyof T]: TMerged<T[K]>;
10
+ } : [T] extends [TPrimitives] ? T : [T] extends [object] ? TPartialKeys<{
11
+ [K in TAllKeys<T>]: TMerged<TIndexValue<T, K>>;
12
+ }, never> : T;
13
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ import { ItemInstance } from "../types/core";
2
+ import { DropTarget } from "../features/drag-and-drop/types";
3
+ export declare const createOnDropHandler: <T>(onChangeChildren: (item: ItemInstance<T>, newChildren: string[]) => void) => (items: ItemInstance<T>[], target: DropTarget<T>) => void;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOnDropHandler = void 0;
4
+ const remove_items_from_parents_1 = require("./remove-items-from-parents");
5
+ const insert_items_at_target_1 = require("./insert-items-at-target");
6
+ const createOnDropHandler = (onChangeChildren) => (items, target) => {
7
+ const itemIds = items.map((item) => item.getId());
8
+ (0, remove_items_from_parents_1.removeItemsFromParents)(items, onChangeChildren);
9
+ (0, insert_items_at_target_1.insertItemsAtTarget)(itemIds, target, onChangeChildren);
10
+ };
11
+ exports.createOnDropHandler = createOnDropHandler;
@@ -0,0 +1,3 @@
1
+ import { ItemInstance } from "../types/core";
2
+ import { DropTarget } from "../features/drag-and-drop/types";
3
+ export declare const insertItemsAtTarget: <T>(itemIds: string[], target: DropTarget<T>, onChangeChildren: (item: ItemInstance<T>, newChildrenIds: string[]) => void) => void;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.insertItemsAtTarget = void 0;
4
+ const insertItemsAtTarget = (itemIds, target, onChangeChildren) => {
5
+ // add moved items to new common parent, if dropped onto parent
6
+ if (target.childIndex === null) {
7
+ onChangeChildren(target.item, [
8
+ ...target.item.getChildren().map((item) => item.getId()),
9
+ ...itemIds,
10
+ ]);
11
+ // TODO items[0].getTree().rebuildTree();
12
+ return;
13
+ }
14
+ // add moved items to new common parent, if dropped between siblings
15
+ const oldChildren = target.item.getChildren();
16
+ const newChildren = [
17
+ ...oldChildren.slice(0, target.insertionIndex).map((item) => item.getId()),
18
+ ...itemIds,
19
+ ...oldChildren.slice(target.insertionIndex).map((item) => item.getId()),
20
+ ];
21
+ onChangeChildren(target.item, newChildren);
22
+ target.item.getTree().rebuildTree();
23
+ };
24
+ exports.insertItemsAtTarget = insertItemsAtTarget;
@@ -0,0 +1,2 @@
1
+ import { ItemInstance } from "../types/core";
2
+ export declare const removeItemsFromParents: <T>(movedItems: ItemInstance<T>[], onChangeChildren: (item: ItemInstance<T>, newChildrenIds: string[]) => void) => void;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.removeItemsFromParents = void 0;
4
+ const removeItemsFromParents = (movedItems, onChangeChildren) => {
5
+ var _a;
6
+ // TODO bulk sibling changes together
7
+ for (const item of movedItems) {
8
+ const siblings = (_a = item.getParent()) === null || _a === void 0 ? void 0 : _a.getChildren();
9
+ if (siblings) {
10
+ onChangeChildren(item.getParent(), siblings
11
+ .filter((sibling) => sibling.getId() !== item.getId())
12
+ .map((i) => i.getId()));
13
+ }
14
+ }
15
+ movedItems[0].getTree().rebuildTree();
16
+ };
17
+ exports.removeItemsFromParents = removeItemsFromParents;
@@ -0,0 +1,6 @@
1
+ import { TreeState, Updater } from "./types/core";
2
+ export type NoInfer<T> = [T][T extends any ? 0 : never];
3
+ export declare const memo: <D extends readonly any[], R>(fn: (...args_0: D) => R, deps: () => [...D]) => () => R;
4
+ export declare function functionalUpdate<T>(updater: Updater<T>, input: T): T;
5
+ export declare function makeStateUpdater<K extends keyof TreeState<any>>(key: K, instance: unknown): (updater: Updater<TreeState<any>[K]>) => void;
6
+ export declare const poll: (fn: () => boolean, interval?: number, timeout?: number) => Promise<void>;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.poll = exports.makeStateUpdater = exports.functionalUpdate = exports.memo = void 0;
4
+ const memo = (fn, deps) => {
5
+ let value;
6
+ let oldDeps = null;
7
+ return () => {
8
+ const newDeps = deps();
9
+ if (!value) {
10
+ value = fn(...newDeps);
11
+ oldDeps = newDeps;
12
+ return value;
13
+ }
14
+ const match = oldDeps &&
15
+ oldDeps.length === newDeps.length &&
16
+ !oldDeps.some((dep, i) => dep !== newDeps[i]);
17
+ if (match) {
18
+ return value;
19
+ }
20
+ value = fn(...newDeps);
21
+ oldDeps = newDeps;
22
+ return value;
23
+ };
24
+ };
25
+ exports.memo = memo;
26
+ function functionalUpdate(updater, input) {
27
+ return typeof updater === "function"
28
+ ? updater(input)
29
+ : updater;
30
+ }
31
+ exports.functionalUpdate = functionalUpdate;
32
+ function makeStateUpdater(key, instance) {
33
+ return (updater) => {
34
+ instance.setState((old) => {
35
+ return Object.assign(Object.assign({}, old), { [key]: functionalUpdate(updater, old[key]) });
36
+ });
37
+ };
38
+ }
39
+ exports.makeStateUpdater = makeStateUpdater;
40
+ const poll = (fn, interval = 100, timeout = 1000) => new Promise((resolve) => {
41
+ let clear;
42
+ const i = setInterval(() => {
43
+ if (fn()) {
44
+ resolve();
45
+ clearInterval(i);
46
+ clearTimeout(clear);
47
+ }
48
+ }, interval);
49
+ clear = setTimeout(() => {
50
+ clearInterval(i);
51
+ }, timeout);
52
+ });
53
+ exports.poll = poll;
@@ -0,0 +1,2 @@
1
+ import { TreeConfig, TreeInstance } from "../types/core";
2
+ export declare const createTree: <T>(initialConfig: TreeConfig<T>) => TreeInstance<T>;