// SPDX-License-Identifier: AGPL-3.0
import { connect } from "react-redux";
-import { Tree, TreeProps, TreeItem, TreeItemStatus } from "~/components/tree/tree";
-import { RootState } from "~/store/store";
-import { getNodeChildrenIds, Tree as Ttree, createTree, getNode, TreeNodeStatus } from '~/models/tree';
+import { Tree, TreeProps, TreeItem, TreeItemStatus } from "components/tree/tree";
+import { RootState } from "store/store";
+import { getNodeChildrenIds, Tree as Ttree, createTree, getNode, TreeNodeStatus } from 'models/tree';
import { Dispatch } from "redux";
import { initTreeNode } from '../../models/tree';
toggleItemSelection: Callback<T>;
}
-const flatTree = (depth: number, items?: any): [] => {
- return items ? items.reduce((prev: any, next: any) => {
- const { items } = next;
- // delete next.items;
- return [
- ...prev,
- { ...next, depth },
- ...(next.open ? flatTree(depth + 1, items) : []),
- ];
- }, []) : [];
+const flatTree = (itemsIdMap: Map<string, any>, depth: number, items?: any): [] => {
+ return items ? items
+ .map((item: any) => addToItemsIdMap(item, itemsIdMap))
+ .reduce((prev: Array<any>, next: any) => {
+ const { items } = next;
+ prev.push({ ...next, depth });
+ prev.push(...(next.open ? flatTree(itemsIdMap, depth + 1, items) : []));
+ return prev;
+ }, []) : [];
+};
+
+const addToItemsIdMap = <T>(item: TreeItem<T>, itemsIdMap: Map<string, TreeItem<T>>) => {
+ itemsIdMap[item.id] = item;
+ return item;
};
const memoizedMapStateToProps = () => {
let prevTree: Ttree<any>;
- let mappedProps: Pick<TreeProps<any>, 'items' | 'disableRipple'>;
- return <T>(state: RootState, props: TreePickerProps<T>): Pick<TreeProps<T>, 'items' | 'disableRipple'> => {
+ let mappedProps: Pick<TreeProps<any>, 'items' | 'disableRipple' | 'itemsMap'>;
+ return <T>(state: RootState, props: TreePickerProps<T>): Pick<TreeProps<T>, 'items' | 'disableRipple' | 'itemsMap'> => {
+ const itemsIdMap: Map<string, TreeItem<T>> = new Map();
const tree = state.treePicker[props.pickerId] || createTree();
if (tree !== prevTree) {
prevTree = tree;
disableRipple: true,
items: getNodeChildrenIds('')(tree)
.map(treePickerToTreeItems(tree))
+ .map(item => addToItemsIdMap(item, itemsIdMap))
.map(parentItem => ({
...parentItem,
flatTree: true,
- items: flatTree(2, parentItem.items || []),
- }))
+ items: flatTree(itemsIdMap, 2, parentItem.items || []),
+ })),
+ itemsMap: itemsIdMap,
};
}
return mappedProps;