1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React from 'react';
19 } from '@material-ui/core';
24 } from '@material-ui/core/styles';
25 import { DialogActions } from 'components/dialog-actions/dialog-actions';
26 import { SharingURLsContent } from './sharing-urls';
28 extractUuidObjectType,
30 } from 'models/resource';
31 import { SharingInvitationForm } from './sharing-invitation-form';
32 import { SharingManagementForm } from './sharing-management-form';
36 MuiPickersUtilsProvider,
38 } from 'material-ui-pickers';
39 import DateFnsUtils from "@date-io/date-fns";
40 import moment from 'moment';
42 export interface SharingDialogDataProps {
46 sharedResourceUuid: string;
48 export interface SharingDialogActionProps {
51 onCreateSharingToken: (d: Date | undefined) => () => void;
52 refreshPermissions: () => void;
54 enum SharingDialogTab {
58 export default (props: SharingDialogDataProps & SharingDialogActionProps) => {
59 const { open, loading, saveEnabled, sharedResourceUuid,
60 onClose, onSave, onCreateSharingToken, refreshPermissions } = props;
61 const showTabs = extractUuidObjectType(sharedResourceUuid) === ResourceObjectType.COLLECTION;
62 const [tabNr, setTabNr] = React.useState<number>(SharingDialogTab.PERMISSIONS);
63 const [expDate, setExpDate] = React.useState<Date>();
64 const [withExpiration, setWithExpiration] = React.useState<boolean>(false);
66 // Sets up the dialog depending on the resource type
67 if (!showTabs && tabNr !== SharingDialogTab.PERMISSIONS) {
68 setTabNr(SharingDialogTab.PERMISSIONS);
71 React.useEffect(() => {
72 if (!withExpiration) {
73 setExpDate(undefined);
75 setExpDate(moment().add(1, 'hour').toDate());
80 {...{ open, onClose }}
81 className="sharing-dialog"
84 disableBackdropClick={saveEnabled}
85 disableEscapeKeyDown={saveEnabled}>
91 onChange={(_, tb) => {
92 if (tb === SharingDialogTab.PERMISSIONS) {
97 <Tab label="With users/groups" />
98 <Tab label="Sharing URLs" disabled={saveEnabled} />
102 { tabNr === SharingDialogTab.PERMISSIONS &&
103 <Grid container direction='column' spacing={24}>
105 <SharingManagementForm />
109 { tabNr === SharingDialogTab.URLS &&
110 <SharingURLsContent uuid={sharedResourceUuid} />
114 <Grid container spacing={8}>
115 { tabNr === SharingDialogTab.PERMISSIONS &&
117 <SharingInvitationForm />
119 { tabNr === SharingDialogTab.URLS && withExpiration && <>
120 <Grid item container direction='row' md={12}>
121 <MuiPickersUtilsProvider utils={DateFnsUtils}>
122 <BasePicker autoOk value={expDate} onChange={setExpDate}>
123 {({ date, handleChange }) => (<>
125 <Calendar date={date} minDate={new Date()} maxDate={undefined}
126 onChange={handleChange} />
129 <TimePickerView type="hours" date={date} ampm={false}
130 onMinutesChange={() => {}}
131 onSecondsChange={() => {}}
132 onHourChange={handleChange}
137 </MuiPickersUtilsProvider>
140 <Typography variant='caption' align='center'>
141 Maximum expiration date may be limited by the cluster configuration.
146 { tabNr === SharingDialogTab.URLS && <>
147 <Grid item><FormControlLabel
148 control={<Checkbox color="primary" checked={withExpiration}
149 onChange={(e) => setWithExpiration(e.target.checked)} />}
150 label="With expiration" />
153 <Button variant="contained" color="primary"
154 onClick={onCreateSharingToken(expDate)}>
159 { tabNr === SharingDialogTab.PERMISSIONS &&
161 <Button onClick={onSave} variant="contained" color="primary"
162 disabled={!saveEnabled}>
168 <Button onClick={() => {
170 setWithExpiration(false);
178 loading && <LoadingIndicator />
183 const loadingIndicatorStyles: StyleRulesCallback<'root'> = theme => ({
185 position: 'absolute',
191 alignItems: 'center',
192 justifyContent: 'center',
193 backgroundColor: 'rgba(255, 255, 255, 0.8)',
197 const LoadingIndicator = withStyles(loadingIndicatorStyles)(
198 (props: WithStyles<'root'>) =>
199 <Paper classes={props.classes}>