Init string array input
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Sat, 13 Oct 2018 16:45:46 +0000 (18:45 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Sat, 13 Oct 2018 16:45:46 +0000 (18:45 +0200)
Feature #13862

Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski@contractors.roche.com>

src/components/chips-input/chips-input.tsx
src/models/workflow.ts
src/views/run-process-panel/inputs/string-array-input.tsx [new file with mode: 0644]
src/views/run-process-panel/run-process-inputs-form.tsx

index 210feae915a8dc4cd25b23cb08ce4d0e713be34a..ad3d987ad466f9dcf28872f4e87a8a5168d24fd5 100644 (file)
@@ -42,6 +42,10 @@ export const ChipsInput = withStyles(styles)(
         filler = React.createRef<HTMLDivElement>();
         timeout = -1;
 
+        componentWillUnmount (){
+            clearTimeout(this.timeout);
+        }
+
         setText = (event: React.ChangeEvent<HTMLInputElement>) => {
             this.setState({ text: event.target.value });
         }
index d7d97c4c962401bfc7bd5ff655ebe88fdaf4d92d..59915137427d118167dd14d174574a3fcbdbf3f6 100644 (file)
@@ -141,6 +141,12 @@ export const isPrimitiveOfType = (input: GenericCommandInputParameter<any, any>,
         ? input.type.indexOf(type) > -1
         : input.type === type;
 
+export const isArrayOfType = (input: GenericCommandInputParameter<any, any>, type: CWLType) =>
+    typeof input.type === 'object' &&
+        input.type.type === 'array'
+        ? input.type.items === type
+        : false;
+
 export const stringifyInputType = ({ type }: CommandInputParameter) => {
     if (typeof type === 'string') {
         return type;
diff --git a/src/views/run-process-panel/inputs/string-array-input.tsx b/src/views/run-process-panel/inputs/string-array-input.tsx
new file mode 100644 (file)
index 0000000..7454e2a
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import * as React from 'react';
+import { isRequiredInput, StringArrayCommandInputParameter } 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';
+
+export interface StringArrayInputProps {
+    input: StringArrayCommandInputParameter;
+}
+export const StringArrayInput = ({ input }: StringArrayInputProps) =>
+    <Field
+        name={input.id}
+        commandInput={input}
+        component={StringArrayInputComponent}
+        validate={[
+            isRequiredInput(input)
+                ? (value: string[]) => value.length > 0 ? undefined : ERROR_MESSAGE
+                : () => undefined,
+        ]} />;
+
+const StringArrayInputComponent = (props: GenericInputProps) =>
+    <GenericInput
+        component={Input}
+        {...props} />;
+
+const Input = (props: GenericInputProps) =>
+    <ChipsInput
+        values={props.input.value}
+        onChange={props.input.onChange}
+        createNewValue={v => v} />;
index 41355b2ab9c8da07dc30fc368ee23d21b1a1cc5b..14d8f6383a16e2bc55b0e359b7fd898528b39cd2 100644 (file)
@@ -7,7 +7,7 @@ import { reduxForm, InjectedFormProps } from 'redux-form';
 import { CommandInputParameter, CWLType, IntCommandInputParameter, BooleanCommandInputParameter, FileCommandInputParameter, DirectoryCommandInputParameter } 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 } from '../../models/workflow';
+import { StringCommandInputParameter, FloatCommandInputParameter, isPrimitiveOfType, File, Directory, WorkflowInputsData, EnumCommandInputParameter, isArrayOfType, StringArrayCommandInputParameter } 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';
@@ -16,6 +16,7 @@ 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';
 
 export const RUN_PROCESS_INPUTS_FORM = 'runProcessInputsForm';
 
@@ -72,7 +73,7 @@ const getInputComponent = (input: CommandInputParameter) => {
 
         case isPrimitiveOfType(input, CWLType.FILE):
             return <FileInput input={input as FileCommandInputParameter} />;
-        
+
         case isPrimitiveOfType(input, CWLType.DIRECTORY):
             return <DirectoryInput input={input as DirectoryCommandInputParameter} />;
 
@@ -81,6 +82,9 @@ const getInputComponent = (input: CommandInputParameter) => {
             input.type.type === 'enum':
             return <EnumInput input={input as EnumCommandInputParameter} />;
 
+        case isArrayOfType(input, CWLType.STRING):
+            return <StringArrayInput input={input as StringArrayCommandInputParameter} />;
+
         default:
             return null;
     }