X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/a4b74b32b506a32566ca2967148a88ece76e973b..273119605b7f33940a5ef9b1422eb1ff152d6764:/src/store/breadcrumbs/breadcrumbs-actions.ts diff --git a/src/store/breadcrumbs/breadcrumbs-actions.ts b/src/store/breadcrumbs/breadcrumbs-actions.ts index d3ea7d23..74cfde00 100644 --- a/src/store/breadcrumbs/breadcrumbs-actions.ts +++ b/src/store/breadcrumbs/breadcrumbs-actions.ts @@ -22,8 +22,9 @@ import { ProcessResource } from 'models/process'; import { OrderBuilder } from 'services/api/order-builder'; import { Breadcrumb } from 'components/breadcrumbs/breadcrumbs'; import { ContainerRequestResource, containerRequestFieldsNoMounts } from 'models/container-request'; -import { CollectionIcon, IconType, ProcessBreadcrumbIcon, ProjectIcon } from 'components/icon/icon'; +import { CollectionIcon, IconType, ProcessIcon, ProjectIcon } from 'components/icon/icon'; import { CollectionResource } from 'models/collection'; +import { getSidePanelIcon } from 'views-components/side-panel-tree/side-panel-tree'; export const BREADCRUMBS = 'breadcrumbs'; @@ -38,23 +39,16 @@ const resourceToBreadcrumbIcon = (resource: CollectionResource | ContainerReques switch (resource.kind) { case ResourceKind.PROJECT: return ProjectIcon; - break; - case ResourceKind.PROCESS: - return ProcessBreadcrumbIcon; - break; - + return ProcessIcon; case ResourceKind.COLLECTION: return CollectionIcon; - break; - default: return undefined; - break; } } -const resourceToBreadcrumb = (resource: CollectionResource | ContainerRequestResource | GroupResource) => ({ +const resourceToBreadcrumb = (resource: CollectionResource | ContainerRequestResource | GroupResource): Breadcrumb => ({ label: resource.name, uuid: resource.uuid, icon: resourceToBreadcrumbIcon(resource), @@ -64,7 +58,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)); }; @@ -80,6 +78,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)); @@ -105,7 +105,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; @@ -120,6 +124,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)); @@ -154,16 +160,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; } @@ -189,7 +201,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) => { @@ -197,7 +213,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 }, ];