X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/4b259f71b418af769c0edad5d36ad519c9a22864..838af71bfe460c7f5a03121acf8a4d239893cdac:/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 3e0fc6ed94..b90f2e4206 100644 --- a/src/views-components/tree-picker/tree-picker.ts +++ b/src/views-components/tree-picker/tree-picker.ts @@ -3,42 +3,43 @@ // SPDX-License-Identifier: AGPL-3.0 import { connect } from "react-redux"; -import { Tree, TreeProps, TreeItem } from "../../components/tree/tree"; -import { RootState } from "../../store/store"; -import { TreePicker as TTreePicker, TreePickerNode, createTreePickerNode } from "../../store/tree-picker/tree-picker"; -import { getNodeValue, getNodeChildren } from "../../models/tree"; +import { Tree, TreeProps, TreeItem, TreeItemStatus } from "~/components/tree/tree"; +import { RootState } from "~/store/store"; +import { createTreePickerNode, TreePickerNode } from "~/store/tree-picker/tree-picker"; +import { getNodeValue, getNodeChildrenIds, Tree as Ttree, createTree } from "~/models/tree"; +import { Dispatch } from "redux"; -const memoizedMapStateToProps = () => { - let prevState: TTreePicker; - let prevTree: Array>; +export interface TreePickerProps { + pickerId: string; + toggleItemOpen: (nodeId: string, status: TreeItemStatus, pickerId: string) => void; + toggleItemActive: (nodeId: string, status: TreeItemStatus, pickerId: string) => void; +} - return (state: RootState): Pick, 'items'> => { - if (prevState !== state.treePicker) { - prevState = state.treePicker; - prevTree = getNodeChildren('')(state.treePicker) - .map(treePickerToTreeItems(state.treePicker)); - } - return { - items: prevTree - }; +const mapStateToProps = (state: RootState, props: TreePickerProps): Pick, 'items'> => { + const tree = state.treePicker[props.pickerId] || createTree(); + return { + items: getNodeChildrenIds('')(tree) + .map(treePickerToTreeItems(tree)) }; }; -const mapDispatchToProps = (): Pick, 'onContextMenu'> => ({ +const mapDispatchToProps = (dispatch: Dispatch, props: TreePickerProps): Pick, 'onContextMenu' | 'toggleItemOpen' | 'toggleItemActive'> => ({ onContextMenu: () => { return; }, + toggleItemActive: (id, status) => props.toggleItemActive(id, status, props.pickerId), + toggleItemOpen: (id, status) => props.toggleItemOpen(id, status, props.pickerId) }); -export const TreePicker = connect(memoizedMapStateToProps(), mapDispatchToProps)(Tree); +export const TreePicker = connect(mapStateToProps, mapDispatchToProps)(Tree); -const treePickerToTreeItems = (tree: TTreePicker) => +const treePickerToTreeItems = (tree: Ttree) => (id: string): TreeItem => { - const node: TreePickerNode = getNodeValue(id)(tree) || createTreePickerNode({ id: '', value: 'InvalidNode' }); - const items = getNodeChildren(node.id)(tree) + const node: TreePickerNode = getNodeValue(id)(tree) || createTreePickerNode({ nodeId: '', value: 'InvalidNode' }); + const items = getNodeChildrenIds(node.nodeId)(tree) .map(treePickerToTreeItems(tree)); return { active: node.selected, data: node.value, - id: node.id, + id: node.nodeId, items: items.length > 0 ? items : undefined, open: !node.collapsed, status: node.status