17074: Add remaining requestCount implementations
[arvados.git] / services / workbench2 / src / store / processes / processes-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 {
8     DataExplorerMiddlewareService, dataExplorerToListParams, listResultsToDataExplorerItemsMeta, getDataExplorerColumnFilters, getOrder
9 } from 'store/data-explorer/data-explorer-middleware-service';
10 import { RootState } from 'store/store';
11 import { snackbarActions, SnackbarKind } from 'store/snackbar/snackbar-actions';
12 import { DataExplorer, getDataExplorer } from 'store/data-explorer/data-explorer-reducer';
13 import { BoundDataExplorerActions, couldNotFetchItemsAvailable } from 'store/data-explorer/data-explorer-action';
14 import { updateResources } from 'store/resources/resources-actions';
15 import { ListArguments, ListResults } from 'services/common-service/common-service';
16 import { ProcessResource } from 'models/process';
17 import { FilterBuilder, joinFilters } from 'services/api/filter-builder';
18 import { DataColumns } from 'components/data-table/data-table';
19 import { ProcessStatusFilter, buildProcessStatusFilters } from '../resource-type-filters/resource-type-filters';
20 import { ContainerRequestResource, containerRequestFieldsNoMounts } from 'models/container-request';
21 import { progressIndicatorActions } from '../progress-indicator/progress-indicator-actions';
22 import { loadMissingProcessesInformation } from '../project-panel/project-panel-run-middleware-service';
23
24 export class ProcessesMiddlewareService extends DataExplorerMiddlewareService {
25     constructor(private services: ServiceRepository, private actions: BoundDataExplorerActions, id: string) {
26         super(id);
27     }
28
29     getFilters(api: MiddlewareAPI<Dispatch, RootState>, dataExplorer: DataExplorer): string | null {
30         const columns = dataExplorer.columns as DataColumns<string, ContainerRequestResource>;
31         const statusColumnFilters = getDataExplorerColumnFilters(columns, 'Status');
32         const activeStatusFilter = Object.keys(statusColumnFilters).find(
33             filterName => statusColumnFilters[filterName].selected
34         ) || ProcessStatusFilter.ALL;
35
36         const nameFilter = new FilterBuilder().addILike("name", dataExplorer.searchValue).getFilters();
37         const statusFilter = buildProcessStatusFilters(new FilterBuilder(), activeStatusFilter).getFilters();
38
39         return joinFilters(
40             nameFilter,
41             statusFilter,
42         );
43     }
44
45     getParams(api: MiddlewareAPI<Dispatch, RootState>, dataExplorer: DataExplorer): ListArguments | null {
46         const filters = this.getFilters(api, dataExplorer);
47         if (filters === null) {
48             return null;
49         }
50         return {
51             ...dataExplorerToListParams(dataExplorer),
52             filters,
53             order: getOrder<ProcessResource>(dataExplorer),
54             select: containerRequestFieldsNoMounts,
55             count: 'none',
56         };
57     }
58
59     getCountParams(api: MiddlewareAPI<Dispatch, RootState>, dataExplorer: DataExplorer): ListArguments | null {
60         const filters = this.getFilters(api, dataExplorer);
61         if (filters === null) {
62             return null;
63         }
64         return {
65             filters,
66             limit: 0,
67             count: 'exact',
68         };
69     }
70
71     async requestItems(api: MiddlewareAPI<Dispatch, RootState>, criteriaChanged?: boolean, background?: boolean) {
72         const state = api.getState();
73         const dataExplorer = getDataExplorer(state.dataExplorer, this.getId());
74
75         try {
76             if (!background) { api.dispatch(progressIndicatorActions.START_WORKING(this.getId())); }
77             const params = this.getParams(api, dataExplorer);
78
79             // Get items
80             if (params !== null) {
81                 const containerRequests = await this.services.containerRequestService.list(params);
82                 api.dispatch(updateResources(containerRequests.items));
83                 await api.dispatch<any>(loadMissingProcessesInformation(containerRequests.items));
84                 api.dispatch(this.actions.SET_ITEMS({
85                     ...listResultsToDataExplorerItemsMeta(containerRequests),
86                     items: containerRequests.items.map(resource => resource.uuid),
87                 }));
88             } else {
89                 api.dispatch(this.actions.SET_ITEMS({
90                     itemsAvailable: 0,
91                     page: 0,
92                     rowsPerPage: dataExplorer.rowsPerPage,
93                     items: [],
94                 }));
95             }
96         } catch {
97             api.dispatch(snackbarActions.OPEN_SNACKBAR({
98                 message: 'Could not fetch process list.',
99                 kind: SnackbarKind.ERROR
100             }));
101         } finally {
102             if (!background) { api.dispatch(progressIndicatorActions.PERSIST_STOP_WORKING(this.getId())); }
103         }
104     }
105
106     async requestCount(api: MiddlewareAPI<Dispatch, RootState>, criteriaChanged?: boolean, background?: boolean) {
107         const state = api.getState();
108         const dataExplorer = getDataExplorer(state.dataExplorer, this.getId());
109         const countParams = this.getCountParams(api, dataExplorer);
110
111         if (criteriaChanged && countParams !== null) {
112             // Get itemsAvailable
113             return this.services.containerRequestService.list(countParams)
114                 .then((results: ListResults<ContainerRequestResource>) => {
115                     console.log(results);
116                     if (results.itemsAvailable !== undefined) {
117                         api.dispatch<any>(this.actions.SET_ITEMS_AVAILABLE(results.itemsAvailable));
118                     } else {
119                         couldNotFetchItemsAvailable();
120                     }
121                 });
122         }
123     }
124 }