// Copyright (C) The Arvados Authors. All rights reserved. // // SPDX-License-Identifier: AGPL-3.0 import * as React from 'react'; import { reduxForm, Field } from 'redux-form'; import { compose } from 'redux'; import { TextField } from '~/components/text-field/text-field'; import { Dialog, DialogActions, DialogContent, DialogTitle } from '@material-ui/core/'; import { Button, StyleRulesCallback, WithStyles, withStyles, CircularProgress } from '@material-ui/core'; import { PROJECT_NAME_VALIDATION, PROJECT_DESCRIPTION_VALIDATION } from '~/validators/validators'; type CssRules = "button" | "lastButton" | "formContainer" | "dialog" | "dialogTitle" | "createProgress" | "dialogActions"; const styles: StyleRulesCallback<CssRules> = theme => ({ button: { marginLeft: theme.spacing.unit }, lastButton: { marginLeft: theme.spacing.unit, marginRight: "20px", }, formContainer: { display: "flex", flexDirection: "column", marginTop: "20px", }, dialogTitle: { paddingBottom: "0" }, dialog: { minWidth: "600px", minHeight: "320px" }, createProgress: { position: "absolute", minWidth: "20px", right: "95px" }, dialogActions: { marginBottom: "24px" } }); interface DialogProjectProps { open: boolean; handleClose: () => void; onSubmit: (data: { name: string, description: string }) => void; handleSubmit: any; submitting: boolean; invalid: boolean; pristine: boolean; } export const PROJECT_CREATE_DIALOG = "projectCreateDialog"; export const DialogProjectCreate = compose( reduxForm({ form: PROJECT_CREATE_DIALOG }), withStyles(styles))( class DialogProjectCreate extends React.Component<DialogProjectProps & WithStyles<CssRules>> { render() { const { classes, open, handleClose, handleSubmit, onSubmit, submitting, invalid, pristine } = this.props; return ( <Dialog open={open} onClose={handleClose} disableBackdropClick={true} disableEscapeKeyDown={true}> <div className={classes.dialog}> <form onSubmit={handleSubmit((data: any) => onSubmit(data))}> <DialogTitle id="form-dialog-title" className={classes.dialogTitle}>Create a project</DialogTitle> <DialogContent className={classes.formContainer}> <Field name="name" component={TextField} validate={PROJECT_NAME_VALIDATION} label="Project Name"/> <Field name="description" component={TextField} validate={PROJECT_DESCRIPTION_VALIDATION} label="Description - optional"/> </DialogContent> <DialogActions className={classes.dialogActions}> <Button onClick={handleClose} className={classes.button} color="primary" disabled={submitting}>CANCEL</Button> <Button type="submit" className={classes.lastButton} color="primary" disabled={invalid || submitting || pristine} variant="contained"> CREATE A PROJECT </Button> {submitting && <CircularProgress size={20} className={classes.createProgress}/>} </DialogActions> </form> </div> </Dialog> ); } } );