X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/2d37867eccb0a76df1a285e7b7e32bbb13db99a1..10ce16c28de952f6533ca3cc9df909269e3d2a53:/src/store/project/project-reducer.ts diff --git a/src/store/project/project-reducer.ts b/src/store/project/project-reducer.ts index efef8099..94a451a8 100644 --- a/src/store/project/project-reducer.ts +++ b/src/store/project/project-reducer.ts @@ -4,15 +4,23 @@ import * as _ from "lodash"; -import { Project } from "../../models/project"; -import actions, { ProjectAction } from "./project-action"; +import { projectActions, ProjectAction } from "./project-action"; import { TreeItem, TreeItemStatus } from "../../components/tree/tree"; +import { ProjectResource } from "../../models/project"; export type ProjectState = { - items: Array>, - currentItemId: string + items: Array>, + currentItemId: string, + creator: ProjectCreator }; +interface ProjectCreator { + opened: boolean; + pending: boolean; + ownerUuid: string; + error?: string; +} + export function findTreeItem(tree: Array>, itemId: string): TreeItem | undefined { let item; for (const t of tree) { @@ -40,12 +48,12 @@ export function getActiveTreeItem(tree: Array>): TreeItem | un } export function getTreePath(tree: Array>, itemId: string): Array> { - for (const item of tree){ - if(item.id === itemId){ + for (const item of tree) { + if (item.id === itemId) { return [item]; } else { const branch = getTreePath(item.items || [], itemId); - if(branch.length > 0){ + if (branch.length > 0) { return [item, ...branch]; } } @@ -60,7 +68,7 @@ function resetTreeActivity(tree: Array>) { } } -function updateProjectTree(tree: Array>, projects: Project[], parentItemId?: string): Array> { +function updateProjectTree(tree: Array>, projects: ProjectResource[], parentItemId?: string): Array> { let treeItem; if (parentItemId) { treeItem = findTreeItem(tree, parentItemId); @@ -75,7 +83,7 @@ function updateProjectTree(tree: Array>, projects: Project[], status: TreeItemStatus.Initial, data: p, items: [] - } as TreeItem)); + } as TreeItem)); if (treeItem) { treeItem.items = items; @@ -85,20 +93,31 @@ function updateProjectTree(tree: Array>, projects: Project[], return items; } -const projectsReducer = (state: ProjectState = { items: [], currentItemId: "" }, action: ProjectAction) => { - return actions.match(action, { - CREATE_PROJECT: project => ({ - ...state, - items: state.items.concat({ - id: project.uuid, - open: false, - active: false, - status: TreeItemStatus.Loaded, - toggled: false, - items: [], - data: project - }) - }), +const updateCreator = (state: ProjectState, creator: Partial) => ({ + ...state, + creator: { + ...state.creator, + ...creator + } +}); + +const initialState: ProjectState = { + items: [], + currentItemId: "", + creator: { + opened: false, + pending: false, + ownerUuid: "" + } +}; + + +export const projectsReducer = (state: ProjectState = initialState, action: ProjectAction) => { + return projectActions.match(action, { + OPEN_PROJECT_CREATOR: ({ ownerUuid }) => updateCreator(state, { ownerUuid, opened: true, pending: false }), + CLOSE_PROJECT_CREATOR: () => updateCreator(state, { opened: false }), + CREATE_PROJECT: () => updateCreator(state, { error: undefined }), + CREATE_PROJECT_SUCCESS: () => updateCreator(state, { opened: false, ownerUuid: "" }), REMOVE_PROJECT: () => state, PROJECTS_REQUEST: itemId => { const items = _.cloneDeep(state.items); @@ -107,12 +126,13 @@ const projectsReducer = (state: ProjectState = { items: [], currentItemId: "" }, item.status = TreeItemStatus.Pending; state.items = items; } - return state; + return { ...state, items }; }, PROJECTS_SUCCESS: ({ projects, parentItemId }) => { + const items = _.cloneDeep(state.items); return { ...state, - items: updateProjectTree(state.items, projects, parentItemId) + items: updateProjectTree(items, projects, parentItemId) }; }, TOGGLE_PROJECT_TREE_ITEM_OPEN: itemId => { @@ -123,6 +143,7 @@ const projectsReducer = (state: ProjectState = { items: [], currentItemId: "" }, item.open = !item.open; } return { + ...state, items, currentItemId: itemId }; @@ -136,6 +157,7 @@ const projectsReducer = (state: ProjectState = { items: [], currentItemId: "" }, item.active = true; } return { + ...state, items, currentItemId: itemId }; @@ -144,6 +166,7 @@ const projectsReducer = (state: ProjectState = { items: [], currentItemId: "" }, const items = _.cloneDeep(state.items); resetTreeActivity(items); return { + ...state, items, currentItemId: "" }; @@ -151,5 +174,3 @@ const projectsReducer = (state: ProjectState = { items: [], currentItemId: "" }, default: () => state }); }; - -export default projectsReducer;