20085: Fix quirky behavior when removing share with public/all users row
[arvados-workbench2.git] / src / views-components / sharing-dialog / sharing-public-access-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, Typography } from '@material-ui/core';
7 import { Field, WrappedFieldProps } from 'redux-form';
8 import { WithStyles } from '@material-ui/core/styles';
9 import withStyles from '@material-ui/core/styles/withStyles';
10 import { VisibilityLevelSelect } from './visibility-level-select';
11 import { VisibilityLevel } from 'store/sharing-dialog/sharing-dialog-types';
12
13 const sharingPublicAccessStyles: StyleRulesCallback<'root'> = theme => ({
14     root: {
15         padding: `${theme.spacing.unit * 2}px 0`,
16     }
17 });
18
19 interface AccessProps {
20     visibility: VisibilityLevel;
21     includePublic: boolean;
22     onSave: () => void;
23 }
24
25 const SharingPublicAccessForm = withStyles(sharingPublicAccessStyles)(
26     ({ classes, visibility, includePublic, onSave }: WithStyles<'root'> & AccessProps) =>
27         <>
28             <Divider />
29             <Grid container alignItems='center' spacing={8} className={classes.root}>
30                 <Grid item xs={8}>
31                     <Typography variant='subtitle1'>
32                         {renderVisibilityInfo(visibility)}
33                     </Typography>
34                 </Grid>
35                 <Grid item xs={4} container wrap='nowrap'>
36                     <Field<{ includePublic: boolean }> name='visibility' component={VisibilityLevelSelectComponent} includePublic={includePublic} onChange={onSave} />
37                 </Grid>
38             </Grid>
39         </>
40 );
41
42 const renderVisibilityInfo = (visibility: VisibilityLevel) => {
43     switch (visibility) {
44         case VisibilityLevel.PUBLIC:
45             return 'Anyone on the Internet can access';
46         case VisibilityLevel.ALL_USERS:
47             return 'All users on this cluster can access';
48         case VisibilityLevel.SHARED:
49             return 'Specific people can access';
50         case VisibilityLevel.PRIVATE:
51             return 'Only you can access';
52         default:
53             return '';
54     }
55 };
56
57 const SharingPublicAccessFormComponent = ({ visibility, includePublic, onSave }: AccessProps) =>
58     <SharingPublicAccessForm {...{ visibility, includePublic, onSave }} />;
59
60 export default SharingPublicAccessFormComponent;
61
62 const VisibilityLevelSelectComponent = ({ input, includePublic }: { includePublic: boolean } & WrappedFieldProps) =>
63     <VisibilityLevelSelect fullWidth disableUnderline includePublic={includePublic} {...input} />;