//
// SPDX-License-Identifier: AGPL-3.0
-import * as React from 'react';
+import React from 'react';
import { InjectedFormProps } from 'redux-form';
import { Dialog, DialogActions, DialogContent, DialogTitle } from '@material-ui/core/';
import { Button, StyleRulesCallback, WithStyles, withStyles, CircularProgress } from '@material-ui/core';
-import { WithDialogProps } from '~/store/dialog/with-dialog';
+import { WithDialogProps } from 'store/dialog/with-dialog';
-type CssRules = "button" | "lastButton" | "formContainer" | "dialogTitle" | "progressIndicator" | "dialogActions";
+type CssRules = "button" | "lastButton" | "form" | "formContainer" | "dialogTitle" | "progressIndicator" | "dialogActions";
const styles: StyleRulesCallback<CssRules> = theme => ({
button: {
},
lastButton: {
marginLeft: theme.spacing.unit,
- marginRight: "20px",
+ marginRight: "0",
+ },
+ form: {
+ display: 'flex',
+ overflowY: 'auto',
+ flexDirection: 'column',
+ flex: '0 1 auto',
},
formContainer: {
display: "flex",
flexDirection: "column",
- marginTop: "20px",
+ paddingBottom: "0",
},
dialogTitle: {
- paddingBottom: "0"
+ paddingTop: theme.spacing.unit,
+ paddingBottom: theme.spacing.unit,
},
progressIndicator: {
position: "absolute",
minWidth: "20px",
},
dialogActions: {
- marginBottom: "24px"
+ marginBottom: theme.spacing.unit,
+ marginRight: theme.spacing.unit * 3,
}
});
-interface DialogProjectProps {
+interface DialogProjectDataProps {
cancelLabel?: string;
dialogTitle: string;
formFields: React.ComponentType<InjectedFormProps<any> & WithDialogProps<any>>;
submitLabel?: string;
+ cancelCallback?: Function;
+ enableWhenPristine?: boolean;
+ doNotDisableCancel?: boolean;
}
-export const FormDialog = withStyles(styles)((props: DialogProjectProps & WithDialogProps<{}> & InjectedFormProps<any> & WithStyles<CssRules>) =>
+type DialogProjectProps = DialogProjectDataProps & WithDialogProps<{}> & InjectedFormProps<any> & WithStyles<CssRules>;
+
+export const FormDialog = withStyles(styles)((props: DialogProjectProps) =>
<Dialog
open={props.open}
onClose={props.closeDialog}
- disableBackdropClick={props.submitting}
+ disableBackdropClick
disableEscapeKeyDown={props.submitting}
- fullWidth>
- <form>
+ fullWidth
+ maxWidth='md'>
+ <form data-cy='form-dialog' className={props.classes.form}>
<DialogTitle className={props.classes.dialogTitle}>
{props.dialogTitle}
</DialogTitle>
</DialogContent>
<DialogActions className={props.classes.dialogActions}>
<Button
- onClick={props.closeDialog}
+ data-cy='form-cancel-btn'
+ onClick={() => {
+ props.closeDialog();
+
+ if (props.cancelCallback) {
+ props.cancelCallback();
+ props.reset();
+ props.initialize({});
+ }
+ }}
className={props.classes.button}
color="primary"
- disabled={props.submitting}>
+ disabled={props.doNotDisableCancel ? false : props.submitting}>
{props.cancelLabel || 'Cancel'}
</Button>
<Button
+ data-cy='form-submit-btn'
+ type="submit"
onClick={props.handleSubmit}
className={props.classes.lastButton}
color="primary"
- disabled={props.invalid || props.submitting || props.pristine}
+ disabled={props.invalid || props.submitting || (props.pristine && !props.enableWhenPristine)}
variant="contained">
{props.submitLabel || 'Submit'}
{props.submitting && <CircularProgress size={20} className={props.classes.progressIndicator} />}
</form>
</Dialog>
);
-
-