be8c9c49ec63e5abed043886fddf1161070fb455
[arvados-workbench2.git] / src / store / all-processes-panel / all-processes-panel-middleware-service.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { DataExplorerMiddlewareService } from "~/store/data-explorer/data-explorer-middleware-service";
6 import { RootState } from "../store";
7 import { ServiceRepository } from "~/services/services";
8 import { FilterBuilder } from "~/services/api/filter-builder";
9 import { allProcessesPanelActions } from "./all-processes-panel-action";
10 import { Dispatch, MiddlewareAPI } from "redux";
11 import { resourcesActions } from "~/store/resources/resources-actions";
12 import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions';
13 import { progressIndicatorActions } from '~/store/progress-indicator/progress-indicator-actions.ts';
14 import { getDataExplorer } from "~/store/data-explorer/data-explorer-reducer";
15 import { loadMissingProcessesInformation } from "~/store/project-panel/project-panel-middleware-service";
16
17 export class AllProcessesPanelMiddlewareService extends DataExplorerMiddlewareService {
18     constructor(private services: ServiceRepository, id: string) {
19         super(id);
20     }
21
22     async requestItems(api: MiddlewareAPI<Dispatch, RootState>) {
23         const dataExplorer = getDataExplorer(api.getState().dataExplorer, this.getId());
24         if (!dataExplorer) {
25             api.dispatch(allProcessesPanelDataExplorerIsNotSet());
26         } else {
27             try {
28                 api.dispatch(progressIndicatorActions.START_WORKING(this.getId()));
29                 const processItems: any = await this.services.containerRequestService.list({
30                     filters: new FilterBuilder()
31                         .addILike("name", dataExplorer.searchValue)
32                         .getFilters()
33                 });
34
35                 api.dispatch(progressIndicatorActions.PERSIST_STOP_WORKING(this.getId()));
36                 api.dispatch(resourcesActions.SET_RESOURCES(processItems.items));
37                 await api.dispatch<any>(loadMissingProcessesInformation(processItems.items));
38                 api.dispatch(allProcessesPanelActions.SET_ITEMS({
39                     items: processItems.items.map((resource: any) => resource.uuid),
40                     itemsAvailable: processItems.itemsAvailable,
41                     page: Math.floor(processItems.offset / processItems.limit),
42                     rowsPerPage: processItems.limit
43                 }));
44             } catch (e) {
45                 api.dispatch(progressIndicatorActions.PERSIST_STOP_WORKING(this.getId()));
46                 api.dispatch(allProcessesPanelActions.SET_ITEMS({
47                     items: [],
48                     itemsAvailable: 0,
49                     page: 0,
50                     rowsPerPage: dataExplorer.rowsPerPage
51                 }));
52                 api.dispatch(couldNotFetchAllProcessesListing());
53             }
54         }
55     }
56 }
57
58 const allProcessesPanelDataExplorerIsNotSet = () =>
59     snackbarActions.OPEN_SNACKBAR({
60         message: 'All Processes panel is not ready.',
61         kind: SnackbarKind.ERROR
62     });
63
64 const couldNotFetchAllProcessesListing = () =>
65     snackbarActions.OPEN_SNACKBAR({
66         message: 'Could not fetch All Processes listing.',
67         kind: SnackbarKind.ERROR
68     });