21225: Rename project panel middleware to data middleware and separate data explorer
authorStephen Smith <stephen@curii.com>
Fri, 17 May 2024 15:20:19 +0000 (11:20 -0400)
committerStephen Smith <stephen@curii.com>
Fri, 7 Jun 2024 18:08:23 +0000 (14:08 -0400)
Also removes unnecessary dependencies on the middleware like references to
column names from other DataExplorers, shared getFilters that won't be able to
be shared in the future,

Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen@curii.com>

22 files changed:
services/workbench2/src/store/collections/collection-move-actions.ts
services/workbench2/src/store/favorite-panel/favorite-panel-middleware-service.ts
services/workbench2/src/store/processes/process-move-actions.ts
services/workbench2/src/store/processes/process-update-actions.ts
services/workbench2/src/store/processes/processes-actions.ts
services/workbench2/src/store/processes/processes-middleware-service.ts
services/workbench2/src/store/project-panel/project-panel-action-bind.ts
services/workbench2/src/store/project-panel/project-panel-action.ts
services/workbench2/src/store/project-panel/project-panel-data-middleware-service.ts [moved from services/workbench2/src/store/project-panel/project-panel-middleware-service.ts with 94% similarity]
services/workbench2/src/store/projects/project-lock-actions.ts
services/workbench2/src/store/projects/project-move-actions.ts
services/workbench2/src/store/projects/project-update-actions.ts
services/workbench2/src/store/search-results-panel/search-results-middleware-service.ts
services/workbench2/src/store/shared-with-me-panel/shared-with-me-middleware-service.ts
services/workbench2/src/store/store.ts
services/workbench2/src/store/trash-panel/trash-panel-middleware-service.ts
services/workbench2/src/store/trash/trash-actions.ts
services/workbench2/src/store/workbench/workbench-actions.ts
services/workbench2/src/store/workflow-panel/workflow-panel-actions.ts
services/workbench2/src/views/project-panel/project-panel-data.tsx [new file with mode: 0644]
services/workbench2/src/views/project-panel/project-panel.tsx
services/workbench2/src/websocket/websocket.ts

index 56c7b24c60e0ca555e097df8c58072447bae098a..89018867fe2496d031896da0f86d9e548f674bbc 100644 (file)
@@ -9,7 +9,7 @@ import { ServiceRepository } from "services/services";
 import { RootState } from "store/store";
 import { getCommonResourceServiceError, CommonResourceServiceError } from "services/common-service/common-resource-service";
 import { snackbarActions, SnackbarKind } from "store/snackbar/snackbar-actions";
-import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
+import { projectPanelDataActions } from "store/project-panel/project-panel-action-bind";
 import { MoveToFormDialogData } from "store/move-to-dialog/move-to-dialog";
 import { resetPickerProjectTree } from "store/project-tree-picker/project-tree-picker-actions";
 import { progressIndicatorActions } from "store/progress-indicator/progress-indicator-actions";
@@ -36,7 +36,7 @@ export const moveCollection =
                 cachedCollection = await services.collectionService.get(resource.uuid);
             }
             const collection = await services.collectionService.update(resource.uuid, { ownerUuid: resource.ownerUuid });
-            dispatch(projectPanelActions.REQUEST_ITEMS());
+            dispatch(projectPanelDataActions.REQUEST_ITEMS());
             dispatch(dialogActions.CLOSE_DIALOG({ id: COLLECTION_MOVE_FORM_NAME }));
             dispatch(progressIndicatorActions.STOP_WORKING(COLLECTION_MOVE_FORM_NAME));
             return { ...cachedCollection, ...collection };
index a15690b3f4569fb6ac4e50389606e16c800e1d51..f61ec392409287c64d228859099be8af9a79883b 100644 (file)
@@ -16,7 +16,7 @@ import { resourcesActions } from "store/resources/resources-actions";
 import { snackbarActions, SnackbarKind } from 'store/snackbar/snackbar-actions';
 import { progressIndicatorActions } from 'store/progress-indicator/progress-indicator-actions';
 import { getDataExplorer } from "store/data-explorer/data-explorer-reducer";
-import { loadMissingProcessesInformation } from "store/project-panel/project-panel-middleware-service";
+import { loadMissingProcessesInformation } from "store/project-panel/project-panel-data-middleware-service";
 import { getDataExplorerColumnFilters } from 'store/data-explorer/data-explorer-middleware-service';
 import { serializeSimpleObjectTypeFilters } from '../resource-type-filters/resource-type-filters';
 import { ResourceKind } from "models/resource";
index c3ac75f99571cbae600d71a00d5064626a11b925..1e357cf56bd2f1417295d2da8b2ac935849dcf45 100644 (file)
@@ -11,7 +11,7 @@ import { getCommonResourceServiceError, CommonResourceServiceError } from "servi
 import { snackbarActions, SnackbarKind } from "store/snackbar/snackbar-actions";
 import { MoveToFormDialogData } from "store/move-to-dialog/move-to-dialog";
 import { resetPickerProjectTree } from "store/project-tree-picker/project-tree-picker-actions";
-import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
+import { projectPanelDataActions } from "store/project-panel/project-panel-action-bind";
 import { getProcess } from "store/processes/process";
 import { initProjectsTreePicker } from "store/tree-picker/tree-picker-actions";
 
@@ -35,7 +35,7 @@ export const moveProcess = (resource: MoveToFormDialogData) => async (dispatch:
     try {
         const process = await services.containerRequestService.get(resource.uuid);
         await services.containerRequestService.update(resource.uuid, { ownerUuid: resource.ownerUuid });
-        dispatch(projectPanelActions.REQUEST_ITEMS());
+        dispatch(projectPanelDataActions.REQUEST_ITEMS());
         dispatch(dialogActions.CLOSE_DIALOG({ id: PROCESS_MOVE_FORM_NAME }));
         return process;
     } catch (e) {
index c7bd2c7beeac61febd3d1747eacd26d025a86493..b6b5ca829e274aab0b11d4c18163135b40dfcdb4 100644 (file)
@@ -9,7 +9,7 @@ import { dialogActions } from "store/dialog/dialog-actions";
 import { getCommonResourceServiceError, CommonResourceServiceError } from "services/common-service/common-resource-service";
 import { ServiceRepository } from "services/services";
 import { getProcess } from "store/processes/process";
-import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
+import { projectPanelDataActions } from "store/project-panel/project-panel-action-bind";
 import { snackbarActions, SnackbarKind } from "store/snackbar/snackbar-actions";
 
 export interface ProcessUpdateFormDialogData {
@@ -39,7 +39,7 @@ export const updateProcess =
                 name: resource.name,
                 description: resource.description,
             });
-            dispatch(projectPanelActions.REQUEST_ITEMS());
+            dispatch(projectPanelDataActions.REQUEST_ITEMS());
             dispatch(dialogActions.CLOSE_DIALOG({ id: PROCESS_UPDATE_FORM_NAME }));
             return updatedProcess;
         } catch (e) {
index eadb05e5e1460ff47db6b12d687b36394a9c624e..9e49aa97d82ca9466724aaf09257565cb61fea89 100644 (file)
@@ -9,7 +9,7 @@ import { updateResources } from "store/resources/resources-actions";
 import { Process } from "./process";
 import { dialogActions } from "store/dialog/dialog-actions";
 import { snackbarActions, SnackbarKind } from "store/snackbar/snackbar-actions";
-import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
+import { projectPanelDataActions } from "store/project-panel/project-panel-action-bind";
 import { navigateToRunProcess } from "store/navigation/navigation-action";
 import { goToStep, runProcessPanelActions } from "store/run-process-panel/run-process-panel-actions";
 import { getResource } from "store/resources/resources";
@@ -329,7 +329,7 @@ export const removeProcessPermanently = (uuid: string) => async (dispatch: Dispa
         try {
             dispatch(snackbarActions.OPEN_SNACKBAR({ message: "Removing ...", kind: SnackbarKind.INFO }));
             await services.containerRequestService.delete(process.uuid, false);
-            dispatch(projectPanelActions.REQUEST_ITEMS());
+            dispatch(projectPanelDataActions.REQUEST_ITEMS());
             dispatch(snackbarActions.OPEN_SNACKBAR({ message: "Removed.", hideDuration: 2000, kind: SnackbarKind.SUCCESS }));
         } catch (e) {
             const error = getCommonResourceServiceError(e);
index 3154e1aec9dfd419b3a4c93264aeb11c92d66c94..f1e0936b5beb79a1349be2a87942e6bfed8c5591 100644 (file)
@@ -19,7 +19,7 @@ import { DataColumns } from 'components/data-table/data-table';
 import { ProcessStatusFilter, buildProcessStatusFilters } from '../resource-type-filters/resource-type-filters';
 import { ContainerRequestResource, containerRequestFieldsNoMounts } from 'models/container-request';
 import { progressIndicatorActions } from '../progress-indicator/progress-indicator-actions';
-import { loadMissingProcessesInformation } from '../project-panel/project-panel-middleware-service';
+import { loadMissingProcessesInformation } from '../project-panel/project-panel-data-middleware-service';
 
 export class ProcessesMiddlewareService extends DataExplorerMiddlewareService {
     constructor(private services: ServiceRepository, private actions: BoundDataExplorerActions, id: string) {
index a84039571b928ae4017846df33bb033829b6efa6..598f6f7442adb89f5922f38d25b30994637370d0 100644 (file)
@@ -7,5 +7,5 @@ import { bindDataExplorerActions } from "store/data-explorer/data-explorer-actio
 // These are split into a separate file to avoid circular imports causing
 // invariant violations with unit tests
 
-export const PROJECT_PANEL_ID = "projectPanel";
-export const projectPanelActions = bindDataExplorerActions(PROJECT_PANEL_ID);
+export const PROJECT_PANEL_DATA_ID = "projectPanelData";
+export const projectPanelDataActions = bindDataExplorerActions(PROJECT_PANEL_DATA_ID);
index a0547ced2376d80cd18d0057002afcab6f2b0a88..af961a8dab141d7604b3f49c58eb8ae2aae07116 100644 (file)
@@ -7,7 +7,7 @@ import { propertiesActions } from "store/properties/properties-actions";
 import { RootState } from "store/store";
 import { getProperty } from "store/properties/properties";
 import { loadProject } from "store/workbench/workbench-actions";
-import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
+import { projectPanelDataActions } from "store/project-panel/project-panel-action-bind";
 
 export const PROJECT_PANEL_CURRENT_UUID = "projectPanelCurrentUuid";
 export const IS_PROJECT_PANEL_TRASHED = "isProjectPanelTrashed";
@@ -15,8 +15,9 @@ export const IS_PROJECT_PANEL_TRASHED = "isProjectPanelTrashed";
 export const openProjectPanel = (projectUuid: string) => async (dispatch: Dispatch) => {
     await dispatch<any>(loadProject(projectUuid));
     dispatch(propertiesActions.SET_PROPERTY({ key: PROJECT_PANEL_CURRENT_UUID, value: projectUuid }));
-    dispatch(projectPanelActions.RESET_EXPLORER_SEARCH_VALUE());
-    dispatch(projectPanelActions.REQUEST_ITEMS());
+
+    dispatch(projectPanelDataActions.RESET_EXPLORER_SEARCH_VALUE());
+    dispatch(projectPanelDataActions.REQUEST_ITEMS());
 };
 
 export const getProjectPanelCurrentUuid = (state: RootState) => getProperty<string>(PROJECT_PANEL_CURRENT_UUID)(state.properties);
similarity index 94%
rename from services/workbench2/src/store/project-panel/project-panel-middleware-service.ts
rename to services/workbench2/src/store/project-panel/project-panel-data-middleware-service.ts
index 61c89cd6a78ea76331fbb89aad8aeac9fddf7c47..6e599f5c3499c57e0e0356e7dfe9e9376bbb0ef4 100644 (file)
@@ -8,7 +8,7 @@ import {
     getDataExplorerColumnFilters,
     listResultsToDataExplorerItemsMeta,
 } from "store/data-explorer/data-explorer-middleware-service";
-import { ProjectPanelColumnNames } from "views/project-panel/project-panel";
+import { ProjectPanelDataColumnNames } from "views/project-panel/project-panel-data";
 import { RootState } from "store/store";
 import { DataColumns } from "components/data-table/data-table";
 import { ServiceRepository } from "services/services";
@@ -18,7 +18,7 @@ import { FilterBuilder, joinFilters } from "services/api/filter-builder";
 import { GroupContentsResource, GroupContentsResourcePrefix } from "services/groups-service/groups-service";
 import { updateFavorites } from "store/favorites/favorites-actions";
 import { IS_PROJECT_PANEL_TRASHED, getProjectPanelCurrentUuid } from "store/project-panel/project-panel-action";
-import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
+import { projectPanelDataActions } from "store/project-panel/project-panel-action-bind";
 import { Dispatch, MiddlewareAPI } from "redux";
 import { ProjectResource } from "models/project";
 import { updateResources } from "store/resources/resources-actions";
@@ -35,11 +35,11 @@ import { updatePublicFavorites } from "store/public-favorites/public-favorites-a
 import { selectedFieldsOfGroup } from "models/group";
 import { defaultCollectionSelectedFields } from "models/collection";
 import { containerRequestFieldsNoMounts } from "models/container-request";
-import { ContextMenuActionNames } from "views-components/context-menu/context-menu-action-set"; 
+import { ContextMenuActionNames } from "views-components/context-menu/context-menu-action-set";
 import { removeDisabledButton } from "store/multiselect/multiselect-actions";
 import { dataExplorerActions } from "store/data-explorer/data-explorer-action";
 
-export class ProjectPanelMiddlewareService extends DataExplorerMiddlewareService {
+export class ProjectPanelDataMiddlewareService extends DataExplorerMiddlewareService {
     constructor(private services: ServiceRepository, id: string) {
         super(id);
     }
@@ -66,7 +66,7 @@ export class ProjectPanelMiddlewareService extends DataExplorerMiddlewareService
                 api.dispatch(setItems(response));
             } catch (e) {
                 api.dispatch(
-                    projectPanelActions.SET_ITEMS({
+                    projectPanelDataActions.SET_ITEMS({
                         items: [],
                         itemsAvailable: 0,
                         page: 0,
@@ -80,7 +80,7 @@ export class ProjectPanelMiddlewareService extends DataExplorerMiddlewareService
                     api.dispatch(couldNotFetchProjectContents());
                 }
             } finally {
-                if (!background) { 
+                if (!background) {
                     api.dispatch(progressIndicatorActions.PERSIST_STOP_WORKING(this.getId()));
                     api.dispatch<any>(removeDisabledButton(ContextMenuActionNames.MOVE_TO_TRASH))
                 }
@@ -101,7 +101,7 @@ export const loadMissingProcessesInformation = (resources: GroupContentsResource
 };
 
 export const setItems = (listResults: ListResults<GroupContentsResource>) =>
-    projectPanelActions.SET_ITEMS({
+    projectPanelDataActions.SET_ITEMS({
         ...listResultsToDataExplorerItemsMeta(listResults),
         items: listResults.items.map(resource => resource.uuid),
     });
@@ -116,7 +116,7 @@ export const getParams = (dataExplorer: DataExplorer, isProjectTrashed: boolean)
 
 export const getFilters = (dataExplorer: DataExplorer) => {
     const columns = dataExplorer.columns as DataColumns<string, ProjectResource>;
-    const typeFilters = serializeResourceTypeFilters(getDataExplorerColumnFilters(columns, ProjectPanelColumnNames.TYPE));
+    const typeFilters = serializeResourceTypeFilters(getDataExplorerColumnFilters(columns, ProjectPanelDataColumnNames.TYPE));
     const statusColumnFilters = getDataExplorerColumnFilters(columns, "Status");
     const activeStatusFilter = Object.keys(statusColumnFilters).find(filterName => statusColumnFilters[filterName].selected);
 
index 84cea4380954e226be50a8665ce695023fc32c4a..5e9c9ea147fc0102829b07e7a48488ad6bcf4f16 100644 (file)
@@ -4,10 +4,10 @@
 
 import { Dispatch } from "redux";
 import { ServiceRepository } from "services/services";
-import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
+import { projectPanelDataActions } from "store/project-panel/project-panel-action-bind";
 import { loadResource } from "store/resources/resources-actions";
 import { RootState } from "store/store";
-import { ContextMenuActionNames } from "views-components/context-menu/context-menu-action-set"; 
+import { ContextMenuActionNames } from "views-components/context-menu/context-menu-action-set";
 import { addDisabledButton, removeDisabledButton } from "store/multiselect/multiselect-actions";
 import { snackbarActions, SnackbarKind } from "store/snackbar/snackbar-actions";
 
@@ -25,7 +25,7 @@ export const freezeProject = (uuid: string) => async (dispatch: Dispatch, getSta
         dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Could not freeze project', hideDuration: 4000, kind: SnackbarKind.ERROR }));
     }
 
-    dispatch(projectPanelActions.REQUEST_ITEMS());
+    dispatch(projectPanelDataActions.REQUEST_ITEMS());
     dispatch<any>(loadResource(uuid, false));
     dispatch<any>(removeDisabledButton(ContextMenuActionNames.FREEZE_PROJECT))
     return updatedProject;
@@ -38,7 +38,7 @@ export const unfreezeProject = (uuid: string) => async (dispatch: Dispatch, getS
         frozenByUuid: null,
     });
 
-    dispatch(projectPanelActions.REQUEST_ITEMS());
+    dispatch(projectPanelDataActions.REQUEST_ITEMS());
     dispatch<any>(loadResource(uuid, false));
     dispatch<any>(removeDisabledButton(ContextMenuActionNames.FREEZE_PROJECT))
     return updatedProject;
index 97cd5dbe71280b464387ed83436e7d4d3e98f2cd..b5355ba40203bcb729d57ae65e6a2834a50203fe 100644 (file)
@@ -12,7 +12,7 @@ import { getCommonResourceServiceError, CommonResourceServiceError } from "servi
 import { MoveToFormDialogData } from "store/move-to-dialog/move-to-dialog";
 import { resetPickerProjectTree } from "store/project-tree-picker/project-tree-picker-actions";
 import { initProjectsTreePicker } from "store/tree-picker/tree-picker-actions";
-import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
+import { projectPanelDataActions } from "store/project-panel/project-panel-action-bind";
 import { loadSidePanelTreeProjects } from "../side-panel-tree/side-panel-tree-actions";
 
 export const PROJECT_MOVE_FORM_NAME = "projectMoveFormName";
@@ -34,7 +34,7 @@ export const moveProject = (resource: MoveToFormDialogData) => async (dispatch:
     dispatch(startSubmit(PROJECT_MOVE_FORM_NAME));
     try {
         const newProject = await services.projectService.update(resource.uuid, { ownerUuid: resource.ownerUuid });
-        dispatch(projectPanelActions.REQUEST_ITEMS());
+        dispatch(projectPanelDataActions.REQUEST_ITEMS());
 
         dispatch(dialogActions.CLOSE_DIALOG({ id: PROJECT_MOVE_FORM_NAME }));
         await dispatch<any>(loadSidePanelTreeProjects(userUuid));
index 812490319aadd47620a142cc345cbe808d15c9ec..b51a31bc19180cfa36ad0c56329be1ba230c0846 100644 (file)
@@ -8,7 +8,7 @@ import { RootState } from "store/store";
 import { dialogActions } from "store/dialog/dialog-actions";
 import { getCommonResourceServiceError, CommonResourceServiceError } from "services/common-service/common-resource-service";
 import { ServiceRepository } from "services/services";
-import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
+import { projectPanelDataActions } from "store/project-panel/project-panel-action-bind";
 import { GroupClass } from "models/group";
 import { Participant } from "views-components/sharing-dialog/participant-select";
 import { ProjectProperties } from "./project-create-actions";
@@ -56,7 +56,7 @@ export const updateProject =
                 },
                 false
             );
-            dispatch(projectPanelActions.REQUEST_ITEMS());
+            dispatch(projectPanelDataActions.REQUEST_ITEMS());
             dispatch(reset(PROJECT_UPDATE_FORM_NAME));
             dispatch(dialogActions.CLOSE_DIALOG({ id: PROJECT_UPDATE_FORM_NAME }));
             return updatedProject;
index 2c444813a1c359647456fe10242bf7902c781f18..f7b6e4a25a01b69b0135db652e0f3de08e7144c1 100644 (file)
@@ -24,7 +24,7 @@ import { getSortColumn } from "store/data-explorer/data-explorer-reducer";
 import { FilterBuilder, joinFilters } from 'services/api/filter-builder';
 import { DataColumns } from 'components/data-table/data-table';
 import { serializeResourceTypeFilters } from 'store//resource-type-filters/resource-type-filters';
-import { ProjectPanelColumnNames } from 'views/project-panel/project-panel';
+import { SearchResultsPanelColumnNames } from 'views/search-results-panel/search-results-panel-view';
 import { ResourceKind } from 'models/resource';
 import { ContainerRequestResource } from 'models/container-request';
 import { progressIndicatorActions } from 'store/progress-indicator/progress-indicator-actions';
@@ -106,7 +106,7 @@ export class SearchResultsMiddlewareService extends DataExplorerMiddlewareServic
     }
 }
 
-export const searchSingleCluster = (session: Session, searchValue: string) => 
+export const searchSingleCluster = (session: Session, searchValue: string) =>
     (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
         const state = getState();
         const dataExplorer = getDataExplorer(state.dataExplorer, SEARCH_RESULTS_PANEL_ID);
@@ -116,7 +116,7 @@ export const searchSingleCluster = (session: Session, searchValue: string) =>
         }
 
         const params = getParams(dataExplorer, searchValue, session.apiRevision);
-        
+
         // If the clusterId & search offset has already been fetched, we don't need to fetch the results again
         if(state.searchBar.searchOffsets[session.clusterId] === params.offset) {
             return;
@@ -148,7 +148,7 @@ export const searchSingleCluster = (session: Session, searchValue: string) =>
         dispatch(progressIndicatorActions.STOP_WORKING(SEARCH_RESULTS_PANEL_ID))
 }
 
-const typeFilters = (columns: DataColumns<string, GroupContentsResource>) => serializeResourceTypeFilters(getDataExplorerColumnFilters(columns, ProjectPanelColumnNames.TYPE));
+const typeFilters = (columns: DataColumns<string, GroupContentsResource>) => serializeResourceTypeFilters(getDataExplorerColumnFilters(columns, SearchResultsPanelColumnNames.TYPE));
 
 export const getParams = (dataExplorer: DataExplorer, query: string, apiRevision: number) => ({
     ...dataExplorerToListParams(dataExplorer),
index 1a2bdabab3d7f0325579525dc41e66fa2028377a..af45b42a94dc4e7c838ff32b403bc958b4f53358 100644 (file)
@@ -2,14 +2,14 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { DataExplorerMiddlewareService, listResultsToDataExplorerItemsMeta, dataExplorerToListParams } from '../data-explorer/data-explorer-middleware-service';
+import { DataExplorerMiddlewareService, listResultsToDataExplorerItemsMeta, dataExplorerToListParams, getDataExplorerColumnFilters } from '../data-explorer/data-explorer-middleware-service';
 import { ServiceRepository } from 'services/services';
 import { MiddlewareAPI, Dispatch } from 'redux';
 import { RootState } from 'store/store';
 import { getDataExplorer, DataExplorer } from 'store/data-explorer/data-explorer-reducer';
 import { updateFavorites } from 'store/favorites/favorites-actions';
 import { updateResources } from 'store/resources/resources-actions';
-import { loadMissingProcessesInformation, getFilters } from 'store/project-panel/project-panel-middleware-service';
+import { loadMissingProcessesInformation } from 'store/project-panel/project-panel-data-middleware-service';
 import { snackbarActions, SnackbarKind } from 'store/snackbar/snackbar-actions';
 import { sharedWithMePanelActions } from './shared-with-me-panel-actions';
 import { ListResults } from 'services/common-service/common-service';
@@ -22,6 +22,9 @@ import { updatePublicFavorites } from 'store/public-favorites/public-favorites-a
 import { FilterBuilder, joinFilters } from 'services/api/filter-builder';
 import { progressIndicatorActions } from 'store/progress-indicator/progress-indicator-actions';
 import { AuthState } from 'store/auth/auth-reducer';
+import { SharedWithMePanelColumnNames } from 'views/shared-with-me-panel/shared-with-me-panel';
+import { buildProcessStatusFilters, serializeResourceTypeFilters } from 'store/resource-type-filters/resource-type-filters';
+import { DataColumns } from 'components/data-table/data-table';
 
 export class SharedWithMeMiddlewareService extends DataExplorerMiddlewareService {
     constructor(private services: ServiceRepository, id: string) {
@@ -78,6 +81,26 @@ const getOrder = (dataExplorer: DataExplorer) => {
     }
 };
 
+const getFilters = (dataExplorer: DataExplorer) => {
+    const columns = dataExplorer.columns as DataColumns<string, ProjectResource>;
+    const typeFilters = serializeResourceTypeFilters(getDataExplorerColumnFilters(columns, SharedWithMePanelColumnNames.TYPE));
+    const statusColumnFilters = getDataExplorerColumnFilters(columns, "Status");
+    const activeStatusFilter = Object.keys(statusColumnFilters).find(filterName => statusColumnFilters[filterName].selected);
+
+    // TODO: Extract group contents name filter
+    const nameFilters = new FilterBuilder()
+        .addILike("name", dataExplorer.searchValue, GroupContentsResourcePrefix.COLLECTION)
+        .addILike("name", dataExplorer.searchValue, GroupContentsResourcePrefix.PROCESS)
+        .addILike("name", dataExplorer.searchValue, GroupContentsResourcePrefix.PROJECT)
+        .getFilters();
+
+    // Filter by container status
+    const statusFilters = buildProcessStatusFilters(new FilterBuilder(), activeStatusFilter || "", GroupContentsResourcePrefix.PROCESS).getFilters();
+
+    return joinFilters(statusFilters, typeFilters, nameFilters);
+};
+
+
 export const setItems = (listResults: ListResults<GroupContentsResource>) =>
     sharedWithMePanelActions.SET_ITEMS({
         ...listResultsToDataExplorerItemsMeta(listResults),
index b18bf8199ea0b649b5a06f75a5365b596c88b371..990e2786879057e88d8b4a11d432789a0433f7ef 100644 (file)
@@ -19,9 +19,9 @@ import { snackbarReducer } from "./snackbar/snackbar-reducer";
 import { collectionPanelFilesReducer } from "./collection-panel/collection-panel-files/collection-panel-files-reducer";
 import { dataExplorerMiddleware } from "./data-explorer/data-explorer-middleware";
 import { FAVORITE_PANEL_ID } from "./favorite-panel/favorite-panel-action";
-import { PROJECT_PANEL_ID } from "./project-panel/project-panel-action-bind";
 import { WORKFLOW_PROCESSES_PANEL_ID } from "./workflow-panel/workflow-panel-actions";
-import { ProjectPanelMiddlewareService } from "./project-panel/project-panel-middleware-service";
+import { PROJECT_PANEL_DATA_ID } from "./project-panel/project-panel-action-bind";
+import { ProjectPanelDataMiddlewareService } from "./project-panel/project-panel-data-middleware-service";
 import { FavoritePanelMiddlewareService } from "./favorite-panel/favorite-panel-middleware-service";
 import { AllProcessesPanelMiddlewareService } from "./all-processes-panel/all-processes-panel-middleware-service";
 import { WorkflowProcessesMiddlewareService } from "./workflow-panel/workflow-middleware-service";
@@ -96,7 +96,7 @@ export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
 export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
     const rootReducer = createRootReducer(services);
 
-    const projectPanelMiddleware = dataExplorerMiddleware(new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID));
+    const projectPanelDataMiddleware = dataExplorerMiddleware(new ProjectPanelDataMiddlewareService(services, PROJECT_PANEL_DATA_ID));
     const favoritePanelMiddleware = dataExplorerMiddleware(new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID));
     const allProcessessPanelMiddleware = dataExplorerMiddleware(new AllProcessesPanelMiddlewareService(services, ALL_PROCESSES_PANEL_ID));
     const workflowProcessessPanelMiddleware = dataExplorerMiddleware(new WorkflowProcessesMiddlewareService(services, WORKFLOW_PROCESSES_PANEL_ID));
@@ -138,7 +138,7 @@ export function configureStore(history: History, services: ServiceRepository, co
         thunkMiddleware.withExtraArgument(services),
         authMiddleware(services),
         tooltipsMiddleware(services),
-        projectPanelMiddleware,
+        projectPanelDataMiddleware,
         favoritePanelMiddleware,
         allProcessessPanelMiddleware,
         trashPanelMiddleware,
index b0fed19d0d5bf1676e34116de8591a03a3a1007b..a71ce6f5a765f88465560f99261469847ca83776 100644 (file)
@@ -16,7 +16,7 @@ import { trashPanelActions } from "./trash-panel-action";
 import { Dispatch, MiddlewareAPI } from "redux";
 import { OrderBuilder, OrderDirection } from "services/api/order-builder";
 import { GroupContentsResource, GroupContentsResourcePrefix } from "services/groups-service/groups-service";
-import { ProjectPanelColumnNames } from "views/project-panel/project-panel";
+import { TrashPanelColumnNames } from "views/trash-panel/trash-panel";
 import { updateFavorites } from "store/favorites/favorites-actions";
 import { updatePublicFavorites } from 'store/public-favorites/public-favorites-actions';
 import { snackbarActions, SnackbarKind } from "store/snackbar/snackbar-actions";
@@ -38,7 +38,7 @@ export class TrashPanelMiddlewareService extends DataExplorerMiddlewareService {
         const dataExplorer = api.getState().dataExplorer[this.getId()];
         const columns = dataExplorer.columns as DataColumns<string, CollectionResource>;
 
-        const typeFilters = serializeResourceTypeFilters(getDataExplorerColumnFilters(columns, ProjectPanelColumnNames.TYPE));
+        const typeFilters = serializeResourceTypeFilters(getDataExplorerColumnFilters(columns, TrashPanelColumnNames.TYPE));
 
         const otherFilters = new FilterBuilder()
             .addILike("name", dataExplorer.searchValue, GroupContentsResourcePrefix.COLLECTION)
index b6740bf9aef64156c9643eb8f90691236239a8de..c7c3186c0f17b2e7f5e6a62f7bf43cbbec6788dd 100644 (file)
@@ -8,7 +8,7 @@ import { ServiceRepository } from "services/services";
 import { snackbarActions, SnackbarKind } from "store/snackbar/snackbar-actions";
 import { trashPanelActions } from "store/trash-panel/trash-panel-action";
 import { activateSidePanelTreeItem, loadSidePanelTreeProjects } from "store/side-panel-tree/side-panel-tree-actions";
-import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
+import { projectPanelDataActions } from "store/project-panel/project-panel-action-bind";
 import { sharedWithMePanelActions } from "store/shared-with-me-panel/shared-with-me-panel-actions";
 import { ResourceKind } from "models/resource";
 import { navigateTo, navigateToTrash } from "store/navigation/navigation-action";
@@ -35,7 +35,7 @@ export const toggleProjectTrashed =
                     successMessage = "Added project to trash";
                     await services.groupsService.trash(uuid);
                     dispatch<any>(loadSidePanelTreeProjects(ownerUuid));
-                    
+
                     const { location } = getState().router;
                     if (matchSharedWithMeRoute(location ? location.pathname : "")) {
                         dispatch(sharedWithMePanelActions.REQUEST_ITEMS());
@@ -92,7 +92,7 @@ export const toggleCollectionTrashed =
                     errorMessage = "Could not move collection to trash";
                     successMessage = "Added to trash";
                     await services.collectionService.trash(uuid);
-                    dispatch(projectPanelActions.REQUEST_ITEMS());
+                    dispatch(projectPanelDataActions.REQUEST_ITEMS());
                 }
                 dispatch(
                     snackbarActions.OPEN_SNACKBAR({
index 83c457f94ddb68ded6ce919ae499a5c08b8d879f..02d94c56bb15b4a368f904b84d90b414aa260c45 100644 (file)
@@ -9,7 +9,7 @@ import { loadDetailsPanel } from "store/details-panel/details-panel-action";
 import { snackbarActions, SnackbarKind } from "store/snackbar/snackbar-actions";
 import { favoritePanelActions, loadFavoritePanel } from "store/favorite-panel/favorite-panel-action";
 import { getProjectPanelCurrentUuid, setIsProjectPanelTrashed } from "store/project-panel/project-panel-action";
-import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
+import { projectPanelDataActions } from "store/project-panel/project-panel-action-bind";
 import {
     activateSidePanelTreeItem,
     initSidePanelTree,
@@ -18,7 +18,7 @@ import {
     SIDE_PANEL_TREE,
 } from "store/side-panel-tree/side-panel-tree-actions";
 import { updateResources } from "store/resources/resources-actions";
-import { projectPanelColumns } from "views/project-panel/project-panel";
+import { projectPanelDataColumns } from "views/project-panel/project-panel-data";
 import { favoritePanelColumns } from "views/favorite-panel/favorite-panel";
 import { matchRootRoute } from "routes/routes";
 import {
@@ -134,7 +134,7 @@ export const loadWorkbench = () => async (dispatch: Dispatch, getState: () => Ro
     const { auth, router } = getState();
     const { user } = auth;
     if (user) {
-        dispatch(projectPanelActions.SET_COLUMNS({ columns: projectPanelColumns }));
+        dispatch(projectPanelDataActions.SET_COLUMNS({ columns: projectPanelDataColumns }));
         dispatch(favoritePanelActions.SET_COLUMNS({ columns: favoritePanelColumns }));
         dispatch(
             allProcessesPanelActions.SET_COLUMNS({
@@ -493,7 +493,7 @@ export const copyCollection = (data: CopyFormDialogData) => async (dispatch: Dis
             );
         }
     }
-    dispatch(projectPanelActions.REQUEST_ITEMS());
+    dispatch(projectPanelDataActions.REQUEST_ITEMS());
 };
 
 export const moveCollection =
index ecb0c96b73bf49229271d047c470195331652cfd..9791499d4b10b5536bc4eb623b7f931fe30f1911 100644 (file)
@@ -24,12 +24,12 @@ import { getResource } from 'store/resources/resources';
 import { ProjectResource } from 'models/project';
 import { UserResource } from 'models/user';
 import { getWorkflowInputs, parseWorkflowDefinition } from 'models/workflow';
-import { ContextMenuResource } from 'store/context-menu/context-menu-actions'; 
+import { ContextMenuResource } from 'store/context-menu/context-menu-actions';
 import { dialogActions } from 'store/dialog/dialog-actions';
 import { ResourceKind, Resource } from 'models/resource';
 import { selectedToArray } from "components/multiselect-toolbar/MultiselectToolbar";
 import { CommonResourceServiceError, getCommonResourceServiceError } from "services/common-service/common-resource-service";
-import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
+import { projectPanelDataActions } from "store/project-panel/project-panel-action-bind";
 
 export const WORKFLOW_PANEL_ID = "workflowPanel";
 const UUID_PREFIX_PROPERTY_NAME = 'uuidPrefix';
@@ -57,7 +57,7 @@ export const openRunProcess = (workflowUuid: string, ownerUuid?: string, name?:
     async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
         const response = await services.workflowService.list();
         dispatch(runProcessPanelActions.SET_WORKFLOWS(response.items));
-        
+
         const workflows = getState().runProcessPanel.searchWorkflows;
         const listedWorkflow = workflows.find(workflow => workflow.uuid === workflowUuid);
         const workflow = listedWorkflow || await services.workflowService.get(workflowUuid);
@@ -168,7 +168,7 @@ export const removeWorkflowPermanently = (uuid: string, ownerUuid?: string) => a
         try {
             dispatch(snackbarActions.OPEN_SNACKBAR({ message: "Removing ...", kind: SnackbarKind.INFO }));
             await services.workflowService.delete(workflow.uuid);
-            dispatch(projectPanelActions.REQUEST_ITEMS());
+            dispatch(projectPanelDataActions.REQUEST_ITEMS());
             dispatch(snackbarActions.OPEN_SNACKBAR({ message: "Removed.", hideDuration: 2000, kind: SnackbarKind.SUCCESS }));
         } catch (e) {
             const error = getCommonResourceServiceError(e);
@@ -179,4 +179,4 @@ export const removeWorkflowPermanently = (uuid: string, ownerUuid?: string) => a
             }
         }
     }
-};
\ No newline at end of file
+};
diff --git a/services/workbench2/src/views/project-panel/project-panel-data.tsx b/services/workbench2/src/views/project-panel/project-panel-data.tsx
new file mode 100644 (file)
index 0000000..ed127f2
--- /dev/null
@@ -0,0 +1,198 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import React from "react";
+import { ProjectIcon } from "components/icon/icon";
+import { PROJECT_PANEL_DATA_ID } from "store/project-panel/project-panel-action-bind";
+import { DataColumns } from 'components/data-table/data-table';
+import { DataExplorer } from "views-components/data-explorer/data-explorer";
+import { ProjectResource } from 'models/project';
+import { SortDirection } from "components/data-table/data-column";
+import { createTree } from "models/tree";
+import { ContainerRunTime, ResourceContainerUuid, ResourceCreatedAtDate, ResourceDeleteDate, ResourceFileCount, ResourceFileSize, ResourceLastModifiedDate, ResourceLogUuid, ResourceModifiedByUserUuid, ResourceName, ResourceOutputUuid, ResourceOwnerWithName, ResourceParentProcess, ResourcePortableDataHash, ResourceStatus, ResourceTrashDate, ResourceType, ResourceUUID, ResourceVersion } from "views-components/data-explorer/renderers";
+import { getInitialProcessStatusFilters, getInitialResourceTypeFilters } from "store/resource-type-filters/resource-type-filters";
+
+export enum ProjectPanelDataColumnNames {
+    NAME = 'Name',
+    STATUS = 'Status',
+    TYPE = 'Type',
+    OWNER = 'Owner',
+    PORTABLE_DATA_HASH = 'Portable Data Hash',
+    FILE_SIZE = 'File Size',
+    FILE_COUNT = 'File Count',
+    UUID = 'UUID',
+    CONTAINER_UUID = 'Container UUID',
+    RUNTIME = 'Runtime',
+    OUTPUT_UUID = 'Output UUID',
+    LOG_UUID = 'Log UUID',
+    PARENT_PROCESS = 'Parent Process UUID',
+    MODIFIED_BY_USER_UUID = 'Modified by User UUID',
+    VERSION = 'Version',
+    CREATED_AT = 'Date Created',
+    LAST_MODIFIED = 'Last Modified',
+    TRASH_AT = 'Trash at',
+    DELETE_AT = 'Delete at',
+}
+
+export const projectPanelDataColumns: DataColumns<string, ProjectResource> = [
+    {
+        name: ProjectPanelDataColumnNames.NAME,
+        selected: true,
+        configurable: true,
+        sort: { direction: SortDirection.NONE, field: 'name' },
+        filters: createTree(),
+        render: (uuid) => <ResourceName uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.STATUS,
+        selected: true,
+        configurable: true,
+        mutuallyExclusiveFilters: true,
+        filters: getInitialProcessStatusFilters(),
+        render: (uuid) => <ResourceStatus uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.TYPE,
+        selected: true,
+        configurable: true,
+        filters: getInitialResourceTypeFilters(),
+        render: (uuid) => <ResourceType uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.OWNER,
+        selected: false,
+        configurable: true,
+        filters: createTree(),
+        render: (uuid) => <ResourceOwnerWithName uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.PORTABLE_DATA_HASH,
+        selected: false,
+        configurable: true,
+        filters: createTree(),
+        render: (uuid) => <ResourcePortableDataHash uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.FILE_SIZE,
+        selected: true,
+        configurable: true,
+        filters: createTree(),
+        render: (uuid) => <ResourceFileSize uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.FILE_COUNT,
+        selected: false,
+        configurable: true,
+        filters: createTree(),
+        render: (uuid) => <ResourceFileCount uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.UUID,
+        selected: false,
+        configurable: true,
+        filters: createTree(),
+        render: (uuid) => <ResourceUUID uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.CONTAINER_UUID,
+        selected: false,
+        configurable: true,
+        filters: createTree(),
+        render: (uuid) => <ResourceContainerUuid uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.RUNTIME,
+        selected: false,
+        configurable: true,
+        filters: createTree(),
+        render: (uuid) => <ContainerRunTime uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.OUTPUT_UUID,
+        selected: false,
+        configurable: true,
+        filters: createTree(),
+        render: (uuid) => <ResourceOutputUuid uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.LOG_UUID,
+        selected: false,
+        configurable: true,
+        filters: createTree(),
+        render: (uuid) => <ResourceLogUuid uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.PARENT_PROCESS,
+        selected: false,
+        configurable: true,
+        filters: createTree(),
+        render: (uuid) => <ResourceParentProcess uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.MODIFIED_BY_USER_UUID,
+        selected: false,
+        configurable: true,
+        filters: createTree(),
+        render: (uuid) => <ResourceModifiedByUserUuid uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.VERSION,
+        selected: false,
+        configurable: true,
+        filters: createTree(),
+        render: (uuid) => <ResourceVersion uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.CREATED_AT,
+        selected: false,
+        configurable: true,
+        sort: { direction: SortDirection.NONE, field: 'createdAt' },
+        filters: createTree(),
+        render: (uuid) => <ResourceCreatedAtDate uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.LAST_MODIFIED,
+        selected: true,
+        configurable: true,
+        sort: { direction: SortDirection.DESC, field: 'modifiedAt' },
+        filters: createTree(),
+        render: (uuid) => <ResourceLastModifiedDate uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.TRASH_AT,
+        selected: false,
+        configurable: true,
+        sort: { direction: SortDirection.NONE, field: 'trashAt' },
+        filters: createTree(),
+        render: (uuid) => <ResourceTrashDate uuid={uuid} />,
+    },
+    {
+        name: ProjectPanelDataColumnNames.DELETE_AT,
+        selected: false,
+        configurable: true,
+        sort: { direction: SortDirection.NONE, field: 'deleteAt' },
+        filters: createTree(),
+        render: (uuid) => <ResourceDeleteDate uuid={uuid} />,
+    },
+];
+
+const DEFAULT_VIEW_MESSAGES = ['No data found'];
+
+export const ProjectPanelData = class extends React.Component {
+    handleRowClick = () => {};
+    handleRowDoubleClick = () => {};
+    handleContextMenu = () => {};
+
+    render () {
+        return <DataExplorer
+            id={PROJECT_PANEL_DATA_ID}
+            onRowClick={this.handleRowClick}
+            onRowDoubleClick={this.handleRowDoubleClick}
+            onContextMenu={this.handleContextMenu}
+            contextMenuColumn={true}
+            defaultViewIcon={ProjectIcon}
+            defaultViewMessages={DEFAULT_VIEW_MESSAGES}
+        />;
+    }
+};
index 3d64f6517abdcd2e64faa389e987bab1e193a643..c77858cd0c9288c84fd1ef452be75cea8e2c4c91 100644 (file)
@@ -7,36 +7,8 @@ import withStyles from '@material-ui/core/styles/withStyles';
 import { DispatchProp, connect } from 'react-redux';
 import { RouteComponentProps } from 'react-router';
 import { StyleRulesCallback, WithStyles } from '@material-ui/core';
-
-import { DataExplorer } from 'views-components/data-explorer/data-explorer';
-import { DataColumns } from 'components/data-table/data-table';
 import { RootState } from 'store/store';
-import { DataTableFilterItem } from 'components/data-table-filters/data-table-filters';
-import { ContainerRequestState } from 'models/container-request';
-import { SortDirection } from 'components/data-table/data-column';
-import { ResourceKind, Resource } from 'models/resource';
-import {
-    ResourceName,
-    ProcessStatus as ResourceStatus,
-    ResourceType,
-    ResourceOwnerWithName,
-    ResourcePortableDataHash,
-    ResourceFileSize,
-    ResourceFileCount,
-    ResourceUUID,
-    ResourceContainerUuid,
-    ContainerRunTime,
-    ResourceOutputUuid,
-    ResourceLogUuid,
-    ResourceParentProcess,
-    ResourceModifiedByUserUuid,
-    ResourceVersion,
-    ResourceCreatedAtDate,
-    ResourceLastModifiedDate,
-    ResourceTrashDate,
-    ResourceDeleteDate,
-} from 'views-components/data-explorer/renderers';
-import { ProjectIcon } from 'components/icon/icon';
+import { Resource } from 'models/resource';
 import { ResourcesState, getResource } from 'store/resources/resources';
 import { loadDetailsPanel } from 'store/details-panel/details-panel-action';
 import { openContextMenu, resourceUuidToContextMenuKind } from 'store/context-menu/context-menu-actions';
@@ -44,17 +16,14 @@ import { navigateTo } from 'store/navigation/navigation-action';
 import { getProperty } from 'store/properties/properties';
 import { PROJECT_PANEL_CURRENT_UUID } from 'store/project-panel/project-panel-action';
 import { ArvadosTheme } from 'common/custom-theme';
-import { createTree } from 'models/tree';
-import { getInitialResourceTypeFilters, getInitialProcessStatusFilters } from 'store/resource-type-filters/resource-type-filters';
 import { GroupContentsResource } from 'services/groups-service/groups-service';
 import { GroupClass, GroupResource } from 'models/group';
 import { CollectionResource } from 'models/collection';
 import { resourceIsFrozen } from 'common/frozen-resources';
-import { ProjectResource } from 'models/project';
 import { deselectAllOthers, toggleOne } from 'store/multiselect/multiselect-actions';
 import { DetailsCardRoot } from 'views-components/details-card/details-card-root';
 import { MPVContainer, MPVPanelContent, MPVPanelState } from 'components/multi-panel-view/multi-panel-view';
-import { PROJECT_PANEL_ID } from 'store/project-panel/project-panel-action-bind';
+import { ProjectPanelData } from './project-panel-data';
 
 type CssRules = 'root' | 'button' | 'mpvRoot' | 'dataExplorer';
 
@@ -75,178 +44,8 @@ const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
     },
 });
 
-export enum ProjectPanelColumnNames {
-    NAME = 'Name',
-    STATUS = 'Status',
-    TYPE = 'Type',
-    OWNER = 'Owner',
-    PORTABLE_DATA_HASH = 'Portable Data Hash',
-    FILE_SIZE = 'File Size',
-    FILE_COUNT = 'File Count',
-    UUID = 'UUID',
-    CONTAINER_UUID = 'Container UUID',
-    RUNTIME = 'Runtime',
-    OUTPUT_UUID = 'Output UUID',
-    LOG_UUID = 'Log UUID',
-    PARENT_PROCESS = 'Parent Process UUID',
-    MODIFIED_BY_USER_UUID = 'Modified by User UUID',
-    VERSION = 'Version',
-    CREATED_AT = 'Date Created',
-    LAST_MODIFIED = 'Last Modified',
-    TRASH_AT = 'Trash at',
-    DELETE_AT = 'Delete at',
-}
-
-export interface ProjectPanelFilter extends DataTableFilterItem {
-    type: ResourceKind | ContainerRequestState;
-}
-
-export const projectPanelColumns: DataColumns<string, ProjectResource> = [
-    {
-        name: ProjectPanelColumnNames.NAME,
-        selected: true,
-        configurable: true,
-        sort: { direction: SortDirection.NONE, field: 'name' },
-        filters: createTree(),
-        render: (uuid) => <ResourceName uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.STATUS,
-        selected: true,
-        configurable: true,
-        mutuallyExclusiveFilters: true,
-        filters: getInitialProcessStatusFilters(),
-        render: (uuid) => <ResourceStatus uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.TYPE,
-        selected: true,
-        configurable: true,
-        filters: getInitialResourceTypeFilters(),
-        render: (uuid) => <ResourceType uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.OWNER,
-        selected: false,
-        configurable: true,
-        filters: createTree(),
-        render: (uuid) => <ResourceOwnerWithName uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.PORTABLE_DATA_HASH,
-        selected: false,
-        configurable: true,
-        filters: createTree(),
-        render: (uuid) => <ResourcePortableDataHash uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.FILE_SIZE,
-        selected: true,
-        configurable: true,
-        filters: createTree(),
-        render: (uuid) => <ResourceFileSize uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.FILE_COUNT,
-        selected: false,
-        configurable: true,
-        filters: createTree(),
-        render: (uuid) => <ResourceFileCount uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.UUID,
-        selected: false,
-        configurable: true,
-        filters: createTree(),
-        render: (uuid) => <ResourceUUID uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.CONTAINER_UUID,
-        selected: false,
-        configurable: true,
-        filters: createTree(),
-        render: (uuid) => <ResourceContainerUuid uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.RUNTIME,
-        selected: false,
-        configurable: true,
-        filters: createTree(),
-        render: (uuid) => <ContainerRunTime uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.OUTPUT_UUID,
-        selected: false,
-        configurable: true,
-        filters: createTree(),
-        render: (uuid) => <ResourceOutputUuid uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.LOG_UUID,
-        selected: false,
-        configurable: true,
-        filters: createTree(),
-        render: (uuid) => <ResourceLogUuid uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.PARENT_PROCESS,
-        selected: false,
-        configurable: true,
-        filters: createTree(),
-        render: (uuid) => <ResourceParentProcess uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.MODIFIED_BY_USER_UUID,
-        selected: false,
-        configurable: true,
-        filters: createTree(),
-        render: (uuid) => <ResourceModifiedByUserUuid uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.VERSION,
-        selected: false,
-        configurable: true,
-        filters: createTree(),
-        render: (uuid) => <ResourceVersion uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.CREATED_AT,
-        selected: false,
-        configurable: true,
-        sort: { direction: SortDirection.NONE, field: 'createdAt' },
-        filters: createTree(),
-        render: (uuid) => <ResourceCreatedAtDate uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.LAST_MODIFIED,
-        selected: true,
-        configurable: true,
-        sort: { direction: SortDirection.DESC, field: 'modifiedAt' },
-        filters: createTree(),
-        render: (uuid) => <ResourceLastModifiedDate uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.TRASH_AT,
-        selected: false,
-        configurable: true,
-        sort: { direction: SortDirection.NONE, field: 'trashAt' },
-        filters: createTree(),
-        render: (uuid) => <ResourceTrashDate uuid={uuid} />,
-    },
-    {
-        name: ProjectPanelColumnNames.DELETE_AT,
-        selected: false,
-        configurable: true,
-        sort: { direction: SortDirection.NONE, field: 'deleteAt' },
-        filters: createTree(),
-        render: (uuid) => <ResourceDeleteDate uuid={uuid} />,
-    },
-];
-
-const DEFAULT_VIEW_MESSAGES = ['Your project is empty.', 'Please create a project or create a collection and upload a data.'];
-
 const panelsData: MPVPanelState[] = [
-    { name: "Subprojects", visible: true },
+    { name: "Data", visible: true },
 ];
 
 interface ProjectPanelDataProps {
@@ -293,15 +92,7 @@ export const ProjectPanel = withStyles(styles)(
                             xs="auto"
                             data-cy="process-details"
                             className={classes.dataExplorer}>
-                            <DataExplorer
-                                id={PROJECT_PANEL_ID}
-                                onRowClick={this.handleRowClick}
-                                onRowDoubleClick={this.handleRowDoubleClick}
-                                onContextMenu={this.handleContextMenu}
-                                contextMenuColumn={true}
-                                defaultViewIcon={ProjectIcon}
-                                defaultViewMessages={DEFAULT_VIEW_MESSAGES}
-                            />
+                            <ProjectPanelData />
                         </MPVPanelContent>
                     </MPVContainer>
                 </div>
index 1b74b11f3fa665601fdf75d4aa9fc7b808623242..b7a55b568322e2648bee85b35cf09cc2ee7d9536 100644 (file)
@@ -12,7 +12,7 @@ import { loadProcess } from "store/processes/processes-actions";
 import { getProcess, getSubprocesses } from "store/processes/process";
 import { LogEventType } from "models/log";
 import { subprocessPanelActions } from "store/subprocess-panel/subprocess-panel-actions";
-import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
+import { projectPanelDataActions } from "store/project-panel/project-panel-action-bind";
 import { getProjectPanelCurrentUuid } from "store/project-panel/project-panel-action";
 import { allProcessesPanelActions } from "store/all-processes-panel/all-processes-panel-action";
 import { loadCollection } from "store/workbench/workbench-actions";
@@ -66,7 +66,7 @@ const messageListener = (store: RootStore) => (message: ResourceEventMessage) =>
                     store.dispatch(allProcessesPanelActions.REQUEST_ITEMS(false, true));
                 }
                 if (matchProjectRoute(location) && message.objectOwnerUuid === getProjectPanelCurrentUuid(state)) {
-                    store.dispatch(projectPanelActions.REQUEST_ITEMS(false, true));
+                    store.dispatch(projectPanelDataActions.REQUEST_ITEMS(false, true));
                 }
                 return;
             default: