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
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import React from 'react';
6 import { Grid, StyleRulesCallback, Divider, IconButton, Typography } from '@material-ui/core';
7 import {
8     Field,
9     WrappedFieldProps,
10     WrappedFieldArrayProps,
11     FieldArray,
12     FieldArrayFieldsProps
13 } from 'redux-form';
14 import { PermissionSelect, formatPermissionLevel, parsePermissionLevel } from './permission-select';
15 import { WithStyles } from '@material-ui/core/styles';
16 import withStyles from '@material-ui/core/styles/withStyles';
17 import { CloseIcon } from 'components/icon/icon';
18
19 const SharingManagementFormComponent = (props: { onSave: () => void; }) =>
20     <FieldArray<{ onSave: () => void }> name='permissions' component={SharingManagementFieldArray as any} props={props} />;
21
22 export default SharingManagementFormComponent;
23
24 const SharingManagementFieldArray = ({ fields, onSave }: { onSave: () => void } & WrappedFieldArrayProps<{ email: string }>) =>
25     <div>{fields.map((field, index, fields) =>
26         <PermissionManagementRow key={field} {...{ field, index, fields }} onSave={onSave} />)}
27         <Divider />
28     </div>;
29
30 const permissionManagementRowStyles: StyleRulesCallback<'root'> = theme => ({
31     root: {
32         padding: `${theme.spacing.unit}px 0`,
33     }
34 });
35
36 const PermissionManagementRow = withStyles(permissionManagementRowStyles)(
37     ({ field, index, fields, classes, onSave }: { field: string, index: number, fields: FieldArrayFieldsProps<{ email: string }>, onSave: () => void; } & WithStyles<'root'>) =>
38         <>
39             <Divider />
40             <Grid container alignItems='center' spacing={8} wrap='nowrap' className={classes.root}>
41                 <Grid item xs={8}>
42                     <Typography noWrap variant='subtitle1'>{fields.get(index).email}</Typography>
43                 </Grid>
44                 <Grid item xs={4} container wrap='nowrap'>
45                     <Field
46                         name={`${field}.permissions` as string}
47                         component={PermissionSelectComponent}
48                         format={formatPermissionLevel}
49                         parse={parsePermissionLevel}
50                         onChange={onSave}
51                     />
52                     <IconButton onClick={() => { fields.remove(index); onSave(); }}>
53                         <CloseIcon />
54                     </IconButton>
55                 </Grid>
56             </Grid>
57         </>
58 );
59
60 const PermissionSelectComponent = ({ input }: WrappedFieldProps) =>
61     <PermissionSelect fullWidth disableUnderline {...input} />;