X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/392a0a3992e48d0544523869b850b925d6d7f4c8..3c6ea6ded33b5740035d059d7d9812ed951ab215:/src/views/process-panel/process-panel-root.tsx diff --git a/src/views/process-panel/process-panel-root.tsx b/src/views/process-panel/process-panel-root.tsx index 4186f699..248c5215 100644 --- a/src/views/process-panel/process-panel-root.tsx +++ b/src/views/process-panel/process-panel-root.tsx @@ -17,10 +17,12 @@ import { getIOParamDisplayValue, ProcessIOCard, ProcessIOCardType, ProcessIOPara import { getProcessPanelLogs, ProcessLogsPanel } from 'store/process-logs-panel/process-logs-panel'; import { ProcessLogsCard } from './process-log-card'; import { FilterOption } from 'views/process-panel/process-log-form'; -import { getInputs, getInputCollectionMounts, getOutputParameters } from 'store/processes/processes-actions'; +import { getInputs, getInputCollectionMounts, getOutputParameters, getRawInputs } from 'store/processes/processes-actions'; import { CommandInputParameter, getIOParamId } from 'models/workflow'; import { CommandOutputParameter } from 'cwlts/mappings/v1.0/CommandOutputParameter'; import { AuthState } from 'store/auth/auth-reducer'; +import { ProcessCmdCard } from './process-cmd-card'; +import { ContainerRequestResource } from 'models/container-request'; type CssRules = 'root'; @@ -44,8 +46,8 @@ export interface ProcessPanelRootActionProps { cancelProcess: (uuid: string) => void; onLogFilterChange: (filter: FilterOption) => void; navigateToLog: (uuid: string) => void; - onLogCopyToClipboard: (uuid: string) => void; - fetchOutputs: (uuid: string, fetchOutputs) => void; + onCopyToClipboard: (uuid: string) => void; + fetchOutputs: (containerRequest: ContainerRequestResource, fetchOutputs) => void; } export type ProcessPanelRootProps = ProcessPanelRootDataProps & ProcessPanelRootActionProps & WithStyles; @@ -57,6 +59,7 @@ type OutputDetails = { const panelsData: MPVPanelState[] = [ {name: "Details"}, + {name: "Command"}, {name: "Logs", visible: true}, {name: "Inputs"}, {name: "Outputs"}, @@ -66,40 +69,53 @@ const panelsData: MPVPanelState[] = [ export const ProcessPanelRoot = withStyles(styles)( ({ process, auth, processLogsPanel, fetchOutputs, ...props }: ProcessPanelRootProps) => { - const [outputDetails, setOutputs] = useState({}); - const [rawInputs, setInputs] = useState([]); + const [outputDetails, setOutputs] = useState(undefined); + const [rawInputs, setInputs] = useState(undefined); - - const [processedOutputs, setProcessedOutputs] = useState([]); - const [processedInputs, setProcessedInputs] = useState([]); + const [processedOutputs, setProcessedOutputs] = useState(undefined); + const [processedInputs, setProcessedInputs] = useState(undefined); const outputUuid = process?.containerRequest.outputUuid; const requestUuid = process?.containerRequest.uuid; + const containerRequest = process?.containerRequest; + const inputMounts = getInputCollectionMounts(process?.containerRequest); + // Resets state when changing processes + React.useEffect(() => { + setOutputs(undefined); + setInputs(undefined); + setProcessedOutputs(undefined); + setProcessedInputs(undefined); + }, [requestUuid]); + + // Fetch raw output (async for fetching from keep) React.useEffect(() => { - if (outputUuid) { - fetchOutputs(outputUuid, setOutputs); + if (containerRequest) { + fetchOutputs(containerRequest, setOutputs); } - }, [outputUuid, fetchOutputs]); + }, [containerRequest, fetchOutputs]); + // Format raw output into ProcessIOParameter[] when it changes React.useEffect(() => { - if (outputDetails.rawOutputs && process) { - const outputDefinitions = getOutputParameters(process.containerRequest); + if (outputDetails !== undefined && outputDetails.rawOutputs && containerRequest) { + const outputDefinitions = getOutputParameters(containerRequest); setProcessedOutputs(formatOutputData(outputDefinitions, outputDetails.rawOutputs, outputDetails.pdh, auth)); - } else { - setProcessedOutputs([]); } - }, [outputDetails, auth, process]); + }, [outputDetails, auth, containerRequest]); + // Fetch raw inputs and format into ProcessIOParameter[] + // Can be sync because inputs are either already in containerRequest mounts or props React.useEffect(() => { - if (process) { - const rawInputs = getInputs(process.containerRequest); + if (containerRequest) { + const rawInputs = getRawInputs(containerRequest); setInputs(rawInputs); - setProcessedInputs(formatInputData(rawInputs, auth)); + + const inputs = getInputs(containerRequest); + setProcessedInputs(formatInputData(inputs, auth)); } - }, [requestUuid, auth, process]); + }, [requestUuid, auth, containerRequest]); return process ? @@ -110,9 +126,14 @@ export const ProcessPanelRoot = withStyles(styles)( cancelProcess={props.cancelProcess} /> + + + - + - + @@ -158,10 +182,9 @@ export const ProcessPanelRoot = withStyles(styles)( const formatInputData = (inputs: CommandInputParameter[], auth: AuthState): ProcessIOParameter[] => { return inputs.map(input => { - const doc = Array.isArray(input.doc) ? input.doc.join(', ') : input.doc; return { id: getIOParamId(input), - doc: input.label || doc || "", + label: input.label || "", value: getIOParamDisplayValue(auth, input) }; }); @@ -169,10 +192,9 @@ const formatInputData = (inputs: CommandInputParameter[], auth: AuthState): Proc const formatOutputData = (definitions: CommandOutputParameter[], values: any, pdh: string | undefined, auth: AuthState): ProcessIOParameter[] => { return definitions.map(output => { - const doc = Array.isArray(output.doc) ? output.doc.join(', ') : output.doc; return { id: getIOParamId(output), - doc: output.label || doc || "", + label: output.label || "", value: getIOParamDisplayValue(auth, Object.assign(output, { value: values[getIOParamId(output)] || [] }), pdh) }; });