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";
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 };
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";
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";
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) {
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 {
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) {
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";
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);
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) {
// 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);
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";
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);
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";
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";
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);
}
api.dispatch(setItems(response));
} catch (e) {
api.dispatch(
- projectPanelActions.SET_ITEMS({
+ projectPanelDataActions.SET_ITEMS({
items: [],
itemsAvailable: 0,
page: 0,
api.dispatch(couldNotFetchProjectContents());
}
} finally {
- if (!background) {
+ if (!background) {
api.dispatch(progressIndicatorActions.PERSIST_STOP_WORKING(this.getId()));
api.dispatch<any>(removeDisabledButton(ContextMenuActionNames.MOVE_TO_TRASH))
}
};
export const setItems = (listResults: ListResults<GroupContentsResource>) =>
- projectPanelActions.SET_ITEMS({
+ projectPanelDataActions.SET_ITEMS({
...listResultsToDataExplorerItemsMeta(listResults),
items: listResults.items.map(resource => resource.uuid),
});
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);
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";
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;
frozenByUuid: null,
});
- dispatch(projectPanelActions.REQUEST_ITEMS());
+ dispatch(projectPanelDataActions.REQUEST_ITEMS());
dispatch<any>(loadResource(uuid, false));
dispatch<any>(removeDisabledButton(ContextMenuActionNames.FREEZE_PROJECT))
return updatedProject;
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";
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));
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";
},
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;
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';
}
}
-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);
}
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;
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),
//
// 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';
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) {
}
};
+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),
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";
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));
thunkMiddleware.withExtraArgument(services),
authMiddleware(services),
tooltipsMiddleware(services),
- projectPanelMiddleware,
+ projectPanelDataMiddleware,
favoritePanelMiddleware,
allProcessessPanelMiddleware,
trashPanelMiddleware,
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";
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)
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";
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());
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({
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,
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 {
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({
);
}
}
- dispatch(projectPanelActions.REQUEST_ITEMS());
+ dispatch(projectPanelDataActions.REQUEST_ITEMS());
};
export const moveCollection =
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';
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);
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);
}
}
}
-};
\ No newline at end of file
+};
--- /dev/null
+// 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}
+ />;
+ }
+};
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';
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';
},
});
-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 {
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>
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";
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: