@headless-tree/core 1.2.0 → 1.3.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 (183) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/index.d.mts +577 -0
  3. package/dist/index.d.ts +577 -0
  4. package/dist/index.js +2321 -0
  5. package/dist/index.mjs +2276 -0
  6. package/package.json +18 -10
  7. package/src/core/create-tree.ts +26 -2
  8. package/src/features/async-data-loader/feature.ts +9 -4
  9. package/src/features/async-data-loader/types.ts +2 -0
  10. package/src/features/checkboxes/checkboxes.spec.ts +149 -0
  11. package/src/features/checkboxes/feature.ts +134 -0
  12. package/src/features/checkboxes/types.ts +29 -0
  13. package/src/features/drag-and-drop/drag-and-drop.spec.ts +11 -2
  14. package/src/features/drag-and-drop/feature.ts +88 -17
  15. package/src/features/drag-and-drop/types.ts +22 -0
  16. package/src/features/keyboard-drag-and-drop/feature.ts +8 -1
  17. package/src/features/keyboard-drag-and-drop/keyboard-drag-and-drop.spec.ts +34 -3
  18. package/src/features/sync-data-loader/feature.ts +5 -1
  19. package/src/features/tree/feature.ts +9 -3
  20. package/src/features/tree/tree.spec.ts +14 -4
  21. package/src/features/tree/types.ts +3 -2
  22. package/src/index.ts +2 -0
  23. package/src/test-utils/test-tree-do.ts +2 -0
  24. package/src/test-utils/test-tree.ts +1 -0
  25. package/src/types/core.ts +2 -0
  26. package/tsconfig.json +1 -4
  27. package/vitest.config.ts +3 -1
  28. package/lib/cjs/core/build-proxified-instance.d.ts +0 -2
  29. package/lib/cjs/core/build-proxified-instance.js +0 -58
  30. package/lib/cjs/core/build-static-instance.d.ts +0 -2
  31. package/lib/cjs/core/build-static-instance.js +0 -26
  32. package/lib/cjs/core/create-tree.d.ts +0 -2
  33. package/lib/cjs/core/create-tree.js +0 -182
  34. package/lib/cjs/features/async-data-loader/feature.d.ts +0 -2
  35. package/lib/cjs/features/async-data-loader/feature.js +0 -135
  36. package/lib/cjs/features/async-data-loader/types.d.ts +0 -47
  37. package/lib/cjs/features/async-data-loader/types.js +0 -2
  38. package/lib/cjs/features/drag-and-drop/feature.d.ts +0 -2
  39. package/lib/cjs/features/drag-and-drop/feature.js +0 -179
  40. package/lib/cjs/features/drag-and-drop/types.d.ts +0 -66
  41. package/lib/cjs/features/drag-and-drop/types.js +0 -9
  42. package/lib/cjs/features/drag-and-drop/utils.d.ts +0 -27
  43. package/lib/cjs/features/drag-and-drop/utils.js +0 -182
  44. package/lib/cjs/features/expand-all/feature.d.ts +0 -2
  45. package/lib/cjs/features/expand-all/feature.js +0 -70
  46. package/lib/cjs/features/expand-all/types.d.ts +0 -19
  47. package/lib/cjs/features/expand-all/types.js +0 -2
  48. package/lib/cjs/features/hotkeys-core/feature.d.ts +0 -2
  49. package/lib/cjs/features/hotkeys-core/feature.js +0 -107
  50. package/lib/cjs/features/hotkeys-core/types.d.ts +0 -27
  51. package/lib/cjs/features/hotkeys-core/types.js +0 -2
  52. package/lib/cjs/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  53. package/lib/cjs/features/keyboard-drag-and-drop/feature.js +0 -206
  54. package/lib/cjs/features/keyboard-drag-and-drop/types.d.ts +0 -27
  55. package/lib/cjs/features/keyboard-drag-and-drop/types.js +0 -11
  56. package/lib/cjs/features/main/types.d.ts +0 -45
  57. package/lib/cjs/features/main/types.js +0 -2
  58. package/lib/cjs/features/prop-memoization/feature.d.ts +0 -2
  59. package/lib/cjs/features/prop-memoization/feature.js +0 -70
  60. package/lib/cjs/features/prop-memoization/types.d.ts +0 -15
  61. package/lib/cjs/features/prop-memoization/types.js +0 -2
  62. package/lib/cjs/features/renaming/feature.d.ts +0 -2
  63. package/lib/cjs/features/renaming/feature.js +0 -86
  64. package/lib/cjs/features/renaming/types.d.ts +0 -27
  65. package/lib/cjs/features/renaming/types.js +0 -2
  66. package/lib/cjs/features/search/feature.d.ts +0 -2
  67. package/lib/cjs/features/search/feature.js +0 -119
  68. package/lib/cjs/features/search/types.d.ts +0 -32
  69. package/lib/cjs/features/search/types.js +0 -2
  70. package/lib/cjs/features/selection/feature.d.ts +0 -2
  71. package/lib/cjs/features/selection/feature.js +0 -132
  72. package/lib/cjs/features/selection/types.d.ts +0 -21
  73. package/lib/cjs/features/selection/types.js +0 -2
  74. package/lib/cjs/features/sync-data-loader/feature.d.ts +0 -2
  75. package/lib/cjs/features/sync-data-loader/feature.js +0 -49
  76. package/lib/cjs/features/sync-data-loader/types.d.ts +0 -28
  77. package/lib/cjs/features/sync-data-loader/types.js +0 -2
  78. package/lib/cjs/features/tree/feature.d.ts +0 -2
  79. package/lib/cjs/features/tree/feature.js +0 -240
  80. package/lib/cjs/features/tree/types.d.ts +0 -62
  81. package/lib/cjs/features/tree/types.js +0 -2
  82. package/lib/cjs/index.d.ts +0 -31
  83. package/lib/cjs/index.js +0 -49
  84. package/lib/cjs/mddocs-entry.d.ts +0 -121
  85. package/lib/cjs/mddocs-entry.js +0 -17
  86. package/lib/cjs/test-utils/test-tree-do.d.ts +0 -23
  87. package/lib/cjs/test-utils/test-tree-do.js +0 -112
  88. package/lib/cjs/test-utils/test-tree-expect.d.ts +0 -17
  89. package/lib/cjs/test-utils/test-tree-expect.js +0 -66
  90. package/lib/cjs/test-utils/test-tree.d.ts +0 -48
  91. package/lib/cjs/test-utils/test-tree.js +0 -207
  92. package/lib/cjs/types/core.d.ts +0 -83
  93. package/lib/cjs/types/core.js +0 -2
  94. package/lib/cjs/types/deep-merge.d.ts +0 -13
  95. package/lib/cjs/types/deep-merge.js +0 -2
  96. package/lib/cjs/utilities/create-on-drop-handler.d.ts +0 -3
  97. package/lib/cjs/utilities/create-on-drop-handler.js +0 -20
  98. package/lib/cjs/utilities/errors.d.ts +0 -2
  99. package/lib/cjs/utilities/errors.js +0 -9
  100. package/lib/cjs/utilities/insert-items-at-target.d.ts +0 -3
  101. package/lib/cjs/utilities/insert-items-at-target.js +0 -40
  102. package/lib/cjs/utilities/remove-items-from-parents.d.ts +0 -2
  103. package/lib/cjs/utilities/remove-items-from-parents.js +0 -32
  104. package/lib/cjs/utils.d.ts +0 -6
  105. package/lib/cjs/utils.js +0 -53
  106. package/lib/esm/core/build-proxified-instance.d.ts +0 -2
  107. package/lib/esm/core/build-proxified-instance.js +0 -54
  108. package/lib/esm/core/build-static-instance.d.ts +0 -2
  109. package/lib/esm/core/build-static-instance.js +0 -22
  110. package/lib/esm/core/create-tree.d.ts +0 -2
  111. package/lib/esm/core/create-tree.js +0 -178
  112. package/lib/esm/features/async-data-loader/feature.d.ts +0 -2
  113. package/lib/esm/features/async-data-loader/feature.js +0 -132
  114. package/lib/esm/features/async-data-loader/types.d.ts +0 -47
  115. package/lib/esm/features/async-data-loader/types.js +0 -1
  116. package/lib/esm/features/drag-and-drop/feature.d.ts +0 -2
  117. package/lib/esm/features/drag-and-drop/feature.js +0 -176
  118. package/lib/esm/features/drag-and-drop/types.d.ts +0 -66
  119. package/lib/esm/features/drag-and-drop/types.js +0 -6
  120. package/lib/esm/features/drag-and-drop/utils.d.ts +0 -27
  121. package/lib/esm/features/drag-and-drop/utils.js +0 -172
  122. package/lib/esm/features/expand-all/feature.d.ts +0 -2
  123. package/lib/esm/features/expand-all/feature.js +0 -67
  124. package/lib/esm/features/expand-all/types.d.ts +0 -19
  125. package/lib/esm/features/expand-all/types.js +0 -1
  126. package/lib/esm/features/hotkeys-core/feature.d.ts +0 -2
  127. package/lib/esm/features/hotkeys-core/feature.js +0 -104
  128. package/lib/esm/features/hotkeys-core/types.d.ts +0 -27
  129. package/lib/esm/features/hotkeys-core/types.js +0 -1
  130. package/lib/esm/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  131. package/lib/esm/features/keyboard-drag-and-drop/feature.js +0 -203
  132. package/lib/esm/features/keyboard-drag-and-drop/types.d.ts +0 -27
  133. package/lib/esm/features/keyboard-drag-and-drop/types.js +0 -8
  134. package/lib/esm/features/main/types.d.ts +0 -45
  135. package/lib/esm/features/main/types.js +0 -1
  136. package/lib/esm/features/prop-memoization/feature.d.ts +0 -2
  137. package/lib/esm/features/prop-memoization/feature.js +0 -67
  138. package/lib/esm/features/prop-memoization/types.d.ts +0 -15
  139. package/lib/esm/features/prop-memoization/types.js +0 -1
  140. package/lib/esm/features/renaming/feature.d.ts +0 -2
  141. package/lib/esm/features/renaming/feature.js +0 -83
  142. package/lib/esm/features/renaming/types.d.ts +0 -27
  143. package/lib/esm/features/renaming/types.js +0 -1
  144. package/lib/esm/features/search/feature.d.ts +0 -2
  145. package/lib/esm/features/search/feature.js +0 -116
  146. package/lib/esm/features/search/types.d.ts +0 -32
  147. package/lib/esm/features/search/types.js +0 -1
  148. package/lib/esm/features/selection/feature.d.ts +0 -2
  149. package/lib/esm/features/selection/feature.js +0 -129
  150. package/lib/esm/features/selection/types.d.ts +0 -21
  151. package/lib/esm/features/selection/types.js +0 -1
  152. package/lib/esm/features/sync-data-loader/feature.d.ts +0 -2
  153. package/lib/esm/features/sync-data-loader/feature.js +0 -46
  154. package/lib/esm/features/sync-data-loader/types.d.ts +0 -28
  155. package/lib/esm/features/sync-data-loader/types.js +0 -1
  156. package/lib/esm/features/tree/feature.d.ts +0 -2
  157. package/lib/esm/features/tree/feature.js +0 -237
  158. package/lib/esm/features/tree/types.d.ts +0 -62
  159. package/lib/esm/features/tree/types.js +0 -1
  160. package/lib/esm/index.d.ts +0 -31
  161. package/lib/esm/index.js +0 -30
  162. package/lib/esm/mddocs-entry.d.ts +0 -121
  163. package/lib/esm/mddocs-entry.js +0 -1
  164. package/lib/esm/test-utils/test-tree-do.d.ts +0 -23
  165. package/lib/esm/test-utils/test-tree-do.js +0 -108
  166. package/lib/esm/test-utils/test-tree-expect.d.ts +0 -17
  167. package/lib/esm/test-utils/test-tree-expect.js +0 -62
  168. package/lib/esm/test-utils/test-tree.d.ts +0 -48
  169. package/lib/esm/test-utils/test-tree.js +0 -203
  170. package/lib/esm/types/core.d.ts +0 -83
  171. package/lib/esm/types/core.js +0 -1
  172. package/lib/esm/types/deep-merge.d.ts +0 -13
  173. package/lib/esm/types/deep-merge.js +0 -1
  174. package/lib/esm/utilities/create-on-drop-handler.d.ts +0 -3
  175. package/lib/esm/utilities/create-on-drop-handler.js +0 -16
  176. package/lib/esm/utilities/errors.d.ts +0 -2
  177. package/lib/esm/utilities/errors.js +0 -4
  178. package/lib/esm/utilities/insert-items-at-target.d.ts +0 -3
  179. package/lib/esm/utilities/insert-items-at-target.js +0 -36
  180. package/lib/esm/utilities/remove-items-from-parents.d.ts +0 -2
  181. package/lib/esm/utilities/remove-items-from-parents.js +0 -28
  182. package/lib/esm/utils.d.ts +0 -6
  183. package/lib/esm/utils.js +0 -46
@@ -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 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const selectionFeature: FeatureImplementation;
@@ -1,129 +0,0 @@
1
- import { makeStateUpdater } from "../../utils";
2
- export const selectionFeature = {
3
- key: "selection",
4
- getInitialState: (initialState) => (Object.assign({ selectedItems: [] }, initialState)),
5
- getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setSelectedItems: makeStateUpdater("selectedItems", tree) }, defaultConfig)),
6
- stateHandlerNames: {
7
- selectedItems: "setSelectedItems",
8
- },
9
- treeInstance: {
10
- setSelectedItems: ({ tree }, selectedItems) => {
11
- tree.applySubStateUpdate("selectedItems", selectedItems);
12
- },
13
- getSelectedItems: ({ tree }) => {
14
- return tree.getState().selectedItems.map(tree.getItemInstance);
15
- },
16
- },
17
- itemInstance: {
18
- select: ({ tree, itemId }) => {
19
- const { selectedItems } = tree.getState();
20
- tree.setSelectedItems(selectedItems.includes(itemId)
21
- ? selectedItems
22
- : [...selectedItems, itemId]);
23
- },
24
- deselect: ({ tree, itemId }) => {
25
- const { selectedItems } = tree.getState();
26
- tree.setSelectedItems(selectedItems.filter((id) => id !== itemId));
27
- },
28
- isSelected: ({ tree, itemId }) => {
29
- const { selectedItems } = tree.getState();
30
- return selectedItems.includes(itemId);
31
- },
32
- selectUpTo: ({ tree, item }, ctrl) => {
33
- const indexA = item.getItemMeta().index;
34
- // TODO dont use focused item as anchor, but last primary-clicked item
35
- const indexB = tree.getFocusedItem().getItemMeta().index;
36
- const [a, b] = indexA < indexB ? [indexA, indexB] : [indexB, indexA];
37
- const newSelectedItems = tree
38
- .getItems()
39
- .slice(a, b + 1)
40
- .map((treeItem) => treeItem.getItemMeta().itemId);
41
- if (!ctrl) {
42
- tree.setSelectedItems(newSelectedItems);
43
- return;
44
- }
45
- const { selectedItems } = tree.getState();
46
- const uniqueSelectedItems = [
47
- ...new Set([...selectedItems, ...newSelectedItems]),
48
- ];
49
- tree.setSelectedItems(uniqueSelectedItems);
50
- },
51
- toggleSelect: ({ item }) => {
52
- if (item.isSelected()) {
53
- item.deselect();
54
- }
55
- else {
56
- item.select();
57
- }
58
- },
59
- getProps: ({ tree, item, prev }) => (Object.assign(Object.assign({}, prev === null || prev === void 0 ? void 0 : prev()), { "aria-selected": item.isSelected() ? "true" : "false", onClick: (e) => {
60
- var _a, _b;
61
- if (e.shiftKey) {
62
- item.selectUpTo(e.ctrlKey || e.metaKey);
63
- }
64
- else if (e.ctrlKey || e.metaKey) {
65
- item.toggleSelect();
66
- }
67
- else {
68
- tree.setSelectedItems([item.getItemMeta().itemId]);
69
- }
70
- (_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);
71
- } })),
72
- },
73
- hotkeys: {
74
- // setSelectedItem: {
75
- // hotkey: "space",
76
- // handler: (e, tree) => {
77
- // tree.setSelectedItems([tree.getFocusedItem().getId()]);
78
- // },
79
- // },
80
- toggleSelectedItem: {
81
- hotkey: "Control+Space",
82
- preventDefault: true,
83
- handler: (_, tree) => {
84
- tree.getFocusedItem().toggleSelect();
85
- },
86
- },
87
- selectUpwards: {
88
- hotkey: "Shift+ArrowUp",
89
- handler: (e, tree) => {
90
- const focused = tree.getFocusedItem();
91
- const above = focused.getItemAbove();
92
- if (!above)
93
- return;
94
- if (focused.isSelected() && above.isSelected()) {
95
- focused.deselect();
96
- }
97
- else {
98
- above.select();
99
- }
100
- above.setFocused();
101
- tree.updateDomFocus();
102
- },
103
- },
104
- selectDownwards: {
105
- hotkey: "Shift+ArrowDown",
106
- handler: (e, tree) => {
107
- const focused = tree.getFocusedItem();
108
- const below = focused.getItemBelow();
109
- if (!below)
110
- return;
111
- if (focused.isSelected() && below.isSelected()) {
112
- focused.deselect();
113
- }
114
- else {
115
- below.select();
116
- }
117
- below.setFocused();
118
- tree.updateDomFocus();
119
- },
120
- },
121
- selectAll: {
122
- hotkey: "Control+KeyA",
123
- preventDefault: true,
124
- handler: (e, tree) => {
125
- tree.setSelectedItems(tree.getItems().map((item) => item.getId()));
126
- },
127
- },
128
- },
129
- };
@@ -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 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const syncDataLoaderFeature: FeatureImplementation;
@@ -1,46 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { makeStateUpdater } from "../../utils";
11
- import { throwError } from "../../utilities/errors";
12
- const promiseErrorMessage = "sync dataLoader returned promise";
13
- const unpromise = (data) => {
14
- if (!data || (typeof data === "object" && "then" in data)) {
15
- throw throwError(promiseErrorMessage);
16
- }
17
- return data;
18
- };
19
- export const syncDataLoaderFeature = {
20
- key: "sync-data-loader",
21
- getInitialState: (initialState) => (Object.assign({ loadingItemData: [], loadingItemChildrens: [] }, initialState)),
22
- getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setLoadingItemData: makeStateUpdater("loadingItemData", tree), setLoadingItemChildrens: makeStateUpdater("loadingItemChildrens", tree) }, defaultConfig)),
23
- stateHandlerNames: {
24
- loadingItemData: "setLoadingItemData",
25
- loadingItemChildrens: "setLoadingItemChildrens",
26
- },
27
- treeInstance: {
28
- waitForItemDataLoaded: () => __awaiter(void 0, void 0, void 0, function* () { }),
29
- waitForItemChildrenLoaded: () => __awaiter(void 0, void 0, void 0, function* () { }),
30
- retrieveItemData: ({ tree }, itemId) => {
31
- return unpromise(tree.getConfig().dataLoader.getItem(itemId));
32
- },
33
- retrieveChildrenIds: ({ tree }, itemId) => {
34
- const { dataLoader } = tree.getConfig();
35
- if ("getChildren" in dataLoader) {
36
- return unpromise(dataLoader.getChildren(itemId));
37
- }
38
- return unpromise(dataLoader.getChildrenWithData(itemId)).map((c) => c.data);
39
- },
40
- loadItemData: ({ tree }, itemId) => tree.retrieveItemData(itemId),
41
- loadChildrenIds: ({ tree }, itemId) => tree.retrieveChildrenIds(itemId),
42
- },
43
- itemInstance: {
44
- isLoading: () => false,
45
- },
46
- };
@@ -1,28 +0,0 @@
1
- export type TreeDataLoader<T> = {
2
- getItem: (itemId: string) => T | Promise<T>;
3
- getChildren: (itemId: string) => string[] | Promise<string[]>;
4
- } | {
5
- getItem: (itemId: string) => T | Promise<T>;
6
- getChildrenWithData: (itemId: string) => {
7
- id: string;
8
- data: T;
9
- }[] | Promise<{
10
- id: string;
11
- data: T;
12
- }[]>;
13
- };
14
- export type SyncDataLoaderFeatureDef<T> = {
15
- state: {};
16
- config: {
17
- rootItemId: string;
18
- dataLoader: TreeDataLoader<T>;
19
- };
20
- treeInstance: {
21
- retrieveItemData: (itemId: string) => T;
22
- retrieveChildrenIds: (itemId: string) => string[];
23
- };
24
- itemInstance: {
25
- isLoading: () => boolean;
26
- };
27
- hotkeys: never;
28
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const treeFeature: FeatureImplementation<any>;
@@ -1,237 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { makeStateUpdater, poll } from "../../utils";
11
- import { logWarning } from "../../utilities/errors";
12
- export const treeFeature = {
13
- key: "tree",
14
- getInitialState: (initialState) => (Object.assign({ expandedItems: [], focusedItem: null }, initialState)),
15
- getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setExpandedItems: makeStateUpdater("expandedItems", tree), setFocusedItem: makeStateUpdater("focusedItem", tree) }, defaultConfig)),
16
- stateHandlerNames: {
17
- expandedItems: "setExpandedItems",
18
- focusedItem: "setFocusedItem",
19
- },
20
- treeInstance: {
21
- getItemsMeta: ({ tree }) => {
22
- const { rootItemId } = tree.getConfig();
23
- const { expandedItems } = tree.getState();
24
- const flatItems = [];
25
- const expandedItemsSet = new Set(expandedItems); // TODO support setting state expandedItems as set instead of array
26
- const recursiveAdd = (itemId, path, level, setSize, posInSet) => {
27
- var _a;
28
- if (path.includes(itemId)) {
29
- logWarning(`Circular reference for ${path.join(".")}`);
30
- return;
31
- }
32
- flatItems.push({
33
- itemId,
34
- level,
35
- index: flatItems.length,
36
- parentId: path.at(-1),
37
- setSize,
38
- posInSet,
39
- });
40
- if (expandedItemsSet.has(itemId)) {
41
- const children = (_a = tree.retrieveChildrenIds(itemId)) !== null && _a !== void 0 ? _a : [];
42
- let i = 0;
43
- for (const childId of children) {
44
- recursiveAdd(childId, path.concat(itemId), level + 1, children.length, i++);
45
- }
46
- }
47
- };
48
- const children = tree.retrieveChildrenIds(rootItemId);
49
- let i = 0;
50
- for (const itemId of children) {
51
- recursiveAdd(itemId, [rootItemId], 0, children.length, i++);
52
- }
53
- return flatItems;
54
- },
55
- getFocusedItem: ({ tree }) => {
56
- var _a, _b;
57
- return ((_b = tree.getItemInstance((_a = tree.getState().focusedItem) !== null && _a !== void 0 ? _a : "")) !== null && _b !== void 0 ? _b : tree.getItems()[0]);
58
- },
59
- focusNextItem: ({ tree }) => {
60
- var _a;
61
- const focused = tree.getFocusedItem().getItemMeta();
62
- if (!focused)
63
- return;
64
- const nextIndex = Math.min(focused.index + 1, tree.getItems().length - 1);
65
- (_a = tree.getItems()[nextIndex]) === null || _a === void 0 ? void 0 : _a.setFocused();
66
- },
67
- focusPreviousItem: ({ tree }) => {
68
- var _a;
69
- const focused = tree.getFocusedItem().getItemMeta();
70
- if (!focused)
71
- return;
72
- const nextIndex = Math.max(focused.index - 1, 0);
73
- (_a = tree.getItems()[nextIndex]) === null || _a === void 0 ? void 0 : _a.setFocused();
74
- },
75
- updateDomFocus: ({ tree }) => {
76
- // Required because if the state is managed outside in react, the state only updated during next render
77
- setTimeout(() => __awaiter(void 0, void 0, void 0, function* () {
78
- var _a, _b;
79
- const focusedItem = tree.getFocusedItem();
80
- (_b = (_a = tree.getConfig()).scrollToItem) === null || _b === void 0 ? void 0 : _b.call(_a, focusedItem);
81
- yield poll(() => focusedItem.getElement() !== null, 20);
82
- const focusedElement = focusedItem.getElement();
83
- if (!focusedElement)
84
- return;
85
- focusedElement.focus();
86
- }));
87
- },
88
- getContainerProps: ({ prev, tree }, treeLabel) => (Object.assign(Object.assign({}, prev === null || prev === void 0 ? void 0 : prev()), { role: "tree", "aria-label": treeLabel !== null && treeLabel !== void 0 ? treeLabel : "", ref: tree.registerElement })),
89
- // relevant for hotkeys of this feature
90
- isSearchOpen: () => false,
91
- },
92
- itemInstance: {
93
- scrollTo: (_a, scrollIntoViewArg_1) => __awaiter(void 0, [_a, scrollIntoViewArg_1], void 0, function* ({ tree, item }, scrollIntoViewArg) {
94
- var _b, _c, _d;
95
- (_c = (_b = tree.getConfig()).scrollToItem) === null || _c === void 0 ? void 0 : _c.call(_b, item);
96
- yield poll(() => item.getElement() !== null, 20);
97
- (_d = item.getElement()) === null || _d === void 0 ? void 0 : _d.scrollIntoView(scrollIntoViewArg);
98
- }),
99
- getId: ({ itemId }) => itemId,
100
- getKey: ({ itemId }) => itemId, // TODO apply to all stories to use
101
- getProps: ({ item, prev }) => {
102
- const itemMeta = item.getItemMeta();
103
- return Object.assign(Object.assign({}, prev === null || prev === void 0 ? void 0 : prev()), { ref: item.registerElement, role: "treeitem", "aria-setsize": itemMeta.setSize, "aria-posinset": itemMeta.posInSet, "aria-selected": "false", "aria-label": item.getItemName(), "aria-level": itemMeta.level, tabIndex: item.isFocused() ? 0 : -1, onClick: (e) => {
104
- item.setFocused();
105
- item.primaryAction();
106
- if (e.ctrlKey || e.shiftKey || e.metaKey) {
107
- return;
108
- }
109
- if (!item.isFolder()) {
110
- return;
111
- }
112
- if (item.isExpanded()) {
113
- item.collapse();
114
- }
115
- else {
116
- item.expand();
117
- }
118
- } });
119
- },
120
- expand: ({ tree, item, itemId }) => {
121
- var _a;
122
- if (!item.isFolder()) {
123
- return;
124
- }
125
- if ((_a = tree.getState().loadingItemChildrens) === null || _a === void 0 ? void 0 : _a.includes(itemId)) {
126
- return;
127
- }
128
- tree.applySubStateUpdate("expandedItems", (expandedItems) => [
129
- ...expandedItems,
130
- itemId,
131
- ]);
132
- tree.rebuildTree();
133
- },
134
- collapse: ({ tree, item, itemId }) => {
135
- if (!item.isFolder()) {
136
- return;
137
- }
138
- tree.applySubStateUpdate("expandedItems", (expandedItems) => expandedItems.filter((id) => id !== itemId));
139
- tree.rebuildTree();
140
- },
141
- getItemData: ({ tree, itemId }) => tree.retrieveItemData(itemId),
142
- equals: ({ item }, other) => item.getId() === (other === null || other === void 0 ? void 0 : other.getId()),
143
- isExpanded: ({ tree, itemId }) => tree.getState().expandedItems.includes(itemId),
144
- isDescendentOf: ({ item }, parentId) => {
145
- const parent = item.getParent();
146
- return Boolean((parent === null || parent === void 0 ? void 0 : parent.getId()) === parentId || (parent === null || parent === void 0 ? void 0 : parent.isDescendentOf(parentId)));
147
- },
148
- isFocused: ({ tree, item, itemId }) => tree.getState().focusedItem === itemId ||
149
- (tree.getState().focusedItem === null && item.getItemMeta().index === 0),
150
- isFolder: ({ tree, item }) => item.getItemMeta().level === -1 ||
151
- tree.getConfig().isItemFolder(item),
152
- getItemName: ({ tree, item }) => {
153
- const config = tree.getConfig();
154
- return config.getItemName(item);
155
- },
156
- setFocused: ({ tree, itemId }) => {
157
- tree.applySubStateUpdate("focusedItem", itemId);
158
- },
159
- primaryAction: ({ tree, item }) => { var _a, _b; return (_b = (_a = tree.getConfig()).onPrimaryAction) === null || _b === void 0 ? void 0 : _b.call(_a, item); },
160
- getParent: ({ tree, item }) => item.getItemMeta().parentId
161
- ? tree.getItemInstance(item.getItemMeta().parentId)
162
- : undefined,
163
- getIndexInParent: ({ item }) => item.getItemMeta().posInSet,
164
- getChildren: ({ tree, itemId }) => tree.retrieveChildrenIds(itemId).map((id) => tree.getItemInstance(id)),
165
- getTree: ({ tree }) => tree,
166
- getItemAbove: ({ tree, item }) => tree.getItems()[item.getItemMeta().index - 1],
167
- getItemBelow: ({ tree, item }) => tree.getItems()[item.getItemMeta().index + 1],
168
- },
169
- hotkeys: {
170
- focusNextItem: {
171
- hotkey: "ArrowDown",
172
- canRepeat: true,
173
- preventDefault: true,
174
- isEnabled: (tree) => { var _a, _b; return !((_b = (_a = tree.isSearchOpen) === null || _a === void 0 ? void 0 : _a.call(tree)) !== null && _b !== void 0 ? _b : false) && !tree.getState().dnd; }, // TODO what happens when the feature doesnt exist? proxy method still claims to exist
175
- handler: (e, tree) => {
176
- tree.focusNextItem();
177
- tree.updateDomFocus();
178
- },
179
- },
180
- focusPreviousItem: {
181
- hotkey: "ArrowUp",
182
- canRepeat: true,
183
- preventDefault: true,
184
- isEnabled: (tree) => { var _a, _b; return !((_b = (_a = tree.isSearchOpen) === null || _a === void 0 ? void 0 : _a.call(tree)) !== null && _b !== void 0 ? _b : false) && !tree.getState().dnd; },
185
- handler: (e, tree) => {
186
- tree.focusPreviousItem();
187
- tree.updateDomFocus();
188
- },
189
- },
190
- expandOrDown: {
191
- hotkey: "ArrowRight",
192
- canRepeat: true,
193
- handler: (e, tree) => {
194
- const item = tree.getFocusedItem();
195
- if (item.isExpanded() || !item.isFolder()) {
196
- tree.focusNextItem();
197
- tree.updateDomFocus();
198
- }
199
- else {
200
- item.expand();
201
- }
202
- },
203
- },
204
- collapseOrUp: {
205
- hotkey: "ArrowLeft",
206
- canRepeat: true,
207
- handler: (e, tree) => {
208
- var _a;
209
- const item = tree.getFocusedItem();
210
- if ((!item.isExpanded() || !item.isFolder()) &&
211
- item.getItemMeta().level !== 0) {
212
- (_a = item.getParent()) === null || _a === void 0 ? void 0 : _a.setFocused();
213
- tree.updateDomFocus();
214
- }
215
- else {
216
- item.collapse();
217
- }
218
- },
219
- },
220
- focusFirstItem: {
221
- hotkey: "Home",
222
- handler: (e, tree) => {
223
- var _a;
224
- (_a = tree.getItems()[0]) === null || _a === void 0 ? void 0 : _a.setFocused();
225
- tree.updateDomFocus();
226
- },
227
- },
228
- focusLastItem: {
229
- hotkey: "End",
230
- handler: (e, tree) => {
231
- var _a;
232
- (_a = tree.getItems()[tree.getItems().length - 1]) === null || _a === void 0 ? void 0 : _a.setFocused();
233
- tree.updateDomFocus();
234
- },
235
- },
236
- },
237
- };
@@ -1,62 +0,0 @@
1
- import { ItemInstance, SetStateFn, TreeInstance } from "../../types/core";
2
- export interface ItemMeta {
3
- itemId: string;
4
- parentId: string;
5
- level: number;
6
- index: number;
7
- setSize: number;
8
- posInSet: number;
9
- }
10
- export interface TreeItemDataRef {
11
- memoizedValues: Record<string, any>;
12
- memoizedDeps: Record<string, any[] | undefined>;
13
- }
14
- export type TreeFeatureDef<T> = {
15
- state: {
16
- expandedItems: string[];
17
- focusedItem: string | null;
18
- };
19
- config: {
20
- isItemFolder: (item: ItemInstance<T>) => boolean;
21
- getItemName: (item: ItemInstance<T>) => string;
22
- onPrimaryAction?: (item: ItemInstance<T>) => void;
23
- scrollToItem?: (item: ItemInstance<T>) => void;
24
- setExpandedItems?: SetStateFn<string[]>;
25
- setFocusedItem?: SetStateFn<string | null>;
26
- };
27
- treeInstance: {
28
- /** @internal */
29
- getItemsMeta: () => ItemMeta[];
30
- getFocusedItem: () => ItemInstance<any>;
31
- focusNextItem: () => void;
32
- focusPreviousItem: () => void;
33
- updateDomFocus: () => void;
34
- /** Pass to the container rendering the tree children. The `treeLabel` parameter
35
- * will be passed as `aria-label` parameter, and is recommended to be set. */
36
- getContainerProps: (treeLabel?: string) => Record<string, any>;
37
- };
38
- itemInstance: {
39
- getId: () => string;
40
- getKey: () => string;
41
- getProps: () => Record<string, any>;
42
- getItemName: () => string;
43
- getItemData: () => T;
44
- equals: (other?: ItemInstance<any> | null) => boolean;
45
- expand: () => void;
46
- collapse: () => void;
47
- isExpanded: () => boolean;
48
- isDescendentOf: (parentId: string) => boolean;
49
- isFocused: () => boolean;
50
- isFolder: () => boolean;
51
- setFocused: () => void;
52
- getParent: () => ItemInstance<T> | undefined;
53
- getChildren: () => ItemInstance<T>[];
54
- getIndexInParent: () => number;
55
- primaryAction: () => void;
56
- getTree: () => TreeInstance<T>;
57
- getItemAbove: () => ItemInstance<T> | undefined;
58
- getItemBelow: () => ItemInstance<T> | undefined;
59
- scrollTo: (scrollIntoViewArg?: boolean | ScrollIntoViewOptions) => Promise<void>;
60
- };
61
- hotkeys: "focusNextItem" | "focusPreviousItem" | "expandOrDown" | "collapseOrUp" | "focusFirstItem" | "focusLastItem";
62
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,31 +0,0 @@
1
- export * from "./types/core";
2
- export * from "./core/create-tree";
3
- export * from "./features/tree/types";
4
- export { MainFeatureDef, InstanceBuilder } from "./features/main/types";
5
- export * from "./features/drag-and-drop/types";
6
- export * from "./features/keyboard-drag-and-drop/types";
7
- export * from "./features/selection/types";
8
- export * from "./features/async-data-loader/types";
9
- export * from "./features/sync-data-loader/types";
10
- export * from "./features/hotkeys-core/types";
11
- export * from "./features/search/types";
12
- export * from "./features/renaming/types";
13
- export * from "./features/expand-all/types";
14
- export * from "./features/prop-memoization/types";
15
- export * from "./features/selection/feature";
16
- export * from "./features/hotkeys-core/feature";
17
- export * from "./features/async-data-loader/feature";
18
- export * from "./features/sync-data-loader/feature";
19
- export * from "./features/drag-and-drop/feature";
20
- export * from "./features/keyboard-drag-and-drop/feature";
21
- export * from "./features/search/feature";
22
- export * from "./features/renaming/feature";
23
- export * from "./features/expand-all/feature";
24
- export * from "./features/prop-memoization/feature";
25
- export * from "./utilities/create-on-drop-handler";
26
- export * from "./utilities/insert-items-at-target";
27
- export * from "./utilities/remove-items-from-parents";
28
- export * from "./core/build-proxified-instance";
29
- export * from "./core/build-static-instance";
30
- export { makeStateUpdater } from "./utils";
31
- export { isOrderedDragTarget } from "./features/drag-and-drop/utils";
package/lib/esm/index.js DELETED
@@ -1,30 +0,0 @@
1
- export * from "./types/core";
2
- export * from "./core/create-tree";
3
- export * from "./features/tree/types";
4
- export * from "./features/drag-and-drop/types";
5
- export * from "./features/keyboard-drag-and-drop/types";
6
- export * from "./features/selection/types";
7
- export * from "./features/async-data-loader/types";
8
- export * from "./features/sync-data-loader/types";
9
- export * from "./features/hotkeys-core/types";
10
- export * from "./features/search/types";
11
- export * from "./features/renaming/types";
12
- export * from "./features/expand-all/types";
13
- export * from "./features/prop-memoization/types";
14
- export * from "./features/selection/feature";
15
- export * from "./features/hotkeys-core/feature";
16
- export * from "./features/async-data-loader/feature";
17
- export * from "./features/sync-data-loader/feature";
18
- export * from "./features/drag-and-drop/feature";
19
- export * from "./features/keyboard-drag-and-drop/feature";
20
- export * from "./features/search/feature";
21
- export * from "./features/renaming/feature";
22
- export * from "./features/expand-all/feature";
23
- export * from "./features/prop-memoization/feature";
24
- export * from "./utilities/create-on-drop-handler";
25
- export * from "./utilities/insert-items-at-target";
26
- export * from "./utilities/remove-items-from-parents";
27
- export * from "./core/build-proxified-instance";
28
- export * from "./core/build-static-instance";
29
- export { makeStateUpdater } from "./utils";
30
- export { isOrderedDragTarget } from "./features/drag-and-drop/utils";