X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/876e5e2f31a218255845977489ea70aacc0211cd..353c39122f1ebbcb47cf5ae4d2ea641b60439614:/src/store/tree-picker/tree-picker-reducer.ts diff --git a/src/store/tree-picker/tree-picker-reducer.ts b/src/store/tree-picker/tree-picker-reducer.ts index 8d61714cc9..6a87fb4c77 100644 --- a/src/store/tree-picker/tree-picker-reducer.ts +++ b/src/store/tree-picker/tree-picker-reducer.ts @@ -2,28 +2,31 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { createTree, setNodeValueWith, TreeNode, setNode, mapTreeValues } from "~/models/tree"; +import { createTree, setNodeValueWith, TreeNode, setNode, mapTreeValues, Tree } from "~/models/tree"; import { TreePicker, TreePickerNode } from "./tree-picker"; import { treePickerActions, TreePickerAction } from "./tree-picker-actions"; import { TreeItemStatus } from "~/components/tree/tree"; +import { compose } from "redux"; -export const treePickerReducer = (state: TreePicker = createTree(), action: TreePickerAction) => +export const treePickerReducer = (state: TreePicker = {}, action: TreePickerAction) => treePickerActions.match(action, { - LOAD_TREE_PICKER_NODE: ({ id }) => - setNodeValueWith(setPending)(id)(state), - LOAD_TREE_PICKER_NODE_SUCCESS: ({ id, nodes }) => { - const [newState] = [state] - .map(receiveNodes(nodes)(id)) - .map(setNodeValueWith(setLoaded)(id)); - return newState; - }, - TOGGLE_TREE_PICKER_NODE_COLLAPSE: ({ id }) => - setNodeValueWith(toggleCollapse)(id)(state), - TOGGLE_TREE_PICKER_NODE_SELECT: ({ id }) => - mapTreeValues(toggleSelect(id))(state), + LOAD_TREE_PICKER_NODE: ({ nodeId, pickerId }) => + updateOrCreatePicker(state, pickerId, setNodeValueWith(setPending)(nodeId)), + LOAD_TREE_PICKER_NODE_SUCCESS: ({ nodeId, nodes, pickerId }) => + updateOrCreatePicker(state, pickerId, compose(receiveNodes(nodes)(nodeId),setNodeValueWith(setLoaded)(nodeId))), + TOGGLE_TREE_PICKER_NODE_COLLAPSE: ({ nodeId, pickerId }) => + updateOrCreatePicker(state, pickerId, setNodeValueWith(toggleCollapse)(nodeId)), + TOGGLE_TREE_PICKER_NODE_SELECT: ({ nodeId, pickerId }) => + updateOrCreatePicker(state, pickerId, mapTreeValues(toggleSelect(nodeId))), default: () => state }); +const updateOrCreatePicker = (state: TreePicker, pickerId: string, func: (value: Tree) => Tree) => { + const picker = state[pickerId] || createTree(); + const updatedPicker = func(picker); + return { ...state, [pickerId]: updatedPicker }; +}; + const setPending = (value: TreePickerNode): TreePickerNode => ({ ...value, status: TreeItemStatus.PENDING }); @@ -33,12 +36,12 @@ const setLoaded = (value: TreePickerNode): TreePickerNode => const toggleCollapse = (value: TreePickerNode): TreePickerNode => ({ ...value, collapsed: !value.collapsed }); -const toggleSelect = (id: string) => (value: TreePickerNode): TreePickerNode => - value.id === id +const toggleSelect = (nodeId: string) => (value: TreePickerNode): TreePickerNode => + value.nodeId === nodeId ? ({ ...value, selected: !value.selected }) : ({ ...value, selected: false }); -const receiveNodes = (nodes: Array) => (parent: string) => (state: TreePicker) => +const receiveNodes = (nodes: Array) => (parent: string) => (state: Tree) => nodes.reduce((tree, node) => setNode( createTreeNode(parent)(node) @@ -46,7 +49,7 @@ const receiveNodes = (nodes: Array) => (parent: string) => (stat const createTreeNode = (parent: string) => (node: TreePickerNode): TreeNode => ({ children: [], - id: node.id, + id: node.nodeId, parent, value: node });