@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,104 +0,0 @@
1
- const specialKeys = {
2
- // TODO:breaking deprecate auto-lowercase
3
- letter: /^Key[A-Z]$/,
4
- letterornumber: /^(Key[A-Z]|Digit[0-9])$/,
5
- plus: /^(NumpadAdd|Plus)$/,
6
- minus: /^(NumpadSubtract|Minus)$/,
7
- control: /^(ControlLeft|ControlRight)$/,
8
- shift: /^(ShiftLeft|ShiftRight)$/,
9
- };
10
- const testHotkeyMatch = (pressedKeys, tree, hotkey) => {
11
- const supposedKeys = hotkey.hotkey.toLowerCase().split("+"); // TODO:breaking deprecate auto-lowercase
12
- const doKeysMatch = supposedKeys.every((key) => {
13
- if (key in specialKeys) {
14
- return [...pressedKeys].some((pressedKey) => specialKeys[key].test(pressedKey));
15
- }
16
- const pressedKeysLowerCase = [...pressedKeys] // TODO:breaking deprecate auto-lowercase
17
- .map((k) => k.toLowerCase());
18
- if (pressedKeysLowerCase.includes(key.toLowerCase())) {
19
- return true;
20
- }
21
- if (pressedKeysLowerCase.includes(`key${key.toLowerCase()}`)) {
22
- // TODO:breaking deprecate e.key character matching
23
- return true;
24
- }
25
- return false;
26
- });
27
- const isEnabled = !hotkey.isEnabled || hotkey.isEnabled(tree);
28
- const equalCounts = pressedKeys.size === supposedKeys.length;
29
- return doKeysMatch && isEnabled && equalCounts;
30
- };
31
- const findHotkeyMatch = (pressedKeys, tree, config1, config2) => {
32
- var _a;
33
- return (_a = Object.entries(Object.assign(Object.assign({}, config1), config2)).find(([, hotkey]) => testHotkeyMatch(pressedKeys, tree, hotkey))) === null || _a === void 0 ? void 0 : _a[0];
34
- };
35
- export const hotkeysCoreFeature = {
36
- key: "hotkeys-core",
37
- onTreeMount: (tree, element) => {
38
- const data = tree.getDataRef();
39
- const keydown = (e) => {
40
- var _a;
41
- var _b;
42
- const { ignoreHotkeysOnInputs, onTreeHotkey, hotkeys } = tree.getConfig();
43
- if (e.target instanceof HTMLInputElement && ignoreHotkeysOnInputs) {
44
- return;
45
- }
46
- (_a = (_b = data.current).pressedKeys) !== null && _a !== void 0 ? _a : (_b.pressedKeys = new Set());
47
- const newMatch = !data.current.pressedKeys.has(e.code);
48
- data.current.pressedKeys.add(e.code);
49
- const hotkeyName = findHotkeyMatch(data.current.pressedKeys, tree, tree.getHotkeyPresets(), hotkeys);
50
- if (e.target instanceof HTMLInputElement) {
51
- // JS respects composite keydowns while input elements are focused, and
52
- // doesnt send the associated keyup events with the same key name
53
- data.current.pressedKeys.delete(e.code);
54
- }
55
- if (!hotkeyName)
56
- return;
57
- const hotkeyConfig = Object.assign(Object.assign({}, tree.getHotkeyPresets()[hotkeyName]), hotkeys === null || hotkeys === void 0 ? void 0 : hotkeys[hotkeyName]);
58
- if (!hotkeyConfig)
59
- return;
60
- if (!hotkeyConfig.allowWhenInputFocused &&
61
- e.target instanceof HTMLInputElement)
62
- return;
63
- if (!hotkeyConfig.canRepeat && !newMatch)
64
- return;
65
- if (hotkeyConfig.preventDefault)
66
- e.preventDefault();
67
- hotkeyConfig.handler(e, tree);
68
- onTreeHotkey === null || onTreeHotkey === void 0 ? void 0 : onTreeHotkey(hotkeyName, e);
69
- };
70
- const keyup = (e) => {
71
- var _a;
72
- var _b;
73
- (_a = (_b = data.current).pressedKeys) !== null && _a !== void 0 ? _a : (_b.pressedKeys = new Set());
74
- data.current.pressedKeys.delete(e.code);
75
- };
76
- const reset = () => {
77
- data.current.pressedKeys = new Set();
78
- };
79
- // keyup is registered on document, because some hotkeys shift
80
- // the focus away from the tree (i.e. search)
81
- // and then we wouldn't get the keyup event anymore
82
- element.addEventListener("keydown", keydown);
83
- document.addEventListener("keyup", keyup);
84
- window.addEventListener("focus", reset);
85
- data.current.keydownHandler = keydown;
86
- data.current.keyupHandler = keyup;
87
- data.current.resetHandler = reset;
88
- },
89
- onTreeUnmount: (tree, element) => {
90
- const data = tree.getDataRef();
91
- if (data.current.keyupHandler) {
92
- document.removeEventListener("keyup", data.current.keyupHandler);
93
- delete data.current.keyupHandler;
94
- }
95
- if (data.current.keydownHandler) {
96
- element.removeEventListener("keydown", data.current.keydownHandler);
97
- delete data.current.keydownHandler;
98
- }
99
- if (data.current.resetHandler) {
100
- window.removeEventListener("focus", data.current.resetHandler);
101
- delete data.current.resetHandler;
102
- }
103
- },
104
- };
@@ -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,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 +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;