@headless-tree/core 0.0.0-20250723222210 → 0.0.0-20250726130412

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 (174) hide show
  1. package/CHANGELOG.md +4 -1
  2. package/dist/index.d.mts +568 -0
  3. package/dist/index.d.ts +568 -0
  4. package/dist/index.js +2284 -0
  5. package/dist/index.mjs +2239 -0
  6. package/package.json +18 -10
  7. package/src/features/checkboxes/checkboxes.spec.ts +20 -5
  8. package/src/features/checkboxes/feature.ts +30 -15
  9. package/src/features/checkboxes/types.ts +1 -0
  10. package/tsconfig.json +1 -4
  11. package/lib/cjs/core/build-proxified-instance.d.ts +0 -2
  12. package/lib/cjs/core/build-proxified-instance.js +0 -58
  13. package/lib/cjs/core/build-static-instance.d.ts +0 -2
  14. package/lib/cjs/core/build-static-instance.js +0 -26
  15. package/lib/cjs/core/create-tree.d.ts +0 -2
  16. package/lib/cjs/core/create-tree.js +0 -191
  17. package/lib/cjs/features/async-data-loader/feature.d.ts +0 -2
  18. package/lib/cjs/features/async-data-loader/feature.js +0 -135
  19. package/lib/cjs/features/async-data-loader/types.d.ts +0 -47
  20. package/lib/cjs/features/async-data-loader/types.js +0 -2
  21. package/lib/cjs/features/checkboxes/feature.d.ts +0 -2
  22. package/lib/cjs/features/checkboxes/feature.js +0 -94
  23. package/lib/cjs/features/checkboxes/types.d.ts +0 -26
  24. package/lib/cjs/features/checkboxes/types.js +0 -9
  25. package/lib/cjs/features/drag-and-drop/feature.d.ts +0 -2
  26. package/lib/cjs/features/drag-and-drop/feature.js +0 -215
  27. package/lib/cjs/features/drag-and-drop/types.d.ts +0 -72
  28. package/lib/cjs/features/drag-and-drop/types.js +0 -9
  29. package/lib/cjs/features/drag-and-drop/utils.d.ts +0 -27
  30. package/lib/cjs/features/drag-and-drop/utils.js +0 -182
  31. package/lib/cjs/features/expand-all/feature.d.ts +0 -2
  32. package/lib/cjs/features/expand-all/feature.js +0 -70
  33. package/lib/cjs/features/expand-all/types.d.ts +0 -19
  34. package/lib/cjs/features/expand-all/types.js +0 -2
  35. package/lib/cjs/features/hotkeys-core/feature.d.ts +0 -2
  36. package/lib/cjs/features/hotkeys-core/feature.js +0 -107
  37. package/lib/cjs/features/hotkeys-core/types.d.ts +0 -27
  38. package/lib/cjs/features/hotkeys-core/types.js +0 -2
  39. package/lib/cjs/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  40. package/lib/cjs/features/keyboard-drag-and-drop/feature.js +0 -206
  41. package/lib/cjs/features/keyboard-drag-and-drop/types.d.ts +0 -27
  42. package/lib/cjs/features/keyboard-drag-and-drop/types.js +0 -11
  43. package/lib/cjs/features/main/types.d.ts +0 -47
  44. package/lib/cjs/features/main/types.js +0 -2
  45. package/lib/cjs/features/prop-memoization/feature.d.ts +0 -2
  46. package/lib/cjs/features/prop-memoization/feature.js +0 -70
  47. package/lib/cjs/features/prop-memoization/types.d.ts +0 -15
  48. package/lib/cjs/features/prop-memoization/types.js +0 -2
  49. package/lib/cjs/features/renaming/feature.d.ts +0 -2
  50. package/lib/cjs/features/renaming/feature.js +0 -86
  51. package/lib/cjs/features/renaming/types.d.ts +0 -27
  52. package/lib/cjs/features/renaming/types.js +0 -2
  53. package/lib/cjs/features/search/feature.d.ts +0 -2
  54. package/lib/cjs/features/search/feature.js +0 -119
  55. package/lib/cjs/features/search/types.d.ts +0 -32
  56. package/lib/cjs/features/search/types.js +0 -2
  57. package/lib/cjs/features/selection/feature.d.ts +0 -2
  58. package/lib/cjs/features/selection/feature.js +0 -132
  59. package/lib/cjs/features/selection/types.d.ts +0 -21
  60. package/lib/cjs/features/selection/types.js +0 -2
  61. package/lib/cjs/features/sync-data-loader/feature.d.ts +0 -2
  62. package/lib/cjs/features/sync-data-loader/feature.js +0 -53
  63. package/lib/cjs/features/sync-data-loader/types.d.ts +0 -28
  64. package/lib/cjs/features/sync-data-loader/types.js +0 -2
  65. package/lib/cjs/features/tree/feature.d.ts +0 -2
  66. package/lib/cjs/features/tree/feature.js +0 -245
  67. package/lib/cjs/features/tree/types.d.ts +0 -63
  68. package/lib/cjs/features/tree/types.js +0 -2
  69. package/lib/cjs/index.d.ts +0 -33
  70. package/lib/cjs/index.js +0 -51
  71. package/lib/cjs/mddocs-entry.d.ts +0 -121
  72. package/lib/cjs/mddocs-entry.js +0 -17
  73. package/lib/cjs/test-utils/test-tree-do.d.ts +0 -23
  74. package/lib/cjs/test-utils/test-tree-do.js +0 -114
  75. package/lib/cjs/test-utils/test-tree-expect.d.ts +0 -17
  76. package/lib/cjs/test-utils/test-tree-expect.js +0 -66
  77. package/lib/cjs/test-utils/test-tree.d.ts +0 -48
  78. package/lib/cjs/test-utils/test-tree.js +0 -208
  79. package/lib/cjs/types/core.d.ts +0 -84
  80. package/lib/cjs/types/core.js +0 -2
  81. package/lib/cjs/types/deep-merge.d.ts +0 -13
  82. package/lib/cjs/types/deep-merge.js +0 -2
  83. package/lib/cjs/utilities/create-on-drop-handler.d.ts +0 -3
  84. package/lib/cjs/utilities/create-on-drop-handler.js +0 -20
  85. package/lib/cjs/utilities/errors.d.ts +0 -2
  86. package/lib/cjs/utilities/errors.js +0 -9
  87. package/lib/cjs/utilities/insert-items-at-target.d.ts +0 -3
  88. package/lib/cjs/utilities/insert-items-at-target.js +0 -40
  89. package/lib/cjs/utilities/remove-items-from-parents.d.ts +0 -2
  90. package/lib/cjs/utilities/remove-items-from-parents.js +0 -32
  91. package/lib/cjs/utils.d.ts +0 -6
  92. package/lib/cjs/utils.js +0 -53
  93. package/lib/esm/core/build-proxified-instance.d.ts +0 -2
  94. package/lib/esm/core/build-proxified-instance.js +0 -54
  95. package/lib/esm/core/build-static-instance.d.ts +0 -2
  96. package/lib/esm/core/build-static-instance.js +0 -22
  97. package/lib/esm/core/create-tree.d.ts +0 -2
  98. package/lib/esm/core/create-tree.js +0 -187
  99. package/lib/esm/features/async-data-loader/feature.d.ts +0 -2
  100. package/lib/esm/features/async-data-loader/feature.js +0 -132
  101. package/lib/esm/features/async-data-loader/types.d.ts +0 -47
  102. package/lib/esm/features/async-data-loader/types.js +0 -1
  103. package/lib/esm/features/checkboxes/feature.d.ts +0 -2
  104. package/lib/esm/features/checkboxes/feature.js +0 -91
  105. package/lib/esm/features/checkboxes/types.d.ts +0 -26
  106. package/lib/esm/features/checkboxes/types.js +0 -6
  107. package/lib/esm/features/drag-and-drop/feature.d.ts +0 -2
  108. package/lib/esm/features/drag-and-drop/feature.js +0 -212
  109. package/lib/esm/features/drag-and-drop/types.d.ts +0 -72
  110. package/lib/esm/features/drag-and-drop/types.js +0 -6
  111. package/lib/esm/features/drag-and-drop/utils.d.ts +0 -27
  112. package/lib/esm/features/drag-and-drop/utils.js +0 -172
  113. package/lib/esm/features/expand-all/feature.d.ts +0 -2
  114. package/lib/esm/features/expand-all/feature.js +0 -67
  115. package/lib/esm/features/expand-all/types.d.ts +0 -19
  116. package/lib/esm/features/expand-all/types.js +0 -1
  117. package/lib/esm/features/hotkeys-core/feature.d.ts +0 -2
  118. package/lib/esm/features/hotkeys-core/feature.js +0 -104
  119. package/lib/esm/features/hotkeys-core/types.d.ts +0 -27
  120. package/lib/esm/features/hotkeys-core/types.js +0 -1
  121. package/lib/esm/features/keyboard-drag-and-drop/feature.d.ts +0 -2
  122. package/lib/esm/features/keyboard-drag-and-drop/feature.js +0 -203
  123. package/lib/esm/features/keyboard-drag-and-drop/types.d.ts +0 -27
  124. package/lib/esm/features/keyboard-drag-and-drop/types.js +0 -8
  125. package/lib/esm/features/main/types.d.ts +0 -47
  126. package/lib/esm/features/main/types.js +0 -1
  127. package/lib/esm/features/prop-memoization/feature.d.ts +0 -2
  128. package/lib/esm/features/prop-memoization/feature.js +0 -67
  129. package/lib/esm/features/prop-memoization/types.d.ts +0 -15
  130. package/lib/esm/features/prop-memoization/types.js +0 -1
  131. package/lib/esm/features/renaming/feature.d.ts +0 -2
  132. package/lib/esm/features/renaming/feature.js +0 -83
  133. package/lib/esm/features/renaming/types.d.ts +0 -27
  134. package/lib/esm/features/renaming/types.js +0 -1
  135. package/lib/esm/features/search/feature.d.ts +0 -2
  136. package/lib/esm/features/search/feature.js +0 -116
  137. package/lib/esm/features/search/types.d.ts +0 -32
  138. package/lib/esm/features/search/types.js +0 -1
  139. package/lib/esm/features/selection/feature.d.ts +0 -2
  140. package/lib/esm/features/selection/feature.js +0 -129
  141. package/lib/esm/features/selection/types.d.ts +0 -21
  142. package/lib/esm/features/selection/types.js +0 -1
  143. package/lib/esm/features/sync-data-loader/feature.d.ts +0 -2
  144. package/lib/esm/features/sync-data-loader/feature.js +0 -50
  145. package/lib/esm/features/sync-data-loader/types.d.ts +0 -28
  146. package/lib/esm/features/sync-data-loader/types.js +0 -1
  147. package/lib/esm/features/tree/feature.d.ts +0 -2
  148. package/lib/esm/features/tree/feature.js +0 -242
  149. package/lib/esm/features/tree/types.d.ts +0 -63
  150. package/lib/esm/features/tree/types.js +0 -1
  151. package/lib/esm/index.d.ts +0 -33
  152. package/lib/esm/index.js +0 -32
  153. package/lib/esm/mddocs-entry.d.ts +0 -121
  154. package/lib/esm/mddocs-entry.js +0 -1
  155. package/lib/esm/test-utils/test-tree-do.d.ts +0 -23
  156. package/lib/esm/test-utils/test-tree-do.js +0 -110
  157. package/lib/esm/test-utils/test-tree-expect.d.ts +0 -17
  158. package/lib/esm/test-utils/test-tree-expect.js +0 -62
  159. package/lib/esm/test-utils/test-tree.d.ts +0 -48
  160. package/lib/esm/test-utils/test-tree.js +0 -204
  161. package/lib/esm/types/core.d.ts +0 -84
  162. package/lib/esm/types/core.js +0 -1
  163. package/lib/esm/types/deep-merge.d.ts +0 -13
  164. package/lib/esm/types/deep-merge.js +0 -1
  165. package/lib/esm/utilities/create-on-drop-handler.d.ts +0 -3
  166. package/lib/esm/utilities/create-on-drop-handler.js +0 -16
  167. package/lib/esm/utilities/errors.d.ts +0 -2
  168. package/lib/esm/utilities/errors.js +0 -4
  169. package/lib/esm/utilities/insert-items-at-target.d.ts +0 -3
  170. package/lib/esm/utilities/insert-items-at-target.js +0 -36
  171. package/lib/esm/utilities/remove-items-from-parents.d.ts +0 -2
  172. package/lib/esm/utilities/remove-items-from-parents.js +0 -28
  173. package/lib/esm/utils.d.ts +0 -6
  174. package/lib/esm/utils.js +0 -46
@@ -1,47 +0,0 @@
1
- import { SetStateFn } from "../../types/core";
2
- import { SyncDataLoaderFeatureDef } from "../sync-data-loader/types";
3
- export interface AsyncDataLoaderDataRef<T = any> {
4
- itemData: Record<string, T>;
5
- childrenIds: Record<string, string[]>;
6
- }
7
- /**
8
- * @category Async Data Loader/General
9
- * */
10
- export type AsyncDataLoaderFeatureDef<T> = {
11
- state: {
12
- loadingItemData: string[];
13
- loadingItemChildrens: string[];
14
- };
15
- config: {
16
- rootItemId: string;
17
- /** Will be called when HT retrieves item data for an item whose item data is asynchronously being loaded.
18
- * Can be used to create placeholder data to use for rendering the tree item while it is loaded. If not defined,
19
- * the tree item data will be null. */
20
- createLoadingItemData?: () => T;
21
- setLoadingItemData?: SetStateFn<string[]>;
22
- setLoadingItemChildrens?: SetStateFn<string[]>;
23
- onLoadedItem?: (itemId: string, item: T) => void;
24
- onLoadedChildren?: (itemId: string, childrenIds: string[]) => void;
25
- };
26
- treeInstance: SyncDataLoaderFeatureDef<T>["treeInstance"] & {
27
- /** @deprecated use loadItemData instead */
28
- waitForItemDataLoaded: (itemId: string) => Promise<void>;
29
- /** @deprecated use loadChildrenIds instead */
30
- waitForItemChildrenLoaded: (itemId: string) => Promise<void>;
31
- loadItemData: (itemId: string) => Promise<T>;
32
- loadChildrenIds: (itemId: string) => Promise<string[]>;
33
- };
34
- itemInstance: SyncDataLoaderFeatureDef<T>["itemInstance"] & {
35
- /** Invalidate fetched data for item, and triggers a refetch and subsequent rerender if the item is visible
36
- * @param optimistic If true, the item will not trigger a state update on `loadingItemData`, and
37
- * the tree will continue to display the old data until the new data has loaded. */
38
- invalidateItemData: (optimistic?: boolean) => Promise<void>;
39
- /** Invalidate fetched children ids for item, and triggers a refetch and subsequent rerender if the item is visible
40
- * @param optimistic If true, the item will not trigger a state update on `loadingItemChildrens`, and
41
- * the tree will continue to display the old data until the new data has loaded. */
42
- invalidateChildrenIds: (optimistic?: boolean) => Promise<void>;
43
- updateCachedChildrenIds: (childrenIds: string[]) => void;
44
- isLoading: () => boolean;
45
- };
46
- hotkeys: SyncDataLoaderFeatureDef<T>["hotkeys"];
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 checkboxesFeature: FeatureImplementation;
@@ -1,94 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.checkboxesFeature = void 0;
4
- const utils_1 = require("../../utils");
5
- const types_1 = require("./types");
6
- const errors_1 = require("../../utilities/errors");
7
- const getAllLoadedDescendants = (tree, itemId) => {
8
- if (!tree.getConfig().isItemFolder(tree.buildItemInstance(itemId))) {
9
- return [itemId];
10
- }
11
- return tree
12
- .retrieveChildrenIds(itemId)
13
- .map((child) => getAllLoadedDescendants(tree, child))
14
- .flat();
15
- };
16
- exports.checkboxesFeature = {
17
- key: "checkboxes",
18
- overwrites: ["selection"],
19
- getInitialState: (initialState) => (Object.assign({ checkedItems: [] }, initialState)),
20
- getDefaultConfig: (defaultConfig, tree) => {
21
- var _a;
22
- const hasAsyncLoader = (_a = defaultConfig.features) === null || _a === void 0 ? void 0 : _a.some((f) => f.key === "async-data-loader");
23
- if (hasAsyncLoader && !defaultConfig.canCheckFolders) {
24
- (0, errors_1.throwError)(`!canCheckFolders not supported with async trees`);
25
- }
26
- return Object.assign({ setCheckedItems: (0, utils_1.makeStateUpdater)("checkedItems", tree), canCheckFolders: hasAsyncLoader !== null && hasAsyncLoader !== void 0 ? hasAsyncLoader : false }, defaultConfig);
27
- },
28
- stateHandlerNames: {
29
- checkedItems: "setCheckedItems",
30
- },
31
- treeInstance: {
32
- setCheckedItems: ({ tree }, checkedItems) => {
33
- tree.applySubStateUpdate("checkedItems", checkedItems);
34
- },
35
- },
36
- itemInstance: {
37
- getCheckboxProps: ({ item }) => {
38
- const checkedState = item.getCheckedState();
39
- return {
40
- onChange: item.toggleCheckedState,
41
- checked: checkedState === types_1.CheckedState.Checked,
42
- ref: (r) => {
43
- if (r) {
44
- r.indeterminate = checkedState === types_1.CheckedState.Indeterminate;
45
- }
46
- },
47
- };
48
- },
49
- toggleCheckedState: ({ item }) => {
50
- if (item.getCheckedState() === types_1.CheckedState.Checked) {
51
- item.setUnchecked();
52
- }
53
- else {
54
- item.setChecked();
55
- }
56
- },
57
- getCheckedState: ({ item, tree, itemId }) => {
58
- const { checkedItems } = tree.getState();
59
- if (checkedItems.includes(itemId)) {
60
- return types_1.CheckedState.Checked;
61
- }
62
- if (item.isFolder() && !tree.getConfig().canCheckFolders) {
63
- const descendants = getAllLoadedDescendants(tree, itemId);
64
- if (descendants.every((d) => checkedItems.includes(d))) {
65
- return types_1.CheckedState.Checked;
66
- }
67
- if (descendants.some((d) => checkedItems.includes(d))) {
68
- return types_1.CheckedState.Indeterminate;
69
- }
70
- }
71
- return types_1.CheckedState.Unchecked;
72
- },
73
- setChecked: ({ item, tree, itemId }) => {
74
- if (!item.isFolder() || tree.getConfig().canCheckFolders) {
75
- tree.applySubStateUpdate("checkedItems", (items) => [...items, itemId]);
76
- }
77
- else {
78
- tree.applySubStateUpdate("checkedItems", (items) => [
79
- ...items,
80
- ...getAllLoadedDescendants(tree, itemId),
81
- ]);
82
- }
83
- },
84
- setUnchecked: ({ item, tree, itemId }) => {
85
- if (!item.isFolder() || tree.getConfig().canCheckFolders) {
86
- tree.applySubStateUpdate("checkedItems", (items) => items.filter((id) => id !== itemId));
87
- }
88
- else {
89
- const descendants = getAllLoadedDescendants(tree, itemId);
90
- tree.applySubStateUpdate("checkedItems", (items) => items.filter((id) => !descendants.includes(id)));
91
- }
92
- },
93
- },
94
- };
@@ -1,26 +0,0 @@
1
- import { SetStateFn } from "../../types/core";
2
- export declare enum CheckedState {
3
- Checked = "checked",
4
- Unchecked = "unchecked",
5
- Indeterminate = "indeterminate"
6
- }
7
- export type CheckboxesFeatureDef<T> = {
8
- state: {
9
- checkedItems: string[];
10
- };
11
- config: {
12
- setCheckedItems?: SetStateFn<string[]>;
13
- canCheckFolders?: boolean;
14
- };
15
- treeInstance: {
16
- setCheckedItems: (checkedItems: string[]) => void;
17
- };
18
- itemInstance: {
19
- setChecked: () => void;
20
- setUnchecked: () => void;
21
- toggleCheckedState: () => void;
22
- getCheckedState: () => CheckedState;
23
- getCheckboxProps: () => Record<string, any>;
24
- };
25
- hotkeys: never;
26
- };
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CheckedState = void 0;
4
- var CheckedState;
5
- (function (CheckedState) {
6
- CheckedState["Checked"] = "checked";
7
- CheckedState["Unchecked"] = "unchecked";
8
- CheckedState["Indeterminate"] = "indeterminate";
9
- })(CheckedState || (exports.CheckedState = CheckedState = {}));
@@ -1,2 +0,0 @@
1
- import { FeatureImplementation } from "../../types/core";
2
- export declare const dragAndDropFeature: FeatureImplementation;
@@ -1,215 +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.dragAndDropFeature = void 0;
13
- const utils_1 = require("./utils");
14
- const utils_2 = require("../../utils");
15
- exports.dragAndDropFeature = {
16
- key: "drag-and-drop",
17
- deps: ["selection"],
18
- getDefaultConfig: (defaultConfig, tree) => (Object.assign({ canDrop: (_, target) => target.item.isFolder(), canDropForeignDragObject: () => false, setDndState: (0, utils_2.makeStateUpdater)("dnd", tree), canReorder: true }, defaultConfig)),
19
- stateHandlerNames: {
20
- dnd: "setDndState",
21
- },
22
- onTreeMount: (tree) => {
23
- const listener = () => {
24
- tree.applySubStateUpdate("dnd", null);
25
- };
26
- tree.getDataRef().current.windowDragEndListener = listener;
27
- window.addEventListener("dragend", listener);
28
- },
29
- onTreeUnmount: (tree) => {
30
- const { windowDragEndListener } = tree.getDataRef().current;
31
- if (!windowDragEndListener)
32
- return;
33
- window.removeEventListener("dragend", windowDragEndListener);
34
- },
35
- treeInstance: {
36
- getDragTarget: ({ tree }) => {
37
- var _a, _b;
38
- return (_b = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.dragTarget) !== null && _b !== void 0 ? _b : null;
39
- },
40
- getDragLineData: ({ tree }) => {
41
- var _a, _b, _c, _d, _e, _f;
42
- const target = tree.getDragTarget();
43
- const indent = ((_a = target === null || target === void 0 ? void 0 : target.item.getItemMeta().level) !== null && _a !== void 0 ? _a : 0) + 1;
44
- const treeBb = (_b = tree.getElement()) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect();
45
- if (!target || !treeBb || !(0, utils_1.isOrderedDragTarget)(target))
46
- return null;
47
- const leftOffset = target.dragLineLevel * ((_c = tree.getConfig().indent) !== null && _c !== void 0 ? _c : 1);
48
- const targetItem = tree.getItems()[target.dragLineIndex];
49
- if (!targetItem) {
50
- const bb = (_e = (_d = tree
51
- .getItems()[target.dragLineIndex - 1]) === null || _d === void 0 ? void 0 : _d.getElement()) === null || _e === void 0 ? void 0 : _e.getBoundingClientRect();
52
- if (bb) {
53
- return {
54
- indent,
55
- top: bb.bottom - treeBb.top,
56
- left: bb.left + leftOffset - treeBb.left,
57
- width: bb.width - leftOffset,
58
- };
59
- }
60
- }
61
- const bb = (_f = targetItem.getElement()) === null || _f === void 0 ? void 0 : _f.getBoundingClientRect();
62
- if (bb) {
63
- return {
64
- indent,
65
- top: bb.top - treeBb.top,
66
- left: bb.left + leftOffset - treeBb.left,
67
- width: bb.width - leftOffset,
68
- };
69
- }
70
- return null;
71
- },
72
- getDragLineStyle: ({ tree }, topOffset = -1, leftOffset = -8) => {
73
- const dragLine = tree.getDragLineData();
74
- return dragLine
75
- ? {
76
- position: "absolute",
77
- top: `${dragLine.top + topOffset}px`,
78
- left: `${dragLine.left + leftOffset}px`,
79
- width: `${dragLine.width - leftOffset}px`,
80
- pointerEvents: "none", // important to prevent capturing drag events
81
- }
82
- : { display: "none" };
83
- },
84
- getContainerProps: ({ prev, tree }, treeLabel) => {
85
- const prevProps = prev === null || prev === void 0 ? void 0 : prev(treeLabel);
86
- return Object.assign(Object.assign({}, prevProps), { onDragOver: (e) => {
87
- e.preventDefault();
88
- }, onDrop: (e) => __awaiter(void 0, void 0, void 0, function* () {
89
- var _a, _b, _c;
90
- // TODO merge implementation with itemInstance.onDrop
91
- const dataRef = tree.getDataRef();
92
- const target = { item: tree.getRootItem() };
93
- if (!(0, utils_1.canDrop)(e.dataTransfer, target, tree)) {
94
- return;
95
- }
96
- e.preventDefault();
97
- const config = tree.getConfig();
98
- const draggedItems = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggedItems;
99
- dataRef.current.lastDragCode = undefined;
100
- if (draggedItems) {
101
- yield ((_b = config.onDrop) === null || _b === void 0 ? void 0 : _b.call(config, draggedItems, target));
102
- }
103
- else if (e.dataTransfer) {
104
- yield ((_c = config.onDropForeignDragObject) === null || _c === void 0 ? void 0 : _c.call(config, e.dataTransfer, target));
105
- }
106
- }), style: Object.assign(Object.assign({}, prevProps === null || prevProps === void 0 ? void 0 : prevProps.style), { position: "relative" }) });
107
- },
108
- },
109
- itemInstance: {
110
- getProps: ({ tree, item, prev }) => (Object.assign(Object.assign({}, prev === null || prev === void 0 ? void 0 : prev()), { draggable: true, onDragEnter: (e) => e.preventDefault(), onDragStart: (e) => {
111
- var _a, _b, _c, _d;
112
- const selectedItems = tree.getSelectedItems();
113
- const items = selectedItems.includes(item) ? selectedItems : [item];
114
- const config = tree.getConfig();
115
- if (!selectedItems.includes(item)) {
116
- tree.setSelectedItems([item.getItemMeta().itemId]);
117
- }
118
- if (!((_b = (_a = config.canDrag) === null || _a === void 0 ? void 0 : _a.call(config, items)) !== null && _b !== void 0 ? _b : true)) {
119
- e.preventDefault();
120
- return;
121
- }
122
- if (config.setDragImage) {
123
- const { imgElement, xOffset, yOffset } = config.setDragImage(items);
124
- (_c = e.dataTransfer) === null || _c === void 0 ? void 0 : _c.setDragImage(imgElement, xOffset !== null && xOffset !== void 0 ? xOffset : 0, yOffset !== null && yOffset !== void 0 ? yOffset : 0);
125
- }
126
- if (config.createForeignDragObject) {
127
- const { format, data } = config.createForeignDragObject(items);
128
- (_d = e.dataTransfer) === null || _d === void 0 ? void 0 : _d.setData(format, data);
129
- }
130
- tree.applySubStateUpdate("dnd", {
131
- draggedItems: items,
132
- draggingOverItem: tree.getFocusedItem(),
133
- });
134
- }, onDragOver: (e) => {
135
- var _a, _b, _c;
136
- const dataRef = tree.getDataRef();
137
- const nextDragCode = (0, utils_1.getDragCode)(e, item, tree);
138
- if (nextDragCode === dataRef.current.lastDragCode) {
139
- if (dataRef.current.lastAllowDrop) {
140
- e.preventDefault();
141
- }
142
- return;
143
- }
144
- dataRef.current.lastDragCode = nextDragCode;
145
- const target = (0, utils_1.getDragTarget)(e, item, tree);
146
- if (!((_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggedItems) &&
147
- (!e.dataTransfer ||
148
- !((_c = (_b = tree
149
- .getConfig()).canDropForeignDragObject) === null || _c === void 0 ? void 0 : _c.call(_b, e.dataTransfer, target)))) {
150
- dataRef.current.lastAllowDrop = false;
151
- return;
152
- }
153
- if (!(0, utils_1.canDrop)(e.dataTransfer, target, tree)) {
154
- dataRef.current.lastAllowDrop = false;
155
- return;
156
- }
157
- tree.applySubStateUpdate("dnd", (state) => (Object.assign(Object.assign({}, state), { dragTarget: target, draggingOverItem: item })));
158
- dataRef.current.lastAllowDrop = true;
159
- e.preventDefault();
160
- }, onDragLeave: () => {
161
- const dataRef = tree.getDataRef();
162
- dataRef.current.lastDragCode = "no-drag";
163
- tree.applySubStateUpdate("dnd", (state) => (Object.assign(Object.assign({}, state), { draggingOverItem: undefined, dragTarget: undefined })));
164
- }, onDragEnd: (e) => {
165
- var _a, _b, _c, _d;
166
- const draggedItems = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggedItems;
167
- if (((_b = e.dataTransfer) === null || _b === void 0 ? void 0 : _b.dropEffect) === "none" || !draggedItems) {
168
- return;
169
- }
170
- (_d = (_c = tree.getConfig()).onCompleteForeignDrop) === null || _d === void 0 ? void 0 : _d.call(_c, draggedItems);
171
- }, onDrop: (e) => __awaiter(void 0, void 0, void 0, function* () {
172
- var _a, _b, _c;
173
- e.stopPropagation();
174
- const dataRef = tree.getDataRef();
175
- const target = (0, utils_1.getDragTarget)(e, item, tree);
176
- if (!(0, utils_1.canDrop)(e.dataTransfer, target, tree)) {
177
- return;
178
- }
179
- e.preventDefault();
180
- const config = tree.getConfig();
181
- const draggedItems = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggedItems;
182
- dataRef.current.lastDragCode = undefined;
183
- if (draggedItems) {
184
- yield ((_b = config.onDrop) === null || _b === void 0 ? void 0 : _b.call(config, draggedItems, target));
185
- }
186
- else if (e.dataTransfer) {
187
- yield ((_c = config.onDropForeignDragObject) === null || _c === void 0 ? void 0 : _c.call(config, e.dataTransfer, target));
188
- }
189
- }) })),
190
- isDragTarget: ({ tree, item }) => {
191
- const target = tree.getDragTarget();
192
- return target ? target.item.getId() === item.getId() : false;
193
- },
194
- isDragTargetAbove: ({ tree, item }) => {
195
- const target = tree.getDragTarget();
196
- if (!target ||
197
- !(0, utils_1.isOrderedDragTarget)(target) ||
198
- target.item !== item.getParent())
199
- return false;
200
- return target.childIndex === item.getItemMeta().posInSet;
201
- },
202
- isDragTargetBelow: ({ tree, item }) => {
203
- const target = tree.getDragTarget();
204
- if (!target ||
205
- !(0, utils_1.isOrderedDragTarget)(target) ||
206
- target.item !== item.getParent())
207
- return false;
208
- return target.childIndex - 1 === item.getItemMeta().posInSet;
209
- },
210
- isDraggingOver: ({ tree, item }) => {
211
- var _a, _b;
212
- return ((_b = (_a = tree.getState().dnd) === null || _a === void 0 ? void 0 : _a.draggingOverItem) === null || _b === void 0 ? void 0 : _b.getId()) === item.getId();
213
- },
214
- },
215
- };
@@ -1,72 +0,0 @@
1
- import { ItemInstance, SetStateFn } from "../../types/core";
2
- export interface DndDataRef {
3
- lastDragCode?: string;
4
- lastAllowDrop?: boolean;
5
- windowDragEndListener?: () => void;
6
- }
7
- export interface DndState<T> {
8
- draggedItems?: ItemInstance<T>[];
9
- draggingOverItem?: ItemInstance<T>;
10
- dragTarget?: DragTarget<T>;
11
- }
12
- export interface DragLineData {
13
- indent: number;
14
- top: number;
15
- left: number;
16
- width: number;
17
- }
18
- export type DragTarget<T> = {
19
- item: ItemInstance<T>;
20
- childIndex: number;
21
- insertionIndex: number;
22
- dragLineIndex: number;
23
- dragLineLevel: number;
24
- } | {
25
- item: ItemInstance<T>;
26
- };
27
- export declare enum DragTargetPosition {
28
- Top = "top",
29
- Bottom = "bottom",
30
- Item = "item"
31
- }
32
- export type DragAndDropFeatureDef<T> = {
33
- state: {
34
- dnd?: DndState<T> | null;
35
- };
36
- config: {
37
- setDndState?: SetStateFn<DndState<T> | undefined | null>;
38
- /** Defines the size of the area at the top and bottom of an item where, when an item is dropped, the item willö
39
- * be placed above or below the item within the same parent, as opposed to being placed inside the item.
40
- * If `canReorder` is `false`, this is ignored. */
41
- reorderAreaPercentage?: number;
42
- canReorder?: boolean;
43
- canDrag?: (items: ItemInstance<T>[]) => boolean;
44
- canDrop?: (items: ItemInstance<T>[], target: DragTarget<T>) => boolean;
45
- indent?: number;
46
- createForeignDragObject?: (items: ItemInstance<T>[]) => {
47
- format: string;
48
- data: any;
49
- };
50
- setDragImage?: (items: ItemInstance<T>[]) => {
51
- imgElement: Element;
52
- xOffset?: number;
53
- yOffset?: number;
54
- };
55
- canDropForeignDragObject?: (dataTransfer: DataTransfer, target: DragTarget<T>) => boolean;
56
- onDrop?: (items: ItemInstance<T>[], target: DragTarget<T>) => void | Promise<void>;
57
- onDropForeignDragObject?: (dataTransfer: DataTransfer, target: DragTarget<T>) => void | Promise<void>;
58
- onCompleteForeignDrop?: (items: ItemInstance<T>[]) => void;
59
- };
60
- treeInstance: {
61
- getDragTarget: () => DragTarget<T> | null;
62
- getDragLineData: () => DragLineData | null;
63
- getDragLineStyle: (topOffset?: number, leftOffset?: number) => Record<string, any>;
64
- };
65
- itemInstance: {
66
- isDragTarget: () => boolean;
67
- isDragTargetAbove: () => boolean;
68
- isDragTargetBelow: () => boolean;
69
- isDraggingOver: () => boolean;
70
- };
71
- hotkeys: never;
72
- };
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DragTargetPosition = void 0;
4
- var DragTargetPosition;
5
- (function (DragTargetPosition) {
6
- DragTargetPosition["Top"] = "top";
7
- DragTargetPosition["Bottom"] = "bottom";
8
- DragTargetPosition["Item"] = "item";
9
- })(DragTargetPosition || (exports.DragTargetPosition = DragTargetPosition = {}));
@@ -1,27 +0,0 @@
1
- import { ItemInstance, TreeInstance } from "../../types/core";
2
- import { DragTarget } from "./types";
3
- export declare enum ItemDropCategory {
4
- Item = 0,
5
- ExpandedFolder = 1,
6
- LastInGroup = 2
7
- }
8
- export declare const isOrderedDragTarget: <T>(dragTarget: DragTarget<T>) => dragTarget is {
9
- item: ItemInstance<T>;
10
- childIndex: number;
11
- insertionIndex: number;
12
- dragLineIndex: number;
13
- dragLineLevel: number;
14
- };
15
- export declare const canDrop: (dataTransfer: DataTransfer | null, target: DragTarget<any>, tree: TreeInstance<any>) => boolean;
16
- export declare const getItemDropCategory: (item: ItemInstance<any>) => ItemDropCategory;
17
- export declare const getInsertionIndex: <T>(children: ItemInstance<T>[], childIndex: number, draggedItems: ItemInstance<T>[] | undefined) => number;
18
- export declare const getDragCode: (e: any, item: ItemInstance<any>, tree: TreeInstance<any>) => string;
19
- /** @param item refers to the bottom-most item of the container, at which bottom is being reparented on (e.g. root-1-2-6) */
20
- export declare const getReparentTarget: <T>(item: ItemInstance<T>, reparentLevel: number, draggedItems: ItemInstance<T>[] | undefined) => {
21
- item: ItemInstance<any>;
22
- childIndex: number;
23
- insertionIndex: number;
24
- dragLineIndex: number;
25
- dragLineLevel: number;
26
- };
27
- export declare const getDragTarget: (e: any, item: ItemInstance<any>, tree: TreeInstance<any>, canReorder?: boolean | undefined) => DragTarget<any>;