css styles on top
[arvados-workbench2.git] / src / views-components / dialog-create / dialog-project-create.tsx
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import * as React from 'react';
6 import { reduxForm, Field } from 'redux-form';
7 import { compose } from 'redux';
8 import TextField from '@material-ui/core/TextField';
9 import Dialog from '@material-ui/core/Dialog';
10 import DialogActions from '@material-ui/core/DialogActions';
11 import DialogContent from '@material-ui/core/DialogContent';
12 import DialogTitle from '@material-ui/core/DialogTitle';
13 import { Button, StyleRulesCallback, WithStyles, withStyles, CircularProgress } from '@material-ui/core';
14
15 import { NAME, DESCRIPTION } from '../../validators/create-project/create-project-validator';
16
17 type CssRules = "button" | "lastButton" | "formContainer" | "textField" | "dialog" | "dialogTitle" | "createProgress" | "dialogActions";
18
19 const styles: StyleRulesCallback<CssRules> = theme => ({
20     button: {
21         marginLeft: theme.spacing.unit
22     },
23     lastButton: {
24         marginLeft: theme.spacing.unit,
25         marginRight: "20px",
26     },
27     formContainer: {
28         display: "flex",
29         flexDirection: "column",
30         marginTop: "20px",
31     },
32     dialogTitle: {
33         paddingBottom: "0"
34     },
35     textField: {
36         marginTop: "32px",
37     },
38     dialog: {
39         minWidth: "600px",
40         minHeight: "320px"
41     },
42     createProgress: {
43         position: "absolute",
44         minWidth: "20px",
45         right: "95px"
46     },
47     dialogActions: {
48         marginBottom: "24px"
49     }
50 });
51 interface DialogProjectProps {
52     open: boolean;
53     handleClose: () => void;
54     onSubmit: (data: { name: string, description: string }) => void;
55     handleSubmit: any;
56     submitting: boolean;
57 }
58
59 interface TextFieldProps {
60     label: string;
61     floatinglabeltext: string;
62     className?: string;
63     input?: string;
64     meta?: any;
65 }
66
67 class DialogProjectCreate extends React.Component<DialogProjectProps & WithStyles<CssRules>> {
68     render() {
69         const { classes, open, handleClose, handleSubmit, onSubmit, submitting } = this.props;
70
71         return (
72             <Dialog
73                 open={open}
74                 onClose={handleClose}
75                 disableBackdropClick={true}
76                 disableEscapeKeyDown={true}>
77                 <div className={classes.dialog}>
78                     <form onSubmit={handleSubmit((data: any) => onSubmit(data))}>
79                         <DialogTitle id="form-dialog-title" className={classes.dialogTitle}>Create a project</DialogTitle>
80                         <DialogContent className={classes.formContainer}>
81                             <Field name="name"
82                                 component={this.renderTextField}
83                                 floatinglabeltext="Project Name"
84                                 validate={NAME}
85                                 className={classes.textField}
86                                 label="Project Name" />
87                             <Field name="description"
88                                 component={this.renderTextField}
89                                 floatinglabeltext="Description - optional"
90                                 validate={DESCRIPTION}
91                                 className={classes.textField}
92                                 label="Description - optional" />
93                         </DialogContent>
94                         <DialogActions className={classes.dialogActions}>
95                             <Button onClick={handleClose} className={classes.button} color="primary" disabled={submitting}>CANCEL</Button>
96                             <Button type="submit"
97                                 className={classes.lastButton}
98                                 color="primary"
99                                 disabled={submitting}
100                                 variant="contained">
101                                 CREATE A PROJECT
102                             </Button>
103                             {submitting && <CircularProgress size={20} className={classes.createProgress} />}
104                         </DialogActions>
105                     </form>
106                 </div>
107             </Dialog>
108         );
109     }
110
111     renderTextField = ({ input, label, meta: { touched, error }, ...custom }: TextFieldProps) => (
112         <TextField
113             helperText={touched && error}
114             label={label}
115             className={this.props.classes.textField}
116             error={touched && !!error}
117             autoComplete='off'
118             {...input}
119             {...custom}
120         />
121     )
122 }
123
124 export default compose(
125     reduxForm({ form: 'projectCreateDialog' }),
126     withStyles(styles)
127 )(DialogProjectCreate);