// Copyright (C) The Arvados Authors. All rights reserved. // // SPDX-License-Identifier: AGPL-3.0 import * as React from 'react'; import { isRequiredInput, FileCommandInputParameter, File, CWLType } from '~/models/workflow'; import { Field } from 'redux-form'; 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'; 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 { CollectionFile, CollectionFileType } from '~/models/collection-file'; export interface FileInputProps { input: FileCommandInputParameter; } export const FileInput = ({ input }: FileInputProps) => value ? value.basename : ''} parse={(file: CollectionFile): File => ({ class: CWLType.FILE, location: `keep:${file.id}`, basename: file.name, })} validate={[ isRequiredInput(input) ? (file?: File) => file ? undefined : ERROR_MESSAGE : () => undefined, ]} />; interface FileInputComponentState { open: boolean; file?: CollectionFile; } const FileInputComponent = connect()( class FileInputComponent extends React.Component { state: FileInputComponentState = { 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.file); } setFile = (event: React.MouseEvent, { data }: TreeItem, pickerId: string) => { if ('type' in data && data.type === CollectionFileType.FILE) { this.setState({ file: data }); } else { this.setState({ file: undefined }); } } renderInput() { return } {...this.props} />; } renderDialog() { return Choose a file ; } });