@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,27 +0,0 @@
1
- import { CustomHotkeysConfig, TreeInstance } from "../../types/core";
2
- export interface HotkeyConfig<T> {
3
- hotkey: string;
4
- canRepeat?: boolean;
5
- allowWhenInputFocused?: boolean;
6
- isEnabled?: (tree: TreeInstance<T>) => boolean;
7
- preventDefault?: boolean;
8
- handler: (e: KeyboardEvent, tree: TreeInstance<T>) => void;
9
- }
10
- export interface HotkeysCoreDataRef {
11
- keydownHandler?: (e: KeyboardEvent) => void;
12
- keyupHandler?: (e: KeyboardEvent) => void;
13
- resetHandler?: (e: FocusEvent) => void;
14
- pressedKeys: Set<string>;
15
- }
16
- export type HotkeysCoreFeatureDef<T> = {
17
- state: {};
18
- config: {
19
- hotkeys?: CustomHotkeysConfig<T>;
20
- onTreeHotkey?: (name: string, e: KeyboardEvent) => void;
21
- /** Do not handle key inputs while an HTML input element is focused */
22
- ignoreHotkeysOnInputs?: boolean;
23
- };
24
- treeInstance: {};
25
- itemInstance: {};
26
- hotkeys: never;
27
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const keyboardDragAndDropFeature: FeatureImplementation;
@@ -1,203 +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 { ItemDropCategory, canDrop, getInsertionIndex, getItemDropCategory, getReparentTarget, isOrderedDragTarget, } from "../drag-and-drop/utils";
11
- import { makeStateUpdater } from "../../utils";
12
- import { AssistiveDndState } from "./types";
13
- const getNextDragTarget = (tree, isUp, dragTarget) => {
14
- var _a, _b, _c, _d;
15
- const direction = isUp ? 0 : 1;
16
- const draggedItems = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggedItems;
17
- // currently hovering between items
18
- if (isOrderedDragTarget(dragTarget)) {
19
- const parent = dragTarget.item.getParent();
20
- const targetedItem = tree.getItems()[dragTarget.dragLineIndex - 1]; // item above dragline
21
- const targetCategory = targetedItem
22
- ? getItemDropCategory(targetedItem)
23
- : ItemDropCategory.Item;
24
- const maxLevel = (_b = targetedItem === null || targetedItem === void 0 ? void 0 : targetedItem.getItemMeta().level) !== null && _b !== void 0 ? _b : 0;
25
- const minLevel = (_d = (_c = targetedItem === null || targetedItem === void 0 ? void 0 : targetedItem.getItemBelow()) === null || _c === void 0 ? void 0 : _c.getItemMeta().level) !== null && _d !== void 0 ? _d : 0;
26
- // reparenting
27
- if (targetCategory === ItemDropCategory.LastInGroup) {
28
- if (isUp && dragTarget.dragLineLevel < maxLevel) {
29
- return getReparentTarget(targetedItem, dragTarget.dragLineLevel + 1, draggedItems);
30
- }
31
- if (!isUp && dragTarget.dragLineLevel > minLevel && parent) {
32
- return getReparentTarget(targetedItem, dragTarget.dragLineLevel - 1, draggedItems);
33
- }
34
- }
35
- const newIndex = dragTarget.dragLineIndex - 1 + direction;
36
- const item = tree.getItems()[newIndex];
37
- return item ? { item } : undefined;
38
- }
39
- // moving upwards outside of an open folder
40
- const targetingExpandedFolder = getItemDropCategory(dragTarget.item) === ItemDropCategory.ExpandedFolder;
41
- if (targetingExpandedFolder && !isUp) {
42
- return {
43
- item: dragTarget.item,
44
- childIndex: 0,
45
- insertionIndex: getInsertionIndex(dragTarget.item.getChildren(), 0, draggedItems),
46
- dragLineIndex: dragTarget.item.getItemMeta().index + direction,
47
- dragLineLevel: dragTarget.item.getItemMeta().level + 1,
48
- };
49
- }
50
- // currently hovering over item
51
- const childIndex = dragTarget.item.getIndexInParent() + direction;
52
- return {
53
- item: dragTarget.item.getParent(),
54
- childIndex,
55
- insertionIndex: getInsertionIndex(dragTarget.item.getParent().getChildren(), childIndex, draggedItems),
56
- dragLineIndex: dragTarget.item.getItemMeta().index + direction,
57
- dragLineLevel: dragTarget.item.getItemMeta().level,
58
- };
59
- };
60
- const getNextValidDragTarget = (tree, isUp, previousTarget) => {
61
- var _a, _b;
62
- if (previousTarget === void 0) { previousTarget = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.dragTarget; }
63
- if (!previousTarget)
64
- return undefined;
65
- const nextTarget = getNextDragTarget(tree, isUp, previousTarget);
66
- const dataTransfer = (_b = tree.getDataRef().current.kDndDataTransfer) !== null && _b !== void 0 ? _b : null;
67
- if (!nextTarget)
68
- return undefined;
69
- if (canDrop(dataTransfer, nextTarget, tree)) {
70
- return nextTarget;
71
- }
72
- return getNextValidDragTarget(tree, isUp, nextTarget);
73
- };
74
- const updateScroll = (tree) => {
75
- const state = tree.getState().dnd;
76
- if (!(state === null || state === void 0 ? void 0 : state.dragTarget) || isOrderedDragTarget(state.dragTarget))
77
- return;
78
- state.dragTarget.item.scrollTo({ block: "nearest", inline: "nearest" });
79
- };
80
- const initiateDrag = (tree, draggedItems, dataTransfer) => {
81
- var _a, _b;
82
- const focusedItem = tree.getFocusedItem();
83
- const { canDrag } = tree.getConfig();
84
- if (draggedItems && canDrag && !canDrag(draggedItems)) {
85
- return;
86
- }
87
- if (draggedItems) {
88
- tree.applySubStateUpdate("dnd", { draggedItems });
89
- // getNextValidDragTarget->canDrop needs the draggedItems in state
90
- (_b = (_a = tree.getConfig()).onStartKeyboardDrag) === null || _b === void 0 ? void 0 : _b.call(_a, draggedItems);
91
- }
92
- else if (dataTransfer) {
93
- tree.getDataRef().current.kDndDataTransfer = dataTransfer;
94
- }
95
- const dragTarget = getNextValidDragTarget(tree, false, {
96
- item: focusedItem,
97
- });
98
- if (!dragTarget)
99
- return;
100
- tree.applySubStateUpdate("dnd", {
101
- draggedItems,
102
- dragTarget,
103
- });
104
- tree.applySubStateUpdate("assistiveDndState", AssistiveDndState.Started);
105
- updateScroll(tree);
106
- };
107
- const moveDragPosition = (tree, isUp) => {
108
- var _a;
109
- const dragTarget = getNextValidDragTarget(tree, isUp);
110
- if (!dragTarget)
111
- return;
112
- tree.applySubStateUpdate("dnd", {
113
- draggedItems: (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggedItems,
114
- dragTarget,
115
- });
116
- tree.applySubStateUpdate("assistiveDndState", AssistiveDndState.Dragging);
117
- if (!isOrderedDragTarget(dragTarget)) {
118
- dragTarget.item.setFocused();
119
- }
120
- updateScroll(tree);
121
- };
122
- export const keyboardDragAndDropFeature = {
123
- key: "keyboard-drag-and-drop",
124
- deps: ["drag-and-drop"],
125
- getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setAssistiveDndState: makeStateUpdater("assistiveDndState", tree) }, defaultConfig)),
126
- stateHandlerNames: {
127
- assistiveDndState: "setAssistiveDndState",
128
- },
129
- treeInstance: {
130
- startKeyboardDrag: ({ tree }, draggedItems) => {
131
- initiateDrag(tree, draggedItems, undefined);
132
- },
133
- startKeyboardDragOnForeignObject: ({ tree }, dataTransfer) => {
134
- initiateDrag(tree, undefined, dataTransfer);
135
- },
136
- stopKeyboardDrag: ({ tree }) => {
137
- tree.getDataRef().current.kDndDataTransfer = undefined;
138
- tree.applySubStateUpdate("dnd", null);
139
- tree.applySubStateUpdate("assistiveDndState", AssistiveDndState.None);
140
- },
141
- },
142
- hotkeys: {
143
- startDrag: {
144
- hotkey: "Control+Shift+KeyD",
145
- preventDefault: true,
146
- isEnabled: (tree) => !tree.getState().dnd,
147
- handler: (_, tree) => {
148
- tree.startKeyboardDrag(tree.getSelectedItems());
149
- },
150
- },
151
- dragUp: {
152
- hotkey: "ArrowUp",
153
- preventDefault: true,
154
- isEnabled: (tree) => !!tree.getState().dnd,
155
- handler: (_, tree) => {
156
- moveDragPosition(tree, true);
157
- },
158
- },
159
- dragDown: {
160
- hotkey: "ArrowDown",
161
- preventDefault: true,
162
- isEnabled: (tree) => !!tree.getState().dnd,
163
- handler: (_, tree) => {
164
- moveDragPosition(tree, false);
165
- },
166
- },
167
- cancelDrag: {
168
- hotkey: "Escape",
169
- isEnabled: (tree) => !!tree.getState().dnd,
170
- handler: (_, tree) => {
171
- tree.stopKeyboardDrag();
172
- },
173
- },
174
- completeDrag: {
175
- hotkey: "Enter",
176
- preventDefault: true,
177
- isEnabled: (tree) => !!tree.getState().dnd,
178
- handler: (e, tree) => __awaiter(void 0, void 0, void 0, function* () {
179
- var _a, _b, _c, _d;
180
- e.stopPropagation();
181
- // TODO copied from keyboard onDrop, unify them
182
- const dataRef = tree.getDataRef();
183
- const target = tree.getDragTarget();
184
- const dataTransfer = (_a = dataRef.current.kDndDataTransfer) !== null && _a !== void 0 ? _a : null;
185
- if (!target || !canDrop(dataTransfer, target, tree)) {
186
- return;
187
- }
188
- const config = tree.getConfig();
189
- const draggedItems = (_b = tree.getState().dnd) === null || _b === void 0 ? void 0 : _b.draggedItems;
190
- dataRef.current.lastDragCode = undefined;
191
- tree.applySubStateUpdate("dnd", null);
192
- if (draggedItems) {
193
- yield ((_c = config.onDrop) === null || _c === void 0 ? void 0 : _c.call(config, draggedItems, target));
194
- tree.getItemInstance(draggedItems[0].getId()).setFocused();
195
- }
196
- else if (dataTransfer) {
197
- yield ((_d = config.onDropForeignDragObject) === null || _d === void 0 ? void 0 : _d.call(config, dataTransfer, target));
198
- }
199
- tree.applySubStateUpdate("assistiveDndState", AssistiveDndState.Completed);
200
- }),
201
- },
202
- },
203
- };
@@ -1,27 +0,0 @@
1
- import { ItemInstance, SetStateFn } from "../../types/core";
2
- export interface KDndDataRef {
3
- kDndDataTransfer: DataTransfer | undefined;
4
- }
5
- export declare enum AssistiveDndState {
6
- None = 0,
7
- Started = 1,
8
- Dragging = 2,
9
- Completed = 3,
10
- Aborted = 4
11
- }
12
- export type KeyboardDragAndDropFeatureDef<T> = {
13
- state: {
14
- assistiveDndState?: AssistiveDndState | null;
15
- };
16
- config: {
17
- setAssistiveDndState?: SetStateFn<AssistiveDndState | undefined | null>;
18
- onStartKeyboardDrag?: (items: ItemInstance<T>[]) => void;
19
- };
20
- treeInstance: {
21
- startKeyboardDrag: (items: ItemInstance<T>[]) => void;
22
- startKeyboardDragOnForeignObject: (dataTransfer: DataTransfer) => void;
23
- stopKeyboardDrag: () => void;
24
- };
25
- itemInstance: {};
26
- hotkeys: "startDrag" | "cancelDrag" | "completeDrag" | "dragUp" | "dragDown";
27
- };
@@ -1,8 +0,0 @@
1
- export var AssistiveDndState;
2
- (function (AssistiveDndState) {
3
- AssistiveDndState[AssistiveDndState["None"] = 0] = "None";
4
- AssistiveDndState[AssistiveDndState["Started"] = 1] = "Started";
5
- AssistiveDndState[AssistiveDndState["Dragging"] = 2] = "Dragging";
6
- AssistiveDndState[AssistiveDndState["Completed"] = 3] = "Completed";
7
- AssistiveDndState[AssistiveDndState["Aborted"] = 4] = "Aborted";
8
- })(AssistiveDndState || (AssistiveDndState = {}));
@@ -1,45 +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
- setState: SetStateFn<TreeState<T>>;
21
- getState: () => TreeState<T>;
22
- setConfig: SetStateFn<TreeConfig<T>>;
23
- getConfig: () => TreeConfig<T>;
24
- getItemInstance: (itemId: string) => ItemInstance<T>;
25
- getItems: () => ItemInstance<T>[];
26
- registerElement: (element: HTMLElement | null) => void;
27
- getElement: () => HTMLElement | undefined | null;
28
- /** @internal */
29
- getDataRef: <D>() => {
30
- current: D;
31
- };
32
- getHotkeyPresets: () => HotkeysConfig<T>;
33
- rebuildTree: () => void;
34
- };
35
- itemInstance: {
36
- registerElement: (element: HTMLElement | null) => void;
37
- getItemMeta: () => ItemMeta;
38
- getElement: () => HTMLElement | undefined | null;
39
- /** @internal */
40
- getDataRef: <D>() => {
41
- current: D;
42
- };
43
- };
44
- hotkeys: never;
45
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const propMemoizationFeature: FeatureImplementation;
@@ -1,67 +0,0 @@
1
- const memoize = (props, memoizedProps) => {
2
- for (const key in props) {
3
- if (typeof props[key] === "function") {
4
- if (memoizedProps && key in memoizedProps) {
5
- props[key] = memoizedProps[key];
6
- }
7
- else {
8
- memoizedProps[key] = props[key];
9
- }
10
- }
11
- }
12
- return props;
13
- };
14
- export const propMemoizationFeature = {
15
- key: "prop-memoization",
16
- overwrites: [
17
- "main",
18
- "async-data-loader",
19
- "sync-data-loader",
20
- "drag-and-drop",
21
- "expand-all",
22
- "hotkeys-core",
23
- "renaming",
24
- "search",
25
- "selection",
26
- ],
27
- treeInstance: {
28
- getContainerProps: ({ tree, prev }, treeLabel) => {
29
- var _a, _b, _c;
30
- var _d, _e;
31
- const dataRef = tree.getDataRef();
32
- const props = (_a = prev === null || prev === void 0 ? void 0 : prev(treeLabel)) !== null && _a !== void 0 ? _a : {};
33
- (_b = (_d = dataRef.current).memo) !== null && _b !== void 0 ? _b : (_d.memo = {});
34
- (_c = (_e = dataRef.current.memo).tree) !== null && _c !== void 0 ? _c : (_e.tree = {});
35
- return memoize(props, dataRef.current.memo.tree);
36
- },
37
- getSearchInputElementProps: ({ tree, prev }) => {
38
- var _a, _b, _c;
39
- var _d, _e;
40
- const dataRef = tree.getDataRef();
41
- const props = (_a = prev === null || prev === void 0 ? void 0 : prev()) !== null && _a !== void 0 ? _a : {};
42
- (_b = (_d = dataRef.current).memo) !== null && _b !== void 0 ? _b : (_d.memo = {});
43
- (_c = (_e = dataRef.current.memo).search) !== null && _c !== void 0 ? _c : (_e.search = {});
44
- return memoize(props, dataRef.current.memo.search);
45
- },
46
- },
47
- itemInstance: {
48
- getProps: ({ item, prev }) => {
49
- var _a, _b, _c;
50
- var _d, _e;
51
- const dataRef = item.getDataRef();
52
- const props = (_a = prev === null || prev === void 0 ? void 0 : prev()) !== null && _a !== void 0 ? _a : {};
53
- (_b = (_d = dataRef.current).memo) !== null && _b !== void 0 ? _b : (_d.memo = {});
54
- (_c = (_e = dataRef.current.memo).item) !== null && _c !== void 0 ? _c : (_e.item = {});
55
- return memoize(props, dataRef.current.memo.item);
56
- },
57
- getRenameInputProps: ({ item, prev }) => {
58
- var _a, _b, _c;
59
- var _d, _e;
60
- const dataRef = item.getDataRef();
61
- const props = (_a = prev === null || prev === void 0 ? void 0 : prev()) !== null && _a !== void 0 ? _a : {};
62
- (_b = (_d = dataRef.current).memo) !== null && _b !== void 0 ? _b : (_d.memo = {});
63
- (_c = (_e = dataRef.current.memo).rename) !== null && _c !== void 0 ? _c : (_e.rename = {});
64
- return memoize(props, dataRef.current.memo.rename);
65
- },
66
- },
67
- };
@@ -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 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const renamingFeature: FeatureImplementation;
@@ -1,83 +0,0 @@
1
- import { makeStateUpdater } from "../../utils";
2
- export const renamingFeature = {
3
- key: "renaming",
4
- overwrites: ["drag-and-drop"],
5
- getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setRenamingItem: makeStateUpdater("renamingItem", tree), setRenamingValue: makeStateUpdater("renamingValue", tree), canRename: () => true }, defaultConfig)),
6
- stateHandlerNames: {
7
- renamingItem: "setRenamingItem",
8
- renamingValue: "setRenamingValue",
9
- },
10
- treeInstance: {
11
- getRenamingItem: ({ tree }) => {
12
- const itemId = tree.getState().renamingItem;
13
- return itemId ? tree.getItemInstance(itemId) : null;
14
- },
15
- getRenamingValue: ({ tree }) => tree.getState().renamingValue || "",
16
- abortRenaming: ({ tree }) => {
17
- tree.applySubStateUpdate("renamingItem", null);
18
- tree.updateDomFocus();
19
- },
20
- completeRenaming: ({ tree }) => {
21
- var _a;
22
- const config = tree.getConfig();
23
- const item = tree.getRenamingItem();
24
- if (item) {
25
- (_a = config.onRename) === null || _a === void 0 ? void 0 : _a.call(config, item, tree.getState().renamingValue || "");
26
- }
27
- tree.applySubStateUpdate("renamingItem", null);
28
- tree.updateDomFocus();
29
- },
30
- isRenamingItem: ({ tree }) => !!tree.getState().renamingItem,
31
- },
32
- itemInstance: {
33
- startRenaming: ({ tree, item, itemId }) => {
34
- if (!item.canRename()) {
35
- return;
36
- }
37
- tree.applySubStateUpdate("renamingItem", itemId);
38
- tree.applySubStateUpdate("renamingValue", item.getItemName());
39
- },
40
- getRenameInputProps: ({ tree }) => ({
41
- ref: (r) => r === null || r === void 0 ? void 0 : r.focus(),
42
- onBlur: () => tree.abortRenaming(),
43
- value: tree.getRenamingValue(),
44
- onChange: (e) => {
45
- var _a;
46
- tree.applySubStateUpdate("renamingValue", (_a = e.target) === null || _a === void 0 ? void 0 : _a.value);
47
- },
48
- }),
49
- 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; },
50
- isRenaming: ({ tree, item }) => item.getId() === tree.getState().renamingItem,
51
- getProps: ({ prev, item }) => {
52
- var _a;
53
- const isRenaming = item.isRenaming();
54
- const prevProps = (_a = prev === null || prev === void 0 ? void 0 : prev()) !== null && _a !== void 0 ? _a : {};
55
- return isRenaming
56
- ? Object.assign(Object.assign({}, prevProps), { draggable: false, onDragStart: () => { } }) : prevProps;
57
- },
58
- },
59
- hotkeys: {
60
- renameItem: {
61
- hotkey: "F2",
62
- handler: (e, tree) => {
63
- tree.getFocusedItem().startRenaming();
64
- },
65
- },
66
- abortRenaming: {
67
- hotkey: "Escape",
68
- allowWhenInputFocused: true,
69
- isEnabled: (tree) => tree.isRenamingItem(),
70
- handler: (e, tree) => {
71
- tree.abortRenaming();
72
- },
73
- },
74
- completeRenaming: {
75
- hotkey: "Enter",
76
- allowWhenInputFocused: true,
77
- isEnabled: (tree) => tree.isRenamingItem(),
78
- handler: (e, tree) => {
79
- tree.completeRenaming();
80
- },
81
- },
82
- },
83
- };
@@ -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 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const searchFeature: FeatureImplementation;
@@ -1,116 +0,0 @@
1
- import { makeStateUpdater, memo } from "../../utils";
2
- export const searchFeature = {
3
- key: "search",
4
- getInitialState: (initialState) => (Object.assign({ search: null }, initialState)),
5
- getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setSearch: makeStateUpdater("search", tree), isSearchMatchingItem: (search, item) => search.length > 0 &&
6
- item.getItemName().toLowerCase().includes(search.toLowerCase()) }, defaultConfig)),
7
- stateHandlerNames: {
8
- search: "setSearch",
9
- },
10
- treeInstance: {
11
- setSearch: ({ tree }, search) => {
12
- var _a;
13
- tree.applySubStateUpdate("search", search);
14
- (_a = tree
15
- .getItems()
16
- .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();
17
- },
18
- openSearch: ({ tree }, initialValue = "") => {
19
- var _a, _b;
20
- tree.setSearch(initialValue);
21
- (_b = (_a = tree.getConfig()).onOpenSearch) === null || _b === void 0 ? void 0 : _b.call(_a);
22
- setTimeout(() => {
23
- var _a;
24
- (_a = tree.getDataRef().current.searchInput) === null || _a === void 0 ? void 0 : _a.focus();
25
- });
26
- },
27
- closeSearch: ({ tree }) => {
28
- var _a, _b;
29
- tree.setSearch(null);
30
- (_b = (_a = tree.getConfig()).onCloseSearch) === null || _b === void 0 ? void 0 : _b.call(_a);
31
- tree.updateDomFocus();
32
- },
33
- isSearchOpen: ({ tree }) => tree.getState().search !== null,
34
- getSearchValue: ({ tree }) => tree.getState().search || "",
35
- registerSearchInputElement: ({ tree }, element) => {
36
- const dataRef = tree.getDataRef();
37
- dataRef.current.searchInput = element;
38
- if (element && dataRef.current.keydownHandler) {
39
- element.addEventListener("keydown", dataRef.current.keydownHandler);
40
- }
41
- },
42
- getSearchInputElement: ({ tree }) => { var _a; return (_a = tree.getDataRef().current.searchInput) !== null && _a !== void 0 ? _a : null; },
43
- // TODO memoize with propMemoizationFeature
44
- getSearchInputElementProps: ({ tree }) => ({
45
- value: tree.getSearchValue(),
46
- onChange: (e) => tree.setSearch(e.target.value),
47
- onBlur: () => tree.closeSearch(),
48
- ref: tree.registerSearchInputElement,
49
- }),
50
- getSearchMatchingItems: memo(({ tree }) => [
51
- tree.getSearchValue(),
52
- tree.getItems(),
53
- tree.getConfig().isSearchMatchingItem,
54
- ], (search, items, isSearchMatchingItem) => items.filter((item) => search && (isSearchMatchingItem === null || isSearchMatchingItem === void 0 ? void 0 : isSearchMatchingItem(search, item)))),
55
- },
56
- itemInstance: {
57
- isMatchingSearch: ({ tree, item }) => tree.getSearchMatchingItems().some((i) => i.getId() === item.getId()),
58
- },
59
- hotkeys: {
60
- openSearch: {
61
- hotkey: "LetterOrNumber",
62
- preventDefault: true, // TODO make true default
63
- isEnabled: (tree) => !tree.isSearchOpen(),
64
- handler: (e, tree) => {
65
- e.stopPropagation();
66
- tree.openSearch(e.key);
67
- },
68
- },
69
- closeSearch: {
70
- // TODO allow multiple, i.e. Enter
71
- hotkey: "Escape",
72
- allowWhenInputFocused: true,
73
- isEnabled: (tree) => tree.isSearchOpen(),
74
- handler: (e, tree) => {
75
- tree.closeSearch();
76
- },
77
- },
78
- submitSearch: {
79
- hotkey: "Enter",
80
- allowWhenInputFocused: true,
81
- isEnabled: (tree) => tree.isSearchOpen(),
82
- handler: (e, tree) => {
83
- tree.closeSearch();
84
- tree.setSelectedItems([tree.getFocusedItem().getId()]);
85
- },
86
- },
87
- nextSearchItem: {
88
- hotkey: "ArrowDown",
89
- allowWhenInputFocused: true,
90
- canRepeat: true,
91
- isEnabled: (tree) => tree.isSearchOpen(),
92
- handler: (e, tree) => {
93
- const focusItem = tree
94
- .getSearchMatchingItems()
95
- .find((item) => item.getItemMeta().index >
96
- tree.getFocusedItem().getItemMeta().index);
97
- focusItem === null || focusItem === void 0 ? void 0 : focusItem.setFocused();
98
- focusItem === null || focusItem === void 0 ? void 0 : focusItem.scrollTo({ block: "nearest", inline: "nearest" });
99
- },
100
- },
101
- previousSearchItem: {
102
- hotkey: "ArrowUp",
103
- allowWhenInputFocused: true,
104
- canRepeat: true,
105
- isEnabled: (tree) => tree.isSearchOpen(),
106
- handler: (e, tree) => {
107
- const focusItem = [...tree.getSearchMatchingItems()]
108
- .reverse()
109
- .find((item) => item.getItemMeta().index <
110
- tree.getFocusedItem().getItemMeta().index);
111
- focusItem === null || focusItem === void 0 ? void 0 : focusItem.setFocused();
112
- focusItem === null || focusItem === void 0 ? void 0 : focusItem.scrollTo({ block: "nearest", inline: "nearest" });
113
- },
114
- },
115
- },
116
- };