@headless-tree/core 1.2.1 → 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 (189) hide show
  1. package/CHANGELOG.md +19 -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 -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 +51 -16
  15. package/src/features/drag-and-drop/types.ts +17 -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/main/types.ts +0 -2
  19. package/src/features/sync-data-loader/feature.ts +5 -1
  20. package/src/features/tree/feature.ts +4 -3
  21. package/src/features/tree/tree.spec.ts +14 -4
  22. package/src/test-utils/test-tree-do.ts +2 -0
  23. package/src/test-utils/test-tree.ts +1 -0
  24. package/tsconfig.json +1 -4
  25. package/vitest.config.ts +3 -1
  26. package/lib/cjs/core/build-proxified-instance.d.ts +0 -2
  27. package/lib/cjs/core/build-proxified-instance.js +0 -58
  28. package/lib/cjs/core/build-static-instance.d.ts +0 -2
  29. package/lib/cjs/core/build-static-instance.js +0 -26
  30. package/lib/cjs/core/create-tree.d.ts +0 -2
  31. package/lib/cjs/core/create-tree.js +0 -191
  32. package/lib/cjs/features/async-data-loader/feature.d.ts +0 -2
  33. package/lib/cjs/features/async-data-loader/feature.js +0 -135
  34. package/lib/cjs/features/async-data-loader/types.d.ts +0 -47
  35. package/lib/cjs/features/async-data-loader/types.js +0 -2
  36. package/lib/cjs/features/checkboxes/feature.d.ts +0 -2
  37. package/lib/cjs/features/checkboxes/feature.js +0 -94
  38. package/lib/cjs/features/checkboxes/types.d.ts +0 -26
  39. package/lib/cjs/features/checkboxes/types.js +0 -9
  40. package/lib/cjs/features/drag-and-drop/feature.d.ts +0 -2
  41. package/lib/cjs/features/drag-and-drop/feature.js +0 -205
  42. package/lib/cjs/features/drag-and-drop/types.d.ts +0 -71
  43. package/lib/cjs/features/drag-and-drop/types.js +0 -9
  44. package/lib/cjs/features/drag-and-drop/utils.d.ts +0 -27
  45. package/lib/cjs/features/drag-and-drop/utils.js +0 -182
  46. package/lib/cjs/features/expand-all/feature.d.ts +0 -2
  47. package/lib/cjs/features/expand-all/feature.js +0 -70
  48. package/lib/cjs/features/expand-all/types.d.ts +0 -19
  49. package/lib/cjs/features/expand-all/types.js +0 -2
  50. package/lib/cjs/features/hotkeys-core/feature.d.ts +0 -2
  51. package/lib/cjs/features/hotkeys-core/feature.js +0 -107
  52. package/lib/cjs/features/hotkeys-core/types.d.ts +0 -27
  53. package/lib/cjs/features/hotkeys-core/types.js +0 -2
  54. package/lib/cjs/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  55. package/lib/cjs/features/keyboard-drag-and-drop/feature.js +0 -206
  56. package/lib/cjs/features/keyboard-drag-and-drop/types.d.ts +0 -27
  57. package/lib/cjs/features/keyboard-drag-and-drop/types.js +0 -11
  58. package/lib/cjs/features/main/types.d.ts +0 -47
  59. package/lib/cjs/features/main/types.js +0 -2
  60. package/lib/cjs/features/prop-memoization/feature.d.ts +0 -2
  61. package/lib/cjs/features/prop-memoization/feature.js +0 -70
  62. package/lib/cjs/features/prop-memoization/types.d.ts +0 -15
  63. package/lib/cjs/features/prop-memoization/types.js +0 -2
  64. package/lib/cjs/features/renaming/feature.d.ts +0 -2
  65. package/lib/cjs/features/renaming/feature.js +0 -86
  66. package/lib/cjs/features/renaming/types.d.ts +0 -27
  67. package/lib/cjs/features/renaming/types.js +0 -2
  68. package/lib/cjs/features/search/feature.d.ts +0 -2
  69. package/lib/cjs/features/search/feature.js +0 -119
  70. package/lib/cjs/features/search/types.d.ts +0 -32
  71. package/lib/cjs/features/search/types.js +0 -2
  72. package/lib/cjs/features/selection/feature.d.ts +0 -2
  73. package/lib/cjs/features/selection/feature.js +0 -132
  74. package/lib/cjs/features/selection/types.d.ts +0 -21
  75. package/lib/cjs/features/selection/types.js +0 -2
  76. package/lib/cjs/features/sync-data-loader/feature.d.ts +0 -2
  77. package/lib/cjs/features/sync-data-loader/feature.js +0 -49
  78. package/lib/cjs/features/sync-data-loader/types.d.ts +0 -28
  79. package/lib/cjs/features/sync-data-loader/types.js +0 -2
  80. package/lib/cjs/features/tree/feature.d.ts +0 -2
  81. package/lib/cjs/features/tree/feature.js +0 -244
  82. package/lib/cjs/features/tree/types.d.ts +0 -63
  83. package/lib/cjs/features/tree/types.js +0 -2
  84. package/lib/cjs/index.d.ts +0 -33
  85. package/lib/cjs/index.js +0 -51
  86. package/lib/cjs/mddocs-entry.d.ts +0 -121
  87. package/lib/cjs/mddocs-entry.js +0 -17
  88. package/lib/cjs/test-utils/test-tree-do.d.ts +0 -23
  89. package/lib/cjs/test-utils/test-tree-do.js +0 -112
  90. package/lib/cjs/test-utils/test-tree-expect.d.ts +0 -17
  91. package/lib/cjs/test-utils/test-tree-expect.js +0 -66
  92. package/lib/cjs/test-utils/test-tree.d.ts +0 -48
  93. package/lib/cjs/test-utils/test-tree.js +0 -207
  94. package/lib/cjs/types/core.d.ts +0 -84
  95. package/lib/cjs/types/core.js +0 -2
  96. package/lib/cjs/types/deep-merge.d.ts +0 -13
  97. package/lib/cjs/types/deep-merge.js +0 -2
  98. package/lib/cjs/utilities/create-on-drop-handler.d.ts +0 -3
  99. package/lib/cjs/utilities/create-on-drop-handler.js +0 -20
  100. package/lib/cjs/utilities/errors.d.ts +0 -2
  101. package/lib/cjs/utilities/errors.js +0 -9
  102. package/lib/cjs/utilities/insert-items-at-target.d.ts +0 -3
  103. package/lib/cjs/utilities/insert-items-at-target.js +0 -40
  104. package/lib/cjs/utilities/remove-items-from-parents.d.ts +0 -2
  105. package/lib/cjs/utilities/remove-items-from-parents.js +0 -32
  106. package/lib/cjs/utils.d.ts +0 -6
  107. package/lib/cjs/utils.js +0 -53
  108. package/lib/esm/core/build-proxified-instance.d.ts +0 -2
  109. package/lib/esm/core/build-proxified-instance.js +0 -54
  110. package/lib/esm/core/build-static-instance.d.ts +0 -2
  111. package/lib/esm/core/build-static-instance.js +0 -22
  112. package/lib/esm/core/create-tree.d.ts +0 -2
  113. package/lib/esm/core/create-tree.js +0 -187
  114. package/lib/esm/features/async-data-loader/feature.d.ts +0 -2
  115. package/lib/esm/features/async-data-loader/feature.js +0 -132
  116. package/lib/esm/features/async-data-loader/types.d.ts +0 -47
  117. package/lib/esm/features/async-data-loader/types.js +0 -1
  118. package/lib/esm/features/checkboxes/feature.d.ts +0 -2
  119. package/lib/esm/features/checkboxes/feature.js +0 -91
  120. package/lib/esm/features/checkboxes/types.d.ts +0 -26
  121. package/lib/esm/features/checkboxes/types.js +0 -6
  122. package/lib/esm/features/drag-and-drop/feature.d.ts +0 -2
  123. package/lib/esm/features/drag-and-drop/feature.js +0 -202
  124. package/lib/esm/features/drag-and-drop/types.d.ts +0 -71
  125. package/lib/esm/features/drag-and-drop/types.js +0 -6
  126. package/lib/esm/features/drag-and-drop/utils.d.ts +0 -27
  127. package/lib/esm/features/drag-and-drop/utils.js +0 -172
  128. package/lib/esm/features/expand-all/feature.d.ts +0 -2
  129. package/lib/esm/features/expand-all/feature.js +0 -67
  130. package/lib/esm/features/expand-all/types.d.ts +0 -19
  131. package/lib/esm/features/expand-all/types.js +0 -1
  132. package/lib/esm/features/hotkeys-core/feature.d.ts +0 -2
  133. package/lib/esm/features/hotkeys-core/feature.js +0 -104
  134. package/lib/esm/features/hotkeys-core/types.d.ts +0 -27
  135. package/lib/esm/features/hotkeys-core/types.js +0 -1
  136. package/lib/esm/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  137. package/lib/esm/features/keyboard-drag-and-drop/feature.js +0 -203
  138. package/lib/esm/features/keyboard-drag-and-drop/types.d.ts +0 -27
  139. package/lib/esm/features/keyboard-drag-and-drop/types.js +0 -8
  140. package/lib/esm/features/main/types.d.ts +0 -47
  141. package/lib/esm/features/main/types.js +0 -1
  142. package/lib/esm/features/prop-memoization/feature.d.ts +0 -2
  143. package/lib/esm/features/prop-memoization/feature.js +0 -67
  144. package/lib/esm/features/prop-memoization/types.d.ts +0 -15
  145. package/lib/esm/features/prop-memoization/types.js +0 -1
  146. package/lib/esm/features/renaming/feature.d.ts +0 -2
  147. package/lib/esm/features/renaming/feature.js +0 -83
  148. package/lib/esm/features/renaming/types.d.ts +0 -27
  149. package/lib/esm/features/renaming/types.js +0 -1
  150. package/lib/esm/features/search/feature.d.ts +0 -2
  151. package/lib/esm/features/search/feature.js +0 -116
  152. package/lib/esm/features/search/types.d.ts +0 -32
  153. package/lib/esm/features/search/types.js +0 -1
  154. package/lib/esm/features/selection/feature.d.ts +0 -2
  155. package/lib/esm/features/selection/feature.js +0 -129
  156. package/lib/esm/features/selection/types.d.ts +0 -21
  157. package/lib/esm/features/selection/types.js +0 -1
  158. package/lib/esm/features/sync-data-loader/feature.d.ts +0 -2
  159. package/lib/esm/features/sync-data-loader/feature.js +0 -46
  160. package/lib/esm/features/sync-data-loader/types.d.ts +0 -28
  161. package/lib/esm/features/sync-data-loader/types.js +0 -1
  162. package/lib/esm/features/tree/feature.d.ts +0 -2
  163. package/lib/esm/features/tree/feature.js +0 -241
  164. package/lib/esm/features/tree/types.d.ts +0 -63
  165. package/lib/esm/features/tree/types.js +0 -1
  166. package/lib/esm/index.d.ts +0 -33
  167. package/lib/esm/index.js +0 -32
  168. package/lib/esm/mddocs-entry.d.ts +0 -121
  169. package/lib/esm/mddocs-entry.js +0 -1
  170. package/lib/esm/test-utils/test-tree-do.d.ts +0 -23
  171. package/lib/esm/test-utils/test-tree-do.js +0 -108
  172. package/lib/esm/test-utils/test-tree-expect.d.ts +0 -17
  173. package/lib/esm/test-utils/test-tree-expect.js +0 -62
  174. package/lib/esm/test-utils/test-tree.d.ts +0 -48
  175. package/lib/esm/test-utils/test-tree.js +0 -203
  176. package/lib/esm/types/core.d.ts +0 -84
  177. package/lib/esm/types/core.js +0 -1
  178. package/lib/esm/types/deep-merge.d.ts +0 -13
  179. package/lib/esm/types/deep-merge.js +0 -1
  180. package/lib/esm/utilities/create-on-drop-handler.d.ts +0 -3
  181. package/lib/esm/utilities/create-on-drop-handler.js +0 -16
  182. package/lib/esm/utilities/errors.d.ts +0 -2
  183. package/lib/esm/utilities/errors.js +0 -4
  184. package/lib/esm/utilities/insert-items-at-target.d.ts +0 -3
  185. package/lib/esm/utilities/insert-items-at-target.js +0 -36
  186. package/lib/esm/utilities/remove-items-from-parents.d.ts +0 -2
  187. package/lib/esm/utilities/remove-items-from-parents.js +0 -28
  188. package/lib/esm/utils.d.ts +0 -6
  189. package/lib/esm/utils.js +0 -46
@@ -1,107 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.hotkeysCoreFeature = void 0;
4
- const specialKeys = {
5
- // TODO:breaking deprecate auto-lowercase
6
- letter: /^Key[A-Z]$/,
7
- letterornumber: /^(Key[A-Z]|Digit[0-9])$/,
8
- plus: /^(NumpadAdd|Plus)$/,
9
- minus: /^(NumpadSubtract|Minus)$/,
10
- control: /^(ControlLeft|ControlRight)$/,
11
- shift: /^(ShiftLeft|ShiftRight)$/,
12
- };
13
- const testHotkeyMatch = (pressedKeys, tree, hotkey) => {
14
- const supposedKeys = hotkey.hotkey.toLowerCase().split("+"); // TODO:breaking deprecate auto-lowercase
15
- const doKeysMatch = supposedKeys.every((key) => {
16
- if (key in specialKeys) {
17
- return [...pressedKeys].some((pressedKey) => specialKeys[key].test(pressedKey));
18
- }
19
- const pressedKeysLowerCase = [...pressedKeys] // TODO:breaking deprecate auto-lowercase
20
- .map((k) => k.toLowerCase());
21
- if (pressedKeysLowerCase.includes(key.toLowerCase())) {
22
- return true;
23
- }
24
- if (pressedKeysLowerCase.includes(`key${key.toLowerCase()}`)) {
25
- // TODO:breaking deprecate e.key character matching
26
- return true;
27
- }
28
- return false;
29
- });
30
- const isEnabled = !hotkey.isEnabled || hotkey.isEnabled(tree);
31
- const equalCounts = pressedKeys.size === supposedKeys.length;
32
- return doKeysMatch && isEnabled && equalCounts;
33
- };
34
- const findHotkeyMatch = (pressedKeys, tree, config1, config2) => {
35
- var _a;
36
- return (_a = Object.entries(Object.assign(Object.assign({}, config1), config2)).find(([, hotkey]) => testHotkeyMatch(pressedKeys, tree, hotkey))) === null || _a === void 0 ? void 0 : _a[0];
37
- };
38
- exports.hotkeysCoreFeature = {
39
- key: "hotkeys-core",
40
- onTreeMount: (tree, element) => {
41
- const data = tree.getDataRef();
42
- const keydown = (e) => {
43
- var _a;
44
- var _b;
45
- const { ignoreHotkeysOnInputs, onTreeHotkey, hotkeys } = tree.getConfig();
46
- if (e.target instanceof HTMLInputElement && ignoreHotkeysOnInputs) {
47
- return;
48
- }
49
- (_a = (_b = data.current).pressedKeys) !== null && _a !== void 0 ? _a : (_b.pressedKeys = new Set());
50
- const newMatch = !data.current.pressedKeys.has(e.code);
51
- data.current.pressedKeys.add(e.code);
52
- const hotkeyName = findHotkeyMatch(data.current.pressedKeys, tree, tree.getHotkeyPresets(), hotkeys);
53
- if (e.target instanceof HTMLInputElement) {
54
- // JS respects composite keydowns while input elements are focused, and
55
- // doesnt send the associated keyup events with the same key name
56
- data.current.pressedKeys.delete(e.code);
57
- }
58
- if (!hotkeyName)
59
- return;
60
- const hotkeyConfig = Object.assign(Object.assign({}, tree.getHotkeyPresets()[hotkeyName]), hotkeys === null || hotkeys === void 0 ? void 0 : hotkeys[hotkeyName]);
61
- if (!hotkeyConfig)
62
- return;
63
- if (!hotkeyConfig.allowWhenInputFocused &&
64
- e.target instanceof HTMLInputElement)
65
- return;
66
- if (!hotkeyConfig.canRepeat && !newMatch)
67
- return;
68
- if (hotkeyConfig.preventDefault)
69
- e.preventDefault();
70
- hotkeyConfig.handler(e, tree);
71
- onTreeHotkey === null || onTreeHotkey === void 0 ? void 0 : onTreeHotkey(hotkeyName, e);
72
- };
73
- const keyup = (e) => {
74
- var _a;
75
- var _b;
76
- (_a = (_b = data.current).pressedKeys) !== null && _a !== void 0 ? _a : (_b.pressedKeys = new Set());
77
- data.current.pressedKeys.delete(e.code);
78
- };
79
- const reset = () => {
80
- data.current.pressedKeys = new Set();
81
- };
82
- // keyup is registered on document, because some hotkeys shift
83
- // the focus away from the tree (i.e. search)
84
- // and then we wouldn't get the keyup event anymore
85
- element.addEventListener("keydown", keydown);
86
- document.addEventListener("keyup", keyup);
87
- window.addEventListener("focus", reset);
88
- data.current.keydownHandler = keydown;
89
- data.current.keyupHandler = keyup;
90
- data.current.resetHandler = reset;
91
- },
92
- onTreeUnmount: (tree, element) => {
93
- const data = tree.getDataRef();
94
- if (data.current.keyupHandler) {
95
- document.removeEventListener("keyup", data.current.keyupHandler);
96
- delete data.current.keyupHandler;
97
- }
98
- if (data.current.keydownHandler) {
99
- element.removeEventListener("keydown", data.current.keydownHandler);
100
- delete data.current.keydownHandler;
101
- }
102
- if (data.current.resetHandler) {
103
- window.removeEventListener("focus", data.current.resetHandler);
104
- delete data.current.resetHandler;
105
- }
106
- },
107
- };
@@ -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,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const keyboardDragAndDropFeature: FeatureImplementation;
@@ -1,206 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.keyboardDragAndDropFeature = void 0;
13
- const utils_1 = require("../drag-and-drop/utils");
14
- const utils_2 = require("../../utils");
15
- const types_1 = require("./types");
16
- const getNextDragTarget = (tree, isUp, dragTarget) => {
17
- var _a, _b, _c, _d;
18
- const direction = isUp ? 0 : 1;
19
- const draggedItems = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggedItems;
20
- // currently hovering between items
21
- if ((0, utils_1.isOrderedDragTarget)(dragTarget)) {
22
- const parent = dragTarget.item.getParent();
23
- const targetedItem = tree.getItems()[dragTarget.dragLineIndex - 1]; // item above dragline
24
- const targetCategory = targetedItem
25
- ? (0, utils_1.getItemDropCategory)(targetedItem)
26
- : utils_1.ItemDropCategory.Item;
27
- const maxLevel = (_b = targetedItem === null || targetedItem === void 0 ? void 0 : targetedItem.getItemMeta().level) !== null && _b !== void 0 ? _b : 0;
28
- 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;
29
- // reparenting
30
- if (targetCategory === utils_1.ItemDropCategory.LastInGroup) {
31
- if (isUp && dragTarget.dragLineLevel < maxLevel) {
32
- return (0, utils_1.getReparentTarget)(targetedItem, dragTarget.dragLineLevel + 1, draggedItems);
33
- }
34
- if (!isUp && dragTarget.dragLineLevel > minLevel && parent) {
35
- return (0, utils_1.getReparentTarget)(targetedItem, dragTarget.dragLineLevel - 1, draggedItems);
36
- }
37
- }
38
- const newIndex = dragTarget.dragLineIndex - 1 + direction;
39
- const item = tree.getItems()[newIndex];
40
- return item ? { item } : undefined;
41
- }
42
- // moving upwards outside of an open folder
43
- const targetingExpandedFolder = (0, utils_1.getItemDropCategory)(dragTarget.item) === utils_1.ItemDropCategory.ExpandedFolder;
44
- if (targetingExpandedFolder && !isUp) {
45
- return {
46
- item: dragTarget.item,
47
- childIndex: 0,
48
- insertionIndex: (0, utils_1.getInsertionIndex)(dragTarget.item.getChildren(), 0, draggedItems),
49
- dragLineIndex: dragTarget.item.getItemMeta().index + direction,
50
- dragLineLevel: dragTarget.item.getItemMeta().level + 1,
51
- };
52
- }
53
- // currently hovering over item
54
- const childIndex = dragTarget.item.getIndexInParent() + direction;
55
- return {
56
- item: dragTarget.item.getParent(),
57
- childIndex,
58
- insertionIndex: (0, utils_1.getInsertionIndex)(dragTarget.item.getParent().getChildren(), childIndex, draggedItems),
59
- dragLineIndex: dragTarget.item.getItemMeta().index + direction,
60
- dragLineLevel: dragTarget.item.getItemMeta().level,
61
- };
62
- };
63
- const getNextValidDragTarget = (tree, isUp, previousTarget) => {
64
- var _a, _b;
65
- if (previousTarget === void 0) { previousTarget = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.dragTarget; }
66
- if (!previousTarget)
67
- return undefined;
68
- const nextTarget = getNextDragTarget(tree, isUp, previousTarget);
69
- const dataTransfer = (_b = tree.getDataRef().current.kDndDataTransfer) !== null && _b !== void 0 ? _b : null;
70
- if (!nextTarget)
71
- return undefined;
72
- if ((0, utils_1.canDrop)(dataTransfer, nextTarget, tree)) {
73
- return nextTarget;
74
- }
75
- return getNextValidDragTarget(tree, isUp, nextTarget);
76
- };
77
- const updateScroll = (tree) => {
78
- const state = tree.getState().dnd;
79
- if (!(state === null || state === void 0 ? void 0 : state.dragTarget) || (0, utils_1.isOrderedDragTarget)(state.dragTarget))
80
- return;
81
- state.dragTarget.item.scrollTo({ block: "nearest", inline: "nearest" });
82
- };
83
- const initiateDrag = (tree, draggedItems, dataTransfer) => {
84
- var _a, _b;
85
- const focusedItem = tree.getFocusedItem();
86
- const { canDrag } = tree.getConfig();
87
- if (draggedItems && canDrag && !canDrag(draggedItems)) {
88
- return;
89
- }
90
- if (draggedItems) {
91
- tree.applySubStateUpdate("dnd", { draggedItems });
92
- // getNextValidDragTarget->canDrop needs the draggedItems in state
93
- (_b = (_a = tree.getConfig()).onStartKeyboardDrag) === null || _b === void 0 ? void 0 : _b.call(_a, draggedItems);
94
- }
95
- else if (dataTransfer) {
96
- tree.getDataRef().current.kDndDataTransfer = dataTransfer;
97
- }
98
- const dragTarget = getNextValidDragTarget(tree, false, {
99
- item: focusedItem,
100
- });
101
- if (!dragTarget)
102
- return;
103
- tree.applySubStateUpdate("dnd", {
104
- draggedItems,
105
- dragTarget,
106
- });
107
- tree.applySubStateUpdate("assistiveDndState", types_1.AssistiveDndState.Started);
108
- updateScroll(tree);
109
- };
110
- const moveDragPosition = (tree, isUp) => {
111
- var _a;
112
- const dragTarget = getNextValidDragTarget(tree, isUp);
113
- if (!dragTarget)
114
- return;
115
- tree.applySubStateUpdate("dnd", {
116
- draggedItems: (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggedItems,
117
- dragTarget,
118
- });
119
- tree.applySubStateUpdate("assistiveDndState", types_1.AssistiveDndState.Dragging);
120
- if (!(0, utils_1.isOrderedDragTarget)(dragTarget)) {
121
- dragTarget.item.setFocused();
122
- }
123
- updateScroll(tree);
124
- };
125
- exports.keyboardDragAndDropFeature = {
126
- key: "keyboard-drag-and-drop",
127
- deps: ["drag-and-drop"],
128
- getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setAssistiveDndState: (0, utils_2.makeStateUpdater)("assistiveDndState", tree) }, defaultConfig)),
129
- stateHandlerNames: {
130
- assistiveDndState: "setAssistiveDndState",
131
- },
132
- treeInstance: {
133
- startKeyboardDrag: ({ tree }, draggedItems) => {
134
- initiateDrag(tree, draggedItems, undefined);
135
- },
136
- startKeyboardDragOnForeignObject: ({ tree }, dataTransfer) => {
137
- initiateDrag(tree, undefined, dataTransfer);
138
- },
139
- stopKeyboardDrag: ({ tree }) => {
140
- tree.getDataRef().current.kDndDataTransfer = undefined;
141
- tree.applySubStateUpdate("dnd", null);
142
- tree.applySubStateUpdate("assistiveDndState", types_1.AssistiveDndState.None);
143
- },
144
- },
145
- hotkeys: {
146
- startDrag: {
147
- hotkey: "Control+Shift+KeyD",
148
- preventDefault: true,
149
- isEnabled: (tree) => !tree.getState().dnd,
150
- handler: (_, tree) => {
151
- tree.startKeyboardDrag(tree.getSelectedItems());
152
- },
153
- },
154
- dragUp: {
155
- hotkey: "ArrowUp",
156
- preventDefault: true,
157
- isEnabled: (tree) => !!tree.getState().dnd,
158
- handler: (_, tree) => {
159
- moveDragPosition(tree, true);
160
- },
161
- },
162
- dragDown: {
163
- hotkey: "ArrowDown",
164
- preventDefault: true,
165
- isEnabled: (tree) => !!tree.getState().dnd,
166
- handler: (_, tree) => {
167
- moveDragPosition(tree, false);
168
- },
169
- },
170
- cancelDrag: {
171
- hotkey: "Escape",
172
- isEnabled: (tree) => !!tree.getState().dnd,
173
- handler: (_, tree) => {
174
- tree.stopKeyboardDrag();
175
- },
176
- },
177
- completeDrag: {
178
- hotkey: "Enter",
179
- preventDefault: true,
180
- isEnabled: (tree) => !!tree.getState().dnd,
181
- handler: (e, tree) => __awaiter(void 0, void 0, void 0, function* () {
182
- var _a, _b, _c, _d;
183
- e.stopPropagation();
184
- // TODO copied from keyboard onDrop, unify them
185
- const dataRef = tree.getDataRef();
186
- const target = tree.getDragTarget();
187
- const dataTransfer = (_a = dataRef.current.kDndDataTransfer) !== null && _a !== void 0 ? _a : null;
188
- if (!target || !(0, utils_1.canDrop)(dataTransfer, target, tree)) {
189
- return;
190
- }
191
- const config = tree.getConfig();
192
- const draggedItems = (_b = tree.getState().dnd) === null || _b === void 0 ? void 0 : _b.draggedItems;
193
- dataRef.current.lastDragCode = undefined;
194
- tree.applySubStateUpdate("dnd", null);
195
- if (draggedItems) {
196
- yield ((_c = config.onDrop) === null || _c === void 0 ? void 0 : _c.call(config, draggedItems, target));
197
- tree.getItemInstance(draggedItems[0].getId()).setFocused();
198
- }
199
- else if (dataTransfer) {
200
- yield ((_d = config.onDropForeignDragObject) === null || _d === void 0 ? void 0 : _d.call(config, dataTransfer, target));
201
- }
202
- tree.applySubStateUpdate("assistiveDndState", types_1.AssistiveDndState.Completed);
203
- }),
204
- },
205
- },
206
- };
@@ -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,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AssistiveDndState = void 0;
4
- var AssistiveDndState;
5
- (function (AssistiveDndState) {
6
- AssistiveDndState[AssistiveDndState["None"] = 0] = "None";
7
- AssistiveDndState[AssistiveDndState["Started"] = 1] = "Started";
8
- AssistiveDndState[AssistiveDndState["Dragging"] = 2] = "Dragging";
9
- AssistiveDndState[AssistiveDndState["Completed"] = 3] = "Completed";
10
- AssistiveDndState[AssistiveDndState["Aborted"] = 4] = "Aborted";
11
- })(AssistiveDndState || (exports.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,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const propMemoizationFeature: FeatureImplementation;
@@ -1,70 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.propMemoizationFeature = void 0;
4
- const memoize = (props, memoizedProps) => {
5
- for (const key in props) {
6
- if (typeof props[key] === "function") {
7
- if (memoizedProps && key in memoizedProps) {
8
- props[key] = memoizedProps[key];
9
- }
10
- else {
11
- memoizedProps[key] = props[key];
12
- }
13
- }
14
- }
15
- return props;
16
- };
17
- exports.propMemoizationFeature = {
18
- key: "prop-memoization",
19
- overwrites: [
20
- "main",
21
- "async-data-loader",
22
- "sync-data-loader",
23
- "drag-and-drop",
24
- "expand-all",
25
- "hotkeys-core",
26
- "renaming",
27
- "search",
28
- "selection",
29
- ],
30
- treeInstance: {
31
- getContainerProps: ({ tree, prev }, treeLabel) => {
32
- var _a, _b, _c;
33
- var _d, _e;
34
- const dataRef = tree.getDataRef();
35
- const props = (_a = prev === null || prev === void 0 ? void 0 : prev(treeLabel)) !== null && _a !== void 0 ? _a : {};
36
- (_b = (_d = dataRef.current).memo) !== null && _b !== void 0 ? _b : (_d.memo = {});
37
- (_c = (_e = dataRef.current.memo).tree) !== null && _c !== void 0 ? _c : (_e.tree = {});
38
- return memoize(props, dataRef.current.memo.tree);
39
- },
40
- getSearchInputElementProps: ({ tree, prev }) => {
41
- var _a, _b, _c;
42
- var _d, _e;
43
- const dataRef = tree.getDataRef();
44
- const props = (_a = prev === null || prev === void 0 ? void 0 : prev()) !== null && _a !== void 0 ? _a : {};
45
- (_b = (_d = dataRef.current).memo) !== null && _b !== void 0 ? _b : (_d.memo = {});
46
- (_c = (_e = dataRef.current.memo).search) !== null && _c !== void 0 ? _c : (_e.search = {});
47
- return memoize(props, dataRef.current.memo.search);
48
- },
49
- },
50
- itemInstance: {
51
- getProps: ({ item, prev }) => {
52
- var _a, _b, _c;
53
- var _d, _e;
54
- const dataRef = item.getDataRef();
55
- const props = (_a = prev === null || prev === void 0 ? void 0 : prev()) !== null && _a !== void 0 ? _a : {};
56
- (_b = (_d = dataRef.current).memo) !== null && _b !== void 0 ? _b : (_d.memo = {});
57
- (_c = (_e = dataRef.current.memo).item) !== null && _c !== void 0 ? _c : (_e.item = {});
58
- return memoize(props, dataRef.current.memo.item);
59
- },
60
- getRenameInputProps: ({ item, prev }) => {
61
- var _a, _b, _c;
62
- var _d, _e;
63
- const dataRef = item.getDataRef();
64
- const props = (_a = prev === null || prev === void 0 ? void 0 : prev()) !== null && _a !== void 0 ? _a : {};
65
- (_b = (_d = dataRef.current).memo) !== null && _b !== void 0 ? _b : (_d.memo = {});
66
- (_c = (_e = dataRef.current.memo).rename) !== null && _c !== void 0 ? _c : (_e.rename = {});
67
- return memoize(props, dataRef.current.memo.rename);
68
- },
69
- },
70
- };
@@ -1,15 +0,0 @@
1
- export interface PropMemoizationDataRef {
2
- memo?: {
3
- tree?: Record<string, any>;
4
- item?: Record<string, any>;
5
- search?: Record<string, any>;
6
- rename?: Record<string, any>;
7
- };
8
- }
9
- export type PropMemoizationFeatureDef = {
10
- state: {};
11
- config: {};
12
- treeInstance: {};
13
- itemInstance: {};
14
- hotkeys: never;
15
- };
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const renamingFeature: FeatureImplementation;
@@ -1,86 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.renamingFeature = void 0;
4
- const utils_1 = require("../../utils");
5
- exports.renamingFeature = {
6
- key: "renaming",
7
- overwrites: ["drag-and-drop"],
8
- getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setRenamingItem: (0, utils_1.makeStateUpdater)("renamingItem", tree), setRenamingValue: (0, utils_1.makeStateUpdater)("renamingValue", tree), canRename: () => true }, defaultConfig)),
9
- stateHandlerNames: {
10
- renamingItem: "setRenamingItem",
11
- renamingValue: "setRenamingValue",
12
- },
13
- treeInstance: {
14
- getRenamingItem: ({ tree }) => {
15
- const itemId = tree.getState().renamingItem;
16
- return itemId ? tree.getItemInstance(itemId) : null;
17
- },
18
- getRenamingValue: ({ tree }) => tree.getState().renamingValue || "",
19
- abortRenaming: ({ tree }) => {
20
- tree.applySubStateUpdate("renamingItem", null);
21
- tree.updateDomFocus();
22
- },
23
- completeRenaming: ({ tree }) => {
24
- var _a;
25
- const config = tree.getConfig();
26
- const item = tree.getRenamingItem();
27
- if (item) {
28
- (_a = config.onRename) === null || _a === void 0 ? void 0 : _a.call(config, item, tree.getState().renamingValue || "");
29
- }
30
- tree.applySubStateUpdate("renamingItem", null);
31
- tree.updateDomFocus();
32
- },
33
- isRenamingItem: ({ tree }) => !!tree.getState().renamingItem,
34
- },
35
- itemInstance: {
36
- startRenaming: ({ tree, item, itemId }) => {
37
- if (!item.canRename()) {
38
- return;
39
- }
40
- tree.applySubStateUpdate("renamingItem", itemId);
41
- tree.applySubStateUpdate("renamingValue", item.getItemName());
42
- },
43
- getRenameInputProps: ({ tree }) => ({
44
- ref: (r) => r === null || r === void 0 ? void 0 : r.focus(),
45
- onBlur: () => tree.abortRenaming(),
46
- value: tree.getRenamingValue(),
47
- onChange: (e) => {
48
- var _a;
49
- tree.applySubStateUpdate("renamingValue", (_a = e.target) === null || _a === void 0 ? void 0 : _a.value);
50
- },
51
- }),
52
- canRename: ({ tree, item }) => { var _a, _b, _c; return (_c = (_b = (_a = tree.getConfig()).canRename) === null || _b === void 0 ? void 0 : _b.call(_a, item)) !== null && _c !== void 0 ? _c : true; },
53
- isRenaming: ({ tree, item }) => item.getId() === tree.getState().renamingItem,
54
- getProps: ({ prev, item }) => {
55
- var _a;
56
- const isRenaming = item.isRenaming();
57
- const prevProps = (_a = prev === null || prev === void 0 ? void 0 : prev()) !== null && _a !== void 0 ? _a : {};
58
- return isRenaming
59
- ? Object.assign(Object.assign({}, prevProps), { draggable: false, onDragStart: () => { } }) : prevProps;
60
- },
61
- },
62
- hotkeys: {
63
- renameItem: {
64
- hotkey: "F2",
65
- handler: (e, tree) => {
66
- tree.getFocusedItem().startRenaming();
67
- },
68
- },
69
- abortRenaming: {
70
- hotkey: "Escape",
71
- allowWhenInputFocused: true,
72
- isEnabled: (tree) => tree.isRenamingItem(),
73
- handler: (e, tree) => {
74
- tree.abortRenaming();
75
- },
76
- },
77
- completeRenaming: {
78
- hotkey: "Enter",
79
- allowWhenInputFocused: true,
80
- isEnabled: (tree) => tree.isRenamingItem(),
81
- handler: (e, tree) => {
82
- tree.completeRenaming();
83
- },
84
- },
85
- },
86
- };
@@ -1,27 +0,0 @@
1
- import { ItemInstance, SetStateFn } from "../../types/core";
2
- export type RenamingFeatureDef<T> = {
3
- state: {
4
- renamingItem?: string | null;
5
- renamingValue?: string;
6
- };
7
- config: {
8
- setRenamingItem?: SetStateFn<string | null | undefined>;
9
- setRenamingValue?: SetStateFn<string | undefined>;
10
- canRename?: (item: ItemInstance<T>) => boolean;
11
- onRename?: (item: ItemInstance<T>, value: string) => void;
12
- };
13
- treeInstance: {
14
- getRenamingItem: () => ItemInstance<T> | null;
15
- getRenamingValue: () => string;
16
- abortRenaming: () => void;
17
- completeRenaming: () => void;
18
- isRenamingItem: () => boolean;
19
- };
20
- itemInstance: {
21
- getRenameInputProps: () => any;
22
- canRename: () => boolean;
23
- isRenaming: () => boolean;
24
- startRenaming: () => void;
25
- };
26
- hotkeys: "renameItem" | "abortRenaming" | "completeRenaming";
27
- };
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const searchFeature: FeatureImplementation;