X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/c859c9d9325e2ed86d5d7b067e1209e73ee81251..a23cfd6defb8dab9ac9afe13034f7b667f07acca:/src/views-components/tree-picker/tree-picker.ts diff --git a/src/views-components/tree-picker/tree-picker.ts b/src/views-components/tree-picker/tree-picker.ts index 9bb52dee87..712875b580 100644 --- a/src/views-components/tree-picker/tree-picker.ts +++ b/src/views-components/tree-picker/tree-picker.ts @@ -3,11 +3,12 @@ // 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'; +import { ResourcesState } from "store/resources/resources"; type Callback = (event: React.MouseEvent, item: TreeItem, pickerId: string) => void; export interface TreePickerProps { @@ -18,49 +19,40 @@ export interface TreePickerProps { toggleItemSelection: Callback; } -const flatTree = (depth: number, items?: any): [] => { +const flatTree = (itemsIdMap: Map, depth: number, items?: any): [] => { return items ? items - .map(addToItemsIdMap) - .reduce((prev: any, next: any) => { + .map((item: any) => addToItemsIdMap(item, itemsIdMap)) + .reduce((prev: Array, next: any) => { const { items } = next; - - return [ - ...prev, - { ...next, depth }, - ...(next.open ? flatTree(depth + 1, items) : []), - ]; + prev.push({ ...next, depth }); + prev.push(...(next.open ? flatTree(itemsIdMap, depth + 1, items) : [])); + return prev; }, []) : []; }; -const itemsIdMap = new Map(); -const addToItemsIdMap = (item: TreeItem) => { +const addToItemsIdMap = (item: TreeItem, itemsIdMap: Map>) => { itemsIdMap[item.id] = item; return item; }; -const memoizedMapStateToProps = () => { - let prevTree: Ttree; - let mappedProps: Pick, 'items' | 'disableRipple' | 'itemsMap'>; - return (state: RootState, props: TreePickerProps): Pick, 'items' | 'disableRipple' | 'itemsMap'> => { +const mapStateToProps = + (state: RootState, props: TreePickerProps): Pick, 'items' | 'disableRipple' | 'itemsMap'> => { + const itemsIdMap: Map> = new Map(); const tree = state.treePicker[props.pickerId] || createTree(); - if (tree !== prevTree) { - prevTree = tree; - mappedProps = { - disableRipple: true, - items: getNodeChildrenIds('')(tree) - .map(treePickerToTreeItems(tree)) - .map(addToItemsIdMap) - .map(parentItem => ({ - ...parentItem, - flatTree: true, - items: flatTree(2, parentItem.items || []), - })), - itemsMap: itemsIdMap, - }; - } - return mappedProps; + + return { + disableRipple: true, + items: getNodeChildrenIds('')(tree) + .map(treePickerToTreeItems(tree, state.resources)) + .map(item => addToItemsIdMap(item, itemsIdMap)) + .map(parentItem => ({ + ...parentItem, + flatTree: true, + items: flatTree(itemsIdMap, 2, parentItem.items || []), + })), + itemsMap: itemsIdMap, + }; }; -}; const mapDispatchToProps = (_: Dispatch, props: TreePickerProps): Pick, 'onContextMenu' | 'toggleItemOpen' | 'toggleItemActive' | 'toggleItemSelection'> => ({ onContextMenu: (event, item) => props.onContextMenu(event, item, props.pickerId), @@ -69,16 +61,16 @@ const mapDispatchToProps = (_: Dispatch, props: TreePickerProps): Pick props.toggleItemSelection(event, item, props.pickerId), }); -export const TreePicker = connect(memoizedMapStateToProps(), mapDispatchToProps)(Tree); +export const TreePicker = connect(mapStateToProps, mapDispatchToProps)(Tree); -const treePickerToTreeItems = (tree: Ttree) => +const treePickerToTreeItems = (tree: Ttree, resources: ResourcesState) => (id: string): TreeItem => { const node = getNode(id)(tree) || initTreeNode({ id: '', value: 'InvalidNode' }); const items = getNodeChildrenIds(node.id)(tree) - .map(treePickerToTreeItems(tree)); + .map(treePickerToTreeItems(tree, resources)); return { active: node.active, - data: node.value, + data: resources[node.id] || node.value, id: node.id, items: items.length > 0 ? items : undefined, open: node.expanded,