15672: Fixes a couple tests.
[arvados-workbench2.git] / src / views / run-process-panel / inputs / string-array-input.tsx
index 7454e2ad1175ff95576eb5b1d60d564e4e53b020..e560b33778fc7cf0f99a76e0461bf8858192e26a 100644 (file)
@@ -7,7 +7,10 @@ import { isRequiredInput, StringArrayCommandInputParameter } from '~/models/work
 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 { ChipsInput } from '~/components/chips-input/chips-input';
+import { identity } from 'lodash';
+import { createSelector } from 'reselect';
+import { Input } from '@material-ui/core';
 
 export interface StringArrayInputProps {
     input: StringArrayCommandInputParameter;
@@ -17,19 +20,47 @@ export const StringArrayInput = ({ input }: StringArrayInputProps) =>
         name={input.id}
         commandInput={input}
         component={StringArrayInputComponent}
-        validate={[
-            isRequiredInput(input)
-                ? (value: string[]) => value.length > 0 ? undefined : ERROR_MESSAGE
-                : () => undefined,
-        ]} />;
+        validate={validationSelector(input)} />;
+
+
+const validationSelector = createSelector(
+    isRequiredInput,
+    isRequired => isRequired
+        ? [required]
+        : undefined
+);
+
+const required = (value: string[]) =>
+    value.length > 0
+        ? undefined
+        : ERROR_MESSAGE;
 
 const StringArrayInputComponent = (props: GenericInputProps) =>
     <GenericInput
-        component={Input}
+        component={InputComponent}
         {...props} />;
 
-const Input = (props: GenericInputProps) =>
-    <ChipsInput
-        values={props.input.value}
-        onChange={props.input.onChange}
-        createNewValue={v => v} />;
+class InputComponent extends React.PureComponent<GenericInputProps>{
+    render() {
+        const { commandInput, input, meta } = this.props;
+        return <ChipsInput
+            deletable={!commandInput.disabled}
+            orderable={!commandInput.disabled}
+            disabled={commandInput.disabled}
+            value={input.value}
+            onChange={this.handleChange}
+            createNewValue={identity}
+            inputComponent={Input}
+            inputProps={{
+                error: meta.error
+            }} />;
+    }
+
+    handleChange = (values: {}[]) => {
+        const { input, meta } = this.props;
+        if (!meta.touched) {
+            input.onBlur(values);
+        }
+        input.onChange(values);
+    }
+}