From a76de01ade8b658f82118b1f8987ee43ffad2797 Mon Sep 17 00:00:00 2001 From: Michal Klobukowski Date: Thu, 11 Oct 2018 20:56:32 +0200 Subject: [PATCH] Create collection input Feature #13862 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- .../inputs/directory-input.tsx | 128 ++++++++++++++++++ .../run-process-inputs-form.tsx | 6 +- 2 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 src/views/run-process-panel/inputs/directory-input.tsx diff --git a/src/views/run-process-panel/inputs/directory-input.tsx b/src/views/run-process-panel/inputs/directory-input.tsx new file mode 100644 index 00000000..c0e21e8e --- /dev/null +++ b/src/views/run-process-panel/inputs/directory-input.tsx @@ -0,0 +1,128 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + +import * as React from 'react'; +import { + isRequiredInput, + DirectoryCommandInputParameter, + CWLType, + 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'; +import { connect, DispatchProp } from 'react-redux'; +import { initProjectsTreePicker } from '~/store/tree-picker/tree-picker-actions'; +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'; + +export interface DirectoryInputProps { + input: DirectoryCommandInputParameter; +} +export const DirectoryInput = ({ input }: DirectoryInputProps) => + value ? value.basename : ''} + parse={(directory: CollectionResource): Directory => ({ + class: CWLType.DIRECTORY, + location: `keep:${directory.portableDataHash}`, + basename: directory.name, + })} + validate={[ + isRequiredInput(input) + ? require + : () => undefined, + ]} />; + + +interface DirectoryInputComponentState { + open: boolean; + directory?: CollectionResource; +} + +const DirectoryInputComponent = connect()( + class FileInputComponent extends React.Component { + state: DirectoryInputComponentState = { + open: false, + }; + + componentDidMount() { + this.props.dispatch( + initProjectsTreePicker(this.props.commandInput.id)); + } + + render() { + return <> + {this.renderInput()} + {this.renderDialog()} + ; + } + + openDialog = () => { + this.setState({ open: true }); + } + + closeDialog = () => { + this.setState({ open: false }); + } + + submit = () => { + this.closeDialog(); + this.props.input.onChange(this.state.directory); + } + + setDirectory = (event: React.MouseEvent, { data }: TreeItem, pickerId: string) => { + if ('kind' in data && data.kind === ResourceKind.COLLECTION) { + this.setState({ directory: data }); + } else { + this.setState({ directory: undefined }); + } + } + + renderInput() { + return + } + {...this.props} />; + } + + renderDialog() { + return + Choose a directory + + + + + + + + ; + } + + }); + + 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 b0d5d5fe..41355b2a 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 } from '~/models/workflow'; +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'; @@ -15,6 +15,7 @@ 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'; export const RUN_PROCESS_INPUTS_FORM = 'runProcessInputsForm'; @@ -71,6 +72,9 @@ const getInputComponent = (input: CommandInputParameter) => { case isPrimitiveOfType(input, CWLType.FILE): return ; + + case isPrimitiveOfType(input, CWLType.DIRECTORY): + return ; case typeof input.type === 'object' && !(input.type instanceof Array) && -- 2.30.2