Merge branch '14502_admin_compute_nodes'
[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 * as React from 'react';
6 import { Grid, StyleRulesCallback, Divider, IconButton, Typography } from '@material-ui/core';
7 import { Field, WrappedFieldProps, WrappedFieldArrayProps, FieldArray, FieldsProps } from 'redux-form';
8 import { PermissionSelect, formatPermissionLevel, parsePermissionLevel } from './permission-select';
9 import { WithStyles } from '@material-ui/core/styles';
10 import withStyles from '@material-ui/core/styles/withStyles';
11 import { CloseIcon } from '~/components/icon/icon';
12
13
14 export default () =>
15     <FieldArray name='permissions' component={SharingManagementFieldArray} />;
16
17 const SharingManagementFieldArray = ({ fields }: WrappedFieldArrayProps<{ email: string }>) =>
18     <div>
19         {
20             fields.map((field, index, fields) =>
21                 <PermissionManagementRow key={field} {...{ field, index, fields }} />)
22         }
23         <Divider />
24     </div>;
25
26 const permissionManagementRowStyles: StyleRulesCallback<'root'> = theme => ({
27     root: {
28         padding: `${theme.spacing.unit}px 0`,
29     }
30 });
31 const PermissionManagementRow = withStyles(permissionManagementRowStyles)(
32     ({ field, index, fields, classes }: { field: string, index: number, fields: FieldsProps<{ email: string }> } & WithStyles<'root'>) =>
33         <>
34             <Divider />
35             <Grid container alignItems='center' spacing={8} wrap='nowrap' className={classes.root}>
36                 <Grid item xs={8}>
37                     <Typography noWrap variant='subheading'>{fields.get(index).email}</Typography>
38                 </Grid>
39                 <Grid item xs={4} container wrap='nowrap'>
40                     <Field
41                         name={`${field}.permissions`}
42                         component={PermissionSelectComponent}
43                         format={formatPermissionLevel}
44                         parse={parsePermissionLevel} />
45                     <IconButton onClick={() => fields.remove(index)}>
46                         <CloseIcon />
47                     </IconButton>
48                 </Grid>
49             </Grid>
50         </>
51 );
52
53 const PermissionSelectComponent = ({ input }: WrappedFieldProps) =>
54     <PermissionSelect fullWidth disableUnderline {...input} />;