X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/e3064da256b0c0f78e97bfe53825a5c0bf11a4cb..099468843d687fdc8c6fbb0f0e3dc54f59d0de15:/src/views-components/details-panel/workflow-details.tsx diff --git a/src/views-components/details-panel/workflow-details.tsx b/src/views-components/details-panel/workflow-details.tsx index 7076823c76..ca224b1d58 100644 --- a/src/views-components/details-panel/workflow-details.tsx +++ b/src/views-components/details-panel/workflow-details.tsx @@ -3,12 +3,14 @@ // SPDX-License-Identifier: AGPL-3.0 import React from 'react'; -import { DefaultIcon, WorkflowIcon } from 'components/icon/icon'; -import { WorkflowResource } from 'models/workflow'; +import { WorkflowIcon, StartIcon } from 'components/icon/icon'; +import { + WorkflowResource, parseWorkflowDefinition, getWorkflowInputs, + getWorkflowOutputs, getWorkflow +} from 'models/workflow'; import { DetailsData } from "./details-data"; -import { DefaultView } from 'components/default-view/default-view'; import { DetailsAttribute } from 'components/details-attribute/details-attribute'; -import { ResourceOwnerWithName } from 'views-components/data-explorer/renderers'; +import { ResourceWithName } from 'views-components/data-explorer/renderers'; import { formatDate } from "common/formatters"; import { Grid } from '@material-ui/core'; import { withStyles, StyleRulesCallback, WithStyles, Button } from '@material-ui/core'; @@ -16,6 +18,11 @@ import { openRunProcess } from "store/workflow-panel/workflow-panel-actions"; import { Dispatch } from 'redux'; import { connect } from 'react-redux'; import { ArvadosTheme } from 'common/custom-theme'; +import { ProcessIOParameter } from 'views/process-panel/process-io-card'; +import { formatInputData, formatOutputData } from 'store/process-panel/process-panel-actions'; +import { AuthState } from 'store/auth/auth-reducer'; +import { RootState } from 'store/store'; +import { getPropertyChip } from "views-components/resource-properties-form/property-chip"; export interface WorkflowDetailsCardDataProps { workflow?: WorkflowResource; @@ -30,29 +37,101 @@ const mapDispatchToProps = (dispatch: Dispatch) => ({ () => wf && dispatch(openRunProcess(wf.uuid, wf.ownerUuid, wf.name)), }); -type CssRules = 'runButton'; +type CssRules = 'runButton' | 'propertyTag'; const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ runButton: { + backgroundColor: theme.customs.colors.green700, + '&:hover': { + backgroundColor: theme.customs.colors.green800, + }, + marginRight: "5px", boxShadow: 'none', padding: '2px 10px 2px 5px', - fontSize: '0.75rem' + marginLeft: 'auto' + }, + propertyTag: { + marginRight: theme.spacing.unit / 2, + marginBottom: theme.spacing.unit / 2 }, }); -export const WorkflowDetailsAttributes = connect(null, mapDispatchToProps)( +interface AuthStateDataProps { + auth: AuthState; +}; + +export interface RegisteredWorkflowPanelDataProps { + item: WorkflowResource; + workflowCollection: string; + inputParams: ProcessIOParameter[]; + outputParams: ProcessIOParameter[]; + gitprops: { [key: string]: string; }; +}; + +export const getRegisteredWorkflowPanelData = (item: WorkflowResource, auth: AuthState): RegisteredWorkflowPanelDataProps => { + let inputParams: ProcessIOParameter[] = []; + let outputParams: ProcessIOParameter[] = []; + let workflowCollection = ""; + const gitprops: { [key: string]: string; } = {}; + + // parse definition + const wfdef = parseWorkflowDefinition(item); + + if (wfdef) { + const inputs = getWorkflowInputs(wfdef); + if (inputs) { + inputs.forEach(elm => { + if (elm.default !== undefined && elm.default !== null) { + elm.value = elm.default; + } + }); + inputParams = formatInputData(inputs, auth); + } + + const outputs = getWorkflowOutputs(wfdef); + if (outputs) { + outputParams = formatOutputData(outputs, {}, undefined, auth); + } + + const wf = getWorkflow(wfdef); + if (wf) { + const REGEX = /keep:([0-9a-f]{32}\+\d+)\/.*/; + if (wf["steps"]) { + const pdh = wf["steps"][0].run.match(REGEX); + if (pdh) { + workflowCollection = pdh[1]; + } + } + } + + for (const elm in wfdef) { + if (elm.startsWith("http://arvados.org/cwl#git")) { + gitprops[elm.substr(23)] = wfdef[elm] + } + } + } + + return { item, workflowCollection, inputParams, outputParams, gitprops }; +}; + +const mapStateToProps = (state: RootState): AuthStateDataProps => { + return { auth: state.auth }; +}; + +export const WorkflowDetailsAttributes = connect(mapStateToProps, mapDispatchToProps)( withStyles(styles)( - ({ workflow, onClick, classes }: WorkflowDetailsCardDataProps & WorkflowDetailsCardActionProps & WithStyles) => { + ({ workflow, onClick, auth, classes }: WorkflowDetailsCardDataProps & AuthStateDataProps & WorkflowDetailsCardActionProps & WithStyles) => { + if (!workflow) { + return + } + + const data = getRegisteredWorkflowPanelData(workflow, auth); return - {workflow && workflow.description !== "" && - - } } /> + uuidEnhancer={(uuid: string) => } /> @@ -69,10 +148,15 @@ export const WorkflowDetailsAttributes = connect(null, mapDispatchToProps)( - + } /> + uuidEnhancer={(uuid: string) => } /> + + + + {Object.keys(data.gitprops).map(k => + getPropertyChip(k, data.gitprops[k], undefined, classes.propertyTag))} ; }));