@snack-uikit/tree 0.9.37 → 0.10.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 (83) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cjs/helpers/__tests__/collectIds.spec.d.ts +1 -0
  3. package/dist/cjs/helpers/__tests__/collectIds.spec.js +14 -0
  4. package/dist/cjs/helpers/__tests__/constants.d.ts +2 -0
  5. package/dist/cjs/helpers/__tests__/constants.js +42 -0
  6. package/dist/cjs/helpers/__tests__/getSearchedTreeItems.spec.d.ts +1 -0
  7. package/dist/cjs/helpers/__tests__/getSearchedTreeItems.spec.js +183 -0
  8. package/dist/cjs/helpers/__tests__/getSearchedTreeNodeById.spec.d.ts +1 -0
  9. package/dist/cjs/helpers/__tests__/getSearchedTreeNodeById.spec.js +123 -0
  10. package/dist/cjs/helpers/checkNestedNodesSelection.d.ts +5 -0
  11. package/dist/cjs/helpers/checkNestedNodesSelection.js +17 -0
  12. package/dist/cjs/helpers/collectIds.d.ts +2 -0
  13. package/dist/cjs/helpers/collectIds.js +13 -0
  14. package/dist/cjs/helpers/extractTreeNodeTitle.d.ts +2 -0
  15. package/dist/cjs/helpers/extractTreeNodeTitle.js +15 -0
  16. package/dist/cjs/helpers/findAllChildNodeIds.d.ts +2 -0
  17. package/dist/cjs/helpers/findAllChildNodeIds.js +21 -0
  18. package/dist/cjs/helpers/findAllExpandedChildNodeIds.d.ts +2 -0
  19. package/dist/cjs/helpers/findAllExpandedChildNodeIds.js +19 -0
  20. package/dist/cjs/helpers/getSearchedTreeItems.d.ts +10 -0
  21. package/dist/cjs/helpers/getSearchedTreeItems.js +43 -0
  22. package/dist/cjs/helpers/getSearchedTreeNodeById.d.ts +11 -0
  23. package/dist/cjs/helpers/getSearchedTreeNodeById.js +39 -0
  24. package/dist/cjs/helpers/index.d.ts +8 -0
  25. package/dist/cjs/helpers/index.js +32 -0
  26. package/dist/cjs/helpers/lookupTreeForSelectedNodes.d.ts +6 -0
  27. package/dist/cjs/{helpers.js → helpers/lookupTreeForSelectedNodes.js} +5 -43
  28. package/dist/cjs/helpers/sortTreeItemsByTitle.d.ts +2 -0
  29. package/dist/cjs/helpers/sortTreeItemsByTitle.js +13 -0
  30. package/dist/cjs/helpers/traverse.d.ts +2 -0
  31. package/dist/cjs/helpers/traverse.js +40 -0
  32. package/dist/cjs/types.d.ts +3 -0
  33. package/dist/esm/helpers/__tests__/collectIds.spec.d.ts +1 -0
  34. package/dist/esm/helpers/__tests__/collectIds.spec.js +20 -0
  35. package/dist/esm/helpers/__tests__/constants.d.ts +2 -0
  36. package/dist/esm/helpers/__tests__/constants.js +52 -0
  37. package/dist/esm/helpers/__tests__/getSearchedTreeItems.spec.d.ts +1 -0
  38. package/dist/esm/helpers/__tests__/getSearchedTreeItems.spec.js +165 -0
  39. package/dist/esm/helpers/__tests__/getSearchedTreeNodeById.spec.d.ts +1 -0
  40. package/dist/esm/helpers/__tests__/getSearchedTreeNodeById.spec.js +112 -0
  41. package/dist/esm/helpers/checkNestedNodesSelection.d.ts +5 -0
  42. package/dist/esm/helpers/checkNestedNodesSelection.js +11 -0
  43. package/dist/esm/helpers/collectIds.d.ts +2 -0
  44. package/dist/esm/helpers/collectIds.js +6 -0
  45. package/dist/esm/helpers/extractTreeNodeTitle.d.ts +2 -0
  46. package/dist/esm/helpers/extractTreeNodeTitle.js +1 -0
  47. package/dist/esm/helpers/findAllChildNodeIds.d.ts +2 -0
  48. package/dist/esm/helpers/findAllChildNodeIds.js +15 -0
  49. package/dist/esm/helpers/findAllExpandedChildNodeIds.d.ts +2 -0
  50. package/dist/esm/helpers/findAllExpandedChildNodeIds.js +13 -0
  51. package/dist/esm/helpers/getSearchedTreeItems.d.ts +10 -0
  52. package/dist/esm/helpers/getSearchedTreeItems.js +31 -0
  53. package/dist/esm/helpers/getSearchedTreeNodeById.d.ts +11 -0
  54. package/dist/esm/helpers/getSearchedTreeNodeById.js +23 -0
  55. package/dist/esm/helpers/index.d.ts +8 -0
  56. package/dist/esm/helpers/index.js +8 -0
  57. package/dist/esm/helpers/lookupTreeForSelectedNodes.d.ts +6 -0
  58. package/dist/esm/{helpers.js → helpers/lookupTreeForSelectedNodes.js} +2 -38
  59. package/dist/esm/helpers/sortTreeItemsByTitle.d.ts +2 -0
  60. package/dist/esm/helpers/sortTreeItemsByTitle.js +6 -0
  61. package/dist/esm/helpers/traverse.d.ts +2 -0
  62. package/dist/esm/helpers/traverse.js +19 -0
  63. package/dist/esm/types.d.ts +3 -0
  64. package/package.json +3 -2
  65. package/src/helperComponents/TreeNode/TreeNode.tsx +2 -1
  66. package/src/helpers/__tests__/collectIds.spec.ts +23 -0
  67. package/src/helpers/__tests__/constants.ts +54 -0
  68. package/src/helpers/__tests__/getSearchedTreeItems.spec.ts +191 -0
  69. package/src/helpers/__tests__/getSearchedTreeNodeById.spec.ts +138 -0
  70. package/src/helpers/checkNestedNodesSelection.ts +15 -0
  71. package/src/helpers/collectIds.ts +10 -0
  72. package/src/helpers/extractTreeNodeTitle.ts +4 -0
  73. package/src/helpers/findAllChildNodeIds.ts +20 -0
  74. package/src/helpers/findAllExpandedChildNodeIds.ts +18 -0
  75. package/src/helpers/getSearchedTreeItems.ts +50 -0
  76. package/src/helpers/getSearchedTreeNodeById.ts +46 -0
  77. package/src/helpers/index.ts +8 -0
  78. package/src/{helpers.ts → helpers/lookupTreeForSelectedNodes.ts} +3 -50
  79. package/src/helpers/sortTreeItemsByTitle.ts +10 -0
  80. package/src/helpers/traverse.ts +27 -0
  81. package/src/types.ts +4 -0
  82. package/dist/cjs/helpers.d.ts +0 -11
  83. package/dist/esm/helpers.d.ts +0 -11
@@ -0,0 +1,46 @@
1
+ import { ExtendedTreeNodeProps } from '../types';
2
+
3
+ type ReturnSearch<I, T> = I extends string ? T | null : T[];
4
+
5
+ type SearchByIdParams<I, T> = {
6
+ tree: T[];
7
+ searchOptions: {
8
+ id: I;
9
+ includeNested?: boolean;
10
+ };
11
+ };
12
+
13
+ export const getSearchedTreeNodeById = <I extends string | string[], T extends ExtendedTreeNodeProps>({
14
+ tree,
15
+ searchOptions: { id, includeNested = true },
16
+ }: SearchByIdParams<I, T>): ReturnSearch<I, T> => {
17
+ const isArrayIds = Array.isArray(id);
18
+
19
+ if (!id || (isArrayIds && id.length === 0)) {
20
+ return (isArrayIds ? [] : null) as ReturnSearch<I, T>;
21
+ }
22
+
23
+ const foundItems: T[] = [];
24
+
25
+ const searchNodes = (nodes: T[]): void => {
26
+ for (const node of nodes) {
27
+ const matchCondition = isArrayIds ? id.includes(node.id) : node.id === id;
28
+
29
+ if (matchCondition) {
30
+ foundItems.push(includeNested ? node : { ...node, nested: undefined });
31
+
32
+ if (!isArrayIds) {
33
+ return;
34
+ }
35
+ }
36
+
37
+ if (node.nested) {
38
+ searchNodes(node.nested as T[]);
39
+ }
40
+ }
41
+ };
42
+
43
+ searchNodes(tree);
44
+
45
+ return (isArrayIds ? foundItems : foundItems[0] || null) as ReturnSearch<I, T>;
46
+ };
@@ -0,0 +1,8 @@
1
+ export * from './checkNestedNodesSelection';
2
+ export * from './collectIds';
3
+ export * from './findAllExpandedChildNodeIds';
4
+ export * from './getSearchedTreeItems';
5
+ export * from './getSearchedTreeNodeById';
6
+ export * from './lookupTreeForSelectedNodes';
7
+ export * from './sortTreeItemsByTitle';
8
+ export * from './traverse';
@@ -1,53 +1,6 @@
1
- import { ParentNode, TreeNodeId, TreeNodeProps } from './types';
2
-
3
- function findAllChildNodeIds(nodes: TreeNodeProps[]): TreeNodeId[] {
4
- const stack = [...nodes];
5
- const ids: TreeNodeId[] = [];
6
-
7
- let node: TreeNodeProps | undefined;
8
-
9
- while ((node = stack.pop())) {
10
- if (!node.disabled) {
11
- ids.push(node.id);
12
-
13
- if (node.nested?.length) {
14
- stack.push(...node.nested);
15
- }
16
- }
17
- }
18
-
19
- return ids;
20
- }
21
-
22
- export function checkNestedNodesSelection(nodes: TreeNodeProps[], selectedKeys: TreeNodeId[]) {
23
- const allIds = findAllChildNodeIds(nodes);
24
-
25
- const selected = allIds.filter(id => selectedKeys.includes(id));
26
- const someSelected = selected.length > 0;
27
- const allSelected = someSelected && allIds.length === selected.length;
28
-
29
- return {
30
- someSelected: !allSelected && someSelected,
31
- allSelected,
32
- };
33
- }
34
-
35
- export function findAllExpandedChildNodeIds(nodes: TreeNodeProps[], expandedNodes: TreeNodeId[]) {
36
- const stack = [...nodes];
37
- const ids: TreeNodeId[] = [];
38
-
39
- let node: TreeNodeProps | undefined;
40
-
41
- while ((node = stack.shift())) {
42
- ids.push(node.id);
43
-
44
- if (node.nested?.length && expandedNodes.includes(node.id)) {
45
- stack.unshift(...node.nested);
46
- }
47
- }
48
-
49
- return ids;
50
- }
1
+ import { ParentNode, TreeNodeId, TreeNodeProps } from '../types';
2
+ import { checkNestedNodesSelection } from './checkNestedNodesSelection';
3
+ import { findAllChildNodeIds } from './findAllChildNodeIds';
51
4
 
52
5
  export function lookupTreeForSelectedNodes({
53
6
  node,
@@ -0,0 +1,10 @@
1
+ import { ExtendedTreeNodeProps } from '../types';
2
+ import { extractTreeNodeTitle } from './extractTreeNodeTitle';
3
+
4
+ export const sortTreeItemsByTitle = (items: ExtendedTreeNodeProps[]) =>
5
+ items?.toSorted((itemA, itemB) => {
6
+ const valueA = extractTreeNodeTitle(itemA);
7
+ const valueB = extractTreeNodeTitle(itemB);
8
+
9
+ return valueA.localeCompare(valueB);
10
+ });
@@ -0,0 +1,27 @@
1
+ import Queue from 'queue-fifo';
2
+
3
+ import { TreeNodeProps } from '../';
4
+
5
+ type NodeWithDepth<T extends TreeNodeProps> = { node: T; depth: number };
6
+
7
+ export const traverse = <T extends TreeNodeProps>(nodes: T[], callback: (node: T, depth: number) => void) => {
8
+ const queue = new Queue<NodeWithDepth<T>>();
9
+
10
+ for (const node of nodes) {
11
+ queue.enqueue({ node, depth: 0 });
12
+ }
13
+
14
+ while (!queue.isEmpty()) {
15
+ const nodeWithDepth = queue.dequeue();
16
+ if (!nodeWithDepth) {
17
+ continue;
18
+ }
19
+
20
+ const { node, depth } = nodeWithDepth;
21
+ callback(node, depth);
22
+
23
+ for (const child of node.nested ?? []) {
24
+ queue.enqueue({ node: child as T, depth: depth + 1 });
25
+ }
26
+ }
27
+ };
package/src/types.ts CHANGED
@@ -114,3 +114,7 @@ export type TreeMultiSelect = Omit<TreeCommonProps, 'selected'> & {
114
114
  };
115
115
 
116
116
  export type TreeBaseProps = TreeView | TreeMultiSelect | TreeSingleSelect;
117
+
118
+ export type ExtendedTreeNodeProps = TreeNodeProps & {
119
+ getTitle?(): void;
120
+ };
@@ -1,11 +0,0 @@
1
- import { ParentNode, TreeNodeId, TreeNodeProps } from './types';
2
- export declare function checkNestedNodesSelection(nodes: TreeNodeProps[], selectedKeys: TreeNodeId[]): {
3
- someSelected: boolean;
4
- allSelected: boolean;
5
- };
6
- export declare function findAllExpandedChildNodeIds(nodes: TreeNodeProps[], expandedNodes: TreeNodeId[]): string[];
7
- export declare function lookupTreeForSelectedNodes({ node, selectedNodes, parentNode, }: {
8
- node: Pick<TreeNodeProps, 'id' | 'nested' | 'disabled'>;
9
- selectedNodes: TreeNodeId[];
10
- parentNode?: ParentNode;
11
- }): string[];
@@ -1,11 +0,0 @@
1
- import { ParentNode, TreeNodeId, TreeNodeProps } from './types';
2
- export declare function checkNestedNodesSelection(nodes: TreeNodeProps[], selectedKeys: TreeNodeId[]): {
3
- someSelected: boolean;
4
- allSelected: boolean;
5
- };
6
- export declare function findAllExpandedChildNodeIds(nodes: TreeNodeProps[], expandedNodes: TreeNodeId[]): string[];
7
- export declare function lookupTreeForSelectedNodes({ node, selectedNodes, parentNode, }: {
8
- node: Pick<TreeNodeProps, 'id' | 'nested' | 'disabled'>;
9
- selectedNodes: TreeNodeId[];
10
- parentNode?: ParentNode;
11
- }): string[];