// Copyright (C) The Arvados Authors. All rights reserved. // // SPDX-License-Identifier: AGPL-3.0 import * as 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 { 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'; export interface DirectoryInputProps { input: DirectoryCommandInputParameter; } export const DirectoryInput = ({ input }: DirectoryInputProps) => ; 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; 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 = (_: {}, { data }: TreeItem) => { 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 ; } });