X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/acf6467a572a10268e8cd8687d9ea5864f729639..10ce16c28de952f6533ca3cc9df909269e3d2a53:/src/views-components/dialog-create/dialog-project-create.tsx diff --git a/src/views-components/dialog-create/dialog-project-create.tsx b/src/views-components/dialog-create/dialog-project-create.tsx index 5f21cc9e..34c655e2 100644 --- a/src/views-components/dialog-create/dialog-project-create.tsx +++ b/src/views-components/dialog-create/dialog-project-create.tsx @@ -3,6 +3,8 @@ // SPDX-License-Identifier: AGPL-3.0 import * as React from 'react'; +import { reduxForm, Field } from 'redux-form'; +import { compose } from 'redux'; import TextField from '@material-ui/core/TextField'; import Dialog from '@material-ui/core/Dialog'; import DialogActions from '@material-ui/core/DialogActions'; @@ -10,159 +12,117 @@ import DialogContent from '@material-ui/core/DialogContent'; import DialogTitle from '@material-ui/core/DialogTitle'; import { Button, StyleRulesCallback, WithStyles, withStyles, CircularProgress } from '@material-ui/core'; -import Validator from '../../utils/dialog-validator'; +import { NAME, DESCRIPTION } from '../../validators/create-project/create-project-validator'; -interface ProjectCreateProps { - open: boolean; - pending: boolean; - error: string; - handleClose: () => void; - onSubmit: (data: { name: string, description: string }) => void; +interface DialogProjectProps { + open: boolean; + handleClose: () => void; + onSubmit: (data: { name: string, description: string }) => void; + handleSubmit: any; + submitting: boolean; } -interface DialogState { - name: string; - description: string; - isNameValid: boolean; - isDescriptionValid: boolean; - duplicatedName: string; +interface TextFieldProps { + label: string; + floatinglabeltext: string; + className?: string; + input?: string; + meta?: any; } -class DialogProjectCreate extends React.Component> { - state: DialogState = { - name: '', - description: '', - isNameValid: false, - isDescriptionValid: true, - duplicatedName: '' - }; - - componentWillReceiveProps(nextProps: ProjectCreateProps) { - const { error } = nextProps; - - if (this.props.error !== error) { - this.setState({ - duplicatedName: error - }); +class DialogProjectCreate extends React.Component> { + render() { + const { classes, open, handleClose, handleSubmit, onSubmit, submitting } = this.props; + + return ( + +
+
onSubmit(data))}> + Create a project + + + + + + + + {submitting && } + +
+
+
+ ); } - } - - render() { - const { name, description, isNameValid, isDescriptionValid, duplicatedName } = this.state; - const { classes, open, handleClose, pending } = this.props; - - return ( - -
- Create a project - - this.isNameValid(e)} - isRequired={true} - duplicatedName={duplicatedName} - render={hasError => - this.handleProjectName(e)} - label="Project name" - error={hasError || !!duplicatedName} - fullWidth />} /> - this.isDescriptionValid(e)} - isRequired={false} - render={hasError => - this.handleDescriptionValue(e)} - label="Description - optional" - error={hasError} - fullWidth />} /> - - - - - {pending && } - -
-
- ); - } - - handleSubmit = () => { - this.props.onSubmit({ - name: this.state.name, - description: this.state.description - }); - } - handleProjectName(e: any) { - this.setState({ - name: e.target.value, - duplicatedName: '' - }); - } - - handleDescriptionValue(e: any) { - this.setState({ - description: e.target.value, - }); - } - - isNameValid(value: boolean | string) { - this.setState({ - isNameValid: value, - }); - } - - isDescriptionValid(value: boolean | string) { - this.setState({ - isDescriptionValid: value, - }); - } + renderTextField = ({ input, label, meta: { touched, error }, ...custom }: TextFieldProps) => ( + + ) } -type CssRules = "button" | "lastButton" | "dialogContent" | "textField" | "dialog" | "dialogTitle" | "createProgress"; +type CssRules = "button" | "lastButton" | "formContainer" | "textField" | "dialog" | "dialogTitle" | "createProgress" | "dialogActions"; const styles: StyleRulesCallback = theme => ({ - button: { - marginLeft: theme.spacing.unit - }, - lastButton: { - marginLeft: theme.spacing.unit, - marginRight: "20px", - }, - dialogContent: { - marginTop: "20px", - }, - dialogTitle: { - paddingBottom: "0" - }, - textField: { - marginTop: "32px", - }, - dialog: { - minWidth: "600px", - minHeight: "320px" - }, - createProgress: { - position: "absolute", - minWidth: "20px", - right: "95px" - } + button: { + marginLeft: theme.spacing.unit + }, + lastButton: { + marginLeft: theme.spacing.unit, + marginRight: "20px", + }, + formContainer: { + display: "flex", + flexDirection: "column", + marginTop: "20px", + }, + dialogTitle: { + paddingBottom: "0" + }, + textField: { + marginTop: "32px", + }, + dialog: { + minWidth: "600px", + minHeight: "320px" + }, + createProgress: { + position: "absolute", + minWidth: "20px", + right: "95px" + }, + dialogActions: { + marginBottom: "24px" + } }); -export default withStyles(styles)(DialogProjectCreate); \ No newline at end of file +export default compose( + reduxForm({ form: 'projectCreateDialog' }), + withStyles(styles) +)(DialogProjectCreate);