X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/81eb1ca6ea7faa2b8f2646f61cc00885d4cfcb83..547664ecb6ac881103fb9e94a51b2a2746b2c6ae:/src/views/run-process-panel/run-process-inputs-form.tsx diff --git a/src/views/run-process-panel/run-process-inputs-form.tsx b/src/views/run-process-panel/run-process-inputs-form.tsx index 0e533206..e6a504db 100644 --- a/src/views/run-process-panel/run-process-inputs-form.tsx +++ b/src/views/run-process-panel/run-process-inputs-form.tsx @@ -4,40 +4,119 @@ import * as React from 'react'; import { reduxForm, InjectedFormProps } from 'redux-form'; -import { WorkflowResource, CommandInputParameter, CWLType, IntCommandInputParameter, BooleanCommandInputParameter, FileCommandInputParameter } from '~/models/workflow'; +import { CommandInputParameter, CWLType, IntCommandInputParameter, BooleanCommandInputParameter, FileCommandInputParameter, DirectoryCommandInputParameter, DirectoryArrayCommandInputParameter, FloatArrayCommandInputParameter, IntArrayCommandInputParameter } from '~/models/workflow'; import { IntInput } from '~/views/run-process-panel/inputs/int-input'; import { StringInput } from '~/views/run-process-panel/inputs/string-input'; -import { StringCommandInputParameter, FloatCommandInputParameter, File } from '../../models/workflow'; +import { StringCommandInputParameter, FloatCommandInputParameter, isPrimitiveOfType, WorkflowInputsData, EnumCommandInputParameter, isArrayOfType, StringArrayCommandInputParameter, FileArrayCommandInputParameter } from '../../models/workflow'; import { FloatInput } from '~/views/run-process-panel/inputs/float-input'; import { BooleanInput } from './inputs/boolean-input'; import { FileInput } from './inputs/file-input'; +import { connect } from 'react-redux'; +import { compose } from 'redux'; +import { Grid, StyleRulesCallback, withStyles, WithStyles } from '@material-ui/core'; +import { EnumInput } from './inputs/enum-input'; +import { DirectoryInput } from './inputs/directory-input'; +import { StringArrayInput } from './inputs/string-array-input'; +import { createStructuredSelector, createSelector } from 'reselect'; +import { FileArrayInput } from './inputs/file-array-input'; +import { DirectoryArrayInput } from './inputs/directory-array-input'; +import { FloatArrayInput } from './inputs/float-array-input'; +import { IntArrayInput } from './inputs/int-array-input'; -const RUN_PROCESS_INPUTS_FORM = 'runProcessInputsForm'; +export const RUN_PROCESS_INPUTS_FORM = 'runProcessInputsForm'; export interface RunProcessInputFormProps { inputs: CommandInputParameter[]; } -export const RunProcessInputsForm = reduxForm({ - form: RUN_PROCESS_INPUTS_FORM -})((props: InjectedFormProps & RunProcessInputFormProps) => -
- {props.inputs.map(input => { - switch (true) { - case input.type === CWLType.BOOLEAN: - return ; - case input.type === CWLType.INT: - case input.type === CWLType.LONG: - return ; - case input.type === CWLType.FLOAT: - case input.type === CWLType.DOUBLE: - return ; - case input.type === CWLType.STRING: - return ; - case input.type === CWLType.FILE: - return ; - default: - return null; - } - })} - ); \ No newline at end of file +const inputsSelector = (props: RunProcessInputFormProps) => + props.inputs; + +const initialValuesSelector = createSelector( + inputsSelector, + inputs => inputs.reduce( + (values, input) => ({ ...values, [input.id]: input.value || input.default }), + {})); + +const propsSelector = createStructuredSelector({ + initialValues: initialValuesSelector, +}); + +const mapStateToProps = (_: any, props: RunProcessInputFormProps) => + propsSelector(props); + +export const RunProcessInputsForm = compose( + connect(mapStateToProps), + reduxForm({ + form: RUN_PROCESS_INPUTS_FORM + }))( + (props: InjectedFormProps & RunProcessInputFormProps) => +
+ + {props.inputs.map(input => + )} + +
); + +type CssRules = 'inputItem'; + +const styles: StyleRulesCallback = theme => ({ + inputItem: { + marginBottom: theme.spacing.unit * 2, + } +}); + +const InputItem = withStyles(styles)( + (props: WithStyles & { input: CommandInputParameter }) => + + {getInputComponent(props.input)} + ); + +const getInputComponent = (input: CommandInputParameter) => { + switch (true) { + case isPrimitiveOfType(input, CWLType.BOOLEAN): + return ; + + case isPrimitiveOfType(input, CWLType.INT): + case isPrimitiveOfType(input, CWLType.LONG): + return ; + + case isPrimitiveOfType(input, CWLType.FLOAT): + case isPrimitiveOfType(input, CWLType.DOUBLE): + return ; + + case isPrimitiveOfType(input, CWLType.STRING): + return ; + + case isPrimitiveOfType(input, CWLType.FILE): + return ; + + case isPrimitiveOfType(input, CWLType.DIRECTORY): + return ; + + case typeof input.type === 'object' && + !(input.type instanceof Array) && + input.type.type === 'enum': + return ; + + case isArrayOfType(input, CWLType.STRING): + return ; + + case isArrayOfType(input, CWLType.INT): + case isArrayOfType(input, CWLType.LONG): + return ; + + case isArrayOfType(input, CWLType.FLOAT): + case isArrayOfType(input, CWLType.DOUBLE): + return ; + + case isArrayOfType(input, CWLType.FILE): + return ; + + case isArrayOfType(input, CWLType.DIRECTORY): + return ; + + default: + return null; + } +};