X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/274f2f9408e4553643af1b8154050f052132714e..HEAD:/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 f687e28d..63c990fa 100644 --- a/src/views/run-process-panel/inputs/directory-input.tsx +++ b/src/views/run-process-panel/inputs/directory-input.tsx @@ -2,35 +2,37 @@ // // 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 { Input, Dialog, DialogTitle, DialogContent, DialogActions, Button, StyleRulesCallback, withStyles, WithStyles } from '@material-ui/core'; import { isRequiredInput, DirectoryCommandInputParameter, CWLType, Directory -} from '~/models/workflow'; +} from 'models/workflow'; import { GenericInputProps, GenericInput } from './generic-input'; -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'; +import { ProjectsTreePicker } from 'views-components/projects-tree-picker/projects-tree-picker'; +import { FileOperationLocation, getFileOperationLocation, initProjectsTreePicker } from 'store/tree-picker/tree-picker-actions'; +import { TreeItem } from 'components/tree/tree'; +import { ProjectsTreePickerItem } from 'store/tree-picker/tree-picker-middleware'; +import { ERROR_MESSAGE } from 'validators/require'; +import { Dispatch } from 'redux'; export interface DirectoryInputProps { input: DirectoryCommandInputParameter; options?: { showOnlyOwned: boolean, showOnlyWritable: boolean }; } + +type DialogContentCssRules = 'root' | 'pickerWrapper'; + export const DirectoryInput = ({ input, options }: DirectoryInputProps) => const format = (value?: Directory) => value ? value.basename : ''; -const parse = (directory: CollectionResource): Directory => ({ +const parse = (directory: FileOperationLocation): Directory => ({ class: CWLType.DIRECTORY, - location: `keep:${directory.portableDataHash}`, + location: `keep:${directory.pdh}${directory.subpath}`, basename: directory.name, }); @@ -56,11 +58,21 @@ const getValidation = memoize( interface DirectoryInputComponentState { open: boolean; - directory?: CollectionResource; + directory?: FileOperationLocation; } -const DirectoryInputComponent = connect()( - class FileInputComponent extends React.Component void; + getFileOperationLocation: (item: ProjectsTreePickerItem) => Promise; +} + +const mapDispatchToProps = (dispatch: Dispatch): DirectoryInputActionProps => ({ + initProjectsTreePicker: (pickerId: string) => dispatch(initProjectsTreePicker(pickerId)), + getFileOperationLocation: (item: ProjectsTreePickerItem) => dispatch(getFileOperationLocation(item)), +}); + +const DirectoryInputComponent = connect(null, mapDispatchToProps)( + class FileInputComponent extends React.Component { state: DirectoryInputComponentState = { @@ -68,14 +80,13 @@ const DirectoryInputComponent = connect()( }; componentDidMount() { - this.props.dispatch( - initProjectsTreePicker(this.props.commandInput.id)); + this.props.initProjectsTreePicker(this.props.commandInput.id); } render() { return <> {this.renderInput()} - {this.renderDialog()} + ; } @@ -92,12 +103,9 @@ const DirectoryInputComponent = connect()( this.props.input.onChange(this.state.directory); } - setDirectory = (_: {}, { data }: TreeItem) => { - if ('kind' in data && data.kind === ResourceKind.COLLECTION) { - this.setState({ directory: data }); - } else { - this.setState({ directory: undefined }); - } + setDirectory = async (_: {}, { data: item }: TreeItem) => { + const location = await this.props.getFileOperationLocation(item); + this.setState({ directory: location }); } renderInput() { @@ -114,32 +122,47 @@ const DirectoryInputComponent = connect()( {...this.props} />; } - renderDialog() { - return - Choose a directory - - - - - - - - ; - } + dialogContentStyles: StyleRulesCallback = ({ spacing }) => ({ + root: { + display: 'flex', + flexDirection: 'column', + }, + pickerWrapper: { + flexBasis: `${spacing.unit * 8}vh`, + flexShrink: 1, + minHeight: 0, + }, + }); + + dialog = withStyles(this.dialogContentStyles)( + ({ classes }: WithStyles) => + + Choose a directory + +
+ +
+
+ + + + +
+ ); }); - -