@headless-tree/core 1.2.1 → 1.4.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.
Files changed (190) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/index.d.mts +580 -0
  3. package/dist/index.d.ts +580 -0
  4. package/dist/index.js +2347 -0
  5. package/dist/index.mjs +2302 -0
  6. package/package.json +18 -10
  7. package/src/core/create-tree.ts +26 -15
  8. package/src/features/async-data-loader/feature.ts +5 -0
  9. package/src/features/async-data-loader/types.ts +2 -0
  10. package/src/features/checkboxes/checkboxes.spec.ts +20 -5
  11. package/src/features/checkboxes/feature.ts +31 -16
  12. package/src/features/checkboxes/types.ts +1 -0
  13. package/src/features/drag-and-drop/drag-and-drop.spec.ts +11 -2
  14. package/src/features/drag-and-drop/feature.ts +107 -24
  15. package/src/features/drag-and-drop/types.ts +21 -0
  16. package/src/features/drag-and-drop/utils.ts +8 -6
  17. package/src/features/keyboard-drag-and-drop/feature.ts +10 -1
  18. package/src/features/keyboard-drag-and-drop/keyboard-drag-and-drop.spec.ts +34 -3
  19. package/src/features/main/types.ts +0 -2
  20. package/src/features/sync-data-loader/feature.ts +5 -1
  21. package/src/features/tree/feature.ts +4 -3
  22. package/src/features/tree/tree.spec.ts +14 -4
  23. package/src/test-utils/test-tree-do.ts +2 -0
  24. package/src/test-utils/test-tree.ts +1 -0
  25. package/tsconfig.json +1 -4
  26. package/vitest.config.ts +3 -1
  27. package/lib/cjs/core/build-proxified-instance.d.ts +0 -2
  28. package/lib/cjs/core/build-proxified-instance.js +0 -58
  29. package/lib/cjs/core/build-static-instance.d.ts +0 -2
  30. package/lib/cjs/core/build-static-instance.js +0 -26
  31. package/lib/cjs/core/create-tree.d.ts +0 -2
  32. package/lib/cjs/core/create-tree.js +0 -191
  33. package/lib/cjs/features/async-data-loader/feature.d.ts +0 -2
  34. package/lib/cjs/features/async-data-loader/feature.js +0 -135
  35. package/lib/cjs/features/async-data-loader/types.d.ts +0 -47
  36. package/lib/cjs/features/async-data-loader/types.js +0 -2
  37. package/lib/cjs/features/checkboxes/feature.d.ts +0 -2
  38. package/lib/cjs/features/checkboxes/feature.js +0 -94
  39. package/lib/cjs/features/checkboxes/types.d.ts +0 -26
  40. package/lib/cjs/features/checkboxes/types.js +0 -9
  41. package/lib/cjs/features/drag-and-drop/feature.d.ts +0 -2
  42. package/lib/cjs/features/drag-and-drop/feature.js +0 -205
  43. package/lib/cjs/features/drag-and-drop/types.d.ts +0 -71
  44. package/lib/cjs/features/drag-and-drop/types.js +0 -9
  45. package/lib/cjs/features/drag-and-drop/utils.d.ts +0 -27
  46. package/lib/cjs/features/drag-and-drop/utils.js +0 -182
  47. package/lib/cjs/features/expand-all/feature.d.ts +0 -2
  48. package/lib/cjs/features/expand-all/feature.js +0 -70
  49. package/lib/cjs/features/expand-all/types.d.ts +0 -19
  50. package/lib/cjs/features/expand-all/types.js +0 -2
  51. package/lib/cjs/features/hotkeys-core/feature.d.ts +0 -2
  52. package/lib/cjs/features/hotkeys-core/feature.js +0 -107
  53. package/lib/cjs/features/hotkeys-core/types.d.ts +0 -27
  54. package/lib/cjs/features/hotkeys-core/types.js +0 -2
  55. package/lib/cjs/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  56. package/lib/cjs/features/keyboard-drag-and-drop/feature.js +0 -206
  57. package/lib/cjs/features/keyboard-drag-and-drop/types.d.ts +0 -27
  58. package/lib/cjs/features/keyboard-drag-and-drop/types.js +0 -11
  59. package/lib/cjs/features/main/types.d.ts +0 -47
  60. package/lib/cjs/features/main/types.js +0 -2
  61. package/lib/cjs/features/prop-memoization/feature.d.ts +0 -2
  62. package/lib/cjs/features/prop-memoization/feature.js +0 -70
  63. package/lib/cjs/features/prop-memoization/types.d.ts +0 -15
  64. package/lib/cjs/features/prop-memoization/types.js +0 -2
  65. package/lib/cjs/features/renaming/feature.d.ts +0 -2
  66. package/lib/cjs/features/renaming/feature.js +0 -86
  67. package/lib/cjs/features/renaming/types.d.ts +0 -27
  68. package/lib/cjs/features/renaming/types.js +0 -2
  69. package/lib/cjs/features/search/feature.d.ts +0 -2
  70. package/lib/cjs/features/search/feature.js +0 -119
  71. package/lib/cjs/features/search/types.d.ts +0 -32
  72. package/lib/cjs/features/search/types.js +0 -2
  73. package/lib/cjs/features/selection/feature.d.ts +0 -2
  74. package/lib/cjs/features/selection/feature.js +0 -132
  75. package/lib/cjs/features/selection/types.d.ts +0 -21
  76. package/lib/cjs/features/selection/types.js +0 -2
  77. package/lib/cjs/features/sync-data-loader/feature.d.ts +0 -2
  78. package/lib/cjs/features/sync-data-loader/feature.js +0 -49
  79. package/lib/cjs/features/sync-data-loader/types.d.ts +0 -28
  80. package/lib/cjs/features/sync-data-loader/types.js +0 -2
  81. package/lib/cjs/features/tree/feature.d.ts +0 -2
  82. package/lib/cjs/features/tree/feature.js +0 -244
  83. package/lib/cjs/features/tree/types.d.ts +0 -63
  84. package/lib/cjs/features/tree/types.js +0 -2
  85. package/lib/cjs/index.d.ts +0 -33
  86. package/lib/cjs/index.js +0 -51
  87. package/lib/cjs/mddocs-entry.d.ts +0 -121
  88. package/lib/cjs/mddocs-entry.js +0 -17
  89. package/lib/cjs/test-utils/test-tree-do.d.ts +0 -23
  90. package/lib/cjs/test-utils/test-tree-do.js +0 -112
  91. package/lib/cjs/test-utils/test-tree-expect.d.ts +0 -17
  92. package/lib/cjs/test-utils/test-tree-expect.js +0 -66
  93. package/lib/cjs/test-utils/test-tree.d.ts +0 -48
  94. package/lib/cjs/test-utils/test-tree.js +0 -207
  95. package/lib/cjs/types/core.d.ts +0 -84
  96. package/lib/cjs/types/core.js +0 -2
  97. package/lib/cjs/types/deep-merge.d.ts +0 -13
  98. package/lib/cjs/types/deep-merge.js +0 -2
  99. package/lib/cjs/utilities/create-on-drop-handler.d.ts +0 -3
  100. package/lib/cjs/utilities/create-on-drop-handler.js +0 -20
  101. package/lib/cjs/utilities/errors.d.ts +0 -2
  102. package/lib/cjs/utilities/errors.js +0 -9
  103. package/lib/cjs/utilities/insert-items-at-target.d.ts +0 -3
  104. package/lib/cjs/utilities/insert-items-at-target.js +0 -40
  105. package/lib/cjs/utilities/remove-items-from-parents.d.ts +0 -2
  106. package/lib/cjs/utilities/remove-items-from-parents.js +0 -32
  107. package/lib/cjs/utils.d.ts +0 -6
  108. package/lib/cjs/utils.js +0 -53
  109. package/lib/esm/core/build-proxified-instance.d.ts +0 -2
  110. package/lib/esm/core/build-proxified-instance.js +0 -54
  111. package/lib/esm/core/build-static-instance.d.ts +0 -2
  112. package/lib/esm/core/build-static-instance.js +0 -22
  113. package/lib/esm/core/create-tree.d.ts +0 -2
  114. package/lib/esm/core/create-tree.js +0 -187
  115. package/lib/esm/features/async-data-loader/feature.d.ts +0 -2
  116. package/lib/esm/features/async-data-loader/feature.js +0 -132
  117. package/lib/esm/features/async-data-loader/types.d.ts +0 -47
  118. package/lib/esm/features/async-data-loader/types.js +0 -1
  119. package/lib/esm/features/checkboxes/feature.d.ts +0 -2
  120. package/lib/esm/features/checkboxes/feature.js +0 -91
  121. package/lib/esm/features/checkboxes/types.d.ts +0 -26
  122. package/lib/esm/features/checkboxes/types.js +0 -6
  123. package/lib/esm/features/drag-and-drop/feature.d.ts +0 -2
  124. package/lib/esm/features/drag-and-drop/feature.js +0 -202
  125. package/lib/esm/features/drag-and-drop/types.d.ts +0 -71
  126. package/lib/esm/features/drag-and-drop/types.js +0 -6
  127. package/lib/esm/features/drag-and-drop/utils.d.ts +0 -27
  128. package/lib/esm/features/drag-and-drop/utils.js +0 -172
  129. package/lib/esm/features/expand-all/feature.d.ts +0 -2
  130. package/lib/esm/features/expand-all/feature.js +0 -67
  131. package/lib/esm/features/expand-all/types.d.ts +0 -19
  132. package/lib/esm/features/expand-all/types.js +0 -1
  133. package/lib/esm/features/hotkeys-core/feature.d.ts +0 -2
  134. package/lib/esm/features/hotkeys-core/feature.js +0 -104
  135. package/lib/esm/features/hotkeys-core/types.d.ts +0 -27
  136. package/lib/esm/features/hotkeys-core/types.js +0 -1
  137. package/lib/esm/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  138. package/lib/esm/features/keyboard-drag-and-drop/feature.js +0 -203
  139. package/lib/esm/features/keyboard-drag-and-drop/types.d.ts +0 -27
  140. package/lib/esm/features/keyboard-drag-and-drop/types.js +0 -8
  141. package/lib/esm/features/main/types.d.ts +0 -47
  142. package/lib/esm/features/main/types.js +0 -1
  143. package/lib/esm/features/prop-memoization/feature.d.ts +0 -2
  144. package/lib/esm/features/prop-memoization/feature.js +0 -67
  145. package/lib/esm/features/prop-memoization/types.d.ts +0 -15
  146. package/lib/esm/features/prop-memoization/types.js +0 -1
  147. package/lib/esm/features/renaming/feature.d.ts +0 -2
  148. package/lib/esm/features/renaming/feature.js +0 -83
  149. package/lib/esm/features/renaming/types.d.ts +0 -27
  150. package/lib/esm/features/renaming/types.js +0 -1
  151. package/lib/esm/features/search/feature.d.ts +0 -2
  152. package/lib/esm/features/search/feature.js +0 -116
  153. package/lib/esm/features/search/types.d.ts +0 -32
  154. package/lib/esm/features/search/types.js +0 -1
  155. package/lib/esm/features/selection/feature.d.ts +0 -2
  156. package/lib/esm/features/selection/feature.js +0 -129
  157. package/lib/esm/features/selection/types.d.ts +0 -21
  158. package/lib/esm/features/selection/types.js +0 -1
  159. package/lib/esm/features/sync-data-loader/feature.d.ts +0 -2
  160. package/lib/esm/features/sync-data-loader/feature.js +0 -46
  161. package/lib/esm/features/sync-data-loader/types.d.ts +0 -28
  162. package/lib/esm/features/sync-data-loader/types.js +0 -1
  163. package/lib/esm/features/tree/feature.d.ts +0 -2
  164. package/lib/esm/features/tree/feature.js +0 -241
  165. package/lib/esm/features/tree/types.d.ts +0 -63
  166. package/lib/esm/features/tree/types.js +0 -1
  167. package/lib/esm/index.d.ts +0 -33
  168. package/lib/esm/index.js +0 -32
  169. package/lib/esm/mddocs-entry.d.ts +0 -121
  170. package/lib/esm/mddocs-entry.js +0 -1
  171. package/lib/esm/test-utils/test-tree-do.d.ts +0 -23
  172. package/lib/esm/test-utils/test-tree-do.js +0 -108
  173. package/lib/esm/test-utils/test-tree-expect.d.ts +0 -17
  174. package/lib/esm/test-utils/test-tree-expect.js +0 -62
  175. package/lib/esm/test-utils/test-tree.d.ts +0 -48
  176. package/lib/esm/test-utils/test-tree.js +0 -203
  177. package/lib/esm/types/core.d.ts +0 -84
  178. package/lib/esm/types/core.js +0 -1
  179. package/lib/esm/types/deep-merge.d.ts +0 -13
  180. package/lib/esm/types/deep-merge.js +0 -1
  181. package/lib/esm/utilities/create-on-drop-handler.d.ts +0 -3
  182. package/lib/esm/utilities/create-on-drop-handler.js +0 -16
  183. package/lib/esm/utilities/errors.d.ts +0 -2
  184. package/lib/esm/utilities/errors.js +0 -4
  185. package/lib/esm/utilities/insert-items-at-target.d.ts +0 -3
  186. package/lib/esm/utilities/insert-items-at-target.js +0 -36
  187. package/lib/esm/utilities/remove-items-from-parents.d.ts +0 -2
  188. package/lib/esm/utilities/remove-items-from-parents.js +0 -28
  189. package/lib/esm/utils.d.ts +0 -6
  190. package/lib/esm/utils.js +0 -46
package/dist/index.js ADDED
@@ -0,0 +1,2347 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
10
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
+ var __spreadValues = (a, b) => {
12
+ for (var prop in b || (b = {}))
13
+ if (__hasOwnProp.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ if (__getOwnPropSymbols)
16
+ for (var prop of __getOwnPropSymbols(b)) {
17
+ if (__propIsEnum.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ }
20
+ return a;
21
+ };
22
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
23
+ var __export = (target, all) => {
24
+ for (var name in all)
25
+ __defProp(target, name, { get: all[name], enumerable: true });
26
+ };
27
+ var __copyProps = (to, from, except, desc) => {
28
+ if (from && typeof from === "object" || typeof from === "function") {
29
+ for (let key of __getOwnPropNames(from))
30
+ if (!__hasOwnProp.call(to, key) && key !== except)
31
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
32
+ }
33
+ return to;
34
+ };
35
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
36
+ var __async = (__this, __arguments, generator) => {
37
+ return new Promise((resolve, reject) => {
38
+ var fulfilled = (value) => {
39
+ try {
40
+ step(generator.next(value));
41
+ } catch (e) {
42
+ reject(e);
43
+ }
44
+ };
45
+ var rejected = (value) => {
46
+ try {
47
+ step(generator.throw(value));
48
+ } catch (e) {
49
+ reject(e);
50
+ }
51
+ };
52
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
53
+ step((generator = generator.apply(__this, __arguments)).next());
54
+ });
55
+ };
56
+
57
+ // src/index.ts
58
+ var index_exports = {};
59
+ __export(index_exports, {
60
+ AssistiveDndState: () => AssistiveDndState,
61
+ CheckedState: () => CheckedState,
62
+ DragTargetPosition: () => DragTargetPosition,
63
+ asyncDataLoaderFeature: () => asyncDataLoaderFeature,
64
+ buildProxiedInstance: () => buildProxiedInstance,
65
+ buildStaticInstance: () => buildStaticInstance,
66
+ checkboxesFeature: () => checkboxesFeature,
67
+ createOnDropHandler: () => createOnDropHandler,
68
+ createTree: () => createTree,
69
+ dragAndDropFeature: () => dragAndDropFeature,
70
+ expandAllFeature: () => expandAllFeature,
71
+ hotkeysCoreFeature: () => hotkeysCoreFeature,
72
+ insertItemsAtTarget: () => insertItemsAtTarget,
73
+ isOrderedDragTarget: () => isOrderedDragTarget,
74
+ keyboardDragAndDropFeature: () => keyboardDragAndDropFeature,
75
+ makeStateUpdater: () => makeStateUpdater,
76
+ propMemoizationFeature: () => propMemoizationFeature,
77
+ removeItemsFromParents: () => removeItemsFromParents,
78
+ renamingFeature: () => renamingFeature,
79
+ searchFeature: () => searchFeature,
80
+ selectionFeature: () => selectionFeature,
81
+ syncDataLoaderFeature: () => syncDataLoaderFeature
82
+ });
83
+ module.exports = __toCommonJS(index_exports);
84
+
85
+ // src/utils.ts
86
+ var memo = (deps, fn) => {
87
+ let value;
88
+ let oldDeps = null;
89
+ return (...a) => {
90
+ const newDeps = deps(...a);
91
+ if (!value) {
92
+ value = fn(...newDeps);
93
+ oldDeps = newDeps;
94
+ return value;
95
+ }
96
+ const match = oldDeps && oldDeps.length === newDeps.length && !oldDeps.some((dep, i) => dep !== newDeps[i]);
97
+ if (match) {
98
+ return value;
99
+ }
100
+ value = fn(...newDeps);
101
+ oldDeps = newDeps;
102
+ return value;
103
+ };
104
+ };
105
+ function functionalUpdate(updater, input) {
106
+ return typeof updater === "function" ? updater(input) : updater;
107
+ }
108
+ function makeStateUpdater(key, instance) {
109
+ return (updater) => {
110
+ instance.setState((old) => {
111
+ return __spreadProps(__spreadValues({}, old), {
112
+ [key]: functionalUpdate(updater, old[key])
113
+ });
114
+ });
115
+ };
116
+ }
117
+ var poll = (fn, interval = 100, timeout = 1e3) => new Promise((resolve) => {
118
+ let clear;
119
+ const i = setInterval(() => {
120
+ if (fn()) {
121
+ resolve();
122
+ clearInterval(i);
123
+ clearTimeout(clear);
124
+ }
125
+ }, interval);
126
+ clear = setTimeout(() => {
127
+ clearInterval(i);
128
+ }, timeout);
129
+ });
130
+
131
+ // src/utilities/errors.ts
132
+ var prefix = "Headless Tree: ";
133
+ var throwError = (message) => Error(prefix + message);
134
+ var logWarning = (message) => console.warn(prefix + message);
135
+
136
+ // src/features/tree/feature.ts
137
+ var treeFeature = {
138
+ key: "tree",
139
+ getInitialState: (initialState) => __spreadValues({
140
+ expandedItems: [],
141
+ focusedItem: null
142
+ }, initialState),
143
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
144
+ setExpandedItems: makeStateUpdater("expandedItems", tree),
145
+ setFocusedItem: makeStateUpdater("focusedItem", tree)
146
+ }, defaultConfig),
147
+ stateHandlerNames: {
148
+ expandedItems: "setExpandedItems",
149
+ focusedItem: "setFocusedItem"
150
+ },
151
+ treeInstance: {
152
+ getItemsMeta: ({ tree }) => {
153
+ const { rootItemId } = tree.getConfig();
154
+ const { expandedItems } = tree.getState();
155
+ const flatItems = [];
156
+ const expandedItemsSet = new Set(expandedItems);
157
+ const recursiveAdd = (itemId, path, level, setSize, posInSet) => {
158
+ var _a;
159
+ if (path.includes(itemId)) {
160
+ logWarning(`Circular reference for ${path.join(".")}`);
161
+ return;
162
+ }
163
+ flatItems.push({
164
+ itemId,
165
+ level,
166
+ index: flatItems.length,
167
+ parentId: path.at(-1),
168
+ setSize,
169
+ posInSet
170
+ });
171
+ if (expandedItemsSet.has(itemId)) {
172
+ const children2 = (_a = tree.retrieveChildrenIds(itemId)) != null ? _a : [];
173
+ let i2 = 0;
174
+ for (const childId of children2) {
175
+ recursiveAdd(
176
+ childId,
177
+ path.concat(itemId),
178
+ level + 1,
179
+ children2.length,
180
+ i2++
181
+ );
182
+ }
183
+ }
184
+ };
185
+ const children = tree.retrieveChildrenIds(rootItemId);
186
+ let i = 0;
187
+ for (const itemId of children) {
188
+ recursiveAdd(itemId, [rootItemId], 0, children.length, i++);
189
+ }
190
+ return flatItems;
191
+ },
192
+ getFocusedItem: ({ tree }) => {
193
+ var _a;
194
+ const focusedItemId = tree.getState().focusedItem;
195
+ return (_a = focusedItemId !== null ? tree.getItemInstance(focusedItemId) : null) != null ? _a : tree.getItems()[0];
196
+ },
197
+ getRootItem: ({ tree }) => {
198
+ const { rootItemId } = tree.getConfig();
199
+ return tree.getItemInstance(rootItemId);
200
+ },
201
+ focusNextItem: ({ tree }) => {
202
+ var _a;
203
+ const focused = tree.getFocusedItem().getItemMeta();
204
+ if (!focused) return;
205
+ const nextIndex = Math.min(focused.index + 1, tree.getItems().length - 1);
206
+ (_a = tree.getItems()[nextIndex]) == null ? void 0 : _a.setFocused();
207
+ },
208
+ focusPreviousItem: ({ tree }) => {
209
+ var _a;
210
+ const focused = tree.getFocusedItem().getItemMeta();
211
+ if (!focused) return;
212
+ const nextIndex = Math.max(focused.index - 1, 0);
213
+ (_a = tree.getItems()[nextIndex]) == null ? void 0 : _a.setFocused();
214
+ },
215
+ updateDomFocus: ({ tree }) => {
216
+ setTimeout(() => __async(null, null, function* () {
217
+ var _a, _b;
218
+ const focusedItem = tree.getFocusedItem();
219
+ (_b = (_a = tree.getConfig()).scrollToItem) == null ? void 0 : _b.call(_a, focusedItem);
220
+ yield poll(() => focusedItem.getElement() !== null, 20);
221
+ const focusedElement = focusedItem.getElement();
222
+ if (!focusedElement) return;
223
+ focusedElement.focus();
224
+ }));
225
+ },
226
+ getContainerProps: ({ prev, tree }, treeLabel) => __spreadProps(__spreadValues({}, prev == null ? void 0 : prev()), {
227
+ role: "tree",
228
+ "aria-label": treeLabel != null ? treeLabel : "",
229
+ ref: tree.registerElement
230
+ }),
231
+ // relevant for hotkeys of this feature
232
+ isSearchOpen: () => false
233
+ },
234
+ itemInstance: {
235
+ scrollTo: (_0, _1) => __async(null, [_0, _1], function* ({ tree, item }, scrollIntoViewArg) {
236
+ var _a, _b, _c;
237
+ (_b = (_a = tree.getConfig()).scrollToItem) == null ? void 0 : _b.call(_a, item);
238
+ yield poll(() => item.getElement() !== null, 20);
239
+ (_c = item.getElement()) == null ? void 0 : _c.scrollIntoView(scrollIntoViewArg);
240
+ }),
241
+ getId: ({ itemId }) => itemId,
242
+ getKey: ({ itemId }) => itemId,
243
+ // TODO apply to all stories to use
244
+ getProps: ({ item, prev }) => {
245
+ const itemMeta = item.getItemMeta();
246
+ return __spreadProps(__spreadValues({}, prev == null ? void 0 : prev()), {
247
+ ref: item.registerElement,
248
+ role: "treeitem",
249
+ "aria-setsize": itemMeta.setSize,
250
+ "aria-posinset": itemMeta.posInSet + 1,
251
+ "aria-selected": "false",
252
+ "aria-label": item.getItemName(),
253
+ "aria-level": itemMeta.level + 1,
254
+ tabIndex: item.isFocused() ? 0 : -1,
255
+ onClick: (e) => {
256
+ item.setFocused();
257
+ item.primaryAction();
258
+ if (e.ctrlKey || e.shiftKey || e.metaKey) {
259
+ return;
260
+ }
261
+ if (!item.isFolder()) {
262
+ return;
263
+ }
264
+ if (item.isExpanded()) {
265
+ item.collapse();
266
+ } else {
267
+ item.expand();
268
+ }
269
+ }
270
+ });
271
+ },
272
+ expand: ({ tree, item, itemId }) => {
273
+ var _a;
274
+ if (!item.isFolder()) {
275
+ return;
276
+ }
277
+ if ((_a = tree.getState().loadingItemChildrens) == null ? void 0 : _a.includes(itemId)) {
278
+ return;
279
+ }
280
+ tree.applySubStateUpdate("expandedItems", (expandedItems) => [
281
+ ...expandedItems,
282
+ itemId
283
+ ]);
284
+ tree.rebuildTree();
285
+ },
286
+ collapse: ({ tree, item, itemId }) => {
287
+ if (!item.isFolder()) {
288
+ return;
289
+ }
290
+ tree.applySubStateUpdate(
291
+ "expandedItems",
292
+ (expandedItems) => expandedItems.filter((id) => id !== itemId)
293
+ );
294
+ tree.rebuildTree();
295
+ },
296
+ getItemData: ({ tree, itemId }) => tree.retrieveItemData(itemId),
297
+ equals: ({ item }, other) => item.getId() === (other == null ? void 0 : other.getId()),
298
+ isExpanded: ({ tree, itemId }) => tree.getState().expandedItems.includes(itemId),
299
+ isDescendentOf: ({ item }, parentId) => {
300
+ const parent = item.getParent();
301
+ return Boolean(
302
+ (parent == null ? void 0 : parent.getId()) === parentId || (parent == null ? void 0 : parent.isDescendentOf(parentId))
303
+ );
304
+ },
305
+ isFocused: ({ tree, item, itemId }) => tree.getState().focusedItem === itemId || tree.getState().focusedItem === null && item.getItemMeta().index === 0,
306
+ isFolder: ({ tree, item }) => item.getItemMeta().level === -1 || tree.getConfig().isItemFolder(item),
307
+ getItemName: ({ tree, item }) => {
308
+ const config = tree.getConfig();
309
+ return config.getItemName(item);
310
+ },
311
+ setFocused: ({ tree, itemId }) => {
312
+ tree.applySubStateUpdate("focusedItem", itemId);
313
+ },
314
+ primaryAction: ({ tree, item }) => {
315
+ var _a, _b;
316
+ return (_b = (_a = tree.getConfig()).onPrimaryAction) == null ? void 0 : _b.call(_a, item);
317
+ },
318
+ getParent: ({ tree, item }) => item.getItemMeta().parentId ? tree.getItemInstance(item.getItemMeta().parentId) : void 0,
319
+ getIndexInParent: ({ item }) => item.getItemMeta().posInSet,
320
+ getChildren: ({ tree, itemId }) => tree.retrieveChildrenIds(itemId).map((id) => tree.getItemInstance(id)),
321
+ getTree: ({ tree }) => tree,
322
+ getItemAbove: ({ tree, item }) => tree.getItems()[item.getItemMeta().index - 1],
323
+ getItemBelow: ({ tree, item }) => tree.getItems()[item.getItemMeta().index + 1]
324
+ },
325
+ hotkeys: {
326
+ focusNextItem: {
327
+ hotkey: "ArrowDown",
328
+ canRepeat: true,
329
+ preventDefault: true,
330
+ isEnabled: (tree) => {
331
+ var _a, _b;
332
+ return !((_b = (_a = tree.isSearchOpen) == null ? void 0 : _a.call(tree)) != null ? _b : false) && !tree.getState().dnd;
333
+ },
334
+ // TODO what happens when the feature doesnt exist? proxy method still claims to exist
335
+ handler: (e, tree) => {
336
+ tree.focusNextItem();
337
+ tree.updateDomFocus();
338
+ }
339
+ },
340
+ focusPreviousItem: {
341
+ hotkey: "ArrowUp",
342
+ canRepeat: true,
343
+ preventDefault: true,
344
+ isEnabled: (tree) => {
345
+ var _a, _b;
346
+ return !((_b = (_a = tree.isSearchOpen) == null ? void 0 : _a.call(tree)) != null ? _b : false) && !tree.getState().dnd;
347
+ },
348
+ handler: (e, tree) => {
349
+ tree.focusPreviousItem();
350
+ tree.updateDomFocus();
351
+ }
352
+ },
353
+ expandOrDown: {
354
+ hotkey: "ArrowRight",
355
+ canRepeat: true,
356
+ handler: (e, tree) => {
357
+ const item = tree.getFocusedItem();
358
+ if (item.isExpanded() || !item.isFolder()) {
359
+ tree.focusNextItem();
360
+ tree.updateDomFocus();
361
+ } else {
362
+ item.expand();
363
+ }
364
+ }
365
+ },
366
+ collapseOrUp: {
367
+ hotkey: "ArrowLeft",
368
+ canRepeat: true,
369
+ handler: (e, tree) => {
370
+ var _a;
371
+ const item = tree.getFocusedItem();
372
+ if ((!item.isExpanded() || !item.isFolder()) && item.getItemMeta().level !== 0) {
373
+ (_a = item.getParent()) == null ? void 0 : _a.setFocused();
374
+ tree.updateDomFocus();
375
+ } else {
376
+ item.collapse();
377
+ }
378
+ }
379
+ },
380
+ focusFirstItem: {
381
+ hotkey: "Home",
382
+ handler: (e, tree) => {
383
+ var _a;
384
+ (_a = tree.getItems()[0]) == null ? void 0 : _a.setFocused();
385
+ tree.updateDomFocus();
386
+ }
387
+ },
388
+ focusLastItem: {
389
+ hotkey: "End",
390
+ handler: (e, tree) => {
391
+ var _a;
392
+ (_a = tree.getItems()[tree.getItems().length - 1]) == null ? void 0 : _a.setFocused();
393
+ tree.updateDomFocus();
394
+ }
395
+ }
396
+ }
397
+ };
398
+
399
+ // src/core/build-static-instance.ts
400
+ var buildStaticInstance = (features, instanceType, buildOpts) => {
401
+ const instance = {};
402
+ const finalize = () => {
403
+ const opts = buildOpts(instance);
404
+ featureLoop: for (let i = 0; i < features.length; i++) {
405
+ const definition = features[i][instanceType];
406
+ if (!definition) continue featureLoop;
407
+ methodLoop: for (const [key, method] of Object.entries(definition)) {
408
+ if (!method) continue methodLoop;
409
+ const prev = instance[key];
410
+ instance[key] = (...args) => {
411
+ return method(__spreadProps(__spreadValues({}, opts), { prev }), ...args);
412
+ };
413
+ }
414
+ }
415
+ };
416
+ return [instance, finalize];
417
+ };
418
+
419
+ // src/core/create-tree.ts
420
+ var verifyFeatures = (features) => {
421
+ var _a;
422
+ const loadedFeatures = features == null ? void 0 : features.map((feature) => feature.key);
423
+ for (const feature of features != null ? features : []) {
424
+ const missingDependency = (_a = feature.deps) == null ? void 0 : _a.find(
425
+ (dep) => !(loadedFeatures == null ? void 0 : loadedFeatures.includes(dep))
426
+ );
427
+ if (missingDependency) {
428
+ throw throwError(`${feature.key} needs ${missingDependency}`);
429
+ }
430
+ }
431
+ };
432
+ var exhaustiveSort = (arr, compareFn) => {
433
+ const n = arr.length;
434
+ for (let i = 0; i < n; i++) {
435
+ for (let j = i + 1; j < n; j++) {
436
+ if (compareFn(arr[j], arr[i]) < 0) {
437
+ [arr[i], arr[j]] = [arr[j], arr[i]];
438
+ }
439
+ }
440
+ }
441
+ return arr;
442
+ };
443
+ var compareFeatures = (originalOrder) => (feature1, feature2) => {
444
+ var _a, _b;
445
+ if (feature2.key && ((_a = feature1.overwrites) == null ? void 0 : _a.includes(feature2.key))) {
446
+ return 1;
447
+ }
448
+ if (feature1.key && ((_b = feature2.overwrites) == null ? void 0 : _b.includes(feature1.key))) {
449
+ return -1;
450
+ }
451
+ return originalOrder.indexOf(feature1) - originalOrder.indexOf(feature2);
452
+ };
453
+ var sortFeatures = (features = []) => exhaustiveSort(features, compareFeatures(features));
454
+ var createTree = (initialConfig) => {
455
+ var _a, _b, _c, _d;
456
+ const buildInstance = (_a = initialConfig.instanceBuilder) != null ? _a : buildStaticInstance;
457
+ const additionalFeatures = [
458
+ treeFeature,
459
+ ...sortFeatures(initialConfig.features)
460
+ ];
461
+ verifyFeatures(additionalFeatures);
462
+ const features = [...additionalFeatures];
463
+ const [treeInstance, finalizeTree] = buildInstance(
464
+ features,
465
+ "treeInstance",
466
+ (tree) => ({ tree })
467
+ );
468
+ let state = additionalFeatures.reduce(
469
+ (acc, feature) => {
470
+ var _a2, _b2;
471
+ return (_b2 = (_a2 = feature.getInitialState) == null ? void 0 : _a2.call(feature, acc, treeInstance)) != null ? _b2 : acc;
472
+ },
473
+ (_c = (_b = initialConfig.initialState) != null ? _b : initialConfig.state) != null ? _c : {}
474
+ );
475
+ let config = additionalFeatures.reduce(
476
+ (acc, feature) => {
477
+ var _a2, _b2;
478
+ return (_b2 = (_a2 = feature.getDefaultConfig) == null ? void 0 : _a2.call(feature, acc, treeInstance)) != null ? _b2 : acc;
479
+ },
480
+ initialConfig
481
+ );
482
+ const stateHandlerNames = additionalFeatures.reduce(
483
+ (acc, feature) => __spreadValues(__spreadValues({}, acc), feature.stateHandlerNames),
484
+ {}
485
+ );
486
+ let treeElement;
487
+ const treeDataRef = { current: {} };
488
+ const itemInstancesMap = {};
489
+ let itemInstances = [];
490
+ const itemElementsMap = {};
491
+ const itemDataRefs = {};
492
+ let itemMetaMap = {};
493
+ const hotkeyPresets = {};
494
+ const rebuildItemMeta = () => {
495
+ itemInstances = [];
496
+ itemMetaMap = {};
497
+ const [rootInstance, finalizeRootInstance] = buildInstance(
498
+ features,
499
+ "itemInstance",
500
+ (item) => ({ item, tree: treeInstance, itemId: config.rootItemId })
501
+ );
502
+ finalizeRootInstance();
503
+ itemInstancesMap[config.rootItemId] = rootInstance;
504
+ itemMetaMap[config.rootItemId] = {
505
+ itemId: config.rootItemId,
506
+ index: -1,
507
+ parentId: null,
508
+ level: -1,
509
+ posInSet: 0,
510
+ setSize: 1
511
+ };
512
+ for (const item of treeInstance.getItemsMeta()) {
513
+ itemMetaMap[item.itemId] = item;
514
+ if (!itemInstancesMap[item.itemId]) {
515
+ const [instance, finalizeInstance] = buildInstance(
516
+ features,
517
+ "itemInstance",
518
+ (instance2) => ({
519
+ item: instance2,
520
+ tree: treeInstance,
521
+ itemId: item.itemId
522
+ })
523
+ );
524
+ finalizeInstance();
525
+ itemInstancesMap[item.itemId] = instance;
526
+ itemInstances.push(instance);
527
+ } else {
528
+ itemInstances.push(itemInstancesMap[item.itemId]);
529
+ }
530
+ }
531
+ };
532
+ const eachFeature = (fn) => {
533
+ for (const feature of additionalFeatures) {
534
+ fn(feature);
535
+ }
536
+ };
537
+ const mainFeature = {
538
+ key: "main",
539
+ treeInstance: {
540
+ getState: () => state,
541
+ setState: ({}, updater) => {
542
+ var _a2;
543
+ (_a2 = config.setState) == null ? void 0 : _a2.call(config, state);
544
+ },
545
+ applySubStateUpdate: ({}, stateName, updater) => {
546
+ state[stateName] = typeof updater === "function" ? updater(state[stateName]) : updater;
547
+ const externalStateSetter = config[stateHandlerNames[stateName]];
548
+ externalStateSetter == null ? void 0 : externalStateSetter(state[stateName]);
549
+ },
550
+ // TODO rebuildSubTree: (itemId: string) => void;
551
+ rebuildTree: () => {
552
+ var _a2;
553
+ rebuildItemMeta();
554
+ (_a2 = config.setState) == null ? void 0 : _a2.call(config, state);
555
+ },
556
+ getConfig: () => config,
557
+ setConfig: (_, updater) => {
558
+ var _a2, _b2, _c2;
559
+ const newConfig = typeof updater === "function" ? updater(config) : updater;
560
+ const hasChangedExpandedItems = ((_a2 = newConfig.state) == null ? void 0 : _a2.expandedItems) && ((_b2 = newConfig.state) == null ? void 0 : _b2.expandedItems) !== state.expandedItems;
561
+ config = newConfig;
562
+ if (newConfig.state) {
563
+ state = __spreadValues(__spreadValues({}, state), newConfig.state);
564
+ }
565
+ if (hasChangedExpandedItems) {
566
+ rebuildItemMeta();
567
+ (_c2 = config.setState) == null ? void 0 : _c2.call(config, state);
568
+ }
569
+ },
570
+ getItemInstance: ({}, itemId) => {
571
+ const existingInstance = itemInstancesMap[itemId];
572
+ if (!existingInstance) {
573
+ const [instance, finalizeInstance] = buildInstance(
574
+ features,
575
+ "itemInstance",
576
+ (instance2) => ({
577
+ item: instance2,
578
+ tree: treeInstance,
579
+ itemId
580
+ })
581
+ );
582
+ finalizeInstance();
583
+ return instance;
584
+ }
585
+ return existingInstance;
586
+ },
587
+ getItems: () => itemInstances,
588
+ registerElement: ({}, element) => {
589
+ if (treeElement === element) {
590
+ return;
591
+ }
592
+ if (treeElement && !element) {
593
+ eachFeature(
594
+ (feature) => {
595
+ var _a2;
596
+ return (_a2 = feature.onTreeUnmount) == null ? void 0 : _a2.call(feature, treeInstance, treeElement);
597
+ }
598
+ );
599
+ } else if (!treeElement && element) {
600
+ eachFeature(
601
+ (feature) => {
602
+ var _a2;
603
+ return (_a2 = feature.onTreeMount) == null ? void 0 : _a2.call(feature, treeInstance, element);
604
+ }
605
+ );
606
+ }
607
+ treeElement = element;
608
+ },
609
+ getElement: () => treeElement,
610
+ getDataRef: () => treeDataRef,
611
+ getHotkeyPresets: () => hotkeyPresets
612
+ },
613
+ itemInstance: {
614
+ registerElement: ({ itemId, item }, element) => {
615
+ if (itemElementsMap[itemId] === element) {
616
+ return;
617
+ }
618
+ const oldElement = itemElementsMap[itemId];
619
+ if (oldElement && !element) {
620
+ eachFeature(
621
+ (feature) => {
622
+ var _a2;
623
+ return (_a2 = feature.onItemUnmount) == null ? void 0 : _a2.call(feature, item, oldElement, treeInstance);
624
+ }
625
+ );
626
+ } else if (!oldElement && element) {
627
+ eachFeature(
628
+ (feature) => {
629
+ var _a2;
630
+ return (_a2 = feature.onItemMount) == null ? void 0 : _a2.call(feature, item, element, treeInstance);
631
+ }
632
+ );
633
+ }
634
+ itemElementsMap[itemId] = element;
635
+ },
636
+ getElement: ({ itemId }) => itemElementsMap[itemId],
637
+ // eslint-disable-next-line no-return-assign
638
+ getDataRef: ({ itemId }) => {
639
+ var _a2;
640
+ return (_a2 = itemDataRefs[itemId]) != null ? _a2 : itemDataRefs[itemId] = { current: {} };
641
+ },
642
+ getItemMeta: ({ itemId }) => {
643
+ var _a2;
644
+ return (_a2 = itemMetaMap[itemId]) != null ? _a2 : {
645
+ itemId,
646
+ parentId: null,
647
+ level: -1,
648
+ index: -1,
649
+ posInSet: 0,
650
+ setSize: 1
651
+ };
652
+ }
653
+ }
654
+ };
655
+ features.unshift(mainFeature);
656
+ for (const feature of features) {
657
+ Object.assign(hotkeyPresets, (_d = feature.hotkeys) != null ? _d : {});
658
+ }
659
+ finalizeTree();
660
+ return treeInstance;
661
+ };
662
+
663
+ // src/features/drag-and-drop/types.ts
664
+ var DragTargetPosition = /* @__PURE__ */ ((DragTargetPosition2) => {
665
+ DragTargetPosition2["Top"] = "top";
666
+ DragTargetPosition2["Bottom"] = "bottom";
667
+ DragTargetPosition2["Item"] = "item";
668
+ return DragTargetPosition2;
669
+ })(DragTargetPosition || {});
670
+
671
+ // src/features/keyboard-drag-and-drop/types.ts
672
+ var AssistiveDndState = /* @__PURE__ */ ((AssistiveDndState2) => {
673
+ AssistiveDndState2[AssistiveDndState2["None"] = 0] = "None";
674
+ AssistiveDndState2[AssistiveDndState2["Started"] = 1] = "Started";
675
+ AssistiveDndState2[AssistiveDndState2["Dragging"] = 2] = "Dragging";
676
+ AssistiveDndState2[AssistiveDndState2["Completed"] = 3] = "Completed";
677
+ AssistiveDndState2[AssistiveDndState2["Aborted"] = 4] = "Aborted";
678
+ return AssistiveDndState2;
679
+ })(AssistiveDndState || {});
680
+
681
+ // src/features/checkboxes/types.ts
682
+ var CheckedState = /* @__PURE__ */ ((CheckedState2) => {
683
+ CheckedState2["Checked"] = "checked";
684
+ CheckedState2["Unchecked"] = "unchecked";
685
+ CheckedState2["Indeterminate"] = "indeterminate";
686
+ return CheckedState2;
687
+ })(CheckedState || {});
688
+
689
+ // src/features/selection/feature.ts
690
+ var selectionFeature = {
691
+ key: "selection",
692
+ getInitialState: (initialState) => __spreadValues({
693
+ selectedItems: []
694
+ }, initialState),
695
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
696
+ setSelectedItems: makeStateUpdater("selectedItems", tree)
697
+ }, defaultConfig),
698
+ stateHandlerNames: {
699
+ selectedItems: "setSelectedItems"
700
+ },
701
+ treeInstance: {
702
+ setSelectedItems: ({ tree }, selectedItems) => {
703
+ tree.applySubStateUpdate("selectedItems", selectedItems);
704
+ },
705
+ getSelectedItems: ({ tree }) => {
706
+ return tree.getState().selectedItems.map(tree.getItemInstance);
707
+ }
708
+ },
709
+ itemInstance: {
710
+ select: ({ tree, itemId }) => {
711
+ const { selectedItems } = tree.getState();
712
+ tree.setSelectedItems(
713
+ selectedItems.includes(itemId) ? selectedItems : [...selectedItems, itemId]
714
+ );
715
+ },
716
+ deselect: ({ tree, itemId }) => {
717
+ const { selectedItems } = tree.getState();
718
+ tree.setSelectedItems(selectedItems.filter((id) => id !== itemId));
719
+ },
720
+ isSelected: ({ tree, itemId }) => {
721
+ const { selectedItems } = tree.getState();
722
+ return selectedItems.includes(itemId);
723
+ },
724
+ selectUpTo: ({ tree, item }, ctrl) => {
725
+ const indexA = item.getItemMeta().index;
726
+ const indexB = tree.getFocusedItem().getItemMeta().index;
727
+ const [a, b] = indexA < indexB ? [indexA, indexB] : [indexB, indexA];
728
+ const newSelectedItems = tree.getItems().slice(a, b + 1).map((treeItem) => treeItem.getItemMeta().itemId);
729
+ if (!ctrl) {
730
+ tree.setSelectedItems(newSelectedItems);
731
+ return;
732
+ }
733
+ const { selectedItems } = tree.getState();
734
+ const uniqueSelectedItems = [
735
+ .../* @__PURE__ */ new Set([...selectedItems, ...newSelectedItems])
736
+ ];
737
+ tree.setSelectedItems(uniqueSelectedItems);
738
+ },
739
+ toggleSelect: ({ item }) => {
740
+ if (item.isSelected()) {
741
+ item.deselect();
742
+ } else {
743
+ item.select();
744
+ }
745
+ },
746
+ getProps: ({ tree, item, prev }) => __spreadProps(__spreadValues({}, prev == null ? void 0 : prev()), {
747
+ "aria-selected": item.isSelected() ? "true" : "false",
748
+ onClick: (e) => {
749
+ var _a, _b;
750
+ if (e.shiftKey) {
751
+ item.selectUpTo(e.ctrlKey || e.metaKey);
752
+ } else if (e.ctrlKey || e.metaKey) {
753
+ item.toggleSelect();
754
+ } else {
755
+ tree.setSelectedItems([item.getItemMeta().itemId]);
756
+ }
757
+ (_b = (_a = prev == null ? void 0 : prev()) == null ? void 0 : _a.onClick) == null ? void 0 : _b.call(_a, e);
758
+ }
759
+ })
760
+ },
761
+ hotkeys: {
762
+ // setSelectedItem: {
763
+ // hotkey: "space",
764
+ // handler: (e, tree) => {
765
+ // tree.setSelectedItems([tree.getFocusedItem().getId()]);
766
+ // },
767
+ // },
768
+ toggleSelectedItem: {
769
+ hotkey: "Control+Space",
770
+ preventDefault: true,
771
+ handler: (_, tree) => {
772
+ tree.getFocusedItem().toggleSelect();
773
+ }
774
+ },
775
+ selectUpwards: {
776
+ hotkey: "Shift+ArrowUp",
777
+ handler: (e, tree) => {
778
+ const focused = tree.getFocusedItem();
779
+ const above = focused.getItemAbove();
780
+ if (!above) return;
781
+ if (focused.isSelected() && above.isSelected()) {
782
+ focused.deselect();
783
+ } else {
784
+ above.select();
785
+ }
786
+ above.setFocused();
787
+ tree.updateDomFocus();
788
+ }
789
+ },
790
+ selectDownwards: {
791
+ hotkey: "Shift+ArrowDown",
792
+ handler: (e, tree) => {
793
+ const focused = tree.getFocusedItem();
794
+ const below = focused.getItemBelow();
795
+ if (!below) return;
796
+ if (focused.isSelected() && below.isSelected()) {
797
+ focused.deselect();
798
+ } else {
799
+ below.select();
800
+ }
801
+ below.setFocused();
802
+ tree.updateDomFocus();
803
+ }
804
+ },
805
+ selectAll: {
806
+ hotkey: "Control+KeyA",
807
+ preventDefault: true,
808
+ handler: (e, tree) => {
809
+ tree.setSelectedItems(tree.getItems().map((item) => item.getId()));
810
+ }
811
+ }
812
+ }
813
+ };
814
+
815
+ // src/features/checkboxes/feature.ts
816
+ var getAllLoadedDescendants = (tree, itemId, includeFolders = false) => {
817
+ if (!tree.getConfig().isItemFolder(tree.getItemInstance(itemId))) {
818
+ return [itemId];
819
+ }
820
+ const descendants = tree.retrieveChildrenIds(itemId).map((child) => getAllLoadedDescendants(tree, child, includeFolders)).flat();
821
+ return includeFolders ? [itemId, ...descendants] : descendants;
822
+ };
823
+ var checkboxesFeature = {
824
+ key: "checkboxes",
825
+ overwrites: ["selection"],
826
+ getInitialState: (initialState) => __spreadValues({
827
+ checkedItems: []
828
+ }, initialState),
829
+ getDefaultConfig: (defaultConfig, tree) => {
830
+ var _a, _b, _c;
831
+ const hasAsyncLoader = (_a = defaultConfig.features) == null ? void 0 : _a.some(
832
+ (f) => f.key === "async-data-loader"
833
+ );
834
+ if (hasAsyncLoader && defaultConfig.propagateCheckedState) {
835
+ throwError(`propagateCheckedState not supported with async trees`);
836
+ }
837
+ const propagateCheckedState = (_b = defaultConfig.propagateCheckedState) != null ? _b : !hasAsyncLoader;
838
+ const canCheckFolders = (_c = defaultConfig.canCheckFolders) != null ? _c : !propagateCheckedState;
839
+ return __spreadValues({
840
+ setCheckedItems: makeStateUpdater("checkedItems", tree),
841
+ propagateCheckedState,
842
+ canCheckFolders
843
+ }, defaultConfig);
844
+ },
845
+ stateHandlerNames: {
846
+ checkedItems: "setCheckedItems"
847
+ },
848
+ treeInstance: {
849
+ setCheckedItems: ({ tree }, checkedItems) => {
850
+ tree.applySubStateUpdate("checkedItems", checkedItems);
851
+ }
852
+ },
853
+ itemInstance: {
854
+ getCheckboxProps: ({ item }) => {
855
+ const checkedState = item.getCheckedState();
856
+ return {
857
+ onChange: item.toggleCheckedState,
858
+ checked: checkedState === "checked" /* Checked */,
859
+ ref: (r) => {
860
+ if (r) {
861
+ r.indeterminate = checkedState === "indeterminate" /* Indeterminate */;
862
+ }
863
+ }
864
+ };
865
+ },
866
+ toggleCheckedState: ({ item }) => {
867
+ if (item.getCheckedState() === "checked" /* Checked */) {
868
+ item.setUnchecked();
869
+ } else {
870
+ item.setChecked();
871
+ }
872
+ },
873
+ getCheckedState: ({ item, tree }) => {
874
+ const { checkedItems } = tree.getState();
875
+ const { propagateCheckedState } = tree.getConfig();
876
+ const itemId = item.getId();
877
+ if (checkedItems.includes(itemId)) {
878
+ return "checked" /* Checked */;
879
+ }
880
+ if (item.isFolder() && propagateCheckedState) {
881
+ const descendants = getAllLoadedDescendants(tree, itemId);
882
+ if (descendants.every((d) => checkedItems.includes(d))) {
883
+ return "checked" /* Checked */;
884
+ }
885
+ if (descendants.some((d) => checkedItems.includes(d))) {
886
+ return "indeterminate" /* Indeterminate */;
887
+ }
888
+ }
889
+ return "unchecked" /* Unchecked */;
890
+ },
891
+ setChecked: ({ item, tree, itemId }) => {
892
+ const { propagateCheckedState, canCheckFolders } = tree.getConfig();
893
+ if (item.isFolder() && propagateCheckedState) {
894
+ tree.applySubStateUpdate("checkedItems", (items) => [
895
+ ...items,
896
+ ...getAllLoadedDescendants(tree, itemId, canCheckFolders)
897
+ ]);
898
+ } else if (!item.isFolder() || canCheckFolders) {
899
+ tree.applySubStateUpdate("checkedItems", (items) => [...items, itemId]);
900
+ }
901
+ },
902
+ setUnchecked: ({ item, tree, itemId }) => {
903
+ const { propagateCheckedState, canCheckFolders } = tree.getConfig();
904
+ if (item.isFolder() && propagateCheckedState) {
905
+ const descendants = getAllLoadedDescendants(
906
+ tree,
907
+ itemId,
908
+ canCheckFolders
909
+ );
910
+ tree.applySubStateUpdate(
911
+ "checkedItems",
912
+ (items) => items.filter((id) => !descendants.includes(id) && id !== itemId)
913
+ );
914
+ } else {
915
+ tree.applySubStateUpdate(
916
+ "checkedItems",
917
+ (items) => items.filter((id) => id !== itemId)
918
+ );
919
+ }
920
+ }
921
+ }
922
+ };
923
+
924
+ // src/features/hotkeys-core/feature.ts
925
+ var specialKeys = {
926
+ // TODO:breaking deprecate auto-lowercase
927
+ letter: /^Key[A-Z]$/,
928
+ letterornumber: /^(Key[A-Z]|Digit[0-9])$/,
929
+ plus: /^(NumpadAdd|Plus)$/,
930
+ minus: /^(NumpadSubtract|Minus)$/,
931
+ control: /^(ControlLeft|ControlRight)$/,
932
+ shift: /^(ShiftLeft|ShiftRight)$/
933
+ };
934
+ var testHotkeyMatch = (pressedKeys, tree, hotkey) => {
935
+ const supposedKeys = hotkey.hotkey.toLowerCase().split("+");
936
+ const doKeysMatch = supposedKeys.every((key) => {
937
+ if (key in specialKeys) {
938
+ return [...pressedKeys].some(
939
+ (pressedKey) => specialKeys[key].test(pressedKey)
940
+ );
941
+ }
942
+ const pressedKeysLowerCase = [...pressedKeys].map((k) => k.toLowerCase());
943
+ if (pressedKeysLowerCase.includes(key.toLowerCase())) {
944
+ return true;
945
+ }
946
+ if (pressedKeysLowerCase.includes(`key${key.toLowerCase()}`)) {
947
+ return true;
948
+ }
949
+ return false;
950
+ });
951
+ const isEnabled = !hotkey.isEnabled || hotkey.isEnabled(tree);
952
+ const equalCounts = pressedKeys.size === supposedKeys.length;
953
+ return doKeysMatch && isEnabled && equalCounts;
954
+ };
955
+ var findHotkeyMatch = (pressedKeys, tree, config1, config2) => {
956
+ var _a;
957
+ return (_a = Object.entries(__spreadValues(__spreadValues({}, config1), config2)).find(
958
+ ([, hotkey]) => testHotkeyMatch(pressedKeys, tree, hotkey)
959
+ )) == null ? void 0 : _a[0];
960
+ };
961
+ var hotkeysCoreFeature = {
962
+ key: "hotkeys-core",
963
+ onTreeMount: (tree, element) => {
964
+ const data = tree.getDataRef();
965
+ const keydown = (e) => {
966
+ var _a, _b;
967
+ const { ignoreHotkeysOnInputs, onTreeHotkey, hotkeys } = tree.getConfig();
968
+ if (e.target instanceof HTMLInputElement && ignoreHotkeysOnInputs) {
969
+ return;
970
+ }
971
+ (_b = (_a = data.current).pressedKeys) != null ? _b : _a.pressedKeys = /* @__PURE__ */ new Set();
972
+ const newMatch = !data.current.pressedKeys.has(e.code);
973
+ data.current.pressedKeys.add(e.code);
974
+ const hotkeyName = findHotkeyMatch(
975
+ data.current.pressedKeys,
976
+ tree,
977
+ tree.getHotkeyPresets(),
978
+ hotkeys
979
+ );
980
+ if (e.target instanceof HTMLInputElement) {
981
+ data.current.pressedKeys.delete(e.code);
982
+ }
983
+ if (!hotkeyName) return;
984
+ const hotkeyConfig = __spreadValues(__spreadValues({}, tree.getHotkeyPresets()[hotkeyName]), hotkeys == null ? void 0 : hotkeys[hotkeyName]);
985
+ if (!hotkeyConfig) return;
986
+ if (!hotkeyConfig.allowWhenInputFocused && e.target instanceof HTMLInputElement)
987
+ return;
988
+ if (!hotkeyConfig.canRepeat && !newMatch) return;
989
+ if (hotkeyConfig.preventDefault) e.preventDefault();
990
+ hotkeyConfig.handler(e, tree);
991
+ onTreeHotkey == null ? void 0 : onTreeHotkey(hotkeyName, e);
992
+ };
993
+ const keyup = (e) => {
994
+ var _a, _b;
995
+ (_b = (_a = data.current).pressedKeys) != null ? _b : _a.pressedKeys = /* @__PURE__ */ new Set();
996
+ data.current.pressedKeys.delete(e.code);
997
+ };
998
+ const reset = () => {
999
+ data.current.pressedKeys = /* @__PURE__ */ new Set();
1000
+ };
1001
+ element.addEventListener("keydown", keydown);
1002
+ document.addEventListener("keyup", keyup);
1003
+ window.addEventListener("focus", reset);
1004
+ data.current.keydownHandler = keydown;
1005
+ data.current.keyupHandler = keyup;
1006
+ data.current.resetHandler = reset;
1007
+ },
1008
+ onTreeUnmount: (tree, element) => {
1009
+ const data = tree.getDataRef();
1010
+ if (data.current.keyupHandler) {
1011
+ document.removeEventListener("keyup", data.current.keyupHandler);
1012
+ delete data.current.keyupHandler;
1013
+ }
1014
+ if (data.current.keydownHandler) {
1015
+ element.removeEventListener("keydown", data.current.keydownHandler);
1016
+ delete data.current.keydownHandler;
1017
+ }
1018
+ if (data.current.resetHandler) {
1019
+ window.removeEventListener("focus", data.current.resetHandler);
1020
+ delete data.current.resetHandler;
1021
+ }
1022
+ }
1023
+ };
1024
+
1025
+ // src/features/async-data-loader/feature.ts
1026
+ var getDataRef = (tree) => {
1027
+ var _a, _b, _c, _d;
1028
+ const dataRef = tree.getDataRef();
1029
+ (_b = (_a = dataRef.current).itemData) != null ? _b : _a.itemData = {};
1030
+ (_d = (_c = dataRef.current).childrenIds) != null ? _d : _c.childrenIds = {};
1031
+ return dataRef;
1032
+ };
1033
+ var loadItemData = (tree, itemId) => __async(null, null, function* () {
1034
+ var _a;
1035
+ const config = tree.getConfig();
1036
+ const dataRef = getDataRef(tree);
1037
+ const item = yield config.dataLoader.getItem(itemId);
1038
+ dataRef.current.itemData[itemId] = item;
1039
+ (_a = config.onLoadedItem) == null ? void 0 : _a.call(config, itemId, item);
1040
+ tree.applySubStateUpdate(
1041
+ "loadingItemData",
1042
+ (loadingItemData) => loadingItemData.filter((id) => id !== itemId)
1043
+ );
1044
+ return item;
1045
+ });
1046
+ var loadChildrenIds = (tree, itemId) => __async(null, null, function* () {
1047
+ var _a, _b;
1048
+ const config = tree.getConfig();
1049
+ const dataRef = getDataRef(tree);
1050
+ let childrenIds;
1051
+ if ("getChildrenWithData" in config.dataLoader) {
1052
+ const children = yield config.dataLoader.getChildrenWithData(itemId);
1053
+ childrenIds = children.map((c) => c.id);
1054
+ dataRef.current.childrenIds[itemId] = childrenIds;
1055
+ children.forEach(({ id, data }) => {
1056
+ var _a2;
1057
+ dataRef.current.itemData[id] = data;
1058
+ (_a2 = config.onLoadedItem) == null ? void 0 : _a2.call(config, id, data);
1059
+ });
1060
+ (_a = config.onLoadedChildren) == null ? void 0 : _a.call(config, itemId, childrenIds);
1061
+ tree.rebuildTree();
1062
+ tree.applySubStateUpdate(
1063
+ "loadingItemData",
1064
+ (loadingItemData) => loadingItemData.filter((id) => !childrenIds.includes(id))
1065
+ );
1066
+ } else {
1067
+ childrenIds = yield config.dataLoader.getChildren(itemId);
1068
+ dataRef.current.childrenIds[itemId] = childrenIds;
1069
+ (_b = config.onLoadedChildren) == null ? void 0 : _b.call(config, itemId, childrenIds);
1070
+ tree.rebuildTree();
1071
+ }
1072
+ tree.applySubStateUpdate(
1073
+ "loadingItemChildrens",
1074
+ (loadingItemChildrens) => loadingItemChildrens.filter((id) => id !== itemId)
1075
+ );
1076
+ return childrenIds;
1077
+ });
1078
+ var asyncDataLoaderFeature = {
1079
+ key: "async-data-loader",
1080
+ getInitialState: (initialState) => __spreadValues({
1081
+ loadingItemData: [],
1082
+ loadingItemChildrens: []
1083
+ }, initialState),
1084
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
1085
+ setLoadingItemData: makeStateUpdater("loadingItemData", tree),
1086
+ setLoadingItemChildrens: makeStateUpdater("loadingItemChildrens", tree)
1087
+ }, defaultConfig),
1088
+ stateHandlerNames: {
1089
+ loadingItemData: "setLoadingItemData",
1090
+ loadingItemChildrens: "setLoadingItemChildrens"
1091
+ },
1092
+ treeInstance: {
1093
+ waitForItemDataLoaded: ({ tree }, itemId) => tree.loadItemData(itemId),
1094
+ waitForItemChildrenLoaded: ({ tree }, itemId) => tree.loadChildrenIds(itemId),
1095
+ loadItemData: (_0, _1) => __async(null, [_0, _1], function* ({ tree }, itemId) {
1096
+ var _a;
1097
+ return (_a = getDataRef(tree).current.itemData[itemId]) != null ? _a : yield loadItemData(tree, itemId);
1098
+ }),
1099
+ loadChildrenIds: (_0, _1) => __async(null, [_0, _1], function* ({ tree }, itemId) {
1100
+ var _a;
1101
+ return (_a = getDataRef(tree).current.childrenIds[itemId]) != null ? _a : yield loadChildrenIds(tree, itemId);
1102
+ }),
1103
+ retrieveItemData: ({ tree }, itemId, skipFetch = false) => {
1104
+ var _a, _b;
1105
+ const config = tree.getConfig();
1106
+ const dataRef = getDataRef(tree);
1107
+ if (dataRef.current.itemData[itemId]) {
1108
+ return dataRef.current.itemData[itemId];
1109
+ }
1110
+ if (!tree.getState().loadingItemData.includes(itemId) && !skipFetch) {
1111
+ tree.applySubStateUpdate("loadingItemData", (loadingItemData) => [
1112
+ ...loadingItemData,
1113
+ itemId
1114
+ ]);
1115
+ loadItemData(tree, itemId);
1116
+ }
1117
+ return (_b = (_a = config.createLoadingItemData) == null ? void 0 : _a.call(config)) != null ? _b : null;
1118
+ },
1119
+ retrieveChildrenIds: ({ tree }, itemId, skipFetch = false) => {
1120
+ const dataRef = getDataRef(tree);
1121
+ if (dataRef.current.childrenIds[itemId]) {
1122
+ return dataRef.current.childrenIds[itemId];
1123
+ }
1124
+ if (tree.getState().loadingItemChildrens.includes(itemId) || skipFetch) {
1125
+ return [];
1126
+ }
1127
+ tree.applySubStateUpdate(
1128
+ "loadingItemChildrens",
1129
+ (loadingItemChildrens) => [...loadingItemChildrens, itemId]
1130
+ );
1131
+ loadChildrenIds(tree, itemId);
1132
+ return [];
1133
+ }
1134
+ },
1135
+ itemInstance: {
1136
+ isLoading: ({ tree, item }) => tree.getState().loadingItemData.includes(item.getItemMeta().itemId) || tree.getState().loadingItemChildrens.includes(item.getItemMeta().itemId),
1137
+ invalidateItemData: (_0, _1) => __async(null, [_0, _1], function* ({ tree, itemId }, optimistic) {
1138
+ var _a;
1139
+ if (!optimistic) {
1140
+ (_a = getDataRef(tree).current.itemData) == null ? true : delete _a[itemId];
1141
+ tree.applySubStateUpdate("loadingItemData", (loadingItemData) => [
1142
+ ...loadingItemData,
1143
+ itemId
1144
+ ]);
1145
+ }
1146
+ yield loadItemData(tree, itemId);
1147
+ }),
1148
+ invalidateChildrenIds: (_0, _1) => __async(null, [_0, _1], function* ({ tree, itemId }, optimistic) {
1149
+ var _a;
1150
+ if (!optimistic) {
1151
+ (_a = getDataRef(tree).current.childrenIds) == null ? true : delete _a[itemId];
1152
+ tree.applySubStateUpdate(
1153
+ "loadingItemChildrens",
1154
+ (loadingItemChildrens) => [...loadingItemChildrens, itemId]
1155
+ );
1156
+ }
1157
+ yield loadChildrenIds(tree, itemId);
1158
+ }),
1159
+ updateCachedChildrenIds: ({ tree, itemId }, childrenIds) => {
1160
+ const dataRef = tree.getDataRef();
1161
+ dataRef.current.childrenIds[itemId] = childrenIds;
1162
+ tree.rebuildTree();
1163
+ },
1164
+ updateCachedData: ({ tree, itemId }, data) => {
1165
+ const dataRef = tree.getDataRef();
1166
+ dataRef.current.itemData[itemId] = data;
1167
+ tree.rebuildTree();
1168
+ }
1169
+ }
1170
+ };
1171
+
1172
+ // src/features/sync-data-loader/feature.ts
1173
+ var undefErrorMessage = "sync dataLoader returned undefined";
1174
+ var promiseErrorMessage = "sync dataLoader returned promise";
1175
+ var unpromise = (data) => {
1176
+ if (!data) {
1177
+ throw throwError(undefErrorMessage);
1178
+ }
1179
+ if (typeof data === "object" && "then" in data) {
1180
+ throw throwError(promiseErrorMessage);
1181
+ }
1182
+ return data;
1183
+ };
1184
+ var syncDataLoaderFeature = {
1185
+ key: "sync-data-loader",
1186
+ getInitialState: (initialState) => __spreadValues({
1187
+ loadingItemData: [],
1188
+ loadingItemChildrens: []
1189
+ }, initialState),
1190
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
1191
+ setLoadingItemData: makeStateUpdater("loadingItemData", tree),
1192
+ setLoadingItemChildrens: makeStateUpdater("loadingItemChildrens", tree)
1193
+ }, defaultConfig),
1194
+ stateHandlerNames: {
1195
+ loadingItemData: "setLoadingItemData",
1196
+ loadingItemChildrens: "setLoadingItemChildrens"
1197
+ },
1198
+ treeInstance: {
1199
+ waitForItemDataLoaded: () => __async(null, null, function* () {
1200
+ }),
1201
+ waitForItemChildrenLoaded: () => __async(null, null, function* () {
1202
+ }),
1203
+ retrieveItemData: ({ tree }, itemId) => {
1204
+ return unpromise(tree.getConfig().dataLoader.getItem(itemId));
1205
+ },
1206
+ retrieveChildrenIds: ({ tree }, itemId) => {
1207
+ const { dataLoader } = tree.getConfig();
1208
+ if ("getChildren" in dataLoader) {
1209
+ return unpromise(dataLoader.getChildren(itemId));
1210
+ }
1211
+ return unpromise(dataLoader.getChildrenWithData(itemId)).map(
1212
+ (c) => c.data
1213
+ );
1214
+ },
1215
+ loadItemData: ({ tree }, itemId) => tree.retrieveItemData(itemId),
1216
+ loadChildrenIds: ({ tree }, itemId) => tree.retrieveChildrenIds(itemId)
1217
+ },
1218
+ itemInstance: {
1219
+ isLoading: () => false
1220
+ }
1221
+ };
1222
+
1223
+ // src/features/drag-and-drop/utils.ts
1224
+ var isOrderedDragTarget = (dragTarget) => "childIndex" in dragTarget;
1225
+ var canDrop = (dataTransfer, target, tree) => {
1226
+ var _a, _b, _c;
1227
+ const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1228
+ const config = tree.getConfig();
1229
+ if (draggedItems && !((_c = (_b = config.canDrop) == null ? void 0 : _b.call(config, draggedItems, target)) != null ? _c : true)) {
1230
+ return false;
1231
+ }
1232
+ if (draggedItems && draggedItems.some(
1233
+ (draggedItem) => target.item.getId() === draggedItem.getId() || target.item.isDescendentOf(draggedItem.getId())
1234
+ )) {
1235
+ return false;
1236
+ }
1237
+ if (!draggedItems && dataTransfer && config.canDropForeignDragObject && !config.canDropForeignDragObject(dataTransfer, target)) {
1238
+ return false;
1239
+ }
1240
+ return true;
1241
+ };
1242
+ var getItemDropCategory = (item) => {
1243
+ if (item.isExpanded()) {
1244
+ return 1 /* ExpandedFolder */;
1245
+ }
1246
+ const parent = item.getParent();
1247
+ if (parent && item.getIndexInParent() === item.getItemMeta().setSize - 1) {
1248
+ return 2 /* LastInGroup */;
1249
+ }
1250
+ return 0 /* Item */;
1251
+ };
1252
+ var getInsertionIndex = (children, childIndex, draggedItems) => {
1253
+ var _a;
1254
+ const numberOfDragItemsBeforeTarget = (_a = children.slice(0, childIndex).reduce(
1255
+ (counter, child) => child && (draggedItems == null ? void 0 : draggedItems.some((i) => i.getId() === child.getId())) ? ++counter : counter,
1256
+ 0
1257
+ )) != null ? _a : 0;
1258
+ return childIndex - numberOfDragItemsBeforeTarget;
1259
+ };
1260
+ var getTargetPlacement = (e, item, tree, canMakeChild) => {
1261
+ var _a, _b, _c, _d, _e;
1262
+ const config = tree.getConfig();
1263
+ if (!config.canReorder) {
1264
+ return canMakeChild ? { type: 2 /* MakeChild */ } : { type: 1 /* ReorderBelow */ };
1265
+ }
1266
+ const bb = (_a = item.getElement()) == null ? void 0 : _a.getBoundingClientRect();
1267
+ const topPercent = bb ? (e.clientY - bb.top) / bb.height : 0.5;
1268
+ const leftPixels = bb ? e.clientX - bb.left : 0;
1269
+ const targetDropCategory = getItemDropCategory(item);
1270
+ const reorderAreaPercentage = !canMakeChild ? 0.5 : (_b = config.reorderAreaPercentage) != null ? _b : 0.3;
1271
+ const indent = (_c = config.indent) != null ? _c : 20;
1272
+ const makeChildType = canMakeChild ? 2 /* MakeChild */ : 1 /* ReorderBelow */;
1273
+ if (targetDropCategory === 1 /* ExpandedFolder */) {
1274
+ if (topPercent < reorderAreaPercentage) {
1275
+ return { type: 0 /* ReorderAbove */ };
1276
+ }
1277
+ return { type: makeChildType };
1278
+ }
1279
+ if (targetDropCategory === 2 /* LastInGroup */) {
1280
+ if (leftPixels < item.getItemMeta().level * indent) {
1281
+ if (topPercent < 0.5) {
1282
+ return { type: 0 /* ReorderAbove */ };
1283
+ }
1284
+ const minLevel = (_e = (_d = item.getItemBelow()) == null ? void 0 : _d.getItemMeta().level) != null ? _e : 0;
1285
+ return {
1286
+ type: 3 /* Reparent */,
1287
+ reparentLevel: Math.max(minLevel, Math.floor(leftPixels / indent))
1288
+ };
1289
+ }
1290
+ }
1291
+ if (topPercent < reorderAreaPercentage) {
1292
+ return { type: 0 /* ReorderAbove */ };
1293
+ }
1294
+ if (topPercent > 1 - reorderAreaPercentage) {
1295
+ return { type: 1 /* ReorderBelow */ };
1296
+ }
1297
+ return { type: makeChildType };
1298
+ };
1299
+ var getDragCode = (item, placement) => {
1300
+ return [
1301
+ item.getId(),
1302
+ placement.type,
1303
+ placement.type === 3 /* Reparent */ ? placement.reparentLevel : 0
1304
+ ].join("__");
1305
+ };
1306
+ var getNthParent = (item, n) => {
1307
+ if (n === item.getItemMeta().level) {
1308
+ return item;
1309
+ }
1310
+ return getNthParent(item.getParent(), n);
1311
+ };
1312
+ var getReparentTarget = (item, reparentLevel, draggedItems) => {
1313
+ const itemMeta = item.getItemMeta();
1314
+ const reparentedTarget = getNthParent(item, reparentLevel - 1);
1315
+ const targetItemAbove = getNthParent(item, reparentLevel);
1316
+ const targetIndex = targetItemAbove.getIndexInParent() + 1;
1317
+ return {
1318
+ item: reparentedTarget,
1319
+ childIndex: targetIndex,
1320
+ insertionIndex: getInsertionIndex(
1321
+ reparentedTarget.getChildren(),
1322
+ targetIndex,
1323
+ draggedItems
1324
+ ),
1325
+ dragLineIndex: itemMeta.index + 1,
1326
+ dragLineLevel: reparentLevel
1327
+ };
1328
+ };
1329
+ var getDragTarget = (e, item, tree, canReorder = tree.getConfig().canReorder) => {
1330
+ var _a;
1331
+ const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1332
+ const itemMeta = item.getItemMeta();
1333
+ const parent = item.getParent();
1334
+ const itemTarget = { item };
1335
+ const parentTarget = parent ? { item: parent } : null;
1336
+ const canBecomeSibling = parentTarget && canDrop(e.dataTransfer, parentTarget, tree);
1337
+ const canMakeChild = canDrop(e.dataTransfer, itemTarget, tree);
1338
+ const placement = getTargetPlacement(e, item, tree, canMakeChild);
1339
+ if (!canReorder && parent && canBecomeSibling && placement.type !== 2 /* MakeChild */) {
1340
+ if (draggedItems == null ? void 0 : draggedItems.some((item2) => item2.isDescendentOf(parent.getId()))) {
1341
+ return itemTarget;
1342
+ }
1343
+ return parentTarget;
1344
+ }
1345
+ if (!canReorder && parent && !canBecomeSibling) {
1346
+ return getDragTarget(e, parent, tree, false);
1347
+ }
1348
+ if (!parent) {
1349
+ return itemTarget;
1350
+ }
1351
+ if (placement.type === 2 /* MakeChild */) {
1352
+ return itemTarget;
1353
+ }
1354
+ if (!canBecomeSibling) {
1355
+ return getDragTarget(e, parent, tree, false);
1356
+ }
1357
+ if (placement.type === 3 /* Reparent */) {
1358
+ return getReparentTarget(item, placement.reparentLevel, draggedItems);
1359
+ }
1360
+ const maybeAddOneForBelow = placement.type === 0 /* ReorderAbove */ ? 0 : 1;
1361
+ const childIndex = item.getIndexInParent() + maybeAddOneForBelow;
1362
+ return {
1363
+ item: parent,
1364
+ dragLineIndex: itemMeta.index + maybeAddOneForBelow,
1365
+ dragLineLevel: itemMeta.level,
1366
+ childIndex,
1367
+ // TODO performance could be improved by computing this only when dragcode changed
1368
+ insertionIndex: getInsertionIndex(
1369
+ parent.getChildren(),
1370
+ childIndex,
1371
+ draggedItems
1372
+ )
1373
+ };
1374
+ };
1375
+
1376
+ // src/features/drag-and-drop/feature.ts
1377
+ var handleAutoOpenFolder = (dataRef, tree, item, placement) => {
1378
+ const { openOnDropDelay } = tree.getConfig();
1379
+ const dragCode = dataRef.current.lastDragCode;
1380
+ if (!openOnDropDelay || !item.isFolder() || item.isExpanded() || placement.type !== 2 /* MakeChild */) {
1381
+ return;
1382
+ }
1383
+ clearTimeout(dataRef.current.autoExpandTimeout);
1384
+ dataRef.current.autoExpandTimeout = setTimeout(() => {
1385
+ if (dragCode !== dataRef.current.lastDragCode || !dataRef.current.lastAllowDrop)
1386
+ return;
1387
+ item.expand();
1388
+ }, openOnDropDelay);
1389
+ };
1390
+ var defaultCanDropForeignDragObject = () => false;
1391
+ var dragAndDropFeature = {
1392
+ key: "drag-and-drop",
1393
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
1394
+ canDrop: (_, target) => target.item.isFolder(),
1395
+ canDropForeignDragObject: defaultCanDropForeignDragObject,
1396
+ canDragForeignDragObjectOver: defaultConfig.canDropForeignDragObject !== defaultCanDropForeignDragObject ? (dataTransfer) => dataTransfer.effectAllowed !== "none" : () => false,
1397
+ setDndState: makeStateUpdater("dnd", tree),
1398
+ canReorder: true,
1399
+ openOnDropDelay: 800
1400
+ }, defaultConfig),
1401
+ stateHandlerNames: {
1402
+ dnd: "setDndState"
1403
+ },
1404
+ onTreeMount: (tree) => {
1405
+ const listener = () => {
1406
+ tree.applySubStateUpdate("dnd", null);
1407
+ };
1408
+ tree.getDataRef().current.windowDragEndListener = listener;
1409
+ window.addEventListener("dragend", listener);
1410
+ },
1411
+ onTreeUnmount: (tree) => {
1412
+ const { windowDragEndListener } = tree.getDataRef().current;
1413
+ if (!windowDragEndListener) return;
1414
+ window.removeEventListener("dragend", windowDragEndListener);
1415
+ },
1416
+ treeInstance: {
1417
+ getDragTarget: ({ tree }) => {
1418
+ var _a, _b;
1419
+ return (_b = (_a = tree.getState().dnd) == null ? void 0 : _a.dragTarget) != null ? _b : null;
1420
+ },
1421
+ getDragLineData: ({ tree }) => {
1422
+ var _a, _b, _c, _d, _e, _f;
1423
+ const target = tree.getDragTarget();
1424
+ const indent = ((_a = target == null ? void 0 : target.item.getItemMeta().level) != null ? _a : 0) + 1;
1425
+ const treeBb = (_b = tree.getElement()) == null ? void 0 : _b.getBoundingClientRect();
1426
+ if (!target || !treeBb || !isOrderedDragTarget(target)) return null;
1427
+ const leftOffset = target.dragLineLevel * ((_c = tree.getConfig().indent) != null ? _c : 1);
1428
+ const targetItem = tree.getItems()[target.dragLineIndex];
1429
+ if (!targetItem) {
1430
+ const bb2 = (_e = (_d = tree.getItems()[target.dragLineIndex - 1]) == null ? void 0 : _d.getElement()) == null ? void 0 : _e.getBoundingClientRect();
1431
+ if (bb2) {
1432
+ return {
1433
+ indent,
1434
+ top: bb2.bottom - treeBb.top,
1435
+ left: bb2.left + leftOffset - treeBb.left,
1436
+ width: bb2.width - leftOffset
1437
+ };
1438
+ }
1439
+ }
1440
+ const bb = (_f = targetItem == null ? void 0 : targetItem.getElement()) == null ? void 0 : _f.getBoundingClientRect();
1441
+ if (bb) {
1442
+ return {
1443
+ indent,
1444
+ top: bb.top - treeBb.top,
1445
+ left: bb.left + leftOffset - treeBb.left,
1446
+ width: bb.width - leftOffset
1447
+ };
1448
+ }
1449
+ return null;
1450
+ },
1451
+ getDragLineStyle: ({ tree }, topOffset = -1, leftOffset = -8) => {
1452
+ const dragLine = tree.getDragLineData();
1453
+ return dragLine ? {
1454
+ position: "absolute",
1455
+ top: `${dragLine.top + topOffset}px`,
1456
+ left: `${dragLine.left + leftOffset}px`,
1457
+ width: `${dragLine.width - leftOffset}px`,
1458
+ pointerEvents: "none"
1459
+ // important to prevent capturing drag events
1460
+ } : { display: "none" };
1461
+ },
1462
+ getContainerProps: ({ prev, tree }, treeLabel) => {
1463
+ const prevProps = prev == null ? void 0 : prev(treeLabel);
1464
+ return __spreadProps(__spreadValues({}, prevProps), {
1465
+ onDragOver: (e) => {
1466
+ e.preventDefault();
1467
+ },
1468
+ onDrop: (e) => __async(null, null, function* () {
1469
+ var _a, _b, _c;
1470
+ const dataRef = tree.getDataRef();
1471
+ const target = { item: tree.getRootItem() };
1472
+ if (!canDrop(e.dataTransfer, target, tree)) {
1473
+ return;
1474
+ }
1475
+ e.preventDefault();
1476
+ const config = tree.getConfig();
1477
+ const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1478
+ dataRef.current.lastDragCode = void 0;
1479
+ if (draggedItems) {
1480
+ yield (_b = config.onDrop) == null ? void 0 : _b.call(config, draggedItems, target);
1481
+ } else if (e.dataTransfer) {
1482
+ yield (_c = config.onDropForeignDragObject) == null ? void 0 : _c.call(config, e.dataTransfer, target);
1483
+ }
1484
+ }),
1485
+ style: __spreadProps(__spreadValues({}, prevProps == null ? void 0 : prevProps.style), {
1486
+ position: "relative"
1487
+ })
1488
+ });
1489
+ }
1490
+ },
1491
+ itemInstance: {
1492
+ getProps: ({ tree, item, prev }) => __spreadProps(__spreadValues({}, prev == null ? void 0 : prev()), {
1493
+ draggable: true,
1494
+ onDragEnter: (e) => e.preventDefault(),
1495
+ onDragStart: (e) => {
1496
+ var _a, _b, _c, _d;
1497
+ const selectedItems = tree.getSelectedItems ? tree.getSelectedItems() : [tree.getFocusedItem()];
1498
+ const items = selectedItems.includes(item) ? selectedItems : [item];
1499
+ const config = tree.getConfig();
1500
+ if (!selectedItems.includes(item)) {
1501
+ (_a = tree.setSelectedItems) == null ? void 0 : _a.call(tree, [item.getItemMeta().itemId]);
1502
+ }
1503
+ if (!((_c = (_b = config.canDrag) == null ? void 0 : _b.call(config, items)) != null ? _c : true)) {
1504
+ e.preventDefault();
1505
+ return;
1506
+ }
1507
+ if (config.setDragImage) {
1508
+ const { imgElement, xOffset, yOffset } = config.setDragImage(items);
1509
+ (_d = e.dataTransfer) == null ? void 0 : _d.setDragImage(imgElement, xOffset != null ? xOffset : 0, yOffset != null ? yOffset : 0);
1510
+ }
1511
+ if (config.createForeignDragObject && e.dataTransfer) {
1512
+ const { format, data, dropEffect, effectAllowed } = config.createForeignDragObject(items);
1513
+ e.dataTransfer.setData(format, data);
1514
+ if (dropEffect) e.dataTransfer.dropEffect = dropEffect;
1515
+ if (effectAllowed) e.dataTransfer.effectAllowed = effectAllowed;
1516
+ }
1517
+ tree.applySubStateUpdate("dnd", {
1518
+ draggedItems: items,
1519
+ draggingOverItem: tree.getFocusedItem()
1520
+ });
1521
+ },
1522
+ onDragOver: (e) => {
1523
+ var _a, _b, _c;
1524
+ e.stopPropagation();
1525
+ const dataRef = tree.getDataRef();
1526
+ const placement = getTargetPlacement(e, item, tree, true);
1527
+ const nextDragCode = getDragCode(item, placement);
1528
+ if (nextDragCode === dataRef.current.lastDragCode) {
1529
+ if (dataRef.current.lastAllowDrop) {
1530
+ e.preventDefault();
1531
+ }
1532
+ return;
1533
+ }
1534
+ dataRef.current.lastDragCode = nextDragCode;
1535
+ dataRef.current.lastDragEnter = Date.now();
1536
+ handleAutoOpenFolder(dataRef, tree, item, placement);
1537
+ const target = getDragTarget(e, item, tree);
1538
+ if (!((_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems) && (!e.dataTransfer || !((_c = (_b = tree.getConfig()).canDragForeignDragObjectOver) == null ? void 0 : _c.call(_b, e.dataTransfer, target)))) {
1539
+ dataRef.current.lastAllowDrop = false;
1540
+ return;
1541
+ }
1542
+ if (!canDrop(e.dataTransfer, target, tree)) {
1543
+ dataRef.current.lastAllowDrop = false;
1544
+ return;
1545
+ }
1546
+ tree.applySubStateUpdate("dnd", (state) => __spreadProps(__spreadValues({}, state), {
1547
+ dragTarget: target,
1548
+ draggingOverItem: item
1549
+ }));
1550
+ dataRef.current.lastAllowDrop = true;
1551
+ e.preventDefault();
1552
+ },
1553
+ onDragLeave: () => {
1554
+ setTimeout(() => {
1555
+ var _a;
1556
+ const dataRef = tree.getDataRef();
1557
+ if (((_a = dataRef.current.lastDragEnter) != null ? _a : 0) + 100 >= Date.now()) return;
1558
+ dataRef.current.lastDragCode = "no-drag";
1559
+ tree.applySubStateUpdate("dnd", (state) => __spreadProps(__spreadValues({}, state), {
1560
+ draggingOverItem: void 0,
1561
+ dragTarget: void 0
1562
+ }));
1563
+ }, 100);
1564
+ },
1565
+ onDragEnd: (e) => {
1566
+ var _a, _b;
1567
+ const { onCompleteForeignDrop, canDragForeignDragObjectOver } = tree.getConfig();
1568
+ const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1569
+ if (((_b = e.dataTransfer) == null ? void 0 : _b.dropEffect) === "none" || !draggedItems) {
1570
+ return;
1571
+ }
1572
+ const target = getDragTarget(e, item, tree);
1573
+ if (canDragForeignDragObjectOver && e.dataTransfer && !canDragForeignDragObjectOver(e.dataTransfer, target)) {
1574
+ return;
1575
+ }
1576
+ onCompleteForeignDrop == null ? void 0 : onCompleteForeignDrop(draggedItems);
1577
+ },
1578
+ onDrop: (e) => __async(null, null, function* () {
1579
+ var _a, _b, _c;
1580
+ e.stopPropagation();
1581
+ const dataRef = tree.getDataRef();
1582
+ const target = getDragTarget(e, item, tree);
1583
+ const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1584
+ const isValidDrop = canDrop(e.dataTransfer, target, tree);
1585
+ tree.applySubStateUpdate("dnd", {
1586
+ draggedItems: void 0,
1587
+ draggingOverItem: void 0,
1588
+ dragTarget: void 0
1589
+ });
1590
+ if (!isValidDrop) {
1591
+ return;
1592
+ }
1593
+ e.preventDefault();
1594
+ const config = tree.getConfig();
1595
+ dataRef.current.lastDragCode = void 0;
1596
+ if (draggedItems) {
1597
+ yield (_b = config.onDrop) == null ? void 0 : _b.call(config, draggedItems, target);
1598
+ } else if (e.dataTransfer) {
1599
+ yield (_c = config.onDropForeignDragObject) == null ? void 0 : _c.call(config, e.dataTransfer, target);
1600
+ }
1601
+ })
1602
+ }),
1603
+ isDragTarget: ({ tree, item }) => {
1604
+ const target = tree.getDragTarget();
1605
+ return target ? target.item.getId() === item.getId() : false;
1606
+ },
1607
+ isDragTargetAbove: ({ tree, item }) => {
1608
+ const target = tree.getDragTarget();
1609
+ if (!target || !isOrderedDragTarget(target) || target.item !== item.getParent())
1610
+ return false;
1611
+ return target.childIndex === item.getItemMeta().posInSet;
1612
+ },
1613
+ isDragTargetBelow: ({ tree, item }) => {
1614
+ const target = tree.getDragTarget();
1615
+ if (!target || !isOrderedDragTarget(target) || target.item !== item.getParent())
1616
+ return false;
1617
+ return target.childIndex - 1 === item.getItemMeta().posInSet;
1618
+ },
1619
+ isDraggingOver: ({ tree, item }) => {
1620
+ var _a, _b;
1621
+ return ((_b = (_a = tree.getState().dnd) == null ? void 0 : _a.draggingOverItem) == null ? void 0 : _b.getId()) === item.getId();
1622
+ }
1623
+ }
1624
+ };
1625
+
1626
+ // src/features/keyboard-drag-and-drop/feature.ts
1627
+ var getNextDragTarget = (tree, isUp, dragTarget) => {
1628
+ var _a, _b, _c, _d;
1629
+ const direction = isUp ? 0 : 1;
1630
+ const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1631
+ if (isOrderedDragTarget(dragTarget)) {
1632
+ const parent = dragTarget.item.getParent();
1633
+ const targetedItem = tree.getItems()[dragTarget.dragLineIndex - 1];
1634
+ const targetCategory = targetedItem ? getItemDropCategory(targetedItem) : 0 /* Item */;
1635
+ const maxLevel = (_b = targetedItem == null ? void 0 : targetedItem.getItemMeta().level) != null ? _b : 0;
1636
+ const minLevel = (_d = (_c = targetedItem == null ? void 0 : targetedItem.getItemBelow()) == null ? void 0 : _c.getItemMeta().level) != null ? _d : 0;
1637
+ if (targetCategory === 2 /* LastInGroup */) {
1638
+ if (isUp && dragTarget.dragLineLevel < maxLevel) {
1639
+ return getReparentTarget(
1640
+ targetedItem,
1641
+ dragTarget.dragLineLevel + 1,
1642
+ draggedItems
1643
+ );
1644
+ }
1645
+ if (!isUp && dragTarget.dragLineLevel > minLevel && parent) {
1646
+ return getReparentTarget(
1647
+ targetedItem,
1648
+ dragTarget.dragLineLevel - 1,
1649
+ draggedItems
1650
+ );
1651
+ }
1652
+ }
1653
+ const newIndex = dragTarget.dragLineIndex - 1 + direction;
1654
+ const item = tree.getItems()[newIndex];
1655
+ return item ? { item } : void 0;
1656
+ }
1657
+ const targetingExpandedFolder = getItemDropCategory(dragTarget.item) === 1 /* ExpandedFolder */;
1658
+ if (targetingExpandedFolder && !isUp) {
1659
+ return {
1660
+ item: dragTarget.item,
1661
+ childIndex: 0,
1662
+ insertionIndex: getInsertionIndex(
1663
+ dragTarget.item.getChildren(),
1664
+ 0,
1665
+ draggedItems
1666
+ ),
1667
+ dragLineIndex: dragTarget.item.getItemMeta().index + direction,
1668
+ dragLineLevel: dragTarget.item.getItemMeta().level + 1
1669
+ };
1670
+ }
1671
+ const childIndex = dragTarget.item.getIndexInParent() + direction;
1672
+ return {
1673
+ item: dragTarget.item.getParent(),
1674
+ childIndex,
1675
+ insertionIndex: getInsertionIndex(
1676
+ dragTarget.item.getParent().getChildren(),
1677
+ childIndex,
1678
+ draggedItems
1679
+ ),
1680
+ dragLineIndex: dragTarget.item.getItemMeta().index + direction,
1681
+ dragLineLevel: dragTarget.item.getItemMeta().level
1682
+ };
1683
+ };
1684
+ var getNextValidDragTarget = (tree, isUp, previousTarget = ((_a) => (_a = tree.getState().dnd) == null ? void 0 : _a.dragTarget)()) => {
1685
+ var _a2;
1686
+ if (!previousTarget) return void 0;
1687
+ const nextTarget = getNextDragTarget(tree, isUp, previousTarget);
1688
+ const dataTransfer = (_a2 = tree.getDataRef().current.kDndDataTransfer) != null ? _a2 : null;
1689
+ if (!nextTarget) return void 0;
1690
+ if (canDrop(dataTransfer, nextTarget, tree)) {
1691
+ return nextTarget;
1692
+ }
1693
+ return getNextValidDragTarget(tree, isUp, nextTarget);
1694
+ };
1695
+ var updateScroll = (tree) => {
1696
+ const state = tree.getState().dnd;
1697
+ if (!(state == null ? void 0 : state.dragTarget) || isOrderedDragTarget(state.dragTarget)) return;
1698
+ state.dragTarget.item.scrollTo({ block: "nearest", inline: "nearest" });
1699
+ };
1700
+ var initiateDrag = (tree, draggedItems, dataTransfer) => {
1701
+ var _a, _b;
1702
+ const focusedItem = tree.getFocusedItem();
1703
+ const { canDrag } = tree.getConfig();
1704
+ if (draggedItems && canDrag && !canDrag(draggedItems)) {
1705
+ return;
1706
+ }
1707
+ if (draggedItems) {
1708
+ tree.applySubStateUpdate("dnd", { draggedItems });
1709
+ (_b = (_a = tree.getConfig()).onStartKeyboardDrag) == null ? void 0 : _b.call(_a, draggedItems);
1710
+ } else if (dataTransfer) {
1711
+ tree.getDataRef().current.kDndDataTransfer = dataTransfer;
1712
+ }
1713
+ const dragTarget = getNextValidDragTarget(tree, false, {
1714
+ item: focusedItem
1715
+ });
1716
+ if (!dragTarget) return;
1717
+ tree.applySubStateUpdate("dnd", {
1718
+ draggedItems,
1719
+ dragTarget
1720
+ });
1721
+ tree.applySubStateUpdate("assistiveDndState", 1 /* Started */);
1722
+ updateScroll(tree);
1723
+ };
1724
+ var moveDragPosition = (tree, isUp) => {
1725
+ var _a;
1726
+ const dragTarget = getNextValidDragTarget(tree, isUp);
1727
+ if (!dragTarget) return;
1728
+ tree.applySubStateUpdate("dnd", {
1729
+ draggedItems: (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems,
1730
+ dragTarget
1731
+ });
1732
+ tree.applySubStateUpdate("assistiveDndState", 2 /* Dragging */);
1733
+ if (!isOrderedDragTarget(dragTarget)) {
1734
+ dragTarget.item.setFocused();
1735
+ }
1736
+ updateScroll(tree);
1737
+ };
1738
+ var keyboardDragAndDropFeature = {
1739
+ key: "keyboard-drag-and-drop",
1740
+ deps: ["drag-and-drop"],
1741
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
1742
+ setAssistiveDndState: makeStateUpdater("assistiveDndState", tree)
1743
+ }, defaultConfig),
1744
+ stateHandlerNames: {
1745
+ assistiveDndState: "setAssistiveDndState"
1746
+ },
1747
+ treeInstance: {
1748
+ startKeyboardDrag: ({ tree }, draggedItems) => {
1749
+ initiateDrag(tree, draggedItems, void 0);
1750
+ },
1751
+ startKeyboardDragOnForeignObject: ({ tree }, dataTransfer) => {
1752
+ initiateDrag(tree, void 0, dataTransfer);
1753
+ },
1754
+ stopKeyboardDrag: ({ tree }) => {
1755
+ tree.getDataRef().current.kDndDataTransfer = void 0;
1756
+ tree.applySubStateUpdate("dnd", null);
1757
+ tree.applySubStateUpdate("assistiveDndState", 0 /* None */);
1758
+ }
1759
+ },
1760
+ hotkeys: {
1761
+ startDrag: {
1762
+ hotkey: "Control+Shift+KeyD",
1763
+ preventDefault: true,
1764
+ isEnabled: (tree) => !tree.getState().dnd,
1765
+ handler: (_, tree) => {
1766
+ var _a, _b;
1767
+ const selectedItems = (_b = (_a = tree.getSelectedItems) == null ? void 0 : _a.call(tree)) != null ? _b : [
1768
+ tree.getFocusedItem()
1769
+ ];
1770
+ const focusedItem = tree.getFocusedItem();
1771
+ tree.startKeyboardDrag(
1772
+ selectedItems.includes(focusedItem) ? selectedItems : selectedItems.concat(focusedItem)
1773
+ );
1774
+ }
1775
+ },
1776
+ dragUp: {
1777
+ hotkey: "ArrowUp",
1778
+ preventDefault: true,
1779
+ isEnabled: (tree) => !!tree.getState().dnd,
1780
+ handler: (_, tree) => {
1781
+ moveDragPosition(tree, true);
1782
+ }
1783
+ },
1784
+ dragDown: {
1785
+ hotkey: "ArrowDown",
1786
+ preventDefault: true,
1787
+ isEnabled: (tree) => !!tree.getState().dnd,
1788
+ handler: (_, tree) => {
1789
+ moveDragPosition(tree, false);
1790
+ }
1791
+ },
1792
+ cancelDrag: {
1793
+ hotkey: "Escape",
1794
+ isEnabled: (tree) => !!tree.getState().dnd,
1795
+ handler: (_, tree) => {
1796
+ tree.stopKeyboardDrag();
1797
+ }
1798
+ },
1799
+ completeDrag: {
1800
+ hotkey: "Enter",
1801
+ preventDefault: true,
1802
+ isEnabled: (tree) => !!tree.getState().dnd,
1803
+ handler: (e, tree) => __async(null, null, function* () {
1804
+ var _a, _b, _c, _d;
1805
+ e.stopPropagation();
1806
+ const dataRef = tree.getDataRef();
1807
+ const target = tree.getDragTarget();
1808
+ const dataTransfer = (_a = dataRef.current.kDndDataTransfer) != null ? _a : null;
1809
+ if (!target || !canDrop(dataTransfer, target, tree)) {
1810
+ return;
1811
+ }
1812
+ const config = tree.getConfig();
1813
+ const draggedItems = (_b = tree.getState().dnd) == null ? void 0 : _b.draggedItems;
1814
+ dataRef.current.lastDragCode = void 0;
1815
+ tree.applySubStateUpdate("dnd", null);
1816
+ if (draggedItems) {
1817
+ yield (_c = config.onDrop) == null ? void 0 : _c.call(config, draggedItems, target);
1818
+ tree.getItemInstance(draggedItems[0].getId()).setFocused();
1819
+ } else if (dataTransfer) {
1820
+ yield (_d = config.onDropForeignDragObject) == null ? void 0 : _d.call(config, dataTransfer, target);
1821
+ }
1822
+ tree.applySubStateUpdate(
1823
+ "assistiveDndState",
1824
+ 3 /* Completed */
1825
+ );
1826
+ })
1827
+ }
1828
+ }
1829
+ };
1830
+
1831
+ // src/features/search/feature.ts
1832
+ var searchFeature = {
1833
+ key: "search",
1834
+ getInitialState: (initialState) => __spreadValues({
1835
+ search: null
1836
+ }, initialState),
1837
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
1838
+ setSearch: makeStateUpdater("search", tree),
1839
+ isSearchMatchingItem: (search, item) => search.length > 0 && item.getItemName().toLowerCase().includes(search.toLowerCase())
1840
+ }, defaultConfig),
1841
+ stateHandlerNames: {
1842
+ search: "setSearch"
1843
+ },
1844
+ treeInstance: {
1845
+ setSearch: ({ tree }, search) => {
1846
+ var _a;
1847
+ tree.applySubStateUpdate("search", search);
1848
+ (_a = tree.getItems().find(
1849
+ (item) => {
1850
+ var _a2, _b;
1851
+ return (_b = (_a2 = tree.getConfig()).isSearchMatchingItem) == null ? void 0 : _b.call(_a2, tree.getSearchValue(), item);
1852
+ }
1853
+ )) == null ? void 0 : _a.setFocused();
1854
+ },
1855
+ openSearch: ({ tree }, initialValue = "") => {
1856
+ var _a, _b;
1857
+ tree.setSearch(initialValue);
1858
+ (_b = (_a = tree.getConfig()).onOpenSearch) == null ? void 0 : _b.call(_a);
1859
+ setTimeout(() => {
1860
+ var _a2;
1861
+ (_a2 = tree.getDataRef().current.searchInput) == null ? void 0 : _a2.focus();
1862
+ });
1863
+ },
1864
+ closeSearch: ({ tree }) => {
1865
+ var _a, _b;
1866
+ tree.setSearch(null);
1867
+ (_b = (_a = tree.getConfig()).onCloseSearch) == null ? void 0 : _b.call(_a);
1868
+ tree.updateDomFocus();
1869
+ },
1870
+ isSearchOpen: ({ tree }) => tree.getState().search !== null,
1871
+ getSearchValue: ({ tree }) => tree.getState().search || "",
1872
+ registerSearchInputElement: ({ tree }, element) => {
1873
+ const dataRef = tree.getDataRef();
1874
+ dataRef.current.searchInput = element;
1875
+ if (element && dataRef.current.keydownHandler) {
1876
+ element.addEventListener("keydown", dataRef.current.keydownHandler);
1877
+ }
1878
+ },
1879
+ getSearchInputElement: ({ tree }) => {
1880
+ var _a;
1881
+ return (_a = tree.getDataRef().current.searchInput) != null ? _a : null;
1882
+ },
1883
+ // TODO memoize with propMemoizationFeature
1884
+ getSearchInputElementProps: ({ tree }) => ({
1885
+ value: tree.getSearchValue(),
1886
+ onChange: (e) => tree.setSearch(e.target.value),
1887
+ onBlur: () => tree.closeSearch(),
1888
+ ref: tree.registerSearchInputElement
1889
+ }),
1890
+ getSearchMatchingItems: memo(
1891
+ ({ tree }) => [
1892
+ tree.getSearchValue(),
1893
+ tree.getItems(),
1894
+ tree.getConfig().isSearchMatchingItem
1895
+ ],
1896
+ (search, items, isSearchMatchingItem) => items.filter((item) => search && (isSearchMatchingItem == null ? void 0 : isSearchMatchingItem(search, item)))
1897
+ )
1898
+ },
1899
+ itemInstance: {
1900
+ isMatchingSearch: ({ tree, item }) => tree.getSearchMatchingItems().some((i) => i.getId() === item.getId())
1901
+ },
1902
+ hotkeys: {
1903
+ openSearch: {
1904
+ hotkey: "LetterOrNumber",
1905
+ preventDefault: true,
1906
+ // TODO make true default
1907
+ isEnabled: (tree) => !tree.isSearchOpen(),
1908
+ handler: (e, tree) => {
1909
+ e.stopPropagation();
1910
+ tree.openSearch(e.key);
1911
+ }
1912
+ },
1913
+ closeSearch: {
1914
+ // TODO allow multiple, i.e. Enter
1915
+ hotkey: "Escape",
1916
+ allowWhenInputFocused: true,
1917
+ isEnabled: (tree) => tree.isSearchOpen(),
1918
+ handler: (e, tree) => {
1919
+ tree.closeSearch();
1920
+ }
1921
+ },
1922
+ submitSearch: {
1923
+ hotkey: "Enter",
1924
+ allowWhenInputFocused: true,
1925
+ isEnabled: (tree) => tree.isSearchOpen(),
1926
+ handler: (e, tree) => {
1927
+ tree.closeSearch();
1928
+ tree.setSelectedItems([tree.getFocusedItem().getId()]);
1929
+ }
1930
+ },
1931
+ nextSearchItem: {
1932
+ hotkey: "ArrowDown",
1933
+ allowWhenInputFocused: true,
1934
+ canRepeat: true,
1935
+ isEnabled: (tree) => tree.isSearchOpen(),
1936
+ handler: (e, tree) => {
1937
+ const focusItem = tree.getSearchMatchingItems().find(
1938
+ (item) => item.getItemMeta().index > tree.getFocusedItem().getItemMeta().index
1939
+ );
1940
+ focusItem == null ? void 0 : focusItem.setFocused();
1941
+ focusItem == null ? void 0 : focusItem.scrollTo({ block: "nearest", inline: "nearest" });
1942
+ }
1943
+ },
1944
+ previousSearchItem: {
1945
+ hotkey: "ArrowUp",
1946
+ allowWhenInputFocused: true,
1947
+ canRepeat: true,
1948
+ isEnabled: (tree) => tree.isSearchOpen(),
1949
+ handler: (e, tree) => {
1950
+ const focusItem = [...tree.getSearchMatchingItems()].reverse().find(
1951
+ (item) => item.getItemMeta().index < tree.getFocusedItem().getItemMeta().index
1952
+ );
1953
+ focusItem == null ? void 0 : focusItem.setFocused();
1954
+ focusItem == null ? void 0 : focusItem.scrollTo({ block: "nearest", inline: "nearest" });
1955
+ }
1956
+ }
1957
+ }
1958
+ };
1959
+
1960
+ // src/features/renaming/feature.ts
1961
+ var renamingFeature = {
1962
+ key: "renaming",
1963
+ overwrites: ["drag-and-drop"],
1964
+ getDefaultConfig: (defaultConfig, tree) => __spreadValues({
1965
+ setRenamingItem: makeStateUpdater("renamingItem", tree),
1966
+ setRenamingValue: makeStateUpdater("renamingValue", tree),
1967
+ canRename: () => true
1968
+ }, defaultConfig),
1969
+ stateHandlerNames: {
1970
+ renamingItem: "setRenamingItem",
1971
+ renamingValue: "setRenamingValue"
1972
+ },
1973
+ treeInstance: {
1974
+ getRenamingItem: ({ tree }) => {
1975
+ const itemId = tree.getState().renamingItem;
1976
+ return itemId ? tree.getItemInstance(itemId) : null;
1977
+ },
1978
+ getRenamingValue: ({ tree }) => tree.getState().renamingValue || "",
1979
+ abortRenaming: ({ tree }) => {
1980
+ tree.applySubStateUpdate("renamingItem", null);
1981
+ tree.updateDomFocus();
1982
+ },
1983
+ completeRenaming: ({ tree }) => {
1984
+ var _a;
1985
+ const config = tree.getConfig();
1986
+ const item = tree.getRenamingItem();
1987
+ if (item) {
1988
+ (_a = config.onRename) == null ? void 0 : _a.call(config, item, tree.getState().renamingValue || "");
1989
+ }
1990
+ tree.applySubStateUpdate("renamingItem", null);
1991
+ tree.updateDomFocus();
1992
+ },
1993
+ isRenamingItem: ({ tree }) => !!tree.getState().renamingItem
1994
+ },
1995
+ itemInstance: {
1996
+ startRenaming: ({ tree, item, itemId }) => {
1997
+ if (!item.canRename()) {
1998
+ return;
1999
+ }
2000
+ tree.applySubStateUpdate("renamingItem", itemId);
2001
+ tree.applySubStateUpdate("renamingValue", item.getItemName());
2002
+ },
2003
+ getRenameInputProps: ({ tree }) => ({
2004
+ ref: (r) => r == null ? void 0 : r.focus(),
2005
+ onBlur: () => tree.abortRenaming(),
2006
+ value: tree.getRenamingValue(),
2007
+ onChange: (e) => {
2008
+ var _a;
2009
+ tree.applySubStateUpdate("renamingValue", (_a = e.target) == null ? void 0 : _a.value);
2010
+ }
2011
+ }),
2012
+ canRename: ({ tree, item }) => {
2013
+ var _a, _b, _c;
2014
+ return (_c = (_b = (_a = tree.getConfig()).canRename) == null ? void 0 : _b.call(_a, item)) != null ? _c : true;
2015
+ },
2016
+ isRenaming: ({ tree, item }) => item.getId() === tree.getState().renamingItem,
2017
+ getProps: ({ prev, item }) => {
2018
+ var _a;
2019
+ const isRenaming = item.isRenaming();
2020
+ const prevProps = (_a = prev == null ? void 0 : prev()) != null ? _a : {};
2021
+ return isRenaming ? __spreadProps(__spreadValues({}, prevProps), {
2022
+ draggable: false,
2023
+ onDragStart: () => {
2024
+ }
2025
+ }) : prevProps;
2026
+ }
2027
+ },
2028
+ hotkeys: {
2029
+ renameItem: {
2030
+ hotkey: "F2",
2031
+ handler: (e, tree) => {
2032
+ tree.getFocusedItem().startRenaming();
2033
+ }
2034
+ },
2035
+ abortRenaming: {
2036
+ hotkey: "Escape",
2037
+ allowWhenInputFocused: true,
2038
+ isEnabled: (tree) => tree.isRenamingItem(),
2039
+ handler: (e, tree) => {
2040
+ tree.abortRenaming();
2041
+ }
2042
+ },
2043
+ completeRenaming: {
2044
+ hotkey: "Enter",
2045
+ allowWhenInputFocused: true,
2046
+ isEnabled: (tree) => tree.isRenamingItem(),
2047
+ handler: (e, tree) => {
2048
+ tree.completeRenaming();
2049
+ }
2050
+ }
2051
+ }
2052
+ };
2053
+
2054
+ // src/features/expand-all/feature.ts
2055
+ var expandAllFeature = {
2056
+ key: "expand-all",
2057
+ treeInstance: {
2058
+ expandAll: (_0, _1) => __async(null, [_0, _1], function* ({ tree }, cancelToken) {
2059
+ yield Promise.all(
2060
+ tree.getItems().map((item) => item.expandAll(cancelToken))
2061
+ );
2062
+ }),
2063
+ collapseAll: ({ tree }) => {
2064
+ tree.applySubStateUpdate("expandedItems", []);
2065
+ tree.rebuildTree();
2066
+ }
2067
+ },
2068
+ itemInstance: {
2069
+ expandAll: (_0, _1) => __async(null, [_0, _1], function* ({ tree, item }, cancelToken) {
2070
+ if (cancelToken == null ? void 0 : cancelToken.current) {
2071
+ return;
2072
+ }
2073
+ if (!item.isFolder()) {
2074
+ return;
2075
+ }
2076
+ item.expand();
2077
+ yield tree.waitForItemChildrenLoaded(item.getId());
2078
+ yield Promise.all(
2079
+ item.getChildren().map((child) => __async(null, null, function* () {
2080
+ yield tree.waitForItemChildrenLoaded(item.getId());
2081
+ yield child == null ? void 0 : child.expandAll(cancelToken);
2082
+ }))
2083
+ );
2084
+ }),
2085
+ collapseAll: ({ item }) => {
2086
+ if (!item.isExpanded()) return;
2087
+ for (const child of item.getChildren()) {
2088
+ child == null ? void 0 : child.collapseAll();
2089
+ }
2090
+ item.collapse();
2091
+ }
2092
+ },
2093
+ hotkeys: {
2094
+ expandSelected: {
2095
+ hotkey: "Control+Shift+Plus",
2096
+ handler: (_, tree) => __async(null, null, function* () {
2097
+ const cancelToken = { current: false };
2098
+ const cancelHandler = (e) => {
2099
+ if (e.code === "Escape") {
2100
+ cancelToken.current = true;
2101
+ }
2102
+ };
2103
+ document.addEventListener("keydown", cancelHandler);
2104
+ yield Promise.all(
2105
+ tree.getSelectedItems().map((item) => item.expandAll(cancelToken))
2106
+ );
2107
+ document.removeEventListener("keydown", cancelHandler);
2108
+ })
2109
+ },
2110
+ collapseSelected: {
2111
+ hotkey: "Control+Shift+Minus",
2112
+ handler: (_, tree) => {
2113
+ tree.getSelectedItems().forEach((item) => item.collapseAll());
2114
+ }
2115
+ }
2116
+ }
2117
+ };
2118
+
2119
+ // src/features/prop-memoization/feature.ts
2120
+ var memoize = (props, memoizedProps) => {
2121
+ for (const key in props) {
2122
+ if (typeof props[key] === "function") {
2123
+ if (memoizedProps && key in memoizedProps) {
2124
+ props[key] = memoizedProps[key];
2125
+ } else {
2126
+ memoizedProps[key] = props[key];
2127
+ }
2128
+ }
2129
+ }
2130
+ return props;
2131
+ };
2132
+ var propMemoizationFeature = {
2133
+ key: "prop-memoization",
2134
+ overwrites: [
2135
+ "main",
2136
+ "async-data-loader",
2137
+ "sync-data-loader",
2138
+ "drag-and-drop",
2139
+ "expand-all",
2140
+ "hotkeys-core",
2141
+ "renaming",
2142
+ "search",
2143
+ "selection"
2144
+ ],
2145
+ treeInstance: {
2146
+ getContainerProps: ({ tree, prev }, treeLabel) => {
2147
+ var _a, _b, _c, _d, _e;
2148
+ const dataRef = tree.getDataRef();
2149
+ const props = (_a = prev == null ? void 0 : prev(treeLabel)) != null ? _a : {};
2150
+ (_c = (_b = dataRef.current).memo) != null ? _c : _b.memo = {};
2151
+ (_e = (_d = dataRef.current.memo).tree) != null ? _e : _d.tree = {};
2152
+ return memoize(props, dataRef.current.memo.tree);
2153
+ },
2154
+ getSearchInputElementProps: ({ tree, prev }) => {
2155
+ var _a, _b, _c, _d, _e;
2156
+ const dataRef = tree.getDataRef();
2157
+ const props = (_a = prev == null ? void 0 : prev()) != null ? _a : {};
2158
+ (_c = (_b = dataRef.current).memo) != null ? _c : _b.memo = {};
2159
+ (_e = (_d = dataRef.current.memo).search) != null ? _e : _d.search = {};
2160
+ return memoize(props, dataRef.current.memo.search);
2161
+ }
2162
+ },
2163
+ itemInstance: {
2164
+ getProps: ({ item, prev }) => {
2165
+ var _a, _b, _c, _d, _e;
2166
+ const dataRef = item.getDataRef();
2167
+ const props = (_a = prev == null ? void 0 : prev()) != null ? _a : {};
2168
+ (_c = (_b = dataRef.current).memo) != null ? _c : _b.memo = {};
2169
+ (_e = (_d = dataRef.current.memo).item) != null ? _e : _d.item = {};
2170
+ return memoize(props, dataRef.current.memo.item);
2171
+ },
2172
+ getRenameInputProps: ({ item, prev }) => {
2173
+ var _a, _b, _c, _d, _e;
2174
+ const dataRef = item.getDataRef();
2175
+ const props = (_a = prev == null ? void 0 : prev()) != null ? _a : {};
2176
+ (_c = (_b = dataRef.current).memo) != null ? _c : _b.memo = {};
2177
+ (_e = (_d = dataRef.current.memo).rename) != null ? _e : _d.rename = {};
2178
+ return memoize(props, dataRef.current.memo.rename);
2179
+ }
2180
+ }
2181
+ };
2182
+
2183
+ // src/utilities/remove-items-from-parents.ts
2184
+ var removeItemsFromParents = (movedItems, onChangeChildren) => __async(null, null, function* () {
2185
+ const movedItemsIds = movedItems.map((item) => item.getId());
2186
+ const uniqueParents = [
2187
+ ...new Set(movedItems.map((item) => item.getParent()))
2188
+ ];
2189
+ for (const parent of uniqueParents) {
2190
+ const siblings = parent == null ? void 0 : parent.getChildren();
2191
+ if (siblings && parent) {
2192
+ const newChildren = siblings.filter((sibling) => !movedItemsIds.includes(sibling.getId())).map((i) => i.getId());
2193
+ yield onChangeChildren(parent, newChildren);
2194
+ if (parent && "updateCachedChildrenIds" in parent) {
2195
+ parent == null ? void 0 : parent.updateCachedChildrenIds(newChildren);
2196
+ }
2197
+ }
2198
+ }
2199
+ movedItems[0].getTree().rebuildTree();
2200
+ });
2201
+
2202
+ // src/utilities/insert-items-at-target.ts
2203
+ var insertItemsAtTarget = (itemIds, target, onChangeChildren) => __async(null, null, function* () {
2204
+ yield target.item.getTree().waitForItemChildrenLoaded(target.item.getId());
2205
+ const oldChildrenIds = target.item.getTree().retrieveChildrenIds(target.item.getId());
2206
+ if (!("childIndex" in target)) {
2207
+ const newChildren2 = [...oldChildrenIds, ...itemIds];
2208
+ yield onChangeChildren(target.item, newChildren2);
2209
+ if (target.item && "updateCachedChildrenIds" in target.item) {
2210
+ target.item.updateCachedChildrenIds(newChildren2);
2211
+ }
2212
+ target.item.getTree().rebuildTree();
2213
+ return;
2214
+ }
2215
+ const newChildren = [
2216
+ ...oldChildrenIds.slice(0, target.insertionIndex),
2217
+ ...itemIds,
2218
+ ...oldChildrenIds.slice(target.insertionIndex)
2219
+ ];
2220
+ yield onChangeChildren(target.item, newChildren);
2221
+ if (target.item && "updateCachedChildrenIds" in target.item) {
2222
+ target.item.updateCachedChildrenIds(newChildren);
2223
+ }
2224
+ target.item.getTree().rebuildTree();
2225
+ });
2226
+
2227
+ // src/utilities/create-on-drop-handler.ts
2228
+ var createOnDropHandler = (onChangeChildren) => (items, target) => __async(null, null, function* () {
2229
+ const itemIds = items.map((item) => item.getId());
2230
+ yield removeItemsFromParents(items, onChangeChildren);
2231
+ yield insertItemsAtTarget(itemIds, target, onChangeChildren);
2232
+ });
2233
+
2234
+ // src/core/build-proxified-instance.ts
2235
+ var noop = () => {
2236
+ };
2237
+ var findPrevInstanceMethod = (features, instanceType, methodKey, featureSearchIndex) => {
2238
+ var _a;
2239
+ for (let i = featureSearchIndex; i >= 0; i--) {
2240
+ const feature = features[i];
2241
+ const itemInstanceMethod = (_a = feature[instanceType]) == null ? void 0 : _a[methodKey];
2242
+ if (itemInstanceMethod) {
2243
+ return i;
2244
+ }
2245
+ }
2246
+ return null;
2247
+ };
2248
+ var invokeInstanceMethod = (features, instanceType, opts, methodKey, featureIndex, args) => {
2249
+ var _a;
2250
+ const prevIndex = findPrevInstanceMethod(
2251
+ features,
2252
+ instanceType,
2253
+ methodKey,
2254
+ featureIndex - 1
2255
+ );
2256
+ const itemInstanceMethod = (_a = features[featureIndex][instanceType]) == null ? void 0 : _a[methodKey];
2257
+ return itemInstanceMethod(
2258
+ __spreadProps(__spreadValues({}, opts), {
2259
+ prev: prevIndex !== null ? (...newArgs) => invokeInstanceMethod(
2260
+ features,
2261
+ instanceType,
2262
+ opts,
2263
+ methodKey,
2264
+ prevIndex,
2265
+ newArgs
2266
+ ) : null
2267
+ }),
2268
+ ...args
2269
+ );
2270
+ };
2271
+ var buildProxiedInstance = (features, instanceType, buildOpts) => {
2272
+ const opts = {};
2273
+ const item = new Proxy(
2274
+ {},
2275
+ {
2276
+ has(target, key) {
2277
+ if (typeof key === "symbol") {
2278
+ return false;
2279
+ }
2280
+ if (key === "toJSON") {
2281
+ return false;
2282
+ }
2283
+ const hasInstanceMethod = findPrevInstanceMethod(
2284
+ features,
2285
+ instanceType,
2286
+ key,
2287
+ features.length - 1
2288
+ );
2289
+ return Boolean(hasInstanceMethod);
2290
+ },
2291
+ get(target, key) {
2292
+ if (typeof key === "symbol") {
2293
+ return void 0;
2294
+ }
2295
+ if (key === "toJSON") {
2296
+ return {};
2297
+ }
2298
+ return (...args) => {
2299
+ const featureIndex = findPrevInstanceMethod(
2300
+ features,
2301
+ instanceType,
2302
+ key,
2303
+ features.length - 1
2304
+ );
2305
+ if (featureIndex === null) {
2306
+ throw throwError(`feature missing for method ${key}`);
2307
+ }
2308
+ return invokeInstanceMethod(
2309
+ features,
2310
+ instanceType,
2311
+ opts,
2312
+ key,
2313
+ featureIndex,
2314
+ args
2315
+ );
2316
+ };
2317
+ }
2318
+ }
2319
+ );
2320
+ Object.assign(opts, buildOpts(item));
2321
+ return [item, noop];
2322
+ };
2323
+ // Annotate the CommonJS export names for ESM import in node:
2324
+ 0 && (module.exports = {
2325
+ AssistiveDndState,
2326
+ CheckedState,
2327
+ DragTargetPosition,
2328
+ asyncDataLoaderFeature,
2329
+ buildProxiedInstance,
2330
+ buildStaticInstance,
2331
+ checkboxesFeature,
2332
+ createOnDropHandler,
2333
+ createTree,
2334
+ dragAndDropFeature,
2335
+ expandAllFeature,
2336
+ hotkeysCoreFeature,
2337
+ insertItemsAtTarget,
2338
+ isOrderedDragTarget,
2339
+ keyboardDragAndDropFeature,
2340
+ makeStateUpdater,
2341
+ propMemoizationFeature,
2342
+ removeItemsFromParents,
2343
+ renamingFeature,
2344
+ searchFeature,
2345
+ selectionFeature,
2346
+ syncDataLoaderFeature
2347
+ });