1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { createTree, TreeNode, setNode, Tree, TreeNodeStatus, setNodeStatus, expandNode } from '~/models/tree';
6 import { TreePicker } from "./tree-picker";
7 import { treePickerActions, TreePickerAction } from "./tree-picker-actions";
8 import { compose } from "redux";
9 import { getNode, toggleNodeCollapse, toggleNodeSelection } from '~/models/tree';
10 import { activateNode } from '../../models/tree';
12 export const treePickerReducer = (state: TreePicker = {}, action: TreePickerAction) =>
13 treePickerActions.match(action, {
14 LOAD_TREE_PICKER_NODE: ({ id, pickerId }) =>
15 updateOrCreatePicker(state, pickerId, setNodeStatus(id)(TreeNodeStatus.PENDING)),
16 LOAD_TREE_PICKER_NODE_SUCCESS: ({ id, nodes, pickerId }) =>
17 updateOrCreatePicker(state, pickerId, compose(receiveNodes(nodes)(id), setNodeStatus(id)(TreeNodeStatus.LOADED))),
18 TOGGLE_TREE_PICKER_NODE_COLLAPSE: ({ id, pickerId }) =>
19 updateOrCreatePicker(state, pickerId, toggleNodeCollapse(id)),
20 ACTIVATE_TREE_PICKER_NODE: ({ id, pickerId }) =>
21 updateOrCreatePicker(state, pickerId, activateNode(id)),
22 TOGGLE_TREE_PICKER_NODE_SELECTION: ({ id, pickerId }) =>
23 updateOrCreatePicker(state, pickerId, toggleNodeSelection(id)),
24 RESET_TREE_PICKER: ({ pickerId }) =>
25 updateOrCreatePicker(state, pickerId, createTree),
26 EXPAND_TREE_PICKER_NODES: ({ pickerId, ids }) =>
27 updateOrCreatePicker(state, pickerId, expandNode(...ids)),
31 const updateOrCreatePicker = <V>(state: TreePicker, pickerId: string, func: (value: Tree<V>) => Tree<V>) => {
32 const picker = state[pickerId] || createTree();
33 const updatedPicker = func(picker);
34 return { ...state, [pickerId]: updatedPicker };
37 const receiveNodes = <V>(nodes: Array<TreeNode<V>>) => (parent: string) => (state: Tree<V>) => {
38 const parentNode = getNode(parent)(state);
41 newState = setNode({ ...parentNode, children: [] })(state);
43 return nodes.reduce((tree, node) => {
44 return setNode({ ...node, parent })(tree);