X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/0eaad7ee985d2534e030e2d2839392435c33bba2..3c7e3cdc547ad5468421e1c049daa94b0d4b8bc0:/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 index aa25fefc..36c14e53 100644 --- a/src/views/run-process-panel/inputs/directory-input.tsx +++ b/src/views/run-process-panel/inputs/directory-input.tsx @@ -2,45 +2,57 @@ // // SPDX-License-Identifier: AGPL-3.0 -import * as React from 'react'; +import React from 'react'; +import { connect, DispatchProp } from 'react-redux'; +import { memoize } from 'lodash/fp'; +import { Field } from 'redux-form'; +import { Input, Dialog, DialogTitle, DialogContent, DialogActions, Button } from '@material-ui/core'; import { isRequiredInput, DirectoryCommandInputParameter, CWLType, Directory -} from '~/models/workflow'; -import { Field } from 'redux-form'; -import { Input, Dialog, DialogTitle, DialogContent, DialogActions, Button } from '@material-ui/core'; +} from 'models/workflow'; 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'; -import { ERROR_MESSAGE } from '../../../validators/require'; +import { ProjectsTreePicker } from 'views-components/projects-tree-picker/projects-tree-picker'; +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'; +import { ERROR_MESSAGE } from 'validators/require'; export interface DirectoryInputProps { input: DirectoryCommandInputParameter; + options?: { showOnlyOwned: boolean, showOnlyWritable: boolean }; } -export const DirectoryInput = ({ input }: DirectoryInputProps) => +export const DirectoryInput = ({ input, options }: DirectoryInputProps) => value ? value.basename : ''} - parse={(directory: CollectionResource): Directory => ({ - class: CWLType.DIRECTORY, - location: `keep:${directory.portableDataHash}`, - basename: directory.name, - })} - validate={[ - isRequiredInput(input) - ? (directory?: Directory) => directory ? undefined : ERROR_MESSAGE - : () => undefined, - ]} />; - + format={format} + parse={parse} + {...{ + options + }} + validate={getValidation(input)} />; + +const format = (value?: Directory) => value ? value.basename : ''; + +const parse = (directory: CollectionResource): Directory => ({ + class: CWLType.DIRECTORY, + location: `keep:${directory.portableDataHash}`, + basename: directory.name, +}); + +const getValidation = memoize( + (input: DirectoryCommandInputParameter) => ([ + isRequiredInput(input) + ? (directory?: Directory) => directory ? undefined : ERROR_MESSAGE + : () => undefined, + ]) +); interface DirectoryInputComponentState { open: boolean; @@ -48,7 +60,9 @@ interface DirectoryInputComponentState { } const DirectoryInputComponent = connect()( - class FileInputComponent extends React.Component { + class FileInputComponent extends React.Component { state: DirectoryInputComponentState = { open: false, }; @@ -78,7 +92,7 @@ const DirectoryInputComponent = connect()( this.props.input.onChange(this.state.directory); } - setDirectory = (event: React.MouseEvent, { data }: TreeItem, pickerId: string) => { + setDirectory = (_: {}, { data }: TreeItem) => { if ('kind' in data && data.kind === ResourceKind.COLLECTION) { this.setState({ directory: data }); } else { @@ -105,12 +119,14 @@ const DirectoryInputComponent = connect()( open={this.state.open} onClose={this.closeDialog} fullWidth + data-cy="choose-a-directory-dialog" maxWidth='md'> Choose a directory