Merge branch 'master'
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Mon, 18 Jun 2018 11:03:22 +0000 (13:03 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Mon, 18 Jun 2018 11:03:22 +0000 (13:03 +0200)
Feature #13628

Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski@contractors.roche.com>

1  2 
src/store/project/project-reducer.test.ts
src/store/project/project-reducer.ts
src/views/workbench/workbench.tsx

index 3e828830421ed713d0d006fa7c8f0e7e788822b6,cfb73fa8b45daa4be4dbb1a0dfeee5790d5461f3..311ec9d18346f2745337ecda29fb8f97028a2463
@@@ -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', () => {
          };
  
          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<string>>): TreeItem<string> => ({
 +        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<TreeItem<string>> = [
 +            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<TreeItem<string>> = [
 +            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);
 +    });
 +
 +});
Simple merge
index cb691869b21c17ca9c406d251233ce3a1839023c,90df260b974d983842f67aa2d5ab90a7b8fd63c8..0aecc0d2b578e7045c4a6a37a892c5492cf81e65
@@@ -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<CssRules>;
  
  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}`));
          onMenuItemClick: (menuItem: NavMenuItem) => menuItem.action()
      };
  
-     toggleProjectTreeItem = (itemId: string) => {
+     toggleProjectTreeItem = (itemId: string, status: TreeItemStatus) => {
+         if (status === TreeItemStatus.Loaded) {
+             this.openProjectItem(itemId);
+         } else {
+             this.props.dispatch<any>(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<any>(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() {