X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/eeb82d50816250cc6287928e6d958affa73880ee..01b9aef245d1e419bd77999c12b65742e1363bc9:/src/store/project/project-reducer.ts diff --git a/src/store/project/project-reducer.ts b/src/store/project/project-reducer.ts index 458177c043..4f7545fc97 100644 --- a/src/store/project/project-reducer.ts +++ b/src/store/project/project-reducer.ts @@ -4,12 +4,12 @@ import { Project } from "../../models/project"; import actions, { ProjectAction } from "./project-action"; -import { TreeItem } from "../../components/tree/tree"; +import { TreeItem, TreeItemStatus } from "../../components/tree/tree"; import * as _ from "lodash"; export type ProjectState = Array>; -function findTreeItem(tree: Array>, itemId: string): TreeItem | undefined { +export function findTreeItem(tree: Array>, itemId: string): TreeItem | undefined { let item; for (const t of tree) { item = t.id === itemId @@ -22,23 +22,66 @@ function findTreeItem(tree: Array>, itemId: string): TreeItem 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 : []); +export function getTreePath(tree: Array>, itemId: string): Array> { + for(const item of tree){ + if(item.id === itemId){ + return [item]; + } else { + const branch = getTreePath(item.items || [], itemId); + if(branch.length > 0){ + return [item, ...branch]; + } + } } - return item; + return []; +} + +function resetTreeActivity(tree: Array>) { + for (const t of tree) { + t.active = false; + resetTreeActivity(t.items ? t.items : []); + } +} + +function updateProjectTree(tree: Array>, projects: Project[], parentItemId?: string): Array> { + let treeItem; + if (parentItemId) { + treeItem = findTreeItem(tree, parentItemId); + if (treeItem) { + treeItem.status = TreeItemStatus.Loaded; + } + } + const items = projects.map((p, idx) => ({ + id: p.uuid, + open: false, + active: false, + status: TreeItemStatus.Initial, + data: p, + items: [] + } as TreeItem)); + + if (treeItem) { + treeItem.items = items; + return tree; + } + + return items; } const projectsReducer = (state: ProjectState = [], action: ProjectAction) => { return actions.match(action, { CREATE_PROJECT: project => [...state, project], REMOVE_PROJECT: () => state, - PROJECTS_REQUEST: () => state, - PROJECTS_SUCCESS: projects => { - return projects; + PROJECTS_REQUEST: itemId => { + const tree = _.cloneDeep(state); + const item = findTreeItem(tree, itemId); + if (item) { + item.status = TreeItemStatus.Pending; + } + return tree; + }, + PROJECTS_SUCCESS: ({ projects, parentItemId }) => { + return updateProjectTree(state, projects, parentItemId); }, TOGGLE_PROJECT_TREE_ITEM: itemId => { const tree = _.cloneDeep(state); @@ -47,6 +90,7 @@ const projectsReducer = (state: ProjectState = [], action: ProjectAction) => { if (item) { item.open = !item.open; item.active = true; + item.toggled = true; } return tree; },