From: Michal Klobukowski Date: Mon, 18 Jun 2018 11:03:22 +0000 (+0200) Subject: Merge branch 'master' X-Git-Tag: 1.2.0~74^2~1 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/4bbaf2a0cede89ea50d63d210c6631adc1970620 Merge branch 'master' Feature #13628 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- 4bbaf2a0cede89ea50d63d210c6631adc1970620 diff --cc src/store/project/project-reducer.test.ts index 3e828830,cfb73fa8..311ec9d1 --- a/src/store/project/project-reducer.test.ts +++ b/src/store/project/project-reducer.test.ts @@@ -2,9 -2,8 +2,9 @@@ // // SPDX-License-Identifier: AGPL-3.0 -import projectsReducer from "./project-reducer"; +import projectsReducer, { findTreeBranch } from "./project-reducer"; import actions from "./project-action"; - import { TreeItem } from "../../components/tree/tree"; ++import { TreeItem, TreeItemStatus } from "../../components/tree/tree"; describe('project-reducer', () => { it('should add new project to the list', () => { @@@ -34,69 -35,22 +36,72 @@@ }; const projects = [project, project]; - const state = projectsReducer(initialState, actions.PROJECTS_SUCCESS({projects, parentItemId: undefined})); + const state = projectsReducer(initialState, actions.PROJECTS_SUCCESS({ projects, parentItemId: undefined })); expect(state).toEqual([{ - active: false, - open: false, - id: "test123", - items: [], - data: project - }, { - active: false, - open: false, - id: "test123", - items: [], - data: project - } + active: false, + open: false, + id: "test123", + items: [], + data: project, + status: 0 + }, { + active: false, + open: false, + id: "test123", + items: [], + data: project, + status: 0 + } ]); }); }); + +describe("findTreeBranch", () => { + + const createTreeItem = (id: string, items?: Array>): TreeItem => ({ + id, + items, + active: false, + data: "", + open: false, ++ status: TreeItemStatus.Initial + }); + + it("should return an array that matches path to the given item", () => { + const tree: Array> = [ + createTreeItem("1", [ + createTreeItem("1.1", [ + createTreeItem("1.1.1"), + createTreeItem("1.1.2") + ]) + ]), + createTreeItem("2", [ + createTreeItem("2.1", [ + createTreeItem("2.1.1"), + createTreeItem("2.1.2") + ]) + ]) + ]; + const branch = findTreeBranch(tree, "2.1.1"); + expect(branch.map(item => item.id)).toEqual(["2", "2.1", "2.1.1"]); + }); + + it("should return empty array if item is not found", () => { + const tree: Array> = [ + createTreeItem("1", [ + createTreeItem("1.1", [ + createTreeItem("1.1.1"), + createTreeItem("1.1.2") + ]) + ]), + createTreeItem("2", [ + createTreeItem("2.1", [ + createTreeItem("2.1.1"), + createTreeItem("2.1.2") + ]) + ]) + ]; + expect(findTreeBranch(tree, "3")).toHaveLength(0); + }); + +}); diff --cc src/views/workbench/workbench.tsx index cb691869,90df260b..0aecc0d2 --- a/src/views/workbench/workbench.tsx +++ b/src/views/workbench/workbench.tsx @@@ -27,10 -16,10 +16,11 @@@ import { Breadcrumb } from '../../compo import { push } from 'react-router-redux'; import projectActions from "../../store/project/project-action"; import ProjectTree from '../../components/project-tree/project-tree'; - import { TreeItem } from "../../components/tree/tree"; + import { TreeItem, TreeItemStatus } from "../../components/tree/tree"; import { Project } from "../../models/project"; import { projectService } from '../../services/services'; +import { findTreeBranch } from '../../store/project/project-reducer'; + import DataExplorer from '../data-explorer/data-explorer'; const drawerWidth = 240; @@@ -77,7 -66,7 +67,8 @@@ interface WorkbenchActionProps type WorkbenchProps = WorkbenchDataProps & WorkbenchActionProps & DispatchProp & WithStyles; interface NavBreadcrumb extends Breadcrumb { - path: string; + itemId: string; ++ status: TreeItemStatus; } interface NavMenuItem extends MainAppBarMenuItem { @@@ -128,9 -125,7 +119,9 @@@ class Workbench extends React.Component mainAppBarActions: MainAppBarActionProps = { - onBreadcrumbClick: ({ itemId }: NavBreadcrumb) => { - this.toggleProjectTreeItem(itemId); - onBreadcrumbClick: (breadcrumb: NavBreadcrumb) => this.props.dispatch(push(breadcrumb.path)), ++ onBreadcrumbClick: ({ itemId, status }: NavBreadcrumb) => { ++ this.toggleProjectTreeItem(itemId, status); + }, onSearch: searchText => { this.setState({ searchText }); this.props.dispatch(push(`/search?q=${searchText}`)); @@@ -138,17 -133,17 +129,25 @@@ onMenuItemClick: (menuItem: NavMenuItem) => menuItem.action() }; - toggleProjectTreeItem = (itemId: string) => { + toggleProjectTreeItem = (itemId: string, status: TreeItemStatus) => { + if (status === TreeItemStatus.Loaded) { + this.openProjectItem(itemId); + } else { + this.props.dispatch(projectService.getProjectList(itemId)).then(() => this.openProjectItem(itemId)); + } + } + + openProjectItem = (itemId: string) => { + const branch = findTreeBranch(this.props.projects, itemId); + this.setState({ + breadcrumbs: branch.map(item => ({ + label: item.data.name, - itemId: item.data.uuid ++ itemId: item.data.uuid, ++ status: item.status + })) + }); - this.props.dispatch(projectService.getProjectList(itemId)).then(() => { - this.props.dispatch(projectActions.TOGGLE_PROJECT_TREE_ITEM(itemId)); - }); + this.props.dispatch(projectActions.TOGGLE_PROJECT_TREE_ITEM(itemId)); + this.props.dispatch(push(`/project/${itemId}`)); } render() {