@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.
- package/CHANGELOG.md +31 -0
- package/dist/index.d.mts +580 -0
- package/dist/index.d.ts +580 -0
- package/dist/index.js +2347 -0
- package/dist/index.mjs +2302 -0
- package/package.json +18 -10
- package/src/core/create-tree.ts +26 -15
- package/src/features/async-data-loader/feature.ts +5 -0
- package/src/features/async-data-loader/types.ts +2 -0
- package/src/features/checkboxes/checkboxes.spec.ts +20 -5
- package/src/features/checkboxes/feature.ts +31 -16
- package/src/features/checkboxes/types.ts +1 -0
- package/src/features/drag-and-drop/drag-and-drop.spec.ts +11 -2
- package/src/features/drag-and-drop/feature.ts +107 -24
- package/src/features/drag-and-drop/types.ts +21 -0
- package/src/features/drag-and-drop/utils.ts +8 -6
- package/src/features/keyboard-drag-and-drop/feature.ts +10 -1
- package/src/features/keyboard-drag-and-drop/keyboard-drag-and-drop.spec.ts +34 -3
- package/src/features/main/types.ts +0 -2
- package/src/features/sync-data-loader/feature.ts +5 -1
- package/src/features/tree/feature.ts +4 -3
- package/src/features/tree/tree.spec.ts +14 -4
- package/src/test-utils/test-tree-do.ts +2 -0
- package/src/test-utils/test-tree.ts +1 -0
- package/tsconfig.json +1 -4
- package/vitest.config.ts +3 -1
- package/lib/cjs/core/build-proxified-instance.d.ts +0 -2
- package/lib/cjs/core/build-proxified-instance.js +0 -58
- package/lib/cjs/core/build-static-instance.d.ts +0 -2
- package/lib/cjs/core/build-static-instance.js +0 -26
- package/lib/cjs/core/create-tree.d.ts +0 -2
- package/lib/cjs/core/create-tree.js +0 -191
- package/lib/cjs/features/async-data-loader/feature.d.ts +0 -2
- package/lib/cjs/features/async-data-loader/feature.js +0 -135
- package/lib/cjs/features/async-data-loader/types.d.ts +0 -47
- package/lib/cjs/features/async-data-loader/types.js +0 -2
- package/lib/cjs/features/checkboxes/feature.d.ts +0 -2
- package/lib/cjs/features/checkboxes/feature.js +0 -94
- package/lib/cjs/features/checkboxes/types.d.ts +0 -26
- package/lib/cjs/features/checkboxes/types.js +0 -9
- package/lib/cjs/features/drag-and-drop/feature.d.ts +0 -2
- package/lib/cjs/features/drag-and-drop/feature.js +0 -205
- package/lib/cjs/features/drag-and-drop/types.d.ts +0 -71
- package/lib/cjs/features/drag-and-drop/types.js +0 -9
- package/lib/cjs/features/drag-and-drop/utils.d.ts +0 -27
- package/lib/cjs/features/drag-and-drop/utils.js +0 -182
- package/lib/cjs/features/expand-all/feature.d.ts +0 -2
- package/lib/cjs/features/expand-all/feature.js +0 -70
- package/lib/cjs/features/expand-all/types.d.ts +0 -19
- package/lib/cjs/features/expand-all/types.js +0 -2
- package/lib/cjs/features/hotkeys-core/feature.d.ts +0 -2
- package/lib/cjs/features/hotkeys-core/feature.js +0 -107
- package/lib/cjs/features/hotkeys-core/types.d.ts +0 -27
- package/lib/cjs/features/hotkeys-core/types.js +0 -2
- package/lib/cjs/features/keyboard-drag-and-drop/feature.d.ts +0 -2
- package/lib/cjs/features/keyboard-drag-and-drop/feature.js +0 -206
- package/lib/cjs/features/keyboard-drag-and-drop/types.d.ts +0 -27
- package/lib/cjs/features/keyboard-drag-and-drop/types.js +0 -11
- package/lib/cjs/features/main/types.d.ts +0 -47
- package/lib/cjs/features/main/types.js +0 -2
- package/lib/cjs/features/prop-memoization/feature.d.ts +0 -2
- package/lib/cjs/features/prop-memoization/feature.js +0 -70
- package/lib/cjs/features/prop-memoization/types.d.ts +0 -15
- package/lib/cjs/features/prop-memoization/types.js +0 -2
- package/lib/cjs/features/renaming/feature.d.ts +0 -2
- package/lib/cjs/features/renaming/feature.js +0 -86
- package/lib/cjs/features/renaming/types.d.ts +0 -27
- package/lib/cjs/features/renaming/types.js +0 -2
- package/lib/cjs/features/search/feature.d.ts +0 -2
- package/lib/cjs/features/search/feature.js +0 -119
- package/lib/cjs/features/search/types.d.ts +0 -32
- package/lib/cjs/features/search/types.js +0 -2
- package/lib/cjs/features/selection/feature.d.ts +0 -2
- package/lib/cjs/features/selection/feature.js +0 -132
- package/lib/cjs/features/selection/types.d.ts +0 -21
- package/lib/cjs/features/selection/types.js +0 -2
- package/lib/cjs/features/sync-data-loader/feature.d.ts +0 -2
- package/lib/cjs/features/sync-data-loader/feature.js +0 -49
- package/lib/cjs/features/sync-data-loader/types.d.ts +0 -28
- package/lib/cjs/features/sync-data-loader/types.js +0 -2
- package/lib/cjs/features/tree/feature.d.ts +0 -2
- package/lib/cjs/features/tree/feature.js +0 -244
- package/lib/cjs/features/tree/types.d.ts +0 -63
- package/lib/cjs/features/tree/types.js +0 -2
- package/lib/cjs/index.d.ts +0 -33
- package/lib/cjs/index.js +0 -51
- package/lib/cjs/mddocs-entry.d.ts +0 -121
- package/lib/cjs/mddocs-entry.js +0 -17
- package/lib/cjs/test-utils/test-tree-do.d.ts +0 -23
- package/lib/cjs/test-utils/test-tree-do.js +0 -112
- package/lib/cjs/test-utils/test-tree-expect.d.ts +0 -17
- package/lib/cjs/test-utils/test-tree-expect.js +0 -66
- package/lib/cjs/test-utils/test-tree.d.ts +0 -48
- package/lib/cjs/test-utils/test-tree.js +0 -207
- package/lib/cjs/types/core.d.ts +0 -84
- package/lib/cjs/types/core.js +0 -2
- package/lib/cjs/types/deep-merge.d.ts +0 -13
- package/lib/cjs/types/deep-merge.js +0 -2
- package/lib/cjs/utilities/create-on-drop-handler.d.ts +0 -3
- package/lib/cjs/utilities/create-on-drop-handler.js +0 -20
- package/lib/cjs/utilities/errors.d.ts +0 -2
- package/lib/cjs/utilities/errors.js +0 -9
- package/lib/cjs/utilities/insert-items-at-target.d.ts +0 -3
- package/lib/cjs/utilities/insert-items-at-target.js +0 -40
- package/lib/cjs/utilities/remove-items-from-parents.d.ts +0 -2
- package/lib/cjs/utilities/remove-items-from-parents.js +0 -32
- package/lib/cjs/utils.d.ts +0 -6
- package/lib/cjs/utils.js +0 -53
- package/lib/esm/core/build-proxified-instance.d.ts +0 -2
- package/lib/esm/core/build-proxified-instance.js +0 -54
- package/lib/esm/core/build-static-instance.d.ts +0 -2
- package/lib/esm/core/build-static-instance.js +0 -22
- package/lib/esm/core/create-tree.d.ts +0 -2
- package/lib/esm/core/create-tree.js +0 -187
- package/lib/esm/features/async-data-loader/feature.d.ts +0 -2
- package/lib/esm/features/async-data-loader/feature.js +0 -132
- package/lib/esm/features/async-data-loader/types.d.ts +0 -47
- package/lib/esm/features/async-data-loader/types.js +0 -1
- package/lib/esm/features/checkboxes/feature.d.ts +0 -2
- package/lib/esm/features/checkboxes/feature.js +0 -91
- package/lib/esm/features/checkboxes/types.d.ts +0 -26
- package/lib/esm/features/checkboxes/types.js +0 -6
- package/lib/esm/features/drag-and-drop/feature.d.ts +0 -2
- package/lib/esm/features/drag-and-drop/feature.js +0 -202
- package/lib/esm/features/drag-and-drop/types.d.ts +0 -71
- package/lib/esm/features/drag-and-drop/types.js +0 -6
- package/lib/esm/features/drag-and-drop/utils.d.ts +0 -27
- package/lib/esm/features/drag-and-drop/utils.js +0 -172
- package/lib/esm/features/expand-all/feature.d.ts +0 -2
- package/lib/esm/features/expand-all/feature.js +0 -67
- package/lib/esm/features/expand-all/types.d.ts +0 -19
- package/lib/esm/features/expand-all/types.js +0 -1
- package/lib/esm/features/hotkeys-core/feature.d.ts +0 -2
- package/lib/esm/features/hotkeys-core/feature.js +0 -104
- package/lib/esm/features/hotkeys-core/types.d.ts +0 -27
- package/lib/esm/features/hotkeys-core/types.js +0 -1
- package/lib/esm/features/keyboard-drag-and-drop/feature.d.ts +0 -2
- package/lib/esm/features/keyboard-drag-and-drop/feature.js +0 -203
- package/lib/esm/features/keyboard-drag-and-drop/types.d.ts +0 -27
- package/lib/esm/features/keyboard-drag-and-drop/types.js +0 -8
- package/lib/esm/features/main/types.d.ts +0 -47
- package/lib/esm/features/main/types.js +0 -1
- package/lib/esm/features/prop-memoization/feature.d.ts +0 -2
- package/lib/esm/features/prop-memoization/feature.js +0 -67
- package/lib/esm/features/prop-memoization/types.d.ts +0 -15
- package/lib/esm/features/prop-memoization/types.js +0 -1
- package/lib/esm/features/renaming/feature.d.ts +0 -2
- package/lib/esm/features/renaming/feature.js +0 -83
- package/lib/esm/features/renaming/types.d.ts +0 -27
- package/lib/esm/features/renaming/types.js +0 -1
- package/lib/esm/features/search/feature.d.ts +0 -2
- package/lib/esm/features/search/feature.js +0 -116
- package/lib/esm/features/search/types.d.ts +0 -32
- package/lib/esm/features/search/types.js +0 -1
- package/lib/esm/features/selection/feature.d.ts +0 -2
- package/lib/esm/features/selection/feature.js +0 -129
- package/lib/esm/features/selection/types.d.ts +0 -21
- package/lib/esm/features/selection/types.js +0 -1
- package/lib/esm/features/sync-data-loader/feature.d.ts +0 -2
- package/lib/esm/features/sync-data-loader/feature.js +0 -46
- package/lib/esm/features/sync-data-loader/types.d.ts +0 -28
- package/lib/esm/features/sync-data-loader/types.js +0 -1
- package/lib/esm/features/tree/feature.d.ts +0 -2
- package/lib/esm/features/tree/feature.js +0 -241
- package/lib/esm/features/tree/types.d.ts +0 -63
- package/lib/esm/features/tree/types.js +0 -1
- package/lib/esm/index.d.ts +0 -33
- package/lib/esm/index.js +0 -32
- package/lib/esm/mddocs-entry.d.ts +0 -121
- package/lib/esm/mddocs-entry.js +0 -1
- package/lib/esm/test-utils/test-tree-do.d.ts +0 -23
- package/lib/esm/test-utils/test-tree-do.js +0 -108
- package/lib/esm/test-utils/test-tree-expect.d.ts +0 -17
- package/lib/esm/test-utils/test-tree-expect.js +0 -62
- package/lib/esm/test-utils/test-tree.d.ts +0 -48
- package/lib/esm/test-utils/test-tree.js +0 -203
- package/lib/esm/types/core.d.ts +0 -84
- package/lib/esm/types/core.js +0 -1
- package/lib/esm/types/deep-merge.d.ts +0 -13
- package/lib/esm/types/deep-merge.js +0 -1
- package/lib/esm/utilities/create-on-drop-handler.d.ts +0 -3
- package/lib/esm/utilities/create-on-drop-handler.js +0 -16
- package/lib/esm/utilities/errors.d.ts +0 -2
- package/lib/esm/utilities/errors.js +0 -4
- package/lib/esm/utilities/insert-items-at-target.d.ts +0 -3
- package/lib/esm/utilities/insert-items-at-target.js +0 -36
- package/lib/esm/utilities/remove-items-from-parents.d.ts +0 -2
- package/lib/esm/utilities/remove-items-from-parents.js +0 -28
- package/lib/esm/utils.d.ts +0 -6
- package/lib/esm/utils.js +0 -46
|
@@ -1,32 +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.removeItemsFromParents = void 0;
|
|
13
|
-
const removeItemsFromParents = (movedItems, onChangeChildren) => __awaiter(void 0, void 0, void 0, function* () {
|
|
14
|
-
const movedItemsIds = movedItems.map((item) => item.getId());
|
|
15
|
-
const uniqueParents = [
|
|
16
|
-
...new Set(movedItems.map((item) => item.getParent())),
|
|
17
|
-
];
|
|
18
|
-
for (const parent of uniqueParents) {
|
|
19
|
-
const siblings = parent === null || parent === void 0 ? void 0 : parent.getChildren();
|
|
20
|
-
if (siblings && parent) {
|
|
21
|
-
const newChildren = siblings
|
|
22
|
-
.filter((sibling) => !movedItemsIds.includes(sibling.getId()))
|
|
23
|
-
.map((i) => i.getId());
|
|
24
|
-
yield onChangeChildren(parent, newChildren);
|
|
25
|
-
if (parent && "updateCachedChildrenIds" in parent) {
|
|
26
|
-
parent === null || parent === void 0 ? void 0 : parent.updateCachedChildrenIds(newChildren);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
movedItems[0].getTree().rebuildTree();
|
|
31
|
-
});
|
|
32
|
-
exports.removeItemsFromParents = removeItemsFromParents;
|
package/lib/cjs/utils.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { SetStateFn, TreeState, Updater } from "./types/core";
|
|
2
|
-
export type NoInfer<T> = [T][T extends any ? 0 : never];
|
|
3
|
-
export declare const memo: <D extends readonly any[], P extends readonly any[], R>(deps: (...args: [...P]) => [...D], fn: (...args: [...D]) => R) => (...a: P) => R;
|
|
4
|
-
export declare function functionalUpdate<T>(updater: Updater<T>, input: T): T;
|
|
5
|
-
export declare function makeStateUpdater<K extends keyof TreeState<any>>(key: K, instance: unknown): SetStateFn<TreeState<any>[K]>;
|
|
6
|
-
export declare const poll: (fn: () => boolean, interval?: number, timeout?: number) => Promise<void>;
|
package/lib/cjs/utils.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.poll = exports.memo = void 0;
|
|
4
|
-
exports.functionalUpdate = functionalUpdate;
|
|
5
|
-
exports.makeStateUpdater = makeStateUpdater;
|
|
6
|
-
const memo = (deps, fn) => {
|
|
7
|
-
let value;
|
|
8
|
-
let oldDeps = null;
|
|
9
|
-
return (...a) => {
|
|
10
|
-
const newDeps = deps(...a);
|
|
11
|
-
if (!value) {
|
|
12
|
-
value = fn(...newDeps);
|
|
13
|
-
oldDeps = newDeps;
|
|
14
|
-
return value;
|
|
15
|
-
}
|
|
16
|
-
const match = oldDeps &&
|
|
17
|
-
oldDeps.length === newDeps.length &&
|
|
18
|
-
!oldDeps.some((dep, i) => dep !== newDeps[i]);
|
|
19
|
-
if (match) {
|
|
20
|
-
return value;
|
|
21
|
-
}
|
|
22
|
-
value = fn(...newDeps);
|
|
23
|
-
oldDeps = newDeps;
|
|
24
|
-
return value;
|
|
25
|
-
};
|
|
26
|
-
};
|
|
27
|
-
exports.memo = memo;
|
|
28
|
-
function functionalUpdate(updater, input) {
|
|
29
|
-
return typeof updater === "function"
|
|
30
|
-
? updater(input)
|
|
31
|
-
: updater;
|
|
32
|
-
}
|
|
33
|
-
function makeStateUpdater(key, instance) {
|
|
34
|
-
return (updater) => {
|
|
35
|
-
instance.setState((old) => {
|
|
36
|
-
return Object.assign(Object.assign({}, old), { [key]: functionalUpdate(updater, old[key]) });
|
|
37
|
-
});
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
const poll = (fn, interval = 100, timeout = 1000) => new Promise((resolve) => {
|
|
41
|
-
let clear;
|
|
42
|
-
const i = setInterval(() => {
|
|
43
|
-
if (fn()) {
|
|
44
|
-
resolve();
|
|
45
|
-
clearInterval(i);
|
|
46
|
-
clearTimeout(clear);
|
|
47
|
-
}
|
|
48
|
-
}, interval);
|
|
49
|
-
clear = setTimeout(() => {
|
|
50
|
-
clearInterval(i);
|
|
51
|
-
}, timeout);
|
|
52
|
-
});
|
|
53
|
-
exports.poll = poll;
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { throwError } from "../utilities/errors";
|
|
2
|
-
const noop = () => { };
|
|
3
|
-
const findPrevInstanceMethod = (features, instanceType, methodKey, featureSearchIndex) => {
|
|
4
|
-
var _a;
|
|
5
|
-
for (let i = featureSearchIndex; i >= 0; i--) {
|
|
6
|
-
const feature = features[i];
|
|
7
|
-
const itemInstanceMethod = (_a = feature[instanceType]) === null || _a === void 0 ? void 0 : _a[methodKey];
|
|
8
|
-
if (itemInstanceMethod) {
|
|
9
|
-
return i;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
return null;
|
|
13
|
-
};
|
|
14
|
-
const invokeInstanceMethod = (features, instanceType, opts, methodKey, featureIndex, args) => {
|
|
15
|
-
var _a;
|
|
16
|
-
const prevIndex = findPrevInstanceMethod(features, instanceType, methodKey, featureIndex - 1);
|
|
17
|
-
const itemInstanceMethod = (_a = features[featureIndex][instanceType]) === null || _a === void 0 ? void 0 : _a[methodKey];
|
|
18
|
-
return itemInstanceMethod(Object.assign(Object.assign({}, opts), { prev: prevIndex !== null
|
|
19
|
-
? (...newArgs) => invokeInstanceMethod(features, instanceType, opts, methodKey, prevIndex, newArgs)
|
|
20
|
-
: null }), ...args);
|
|
21
|
-
};
|
|
22
|
-
export const buildProxiedInstance = (features, instanceType, buildOpts) => {
|
|
23
|
-
// demo with prototypes: https://jsfiddle.net/bgenc58r/
|
|
24
|
-
const opts = {};
|
|
25
|
-
const item = new Proxy({}, {
|
|
26
|
-
has(target, key) {
|
|
27
|
-
if (typeof key === "symbol") {
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
if (key === "toJSON") {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
const hasInstanceMethod = findPrevInstanceMethod(features, instanceType, key, features.length - 1);
|
|
34
|
-
return Boolean(hasInstanceMethod);
|
|
35
|
-
},
|
|
36
|
-
get(target, key) {
|
|
37
|
-
if (typeof key === "symbol") {
|
|
38
|
-
return undefined;
|
|
39
|
-
}
|
|
40
|
-
if (key === "toJSON") {
|
|
41
|
-
return {};
|
|
42
|
-
}
|
|
43
|
-
return (...args) => {
|
|
44
|
-
const featureIndex = findPrevInstanceMethod(features, instanceType, key, features.length - 1);
|
|
45
|
-
if (featureIndex === null) {
|
|
46
|
-
throw throwError(`feature missing for method ${key}`);
|
|
47
|
-
}
|
|
48
|
-
return invokeInstanceMethod(features, instanceType, opts, key, featureIndex, args);
|
|
49
|
-
};
|
|
50
|
-
},
|
|
51
|
-
});
|
|
52
|
-
Object.assign(opts, buildOpts(item));
|
|
53
|
-
return [item, noop];
|
|
54
|
-
};
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-continue,no-labels,no-extra-label */
|
|
2
|
-
export const buildStaticInstance = (features, instanceType, buildOpts) => {
|
|
3
|
-
const instance = {};
|
|
4
|
-
const finalize = () => {
|
|
5
|
-
const opts = buildOpts(instance);
|
|
6
|
-
featureLoop: for (let i = 0; i < features.length; i++) {
|
|
7
|
-
// Loop goes in forward order, each features overwrite previous ones and wraps those in a prev() fn
|
|
8
|
-
const definition = features[i][instanceType];
|
|
9
|
-
if (!definition)
|
|
10
|
-
continue featureLoop;
|
|
11
|
-
methodLoop: for (const [key, method] of Object.entries(definition)) {
|
|
12
|
-
if (!method)
|
|
13
|
-
continue methodLoop;
|
|
14
|
-
const prev = instance[key];
|
|
15
|
-
instance[key] = (...args) => {
|
|
16
|
-
return method(Object.assign(Object.assign({}, opts), { prev }), ...args);
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
return [instance, finalize];
|
|
22
|
-
};
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import { treeFeature } from "../features/tree/feature";
|
|
2
|
-
import { buildStaticInstance } from "./build-static-instance";
|
|
3
|
-
import { throwError } from "../utilities/errors";
|
|
4
|
-
const verifyFeatures = (features) => {
|
|
5
|
-
var _a;
|
|
6
|
-
const loadedFeatures = features === null || features === void 0 ? void 0 : features.map((feature) => feature.key);
|
|
7
|
-
for (const feature of features !== null && features !== void 0 ? features : []) {
|
|
8
|
-
const missingDependency = (_a = feature.deps) === null || _a === void 0 ? void 0 : _a.find((dep) => !(loadedFeatures === null || loadedFeatures === void 0 ? void 0 : loadedFeatures.includes(dep)));
|
|
9
|
-
if (missingDependency) {
|
|
10
|
-
throw throwError(`${feature.key} needs ${missingDependency}`);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
// Check all possible pairs and sort the array
|
|
15
|
-
const exhaustiveSort = (arr, compareFn) => {
|
|
16
|
-
const n = arr.length;
|
|
17
|
-
for (let i = 0; i < n; i++) {
|
|
18
|
-
for (let j = i + 1; j < n; j++) {
|
|
19
|
-
if (compareFn(arr[j], arr[i]) < 0) {
|
|
20
|
-
[arr[i], arr[j]] = [arr[j], arr[i]];
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return arr;
|
|
25
|
-
};
|
|
26
|
-
const compareFeatures = (originalOrder) => (feature1, feature2) => {
|
|
27
|
-
var _a, _b;
|
|
28
|
-
if (feature2.key && ((_a = feature1.overwrites) === null || _a === void 0 ? void 0 : _a.includes(feature2.key))) {
|
|
29
|
-
return 1;
|
|
30
|
-
}
|
|
31
|
-
if (feature1.key && ((_b = feature2.overwrites) === null || _b === void 0 ? void 0 : _b.includes(feature1.key))) {
|
|
32
|
-
return -1;
|
|
33
|
-
}
|
|
34
|
-
return originalOrder.indexOf(feature1) - originalOrder.indexOf(feature2);
|
|
35
|
-
};
|
|
36
|
-
const sortFeatures = (features = []) => exhaustiveSort(features, compareFeatures(features));
|
|
37
|
-
export const createTree = (initialConfig) => {
|
|
38
|
-
var _a, _b, _c, _d;
|
|
39
|
-
const buildInstance = (_a = initialConfig.instanceBuilder) !== null && _a !== void 0 ? _a : buildStaticInstance;
|
|
40
|
-
const additionalFeatures = [
|
|
41
|
-
treeFeature,
|
|
42
|
-
...sortFeatures(initialConfig.features),
|
|
43
|
-
];
|
|
44
|
-
verifyFeatures(additionalFeatures);
|
|
45
|
-
const features = [...additionalFeatures];
|
|
46
|
-
const [treeInstance, finalizeTree] = buildInstance(features, "treeInstance", (tree) => ({ tree }));
|
|
47
|
-
let state = additionalFeatures.reduce((acc, feature) => { var _a, _b; return (_b = (_a = feature.getInitialState) === null || _a === void 0 ? void 0 : _a.call(feature, acc, treeInstance)) !== null && _b !== void 0 ? _b : acc; }, (_c = (_b = initialConfig.initialState) !== null && _b !== void 0 ? _b : initialConfig.state) !== null && _c !== void 0 ? _c : {});
|
|
48
|
-
let config = additionalFeatures.reduce((acc, feature) => { var _a, _b; return (_b = (_a = feature.getDefaultConfig) === null || _a === void 0 ? void 0 : _a.call(feature, acc, treeInstance)) !== null && _b !== void 0 ? _b : acc; }, initialConfig);
|
|
49
|
-
const stateHandlerNames = additionalFeatures.reduce((acc, feature) => (Object.assign(Object.assign({}, acc), feature.stateHandlerNames)), {});
|
|
50
|
-
let treeElement;
|
|
51
|
-
const treeDataRef = { current: {} };
|
|
52
|
-
const itemInstancesMap = {};
|
|
53
|
-
let itemInstances = [];
|
|
54
|
-
const itemElementsMap = {};
|
|
55
|
-
const itemDataRefs = {};
|
|
56
|
-
let itemMetaMap = {};
|
|
57
|
-
const hotkeyPresets = {};
|
|
58
|
-
const rebuildItemMeta = () => {
|
|
59
|
-
// TODO can we find a way to only run this for the changed substructure?
|
|
60
|
-
itemInstances = [];
|
|
61
|
-
itemMetaMap = {};
|
|
62
|
-
const [rootInstance, finalizeRootInstance] = buildInstance(features, "itemInstance", (item) => ({ item, tree: treeInstance, itemId: config.rootItemId }));
|
|
63
|
-
finalizeRootInstance();
|
|
64
|
-
itemInstancesMap[config.rootItemId] = rootInstance;
|
|
65
|
-
itemMetaMap[config.rootItemId] = {
|
|
66
|
-
itemId: config.rootItemId,
|
|
67
|
-
index: -1,
|
|
68
|
-
parentId: null,
|
|
69
|
-
level: -1,
|
|
70
|
-
posInSet: 0,
|
|
71
|
-
setSize: 1,
|
|
72
|
-
};
|
|
73
|
-
for (const item of treeInstance.getItemsMeta()) {
|
|
74
|
-
itemMetaMap[item.itemId] = item;
|
|
75
|
-
if (!itemInstancesMap[item.itemId]) {
|
|
76
|
-
const [instance, finalizeInstance] = buildInstance(features, "itemInstance", (instance) => ({
|
|
77
|
-
item: instance,
|
|
78
|
-
tree: treeInstance,
|
|
79
|
-
itemId: item.itemId,
|
|
80
|
-
}));
|
|
81
|
-
finalizeInstance();
|
|
82
|
-
itemInstancesMap[item.itemId] = instance;
|
|
83
|
-
itemInstances.push(instance);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
itemInstances.push(itemInstancesMap[item.itemId]);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
const eachFeature = (fn) => {
|
|
91
|
-
for (const feature of additionalFeatures) {
|
|
92
|
-
fn(feature);
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
const mainFeature = {
|
|
96
|
-
key: "main",
|
|
97
|
-
treeInstance: {
|
|
98
|
-
getState: () => state,
|
|
99
|
-
setState: ({}, updater) => {
|
|
100
|
-
var _a;
|
|
101
|
-
// Not necessary, since I think the subupdate below keeps the state fresh anyways?
|
|
102
|
-
// state = typeof updater === "function" ? updater(state) : updater;
|
|
103
|
-
(_a = config.setState) === null || _a === void 0 ? void 0 : _a.call(config, state); // TODO this cant be right... This doesnt allow external state updates
|
|
104
|
-
// TODO this is never used, remove
|
|
105
|
-
},
|
|
106
|
-
applySubStateUpdate: ({}, stateName, updater) => {
|
|
107
|
-
state[stateName] =
|
|
108
|
-
typeof updater === "function" ? updater(state[stateName]) : updater;
|
|
109
|
-
const externalStateSetter = config[stateHandlerNames[stateName]];
|
|
110
|
-
externalStateSetter === null || externalStateSetter === void 0 ? void 0 : externalStateSetter(state[stateName]);
|
|
111
|
-
},
|
|
112
|
-
buildItemInstance: ({}, itemId) => {
|
|
113
|
-
const [instance, finalizeInstance] = buildInstance(features, "itemInstance", (instance) => ({
|
|
114
|
-
item: instance,
|
|
115
|
-
tree: treeInstance,
|
|
116
|
-
itemId,
|
|
117
|
-
}));
|
|
118
|
-
finalizeInstance();
|
|
119
|
-
return instance;
|
|
120
|
-
},
|
|
121
|
-
// TODO rebuildSubTree: (itemId: string) => void;
|
|
122
|
-
rebuildTree: () => {
|
|
123
|
-
var _a;
|
|
124
|
-
rebuildItemMeta();
|
|
125
|
-
(_a = config.setState) === null || _a === void 0 ? void 0 : _a.call(config, state);
|
|
126
|
-
},
|
|
127
|
-
getConfig: () => config,
|
|
128
|
-
setConfig: (_, updater) => {
|
|
129
|
-
var _a, _b, _c;
|
|
130
|
-
const newConfig = typeof updater === "function" ? updater(config) : updater;
|
|
131
|
-
const hasChangedExpandedItems = ((_a = newConfig.state) === null || _a === void 0 ? void 0 : _a.expandedItems) &&
|
|
132
|
-
((_b = newConfig.state) === null || _b === void 0 ? void 0 : _b.expandedItems) !== state.expandedItems;
|
|
133
|
-
config = newConfig;
|
|
134
|
-
if (newConfig.state) {
|
|
135
|
-
state = Object.assign(Object.assign({}, state), newConfig.state);
|
|
136
|
-
}
|
|
137
|
-
if (hasChangedExpandedItems) {
|
|
138
|
-
// if expanded items where changed from the outside
|
|
139
|
-
rebuildItemMeta();
|
|
140
|
-
(_c = config.setState) === null || _c === void 0 ? void 0 : _c.call(config, state);
|
|
141
|
-
}
|
|
142
|
-
},
|
|
143
|
-
getItemInstance: ({}, itemId) => itemInstancesMap[itemId],
|
|
144
|
-
getItems: () => itemInstances,
|
|
145
|
-
registerElement: ({}, element) => {
|
|
146
|
-
if (treeElement === element) {
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
if (treeElement && !element) {
|
|
150
|
-
eachFeature((feature) => { var _a; return (_a = feature.onTreeUnmount) === null || _a === void 0 ? void 0 : _a.call(feature, treeInstance, treeElement); });
|
|
151
|
-
}
|
|
152
|
-
else if (!treeElement && element) {
|
|
153
|
-
eachFeature((feature) => { var _a; return (_a = feature.onTreeMount) === null || _a === void 0 ? void 0 : _a.call(feature, treeInstance, element); });
|
|
154
|
-
}
|
|
155
|
-
treeElement = element;
|
|
156
|
-
},
|
|
157
|
-
getElement: () => treeElement,
|
|
158
|
-
getDataRef: () => treeDataRef,
|
|
159
|
-
getHotkeyPresets: () => hotkeyPresets,
|
|
160
|
-
},
|
|
161
|
-
itemInstance: {
|
|
162
|
-
registerElement: ({ itemId, item }, element) => {
|
|
163
|
-
if (itemElementsMap[itemId] === element) {
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
const oldElement = itemElementsMap[itemId];
|
|
167
|
-
if (oldElement && !element) {
|
|
168
|
-
eachFeature((feature) => { var _a; return (_a = feature.onItemUnmount) === null || _a === void 0 ? void 0 : _a.call(feature, item, oldElement, treeInstance); });
|
|
169
|
-
}
|
|
170
|
-
else if (!oldElement && element) {
|
|
171
|
-
eachFeature((feature) => { var _a; return (_a = feature.onItemMount) === null || _a === void 0 ? void 0 : _a.call(feature, item, element, treeInstance); });
|
|
172
|
-
}
|
|
173
|
-
itemElementsMap[itemId] = element;
|
|
174
|
-
},
|
|
175
|
-
getElement: ({ itemId }) => itemElementsMap[itemId],
|
|
176
|
-
// eslint-disable-next-line no-return-assign
|
|
177
|
-
getDataRef: ({ itemId }) => { var _a; return ((_a = itemDataRefs[itemId]) !== null && _a !== void 0 ? _a : (itemDataRefs[itemId] = { current: {} })); },
|
|
178
|
-
getItemMeta: ({ itemId }) => itemMetaMap[itemId],
|
|
179
|
-
},
|
|
180
|
-
};
|
|
181
|
-
features.unshift(mainFeature);
|
|
182
|
-
for (const feature of features) {
|
|
183
|
-
Object.assign(hotkeyPresets, (_d = feature.hotkeys) !== null && _d !== void 0 ? _d : {});
|
|
184
|
-
}
|
|
185
|
-
finalizeTree();
|
|
186
|
-
return treeInstance;
|
|
187
|
-
};
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import { makeStateUpdater } from "../../utils";
|
|
11
|
-
const getDataRef = (tree) => {
|
|
12
|
-
var _a, _b;
|
|
13
|
-
var _c, _d;
|
|
14
|
-
const dataRef = tree.getDataRef();
|
|
15
|
-
(_a = (_c = dataRef.current).itemData) !== null && _a !== void 0 ? _a : (_c.itemData = {});
|
|
16
|
-
(_b = (_d = dataRef.current).childrenIds) !== null && _b !== void 0 ? _b : (_d.childrenIds = {});
|
|
17
|
-
return dataRef;
|
|
18
|
-
};
|
|
19
|
-
const loadItemData = (tree, itemId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
|
-
var _a;
|
|
21
|
-
const config = tree.getConfig();
|
|
22
|
-
const dataRef = getDataRef(tree);
|
|
23
|
-
const item = yield config.dataLoader.getItem(itemId);
|
|
24
|
-
dataRef.current.itemData[itemId] = item;
|
|
25
|
-
(_a = config.onLoadedItem) === null || _a === void 0 ? void 0 : _a.call(config, itemId, item);
|
|
26
|
-
tree.applySubStateUpdate("loadingItemData", (loadingItemData) => loadingItemData.filter((id) => id !== itemId));
|
|
27
|
-
return item;
|
|
28
|
-
});
|
|
29
|
-
const loadChildrenIds = (tree, itemId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
30
|
-
var _a, _b;
|
|
31
|
-
const config = tree.getConfig();
|
|
32
|
-
const dataRef = getDataRef(tree);
|
|
33
|
-
let childrenIds;
|
|
34
|
-
if ("getChildrenWithData" in config.dataLoader) {
|
|
35
|
-
const children = yield config.dataLoader.getChildrenWithData(itemId);
|
|
36
|
-
childrenIds = children.map((c) => c.id);
|
|
37
|
-
dataRef.current.childrenIds[itemId] = childrenIds;
|
|
38
|
-
children.forEach(({ id, data }) => {
|
|
39
|
-
var _a;
|
|
40
|
-
dataRef.current.itemData[id] = data;
|
|
41
|
-
(_a = config.onLoadedItem) === null || _a === void 0 ? void 0 : _a.call(config, id, data);
|
|
42
|
-
});
|
|
43
|
-
(_a = config.onLoadedChildren) === null || _a === void 0 ? void 0 : _a.call(config, itemId, childrenIds);
|
|
44
|
-
tree.rebuildTree();
|
|
45
|
-
tree.applySubStateUpdate("loadingItemData", (loadingItemData) => loadingItemData.filter((id) => !childrenIds.includes(id)));
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
childrenIds = yield config.dataLoader.getChildren(itemId);
|
|
49
|
-
dataRef.current.childrenIds[itemId] = childrenIds;
|
|
50
|
-
(_b = config.onLoadedChildren) === null || _b === void 0 ? void 0 : _b.call(config, itemId, childrenIds);
|
|
51
|
-
tree.rebuildTree();
|
|
52
|
-
}
|
|
53
|
-
tree.applySubStateUpdate("loadingItemChildrens", (loadingItemChildrens) => loadingItemChildrens.filter((id) => id !== itemId));
|
|
54
|
-
return childrenIds;
|
|
55
|
-
});
|
|
56
|
-
export const asyncDataLoaderFeature = {
|
|
57
|
-
key: "async-data-loader",
|
|
58
|
-
getInitialState: (initialState) => (Object.assign({ loadingItemData: [], loadingItemChildrens: [] }, initialState)),
|
|
59
|
-
getDefaultConfig: (defaultConfig, tree) => (Object.assign({ setLoadingItemData: makeStateUpdater("loadingItemData", tree), setLoadingItemChildrens: makeStateUpdater("loadingItemChildrens", tree) }, defaultConfig)),
|
|
60
|
-
stateHandlerNames: {
|
|
61
|
-
loadingItemData: "setLoadingItemData",
|
|
62
|
-
loadingItemChildrens: "setLoadingItemChildrens",
|
|
63
|
-
},
|
|
64
|
-
treeInstance: {
|
|
65
|
-
waitForItemDataLoaded: ({ tree }, itemId) => tree.loadItemData(itemId),
|
|
66
|
-
waitForItemChildrenLoaded: ({ tree }, itemId) => tree.loadChildrenIds(itemId),
|
|
67
|
-
loadItemData: (_a, itemId_1) => __awaiter(void 0, [_a, itemId_1], void 0, function* ({ tree }, itemId) {
|
|
68
|
-
var _b;
|
|
69
|
-
return ((_b = getDataRef(tree).current.itemData[itemId]) !== null && _b !== void 0 ? _b : (yield loadItemData(tree, itemId)));
|
|
70
|
-
}),
|
|
71
|
-
loadChildrenIds: (_a, itemId_1) => __awaiter(void 0, [_a, itemId_1], void 0, function* ({ tree }, itemId) {
|
|
72
|
-
var _b;
|
|
73
|
-
return ((_b = getDataRef(tree).current.childrenIds[itemId]) !== null && _b !== void 0 ? _b : (yield loadChildrenIds(tree, itemId)));
|
|
74
|
-
}),
|
|
75
|
-
retrieveItemData: ({ tree }, itemId, skipFetch = false) => {
|
|
76
|
-
var _a, _b;
|
|
77
|
-
const config = tree.getConfig();
|
|
78
|
-
const dataRef = getDataRef(tree);
|
|
79
|
-
if (dataRef.current.itemData[itemId]) {
|
|
80
|
-
return dataRef.current.itemData[itemId];
|
|
81
|
-
}
|
|
82
|
-
if (!tree.getState().loadingItemData.includes(itemId) && !skipFetch) {
|
|
83
|
-
tree.applySubStateUpdate("loadingItemData", (loadingItemData) => [
|
|
84
|
-
...loadingItemData,
|
|
85
|
-
itemId,
|
|
86
|
-
]);
|
|
87
|
-
loadItemData(tree, itemId);
|
|
88
|
-
}
|
|
89
|
-
return (_b = (_a = config.createLoadingItemData) === null || _a === void 0 ? void 0 : _a.call(config)) !== null && _b !== void 0 ? _b : null;
|
|
90
|
-
},
|
|
91
|
-
retrieveChildrenIds: ({ tree }, itemId, skipFetch = false) => {
|
|
92
|
-
const dataRef = getDataRef(tree);
|
|
93
|
-
if (dataRef.current.childrenIds[itemId]) {
|
|
94
|
-
return dataRef.current.childrenIds[itemId];
|
|
95
|
-
}
|
|
96
|
-
if (tree.getState().loadingItemChildrens.includes(itemId) || skipFetch) {
|
|
97
|
-
return [];
|
|
98
|
-
}
|
|
99
|
-
tree.applySubStateUpdate("loadingItemChildrens", (loadingItemChildrens) => [...loadingItemChildrens, itemId]);
|
|
100
|
-
loadChildrenIds(tree, itemId);
|
|
101
|
-
return [];
|
|
102
|
-
},
|
|
103
|
-
},
|
|
104
|
-
itemInstance: {
|
|
105
|
-
isLoading: ({ tree, item }) => tree.getState().loadingItemData.includes(item.getItemMeta().itemId) ||
|
|
106
|
-
tree.getState().loadingItemChildrens.includes(item.getItemMeta().itemId),
|
|
107
|
-
invalidateItemData: (_a, optimistic_1) => __awaiter(void 0, [_a, optimistic_1], void 0, function* ({ tree, itemId }, optimistic) {
|
|
108
|
-
var _b;
|
|
109
|
-
if (!optimistic) {
|
|
110
|
-
(_b = getDataRef(tree).current.itemData) === null || _b === void 0 ? true : delete _b[itemId];
|
|
111
|
-
tree.applySubStateUpdate("loadingItemData", (loadingItemData) => [
|
|
112
|
-
...loadingItemData,
|
|
113
|
-
itemId,
|
|
114
|
-
]);
|
|
115
|
-
}
|
|
116
|
-
yield loadItemData(tree, itemId);
|
|
117
|
-
}),
|
|
118
|
-
invalidateChildrenIds: (_a, optimistic_1) => __awaiter(void 0, [_a, optimistic_1], void 0, function* ({ tree, itemId }, optimistic) {
|
|
119
|
-
var _b;
|
|
120
|
-
if (!optimistic) {
|
|
121
|
-
(_b = getDataRef(tree).current.childrenIds) === null || _b === void 0 ? true : delete _b[itemId];
|
|
122
|
-
tree.applySubStateUpdate("loadingItemChildrens", (loadingItemChildrens) => [...loadingItemChildrens, itemId]);
|
|
123
|
-
}
|
|
124
|
-
yield loadChildrenIds(tree, itemId);
|
|
125
|
-
}),
|
|
126
|
-
updateCachedChildrenIds: ({ tree, itemId }, childrenIds) => {
|
|
127
|
-
const dataRef = tree.getDataRef();
|
|
128
|
-
dataRef.current.childrenIds[itemId] = childrenIds;
|
|
129
|
-
tree.rebuildTree();
|
|
130
|
-
},
|
|
131
|
-
},
|
|
132
|
-
};
|
|
@@ -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 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { makeStateUpdater } from "../../utils";
|
|
2
|
-
import { CheckedState } from "./types";
|
|
3
|
-
import { throwError } from "../../utilities/errors";
|
|
4
|
-
const getAllLoadedDescendants = (tree, itemId) => {
|
|
5
|
-
if (!tree.getConfig().isItemFolder(tree.buildItemInstance(itemId))) {
|
|
6
|
-
return [itemId];
|
|
7
|
-
}
|
|
8
|
-
return tree
|
|
9
|
-
.retrieveChildrenIds(itemId)
|
|
10
|
-
.map((child) => getAllLoadedDescendants(tree, child))
|
|
11
|
-
.flat();
|
|
12
|
-
};
|
|
13
|
-
export const checkboxesFeature = {
|
|
14
|
-
key: "checkboxes",
|
|
15
|
-
overwrites: ["selection"],
|
|
16
|
-
getInitialState: (initialState) => (Object.assign({ checkedItems: [] }, initialState)),
|
|
17
|
-
getDefaultConfig: (defaultConfig, tree) => {
|
|
18
|
-
var _a;
|
|
19
|
-
const hasAsyncLoader = (_a = defaultConfig.features) === null || _a === void 0 ? void 0 : _a.some((f) => f.key === "async-data-loader");
|
|
20
|
-
if (hasAsyncLoader && !defaultConfig.canCheckFolders) {
|
|
21
|
-
throwError(`!canCheckFolders not supported with async trees`);
|
|
22
|
-
}
|
|
23
|
-
return Object.assign({ setCheckedItems: makeStateUpdater("checkedItems", tree), canCheckFolders: hasAsyncLoader !== null && hasAsyncLoader !== void 0 ? hasAsyncLoader : false }, defaultConfig);
|
|
24
|
-
},
|
|
25
|
-
stateHandlerNames: {
|
|
26
|
-
checkedItems: "setCheckedItems",
|
|
27
|
-
},
|
|
28
|
-
treeInstance: {
|
|
29
|
-
setCheckedItems: ({ tree }, checkedItems) => {
|
|
30
|
-
tree.applySubStateUpdate("checkedItems", checkedItems);
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
itemInstance: {
|
|
34
|
-
getCheckboxProps: ({ item }) => {
|
|
35
|
-
const checkedState = item.getCheckedState();
|
|
36
|
-
return {
|
|
37
|
-
onChange: item.toggleCheckedState,
|
|
38
|
-
checked: checkedState === CheckedState.Checked,
|
|
39
|
-
ref: (r) => {
|
|
40
|
-
if (r) {
|
|
41
|
-
r.indeterminate = checkedState === CheckedState.Indeterminate;
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
};
|
|
45
|
-
},
|
|
46
|
-
toggleCheckedState: ({ item }) => {
|
|
47
|
-
if (item.getCheckedState() === CheckedState.Checked) {
|
|
48
|
-
item.setUnchecked();
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
item.setChecked();
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
getCheckedState: ({ item, tree, itemId }) => {
|
|
55
|
-
const { checkedItems } = tree.getState();
|
|
56
|
-
if (checkedItems.includes(itemId)) {
|
|
57
|
-
return CheckedState.Checked;
|
|
58
|
-
}
|
|
59
|
-
if (item.isFolder() && !tree.getConfig().canCheckFolders) {
|
|
60
|
-
const descendants = getAllLoadedDescendants(tree, itemId);
|
|
61
|
-
if (descendants.every((d) => checkedItems.includes(d))) {
|
|
62
|
-
return CheckedState.Checked;
|
|
63
|
-
}
|
|
64
|
-
if (descendants.some((d) => checkedItems.includes(d))) {
|
|
65
|
-
return CheckedState.Indeterminate;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return CheckedState.Unchecked;
|
|
69
|
-
},
|
|
70
|
-
setChecked: ({ item, tree, itemId }) => {
|
|
71
|
-
if (!item.isFolder() || tree.getConfig().canCheckFolders) {
|
|
72
|
-
tree.applySubStateUpdate("checkedItems", (items) => [...items, itemId]);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
tree.applySubStateUpdate("checkedItems", (items) => [
|
|
76
|
-
...items,
|
|
77
|
-
...getAllLoadedDescendants(tree, itemId),
|
|
78
|
-
]);
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
setUnchecked: ({ item, tree, itemId }) => {
|
|
82
|
-
if (!item.isFolder() || tree.getConfig().canCheckFolders) {
|
|
83
|
-
tree.applySubStateUpdate("checkedItems", (items) => items.filter((id) => id !== itemId));
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
const descendants = getAllLoadedDescendants(tree, itemId);
|
|
87
|
-
tree.applySubStateUpdate("checkedItems", (items) => items.filter((id) => !descendants.includes(id)));
|
|
88
|
-
}
|
|
89
|
-
},
|
|
90
|
-
},
|
|
91
|
-
};
|