19744: Made the resource usage report button obvious
[arvados.git] / services / workbench2 / src / store / process-panel / process-panel-actions.ts
index 81f8dd6ba0dc456f980ffaec17bf25000c5afa3d..82c267c7a06411c4371586b4075716cd4afa6aad 100644 (file)
@@ -18,8 +18,10 @@ import { ContainerRequestResource } from "models/container-request";
 import { CommandOutputParameter } from "cwlts/mappings/v1.0/CommandOutputParameter";
 import { CommandInputParameter, getIOParamId, WorkflowInputsData } from "models/workflow";
 import { getIOParamDisplayValue, ProcessIOParameter } from "views/process-panel/process-io-card";
-import { OutputDetails, NodeInstanceType, NodeInfo } from "./process-panel";
+import { OutputDetails, NodeInstanceType, NodeInfo, UsageReport } from "./process-panel";
 import { AuthState } from "store/auth/auth-reducer";
+import { ContextMenuResource } from "store/context-menu/context-menu-actions";
+import { OutputDataUpdate } from "./process-panel-reducer";
 
 export const processPanelActions = unionize({
     RESET_PROCESS_PANEL: ofType<{}>(),
@@ -28,10 +30,11 @@ export const processPanelActions = unionize({
     TOGGLE_PROCESS_PANEL_FILTER: ofType<string>(),
     SET_INPUT_RAW: ofType<WorkflowInputsData | null>(),
     SET_INPUT_PARAMS: ofType<ProcessIOParameter[] | null>(),
-    SET_OUTPUT_RAW: ofType<OutputDetails | null>(),
+    SET_OUTPUT_DATA: ofType<OutputDataUpdate | null>(),
     SET_OUTPUT_DEFINITIONS: ofType<CommandOutputParameter[]>(),
     SET_OUTPUT_PARAMS: ofType<ProcessIOParameter[] | null>(),
     SET_NODE_INFO: ofType<NodeInfo>(),
+    SET_USAGE_REPORT: ofType<UsageReport>(),
 });
 
 export type ProcessPanelAction = UnionOf<typeof processPanelActions>;
@@ -53,10 +56,10 @@ export const loadProcessPanel = (uuid: string) => async (dispatch: Dispatch, get
     dispatch<any>(loadSubprocessPanel());
 };
 
-export const navigateToOutput = (uuid: string) => async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
+export const navigateToOutput = (resource: ContextMenuResource | ContainerRequestResource) => async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
     try {
-        await services.collectionService.get(uuid);
-        dispatch<any>(navigateTo(uuid));
+        await services.collectionService.get(resource.outputUuid || '');
+        dispatch<any>(navigateTo(resource.outputUuid || ''));
     } catch {
         dispatch(snackbarActions.OPEN_SNACKBAR({ message: "Output collection was trashed or deleted.", hideDuration: 4000, kind: SnackbarKind.WARNING }));
     }
@@ -70,10 +73,13 @@ export const loadInputs =
 
 export const loadOutputs =
     (containerRequest: ContainerRequestResource) => async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
-        const noOutputs = { rawOutputs: {} };
+        const noOutputs: OutputDetails = { raw: {} };
 
         if (!containerRequest.outputUuid) {
-            dispatch<ProcessPanelAction>(processPanelActions.SET_OUTPUT_RAW({ uuid: containerRequest.uuid, outputRaw: noOutputs }));
+            dispatch<ProcessPanelAction>(processPanelActions.SET_OUTPUT_DATA({
+                uuid: containerRequest.uuid,
+                payload: noOutputs
+            }));
             return;
         }
         try {
@@ -85,9 +91,12 @@ export const loadOutputs =
             // If has propsOutput, skip fetching cwl.output.json
             if (propsOutputs !== undefined) {
                 dispatch<ProcessPanelAction>(
-                    processPanelActions.SET_OUTPUT_RAW({
-                        rawOutputs: propsOutputs,
-                        pdh: collection.portableDataHash,
+                    processPanelActions.SET_OUTPUT_DATA({
+                        uuid: containerRequest.uuid,
+                        payload: {
+                            raw: propsOutputs,
+                            pdh: collection.portableDataHash,
+                        },
                     })
                 );
             } else {
@@ -96,17 +105,20 @@ export const loadOutputs =
                 let outputData = outputFile ? await services.collectionService.getFileContents(outputFile) : undefined;
                 if (outputData && (outputData = JSON.parse(outputData)) && collection.portableDataHash) {
                     dispatch<ProcessPanelAction>(
-                        processPanelActions.SET_OUTPUT_RAW({
+                        processPanelActions.SET_OUTPUT_DATA({
                             uuid: containerRequest.uuid,
-                            outputRaw: { rawOutputs: outputData, pdh: collection.portableDataHash },
+                            payload: {
+                                raw: outputData,
+                                pdh: collection.portableDataHash,
+                            },
                         })
                     );
                 } else {
-                    dispatch<ProcessPanelAction>(processPanelActions.SET_OUTPUT_RAW({ uuid: containerRequest.uuid, outputRaw: noOutputs }));
+                    dispatch<ProcessPanelAction>(processPanelActions.SET_OUTPUT_DATA({ uuid: containerRequest.uuid, payload: noOutputs }));
                 }
             }
         } catch {
-            dispatch<ProcessPanelAction>(processPanelActions.SET_OUTPUT_RAW({ uuid: containerRequest.uuid, outputRaw: noOutputs }));
+            dispatch<ProcessPanelAction>(processPanelActions.SET_OUTPUT_DATA({ uuid: containerRequest.uuid, payload: noOutputs }));
         }
     };
 
@@ -134,8 +146,12 @@ export const loadNodeJson =
             } else {
                 dispatch<ProcessPanelAction>(processPanelActions.SET_NODE_INFO(noLog));
             }
+
+            const usageReportFile = files.find(file => file.name === "usage_report.html") as CollectionFile | null;
+            dispatch<ProcessPanelAction>(processPanelActions.SET_USAGE_REPORT({ usageReport: usageReportFile }));
         } catch {
             dispatch<ProcessPanelAction>(processPanelActions.SET_NODE_INFO(noLog));
+            dispatch<ProcessPanelAction>(processPanelActions.SET_USAGE_REPORT({ usageReport: null }));
         }
     };
 
@@ -148,11 +164,11 @@ export const loadOutputDefinitions =
 
 export const updateOutputParams = () => async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
     const outputDefinitions = getState().processPanel.outputDefinitions;
-    const outputRaw = getState().processPanel.outputRaw;
+    const outputData = getState().processPanel.outputData;
 
-    if (outputRaw && outputRaw.rawOutputs) {
+    if (outputData && outputData.raw) {
         dispatch<ProcessPanelAction>(
-            processPanelActions.SET_OUTPUT_PARAMS(formatOutputData(outputDefinitions, outputRaw.rawOutputs, outputRaw.pdh, getState().auth))
+            processPanelActions.SET_OUTPUT_PARAMS(formatOutputData(outputDefinitions, outputData.raw, outputData.pdh, getState().auth))
         );
     }
 };