Added dynamic sub projects loading
authorDaniel Kos <daniel.kos@contractors.roche.com>
Tue, 12 Jun 2018 21:20:12 +0000 (23:20 +0200)
committerDaniel Kos <daniel.kos@contractors.roche.com>
Tue, 12 Jun 2018 21:20:12 +0000 (23:20 +0200)
Feature #13610

Arvados-DCO-1.1-Signed-off-by: Daniel Kos <daniel.kos@contractors.roche.com>

src/common/api/filter-builder.ts
src/components/tree/tree.tsx
src/services/project-service/project-service.ts
src/views/workbench/workbench.tsx

index c4c29b40e5a3538d73a5856f7a8064a9c9093378..3f8e323c40f212f387fe7fcece7b78d0e6cc5e87 100644 (file)
@@ -3,7 +3,8 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 export enum FilterField {
-    UUID = "uuid"
+    UUID = "uuid",
+    OWNER_UUID = "owner_uuid"
 }
 
 export default class FilterBuilder {
index 3a6447341024f53115559a9cbab9a9f11fb8c619..d8397d6673a7a9f2c30a95ee7e7f1c090f1a24d1 100644 (file)
@@ -44,8 +44,8 @@ interface TreeProps<T> {
 }
 
 class Tree<T> extends React.Component<TreeProps<T> & WithStyles<CssRules>, {}> {
-    renderArrow (items: Array<TreeItem<T>> | undefined, arrowClass: string, isOpen: boolean){
-        return items && items.length > 0 ? <i className={`${arrowClass} ${isOpen ? "fas fa-caret-down" : `fas fa-caret-down ${this.props.classes.arrowRotate}`}`} /> : ''
+    renderArrow (items: boolean, arrowClass: string, open: boolean){
+        return <i className={`${arrowClass} ${open ? "fas fa-caret-down" : `fas fa-caret-down ${this.props.classes.arrowRotate}`}`} />
     }
     render(): ReactElement<any> {
         const level = this.props.level ? this.props.level : 0;
@@ -55,7 +55,7 @@ class Tree<T> extends React.Component<TreeProps<T> & WithStyles<CssRules>, {}> {
             {items && items.map((it: TreeItem<T>, idx: number) =>
              <div key={`item/${level}/${idx}`}>
                 <ListItem button onClick={() => toggleItem(it.id)} className={list} style={{paddingLeft: (level + 1) * 20}}>
-                    {this.renderArrow(it.items, it.active ? activeArrow : arrow, it.open)}
+                    {this.renderArrow(true, it.active ? activeArrow : arrow, it.open)}
                     {render(it, level)}
                 </ListItem>
                 {it.items && it.items.length > 0 &&
index 2b1bcffc2bd756db574e5ce66992c2566768003a..9350dabdc4894f7ef4ebecb3105da204a0a98f14 100644 (file)
@@ -33,15 +33,15 @@ interface GroupsResponse {
 }
 
 export default class ProjectService {
-    public getProjectList = (parentUuid?: string) => (dispatch: Dispatch) => {
+    public getProjectList = (parentUuid?: string) => (dispatch: Dispatch): Promise<Project[]> => {
         dispatch(actions.PROJECTS_REQUEST());
 
         const ub = new UrlBuilder('/groups');
         const fb = new FilterBuilder();
-        fb.addEqual(FilterField.UUID, parentUuid);
-        const url = ub.addParam('filter', fb.get()).get();
+        fb.addEqual(FilterField.OWNER_UUID, parentUuid);
+        const url = ub.addParam('filters', fb.get()).get();
 
-        serverApi.get<GroupsResponse>(url).then(groups => {
+        return serverApi.get<GroupsResponse>(url).then(groups => {
             const projects = groups.data.items.map(g => ({
                 name: g.name,
                 createdAt: g.created_at,
@@ -51,6 +51,7 @@ export default class ProjectService {
                 ownerUuid: g.owner_uuid
             } as Project));
             dispatch(actions.PROJECTS_SUCCESS({projects, parentItemId: parentUuid}));
+            return projects;
         });
     };
 }
index 00fab70d1f8f2120d790799ddf81f3fa411f1f30..d18d113bcbca66ced17a91bfc920e04a7d1be65d 100644 (file)
@@ -27,6 +27,7 @@ import projectActions from "../../store/project/project-action"
 import ProjectTree from '../../components/project-tree/project-tree';
 import { TreeItem } from "../../components/tree/tree";
 import { Project } from "../../models/project";
+import { projectService } from '../../services/services';
 
 const drawerWidth = 240;
 
@@ -103,6 +104,12 @@ class Workbench extends React.Component<WorkbenchProps, WorkbenchState> {
         });
     };
 
+    toggleProjectTreeItem = (itemId: string) => {
+        this.props.dispatch<any>(projectService.getProjectList(itemId)).then(() => {
+            this.props.dispatch(projectActions.TOGGLE_PROJECT_TREE_ITEM(itemId));
+        });
+    };
+
     render() {
         const {classes, user} = this.props;
         return (
@@ -159,7 +166,7 @@ class Workbench extends React.Component<WorkbenchProps, WorkbenchState> {
                     <div className={classes.toolbar}/>
                     <ProjectTree
                         projects={this.props.projects}
-                        toggleProjectTreeItem={itemId => this.props.dispatch(projectActions.TOGGLE_PROJECT_TREE_ITEM(itemId))}/>
+                        toggleProjectTreeItem={this.toggleProjectTreeItem}/>
                 </Drawer>}
                 <main className={classes.content}>
                     <div className={classes.toolbar}/>