1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { createTree, setNodeValueWith, TreeNode, setNode, mapTreeValues } from "~/models/tree";
6 import { TreePicker, TreePickerNode } from "./tree-picker";
7 import { treePickerActions, TreePickerAction } from "./tree-picker-actions";
8 import { TreeItemStatus } from "~/components/tree/tree";
10 export const treePickerReducer = (state: TreePicker = createTree(), action: TreePickerAction) =>
11 treePickerActions.match(action, {
12 LOAD_TREE_PICKER_NODE: ({ id }) =>
13 setNodeValueWith(setPending)(id)(state),
14 LOAD_TREE_PICKER_NODE_SUCCESS: ({ id, nodes }) => {
15 const [newState] = [state]
16 .map(receiveNodes(nodes)(id))
17 .map(setNodeValueWith(setLoaded)(id));
20 TOGGLE_TREE_PICKER_NODE_COLLAPSE: ({ id }) =>
21 setNodeValueWith(toggleCollapse)(id)(state),
22 TOGGLE_TREE_PICKER_NODE_SELECT: ({ id }) =>
23 mapTreeValues(toggleSelect(id))(state),
27 const setPending = (value: TreePickerNode): TreePickerNode =>
28 ({ ...value, status: TreeItemStatus.PENDING });
30 const setLoaded = (value: TreePickerNode): TreePickerNode =>
31 ({ ...value, status: TreeItemStatus.LOADED });
33 const toggleCollapse = (value: TreePickerNode): TreePickerNode =>
34 ({ ...value, collapsed: !value.collapsed });
36 const toggleSelect = (id: string) => (value: TreePickerNode): TreePickerNode =>
38 ? ({ ...value, selected: !value.selected })
39 : ({ ...value, selected: false });
41 const receiveNodes = (nodes: Array<TreePickerNode>) => (parent: string) => (state: TreePicker) =>
42 nodes.reduce((tree, node) =>
44 createTreeNode(parent)(node)
47 const createTreeNode = (parent: string) => (node: TreePickerNode): TreeNode<TreePickerNode> => ({