name: string;
selected: boolean;
configurable: boolean;
- sortDirection: SortDirection;
+ sortDirection?: SortDirection;
filters: F[];
render: (item: T) => React.ReactElement<any>;
renderHeader?: () => React.ReactElement<any>;
import { ArvadosTheme } from '~/common/custom-theme';
import { Typography, Switch } from '@material-ui/core';
-type CssRules = 'container' | 'label' | 'value' | 'switch';
+type CssRules = 'container' | 'label' | 'value';
const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
container: {
display: 'flex',
+ alignItems: 'center',
+ height: '20px'
},
label: {
width: '86px',
value: {
width: '24px',
paddingLeft: theme.spacing.unit,
- },
- switch: {
- height: '20px',
- '& span:first-child': {
- height: '18px'
- }
}
});
<div className={classes.container} >
<Typography component="span" className={classes.label}>{label}:</Typography>
<Typography component="span" className={classes.value}>{value}</Typography>
- {onToggle && <Switch classes={{ root: classes.switch }}
+ {onToggle && <Switch
checked={checked}
onChange={onToggle}
value={key}
import { collectionActionSet } from './views-components/context-menu/action-sets/collection-action-set';
import { collectionResourceActionSet } from './views-components/context-menu/action-sets/collection-resource-action-set';
import { processActionSet } from './views-components/context-menu/action-sets/process-action-set';
-import { addRouteChangeHandlers } from './routes/routes';
import { loadWorkbench } from './store/workbench/workbench-actions';
import { Routes } from '~/routes/routes';
import { trashActionSet } from "~/views-components/context-menu/action-sets/trash-action-set";
import { ServiceRepository } from '~/services/services';
import { initWebSocket } from '~/websocket/websocket';
import { Config } from '~/common/config';
+import { addRouteChangeHandlers } from './routes/route-change-handlers';
const getBuildNumber = () => "BN-" + (process.env.REACT_APP_BUILD_NUMBER || "dev");
const getGitCommit = () => "GIT-" + (process.env.REACT_APP_GIT_COMMIT || "latest").substr(0, 7);
--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { History, Location } from 'history';
+import { RootStore } from '~/store/store';
+import { matchProcessRoute, matchProcessLogRoute, matchProjectRoute, matchCollectionRoute, matchFavoritesRoute, matchTrashRoute } from './routes';
+import { loadProject, loadCollection, loadFavorites, loadTrash, loadProcess, loadProcessLog } from '~/store/workbench/workbench-actions';
+
+export const addRouteChangeHandlers = (history: History, store: RootStore) => {
+ const handler = handleLocationChange(store);
+ handler(history.location);
+ history.listen(handler);
+};
+
+const handleLocationChange = (store: RootStore) => ({ pathname }: Location) => {
+ const projectMatch = matchProjectRoute(pathname);
+ const collectionMatch = matchCollectionRoute(pathname);
+ const favoriteMatch = matchFavoritesRoute(pathname);
+ const trashMatch = matchTrashRoute(pathname);
+ const processMatch = matchProcessRoute(pathname);
+ const processLogMatch = matchProcessLogRoute(pathname);
+
+ if (projectMatch) {
+ store.dispatch(loadProject(projectMatch.params.id));
+ } else if (collectionMatch) {
+ store.dispatch(loadCollection(collectionMatch.params.id));
+ } else if (favoriteMatch) {
+ store.dispatch(loadFavorites());
+ } else if (trashMatch) {
+ store.dispatch(loadTrash());
+ } else if (processMatch) {
+ store.dispatch(loadProcess(processMatch.params.id));
+ } else if (processLogMatch) {
+ store.dispatch(loadProcessLog(processLogMatch.params.id));
+ }
+};
//
// SPDX-License-Identifier: AGPL-3.0
-import { History, Location } from 'history';
-import { RootStore } from '~/store/store';
import { matchPath } from 'react-router';
import { ResourceKind, RESOURCE_UUID_PATTERN, extractUuidKind } from '~/models/resource';
import { getProjectUrl } from '~/models/project';
import { getCollectionUrl } from '~/models/collection';
-import { loadProject, loadFavorites, loadCollection, loadTrash, loadProcessLog } from '~/store/workbench/workbench-actions';
-import { loadProcessPanel } from '~/store/process-panel/process-panel-actions';
export const Routes = {
ROOT: '/',
export const getProcessLogUrl = (uuid: string) => `/process-logs/${uuid}`;
-export const addRouteChangeHandlers = (history: History, store: RootStore) => {
- const handler = handleLocationChange(store);
- handler(history.location);
- history.listen(handler);
-};
-
export interface ResourceRouteParams {
id: string;
}
export const matchProcessLogRoute = (route: string) =>
matchPath<ResourceRouteParams>(route, { path: Routes.PROCESS_LOGS });
-
-const handleLocationChange = (store: RootStore) => ({ pathname }: Location) => {
- const projectMatch = matchProjectRoute(pathname);
- const collectionMatch = matchCollectionRoute(pathname);
- const favoriteMatch = matchFavoritesRoute(pathname);
- const trashMatch = matchTrashRoute(pathname);
- const processMatch = matchProcessRoute(pathname);
- const processLogMatch = matchProcessLogRoute(pathname);
-
- if (projectMatch) {
- store.dispatch(loadProject(projectMatch.params.id));
- } else if (collectionMatch) {
- store.dispatch(loadCollection(collectionMatch.params.id));
- } else if (favoriteMatch) {
- store.dispatch(loadFavorites());
- } else if (trashMatch) {
- store.dispatch(loadTrash());
- } else if (processMatch) {
- store.dispatch(loadProcessPanel(processMatch.params.id));
- } else if (processLogMatch) {
- store.dispatch(loadProcessLog(processLogMatch.params.id));
- }
-};
import { TreePicker } from '../tree-picker/tree-picker';
import { getSidePanelTreeBranch } from '../side-panel-tree/side-panel-tree-actions';
import { propertiesActions } from '../properties/properties-actions';
+import { getProcess } from '~/store/processes/process';
export const BREADCRUMBS = 'breadcrumbs';
dispatch<any>(setProjectBreadcrumbs(collection.ownerUuid));
}
};
+export const setProcessBreadcrumbs = (processUuid: string) =>
+ (dispatch: Dispatch, getState: () => RootState) => {
+ const { resources } = getState();
+ const process = getProcess(processUuid)(resources);
+ if (process) {
+ dispatch<any>(setProjectBreadcrumbs(process.containerRequest.ownerUuid));
+ }
+ };
import { ProjectResource } from '~/models/project';
import { UserResource } from '~/models/user';
import { isSidePanelTreeCategory } from '~/store/side-panel-tree/side-panel-tree-actions';
-import { extractUuidKind, ResourceKind, TrashableResource } from '~/models/resource';
+import { extractUuidKind, ResourceKind } from '~/models/resource';
+import { matchProcessRoute } from '~/routes/routes';
export const contextMenuActions = unionize({
OPEN_CONTEXT_MENU: ofType<{ position: ContextMenuPosition, resource: ContextMenuResource }>(),
(dispatch: Dispatch, getState: () => RootState) => {
const { location } = getState().router;
const pathname = location ? location.pathname : '';
- // ToDo: We get error from matchProcessRoute
- // const match = matchProcessRoute(pathname);
- // console.log('match: ', match);
- // const uuid = match ? match.params.id : '';
- const uuid = pathname.split('/').slice(-1)[0];
+ const match = matchProcessRoute(pathname);
+ const uuid = match ? match.params.id : '';
const resource = {
- uuid: '',
+ uuid,
ownerUuid: '',
kind: ResourceKind.PROCESS,
name: '',
import { resourcesActions } from "~/store/resources/resources-actions";
import { snackbarActions } from '~/store/snackbar/snackbar-actions';
import { getDataExplorer } from "~/store/data-explorer/data-explorer-reducer";
+import { loadMissingProcessesInformation } from "~/store/project-panel/project-panel-middleware-service";
export class FavoritePanelMiddlewareService extends DataExplorerMiddlewareService {
constructor(private services: ServiceRepository, id: string) {
super(id);
}
- requestItems(api: MiddlewareAPI<Dispatch, RootState>) {
+ async requestItems(api: MiddlewareAPI<Dispatch, RootState>) {
const dataExplorer = getDataExplorer(api.getState().dataExplorer, this.getId());
if (!dataExplorer) {
api.dispatch(favoritesPanelDataExplorerIsNotSet());
- } else {
+ } else {
const columns = dataExplorer.columns as DataColumns<string, FavoritePanelFilter>;
const sortColumn = dataExplorer.columns.find(c => c.sortDirection !== SortDirection.NONE);
.addOrder(direction, "name", GroupContentsResourcePrefix.PROCESS)
.addOrder(direction, "name", GroupContentsResourcePrefix.PROJECT);
}
-
- this.services.favoriteService
- .list(this.services.authService.getUuid()!, {
- limit: dataExplorer.rowsPerPage,
- offset: dataExplorer.page * dataExplorer.rowsPerPage,
- linkOrder: linkOrder.getOrder(),
- contentOrder: contentOrder.getOrder(),
- filters: new FilterBuilder()
- .addIsA("headUuid", typeFilters.map(filter => filter.type))
- .addILike("name", dataExplorer.searchValue)
- .getFilters()
- })
- .then(response => {
- api.dispatch(resourcesActions.SET_RESOURCES(response.items));
- api.dispatch(favoritePanelActions.SET_ITEMS({
- items: response.items.map(resource => resource.uuid),
- itemsAvailable: response.itemsAvailable,
- page: Math.floor(response.offset / response.limit),
- rowsPerPage: response.limit
- }));
- api.dispatch<any>(updateFavorites(response.items.map(item => item.uuid)));
- })
- .catch(() => {
- api.dispatch(favoritePanelActions.SET_ITEMS({
- items: [],
- itemsAvailable: 0,
- page: 0,
- rowsPerPage: dataExplorer.rowsPerPage
- }));
- });
+ try {
+ const response = await this.services.favoriteService
+ .list(this.services.authService.getUuid()!, {
+ limit: dataExplorer.rowsPerPage,
+ offset: dataExplorer.page * dataExplorer.rowsPerPage,
+ linkOrder: linkOrder.getOrder(),
+ contentOrder: contentOrder.getOrder(),
+ filters: new FilterBuilder()
+ .addIsA("headUuid", typeFilters.map(filter => filter.type))
+ .addILike("name", dataExplorer.searchValue)
+ .getFilters()
+ });
+ api.dispatch(resourcesActions.SET_RESOURCES(response.items));
+ await api.dispatch<any>(loadMissingProcessesInformation(response.items));
+ api.dispatch(favoritePanelActions.SET_ITEMS({
+ items: response.items.map(resource => resource.uuid),
+ itemsAvailable: response.itemsAvailable,
+ page: Math.floor(response.offset / response.limit),
+ rowsPerPage: response.limit
+ }));
+ api.dispatch<any>(updateFavorites(response.items.map(item => item.uuid)));
+ } catch (e) {
+ api.dispatch(favoritePanelActions.SET_ITEMS({
+ items: [],
+ itemsAvailable: 0,
+ page: 0,
+ rowsPerPage: dataExplorer.rowsPerPage
+ }));
+ }
}
}
}
import { unionize, ofType, UnionOf } from "~/common/unionize";
import { loadProcess } from '~/store/processes/processes-actions';
import { Dispatch } from 'redux';
+import { ProcessStatus } from '~/store/processes/process';
export const procesPanelActions = unionize({
INIT_PROCESS_PANEL_FILTERS: ofType<string[]>(),
};
export const initProcessPanelFilters = procesPanelActions.INIT_PROCESS_PANEL_FILTERS([
- 'Queued',
- 'Complete',
- 'Active',
- 'Failed'
+ ProcessStatus.QUEUED,
+ ProcessStatus.COMPLETED,
+ ProcessStatus.FAILED,
+ ProcessStatus.RUNNING,
+ ProcessStatus.LOCKED,
+ ProcessStatus.CANCELLED
]);
//
// SPDX-License-Identifier: AGPL-3.0
-import { ContainerRequestResource } from '../../models/container-request';
-import { ContainerResource } from '../../models/container';
+import { ContainerRequestResource, ContainerRequestState } from '../../models/container-request';
+import { ContainerResource, ContainerState } from '../../models/container';
import { ResourcesState, getResource } from '~/store/resources/resources';
import { filterResources } from '../resources/resources';
-import { ResourceKind, Resource } from '~/models/resource';
+import { ResourceKind, Resource, extractUuidKind } from '~/models/resource';
import { getTimeDiff } from '~/common/formatters';
import { ArvadosTheme } from '~/common/custom-theme';
-import { groupBy } from 'lodash';
export interface Process {
containerRequest: ContainerRequestResource;
container?: ContainerResource;
}
-enum ProcessStatus {
- ACTIVE = 'Active',
- COMPLETED = 'Complete',
- QUEUED = 'Queued',
+export enum ProcessStatus {
+ CANCELLED = 'Cancelled',
+ COMPLETED = 'Completed',
+ DRAFT = 'Draft',
FAILED = 'Failed',
- CANCELED = 'Canceled'
+ LOCKED = 'Locked',
+ QUEUED = 'Queued',
+ RUNNING = 'Running',
+ UNKNOWN = 'Unknown',
}
export const getProcess = (uuid: string) => (resources: ResourcesState): Process | undefined => {
- const containerRequest = getResource<ContainerRequestResource>(uuid)(resources);
- if (containerRequest) {
- if (containerRequest.containerUuid) {
- const container = getResource<ContainerResource>(containerRequest.containerUuid)(resources);
- if (container) {
- return { containerRequest, container };
+ if (extractUuidKind(uuid) === ResourceKind.CONTAINER_REQUEST) {
+ const containerRequest = getResource<ContainerRequestResource>(uuid)(resources);
+ if (containerRequest) {
+ if (containerRequest.containerUuid) {
+ const container = getResource<ContainerResource>(containerRequest.containerUuid)(resources);
+ if (container) {
+ return { containerRequest, container };
+ }
}
+ return { containerRequest };
}
- return { containerRequest };
}
return;
};
export const getProcessStatusColor = (status: string, { customs }: ArvadosTheme) => {
switch (status) {
+ case ProcessStatus.RUNNING:
+ return customs.colors.blue500;
case ProcessStatus.COMPLETED:
return customs.colors.green700;
- case ProcessStatus.CANCELED:
- return customs.colors.red900;
- case ProcessStatus.QUEUED:
- return customs.colors.grey500;
+ case ProcessStatus.CANCELLED:
case ProcessStatus.FAILED:
return customs.colors.red900;
- case ProcessStatus.ACTIVE:
- return customs.colors.blue500;
default:
return customs.colors.grey500;
}
};
-export const getProcessStatus = (process: Process) =>
- process.container
- ? process.container.state
- : process.containerRequest.state;
+export const getProcessStatus = ({ containerRequest, container }: Process): ProcessStatus => {
+ switch (true) {
+ case containerRequest.state === ContainerRequestState.UNCOMMITTED:
+ return ProcessStatus.DRAFT;
+
+ case containerRequest.priority === 0:
+ case container && container.state === ContainerState.CANCELLED:
+ return ProcessStatus.CANCELLED;
+
+ case container && container.state === ContainerState.QUEUED:
+ return ProcessStatus.QUEUED;
+
+ case container && container.state === ContainerState.LOCKED:
+ return ProcessStatus.LOCKED;
+
+ case container && container.state === ContainerState.RUNNING:
+ return ProcessStatus.RUNNING;
+
+ case container && container.state === ContainerState.COMPLETE && container.exitCode === 0:
+ return ProcessStatus.COMPLETED;
+
+ case container && container.state === ContainerState.COMPLETE && container.exitCode !== 0:
+ return ProcessStatus.FAILED;
+
+ default:
+ return ProcessStatus.UNKNOWN;
+ }
+};
const isSubprocess = (containerUuid: string) => (resource: Resource) =>
resource.kind === ResourceKind.CONTAINER_REQUEST
import { snackbarActions } from '../snackbar/snackbar-actions';
import { DataExplorer, getDataExplorer } from '../data-explorer/data-explorer-reducer';
import { ListResults } from '~/services/common-service/common-resource-service';
+import { loadContainers } from '../processes/processes-actions';
+import { ResourceKind } from '~/models/resource';
export class ProjectPanelMiddlewareService extends DataExplorerMiddlewareService {
constructor(private services: ServiceRepository, id: string) {
const response = await this.services.groupsService.contents(projectUuid, getParams(dataExplorer));
api.dispatch<any>(updateFavorites(response.items.map(item => item.uuid)));
api.dispatch(updateResources(response.items));
+ await api.dispatch<any>(loadMissingProcessesInformation(response.items));
api.dispatch(setItems(response));
} catch (e) {
api.dispatch(couldNotFetchProjectContents());
}
}
+export const loadMissingProcessesInformation = (resources: GroupContentsResource[]) =>
+ async (dispatch: Dispatch) => {
+ const containerUuids = resources.reduce((uuids, resource) => {
+ return resource.kind === ResourceKind.CONTAINER_REQUEST
+ ? resource.containerUuid
+ ? [...uuids, resource.containerUuid]
+ : uuids
+ : uuids;
+ }, []);
+ if (containerUuids.length > 0) {
+ await dispatch<any>(loadContainers(
+ new FilterBuilder().addIn('uuid', containerUuids).getFilters()
+ ));
+ }
+ };
+
const setItems = (listResults: ListResults<GroupContentsResource>) =>
projectPanelActions.SET_ITEMS({
...listResultsToDataExplorerItemsMeta(listResults),
const statusFilters = getDataExplorerColumnFilters(columns, ProjectPanelColumnNames.STATUS);
return new FilterBuilder()
.addIsA("uuid", typeFilters.map(f => f.type))
- .addIn("state", statusFilters.map(f => f.type), GroupContentsResourcePrefix.PROCESS)
.addILike("name", dataExplorer.searchValue, GroupContentsResourcePrefix.COLLECTION)
.addILike("name", dataExplorer.searchValue, GroupContentsResourcePrefix.PROCESS)
.addILike("name", dataExplorer.searchValue, GroupContentsResourcePrefix.PROJECT)
import { projectPanelColumns } from '~/views/project-panel/project-panel';
import { favoritePanelColumns } from '~/views/favorite-panel/favorite-panel';
import { matchRootRoute } from '~/routes/routes';
-import { setCollectionBreadcrumbs, setProjectBreadcrumbs, setSidePanelBreadcrumbs } from '../breadcrumbs/breadcrumbs-actions';
+import { setCollectionBreadcrumbs, setProjectBreadcrumbs, setSidePanelBreadcrumbs, setProcessBreadcrumbs } from '../breadcrumbs/breadcrumbs-actions';
import { navigateToProject } from '../navigation/navigation-action';
import { MoveToFormDialogData } from '~/store/move-to-dialog/move-to-dialog';
import { ServiceRepository } from '~/services/services';
import * as collectionUpdateActions from '~/store/collections/collection-update-actions';
import * as collectionMoveActions from '~/store/collections/collection-move-actions';
import * as processesActions from '../processes/processes-actions';
-import { getProcess } from '../processes/process';
import { trashPanelColumns } from "~/views/trash-panel/trash-panel";
import { loadTrashPanel, trashPanelActions } from "~/store/trash-panel/trash-panel-action";
import { initProcessLogsPanel } from '../process-logs-panel/process-logs-panel-actions';
+import { loadProcessPanel } from '~/store/process-panel/process-panel-actions';
export const loadWorkbench = () =>
export const loadProcess = (uuid: string) =>
async (dispatch: Dispatch, getState: () => RootState) => {
- await dispatch<any>(processesActions.loadProcess(uuid));
- const process = getProcess(uuid)(getState().resources);
- if (process) {
- await dispatch<any>(activateSidePanelTreeItem(process.containerRequest.ownerUuid));
- dispatch<any>(setCollectionBreadcrumbs(process.containerRequest.ownerUuid));
- dispatch(loadDetailsPanel(uuid));
- }
+ dispatch<any>(loadProcessPanel(uuid));
+ const process = await dispatch<any>(processesActions.loadProcess(uuid));
+ await dispatch<any>(activateSidePanelTreeItem(process.containerRequest.ownerUuid));
+ dispatch<any>(setProcessBreadcrumbs(uuid));
+ dispatch(loadDetailsPanel(uuid));
+
};
export const loadProcessLog = (uuid: string) =>
async (dispatch: Dispatch) => {
+ const process = await dispatch<any>(processesActions.loadProcess(uuid));
+ await dispatch<any>(activateSidePanelTreeItem(process.containerRequest.ownerUuid));
+ dispatch<any>(setProcessBreadcrumbs(uuid));
dispatch<any>(initProcessLogsPanel(uuid));
};
// SPDX-License-Identifier: AGPL-3.0
import * as React from 'react';
-import { Grid, Typography } from '@material-ui/core';
+import { Grid, Typography, withStyles } from '@material-ui/core';
import { FavoriteStar } from '../favorite-star/favorite-star';
import { ResourceKind, TrashableResource } from '~/models/resource';
import { ProjectIcon, CollectionIcon, ProcessIcon, DefaultIcon } from '~/components/icon/icon';
import { RootState } from '~/store/store';
import { getResource } from '~/store/resources/resources';
import { GroupContentsResource } from '~/services/groups-service/groups-service';
-import { ProcessResource } from '~/models/process';
-
+import { getProcess, Process, getProcessStatus, getProcessStatusColor } from '~/store/processes/process';
+import { ArvadosTheme } from '~/common/custom-theme';
+import { compose } from 'redux';
export const renderName = (item: { name: string; uuid: string, kind: string }) =>
<Grid container alignItems="center" wrap="nowrap" spacing={16}>
return { type: resource ? resource.kind : '' };
})((props: { type: string }) => renderType(props.type));
-export const renderStatus = (item: { status?: string }) =>
- <Typography noWrap align="center" >
- {item.status || "-"}
- </Typography>;
-
-export const ProcessStatus = connect(
- (state: RootState, props: { uuid: string }) => {
- const resource = getResource<ProcessResource>(props.uuid)(state.resources);
- return { status: resource ? resource.state : '-' };
- })((props: { status: string }) => renderType(props.status));
+export const ProcessStatus = compose(
+ connect((state: RootState, props: { uuid: string }) => {
+ return { process: getProcess(props.uuid)(state.resources) };
+ }),
+ withStyles({}, { withTheme: true }))
+ ((props: { process?: Process, theme: ArvadosTheme }) => {
+ const status = props.process ? getProcessStatus(props.process) : "-";
+ return <Typography
+ noWrap
+ align="center"
+ style={{ color: getProcessStatusColor(status, props.theme) }} >
+ {status}
+ </Typography>;
+ });
name: "Status",
selected: true,
configurable: true,
- sortDirection: SortDirection.NONE,
- filters: [
- {
- name: ContainerRequestState.COMMITTED,
- selected: true,
- type: ContainerRequestState.COMMITTED
- },
- {
- name: ContainerRequestState.FINAL,
- selected: true,
- type: ContainerRequestState.FINAL
- },
- {
- name: ContainerRequestState.UNCOMMITTED,
- selected: true,
- type: ContainerRequestState.UNCOMMITTED
- }
- ],
+ filters: [],
render: uuid => <ProcessStatus uuid={uuid} />,
width: "75px"
},
name: FavoritePanelColumnNames.TYPE,
selected: true,
configurable: true,
- sortDirection: SortDirection.NONE,
filters: [
{
name: resourceLabel(ResourceKind.COLLECTION),
name: FavoritePanelColumnNames.OWNER,
selected: true,
configurable: true,
- sortDirection: SortDirection.NONE,
filters: [],
render: uuid => <ResourceOwner uuid={uuid} />,
width: "200px"
name: FavoritePanelColumnNames.FILE_SIZE,
selected: true,
configurable: true,
- sortDirection: SortDirection.NONE,
filters: [],
render: uuid => <ResourceFileSize uuid={uuid} />,
width: "50px"
export const ProcessPanelRoot = (props: ProcessPanelRootProps) =>
props.process
? <Grid container spacing={16} alignItems="stretch">
- <Grid item sm={12} md={7} alignItems="stretch">
+ <Grid item sm={12} md={7}>
<ProcessInformationCard
process={props.process}
onContextMenu={props.onContextMenu} />
<Grid item md={12} lg={6}/>
{
filters.map(filter =>
- <Grid item md={12} lg={6} key={filter.key} spacing={0} className={classes.gridFilter}>
+ <Grid item md={12} lg={6} key={filter.key} className={classes.gridFilter}>
<SubprocessFilter {...filter} onToggle={() => onToggle(filter.label)} />
</Grid>
)
name: "Status",
selected: true,
configurable: true,
- sortDirection: SortDirection.NONE,
- filters: [
- {
- name: ContainerRequestState.COMMITTED,
- selected: true,
- type: ContainerRequestState.COMMITTED
- },
- {
- name: ContainerRequestState.FINAL,
- selected: true,
- type: ContainerRequestState.FINAL
- },
- {
- name: ContainerRequestState.UNCOMMITTED,
- selected: true,
- type: ContainerRequestState.UNCOMMITTED
- }
- ],
+ filters: [],
render: uuid => <ProcessStatus uuid={uuid} />,
width: "75px"
},
name: ProjectPanelColumnNames.TYPE,
selected: true,
configurable: true,
- sortDirection: SortDirection.NONE,
filters: [
{
name: resourceLabel(ResourceKind.COLLECTION),
name: ProjectPanelColumnNames.OWNER,
selected: true,
configurable: true,
- sortDirection: SortDirection.NONE,
filters: [],
render: uuid => <ResourceOwner uuid={uuid} />,
width: "200px"
name: ProjectPanelColumnNames.FILE_SIZE,
selected: true,
configurable: true,
- sortDirection: SortDirection.NONE,
filters: [],
render: uuid => <ResourceFileSize uuid={uuid} />,
width: "50px"