4655bd029621a0ade90c9749e814db7bccb6413e
[arvados-workbench2.git] / src / store / subprocess-panel / subprocess-panel-middleware-service.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { ServiceRepository } from '~/services/services';
6 import { MiddlewareAPI, Dispatch } from 'redux';
7 import { DataExplorerMiddlewareService, dataExplorerToListParams, listResultsToDataExplorerItemsMeta } from '~/store/data-explorer/data-explorer-middleware-service';
8 import { RootState } from '~/store/store';
9 import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions';
10 import { DataExplorer, getDataExplorer } from '~/store/data-explorer/data-explorer-reducer';
11 import { updateResources } from '~/store/resources/resources-actions';
12 import { SortDirection } from '~/components/data-table/data-column';
13 import { OrderDirection, OrderBuilder } from '~/services/api/order-builder';
14 import { ListResults } from '~/services/common-service/common-service';
15 import { getSortColumn } from "~/store/data-explorer/data-explorer-reducer";
16 import { ProcessResource } from '~/models/process';
17 import { SubprocessPanelColumnNames } from '~/views/subprocess-panel/subprocess-panel-root';
18 import { FilterBuilder } from '~/services/api/filter-builder';
19 import { subprocessPanelActions } from './subprocess-panel-actions';
20
21 export class SubprocessMiddlewareService extends DataExplorerMiddlewareService {
22     constructor(private services: ServiceRepository, id: string) {
23         super(id);
24     }
25
26     async requestItems(api: MiddlewareAPI<Dispatch, RootState>) {
27         const state = api.getState();
28         const dataExplorer = getDataExplorer(state.dataExplorer, this.getId());
29
30         try {
31             const crUuid = state.processPanel.containerRequestUuid;
32             if (crUuid !== "") {
33                 const containerRequest = await this.services.containerRequestService.get(crUuid);
34                 if (containerRequest.containerUuid) {
35                     const filters = new FilterBuilder().addEqual('requestingContainerUuid', containerRequest.containerUuid).getFilters();
36                     const containerRequests = await this.services.containerRequestService.list({ ...getParams(dataExplorer), filters });
37                     api.dispatch(updateResources(containerRequests.items));
38                     api.dispatch(setItems(containerRequests));
39
40                     const containerUuids: string[] = containerRequests.items.reduce((uuids, { containerUuid }) =>
41                         containerUuid
42                             ? [...uuids, containerUuid]
43                             : uuids, []);
44
45                     if (containerUuids.length > 0) {
46                         const filters = new FilterBuilder().addIn('uuid', containerUuids).getFilters();
47                         const containers = await this.services.containerService.list({ filters });
48                         api.dispatch<any>(updateResources(containers.items));
49                     }
50                 }
51             }
52             // TODO: set filters based on process panel state
53
54         } catch {
55             api.dispatch(couldNotFetchSubprocesses());
56         }
57     }
58 }
59
60 /*export const getFilters = (processPanel: ProcessPanelState, processes: Process[]) => {
61     const grouppedProcesses = groupBy(processes, getProcessStatus);
62     return Object
63         .keys(processPanel.filters)
64         .map(filter => ({
65             label: filter,
66             value: (grouppedProcesses[filter] || []).length,
67             checked: processPanel.filters[filter],
68             key: filter,
69         }));
70     };
71 */
72
73 export const getParams = (dataExplorer: DataExplorer) => ({
74     ...dataExplorerToListParams(dataExplorer),
75     order: getOrder(dataExplorer)
76 });
77
78 const getOrder = (dataExplorer: DataExplorer) => {
79     const sortColumn = getSortColumn(dataExplorer);
80     const order = new OrderBuilder<ProcessResource>();
81     if (sortColumn) {
82         const sortDirection = sortColumn && sortColumn.sortDirection === SortDirection.ASC
83             ? OrderDirection.ASC
84             : OrderDirection.DESC;
85
86         const columnName = sortColumn && sortColumn.name === SubprocessPanelColumnNames.NAME ? "name" : "modifiedAt";
87         return order
88             .addOrder(sortDirection, columnName)
89             .getOrder();
90     } else {
91         return order.getOrder();
92     }
93 };
94
95 export const setItems = (listResults: ListResults<ProcessResource>) =>
96     subprocessPanelActions.SET_ITEMS({
97         ...listResultsToDataExplorerItemsMeta(listResults),
98         items: listResults.items.map(resource => resource.uuid),
99     });
100
101 const couldNotFetchSubprocesses = () =>
102     snackbarActions.OPEN_SNACKBAR({
103         message: 'Could not fetch subprocesses.',
104         kind: SnackbarKind.ERROR
105     });