d21b9b83d0669108b2bf017b72bb43cb44cfb9c4
[arvados-workbench2.git] / src / store / process-panel / process-panel-actions.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { unionize, ofType, UnionOf } from "common/unionize";
6 import { loadProcess } from 'store/processes/processes-actions';
7 import { Dispatch } from 'redux';
8 import { ProcessStatus } from 'store/processes/process';
9 import { RootState } from 'store/store';
10 import { ServiceRepository } from "services/services";
11 import { navigateTo, navigateToWorkflows } from 'store/navigation/navigation-action';
12 import { snackbarActions } from 'store/snackbar/snackbar-actions';
13 import { SnackbarKind } from '../snackbar/snackbar-actions';
14 import { showWorkflowDetails } from 'store/workflow-panel/workflow-panel-actions';
15 import { loadSubprocessPanel } from "../subprocess-panel/subprocess-panel-actions";
16 import { initProcessLogsPanel, processLogsPanelActions } from "store/process-logs-panel/process-logs-panel-actions";
17 import { CollectionFile } from "models/collection-file";
18
19 export const processPanelActions = unionize({
20     SET_PROCESS_PANEL_CONTAINER_REQUEST_UUID: ofType<string>(),
21     SET_PROCESS_PANEL_FILTERS: ofType<string[]>(),
22     TOGGLE_PROCESS_PANEL_FILTER: ofType<string>(),
23 });
24
25 export type ProcessPanelAction = UnionOf<typeof processPanelActions>;
26
27 export const toggleProcessPanelFilter = processPanelActions.TOGGLE_PROCESS_PANEL_FILTER;
28
29 export const loadProcessPanel = (uuid: string) =>
30     async (dispatch: Dispatch) => {
31         dispatch(processLogsPanelActions.RESET_PROCESS_LOGS_PANEL());
32         dispatch<ProcessPanelAction>(processPanelActions.SET_PROCESS_PANEL_CONTAINER_REQUEST_UUID(uuid));
33         await dispatch<any>(loadProcess(uuid));
34         dispatch(initProcessPanelFilters);
35         dispatch<any>(initProcessLogsPanel(uuid));
36         dispatch<any>(loadSubprocessPanel());
37     };
38
39 export const navigateToOutput = (uuid: string) =>
40     async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
41         try {
42             await services.collectionService.get(uuid);
43             dispatch<any>(navigateTo(uuid));
44         } catch {
45             dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'This collection does not exists!', hideDuration: 2000, kind: SnackbarKind.ERROR }));
46         }
47     };
48
49 export const loadOutputs = (uuid: string, setOutputs) =>
50     async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
51         try {
52             const files = await services.collectionService.files(uuid);
53             const collection = await services.collectionService.get(uuid);
54             const outputFile = files.find((file) => file.name === 'cwl.output.json') as CollectionFile | undefined;
55             let outputData = outputFile ? await services.collectionService.getFileContents(outputFile) : undefined;
56             if ((outputData = JSON.parse(outputData)) && collection.portableDataHash) {
57                 setOutputs({
58                     rawOutputs: outputData,
59                     pdh: collection.portableDataHash,
60                 });
61             } else {
62                 setOutputs({});
63             }
64         } catch {
65             setOutputs({});
66         }
67     };
68
69 export const openWorkflow = (uuid: string) =>
70     (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
71         dispatch<any>(navigateToWorkflows);
72         dispatch<any>(showWorkflowDetails(uuid));
73     };
74
75 export const initProcessPanelFilters = processPanelActions.SET_PROCESS_PANEL_FILTERS([
76     ProcessStatus.QUEUED,
77     ProcessStatus.COMPLETED,
78     ProcessStatus.FAILED,
79     ProcessStatus.RUNNING,
80     ProcessStatus.ONHOLD,
81     ProcessStatus.FAILING,
82     ProcessStatus.WARNING,
83     ProcessStatus.CANCELLED
84 ]);