@snack-uikit/tree 0.9.37 → 0.10.1-preview-0aba136f.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 +11 -0
- package/dist/cjs/helpers/__tests__/collectIds.spec.d.ts +1 -0
- package/dist/cjs/helpers/__tests__/collectIds.spec.js +14 -0
- package/dist/cjs/helpers/__tests__/constants.d.ts +2 -0
- package/dist/cjs/helpers/__tests__/constants.js +42 -0
- package/dist/cjs/helpers/__tests__/getSearchedTreeItems.spec.d.ts +1 -0
- package/dist/cjs/helpers/__tests__/getSearchedTreeItems.spec.js +183 -0
- package/dist/cjs/helpers/__tests__/getSearchedTreeNodeById.spec.d.ts +1 -0
- package/dist/cjs/helpers/__tests__/getSearchedTreeNodeById.spec.js +123 -0
- package/dist/cjs/helpers/checkNestedNodesSelection.d.ts +5 -0
- package/dist/cjs/helpers/checkNestedNodesSelection.js +17 -0
- package/dist/cjs/helpers/collectIds.d.ts +2 -0
- package/dist/cjs/helpers/collectIds.js +13 -0
- package/dist/cjs/helpers/extractTreeNodeTitle.d.ts +2 -0
- package/dist/cjs/helpers/extractTreeNodeTitle.js +15 -0
- package/dist/cjs/helpers/findAllChildNodeIds.d.ts +2 -0
- package/dist/cjs/helpers/findAllChildNodeIds.js +21 -0
- package/dist/cjs/helpers/findAllExpandedChildNodeIds.d.ts +2 -0
- package/dist/cjs/helpers/findAllExpandedChildNodeIds.js +19 -0
- package/dist/cjs/helpers/getSearchedTreeItems.d.ts +10 -0
- package/dist/cjs/helpers/getSearchedTreeItems.js +43 -0
- package/dist/cjs/helpers/getSearchedTreeNodeById.d.ts +11 -0
- package/dist/cjs/helpers/getSearchedTreeNodeById.js +39 -0
- package/dist/cjs/helpers/index.d.ts +8 -0
- package/dist/cjs/helpers/index.js +32 -0
- package/dist/cjs/helpers/lookupTreeForSelectedNodes.d.ts +6 -0
- package/dist/cjs/{helpers.js → helpers/lookupTreeForSelectedNodes.js} +5 -43
- package/dist/cjs/helpers/sortTreeItemsByTitle.d.ts +2 -0
- package/dist/cjs/helpers/sortTreeItemsByTitle.js +13 -0
- package/dist/cjs/helpers/traverse.d.ts +2 -0
- package/dist/cjs/helpers/traverse.js +40 -0
- package/dist/cjs/types.d.ts +3 -0
- package/dist/esm/helpers/__tests__/collectIds.spec.d.ts +1 -0
- package/dist/esm/helpers/__tests__/collectIds.spec.js +20 -0
- package/dist/esm/helpers/__tests__/constants.d.ts +2 -0
- package/dist/esm/helpers/__tests__/constants.js +52 -0
- package/dist/esm/helpers/__tests__/getSearchedTreeItems.spec.d.ts +1 -0
- package/dist/esm/helpers/__tests__/getSearchedTreeItems.spec.js +165 -0
- package/dist/esm/helpers/__tests__/getSearchedTreeNodeById.spec.d.ts +1 -0
- package/dist/esm/helpers/__tests__/getSearchedTreeNodeById.spec.js +112 -0
- package/dist/esm/helpers/checkNestedNodesSelection.d.ts +5 -0
- package/dist/esm/helpers/checkNestedNodesSelection.js +11 -0
- package/dist/esm/helpers/collectIds.d.ts +2 -0
- package/dist/esm/helpers/collectIds.js +6 -0
- package/dist/esm/helpers/extractTreeNodeTitle.d.ts +2 -0
- package/dist/esm/helpers/extractTreeNodeTitle.js +1 -0
- package/dist/esm/helpers/findAllChildNodeIds.d.ts +2 -0
- package/dist/esm/helpers/findAllChildNodeIds.js +15 -0
- package/dist/esm/helpers/findAllExpandedChildNodeIds.d.ts +2 -0
- package/dist/esm/helpers/findAllExpandedChildNodeIds.js +13 -0
- package/dist/esm/helpers/getSearchedTreeItems.d.ts +10 -0
- package/dist/esm/helpers/getSearchedTreeItems.js +31 -0
- package/dist/esm/helpers/getSearchedTreeNodeById.d.ts +11 -0
- package/dist/esm/helpers/getSearchedTreeNodeById.js +23 -0
- package/dist/esm/helpers/index.d.ts +8 -0
- package/dist/esm/helpers/index.js +8 -0
- package/dist/esm/helpers/lookupTreeForSelectedNodes.d.ts +6 -0
- package/dist/esm/{helpers.js → helpers/lookupTreeForSelectedNodes.js} +2 -38
- package/dist/esm/helpers/sortTreeItemsByTitle.d.ts +2 -0
- package/dist/esm/helpers/sortTreeItemsByTitle.js +6 -0
- package/dist/esm/helpers/traverse.d.ts +2 -0
- package/dist/esm/helpers/traverse.js +19 -0
- package/dist/esm/types.d.ts +3 -0
- package/package.json +4 -3
- package/src/helperComponents/TreeNode/TreeNode.tsx +2 -1
- package/src/helpers/__tests__/collectIds.spec.ts +23 -0
- package/src/helpers/__tests__/constants.ts +54 -0
- package/src/helpers/__tests__/getSearchedTreeItems.spec.ts +191 -0
- package/src/helpers/__tests__/getSearchedTreeNodeById.spec.ts +138 -0
- package/src/helpers/checkNestedNodesSelection.ts +15 -0
- package/src/helpers/collectIds.ts +10 -0
- package/src/helpers/extractTreeNodeTitle.ts +4 -0
- package/src/helpers/findAllChildNodeIds.ts +20 -0
- package/src/helpers/findAllExpandedChildNodeIds.ts +18 -0
- package/src/helpers/getSearchedTreeItems.ts +50 -0
- package/src/helpers/getSearchedTreeNodeById.ts +46 -0
- package/src/helpers/index.ts +8 -0
- package/src/{helpers.ts → helpers/lookupTreeForSelectedNodes.ts} +3 -50
- package/src/helpers/sortTreeItemsByTitle.ts +10 -0
- package/src/helpers/traverse.ts +27 -0
- package/src/types.ts +4 -0
- package/dist/cjs/helpers.d.ts +0 -11
- package/dist/esm/helpers.d.ts +0 -11
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ExtendedTreeNodeProps } from '../types';
|
|
2
|
+
import { extractTreeNodeTitle } from './extractTreeNodeTitle';
|
|
3
|
+
|
|
4
|
+
const isMatchedTreeItem = (search: string) => {
|
|
5
|
+
const searchLower = search.toLocaleLowerCase();
|
|
6
|
+
return (treeItem: ExtendedTreeNodeProps) => {
|
|
7
|
+
const currentValue = extractTreeNodeTitle(treeItem);
|
|
8
|
+
return currentValue.toLocaleLowerCase().includes(searchLower);
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
type SearchParams = {
|
|
13
|
+
tree: ExtendedTreeNodeProps[];
|
|
14
|
+
searchOptions?: Partial<{
|
|
15
|
+
query: string;
|
|
16
|
+
includeChildrenMatchedParent: boolean;
|
|
17
|
+
}>;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const getSearchedTreeItems = ({ tree, searchOptions }: SearchParams) => {
|
|
21
|
+
if (!searchOptions?.query) return tree;
|
|
22
|
+
|
|
23
|
+
const { query = '', includeChildrenMatchedParent } = searchOptions;
|
|
24
|
+
|
|
25
|
+
const matchFunc = isMatchedTreeItem(query);
|
|
26
|
+
|
|
27
|
+
const searchItems = (treeItems: ExtendedTreeNodeProps[]): ExtendedTreeNodeProps[] =>
|
|
28
|
+
treeItems.reduce<ExtendedTreeNodeProps[]>((acc, item) => {
|
|
29
|
+
const hasMatchingTitle = matchFunc(item);
|
|
30
|
+
const needDeepSearch = !(hasMatchingTitle && includeChildrenMatchedParent);
|
|
31
|
+
|
|
32
|
+
const matchedChildren = item.nested && (needDeepSearch ? searchItems(item.nested) : item.nested);
|
|
33
|
+
|
|
34
|
+
if (hasMatchingTitle || matchedChildren?.length) {
|
|
35
|
+
const newItem = { ...item };
|
|
36
|
+
|
|
37
|
+
if (matchedChildren?.length) {
|
|
38
|
+
newItem.nested = matchedChildren;
|
|
39
|
+
} else {
|
|
40
|
+
delete newItem.nested;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
acc.push(newItem);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return acc;
|
|
47
|
+
}, []);
|
|
48
|
+
|
|
49
|
+
return searchItems(tree);
|
|
50
|
+
};
|
|
@@ -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 '
|
|
2
|
-
|
|
3
|
-
|
|
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
package/dist/cjs/helpers.d.ts
DELETED
|
@@ -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[];
|
package/dist/esm/helpers.d.ts
DELETED
|
@@ -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[];
|