From: Michal Klobukowski Date: Sun, 21 Oct 2018 20:45:18 +0000 (+0200) Subject: Add integer array input X-Git-Tag: 1.3.0~53^2~4 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/34e8ef518dd3c4da8f1ad4b099bfbd99c71fa68f?ds=sidebyside Add integer array input Feature #13862 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- diff --git a/src/components/int-input/int-input.tsx b/src/components/int-input/int-input.tsx new file mode 100644 index 00000000..0527efa3 --- /dev/null +++ b/src/components/int-input/int-input.tsx @@ -0,0 +1,27 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + +import * as React from 'react'; +import { Input } from '@material-ui/core'; +import { InputProps } from '@material-ui/core/Input'; + +export class IntInput extends React.Component { + handleChange = (event: React.ChangeEvent) => { + const { onChange = () => { return; } } = this.props; + const parsedValue = parseInt(event.target.value, 10); + event.target.value = parsedValue.toString(); + onChange(event); + } + + render() { + const parsedValue = parseInt(typeof this.props.value === 'string' ? this.props.value : '', 10); + const value = isNaN(parsedValue) ? '' : parsedValue.toString(); + const props = { + ...this.props, + value, + onChange: this.handleChange, + }; + return ; + } +} diff --git a/src/views/run-process-panel/inputs/int-array-input.tsx b/src/views/run-process-panel/inputs/int-array-input.tsx new file mode 100644 index 00000000..a878444b --- /dev/null +++ b/src/views/run-process-panel/inputs/int-array-input.tsx @@ -0,0 +1,64 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + +import * as React from 'react'; +import { isRequiredInput, IntArrayCommandInputParameter } from '~/models/workflow'; +import { Field } from 'redux-form'; +import { ERROR_MESSAGE } from '~/validators/require'; +import { GenericInputProps, GenericInput } from '~/views/run-process-panel/inputs/generic-input'; +import { ChipsInput } from '~/components/chips-input/chips-input'; +import { identity } from 'lodash'; +import { createSelector } from 'reselect'; +import { IntInput } from '~/components/int-input/int-input'; + +export interface IntArrayInputProps { + input: IntArrayCommandInputParameter; +} +export const IntArrayInput = ({ input }: IntArrayInputProps) => + ; + + +const validationSelector = createSelector( + isRequiredInput, + isRequired => isRequired + ? [required] + : undefined +); + +const required = (value: string[]) => + value.length > 0 + ? undefined + : ERROR_MESSAGE; + +const IntArrayInputComponent = (props: GenericInputProps) => + ; + +class InputComponent extends React.PureComponent{ + render() { + return ; + } + + handleChange = (values: {}[]) => { + const { input, meta } = this.props; + if (!meta.touched) { + input.onBlur(values); + } + input.onChange(values); + } +} diff --git a/src/views/run-process-panel/inputs/int-input.tsx b/src/views/run-process-panel/inputs/int-input.tsx index 193de26c..410d2dfe 100644 --- a/src/views/run-process-panel/inputs/int-input.tsx +++ b/src/views/run-process-panel/inputs/int-input.tsx @@ -7,7 +7,7 @@ import { IntCommandInputParameter, getInputLabel, isRequiredInput } from '~/mode import { Field } from 'redux-form'; import { isInteger } from '~/validators/is-integer'; import { GenericInputProps, GenericInput } from '~/views/run-process-panel/inputs/generic-input'; -import { Input as MaterialInput } from '@material-ui/core'; +import { IntInput as IntInputComponent } from '~/components/int-input/int-input'; export interface IntInputProps { input: IntCommandInputParameter; @@ -16,7 +16,7 @@ export const IntInput = ({ input }: IntInputProps) => parseInt(value, 10)} format={value => isNaN(value) ? '' : JSON.stringify(value)} validate={[ @@ -25,12 +25,12 @@ export const IntInput = ({ input }: IntInputProps) => : () => undefined, ]} />; -const IntInputComponent = (props: GenericInputProps) => +const InputComponent = (props: GenericInputProps) => ; const Input = (props: GenericInputProps) => - ; + ; 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 c985dff1..37349a6e 100644 --- a/src/views/run-process-panel/run-process-inputs-form.tsx +++ b/src/views/run-process-panel/run-process-inputs-form.tsx @@ -4,7 +4,7 @@ import * as React from 'react'; import { reduxForm, InjectedFormProps } from 'redux-form'; -import { CommandInputParameter, CWLType, IntCommandInputParameter, BooleanCommandInputParameter, FileCommandInputParameter, DirectoryCommandInputParameter, DirectoryArrayCommandInputParameter, FloatArrayCommandInputParameter } 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, isPrimitiveOfType, File, Directory, WorkflowInputsData, EnumCommandInputParameter, isArrayOfType, StringArrayCommandInputParameter, FileArrayCommandInputParameter } from '../../models/workflow'; @@ -21,6 +21,7 @@ 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'; export const RUN_PROCESS_INPUTS_FORM = 'runProcessInputsForm'; @@ -100,13 +101,18 @@ const getInputComponent = (input: CommandInputParameter) => { 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 ;