// Copyright (C) The Arvados Authors. All rights reserved. // // SPDX-License-Identifier: AGPL-3.0 import React from 'react'; import { connect, DispatchProp } from 'react-redux'; import { Field } from 'redux-form'; import { Input, Dialog, DialogTitle, DialogContent, DialogActions, Button, withStyles, WithStyles, StyleRulesCallback } from '@material-ui/core'; import { GenericCommandInputParameter } from 'models/workflow'; import { GenericInput, GenericInputProps } 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 'store/tree-picker/tree-picker-middleware'; import { ProjectResource } from 'models/project'; import { ResourceKind } from 'models/resource'; import { RootState } from 'store/store'; import { getUserUuid } from 'common/getuser'; export type ProjectCommandInputParameter = GenericCommandInputParameter; const require: any = (value?: ProjectResource) => (value === undefined); export interface ProjectInputProps { required: boolean; input: ProjectCommandInputParameter; options?: { showOnlyOwned: boolean, showOnlyWritable: boolean }; } type DialogContentCssRules = 'root' | 'pickerWrapper'; export const ProjectInput = ({ required, input, options }: ProjectInputProps) => ; const format = (value?: ProjectResource) => value ? value.name : ''; interface ProjectInputComponentState { open: boolean; project?: ProjectResource; } interface HasUserUuid { userUuid: string; }; const mapStateToProps = (state: RootState) => ({ userUuid: getUserUuid(state) }); export const ProjectInputComponent = connect(mapStateToProps)( class ProjectInputComponent extends React.Component { state: ProjectInputComponentState = { open: false, }; componentDidMount() { this.props.dispatch( initProjectsTreePicker(this.props.commandInput.id)); } render() { return <> {this.renderInput()} ; } openDialog = () => { this.componentDidMount(); this.setState({ open: true }); } closeDialog = () => { this.setState({ open: false }); } submit = () => { this.closeDialog(); this.props.input.onChange(this.state.project); } setProject = (_: {}, { data }: TreeItem) => { if ('kind' in data && data.kind === ResourceKind.PROJECT) { this.setState({ project: data }); } else { this.setState({ project: undefined }); } } invalid = () => (!this.state.project || !this.state.project.canWrite); renderInput() { return } {...this.props} />; } dialogContentStyles: StyleRulesCallback = ({ spacing }) => ({ root: { display: 'flex', flexDirection: 'column', }, pickerWrapper: { flexBasis: `${spacing.unit * 8}vh`, flexShrink: 1, minHeight: 0, }, }); dialog = withStyles(this.dialogContentStyles)( ({ classes }: WithStyles) => this.state.open ? Choose a project
: null ); });