Arrows tree component
[arvados-workbench2.git] / src / store / project-reducer.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { getType } from "typesafe-actions";
6 import { Project } from "../models/project";
7 import { actions, ProjectAction } from "./project-action";
8 import { TreeItem } from "../components/tree/tree";
9 import * as _ from 'lodash';
10
11 type ProjectState = Array<TreeItem<Project>>;
12
13 function findTreeItem<T>(tree: Array<TreeItem<T>>, itemId: string): TreeItem<T> | undefined {
14     let item;
15     for (const t of tree) {
16         item = t.id === itemId
17             ? t
18             : findTreeItem(t.items ? t.items : [], itemId);
19         if (item) {
20             break;
21         }
22     }
23     return item;
24 }
25
26 function resetTreeActivity<T>(tree: Array<TreeItem<T>>): boolean | undefined {
27     let item;
28     for (const leaf of tree) {
29         item = leaf.active === true
30             ? leaf.active = false
31             : resetTreeActivity(leaf.items ? leaf.items : []);
32     }
33     return item;
34 }
35
36 const projectsReducer = (state: ProjectState = [], action: ProjectAction) => {
37     switch (action.type) {
38         case getType(actions.createProject): {
39             return [...state, action.payload];
40         }
41         case getType(actions.toggleProjectTreeItem): {
42             const tree = _.cloneDeep(state);
43             const itemId = action.payload;
44             resetTreeActivity(tree);
45             const item = findTreeItem(tree, itemId);
46             if (item) {
47                 item.open = !item.open;
48                 item.active = true;
49             }
50             return tree;
51         }
52         default:
53             return state;
54     }
55 };
56
57 export default projectsReducer;