21067: Fix bug deleting projects from shared-with-me
[arvados.git] / src / views / search-results-panel / search-results-panel-view.tsx
index fd420b83ffadd624c6ac22b12d9654f5a91d68ff..d9b9002e3ea1a33d2d5b8f668e0108138d7e59c9 100644 (file)
@@ -28,6 +28,8 @@ import { Link } from 'react-router-dom';
 import { StyleRulesCallback, withStyles, WithStyles } from '@material-ui/core';
 import { ArvadosTheme } from 'common/custom-theme';
 import { getSearchSessions } from 'store/search-bar/search-bar-actions';
+import { camelCase } from 'lodash';
+import { GroupContentsResource } from 'services/groups-service/groups-service';
 
 export enum SearchResultsPanelColumnNames {
     CLUSTER = "Cluster",
@@ -39,9 +41,12 @@ export enum SearchResultsPanelColumnNames {
     LAST_MODIFIED = "Last modified"
 }
 
-export type CssRules = 'siteManagerLink';
+export type CssRules = 'siteManagerLink' | 'searchResults';
 
 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
+    searchResults: {
+        width: '100%'
+    },
     siteManagerLink: {
         marginRight: theme.spacing.unit * 2,
         float: 'right'
@@ -52,7 +57,7 @@ export interface WorkflowPanelFilter extends DataTableFilterItem {
     type: ResourceKind | ContainerRequestState;
 }
 
-export const searchResultsPanelColumns: DataColumns<string> = [
+export const searchResultsPanelColumns: DataColumns<string, GroupContentsResource> = [
     {
         name: SearchResultsPanelColumnNames.CLUSTER,
         selected: true,
@@ -64,7 +69,7 @@ export const searchResultsPanelColumns: DataColumns<string> = [
         name: SearchResultsPanelColumnNames.NAME,
         selected: true,
         configurable: true,
-        sortDirection: SortDirection.NONE,
+        sort: {direction: SortDirection.NONE, field: "name"},
         filters: createTree(),
         render: (uuid: string) => <ResourceName uuid={uuid} />
     },
@@ -100,7 +105,7 @@ export const searchResultsPanelColumns: DataColumns<string> = [
         name: SearchResultsPanelColumnNames.LAST_MODIFIED,
         selected: true,
         configurable: true,
-        sortDirection: SortDirection.DESC,
+        sort: {direction: SortDirection.DESC, field: "modifiedAt"},
         filters: createTree(),
         render: uuid => <ResourceLastModifiedDate uuid={uuid} />
     }
@@ -111,9 +116,10 @@ export const SearchResultsPanelView = withStyles(styles, { withTheme: true })(
         const homeCluster = props.user.uuid.substring(0, 5);
         const loggedIn = props.sessions.filter((ss) => ss.loggedIn && ss.userIsActive);
         const [selectedItem, setSelectedItem] = useState('');
+        const [itemPath, setItemPath] = useState<string[]>([]);
 
         useEffect(() => {
-            let itemPath: string[] = [];
+            let tmpPath: string[] = [];
 
             (async () => {
                 if (selectedItem !== '') {
@@ -122,16 +128,16 @@ export const SearchResultsPanelView = withStyles(styles, { withTheme: true })(
 
                     while (itemKind !== ResourceKind.USER) {
                         const clusterId = searchUuid.split('-')[0];
-                        const serviceType = itemKind?.replace('arvados#', '');
+                        const serviceType = camelCase(itemKind?.replace('arvados#', ''));
                         const service = Object.values(servicesProvider.getServices())
                             .filter(({resourceType}) => !!resourceType)
-                            .find(({resourceType}) => resourceType.indexOf(serviceType) > -1);
+                            .find(({resourceType}) => camelCase(resourceType).indexOf(serviceType) > -1);
                         const sessions = getSearchSessions(clusterId, props.sessions);
 
                         if (sessions.length > 0) {
                             const session = sessions[0];
-                            const { name, ownerUuid } = await (service as any).get(searchUuid, false, session);
-                            itemPath.push(name);
+                            const { name, ownerUuid } = await (service as any).get(searchUuid, false, undefined, session);
+                            tmpPath.push(name);
                             searchUuid = ownerUuid;
                             itemKind = extractUuidKind(searchUuid);
                         } else {
@@ -139,8 +145,8 @@ export const SearchResultsPanelView = withStyles(styles, { withTheme: true })(
                         }
                     }
 
-                    itemPath.push(props.user.uuid === searchUuid ? 'Projects' : 'Shared with me');
-                    props.onPathDisplay(`/ ${itemPath.reverse().join(' / ')}`);
+                    tmpPath.push(props.user.uuid === searchUuid ? 'Projects' : 'Shared with me');
+                    setItemPath(tmpPath);
                 }
             })();
 
@@ -153,13 +159,14 @@ export const SearchResultsPanelView = withStyles(styles, { withTheme: true })(
         // eslint-disable-next-line react-hooks/exhaustive-deps
         },[props.onItemClick]);
 
-        return <span data-cy='search-results'>
+        return <span data-cy='search-results' className={props.classes.searchResults}>
             <DataExplorer
             id={SEARCH_RESULTS_PANEL_ID}
             onRowClick={onItemClick}
             onRowDoubleClick={props.onItemDoubleClick}
             onContextMenu={props.onContextMenu}
             contextMenuColumn={false}
+            elementPath={`/ ${itemPath.reverse().join(' / ')}`}
             hideSearchInput
             title={
                 <div>