X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/0ba78ca92c70bf7196ed400a655aa2d625fe8475..5430c336b96cbb7c20bffa1cbdb8cffea32fb460:/src/store/breadcrumbs/breadcrumbs-actions.ts diff --git a/src/store/breadcrumbs/breadcrumbs-actions.ts b/src/store/breadcrumbs/breadcrumbs-actions.ts index 65b2870b..a7e42510 100644 --- a/src/store/breadcrumbs/breadcrumbs-actions.ts +++ b/src/store/breadcrumbs/breadcrumbs-actions.ts @@ -17,45 +17,41 @@ import { ResourceKind } from 'models/resource'; import { GroupResource } from 'models/group'; import { extractUuidKind } from 'models/resource'; import { UserResource } from 'models/user'; -import { containerRequestFieldsNoMounts } from 'store/all-processes-panel/all-processes-panel-middleware-service'; import { FilterBuilder } from 'services/api/filter-builder'; import { ProcessResource } from 'models/process'; import { OrderBuilder } from 'services/api/order-builder'; import { Breadcrumb } from 'components/breadcrumbs/breadcrumbs'; -import { ContainerRequestResource } from 'models/container-request'; -import { CollectionIcon, IconType, ProcessBreadcrumbIcon, ProjectIcon } from 'components/icon/icon'; +import { ContainerRequestResource, containerRequestFieldsNoMounts } from 'models/container-request'; +import { CollectionIcon, IconType, ProcessIcon, ProjectIcon, WorkflowIcon } from 'components/icon/icon'; import { CollectionResource } from 'models/collection'; +import { getSidePanelIcon } from 'views-components/side-panel-tree/side-panel-tree'; +import { WorkflowResource } from 'models/workflow'; export const BREADCRUMBS = 'breadcrumbs'; -export const setBreadcrumbs = (breadcrumbs: any, currentItem?: CollectionResource | ContainerRequestResource | GroupResource) => { +export const setBreadcrumbs = (breadcrumbs: any, currentItem?: CollectionResource | ContainerRequestResource | GroupResource | WorkflowResource) => { if (currentItem) { breadcrumbs.push(resourceToBreadcrumb(currentItem)); } return propertiesActions.SET_PROPERTY({ key: BREADCRUMBS, value: breadcrumbs }); }; -const resourceToBreadcrumbIcon = (resource: CollectionResource | ContainerRequestResource | GroupResource): IconType | undefined => { +const resourceToBreadcrumbIcon = (resource: CollectionResource | ContainerRequestResource | GroupResource | WorkflowResource): IconType | undefined => { switch (resource.kind) { case ResourceKind.PROJECT: return ProjectIcon; - break; - case ResourceKind.PROCESS: - return ProcessBreadcrumbIcon; - break; - + return ProcessIcon; case ResourceKind.COLLECTION: return CollectionIcon; - break; - + case ResourceKind.WORKFLOW: + return WorkflowIcon; default: return undefined; - break; } } -const resourceToBreadcrumb = (resource: CollectionResource | ContainerRequestResource | GroupResource) => ({ +const resourceToBreadcrumb = (resource: CollectionResource | ContainerRequestResource | GroupResource | WorkflowResource): Breadcrumb => ({ label: resource.name, uuid: resource.uuid, icon: resourceToBreadcrumbIcon(resource), @@ -65,7 +61,11 @@ const getSidePanelTreeBreadcrumbs = (uuid: string) => (treePicker: TreePicker): const nodes = getSidePanelTreeBranch(uuid)(treePicker); return nodes.map(node => typeof node.value === 'string' - ? { label: node.value, uuid: node.id } + ? { + label: node.value, + uuid: node.id, + icon: getSidePanelIcon(node.value) + } : resourceToBreadcrumb(node.value)); }; @@ -81,6 +81,8 @@ export const setSidePanelBreadcrumbs = (uuid: string) => const collectionItem = item ? item : await services.collectionService.get(currentUuid); const parentProcessItem = await getCollectionParent(collectionItem)(services); if (parentProcessItem) { + const mainProcessItem = await getProcessParent(parentProcessItem)(services); + mainProcessItem && breadcrumbs.push(resourceToBreadcrumb(mainProcessItem)); breadcrumbs.push(resourceToBreadcrumb(parentProcessItem)); } dispatch(setBreadcrumbs(breadcrumbs, collectionItem)); @@ -91,6 +93,9 @@ export const setSidePanelBreadcrumbs = (uuid: string) => breadcrumbs.push(resourceToBreadcrumb(parentProcessItem)); } dispatch(setBreadcrumbs(breadcrumbs, processItem)); + } else if (uuidKind === ResourceKind.WORKFLOW) { + const workflowItem = await services.workflowService.get(currentUuid); + dispatch(setBreadcrumbs(breadcrumbs, workflowItem)); } dispatch(setBreadcrumbs(breadcrumbs)); }; @@ -106,7 +111,11 @@ export const setCategoryBreadcrumbs = (uuid: string, category: string) => const ancestors = await services.ancestorsService.ancestors(uuid, ''); dispatch(updateResources(ancestors)); const initialBreadcrumbs: Breadcrumb[] = [ - { label: category, uuid: category } + { + label: category, + uuid: category, + icon: getSidePanelIcon(category) + } ]; const { collectionPanel: { item } } = getState(); const path = getState().router.location!.pathname; @@ -121,6 +130,8 @@ export const setCategoryBreadcrumbs = (uuid: string, category: string) => const collectionItem = item ? item : await services.collectionService.get(currentUuid); const parentProcessItem = await getCollectionParent(collectionItem)(services); if (parentProcessItem) { + const mainProcessItem = await getProcessParent(parentProcessItem)(services); + mainProcessItem && breadcrumbs.push(resourceToBreadcrumb(mainProcessItem)); breadcrumbs.push(resourceToBreadcrumb(parentProcessItem)); } dispatch(setBreadcrumbs(breadcrumbs, collectionItem)); @@ -131,6 +142,9 @@ export const setCategoryBreadcrumbs = (uuid: string, category: string) => breadcrumbs.push(resourceToBreadcrumb(parentProcessItem)); } dispatch(setBreadcrumbs(breadcrumbs, processItem)); + } else if (uuidKind === ResourceKind.WORKFLOW) { + const workflowItem = await services.workflowService.get(currentUuid); + dispatch(setBreadcrumbs(breadcrumbs, workflowItem)); } dispatch(setBreadcrumbs(breadcrumbs)); }; @@ -155,16 +169,22 @@ const getProcessParent = (childProcess: ContainerRequestResource) => const getCollectionParent = (collection: CollectionResource) => async (services: ServiceRepository): Promise => { - const parentProcesses = await services.containerRequestService.list({ + const parentOutputPromise = services.containerRequestService.list({ order: new OrderBuilder().addAsc('createdAt').getOrder(), filters: new FilterBuilder().addEqual('output_uuid', collection.uuid).getFilters(), select: containerRequestFieldsNoMounts, }); - if (parentProcesses.items.length > 0) { - return parentProcesses.items[0]; - } else { - return undefined; - } + const parentLogPromise = services.containerRequestService.list({ + order: new OrderBuilder().addAsc('createdAt').getOrder(), + filters: new FilterBuilder().addEqual('log_uuid', collection.uuid).getFilters(), + select: containerRequestFieldsNoMounts, + }); + const [parentOutput, parentLog] = await Promise.all([parentOutputPromise, parentLogPromise]); + return parentOutput.items.length > 0 ? + parentOutput.items[0] : + parentLog.items.length > 0 ? + parentLog.items[0] : + undefined; } @@ -190,7 +210,11 @@ export const setProcessBreadcrumbs = (processUuid: string) => }; export const setGroupsBreadcrumbs = () => - setBreadcrumbs([{ label: SidePanelTreeCategory.GROUPS }]); + setBreadcrumbs([{ + label: SidePanelTreeCategory.GROUPS, + uuid: SidePanelTreeCategory.GROUPS, + icon: getSidePanelIcon(SidePanelTreeCategory.GROUPS) + }]); export const setGroupDetailsBreadcrumbs = (groupUuid: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { @@ -198,7 +222,11 @@ export const setGroupDetailsBreadcrumbs = (groupUuid: string) => const group = getResource(groupUuid)(getState().resources); const breadcrumbs: Breadcrumb[] = [ - { label: SidePanelTreeCategory.GROUPS, uuid: SidePanelTreeCategory.GROUPS }, + { + label: SidePanelTreeCategory.GROUPS, + uuid: SidePanelTreeCategory.GROUPS, + icon: getSidePanelIcon(SidePanelTreeCategory.GROUPS) + }, { label: group ? group.name : (await services.groupsService.get(groupUuid)).name, uuid: groupUuid }, ]; @@ -215,7 +243,7 @@ export const setUserProfileBreadcrumbs = (userUuid: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { try { const user = getResource(userUuid)(getState().resources) - || await services.userService.get(userUuid, false); + || await services.userService.get(userUuid, false); const breadcrumbs: Breadcrumb[] = [ { label: USERS_PANEL_LABEL, uuid: USERS_PANEL_LABEL }, { label: user ? user.username : userUuid, uuid: userUuid },