1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React from 'react';
6 import { Field, WrappedFieldProps, FieldArray, WrappedFieldArrayProps } from 'redux-form';
7 import { Grid, FormControl, InputLabel, Tooltip, IconButton, StyleRulesCallback, Typography } from '@material-ui/core';
8 import { PermissionSelect, parsePermissionLevel, formatPermissionLevel } from './permission-select';
9 import { ParticipantSelect, Participant } from './participant-select';
10 import { AddIcon } from 'components/icon/icon';
11 import { WithStyles } from '@material-ui/core/styles';
12 import withStyles from '@material-ui/core/styles/withStyles';
13 import { ArvadosTheme } from 'common/custom-theme';
15 type SharingStyles = 'root' | 'addButtonRoot' | 'addButtonPrimary' | 'addButtonDisabled' | 'shareWarning' ;
17 const styles: StyleRulesCallback<SharingStyles> = (theme: ArvadosTheme) => ({
19 padding: `${theme.spacing.unit}px 0`,
29 color: theme.palette.primary.contrastText,
30 background: theme.palette.primary.main,
32 background: theme.palette.primary.dark,
39 color: theme.palette.error.main,
46 const SharingInvitationFormComponent = (props: { onSave: () => void, saveEnabled: boolean }) => <StyledSharingInvitationFormComponent onSave={props.onSave} saveEnabled={props.saveEnabled} />
48 export default SharingInvitationFormComponent;
50 const StyledSharingInvitationFormComponent = withStyles(styles)(
51 ({ onSave, saveEnabled, classes }: { onSave: () => void, saveEnabled: boolean } & WithStyles<SharingStyles>) =>
52 <Grid container spacing={8} wrap='nowrap' className={classes.root} >
53 <Grid data-cy="invite-people-field" item xs={8}>
54 <InvitedPeopleField />
58 className={classes.shareWarning}
60 You must click 🞤 to add a participant.
63 <Grid data-cy="permission-select-field" item xs={4} container wrap='nowrap'>
64 <PermissionSelectField />
65 <IconButton onClick={onSave} disabled={!saveEnabled} color="primary" classes={{
66 root: classes.addButtonRoot,
67 colorPrimary: classes.addButtonPrimary,
68 disabled: classes.addButtonDisabled
70 data-cy='add-invited-people'>
71 <Tooltip title="Add authorization">
78 const InvitedPeopleField = () =>
81 component={InvitedPeopleFieldComponent as any} />;
84 const InvitedPeopleFieldComponent = ({ fields }: WrappedFieldArrayProps<Participant>) =>
86 items={fields.getAll() || []}
87 onSelect={fields.push}
88 onDelete={fields.remove} />;
90 const PermissionSelectField = () =>
93 component={PermissionSelectComponent}
94 format={formatPermissionLevel}
95 parse={parsePermissionLevel} />;
97 const PermissionSelectComponent = ({ input }: WrappedFieldProps) =>
98 <FormControl fullWidth>
99 <InputLabel>Authorization</InputLabel>
100 <PermissionSelect {...input} />