1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React from 'react';
16 } from '@material-ui/core';
21 } from '@material-ui/core/styles';
22 import { DialogActions } from 'components/dialog-actions/dialog-actions';
23 import { SharingDialogContent } from './sharing-dialog-content';
24 import { SharingURLsContent } from './sharing-urls';
26 extractUuidObjectType,
28 } from 'models/resource';
29 import { SharingInvitationForm } from './sharing-invitation-form';
31 export interface SharingDialogDataProps {
35 sharedResourceUuid: string;
37 export interface SharingDialogActionProps {
40 onCreateSharingToken: () => void;
42 enum SharingDialogTab {
46 export default (props: SharingDialogDataProps & SharingDialogActionProps) => {
47 const { open, loading, saveEnabled, sharedResourceUuid,
48 onClose, onSave, onCreateSharingToken } = props;
49 const showTabs = extractUuidObjectType(sharedResourceUuid) === ResourceObjectType.COLLECTION;
50 const [tabNr, setTabNr] = React.useState<number>(SharingDialogTab.PERMISSIONS);
52 // Sets up the dialog depending on the resource type
53 if (!showTabs && tabNr !== SharingDialogTab.PERMISSIONS) {
54 setTabNr(SharingDialogTab.PERMISSIONS);
58 {...{ open, onClose }}
59 className="sharing-dialog"
62 disableBackdropClick={saveEnabled}
63 disableEscapeKeyDown={saveEnabled}>
68 <Tabs value={tabNr} onChange={(_, tb) => setTabNr(tb)}>
69 <Tab label="With users/groups" />
70 <Tab label="Sharing URLs" disabled={saveEnabled} />
74 { tabNr === SharingDialogTab.PERMISSIONS &&
75 <SharingDialogContent />
77 { tabNr === SharingDialogTab.URLS &&
78 <SharingURLsContent uuid={sharedResourceUuid} />
82 <Grid container spacing={8}>
83 { tabNr === SharingDialogTab.PERMISSIONS &&
85 <SharingInvitationForm />
87 { tabNr === SharingDialogTab.URLS &&
92 onClick={onCreateSharingToken}>
98 { tabNr === SharingDialogTab.PERMISSIONS &&
104 disabled={!saveEnabled}>
110 <Button onClick={onClose}>
117 loading && <LoadingIndicator />
122 const loadingIndicatorStyles: StyleRulesCallback<'root'> = theme => ({
124 position: 'absolute',
130 alignItems: 'center',
131 justifyContent: 'center',
132 backgroundColor: 'rgba(255, 255, 255, 0.8)',
136 const LoadingIndicator = withStyles(loadingIndicatorStyles)(
137 (props: WithStyles<'root'>) =>
138 <Paper classes={props.classes}>