Save resource name when creating favorite
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Tue, 24 Jul 2018 09:11:51 +0000 (11:11 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Tue, 24 Jul 2018 09:11:51 +0000 (11:11 +0200)
Feature #13784

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

src/services/favorite-service/favorite-service.test.ts
src/services/favorite-service/favorite-service.ts
src/store/context-menu/context-menu-reducer.ts
src/store/favorites/favorites-actions.ts
src/views-components/context-menu/action-sets/project-action-set.ts
src/views-components/context-menu/action-sets/resource-action-set.ts
src/views/workbench/workbench.tsx

index 58c3bf4acf5c6fa63842360b60d0a8c7b2b760b2..e3a3bdfd4ea0ec4aef4f29f7105921112e2afb5f 100644 (file)
@@ -23,14 +23,14 @@ describe("FavoriteService", () => {
         linkService.create = jest.fn().mockReturnValue(Promise.resolve({ uuid: "newUuid" }));
         const favoriteService = new FavoriteService(linkService, groupService);
 
-        const newFavorite = await favoriteService.create({ userUuid: "userUuid", resourceUuid: "resourceUuid" });
+        const newFavorite = await favoriteService.create({ userUuid: "userUuid", resource: { uuid: "resourceUuid", name: "resource" } });
 
         expect(linkService.create).toHaveBeenCalledWith({
             ownerUuid: "userUuid",
             tailUuid: "userUuid",
             headUuid: "resourceUuid",
             linkClass: LinkClass.STAR,
-            name: "resourceUuid"
+            name: "resource"
         });
         expect(newFavorite.uuid).toEqual("newUuid");
 
index f211a3858a8ef539d77f52a14d126f644a4174ef..6ceaa3606f9d28053f5f1fd685f32f132cdecc6e 100644 (file)
@@ -19,13 +19,13 @@ export class FavoriteService {
         private groupsService: GroupsService
     ) { }
 
-    create(data: { userUuid: string; resourceUuid: string; }) {
+    create(data: { userUuid: string; resource: { uuid: string; name: string } }) {
         return this.linkService.create({
             ownerUuid: data.userUuid,
             tailUuid: data.userUuid,
-            headUuid: data.resourceUuid,
+            headUuid: data.resource.uuid,
             linkClass: LinkClass.STAR,
-            name: data.resourceUuid
+            name: data.resource.name
         });
     }
 
@@ -73,9 +73,9 @@ export class FavoriteService {
                     .addEqual("tailUuid", userUuid)
                     .addEqual("linkClass", LinkClass.STAR)
             })
-            .then(({items}) => resourceUuids.reduce((results, uuid) => {
+            .then(({ items }) => resourceUuids.reduce((results, uuid) => {
                 const isFavorite = items.some(item => item.headUuid === uuid);
-                return {...results, [uuid]: isFavorite};
+                return { ...results, [uuid]: isFavorite };
             }, {}));
     }
 
index d0ad85e32e91365e2f5ae0d892bdebef724520b1..7ce2b3e75449a705a1627cc4b62457eebc561d8b 100644 (file)
@@ -19,6 +19,7 @@ export interface ContextMenuPosition {
 export interface ContextMenuResource {
     uuid: string;
     kind: string;
+    name: string;
 }
 
 const initialState = {
index ddb1492fa159dfc192195fc9d27fb0a5e6934368..c8d1d076efeed16baf8538ff4c04fa55504e6bc5 100644 (file)
@@ -16,18 +16,18 @@ export const favoritesActions = unionize({
 
 export type FavoritesAction = UnionOf<typeof favoritesActions>;
 
-export const toggleFavorite = (resourceUuid: string) =>
+export const toggleFavorite = (resource: { uuid: string; name: string }) =>
     (dispatch: Dispatch, getState: () => RootState) => {
         const userUuid = getState().auth.user!.uuid;
-        dispatch(favoritesActions.TOGGLE_FAVORITE({ resourceUuid }));
-        const isFavorite = checkFavorite(resourceUuid, getState().favorites);
+        dispatch(favoritesActions.TOGGLE_FAVORITE({ resourceUuid: resource.uuid }));
+        const isFavorite = checkFavorite(resource.uuid, getState().favorites);
         const promise = isFavorite
-            ? favoriteService.delete({ userUuid, resourceUuid })
-            : favoriteService.create({ userUuid, resourceUuid });
+            ? favoriteService.delete({ userUuid, resourceUuid: resource.uuid })
+            : favoriteService.create({ userUuid, resource });
 
         promise
             .then(fav => {
-                dispatch(favoritesActions.UPDATE_FAVORITES({ [resourceUuid]: !isFavorite }));
+                dispatch(favoritesActions.UPDATE_FAVORITES({ [resource.uuid]: !isFavorite }));
             });
     };
 
index dd257b7fcd0ac670c7393f9735d50a4356c31c51..e0a5e5412616a8690df6e5de1184e46cf201a275 100644 (file)
@@ -17,6 +17,6 @@ export const projectActionSet: ContextMenuActionSet = [[{
 }, {
     component: ToggleFavoriteAction,
     execute: (dispatch, resource) => {
-        dispatch<any>(toggleFavorite(resource.uuid));
+        dispatch<any>(toggleFavorite(resource));
     }
 }]];
index 59af117ce088b65a091ba946c0f831808c2acb8e..891528367bca93f119412f1195d4a92808115a8a 100644 (file)
@@ -9,6 +9,6 @@ import { toggleFavorite } from "../../../store/favorites/favorites-actions";
 export const resourceActionSet: ContextMenuActionSet = [[{
     component: ToggleFavoriteAction,
     execute: (dispatch, resource) => {
-        dispatch<any>(toggleFavorite(resource.uuid));
+        dispatch<any>(toggleFavorite(resource));
     }
 }]];
index 96fd223676740946986f9f96562550d63b65195f..99212d3fafffc3fa22582cdfe68fba808f4ab167 100644 (file)
@@ -175,11 +175,19 @@ export const Workbench = withStyles(styles)(
                                     toggleOpen={this.toggleSidePanelOpen}
                                     toggleActive={this.toggleSidePanelActive}
                                     sidePanelItems={this.props.sidePanelItems}
-                                    onContextMenu={(event) => this.openContextMenu(event, authService.getUuid() || "", ContextMenuKind.RootProject)}>
+                                    onContextMenu={(event) => this.openContextMenu(event, {
+                                        uuid: authService.getUuid() || "",
+                                        name: "",
+                                        kind: ContextMenuKind.RootProject
+                                    })}>
                                     <ProjectTree
                                         projects={this.props.projects}
                                         toggleOpen={itemId => this.props.dispatch<any>(setProjectItem(itemId, ItemMode.OPEN))}
-                                        onContextMenu={(event, item) => this.openContextMenu(event, item.data.uuid, ContextMenuKind.Project)}
+                                        onContextMenu={(event, item) => this.openContextMenu(event, {
+                                            uuid: item.data.uuid,
+                                            name: item.data.name,
+                                            kind: ContextMenuKind.Project
+                                        })}
                                         toggleActive={itemId => {
                                             this.props.dispatch<any>(setProjectItem(itemId, ItemMode.ACTIVE));
                                             this.props.dispatch<any>(loadDetails(itemId, ResourceKind.Project));
@@ -205,7 +213,11 @@ export const Workbench = withStyles(styles)(
                 onItemRouteChange={itemId => this.props.dispatch<any>(setProjectItem(itemId, ItemMode.ACTIVE))}
                 onContextMenu={(event, item) => {
                     const kind = item.kind === ResourceKind.Project ? ContextMenuKind.Project : ContextMenuKind.Resource;
-                    this.openContextMenu(event, item.uuid, kind);
+                    this.openContextMenu(event, {
+                        uuid: item.uuid,
+                        name: item.name,
+                        kind
+                    });
                 }}
                 onDialogOpen={this.handleCreationDialogOpen}
                 onItemClick={item => {
@@ -231,7 +243,11 @@ export const Workbench = withStyles(styles)(
                     this.props.dispatch(detailsPanelActions.TOGGLE_DETAILS_PANEL());
                 },
                 onContextMenu: (event: React.MouseEvent<HTMLElement>, breadcrumb: NavBreadcrumb) => {
-                    this.openContextMenu(event, breadcrumb.itemId, ContextMenuKind.Project);
+                    this.openContextMenu(event, {
+                        uuid: breadcrumb.itemId,
+                        name: breadcrumb.label,
+                        kind: ContextMenuKind.Project
+                    });
                 }
             };
 
@@ -249,12 +265,12 @@ export const Workbench = withStyles(styles)(
                 this.props.dispatch(projectActions.OPEN_PROJECT_CREATOR({ ownerUuid: itemUuid }));
             }
 
-            openContextMenu = (event: React.MouseEvent<HTMLElement>, itemUuid: string, kind: ContextMenuKind) => {
+            openContextMenu = (event: React.MouseEvent<HTMLElement>, resource: { name: string; uuid: string; kind: ContextMenuKind; }) => {
                 event.preventDefault();
                 this.props.dispatch(
                     contextMenuActions.OPEN_CONTEXT_MENU({
                         position: { x: event.clientX, y: event.clientY },
-                        resource: { uuid: itemUuid, kind }
+                        resource
                     })
                 );
             }