20085: Almost works, needs to save on change to share/public/private
[arvados-workbench2.git] / src / views-components / sharing-dialog / sharing-management-form-component.tsx
index 688f416f036d23bbd715c29cdc40ab4d9a166434..43f95bb9bc4d5beb5972d1fe0e20cc435e08f3d8 100644 (file)
@@ -2,23 +2,28 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import * as React from 'react';
-import { Grid, StyleRulesCallback, Divider } from '@material-ui/core';
-import { Field, WrappedFieldProps, WrappedFieldArrayProps, FieldArray, FieldsProps } from 'redux-form';
-import { PermissionSelect } from './permission-select';
+import React from 'react';
+import { Grid, StyleRulesCallback, Divider, IconButton, Typography } from '@material-ui/core';
+import {
+    Field,
+    WrappedFieldProps,
+    WrappedFieldArrayProps,
+    FieldArray,
+    FieldArrayFieldsProps
+} from 'redux-form';
+import { PermissionSelect, formatPermissionLevel, parsePermissionLevel } from './permission-select';
 import { WithStyles } from '@material-ui/core/styles';
 import withStyles from '@material-ui/core/styles/withStyles';
+import { CloseIcon } from 'components/icon/icon';
 
+const SharingManagementFormComponent = (props: { onSave: () => void; }) =>
+    <FieldArray<{ onSave: () => void }> name='permissions' component={SharingManagementFieldArray as any} props={props} />;
 
-export default () =>
-    <FieldArray name='permissions' component={SharingManagementFieldArray} />;
+export default SharingManagementFormComponent;
 
-const SharingManagementFieldArray = ({ fields }: WrappedFieldArrayProps<{ email: string }>) =>
-    <div>
-        {
-            fields.map((field, index, fields) =>
-                <PermissionManagementRow key={field} {...{ field, index, fields }} />)
-        }
+const SharingManagementFieldArray = ({ fields, onSave }: { onSave: () => void } & WrappedFieldArrayProps<{ email: string }>) =>
+    <div>{fields.map((field, index, fields) =>
+        <PermissionManagementRow key={field} {...{ field, index, fields }} onSave={onSave} />)}
         <Divider />
     </div>;
 
@@ -27,16 +32,26 @@ const permissionManagementRowStyles: StyleRulesCallback<'root'> = theme => ({
         padding: `${theme.spacing.unit}px 0`,
     }
 });
+
 const PermissionManagementRow = withStyles(permissionManagementRowStyles)(
-    ({ field, index, fields, classes }: { field: string, index: number, fields: FieldsProps<{ email: string }> } & WithStyles<'root'>) =>
+    ({ field, index, fields, classes, onSave }: { field: string, index: number, fields: FieldArrayFieldsProps<{ email: string }>, onSave: () => void; } & WithStyles<'root'>) =>
         <>
             <Divider />
-            <Grid container alignItems='center' spacing={8} className={classes.root}>
+            <Grid container alignItems='center' spacing={8} wrap='nowrap' className={classes.root}>
                 <Grid item xs={8}>
-                    {fields.get(index).email}
+                    <Typography noWrap variant='subtitle1'>{fields.get(index).email}</Typography>
                 </Grid>
-                <Grid item xs={4}>
-                    <Field name={`${field}.permissions`} component={PermissionSelectComponent} />
+                <Grid item xs={4} container wrap='nowrap'>
+                    <Field
+                        name={`${field}.permissions` as string}
+                        component={PermissionSelectComponent}
+                        format={formatPermissionLevel}
+                        parse={parsePermissionLevel}
+                        onChange={onSave}
+                    />
+                    <IconButton onClick={() => { fields.remove(index); onSave(); }}>
+                        <CloseIcon />
+                    </IconButton>
                 </Grid>
             </Grid>
         </>