1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
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';
11 type ProjectState = Array<TreeItem<Project>>;
13 function findTreeItem<T>(tree: Array<TreeItem<T>>, itemId: string): TreeItem<T> | undefined {
15 for (const t of tree) {
16 item = t.id === itemId
18 : findTreeItem(t.items ? t.items : [], itemId);
26 function resetTreeActivity<T>(tree: Array<TreeItem<T>>): boolean | undefined {
28 for (const leaf of tree) {
29 item = leaf.active === true
31 : resetTreeActivity(leaf.items ? leaf.items : []);
36 const projectsReducer = (state: ProjectState = [], action: ProjectAction) => {
37 switch (action.type) {
38 case getType(actions.createProject): {
39 return [...state, action.payload];
41 case getType(actions.toggleProjectTreeItem): {
42 const tree = _.cloneDeep(state);
43 const itemId = action.payload;
44 resetTreeActivity(tree);
45 const item = findTreeItem(tree, itemId);
47 item.open = !item.open;
57 export default projectsReducer;