@cloud-ru/ds-tree 1.0.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 +8 -0
- package/LICENSE +201 -0
- package/README.md +341 -0
- package/dist/cjs/components/Tree/Tree.d.ts +4 -0
- package/dist/cjs/components/Tree/Tree.js +31 -0
- package/dist/cjs/components/Tree/index.d.ts +1 -0
- package/dist/cjs/components/Tree/index.js +17 -0
- package/dist/cjs/components/Tree/styles.module.css +17 -0
- package/dist/cjs/components/Tree/utils.d.ts +4 -0
- package/dist/cjs/components/Tree/utils.js +15 -0
- package/dist/cjs/components/index.d.ts +1 -0
- package/dist/cjs/components/index.js +17 -0
- package/dist/cjs/constants.d.ts +26 -0
- package/dist/cjs/constants.js +29 -0
- package/dist/cjs/contexts/TreeContext.d.ts +30 -0
- package/dist/cjs/contexts/TreeContext.js +108 -0
- package/dist/cjs/helperComponents/ExpandableTreeNode/ExpandableTreeNode.d.ts +11 -0
- package/dist/cjs/helperComponents/ExpandableTreeNode/ExpandableTreeNode.js +87 -0
- package/dist/cjs/helperComponents/ExpandableTreeNode/index.d.ts +1 -0
- package/dist/cjs/helperComponents/ExpandableTreeNode/index.js +17 -0
- package/dist/cjs/helperComponents/ExpandableTreeNode/styles.module.css +37 -0
- package/dist/cjs/helperComponents/TreeItem/TreeItem.d.ts +8 -0
- package/dist/cjs/helperComponents/TreeItem/TreeItem.js +16 -0
- package/dist/cjs/helperComponents/TreeItem/index.d.ts +1 -0
- package/dist/cjs/helperComponents/TreeItem/index.js +17 -0
- package/dist/cjs/helperComponents/TreeLine/TreeLine.d.ts +10 -0
- package/dist/cjs/helperComponents/TreeLine/TreeLine.js +13 -0
- package/dist/cjs/helperComponents/TreeLine/index.d.ts +1 -0
- package/dist/cjs/helperComponents/TreeLine/index.js +17 -0
- package/dist/cjs/helperComponents/TreeLine/styles.module.css +37 -0
- package/dist/cjs/helperComponents/TreeNode/TreeNode.d.ts +4 -0
- package/dist/cjs/helperComponents/TreeNode/TreeNode.js +187 -0
- package/dist/cjs/helperComponents/TreeNode/components/TreeNodeActions.d.ts +15 -0
- package/dist/cjs/helperComponents/TreeNode/components/TreeNodeActions.js +76 -0
- package/dist/cjs/helperComponents/TreeNode/components/TreeNodeHref.d.ts +7 -0
- package/dist/cjs/helperComponents/TreeNode/components/TreeNodeHref.js +12 -0
- package/dist/cjs/helperComponents/TreeNode/components/index.d.ts +2 -0
- package/dist/cjs/helperComponents/TreeNode/components/index.js +18 -0
- package/dist/cjs/helperComponents/TreeNode/constants.d.ts +5 -0
- package/dist/cjs/helperComponents/TreeNode/constants.js +10 -0
- package/dist/cjs/helperComponents/TreeNode/index.d.ts +1 -0
- package/dist/cjs/helperComponents/TreeNode/index.js +17 -0
- package/dist/cjs/helperComponents/TreeNode/styles.module.css +474 -0
- package/dist/cjs/helperComponents/TreeNode/types.d.ts +9 -0
- package/dist/cjs/helperComponents/TreeNode/types.js +2 -0
- package/dist/cjs/helperComponents/TreeNode/utils.d.ts +3 -0
- package/dist/cjs/helperComponents/TreeNode/utils.js +10 -0
- package/dist/cjs/helperComponents/index.d.ts +4 -0
- package/dist/cjs/helperComponents/index.js +20 -0
- package/dist/cjs/helpers/checkNestedNodesSelection.d.ts +9 -0
- package/dist/cjs/helpers/checkNestedNodesSelection.js +15 -0
- package/dist/cjs/helpers/collectEmptyNestedNodesInExpanded.d.ts +9 -0
- package/dist/cjs/helpers/collectEmptyNestedNodesInExpanded.js +21 -0
- package/dist/cjs/helpers/collectHierarchicalAncestors.d.ts +3 -0
- package/dist/cjs/helpers/collectHierarchicalAncestors.js +18 -0
- package/dist/cjs/helpers/collectIds.d.ts +9 -0
- package/dist/cjs/helpers/collectIds.js +16 -0
- package/dist/cjs/helpers/extractTreeNodeTitle.d.ts +6 -0
- package/dist/cjs/helpers/extractTreeNodeTitle.js +9 -0
- package/dist/cjs/helpers/findAllChildNodeIds.d.ts +9 -0
- package/dist/cjs/helpers/findAllChildNodeIds.js +24 -0
- package/dist/cjs/helpers/findAllExpandedChildNodeIds.d.ts +8 -0
- package/dist/cjs/helpers/findAllExpandedChildNodeIds.js +21 -0
- package/dist/cjs/helpers/getSearchedTreeItems.d.ts +23 -0
- package/dist/cjs/helpers/getSearchedTreeItems.js +41 -0
- package/dist/cjs/helpers/getSearchedTreeNodeById.d.ts +19 -0
- package/dist/cjs/helpers/getSearchedTreeNodeById.js +35 -0
- package/dist/cjs/helpers/index.d.ts +13 -0
- package/dist/cjs/helpers/index.js +29 -0
- package/dist/cjs/helpers/lookupTreeForSelectedNodes.d.ts +15 -0
- package/dist/cjs/helpers/lookupTreeForSelectedNodes.js +21 -0
- package/dist/cjs/helpers/sortTreeItemsByTitle.d.ts +13 -0
- package/dist/cjs/helpers/sortTreeItemsByTitle.js +14 -0
- package/dist/cjs/helpers/traverse.d.ts +11 -0
- package/dist/cjs/helpers/traverse.js +25 -0
- package/dist/cjs/helpers/traverseWithTarget.d.ts +14 -0
- package/dist/cjs/helpers/traverseWithTarget.js +30 -0
- package/dist/cjs/helpers/updateTreeNode.d.ts +13 -0
- package/dist/cjs/helpers/updateTreeNode.js +34 -0
- package/dist/cjs/hooks/index.d.ts +2 -0
- package/dist/cjs/hooks/index.js +18 -0
- package/dist/cjs/hooks/internalHooks.d.ts +4 -0
- package/dist/cjs/hooks/internalHooks.js +29 -0
- package/dist/cjs/hooks/useSearchableTree.d.ts +52 -0
- package/dist/cjs/hooks/useSearchableTree.js +113 -0
- package/dist/cjs/hooks/useTreeMultiSelection.d.ts +33 -0
- package/dist/cjs/hooks/useTreeMultiSelection.js +37 -0
- package/dist/cjs/index.d.ts +17 -0
- package/dist/cjs/index.js +47 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/style.css +565 -0
- package/dist/cjs/types.d.ts +151 -0
- package/dist/cjs/types.js +2 -0
- package/dist/esm/components/Tree/Tree.d.ts +4 -0
- package/dist/esm/components/Tree/Tree.js +25 -0
- package/dist/esm/components/Tree/index.d.ts +1 -0
- package/dist/esm/components/Tree/index.js +1 -0
- package/dist/esm/components/Tree/styles.module.css +17 -0
- package/dist/esm/components/Tree/utils.d.ts +4 -0
- package/dist/esm/components/Tree/utils.js +12 -0
- package/dist/esm/components/index.d.ts +1 -0
- package/dist/esm/components/index.js +1 -0
- package/dist/esm/constants.d.ts +26 -0
- package/dist/esm/constants.js +26 -0
- package/dist/esm/contexts/TreeContext.d.ts +30 -0
- package/dist/esm/contexts/TreeContext.js +103 -0
- package/dist/esm/helperComponents/ExpandableTreeNode/ExpandableTreeNode.d.ts +11 -0
- package/dist/esm/helperComponents/ExpandableTreeNode/ExpandableTreeNode.js +81 -0
- package/dist/esm/helperComponents/ExpandableTreeNode/index.d.ts +1 -0
- package/dist/esm/helperComponents/ExpandableTreeNode/index.js +1 -0
- package/dist/esm/helperComponents/ExpandableTreeNode/styles.module.css +37 -0
- package/dist/esm/helperComponents/TreeItem/TreeItem.d.ts +8 -0
- package/dist/esm/helperComponents/TreeItem/TreeItem.js +13 -0
- package/dist/esm/helperComponents/TreeItem/index.d.ts +1 -0
- package/dist/esm/helperComponents/TreeItem/index.js +1 -0
- package/dist/esm/helperComponents/TreeLine/TreeLine.d.ts +10 -0
- package/dist/esm/helperComponents/TreeLine/TreeLine.js +7 -0
- package/dist/esm/helperComponents/TreeLine/index.d.ts +1 -0
- package/dist/esm/helperComponents/TreeLine/index.js +1 -0
- package/dist/esm/helperComponents/TreeLine/styles.module.css +37 -0
- package/dist/esm/helperComponents/TreeNode/TreeNode.d.ts +4 -0
- package/dist/esm/helperComponents/TreeNode/TreeNode.js +181 -0
- package/dist/esm/helperComponents/TreeNode/components/TreeNodeActions.d.ts +15 -0
- package/dist/esm/helperComponents/TreeNode/components/TreeNodeActions.js +70 -0
- package/dist/esm/helperComponents/TreeNode/components/TreeNodeHref.d.ts +7 -0
- package/dist/esm/helperComponents/TreeNode/components/TreeNodeHref.js +6 -0
- package/dist/esm/helperComponents/TreeNode/components/index.d.ts +2 -0
- package/dist/esm/helperComponents/TreeNode/components/index.js +2 -0
- package/dist/esm/helperComponents/TreeNode/constants.d.ts +5 -0
- package/dist/esm/helperComponents/TreeNode/constants.js +7 -0
- package/dist/esm/helperComponents/TreeNode/index.d.ts +1 -0
- package/dist/esm/helperComponents/TreeNode/index.js +1 -0
- package/dist/esm/helperComponents/TreeNode/styles.module.css +474 -0
- package/dist/esm/helperComponents/TreeNode/types.d.ts +9 -0
- package/dist/esm/helperComponents/TreeNode/types.js +1 -0
- package/dist/esm/helperComponents/TreeNode/utils.d.ts +3 -0
- package/dist/esm/helperComponents/TreeNode/utils.js +6 -0
- package/dist/esm/helperComponents/index.d.ts +4 -0
- package/dist/esm/helperComponents/index.js +4 -0
- package/dist/esm/helpers/checkNestedNodesSelection.d.ts +9 -0
- package/dist/esm/helpers/checkNestedNodesSelection.js +12 -0
- package/dist/esm/helpers/collectEmptyNestedNodesInExpanded.d.ts +9 -0
- package/dist/esm/helpers/collectEmptyNestedNodesInExpanded.js +18 -0
- package/dist/esm/helpers/collectHierarchicalAncestors.d.ts +3 -0
- package/dist/esm/helpers/collectHierarchicalAncestors.js +15 -0
- package/dist/esm/helpers/collectIds.d.ts +9 -0
- package/dist/esm/helpers/collectIds.js +13 -0
- package/dist/esm/helpers/extractTreeNodeTitle.d.ts +6 -0
- package/dist/esm/helpers/extractTreeNodeTitle.js +5 -0
- package/dist/esm/helpers/findAllChildNodeIds.d.ts +9 -0
- package/dist/esm/helpers/findAllChildNodeIds.js +21 -0
- package/dist/esm/helpers/findAllExpandedChildNodeIds.d.ts +8 -0
- package/dist/esm/helpers/findAllExpandedChildNodeIds.js +18 -0
- package/dist/esm/helpers/getSearchedTreeItems.d.ts +23 -0
- package/dist/esm/helpers/getSearchedTreeItems.js +37 -0
- package/dist/esm/helpers/getSearchedTreeNodeById.d.ts +19 -0
- package/dist/esm/helpers/getSearchedTreeNodeById.js +31 -0
- package/dist/esm/helpers/index.d.ts +13 -0
- package/dist/esm/helpers/index.js +13 -0
- package/dist/esm/helpers/lookupTreeForSelectedNodes.d.ts +15 -0
- package/dist/esm/helpers/lookupTreeForSelectedNodes.js +18 -0
- package/dist/esm/helpers/sortTreeItemsByTitle.d.ts +13 -0
- package/dist/esm/helpers/sortTreeItemsByTitle.js +10 -0
- package/dist/esm/helpers/traverse.d.ts +11 -0
- package/dist/esm/helpers/traverse.js +21 -0
- package/dist/esm/helpers/traverseWithTarget.d.ts +14 -0
- package/dist/esm/helpers/traverseWithTarget.js +26 -0
- package/dist/esm/helpers/updateTreeNode.d.ts +13 -0
- package/dist/esm/helpers/updateTreeNode.js +30 -0
- package/dist/esm/hooks/index.d.ts +2 -0
- package/dist/esm/hooks/index.js +2 -0
- package/dist/esm/hooks/internalHooks.d.ts +4 -0
- package/dist/esm/hooks/internalHooks.js +24 -0
- package/dist/esm/hooks/useSearchableTree.d.ts +52 -0
- package/dist/esm/hooks/useSearchableTree.js +110 -0
- package/dist/esm/hooks/useTreeMultiSelection.d.ts +33 -0
- package/dist/esm/hooks/useTreeMultiSelection.js +34 -0
- package/dist/esm/index.d.ts +17 -0
- package/dist/esm/index.js +17 -0
- package/dist/esm/style.css +565 -0
- package/dist/esm/types.d.ts +151 -0
- package/dist/esm/types.js +1 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +51 -0
- package/src/components/Tree/Tree.tsx +53 -0
- package/src/components/Tree/index.ts +1 -0
- package/src/components/Tree/styles.module.scss +22 -0
- package/src/components/Tree/utils.ts +16 -0
- package/src/components/index.ts +1 -0
- package/src/constants.ts +29 -0
- package/src/contexts/TreeContext.tsx +189 -0
- package/src/helperComponents/ExpandableTreeNode/ExpandableTreeNode.tsx +156 -0
- package/src/helperComponents/ExpandableTreeNode/index.ts +1 -0
- package/src/helperComponents/ExpandableTreeNode/styles.module.scss +55 -0
- package/src/helperComponents/TreeItem/TreeItem.tsx +26 -0
- package/src/helperComponents/TreeItem/index.ts +1 -0
- package/src/helperComponents/TreeLine/TreeLine.tsx +27 -0
- package/src/helperComponents/TreeLine/index.ts +1 -0
- package/src/helperComponents/TreeLine/styles.module.scss +58 -0
- package/src/helperComponents/TreeNode/TreeNode.tsx +389 -0
- package/src/helperComponents/TreeNode/components/TreeNodeActions.tsx +129 -0
- package/src/helperComponents/TreeNode/components/TreeNodeHref.tsx +29 -0
- package/src/helperComponents/TreeNode/components/index.ts +2 -0
- package/src/helperComponents/TreeNode/constants.ts +7 -0
- package/src/helperComponents/TreeNode/index.ts +1 -0
- package/src/helperComponents/TreeNode/styles.module.scss +300 -0
- package/src/helperComponents/TreeNode/types.ts +11 -0
- package/src/helperComponents/TreeNode/utils.ts +9 -0
- package/src/helperComponents/index.ts +4 -0
- package/src/helpers/checkNestedNodesSelection.ts +15 -0
- package/src/helpers/collectEmptyNestedNodesInExpanded.ts +23 -0
- package/src/helpers/collectHierarchicalAncestors.ts +22 -0
- package/src/helpers/collectIds.ts +17 -0
- package/src/helpers/extractTreeNodeTitle.ts +8 -0
- package/src/helpers/findAllChildNodeIds.ts +27 -0
- package/src/helpers/findAllExpandedChildNodeIds.ts +24 -0
- package/src/helpers/getSearchedTreeItems.ts +63 -0
- package/src/helpers/getSearchedTreeNodeById.ts +54 -0
- package/src/helpers/index.ts +13 -0
- package/src/helpers/lookupTreeForSelectedNodes.ts +33 -0
- package/src/helpers/sortTreeItemsByTitle.ts +26 -0
- package/src/helpers/traverse.ts +28 -0
- package/src/helpers/traverseWithTarget.ts +41 -0
- package/src/helpers/updateTreeNode.ts +46 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/internalHooks.ts +30 -0
- package/src/hooks/useSearchableTree.ts +190 -0
- package/src/hooks/useTreeMultiSelection.ts +67 -0
- package/src/index.ts +17 -0
- package/src/types.ts +162 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useSearchableTree = useSearchableTree;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const helpers_1 = require("../helpers");
|
|
6
|
+
const internalHooks_1 = require("./internalHooks");
|
|
7
|
+
/**
|
|
8
|
+
* Хук для работы с деревом, поддерживающим поиск и асинхронную подгрузку узлов.
|
|
9
|
+
*
|
|
10
|
+
* Возможности:
|
|
11
|
+
* - хранение актуального дерева и записи элементов (`treeItemsRecord`);
|
|
12
|
+
* - управление раскрытыми узлами;
|
|
13
|
+
* - дебаунс-поиск с отменой предыдущего запроса;
|
|
14
|
+
* - дозагрузка дочерних узлов после поиска или раскрытия.
|
|
15
|
+
*
|
|
16
|
+
* @param params Параметры и обработчики для работы с деревом.
|
|
17
|
+
* @returns Ссылки на состояние дерева, контролы поиска и колбэки для `expand`/`dataLoad`.
|
|
18
|
+
*/
|
|
19
|
+
function useSearchableTree({ initTree, onPreloadNode, onPreloadNodes, onSearch, mapNodeToRecordItem, }) {
|
|
20
|
+
const tree = (0, internalHooks_1.useRefState)(initTree);
|
|
21
|
+
const treeItemsRecord = (0, internalHooks_1.useRefState)({});
|
|
22
|
+
const expandedNodes = (0, internalHooks_1.useRefState)([]);
|
|
23
|
+
const [search, setSearch] = (0, react_1.useState)('');
|
|
24
|
+
const debouncedSearch = (0, internalHooks_1.useDebounceValue)(search, 500);
|
|
25
|
+
const [loading, setLoading] = (0, react_1.useState)(false);
|
|
26
|
+
// Актуальный запрос поиска. Он же маркер «этот вызов ещё не вытеснен следующим»:
|
|
27
|
+
// после каждого await сверяемся по идентичности, а не по отдельному флагу отмены.
|
|
28
|
+
const searchAbortControllerRef = (0, react_1.useRef)(null);
|
|
29
|
+
const buildTreeItemsRecord = (0, react_1.useCallback)((nodes) => {
|
|
30
|
+
const record = {};
|
|
31
|
+
(0, helpers_1.traverse)(nodes, node => {
|
|
32
|
+
record[node.id] = mapNodeToRecordItem(node);
|
|
33
|
+
});
|
|
34
|
+
return record;
|
|
35
|
+
}, [mapNodeToRecordItem]);
|
|
36
|
+
const onExpand = (0, react_1.useCallback)((nodes) => {
|
|
37
|
+
expandedNodes.current = nodes;
|
|
38
|
+
}, [expandedNodes]);
|
|
39
|
+
const onDataLoad = (0, react_1.useCallback)(async (node) => {
|
|
40
|
+
const preloadedChildren = await onPreloadNode(node);
|
|
41
|
+
const updatedTree = (0, helpers_1.updateTreeNode)(tree.current, node.id, { nested: preloadedChildren });
|
|
42
|
+
tree.current = updatedTree;
|
|
43
|
+
const newTreeItemsRecord = { ...treeItemsRecord.current };
|
|
44
|
+
(0, helpers_1.traverse)(preloadedChildren, child => {
|
|
45
|
+
newTreeItemsRecord[child.id] = mapNodeToRecordItem(child);
|
|
46
|
+
});
|
|
47
|
+
treeItemsRecord.current = newTreeItemsRecord;
|
|
48
|
+
return { preloadedChildren, updatedTree, newTreeItemsRecord };
|
|
49
|
+
}, [mapNodeToRecordItem, onPreloadNode, tree, treeItemsRecord]);
|
|
50
|
+
const handleSearch = (0, react_1.useCallback)(async (searchQuery) => {
|
|
51
|
+
searchAbortControllerRef.current?.abort();
|
|
52
|
+
setLoading(true);
|
|
53
|
+
const abortController = new AbortController();
|
|
54
|
+
searchAbortControllerRef.current = abortController;
|
|
55
|
+
try {
|
|
56
|
+
const { tree: searchedTree, needPreloadNodes } = await onSearch({ search: searchQuery, expandedNodes: expandedNodes.current }, abortController.signal);
|
|
57
|
+
if (!abortController.signal.aborted) {
|
|
58
|
+
tree.current = searchedTree;
|
|
59
|
+
treeItemsRecord.current = buildTreeItemsRecord(searchedTree);
|
|
60
|
+
const expandedSet = new Set(expandedNodes.current);
|
|
61
|
+
const toPreloadExpandableNodes = (0, helpers_1.collectEmptyNestedNodesInExpanded)(searchedTree, expandedSet);
|
|
62
|
+
const collectedNodesForPreload = Array.from(new Set([...toPreloadExpandableNodes.map(node => node.id), ...needPreloadNodes]));
|
|
63
|
+
if (!collectedNodesForPreload.length) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const preloadedNodes = await onPreloadNodes(collectedNodesForPreload, abortController.signal);
|
|
67
|
+
if (searchAbortControllerRef.current !== abortController) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
let tmpTree = [...searchedTree];
|
|
71
|
+
for (const [nodeId, children] of Object.entries(preloadedNodes)) {
|
|
72
|
+
tmpTree = (0, helpers_1.updateTreeNode)(tmpTree, nodeId, { nested: children });
|
|
73
|
+
}
|
|
74
|
+
tree.current = tmpTree;
|
|
75
|
+
treeItemsRecord.current = buildTreeItemsRecord(tmpTree);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
// Прерванный запрос — штатный путь: следующий ввод уже вытеснил этот вызов.
|
|
80
|
+
if (!abortController.signal.aborted) {
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
if (searchAbortControllerRef.current === abortController) {
|
|
86
|
+
setLoading(false);
|
|
87
|
+
searchAbortControllerRef.current = null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}, [buildTreeItemsRecord, expandedNodes, onPreloadNodes, onSearch, tree, treeItemsRecord]);
|
|
91
|
+
(0, internalHooks_1.useDidUpdate)(() => {
|
|
92
|
+
handleSearch(debouncedSearch);
|
|
93
|
+
}, [debouncedSearch, handleSearch]);
|
|
94
|
+
(0, react_1.useEffect)(() => {
|
|
95
|
+
tree.current = initTree;
|
|
96
|
+
treeItemsRecord.current = buildTreeItemsRecord(initTree);
|
|
97
|
+
}, [buildTreeItemsRecord, initTree, tree, treeItemsRecord]);
|
|
98
|
+
(0, react_1.useEffect)(() => () => {
|
|
99
|
+
searchAbortControllerRef.current?.abort();
|
|
100
|
+
}, []);
|
|
101
|
+
return {
|
|
102
|
+
tree,
|
|
103
|
+
expandedNodes,
|
|
104
|
+
loading,
|
|
105
|
+
treeItemsRecord,
|
|
106
|
+
search: {
|
|
107
|
+
value: search,
|
|
108
|
+
onChange: setSearch,
|
|
109
|
+
},
|
|
110
|
+
onExpand,
|
|
111
|
+
onDataLoad,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { PreloadNodeHandler, SelectHandler, TreeNodeProps } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Параметры {@link useTreeMultiSelection}.
|
|
4
|
+
*
|
|
5
|
+
* @typeParam TTreeNode — тип узла дерева.
|
|
6
|
+
*/
|
|
7
|
+
type UseTreeMultiSelectionParams<TTreeNode extends TreeNodeProps> = {
|
|
8
|
+
/**
|
|
9
|
+
* Подгрузка дочерних узлов, если у узла есть `nested`, но массив пуст (ленивая загрузка перед выбором).
|
|
10
|
+
*/
|
|
11
|
+
onDataLoad: PreloadNodeHandler<TTreeNode>;
|
|
12
|
+
/** Логика мультивыбора: по клику возвращает, какие id добавить и снять. */
|
|
13
|
+
onSelect: SelectHandler;
|
|
14
|
+
/** Controlled: текущие выбранные id; без пропа — внутреннее состояние хука. */
|
|
15
|
+
selected?: string[];
|
|
16
|
+
/** Вызывается при изменении набора выбранных id (controlled-сценарий). */
|
|
17
|
+
onChangeSelected?: (newSelected: string[]) => void;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Хук мультивыбора для дерева.
|
|
21
|
+
*
|
|
22
|
+
* Выполняет пересчет выбранных id после клика по узлу, поддерживает
|
|
23
|
+
* controlled/uncontrolled режим (`selected` + `onChangeSelected`) и при необходимости
|
|
24
|
+
* подгружает детей узла перед вычислением итогового выбора.
|
|
25
|
+
*
|
|
26
|
+
* @param params Параметры управления выбором и подгрузкой данных.
|
|
27
|
+
* @returns Текущий список выбранных id и обработчик выбора узла.
|
|
28
|
+
*/
|
|
29
|
+
export declare function useTreeMultiSelection<TTreeNode extends TreeNodeProps>({ onDataLoad, onSelect: onSelectProp, selected, onChangeSelected, }: UseTreeMultiSelectionParams<TTreeNode>): {
|
|
30
|
+
selected: string[];
|
|
31
|
+
onSelect: (selectedKeys: string[], node: TreeNodeProps) => Promise<void>;
|
|
32
|
+
};
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useTreeMultiSelection = useTreeMultiSelection;
|
|
4
|
+
const utils_1 = require("@cloud-ru/ds-utils");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
/**
|
|
7
|
+
* Хук мультивыбора для дерева.
|
|
8
|
+
*
|
|
9
|
+
* Выполняет пересчет выбранных id после клика по узлу, поддерживает
|
|
10
|
+
* controlled/uncontrolled режим (`selected` + `onChangeSelected`) и при необходимости
|
|
11
|
+
* подгружает детей узла перед вычислением итогового выбора.
|
|
12
|
+
*
|
|
13
|
+
* @param params Параметры управления выбором и подгрузкой данных.
|
|
14
|
+
* @returns Текущий список выбранных id и обработчик выбора узла.
|
|
15
|
+
*/
|
|
16
|
+
function useTreeMultiSelection({ onDataLoad, onSelect: onSelectProp, selected, onChangeSelected, }) {
|
|
17
|
+
const [selectedIds = [], setSelectedIds] = (0, utils_1.useValueControl)({
|
|
18
|
+
value: selected,
|
|
19
|
+
defaultValue: [],
|
|
20
|
+
onChange: onChangeSelected,
|
|
21
|
+
});
|
|
22
|
+
const onSelect = (0, react_1.useCallback)(async (selectedKeys, node) => {
|
|
23
|
+
const isSelected = selectedKeys.includes(node.id);
|
|
24
|
+
const clonedNode = { ...node };
|
|
25
|
+
if (node.nested && !node.nested.length) {
|
|
26
|
+
const { preloadedChildren } = await onDataLoad(node);
|
|
27
|
+
clonedNode.nested = preloadedChildren;
|
|
28
|
+
}
|
|
29
|
+
const { added, removed } = onSelectProp({ selectedKeys, node: clonedNode, isSelected });
|
|
30
|
+
const updatedSelectedIds = (0, utils_1.applySelectionDiff)(selectedIds, added, removed);
|
|
31
|
+
setSelectedIds(updatedSelectedIds);
|
|
32
|
+
}, [onDataLoad, onSelectProp, selectedIds, setSelectedIds]);
|
|
33
|
+
return {
|
|
34
|
+
selected: selectedIds,
|
|
35
|
+
onSelect,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from './components';
|
|
2
|
+
export * from './constants';
|
|
3
|
+
export { checkNestedNodesSelection } from './helpers/checkNestedNodesSelection';
|
|
4
|
+
export { collectEmptyNestedNodesInExpanded } from './helpers/collectEmptyNestedNodesInExpanded';
|
|
5
|
+
export { collectIds } from './helpers/collectIds';
|
|
6
|
+
export { extractTreeNodeTitle } from './helpers/extractTreeNodeTitle';
|
|
7
|
+
export { findAllChildNodeIds } from './helpers/findAllChildNodeIds';
|
|
8
|
+
export { findAllExpandedChildNodeIds } from './helpers/findAllExpandedChildNodeIds';
|
|
9
|
+
export { getSearchedTreeItems } from './helpers/getSearchedTreeItems';
|
|
10
|
+
export { getSearchedTreeNodeById } from './helpers/getSearchedTreeNodeById';
|
|
11
|
+
export { lookupTreeForSelectedNodes } from './helpers/lookupTreeForSelectedNodes';
|
|
12
|
+
export { sortTreeItemsByTitle } from './helpers/sortTreeItemsByTitle';
|
|
13
|
+
export { traverse } from './helpers/traverse';
|
|
14
|
+
export { traverseWithTarget } from './helpers/traverseWithTarget';
|
|
15
|
+
export { updateTreeNode } from './helpers/updateTreeNode';
|
|
16
|
+
export * from './hooks';
|
|
17
|
+
export * from './types';
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.updateTreeNode = exports.traverseWithTarget = exports.traverse = exports.sortTreeItemsByTitle = exports.lookupTreeForSelectedNodes = exports.getSearchedTreeNodeById = exports.getSearchedTreeItems = exports.findAllExpandedChildNodeIds = exports.findAllChildNodeIds = exports.extractTreeNodeTitle = exports.collectIds = exports.collectEmptyNestedNodesInExpanded = exports.checkNestedNodesSelection = void 0;
|
|
18
|
+
__exportStar(require("./components"), exports);
|
|
19
|
+
__exportStar(require("./constants"), exports);
|
|
20
|
+
var checkNestedNodesSelection_1 = require("./helpers/checkNestedNodesSelection");
|
|
21
|
+
Object.defineProperty(exports, "checkNestedNodesSelection", { enumerable: true, get: function () { return checkNestedNodesSelection_1.checkNestedNodesSelection; } });
|
|
22
|
+
var collectEmptyNestedNodesInExpanded_1 = require("./helpers/collectEmptyNestedNodesInExpanded");
|
|
23
|
+
Object.defineProperty(exports, "collectEmptyNestedNodesInExpanded", { enumerable: true, get: function () { return collectEmptyNestedNodesInExpanded_1.collectEmptyNestedNodesInExpanded; } });
|
|
24
|
+
var collectIds_1 = require("./helpers/collectIds");
|
|
25
|
+
Object.defineProperty(exports, "collectIds", { enumerable: true, get: function () { return collectIds_1.collectIds; } });
|
|
26
|
+
var extractTreeNodeTitle_1 = require("./helpers/extractTreeNodeTitle");
|
|
27
|
+
Object.defineProperty(exports, "extractTreeNodeTitle", { enumerable: true, get: function () { return extractTreeNodeTitle_1.extractTreeNodeTitle; } });
|
|
28
|
+
var findAllChildNodeIds_1 = require("./helpers/findAllChildNodeIds");
|
|
29
|
+
Object.defineProperty(exports, "findAllChildNodeIds", { enumerable: true, get: function () { return findAllChildNodeIds_1.findAllChildNodeIds; } });
|
|
30
|
+
var findAllExpandedChildNodeIds_1 = require("./helpers/findAllExpandedChildNodeIds");
|
|
31
|
+
Object.defineProperty(exports, "findAllExpandedChildNodeIds", { enumerable: true, get: function () { return findAllExpandedChildNodeIds_1.findAllExpandedChildNodeIds; } });
|
|
32
|
+
var getSearchedTreeItems_1 = require("./helpers/getSearchedTreeItems");
|
|
33
|
+
Object.defineProperty(exports, "getSearchedTreeItems", { enumerable: true, get: function () { return getSearchedTreeItems_1.getSearchedTreeItems; } });
|
|
34
|
+
var getSearchedTreeNodeById_1 = require("./helpers/getSearchedTreeNodeById");
|
|
35
|
+
Object.defineProperty(exports, "getSearchedTreeNodeById", { enumerable: true, get: function () { return getSearchedTreeNodeById_1.getSearchedTreeNodeById; } });
|
|
36
|
+
var lookupTreeForSelectedNodes_1 = require("./helpers/lookupTreeForSelectedNodes");
|
|
37
|
+
Object.defineProperty(exports, "lookupTreeForSelectedNodes", { enumerable: true, get: function () { return lookupTreeForSelectedNodes_1.lookupTreeForSelectedNodes; } });
|
|
38
|
+
var sortTreeItemsByTitle_1 = require("./helpers/sortTreeItemsByTitle");
|
|
39
|
+
Object.defineProperty(exports, "sortTreeItemsByTitle", { enumerable: true, get: function () { return sortTreeItemsByTitle_1.sortTreeItemsByTitle; } });
|
|
40
|
+
var traverse_1 = require("./helpers/traverse");
|
|
41
|
+
Object.defineProperty(exports, "traverse", { enumerable: true, get: function () { return traverse_1.traverse; } });
|
|
42
|
+
var traverseWithTarget_1 = require("./helpers/traverseWithTarget");
|
|
43
|
+
Object.defineProperty(exports, "traverseWithTarget", { enumerable: true, get: function () { return traverseWithTarget_1.traverseWithTarget; } });
|
|
44
|
+
var updateTreeNode_1 = require("./helpers/updateTreeNode");
|
|
45
|
+
Object.defineProperty(exports, "updateTreeNode", { enumerable: true, get: function () { return updateTreeNode_1.updateTreeNode; } });
|
|
46
|
+
__exportStar(require("./hooks"), exports);
|
|
47
|
+
__exportStar(require("./types"), exports);
|