Fix file and collection input validation
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Thu, 11 Oct 2018 21:22:35 +0000 (23:22 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Thu, 11 Oct 2018 21:22:35 +0000 (23:22 +0200)
Feature #13862

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

src/index.tsx
src/views/run-process-panel/inputs/directory-input.tsx
src/views/run-process-panel/inputs/file-input.tsx

index c5add22eba18f12290160400784237c9a945e552..1d072d9d5d9b531e7108b9509f5faa4057d0b228 100644 (file)
@@ -131,6 +131,22 @@ const createEnumCollectorWorkflow = ({ workflowService }: ServiceRepository) =>
     });
 };
 
+const createFilesCollectorWorkflow = ({ workflowService }: ServiceRepository) => {
+    workflowService.create({
+        name: 'File values collector',
+        description: 'Workflow for collecting file values',
+        definition: "cwlVersion: v1.0\n$graph:\n- class: CommandLineTool\n\n  requirements:\n  - listing:\n    - entryname: input_collector.log\n      entry: |\n        \"single_file\":\n          $(inputs.single_file.basename)\n        \"optional_file\":\n          $(inputs.optional_file.basename)\n\n    class: InitialWorkDirRequirement\n  inputs:\n  - type:\n    - 'null'\n    - File\n    id: '#input_collector.cwl/optional_file'\n  - type:\n    - 'null'\n    - File\n    id: '#input_collector.cwl/optional_file_missing_label'\n  - type: File\n    id: '#input_collector.cwl/single_file'\n  outputs:\n  - type: File\n    outputBinding:\n      glob: '*'\n    id: '#input_collector.cwl/output'\n\n  baseCommand: [echo]\n  id: '#input_collector.cwl'\n- class: Workflow\n  doc: This is the description of the workflow\n  inputs:\n  - type:\n    - 'null'\n    - File\n    label: Single File (Optional)\n    doc: This should allow for single File selection only. Input should be marked\n      as optional and not enforced by form validation.\n    id: '#main/optional_file'\n    default:\n      class: File\n      location: keep:af831660d820bcbb98f473355e6e1b85+67/fileA\n      basename: fileA\n      nameroot: fileA\n      nameext: ''\n  - type:\n    - 'null'\n    - File\n    doc: Label should be the input field name because of missing label.\n    id: '#main/optional_file_missing_label'\n  - type: File\n    label: Single File\n    doc: This should allow for single File selection only.\n    id: '#main/single_file'\n    default:\n      class: File\n      location: keep:af831660d820bcbb98f473355e6e1b85+67/fileA\n      basename: fileA\n      nameroot: fileA\n      nameext: ''\n  outputs:\n  - type: File\n    outputSource: '#main/input_collector/output'\n    id: '#main/log_file'\n  steps:\n  - run: '#input_collector.cwl'\n    in:\n    - source: '#main/optional_file'\n      id: '#main/input_collector/optional_file'\n    - source: '#main/single_file'\n      id: '#main/input_collector/single_file'\n    out: ['#main/input_collector/output']\n    id: '#main/input_collector'\n  id: '#main'\n",
+    });
+};
+
+const createCollectionCollectorWorkflow = ({ workflowService }: ServiceRepository) => {
+    workflowService.create({
+        name: 'Collection value collector',
+        description: 'Workflow for collecting a collecion',
+        definition: "cwlVersion: v1.0\n$graph:\n- class: CommandLineTool\n\n  requirements:\n  - listing:\n    - entryname: input_collector.log\n      entry: |\n        \"collection\":\n          $(inputs.collection.location)\n\n    class: InitialWorkDirRequirement\n  inputs:\n  - type: Directory\n    id: '#input_collector.cwl/collection'\n\n  outputs:\n  - type: File\n    outputBinding:\n      glob: '*'\n    id: '#input_collector.cwl/output'\n\n  baseCommand: [echo]\n  id: '#input_collector.cwl'\n- class: Workflow\n  doc: This is the description of the workflow\n  inputs:\n  - type: Directory\n    label: Single Collection\n    doc: This should allow for single Collection selection only.\n    id: '#main/collection'\n    default:\n      class: Directory\n      location: keep:af831660d820bcbb98f473355e6e1b85+67\n      basename: af831660d820bcbb98f473355e6e1b85+67\n  outputs:\n  - type: File\n    outputSource: '#main/input_collector/output'\n\n    id: '#main/log_file'\n  steps:\n  - run: '#input_collector.cwl'\n    in:\n    - source: '#main/collection'\n      id: '#main/input_collector/collection'\n    out: ['#main/input_collector/output']\n    id: '#main/input_collector'\n  id: '#main'\n",
+    });
+};
+
 const createSampleProcess = ({ containerRequestService }: ServiceRepository) => {
     containerRequestService.create({
         ownerUuid: 'c97qk-j7d0g-s3ngc1z0748hsmf',
index c0e21e8ef5d230b7781500d65328d27d57521b25..b85c24f35bdf45858f9ef6fc571eb11237201930 100644 (file)
@@ -10,7 +10,6 @@ import {
     Directory
 } from '~/models/workflow';
 import { Field } from 'redux-form';
-import { require } from '~/validators/require';
 import { Input, Dialog, DialogTitle, DialogContent, DialogActions, Button } from '@material-ui/core';
 import { GenericInputProps, GenericInput } from './generic-input';
 import { ProjectsTreePicker } from '~/views-components/projects-tree-picker/projects-tree-picker';
@@ -20,6 +19,7 @@ import { TreeItem } from '~/components/tree/tree';
 import { ProjectsTreePickerItem } from '~/views-components/projects-tree-picker/generic-projects-tree-picker';
 import { CollectionResource } from '~/models/collection';
 import { ResourceKind } from '~/models/resource';
+import { ERROR_MESSAGE } from '../../../validators/require';
 
 export interface DirectoryInputProps {
     input: DirectoryCommandInputParameter;
@@ -37,7 +37,7 @@ export const DirectoryInput = ({ input }: DirectoryInputProps) =>
         })}
         validate={[
             isRequiredInput(input)
-                ? require
+                ? (directory?: Directory) => directory ? undefined : ERROR_MESSAGE
                 : () => undefined,
         ]} />;
 
index 468a9c81df4c7108d294945858eeff93d2b8e40b..838aa5193b4e569b08cda44ee68a2f8af9518e89 100644 (file)
@@ -10,7 +10,7 @@ import {
     CWLType
 } from '~/models/workflow';
 import { Field } from 'redux-form';
-import { require } from '~/validators/require';
+import { ERROR_MESSAGE } from '~/validators/require';
 import { Input, Dialog, DialogTitle, DialogContent, DialogActions, Button } from '@material-ui/core';
 import { GenericInputProps, GenericInput } from './generic-input';
 import { ProjectsTreePicker } from '~/views-components/projects-tree-picker/projects-tree-picker';
@@ -37,7 +37,7 @@ export const FileInput = ({ input }: FileInputProps) =>
         })}
         validate={[
             isRequiredInput(input)
-                ? require
+                ? (file?: File) => file ? undefined : ERROR_MESSAGE
                 : () => undefined,
         ]} />;