@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
@@ -1,47 +0,0 @@
1
- import { FeatureImplementation, HotkeysConfig, ItemInstance, SetStateFn, TreeConfig, TreeInstance, TreeState, Updater } from "../../types/core";
2
- import { ItemMeta } from "../tree/types";
3
- export type InstanceTypeMap = {
4
- itemInstance: ItemInstance<any>;
5
- treeInstance: TreeInstance<any>;
6
- };
7
- export type InstanceBuilder = <T extends keyof InstanceTypeMap>(features: FeatureImplementation[], instanceType: T, buildOpts: (self: any) => any) => [instance: InstanceTypeMap[T], finalize: () => void];
8
- export type MainFeatureDef<T = any> = {
9
- state: {};
10
- config: {
11
- features?: FeatureImplementation<any>[];
12
- initialState?: Partial<TreeState<T>>;
13
- state?: Partial<TreeState<T>>;
14
- setState?: SetStateFn<Partial<TreeState<T>>>;
15
- instanceBuilder?: InstanceBuilder;
16
- };
17
- treeInstance: {
18
- /** @internal */
19
- applySubStateUpdate: <K extends keyof TreeState<any>>(stateName: K, updater: Updater<TreeState<T>[K]>) => void;
20
- /** @internal */
21
- buildItemInstance: (itemId: string) => ItemInstance<T>;
22
- setState: SetStateFn<TreeState<T>>;
23
- getState: () => TreeState<T>;
24
- setConfig: SetStateFn<TreeConfig<T>>;
25
- getConfig: () => TreeConfig<T>;
26
- getItemInstance: (itemId: string) => ItemInstance<T>;
27
- getItems: () => ItemInstance<T>[];
28
- registerElement: (element: HTMLElement | null) => void;
29
- getElement: () => HTMLElement | undefined | null;
30
- /** @internal */
31
- getDataRef: <D>() => {
32
- current: D;
33
- };
34
- getHotkeyPresets: () => HotkeysConfig<T>;
35
- rebuildTree: () => void;
36
- };
37
- itemInstance: {
38
- registerElement: (element: HTMLElement | null) => void;
39
- getItemMeta: () => ItemMeta;
40
- getElement: () => HTMLElement | undefined | null;
41
- /** @internal */
42
- getDataRef: <D>() => {
43
- current: D;
44
- };
45
- };
46
- hotkeys: never;
47
- };
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const propMemoizationFeature: FeatureImplementation;
@@ -1,70 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.propMemoizationFeature = void 0;
4
- const memoize = (props, memoizedProps) => {
5
- for (const key in props) {
6
- if (typeof props[key] === "function") {
7
- if (memoizedProps && key in memoizedProps) {
8
- props[key] = memoizedProps[key];
9
- }
10
- else {
11
- memoizedProps[key] = props[key];
12
- }
13
- }
14
- }
15
- return props;
16
- };
17
- exports.propMemoizationFeature = {
18
- key: "prop-memoization",
19
- overwrites: [
20
- "main",
21
- "async-data-loader",
22
- "sync-data-loader",
23
- "drag-and-drop",
24
- "expand-all",
25
- "hotkeys-core",
26
- "renaming",
27
- "search",
28
- "selection",
29
- ],
30
- treeInstance: {
31
- getContainerProps: ({ tree, prev }, treeLabel) => {
32
- var _a, _b, _c;
33
- var _d, _e;
34
- const dataRef = tree.getDataRef();
35
- const props = (_a = prev === null || prev === void 0 ? void 0 : prev(treeLabel)) !== null && _a !== void 0 ? _a : {};
36
- (_b = (_d = dataRef.current).memo) !== null && _b !== void 0 ? _b : (_d.memo = {});
37
- (_c = (_e = dataRef.current.memo).tree) !== null && _c !== void 0 ? _c : (_e.tree = {});
38
- return memoize(props, dataRef.current.memo.tree);
39
- },
40
- getSearchInputElementProps: ({ tree, prev }) => {
41
- var _a, _b, _c;
42
- var _d, _e;
43
- const dataRef = tree.getDataRef();
44
- const props = (_a = prev === null || prev === void 0 ? void 0 : prev()) !== null && _a !== void 0 ? _a : {};
45
- (_b = (_d = dataRef.current).memo) !== null && _b !== void 0 ? _b : (_d.memo = {});
46
- (_c = (_e = dataRef.current.memo).search) !== null && _c !== void 0 ? _c : (_e.search = {});
47
- return memoize(props, dataRef.current.memo.search);
48
- },
49
- },
50
- itemInstance: {
51
- getProps: ({ item, prev }) => {
52
- var _a, _b, _c;
53
- var _d, _e;
54
- const dataRef = item.getDataRef();
55
- const props = (_a = prev === null || prev === void 0 ? void 0 : prev()) !== null && _a !== void 0 ? _a : {};
56
- (_b = (_d = dataRef.current).memo) !== null && _b !== void 0 ? _b : (_d.memo = {});
57
- (_c = (_e = dataRef.current.memo).item) !== null && _c !== void 0 ? _c : (_e.item = {});
58
- return memoize(props, dataRef.current.memo.item);
59
- },
60
- getRenameInputProps: ({ item, prev }) => {
61
- var _a, _b, _c;
62
- var _d, _e;
63
- const dataRef = item.getDataRef();
64
- const props = (_a = prev === null || prev === void 0 ? void 0 : prev()) !== null && _a !== void 0 ? _a : {};
65
- (_b = (_d = dataRef.current).memo) !== null && _b !== void 0 ? _b : (_d.memo = {});
66
- (_c = (_e = dataRef.current.memo).rename) !== null && _c !== void 0 ? _c : (_e.rename = {});
67
- return memoize(props, dataRef.current.memo.rename);
68
- },
69
- },
70
- };
@@ -1,15 +0,0 @@
1
- export interface PropMemoizationDataRef {
2
- memo?: {
3
- tree?: Record<string, any>;
4
- item?: Record<string, any>;
5
- search?: Record<string, any>;
6
- rename?: Record<string, any>;
7
- };
8
- }
9
- export type PropMemoizationFeatureDef = {
10
- state: {};
11
- config: {};
12
- treeInstance: {};
13
- itemInstance: {};
14
- hotkeys: never;
15
- };
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const renamingFeature: FeatureImplementation;
@@ -1,86 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.renamingFeature = void 0;
4
- const utils_1 = require("../../utils");
5
- exports.renamingFeature = {
6
- key: "renaming",
7
- overwrites: ["drag-and-drop"],
8
- getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setRenamingItem: (0, utils_1.makeStateUpdater)("renamingItem", tree), setRenamingValue: (0, utils_1.makeStateUpdater)("renamingValue", tree), canRename: () => true }, defaultConfig)),
9
- stateHandlerNames: {
10
- renamingItem: "setRenamingItem",
11
- renamingValue: "setRenamingValue",
12
- },
13
- treeInstance: {
14
- getRenamingItem: ({ tree }) => {
15
- const itemId = tree.getState().renamingItem;
16
- return itemId ? tree.getItemInstance(itemId) : null;
17
- },
18
- getRenamingValue: ({ tree }) => tree.getState().renamingValue || "",
19
- abortRenaming: ({ tree }) => {
20
- tree.applySubStateUpdate("renamingItem", null);
21
- tree.updateDomFocus();
22
- },
23
- completeRenaming: ({ tree }) => {
24
- var _a;
25
- const config = tree.getConfig();
26
- const item = tree.getRenamingItem();
27
- if (item) {
28
- (_a = config.onRename) === null || _a === void 0 ? void 0 : _a.call(config, item, tree.getState().renamingValue || "");
29
- }
30
- tree.applySubStateUpdate("renamingItem", null);
31
- tree.updateDomFocus();
32
- },
33
- isRenamingItem: ({ tree }) => !!tree.getState().renamingItem,
34
- },
35
- itemInstance: {
36
- startRenaming: ({ tree, item, itemId }) => {
37
- if (!item.canRename()) {
38
- return;
39
- }
40
- tree.applySubStateUpdate("renamingItem", itemId);
41
- tree.applySubStateUpdate("renamingValue", item.getItemName());
42
- },
43
- getRenameInputProps: ({ tree }) => ({
44
- ref: (r) => r === null || r === void 0 ? void 0 : r.focus(),
45
- onBlur: () => tree.abortRenaming(),
46
- value: tree.getRenamingValue(),
47
- onChange: (e) => {
48
- var _a;
49
- tree.applySubStateUpdate("renamingValue", (_a = e.target) === null || _a === void 0 ? void 0 : _a.value);
50
- },
51
- }),
52
- canRename: ({ tree, item }) => { var _a, _b, _c; return (_c = (_b = (_a = tree.getConfig()).canRename) === null || _b === void 0 ? void 0 : _b.call(_a, item)) !== null && _c !== void 0 ? _c : true; },
53
- isRenaming: ({ tree, item }) => item.getId() === tree.getState().renamingItem,
54
- getProps: ({ prev, item }) => {
55
- var _a;
56
- const isRenaming = item.isRenaming();
57
- const prevProps = (_a = prev === null || prev === void 0 ? void 0 : prev()) !== null && _a !== void 0 ? _a : {};
58
- return isRenaming
59
- ? Object.assign(Object.assign({}, prevProps), { draggable: false, onDragStart: () => { } }) : prevProps;
60
- },
61
- },
62
- hotkeys: {
63
- renameItem: {
64
- hotkey: "F2",
65
- handler: (e, tree) => {
66
- tree.getFocusedItem().startRenaming();
67
- },
68
- },
69
- abortRenaming: {
70
- hotkey: "Escape",
71
- allowWhenInputFocused: true,
72
- isEnabled: (tree) => tree.isRenamingItem(),
73
- handler: (e, tree) => {
74
- tree.abortRenaming();
75
- },
76
- },
77
- completeRenaming: {
78
- hotkey: "Enter",
79
- allowWhenInputFocused: true,
80
- isEnabled: (tree) => tree.isRenamingItem(),
81
- handler: (e, tree) => {
82
- tree.completeRenaming();
83
- },
84
- },
85
- },
86
- };
@@ -1,27 +0,0 @@
1
- import { ItemInstance, SetStateFn } from "../../types/core";
2
- export type RenamingFeatureDef<T> = {
3
- state: {
4
- renamingItem?: string | null;
5
- renamingValue?: string;
6
- };
7
- config: {
8
- setRenamingItem?: SetStateFn<string | null | undefined>;
9
- setRenamingValue?: SetStateFn<string | undefined>;
10
- canRename?: (item: ItemInstance<T>) => boolean;
11
- onRename?: (item: ItemInstance<T>, value: string) => void;
12
- };
13
- treeInstance: {
14
- getRenamingItem: () => ItemInstance<T> | null;
15
- getRenamingValue: () => string;
16
- abortRenaming: () => void;
17
- completeRenaming: () => void;
18
- isRenamingItem: () => boolean;
19
- };
20
- itemInstance: {
21
- getRenameInputProps: () => any;
22
- canRename: () => boolean;
23
- isRenaming: () => boolean;
24
- startRenaming: () => void;
25
- };
26
- hotkeys: "renameItem" | "abortRenaming" | "completeRenaming";
27
- };
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const searchFeature: FeatureImplementation;
@@ -1,119 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.searchFeature = void 0;
4
- const utils_1 = require("../../utils");
5
- exports.searchFeature = {
6
- key: "search",
7
- getInitialState: (initialState) => (Object.assign({ search: null }, initialState)),
8
- getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setSearch: (0, utils_1.makeStateUpdater)("search", tree), isSearchMatchingItem: (search, item) => search.length > 0 &&
9
- item.getItemName().toLowerCase().includes(search.toLowerCase()) }, defaultConfig)),
10
- stateHandlerNames: {
11
- search: "setSearch",
12
- },
13
- treeInstance: {
14
- setSearch: ({ tree }, search) => {
15
- var _a;
16
- tree.applySubStateUpdate("search", search);
17
- (_a = tree
18
- .getItems()
19
- .find((item) => { var _a, _b; return (_b = (_a = tree.getConfig()).isSearchMatchingItem) === null || _b === void 0 ? void 0 : _b.call(_a, tree.getSearchValue(), item); })) === null || _a === void 0 ? void 0 : _a.setFocused();
20
- },
21
- openSearch: ({ tree }, initialValue = "") => {
22
- var _a, _b;
23
- tree.setSearch(initialValue);
24
- (_b = (_a = tree.getConfig()).onOpenSearch) === null || _b === void 0 ? void 0 : _b.call(_a);
25
- setTimeout(() => {
26
- var _a;
27
- (_a = tree.getDataRef().current.searchInput) === null || _a === void 0 ? void 0 : _a.focus();
28
- });
29
- },
30
- closeSearch: ({ tree }) => {
31
- var _a, _b;
32
- tree.setSearch(null);
33
- (_b = (_a = tree.getConfig()).onCloseSearch) === null || _b === void 0 ? void 0 : _b.call(_a);
34
- tree.updateDomFocus();
35
- },
36
- isSearchOpen: ({ tree }) => tree.getState().search !== null,
37
- getSearchValue: ({ tree }) => tree.getState().search || "",
38
- registerSearchInputElement: ({ tree }, element) => {
39
- const dataRef = tree.getDataRef();
40
- dataRef.current.searchInput = element;
41
- if (element && dataRef.current.keydownHandler) {
42
- element.addEventListener("keydown", dataRef.current.keydownHandler);
43
- }
44
- },
45
- getSearchInputElement: ({ tree }) => { var _a; return (_a = tree.getDataRef().current.searchInput) !== null && _a !== void 0 ? _a : null; },
46
- // TODO memoize with propMemoizationFeature
47
- getSearchInputElementProps: ({ tree }) => ({
48
- value: tree.getSearchValue(),
49
- onChange: (e) => tree.setSearch(e.target.value),
50
- onBlur: () => tree.closeSearch(),
51
- ref: tree.registerSearchInputElement,
52
- }),
53
- getSearchMatchingItems: (0, utils_1.memo)(({ tree }) => [
54
- tree.getSearchValue(),
55
- tree.getItems(),
56
- tree.getConfig().isSearchMatchingItem,
57
- ], (search, items, isSearchMatchingItem) => items.filter((item) => search && (isSearchMatchingItem === null || isSearchMatchingItem === void 0 ? void 0 : isSearchMatchingItem(search, item)))),
58
- },
59
- itemInstance: {
60
- isMatchingSearch: ({ tree, item }) => tree.getSearchMatchingItems().some((i) => i.getId() === item.getId()),
61
- },
62
- hotkeys: {
63
- openSearch: {
64
- hotkey: "LetterOrNumber",
65
- preventDefault: true, // TODO make true default
66
- isEnabled: (tree) => !tree.isSearchOpen(),
67
- handler: (e, tree) => {
68
- e.stopPropagation();
69
- tree.openSearch(e.key);
70
- },
71
- },
72
- closeSearch: {
73
- // TODO allow multiple, i.e. Enter
74
- hotkey: "Escape",
75
- allowWhenInputFocused: true,
76
- isEnabled: (tree) => tree.isSearchOpen(),
77
- handler: (e, tree) => {
78
- tree.closeSearch();
79
- },
80
- },
81
- submitSearch: {
82
- hotkey: "Enter",
83
- allowWhenInputFocused: true,
84
- isEnabled: (tree) => tree.isSearchOpen(),
85
- handler: (e, tree) => {
86
- tree.closeSearch();
87
- tree.setSelectedItems([tree.getFocusedItem().getId()]);
88
- },
89
- },
90
- nextSearchItem: {
91
- hotkey: "ArrowDown",
92
- allowWhenInputFocused: true,
93
- canRepeat: true,
94
- isEnabled: (tree) => tree.isSearchOpen(),
95
- handler: (e, tree) => {
96
- const focusItem = tree
97
- .getSearchMatchingItems()
98
- .find((item) => item.getItemMeta().index >
99
- tree.getFocusedItem().getItemMeta().index);
100
- focusItem === null || focusItem === void 0 ? void 0 : focusItem.setFocused();
101
- focusItem === null || focusItem === void 0 ? void 0 : focusItem.scrollTo({ block: "nearest", inline: "nearest" });
102
- },
103
- },
104
- previousSearchItem: {
105
- hotkey: "ArrowUp",
106
- allowWhenInputFocused: true,
107
- canRepeat: true,
108
- isEnabled: (tree) => tree.isSearchOpen(),
109
- handler: (e, tree) => {
110
- const focusItem = [...tree.getSearchMatchingItems()]
111
- .reverse()
112
- .find((item) => item.getItemMeta().index <
113
- tree.getFocusedItem().getItemMeta().index);
114
- focusItem === null || focusItem === void 0 ? void 0 : focusItem.setFocused();
115
- focusItem === null || focusItem === void 0 ? void 0 : focusItem.scrollTo({ block: "nearest", inline: "nearest" });
116
- },
117
- },
118
- },
119
- };
@@ -1,32 +0,0 @@
1
- import { ItemInstance, SetStateFn } from "../../types/core";
2
- import { HotkeysCoreDataRef } from "../hotkeys-core/types";
3
- export interface SearchFeatureDataRef<T = any> extends HotkeysCoreDataRef {
4
- matchingItems: ItemInstance<T>[];
5
- searchInput: HTMLInputElement | null;
6
- }
7
- export type SearchFeatureDef<T> = {
8
- state: {
9
- search: string | null;
10
- };
11
- config: {
12
- setSearch?: SetStateFn<string | null>;
13
- onOpenSearch?: () => void;
14
- onCloseSearch?: () => void;
15
- isSearchMatchingItem?: (search: string, item: ItemInstance<T>) => boolean;
16
- };
17
- treeInstance: {
18
- setSearch: (search: string | null) => void;
19
- openSearch: (initialValue?: string) => void;
20
- closeSearch: () => void;
21
- isSearchOpen: () => boolean;
22
- getSearchValue: () => string;
23
- registerSearchInputElement: (element: HTMLInputElement | null) => void;
24
- getSearchInputElement: () => HTMLInputElement | null;
25
- getSearchInputElementProps: () => any;
26
- getSearchMatchingItems: () => ItemInstance<T>[];
27
- };
28
- itemInstance: {
29
- isMatchingSearch: () => boolean;
30
- };
31
- hotkeys: "openSearch" | "closeSearch" | "submitSearch" | "nextSearchItem" | "previousSearchItem";
32
- };
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const selectionFeature: FeatureImplementation;
@@ -1,132 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.selectionFeature = void 0;
4
- const utils_1 = require("../../utils");
5
- exports.selectionFeature = {
6
- key: "selection",
7
- getInitialState: (initialState) => (Object.assign({ selectedItems: [] }, initialState)),
8
- getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setSelectedItems: (0, utils_1.makeStateUpdater)("selectedItems", tree) }, defaultConfig)),
9
- stateHandlerNames: {
10
- selectedItems: "setSelectedItems",
11
- },
12
- treeInstance: {
13
- setSelectedItems: ({ tree }, selectedItems) => {
14
- tree.applySubStateUpdate("selectedItems", selectedItems);
15
- },
16
- getSelectedItems: ({ tree }) => {
17
- return tree.getState().selectedItems.map(tree.getItemInstance);
18
- },
19
- },
20
- itemInstance: {
21
- select: ({ tree, itemId }) => {
22
- const { selectedItems } = tree.getState();
23
- tree.setSelectedItems(selectedItems.includes(itemId)
24
- ? selectedItems
25
- : [...selectedItems, itemId]);
26
- },
27
- deselect: ({ tree, itemId }) => {
28
- const { selectedItems } = tree.getState();
29
- tree.setSelectedItems(selectedItems.filter((id) => id !== itemId));
30
- },
31
- isSelected: ({ tree, itemId }) => {
32
- const { selectedItems } = tree.getState();
33
- return selectedItems.includes(itemId);
34
- },
35
- selectUpTo: ({ tree, item }, ctrl) => {
36
- const indexA = item.getItemMeta().index;
37
- // TODO dont use focused item as anchor, but last primary-clicked item
38
- const indexB = tree.getFocusedItem().getItemMeta().index;
39
- const [a, b] = indexA < indexB ? [indexA, indexB] : [indexB, indexA];
40
- const newSelectedItems = tree
41
- .getItems()
42
- .slice(a, b + 1)
43
- .map((treeItem) => treeItem.getItemMeta().itemId);
44
- if (!ctrl) {
45
- tree.setSelectedItems(newSelectedItems);
46
- return;
47
- }
48
- const { selectedItems } = tree.getState();
49
- const uniqueSelectedItems = [
50
- ...new Set([...selectedItems, ...newSelectedItems]),
51
- ];
52
- tree.setSelectedItems(uniqueSelectedItems);
53
- },
54
- toggleSelect: ({ item }) => {
55
- if (item.isSelected()) {
56
- item.deselect();
57
- }
58
- else {
59
- item.select();
60
- }
61
- },
62
- getProps: ({ tree, item, prev }) => (Object.assign(Object.assign({}, prev === null || prev === void 0 ? void 0 : prev()), { "aria-selected": item.isSelected() ? "true" : "false", onClick: (e) => {
63
- var _a, _b;
64
- if (e.shiftKey) {
65
- item.selectUpTo(e.ctrlKey || e.metaKey);
66
- }
67
- else if (e.ctrlKey || e.metaKey) {
68
- item.toggleSelect();
69
- }
70
- else {
71
- tree.setSelectedItems([item.getItemMeta().itemId]);
72
- }
73
- (_b = (_a = prev === null || prev === void 0 ? void 0 : prev()) === null || _a === void 0 ? void 0 : _a.onClick) === null || _b === void 0 ? void 0 : _b.call(_a, e);
74
- } })),
75
- },
76
- hotkeys: {
77
- // setSelectedItem: {
78
- // hotkey: "space",
79
- // handler: (e, tree) => {
80
- // tree.setSelectedItems([tree.getFocusedItem().getId()]);
81
- // },
82
- // },
83
- toggleSelectedItem: {
84
- hotkey: "Control+Space",
85
- preventDefault: true,
86
- handler: (_, tree) => {
87
- tree.getFocusedItem().toggleSelect();
88
- },
89
- },
90
- selectUpwards: {
91
- hotkey: "Shift+ArrowUp",
92
- handler: (e, tree) => {
93
- const focused = tree.getFocusedItem();
94
- const above = focused.getItemAbove();
95
- if (!above)
96
- return;
97
- if (focused.isSelected() && above.isSelected()) {
98
- focused.deselect();
99
- }
100
- else {
101
- above.select();
102
- }
103
- above.setFocused();
104
- tree.updateDomFocus();
105
- },
106
- },
107
- selectDownwards: {
108
- hotkey: "Shift+ArrowDown",
109
- handler: (e, tree) => {
110
- const focused = tree.getFocusedItem();
111
- const below = focused.getItemBelow();
112
- if (!below)
113
- return;
114
- if (focused.isSelected() && below.isSelected()) {
115
- focused.deselect();
116
- }
117
- else {
118
- below.select();
119
- }
120
- below.setFocused();
121
- tree.updateDomFocus();
122
- },
123
- },
124
- selectAll: {
125
- hotkey: "Control+KeyA",
126
- preventDefault: true,
127
- handler: (e, tree) => {
128
- tree.setSelectedItems(tree.getItems().map((item) => item.getId()));
129
- },
130
- },
131
- },
132
- };
@@ -1,21 +0,0 @@
1
- import { ItemInstance, SetStateFn } from "../../types/core";
2
- export type SelectionFeatureDef<T> = {
3
- state: {
4
- selectedItems: string[];
5
- };
6
- config: {
7
- setSelectedItems?: SetStateFn<string[]>;
8
- };
9
- treeInstance: {
10
- setSelectedItems: (selectedItems: string[]) => void;
11
- getSelectedItems: () => ItemInstance<T>[];
12
- };
13
- itemInstance: {
14
- select: () => void;
15
- deselect: () => void;
16
- toggleSelect: () => void;
17
- isSelected: () => boolean;
18
- selectUpTo: (ctrl: boolean) => void;
19
- };
20
- hotkeys: "toggleSelectedItem" | "selectUpwards" | "selectDownwards" | "selectAll";
21
- };
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const syncDataLoaderFeature: FeatureImplementation;
@@ -1,49 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.syncDataLoaderFeature = void 0;
13
- const utils_1 = require("../../utils");
14
- const errors_1 = require("../../utilities/errors");
15
- const promiseErrorMessage = "sync dataLoader returned promise";
16
- const unpromise = (data) => {
17
- if (!data || (typeof data === "object" && "then" in data)) {
18
- throw (0, errors_1.throwError)(promiseErrorMessage);
19
- }
20
- return data;
21
- };
22
- exports.syncDataLoaderFeature = {
23
- key: "sync-data-loader",
24
- getInitialState: (initialState) => (Object.assign({ loadingItemData: [], loadingItemChildrens: [] }, initialState)),
25
- getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setLoadingItemData: (0, utils_1.makeStateUpdater)("loadingItemData", tree), setLoadingItemChildrens: (0, utils_1.makeStateUpdater)("loadingItemChildrens", tree) }, defaultConfig)),
26
- stateHandlerNames: {
27
- loadingItemData: "setLoadingItemData",
28
- loadingItemChildrens: "setLoadingItemChildrens",
29
- },
30
- treeInstance: {
31
- waitForItemDataLoaded: () => __awaiter(void 0, void 0, void 0, function* () { }),
32
- waitForItemChildrenLoaded: () => __awaiter(void 0, void 0, void 0, function* () { }),
33
- retrieveItemData: ({ tree }, itemId) => {
34
- return unpromise(tree.getConfig().dataLoader.getItem(itemId));
35
- },
36
- retrieveChildrenIds: ({ tree }, itemId) => {
37
- const { dataLoader } = tree.getConfig();
38
- if ("getChildren" in dataLoader) {
39
- return unpromise(dataLoader.getChildren(itemId));
40
- }
41
- return unpromise(dataLoader.getChildrenWithData(itemId)).map((c) => c.data);
42
- },
43
- loadItemData: ({ tree }, itemId) => tree.retrieveItemData(itemId),
44
- loadChildrenIds: ({ tree }, itemId) => tree.retrieveChildrenIds(itemId),
45
- },
46
- itemInstance: {
47
- isLoading: () => false,
48
- },
49
- };