X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/b863f7aaab7112a32c7f9b1e7a0299c4266df2f5..eeb82d50816250cc6287928e6d958affa73880ee:/src/store/project/project-reducer.ts diff --git a/src/store/project/project-reducer.ts b/src/store/project/project-reducer.ts index 477cb1e468..458177c043 100644 --- a/src/store/project/project-reducer.ts +++ b/src/store/project/project-reducer.ts @@ -4,8 +4,33 @@ import { Project } from "../../models/project"; import actions, { ProjectAction } from "./project-action"; +import { TreeItem } from "../../components/tree/tree"; +import * as _ from "lodash"; -export type ProjectState = Project[]; +export type ProjectState = Array>; + +function findTreeItem(tree: Array>, itemId: string): TreeItem | undefined { + let item; + for (const t of tree) { + item = t.id === itemId + ? t + : findTreeItem(t.items ? t.items : [], itemId); + if (item) { + break; + } + } + return item; +} + +function resetTreeActivity(tree: Array>): boolean | undefined { + let item; + for (const leaf of tree) { + item = leaf.active === true + ? leaf.active = false + : resetTreeActivity(leaf.items ? leaf.items : []); + } + return item; +} const projectsReducer = (state: ProjectState = [], action: ProjectAction) => { return actions.match(action, { @@ -15,6 +40,16 @@ const projectsReducer = (state: ProjectState = [], action: ProjectAction) => { PROJECTS_SUCCESS: projects => { return projects; }, + TOGGLE_PROJECT_TREE_ITEM: itemId => { + const tree = _.cloneDeep(state); + resetTreeActivity(tree); + const item = findTreeItem(tree, itemId); + if (item) { + item.open = !item.open; + item.active = true; + } + return tree; + }, default: () => state }); };