@snack-uikit/tree 0.10.2-preview-559f4416.0 → 0.10.2-preview-706ce187.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 (58) hide show
  1. package/README.md +14 -12
  2. package/dist/cjs/helpers/index.d.ts +0 -2
  3. package/dist/cjs/helpers/index.js +1 -3
  4. package/dist/cjs/helpers/sortTreeItemsByTitle.js +2 -2
  5. package/dist/cjs/helpers/traverse.d.ts +1 -7
  6. package/dist/cjs/helpers/traverse.js +2 -38
  7. package/dist/cjs/index.d.ts +0 -1
  8. package/dist/cjs/index.js +1 -26
  9. package/dist/cjs/types.d.ts +0 -12
  10. package/dist/esm/helpers/index.d.ts +0 -2
  11. package/dist/esm/helpers/index.js +0 -2
  12. package/dist/esm/helpers/sortTreeItemsByTitle.js +2 -2
  13. package/dist/esm/helpers/traverse.d.ts +1 -7
  14. package/dist/esm/helpers/traverse.js +0 -24
  15. package/dist/esm/index.d.ts +0 -1
  16. package/dist/esm/index.js +0 -1
  17. package/dist/esm/types.d.ts +0 -12
  18. package/package.json +6 -16
  19. package/src/helpers/index.ts +0 -2
  20. package/src/helpers/sortTreeItemsByTitle.ts +2 -2
  21. package/src/helpers/traverse.ts +1 -38
  22. package/src/index.ts +0 -1
  23. package/src/types.ts +0 -9
  24. package/dist/cjs/helpers/__tests__/collectEmptyNestedNodesInExpanded.spec.d.ts +0 -1
  25. package/dist/cjs/helpers/__tests__/collectEmptyNestedNodesInExpanded.spec.js +0 -80
  26. package/dist/cjs/helpers/__tests__/setChildrenOfTreeNode.spec.d.ts +0 -1
  27. package/dist/cjs/helpers/__tests__/setChildrenOfTreeNode.spec.js +0 -102
  28. package/dist/cjs/helpers/collectEmptyNestedNodesInExpanded.d.ts +0 -2
  29. package/dist/cjs/helpers/collectEmptyNestedNodesInExpanded.js +0 -17
  30. package/dist/cjs/helpers/setChildrenOfTreeNode.d.ts +0 -2
  31. package/dist/cjs/helpers/setChildrenOfTreeNode.js +0 -28
  32. package/dist/cjs/hooks/index.d.ts +0 -2
  33. package/dist/cjs/hooks/index.js +0 -26
  34. package/dist/cjs/hooks/useSearchableTree.d.ts +0 -33
  35. package/dist/cjs/hooks/useSearchableTree.js +0 -138
  36. package/dist/cjs/hooks/useTreeMultiSelection.d.ts +0 -12
  37. package/dist/cjs/hooks/useTreeMultiSelection.js +0 -82
  38. package/dist/esm/helpers/__tests__/collectEmptyNestedNodesInExpanded.spec.d.ts +0 -1
  39. package/dist/esm/helpers/__tests__/collectEmptyNestedNodesInExpanded.spec.js +0 -64
  40. package/dist/esm/helpers/__tests__/setChildrenOfTreeNode.spec.d.ts +0 -1
  41. package/dist/esm/helpers/__tests__/setChildrenOfTreeNode.spec.js +0 -50
  42. package/dist/esm/helpers/collectEmptyNestedNodesInExpanded.d.ts +0 -2
  43. package/dist/esm/helpers/collectEmptyNestedNodesInExpanded.js +0 -11
  44. package/dist/esm/helpers/setChildrenOfTreeNode.d.ts +0 -2
  45. package/dist/esm/helpers/setChildrenOfTreeNode.js +0 -20
  46. package/dist/esm/hooks/index.d.ts +0 -2
  47. package/dist/esm/hooks/index.js +0 -2
  48. package/dist/esm/hooks/useSearchableTree.d.ts +0 -33
  49. package/dist/esm/hooks/useSearchableTree.js +0 -98
  50. package/dist/esm/hooks/useTreeMultiSelection.d.ts +0 -12
  51. package/dist/esm/hooks/useTreeMultiSelection.js +0 -43
  52. package/src/helpers/__tests__/collectEmptyNestedNodesInExpanded.spec.ts +0 -88
  53. package/src/helpers/__tests__/setChildrenOfTreeNode.spec.ts +0 -68
  54. package/src/helpers/collectEmptyNestedNodesInExpanded.ts +0 -16
  55. package/src/helpers/setChildrenOfTreeNode.ts +0 -30
  56. package/src/hooks/index.ts +0 -2
  57. package/src/hooks/useSearchableTree.ts +0 -150
  58. package/src/hooks/useTreeMultiSelection.ts +0 -61
package/README.md CHANGED
@@ -90,22 +90,24 @@ function TreeAsyncLoadExample() {
90
90
 
91
91
  [//]: DOCUMENTATION_SECTION_START
92
92
  [//]: THIS_SECTION_IS_AUTOGENERATED_PLEASE_DONT_EDIT_IT
93
- ## getSearchedTreeItems
94
- ### Props
95
- | name | type | default value | description |
96
- |------|------|---------------|-------------|
97
- | tree* | `any[]` | - | |
98
- | searchOptions | `Partial<{ query: string; includeChildrenMatchedParent: boolean; }>` | - | |
99
- ## getSearchedTreeNodeById
100
- ### Props
101
- | name | type | default value | description |
102
- |------|------|---------------|-------------|
103
- | searchOptions* | `{ id: I; includeNested?: boolean; }` | - | |
104
- | tree* | `T[]` | - | |
105
93
  ## Tree
106
94
  ### Props
107
95
  | name | type | default value | description |
108
96
  |------|------|---------------|-------------|
97
+ | data* | `TreeNodeProps[]` | - | Данные для отрисовки |
98
+ | onNodeClick | `OnNodeClick` | - | Обработчик клика по элементу дерева |
99
+ | expandedNodes | `string[]` | - | Состояние для раскрытых элементов |
100
+ | onExpand | `(expandedKeys: string[], node: TreeNodeProps) => void` | - | Колбэк при раскрытии/закрытии элементов |
101
+ | onDataLoad | `(node: TreeNodeProps) => Promise<unknown>` | - | Колбэк для асинхронной загрузки данных при раскрытии дерева |
102
+ | parentActions | `(node: TreeNodeProps) => Item[]` | - | Дополнительные действия для элемента-родителя |
103
+ | nodeActions | `(node: TreeNodeProps) => Item[]` | - | Дополнительные действия для элемента-потомка |
104
+ | showIcons | `boolean` | true | Флаг отвечающий за отображение иконок у элементов дерева |
105
+ | showLines | `boolean` | true | Флаг отвечающий за отображение линий вложенности |
106
+ | className | `string` | - | CSS-класс |
107
+ | selectionMode | "single" \| "multi" | - | Режим выбора элементов: <br> - `Single` - одиночный выбор <br> - `Multi` - множественный выбор <br> - `undefined` - без выбора |
108
+ | selected | `string \| string[]` | - | Состояние для выбраных элементов: <br> - При <strong>selectionMode</strong>=`Multi` - принимает массив строк <br> - При <strong>selectionMode</strong>=`Single` - принимает строку |
109
+ | onSelect | `((selectedKeys: string[], node: TreeNodeProps) => void) \| ((selectedKey: string, node: TreeNodeProps) => void)` | - | Колбэк при изменении выбраных элементов: <br> - При <strong>selectionMode</strong>=`Multi` - возвращает массив строк <br> - При <strong>selectionMode</strong>=`Single` - возвращает строку |
110
+ | showToggle | `boolean` | - | |
109
111
 
110
112
 
111
113
  [//]: DOCUMENTATION_SECTION_END
@@ -6,5 +6,3 @@ export * from './getSearchedTreeNodeById';
6
6
  export * from './lookupTreeForSelectedNodes';
7
7
  export * from './sortTreeItemsByTitle';
8
8
  export * from './traverse';
9
- export * from './setChildrenOfTreeNode';
10
- export * from './collectEmptyNestedNodesInExpanded';
@@ -29,6 +29,4 @@ __exportStar(require("./getSearchedTreeItems"), exports);
29
29
  __exportStar(require("./getSearchedTreeNodeById"), exports);
30
30
  __exportStar(require("./lookupTreeForSelectedNodes"), exports);
31
31
  __exportStar(require("./sortTreeItemsByTitle"), exports);
32
- __exportStar(require("./traverse"), exports);
33
- __exportStar(require("./setChildrenOfTreeNode"), exports);
34
- __exportStar(require("./collectEmptyNestedNodesInExpanded"), exports);
32
+ __exportStar(require("./traverse"), exports);
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.sortTreeItemsByTitle = void 0;
7
7
  const extractTreeNodeTitle_1 = require("./extractTreeNodeTitle");
8
8
  const sortTreeItemsByTitle = items => items === null || items === void 0 ? void 0 : items.toSorted((itemA, itemB) => {
9
- const valueA = (0, extractTreeNodeTitle_1.extractTreeNodeTitle)(itemA).toLowerCase();
10
- const valueB = (0, extractTreeNodeTitle_1.extractTreeNodeTitle)(itemB).toLowerCase();
9
+ const valueA = (0, extractTreeNodeTitle_1.extractTreeNodeTitle)(itemA);
10
+ const valueB = (0, extractTreeNodeTitle_1.extractTreeNodeTitle)(itemB);
11
11
  return valueA.localeCompare(valueB);
12
12
  });
13
13
  exports.sortTreeItemsByTitle = sortTreeItemsByTitle;
@@ -1,8 +1,2 @@
1
- import { TreeNodeProps } from '../types';
1
+ import { TreeNodeProps } from '../';
2
2
  export declare const traverse: <T extends TreeNodeProps>(nodes: T[], callback: (node: T, depth: number) => void) => void;
3
- /**
4
- * BFS с указанием целевого списка для каждого узла.
5
- * Очередь хранит (node, depth, targetList). Callback добавляет узел в targetList
6
- * и возвращает массив для детей (или undefined, чтобы не обходить детей).
7
- */
8
- export declare const traverseWithTarget: <T extends TreeNodeProps>(nodes: T[], rootTargetList: T[], callback: (node: T, depth: number, targetList: T[]) => T[] | undefined) => void;
@@ -8,7 +8,7 @@ var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
8
8
  Object.defineProperty(exports, "__esModule", {
9
9
  value: true
10
10
  });
11
- exports.traverseWithTarget = exports.traverse = void 0;
11
+ exports.traverse = void 0;
12
12
  const queue_fifo_1 = __importDefault(require("queue-fifo"));
13
13
  const traverse = (nodes, callback) => {
14
14
  var _a;
@@ -37,40 +37,4 @@ const traverse = (nodes, callback) => {
37
37
  }
38
38
  }
39
39
  };
40
- exports.traverse = traverse;
41
- /**
42
- * BFS с указанием целевого списка для каждого узла.
43
- * Очередь хранит (node, depth, targetList). Callback добавляет узел в targetList
44
- * и возвращает массив для детей (или undefined, чтобы не обходить детей).
45
- */
46
- const traverseWithTarget = (nodes, rootTargetList, callback) => {
47
- var _a;
48
- const queue = new queue_fifo_1.default();
49
- for (const node of nodes) {
50
- queue.enqueue({
51
- node,
52
- depth: 0,
53
- targetList: rootTargetList
54
- });
55
- }
56
- while (!queue.isEmpty()) {
57
- const item = queue.dequeue();
58
- if (!item) continue;
59
- const {
60
- node,
61
- depth,
62
- targetList
63
- } = item;
64
- const childTargetList = callback(node, depth, targetList);
65
- if (childTargetList !== undefined && ((_a = node.nested) === null || _a === void 0 ? void 0 : _a.length)) {
66
- for (const child of node.nested) {
67
- queue.enqueue({
68
- node: child,
69
- depth: depth + 1,
70
- targetList: childTargetList
71
- });
72
- }
73
- }
74
- }
75
- };
76
- exports.traverseWithTarget = traverseWithTarget;
40
+ exports.traverse = traverse;
@@ -1,4 +1,3 @@
1
1
  export * from './components';
2
2
  export type { OnNodeClick, TreeNodeId, TreeNodeProps } from './types';
3
3
  export { setNonce } from '@snack-uikit/list';
4
- export { setChildrenOfTreeNode, traverse, getSearchedTreeItems, getSearchedTreeNodeById } from './helpers';
package/dist/cjs/index.js CHANGED
@@ -22,7 +22,7 @@ var __exportStar = void 0 && (void 0).__exportStar || function (m, exports) {
22
22
  Object.defineProperty(exports, "__esModule", {
23
23
  value: true
24
24
  });
25
- exports.getSearchedTreeNodeById = exports.getSearchedTreeItems = exports.traverse = exports.setChildrenOfTreeNode = exports.setNonce = void 0;
25
+ exports.setNonce = void 0;
26
26
  __exportStar(require("./components"), exports);
27
27
  var list_1 = require("@snack-uikit/list");
28
28
  Object.defineProperty(exports, "setNonce", {
@@ -30,29 +30,4 @@ Object.defineProperty(exports, "setNonce", {
30
30
  get: function () {
31
31
  return list_1.setNonce;
32
32
  }
33
- });
34
- var helpers_1 = require("./helpers");
35
- Object.defineProperty(exports, "setChildrenOfTreeNode", {
36
- enumerable: true,
37
- get: function () {
38
- return helpers_1.setChildrenOfTreeNode;
39
- }
40
- });
41
- Object.defineProperty(exports, "traverse", {
42
- enumerable: true,
43
- get: function () {
44
- return helpers_1.traverse;
45
- }
46
- });
47
- Object.defineProperty(exports, "getSearchedTreeItems", {
48
- enumerable: true,
49
- get: function () {
50
- return helpers_1.getSearchedTreeItems;
51
- }
52
- });
53
- Object.defineProperty(exports, "getSearchedTreeNodeById", {
54
- enumerable: true,
55
- get: function () {
56
- return helpers_1.getSearchedTreeNodeById;
57
- }
58
33
  });
@@ -103,15 +103,3 @@ export type TreeBaseProps = TreeView | TreeMultiSelect | TreeSingleSelect;
103
103
  export type ExtendedTreeNodeProps = TreeNodeProps & {
104
104
  getTitle?(): void;
105
105
  };
106
- export type PreloadNodeHandler<TTreeNode extends TreeNodeProps> = (node: TreeNodeProps) => Promise<{
107
- preloadedChildren: TTreeNode[];
108
- updatedTree: TTreeNode[];
109
- }>;
110
- export type SelectHandler = (props: {
111
- selectedKeys: string[];
112
- node: TreeNodeProps;
113
- isSelected: boolean;
114
- }) => {
115
- added: string[];
116
- removed: string[];
117
- };
@@ -6,5 +6,3 @@ export * from './getSearchedTreeNodeById';
6
6
  export * from './lookupTreeForSelectedNodes';
7
7
  export * from './sortTreeItemsByTitle';
8
8
  export * from './traverse';
9
- export * from './setChildrenOfTreeNode';
10
- export * from './collectEmptyNestedNodesInExpanded';
@@ -6,5 +6,3 @@ export * from './getSearchedTreeNodeById';
6
6
  export * from './lookupTreeForSelectedNodes';
7
7
  export * from './sortTreeItemsByTitle';
8
8
  export * from './traverse';
9
- export * from './setChildrenOfTreeNode';
10
- export * from './collectEmptyNestedNodesInExpanded';
@@ -1,6 +1,6 @@
1
1
  import { extractTreeNodeTitle } from './extractTreeNodeTitle';
2
2
  export const sortTreeItemsByTitle = (items) => items === null || items === void 0 ? void 0 : items.toSorted((itemA, itemB) => {
3
- const valueA = extractTreeNodeTitle(itemA).toLowerCase();
4
- const valueB = extractTreeNodeTitle(itemB).toLowerCase();
3
+ const valueA = extractTreeNodeTitle(itemA);
4
+ const valueB = extractTreeNodeTitle(itemB);
5
5
  return valueA.localeCompare(valueB);
6
6
  });
@@ -1,8 +1,2 @@
1
- import { TreeNodeProps } from '../types';
1
+ import { TreeNodeProps } from '../';
2
2
  export declare const traverse: <T extends TreeNodeProps>(nodes: T[], callback: (node: T, depth: number) => void) => void;
3
- /**
4
- * BFS с указанием целевого списка для каждого узла.
5
- * Очередь хранит (node, depth, targetList). Callback добавляет узел в targetList
6
- * и возвращает массив для детей (или undefined, чтобы не обходить детей).
7
- */
8
- export declare const traverseWithTarget: <T extends TreeNodeProps>(nodes: T[], rootTargetList: T[], callback: (node: T, depth: number, targetList: T[]) => T[] | undefined) => void;
@@ -17,27 +17,3 @@ export const traverse = (nodes, callback) => {
17
17
  }
18
18
  }
19
19
  };
20
- /**
21
- * BFS с указанием целевого списка для каждого узла.
22
- * Очередь хранит (node, depth, targetList). Callback добавляет узел в targetList
23
- * и возвращает массив для детей (или undefined, чтобы не обходить детей).
24
- */
25
- export const traverseWithTarget = (nodes, rootTargetList, callback) => {
26
- var _a;
27
- const queue = new Queue();
28
- for (const node of nodes) {
29
- queue.enqueue({ node, depth: 0, targetList: rootTargetList });
30
- }
31
- while (!queue.isEmpty()) {
32
- const item = queue.dequeue();
33
- if (!item)
34
- continue;
35
- const { node, depth, targetList } = item;
36
- const childTargetList = callback(node, depth, targetList);
37
- if (childTargetList !== undefined && ((_a = node.nested) === null || _a === void 0 ? void 0 : _a.length)) {
38
- for (const child of node.nested) {
39
- queue.enqueue({ node: child, depth: depth + 1, targetList: childTargetList });
40
- }
41
- }
42
- }
43
- };
@@ -1,4 +1,3 @@
1
1
  export * from './components';
2
2
  export type { OnNodeClick, TreeNodeId, TreeNodeProps } from './types';
3
3
  export { setNonce } from '@snack-uikit/list';
4
- export { setChildrenOfTreeNode, traverse, getSearchedTreeItems, getSearchedTreeNodeById } from './helpers';
package/dist/esm/index.js CHANGED
@@ -1,3 +1,2 @@
1
1
  export * from './components';
2
2
  export { setNonce } from '@snack-uikit/list';
3
- export { setChildrenOfTreeNode, traverse, getSearchedTreeItems, getSearchedTreeNodeById } from './helpers';
@@ -103,15 +103,3 @@ export type TreeBaseProps = TreeView | TreeMultiSelect | TreeSingleSelect;
103
103
  export type ExtendedTreeNodeProps = TreeNodeProps & {
104
104
  getTitle?(): void;
105
105
  };
106
- export type PreloadNodeHandler<TTreeNode extends TreeNodeProps> = (node: TreeNodeProps) => Promise<{
107
- preloadedChildren: TTreeNode[];
108
- updatedTree: TTreeNode[];
109
- }>;
110
- export type SelectHandler = (props: {
111
- selectedKeys: string[];
112
- node: TreeNodeProps;
113
- isSelected: boolean;
114
- }) => {
115
- added: string[];
116
- removed: string[];
117
- };
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "title": "Tree",
7
- "version": "0.10.2-preview-559f4416.0",
7
+ "version": "0.10.2-preview-706ce187.0",
8
8
  "sideEffects": [
9
9
  "*.css",
10
10
  "*.woff",
@@ -13,16 +13,8 @@
13
13
  "description": "",
14
14
  "types": "./dist/esm/index.d.ts",
15
15
  "exports": {
16
- ".": {
17
- "import": "./dist/esm/index.js",
18
- "require": "./dist/cjs/index.js",
19
- "types": "./dist/esm/index.d.ts"
20
- },
21
- "./hooks": {
22
- "import": "./dist/esm/hooks/index.js",
23
- "require": "./dist/cjs/hooks/index.js",
24
- "types": "./dist/esm/hooks/index.d.ts"
25
- }
16
+ "import": "./dist/esm/index.js",
17
+ "require": "./dist/cjs/index.js"
26
18
  },
27
19
  "homepage": "https://github.com/cloud-ru-tech/snack-uikit/tree/master/packages/tree",
28
20
  "repository": {
@@ -44,19 +36,17 @@
44
36
  "license": "Apache-2.0",
45
37
  "scripts": {},
46
38
  "dependencies": {
47
- "@siberiacancode/reactuse": "0.3.14",
48
39
  "@snack-uikit/button": "0.19.17",
49
40
  "@snack-uikit/icons": "0.27.7",
50
- "@snack-uikit/list": "0.32.15",
41
+ "@snack-uikit/list": "0.32.16-preview-706ce187.0",
51
42
  "@snack-uikit/toggles": "0.13.26",
52
- "@snack-uikit/truncate-string": "0.7.9",
43
+ "@snack-uikit/truncate-string": "0.7.10-preview-706ce187.0",
53
44
  "@snack-uikit/typography": "0.8.12",
54
45
  "@snack-uikit/utils": "4.0.1",
55
- "cancelable-promise": "4.3.1",
56
46
  "classnames": "2.5.1",
57
47
  "queue-fifo": "0.2.6",
58
48
  "react-transition-state": "2.1.1",
59
49
  "uncontrollable": "8.0.4"
60
50
  },
61
- "gitHead": "64ce37781bf1da9706bb25163ad2cad0f24e5609"
51
+ "gitHead": "f3de00cf3774ba9d0f120904d3efdbd8ce9d6942"
62
52
  }
@@ -6,5 +6,3 @@ export * from './getSearchedTreeNodeById';
6
6
  export * from './lookupTreeForSelectedNodes';
7
7
  export * from './sortTreeItemsByTitle';
8
8
  export * from './traverse';
9
- export * from './setChildrenOfTreeNode';
10
- export * from './collectEmptyNestedNodesInExpanded';
@@ -3,8 +3,8 @@ import { extractTreeNodeTitle } from './extractTreeNodeTitle';
3
3
 
4
4
  export const sortTreeItemsByTitle = (items: ExtendedTreeNodeProps[]) =>
5
5
  items?.toSorted((itemA, itemB) => {
6
- const valueA = extractTreeNodeTitle(itemA).toLowerCase();
7
- const valueB = extractTreeNodeTitle(itemB).toLowerCase();
6
+ const valueA = extractTreeNodeTitle(itemA);
7
+ const valueB = extractTreeNodeTitle(itemB);
8
8
 
9
9
  return valueA.localeCompare(valueB);
10
10
  });
@@ -1,15 +1,9 @@
1
1
  import Queue from 'queue-fifo';
2
2
 
3
- import { TreeNodeProps } from '../types';
3
+ import { TreeNodeProps } from '../';
4
4
 
5
5
  type NodeWithDepth<T extends TreeNodeProps> = { node: T; depth: number };
6
6
 
7
- type NodeWithDepthAndTarget<T extends TreeNodeProps> = {
8
- node: T;
9
- depth: number;
10
- targetList: T[];
11
- };
12
-
13
7
  export const traverse = <T extends TreeNodeProps>(nodes: T[], callback: (node: T, depth: number) => void) => {
14
8
  const queue = new Queue<NodeWithDepth<T>>();
15
9
 
@@ -31,34 +25,3 @@ export const traverse = <T extends TreeNodeProps>(nodes: T[], callback: (node: T
31
25
  }
32
26
  }
33
27
  };
34
-
35
- /**
36
- * BFS с указанием целевого списка для каждого узла.
37
- * Очередь хранит (node, depth, targetList). Callback добавляет узел в targetList
38
- * и возвращает массив для детей (или undefined, чтобы не обходить детей).
39
- */
40
- export const traverseWithTarget = <T extends TreeNodeProps>(
41
- nodes: T[],
42
- rootTargetList: T[],
43
- callback: (node: T, depth: number, targetList: T[]) => T[] | undefined,
44
- ) => {
45
- const queue = new Queue<NodeWithDepthAndTarget<T>>();
46
-
47
- for (const node of nodes) {
48
- queue.enqueue({ node, depth: 0, targetList: rootTargetList });
49
- }
50
-
51
- while (!queue.isEmpty()) {
52
- const item = queue.dequeue();
53
- if (!item) continue;
54
-
55
- const { node, depth, targetList } = item;
56
- const childTargetList = callback(node, depth, targetList);
57
-
58
- if (childTargetList !== undefined && node.nested?.length) {
59
- for (const child of node.nested) {
60
- queue.enqueue({ node: child as T, depth: depth + 1, targetList: childTargetList });
61
- }
62
- }
63
- }
64
- };
package/src/index.ts CHANGED
@@ -1,4 +1,3 @@
1
1
  export * from './components';
2
2
  export type { OnNodeClick, TreeNodeId, TreeNodeProps } from './types';
3
3
  export { setNonce } from '@snack-uikit/list';
4
- export { setChildrenOfTreeNode, traverse, getSearchedTreeItems, getSearchedTreeNodeById } from './helpers';
package/src/types.ts CHANGED
@@ -118,12 +118,3 @@ export type TreeBaseProps = TreeView | TreeMultiSelect | TreeSingleSelect;
118
118
  export type ExtendedTreeNodeProps = TreeNodeProps & {
119
119
  getTitle?(): void;
120
120
  };
121
-
122
- export type PreloadNodeHandler<TTreeNode extends TreeNodeProps> = (
123
- node: TreeNodeProps,
124
- ) => Promise<{ preloadedChildren: TTreeNode[]; updatedTree: TTreeNode[] }>;
125
-
126
- export type SelectHandler = (props: { selectedKeys: string[]; node: TreeNodeProps; isSelected: boolean }) => {
127
- added: string[];
128
- removed: string[];
129
- };
@@ -1,80 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- const vitest_1 = require("vitest");
7
- const collectEmptyNestedNodesInExpanded_1 = require("../collectEmptyNestedNodesInExpanded");
8
- const node = (id, nested) => Object.assign({
9
- id,
10
- title: id
11
- }, nested !== undefined && {
12
- nested
13
- });
14
- (0, vitest_1.describe)('collectEmptyNestedNodesInExpanded', () => {
15
- (0, vitest_1.it)('returns nodes with empty nested array that are in expandedIds', () => {
16
- const tree = [node('a', []), node('b', [node('b1')])];
17
- const expandedIds = new Set(['a']);
18
- const result = (0, collectEmptyNestedNodesInExpanded_1.collectEmptyNestedNodesInExpanded)(tree, expandedIds);
19
- (0, vitest_1.expect)(result).toHaveLength(1);
20
- (0, vitest_1.expect)(result[0]).toMatchObject({
21
- id: 'a',
22
- nested: []
23
- });
24
- });
25
- (0, vitest_1.it)('does not return nodes with empty nested if not in expandedIds', () => {
26
- const tree = [node('a', []), node('b', [])];
27
- const expandedIds = new Set(['b']);
28
- const result = (0, collectEmptyNestedNodesInExpanded_1.collectEmptyNestedNodesInExpanded)(tree, expandedIds);
29
- (0, vitest_1.expect)(result).toHaveLength(1);
30
- (0, vitest_1.expect)(result[0].id).toBe('b');
31
- });
32
- (0, vitest_1.it)('does not return nodes that have non-empty nested', () => {
33
- const tree = [node('a', [node('a1')]), node('b', [])];
34
- const expandedIds = new Set(['a', 'b']);
35
- const result = (0, collectEmptyNestedNodesInExpanded_1.collectEmptyNestedNodesInExpanded)(tree, expandedIds);
36
- (0, vitest_1.expect)(result).toHaveLength(1);
37
- (0, vitest_1.expect)(result[0].id).toBe('b');
38
- });
39
- (0, vitest_1.it)('does not return nodes without nested property (leaf)', () => {
40
- const tree = [node('leaf'), node('empty', [])];
41
- const expandedIds = new Set(['leaf', 'empty']);
42
- const result = (0, collectEmptyNestedNodesInExpanded_1.collectEmptyNestedNodesInExpanded)(tree, expandedIds);
43
- (0, vitest_1.expect)(result).toHaveLength(1);
44
- (0, vitest_1.expect)(result[0].id).toBe('empty');
45
- });
46
- (0, vitest_1.it)('returns empty array for empty tree', () => {
47
- const result = (0, collectEmptyNestedNodesInExpanded_1.collectEmptyNestedNodesInExpanded)([], new Set(['any']));
48
- (0, vitest_1.expect)(result).toEqual([]);
49
- });
50
- (0, vitest_1.it)('returns empty array when expandedIds is empty', () => {
51
- const tree = [node('a', []), node('b', [])];
52
- const result = (0, collectEmptyNestedNodesInExpanded_1.collectEmptyNestedNodesInExpanded)(tree, new Set());
53
- (0, vitest_1.expect)(result).toEqual([]);
54
- });
55
- (0, vitest_1.it)('collects from deeply nested nodes', () => {
56
- const child = node('child', []);
57
- const tree = [node('root', [node('mid', [child])])];
58
- const expandedIds = new Set(['root', 'mid', 'child']);
59
- const result = (0, collectEmptyNestedNodesInExpanded_1.collectEmptyNestedNodesInExpanded)(tree, expandedIds);
60
- (0, vitest_1.expect)(result).toHaveLength(1);
61
- (0, vitest_1.expect)(result[0]).toMatchObject({
62
- id: 'child',
63
- nested: []
64
- });
65
- });
66
- (0, vitest_1.it)('returns all matching nodes from different levels', () => {
67
- const tree = [node('a', []), node('b', [node('b1', []), node('b2', [])])];
68
- const expandedIds = new Set(['a', 'b', 'b1', 'b2']);
69
- const result = (0, collectEmptyNestedNodesInExpanded_1.collectEmptyNestedNodesInExpanded)(tree, expandedIds);
70
- (0, vitest_1.expect)(result).toHaveLength(3);
71
- (0, vitest_1.expect)(result.map(n => n.id).sort()).toEqual(['a', 'b1', 'b2']);
72
- });
73
- (0, vitest_1.it)('only includes node if both empty nested and expanded', () => {
74
- const tree = [node('expanded', []), node('collapsed', [])];
75
- const expandedIds = new Set(['expanded']);
76
- const result = (0, collectEmptyNestedNodesInExpanded_1.collectEmptyNestedNodesInExpanded)(tree, expandedIds);
77
- (0, vitest_1.expect)(result).toHaveLength(1);
78
- (0, vitest_1.expect)(result[0].id).toBe('expanded');
79
- });
80
- });
@@ -1,102 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- const vitest_1 = require("vitest");
7
- const setChildrenOfTreeNode_1 = require("../setChildrenOfTreeNode");
8
- const node = (id, nested) => Object.assign({
9
- id,
10
- title: id
11
- }, nested !== undefined && {
12
- nested: nested.map(n => Object.assign(Object.assign({}, n), {
13
- title: n.id
14
- }))
15
- });
16
- (0, vitest_1.describe)('setChildrenOfTreeNode', () => {
17
- (0, vitest_1.it)('replaces nested for root-level node', () => {
18
- const tree = [node('a', [{
19
- id: 'a1',
20
- title: 'a1'
21
- }]), node('b', [{
22
- id: 'b1',
23
- title: 'b1'
24
- }])];
25
- const children = [node('new1'), node('new2')];
26
- const result = (0, setChildrenOfTreeNode_1.setChildrenOfTreeNode)(tree, 'b', children);
27
- (0, vitest_1.expect)(result).toHaveLength(2);
28
- (0, vitest_1.expect)(result[0]).toMatchObject({
29
- id: 'a',
30
- nested: [{
31
- id: 'a1'
32
- }]
33
- });
34
- (0, vitest_1.expect)(result[1]).toMatchObject({
35
- id: 'b',
36
- nested: [{
37
- id: 'new1'
38
- }, {
39
- id: 'new2'
40
- }]
41
- });
42
- });
43
- (0, vitest_1.it)('replaces nested for deeply nested node', () => {
44
- const childWithNested = node('child');
45
- childWithNested.nested = [{
46
- id: 'grand',
47
- title: 'grand'
48
- }];
49
- const tree = [node('root', [childWithNested])];
50
- const children = [node('replacement')];
51
- const result = (0, setChildrenOfTreeNode_1.setChildrenOfTreeNode)(tree, 'child', children);
52
- const root = result[0];
53
- (0, vitest_1.expect)(root.nested).toHaveLength(1);
54
- (0, vitest_1.expect)(root.nested[0]).toMatchObject({
55
- id: 'child',
56
- nested: [{
57
- id: 'replacement'
58
- }]
59
- });
60
- });
61
- (0, vitest_1.it)('returns cloned tree when node is not found', () => {
62
- const tree = [node('a'), node('b')];
63
- const result = (0, setChildrenOfTreeNode_1.setChildrenOfTreeNode)(tree, 'missing', [node('x')]);
64
- (0, vitest_1.expect)(result).toHaveLength(2);
65
- (0, vitest_1.expect)(result[0]).toMatchObject({
66
- id: 'a'
67
- });
68
- (0, vitest_1.expect)(result[1]).toMatchObject({
69
- id: 'b'
70
- });
71
- (0, vitest_1.expect)(result).not.toBe(tree);
72
- });
73
- (0, vitest_1.it)('returns empty array for empty tree', () => {
74
- const result = (0, setChildrenOfTreeNode_1.setChildrenOfTreeNode)([], 'any', [node('x')]);
75
- (0, vitest_1.expect)(result).toEqual([]);
76
- });
77
- (0, vitest_1.it)('sets children for target node that had no nested (leaf)', () => {
78
- const tree = [node('leaf'), node('other')];
79
- const children = [node('new1')];
80
- const result = (0, setChildrenOfTreeNode_1.setChildrenOfTreeNode)(tree, 'leaf', children);
81
- (0, vitest_1.expect)(result[0]).toMatchObject({
82
- id: 'leaf',
83
- nested: [{
84
- id: 'new1'
85
- }]
86
- });
87
- (0, vitest_1.expect)(result[1]).toMatchObject({
88
- id: 'other'
89
- });
90
- });
91
- (0, vitest_1.it)('preserves order of root nodes when target is second', () => {
92
- const tree = [node('first'), node('second', [{
93
- id: 's1',
94
- title: 's1'
95
- }]), node('third')];
96
- const children = [node('new1'), node('new2')];
97
- const result = (0, setChildrenOfTreeNode_1.setChildrenOfTreeNode)(tree, 'second', children);
98
- (0, vitest_1.expect)(result.map(n => n.id)).toEqual(['first', 'second', 'third']);
99
- (0, vitest_1.expect)(result[1].nested).toHaveLength(2);
100
- (0, vitest_1.expect)(result[1].nested.map(n => n.id)).toEqual(['new1', 'new2']);
101
- });
102
- });
@@ -1,2 +0,0 @@
1
- import { TreeNodeProps } from '../types';
2
- export declare function collectEmptyNestedNodesInExpanded<TTreeNode extends TreeNodeProps>(nodes: TTreeNode[], expandedIds: Set<string>): TTreeNode[];
@@ -1,17 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.collectEmptyNestedNodesInExpanded = collectEmptyNestedNodesInExpanded;
7
- const traverse_1 = require("./traverse");
8
- function collectEmptyNestedNodesInExpanded(nodes, expandedIds) {
9
- const result = [];
10
- (0, traverse_1.traverse)(nodes, node => {
11
- const hasEmptyNested = Array.isArray(node.nested) && node.nested.length === 0;
12
- if (hasEmptyNested && expandedIds.has(node.id)) {
13
- result.push(node);
14
- }
15
- });
16
- return result;
17
- }
@@ -1,2 +0,0 @@
1
- import { TreeNodeProps } from '../types';
2
- export declare const setChildrenOfTreeNode: <TTreeNode extends TreeNodeProps>(tree: TTreeNode[], nodeId: string, children: TTreeNode[]) => TTreeNode[];