Extract form dialog component
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Fri, 17 Aug 2018 14:38:28 +0000 (16:38 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Fri, 17 Aug 2018 14:38:28 +0000 (16:38 +0200)
Feature #14014

Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski@contractors.roche.com>

src/components/form-dialog/form-dialog.tsx [new file with mode: 0644]
src/views-components/dialog-create/dialog-collection-create-selected.tsx

diff --git a/src/components/form-dialog/form-dialog.tsx b/src/components/form-dialog/form-dialog.tsx
new file mode 100644 (file)
index 0000000..29c0b16
--- /dev/null
@@ -0,0 +1,89 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import * as 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';
+
+type CssRules = "button" | "lastButton" | "formContainer" | "textField" | "dialog" | "dialogTitle" | "progressIndicator" | "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"
+    },
+    textField: {
+        marginTop: "32px",
+    },
+    dialog: {
+        minWidth: "600px",
+        minHeight: "320px"
+    },
+    progressIndicator: {
+        position: "absolute",
+        minWidth: "20px",
+    },
+    dialogActions: {
+        marginBottom: "24px"
+    }
+});
+
+interface DialogProjectProps {
+    cancelLabel?: string;
+    dialogTitle: string;
+    formFields: React.ComponentType<InjectedFormProps<any>>;
+    submitLabel?: string;
+}
+
+export const FormDialog = withStyles(styles)((props: DialogProjectProps & WithDialogProps<{}> & InjectedFormProps<any> & WithStyles<CssRules>) =>
+    <Dialog
+        open={props.open}
+        onClose={props.closeDialog}
+        disableBackdropClick={props.submitting}
+        disableEscapeKeyDown={props.submitting}>
+        <div className={props.classes.dialog}>
+            <form>
+                <DialogTitle className={props.classes.dialogTitle}>
+                    {props.dialogTitle}
+                </DialogTitle>
+                <DialogContent className={props.classes.formContainer}>
+                    <props.formFields {...props} />
+                </DialogContent>
+                <DialogActions className={props.classes.dialogActions}>
+                    <Button
+                        onClick={props.closeDialog}
+                        className={props.classes.button}
+                        color="primary"
+                        disabled={props.submitting}>
+                        {props.cancelLabel || 'Cancel'}
+                    </Button>
+                    <Button
+                        onClick={props.handleSubmit}
+                        className={props.classes.lastButton}
+                        color="primary"
+                        disabled={props.invalid || props.submitting || props.pristine}
+                        variant="contained">
+                        {props.submitLabel || 'Submit'}
+                        {props.submitting && <CircularProgress size={20} className={props.classes.progressIndicator} />}
+                    </Button>
+                </DialogActions>
+            </form>
+        </div>
+    </Dialog>
+);
+
+
index af2536df9512a66b89a1d013a5345c6b579bb690..70837471ffc6e23d8b52789df98b21bcd3a3795f 100644 (file)
@@ -4,57 +4,38 @@
 
 import * as React from "react";
 import { InjectedFormProps, Field, WrappedFieldProps } from "redux-form";
-import { Dialog, DialogTitle, DialogContent, DialogActions, Button, CircularProgress } from "@material-ui/core";
 import { WithDialogProps } from "~/store/dialog/with-dialog";
 import { TextField } from "~/components/text-field/text-field";
 import { COLLECTION_NAME_VALIDATION, COLLECTION_DESCRIPTION_VALIDATION, COLLECTION_PROJECT_VALIDATION } from "~/validators/validators";
 import { ProjectTreePicker } from "../project-tree-picker/project-tree-picker";
+import { FormDialog } from '../../components/form-dialog/form-dialog';
 
 export const DialogCollectionCreateWithSelected = (props: WithDialogProps<string> & InjectedFormProps<{ name: string }>) =>
-    <form>
-        <Dialog open={props.open}
-            disableBackdropClick={true}
-            disableEscapeKeyDown={true}>
-            <DialogTitle>Create a collection</DialogTitle>
-            <DialogContent style={{ display: 'flex' }}>
-                <div>
-                    <Field
-                        name='name'
-                        component={TextField}
-                        validate={COLLECTION_NAME_VALIDATION}
-                        label="Collection Name" />
-                    <Field
-                        name='description'
-                        component={TextField}
-                        validate={COLLECTION_DESCRIPTION_VALIDATION}
-                        label="Description - optional" />
-                </div>
-                <Field
-                    name="projectUuid"
-                    component={Picker}
-                    validate={COLLECTION_PROJECT_VALIDATION} />
-            </DialogContent>
-            <DialogActions>
-                <Button
-                    variant='flat'
-                    color='primary'
-                    disabled={props.submitting}
-                    onClick={props.closeDialog}>
-                    Cancel
-                    </Button>
-                <Button
-                    variant='contained'
-                    color='primary'
-                    type='submit'
-                    onClick={props.handleSubmit}
-                    disabled={props.pristine || props.invalid || props.submitting}>
-                    {props.submitting
-                        ? <CircularProgress size={20} />
-                        : 'Create a collection'}
-                </Button>
-            </DialogActions>
-        </Dialog>
-    </form>;
+    <FormDialog
+        dialogTitle='Create a collection'
+        formFields={FormFields}
+        submitLabel='Create a collection'
+        {...props}
+    />;
+
+const FormFields = () => <div style={{ display: 'flex' }}>
+    <div>
+        <Field
+            name='name'
+            component={TextField}
+            validate={COLLECTION_NAME_VALIDATION}
+            label="Collection Name" />
+        <Field
+            name='description'
+            component={TextField}
+            validate={COLLECTION_DESCRIPTION_VALIDATION}
+            label="Description - optional" />
+    </div>
+    <Field
+        name="projectUuid"
+        component={Picker}
+        validate={COLLECTION_PROJECT_VALIDATION} />
+</div>;
 
 const Picker = (props: WrappedFieldProps) =>
     <div style={{ width: '400px', height: '144px', display: 'flex', flexDirection: 'column' }}>