// Copyright (C) The Arvados Authors. All rights reserved. // // SPDX-License-Identifier: AGPL-3.0 import React from 'react'; import { Dialog, DialogTitle, Button, Grid, DialogContent, CircularProgress, Paper, Tabs, Tab, Checkbox, FormControlLabel, Typography, } from '@mui/material'; import { CustomStyleRulesCallback } from 'common/custom-theme'; import { WithStyles } from '@mui/styles'; import withStyles from '@mui/styles/withStyles'; import { DialogActions } from 'components/dialog-actions/dialog-actions'; import { SharingURLsContent } from './sharing-urls'; import { extractUuidObjectType, ResourceObjectType } from 'models/resource'; import { SharingInvitationForm } from './sharing-invitation-form'; import { SharingManagementForm } from './sharing-management-form'; import moment, { Moment } from 'moment'; import { SharingPublicAccessForm } from './sharing-public-access-form'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment'; import { StaticDateTimePicker } from '@mui/x-date-pickers/StaticDateTimePicker'; export interface SharingDialogDataProps { open: boolean; loading: boolean; saveEnabled: boolean; sharedResourceUuid: string; sharingURLsNr: number; privateAccess: boolean; sharingURLsDisabled: boolean; permissions: any[]; } export interface SharingDialogActionProps { onClose: () => void; onSave: () => void; onCreateSharingToken: (d: Date | undefined) => () => void; refreshPermissions: () => void; } enum SharingDialogTab { PERMISSIONS = 0, URLS = 1, } export type SharingDialogComponentProps = SharingDialogDataProps & SharingDialogActionProps; export const SharingDialogComponent = (props: SharingDialogComponentProps) => { const { open, loading, saveEnabled, sharedResourceUuid, sharingURLsNr, privateAccess, sharingURLsDisabled, onClose, onSave, onCreateSharingToken, refreshPermissions } = props; const showTabs = !sharingURLsDisabled && extractUuidObjectType(sharedResourceUuid) === ResourceObjectType.COLLECTION; const [tabNr, setTabNr] = React.useState(SharingDialogTab.PERMISSIONS); const [expDate, setExpDate] = React.useState(); const [withExpiration, setWithExpiration] = React.useState(false); const handleChange = (newValue: moment.Moment) => setExpDate(newValue); const handleClose = (ev, reason) => { if (reason !== 'backdropClick') { onClose(); } } // Sets up the dialog depending on the resource type if (!showTabs && tabNr !== SharingDialogTab.PERMISSIONS) { setTabNr(SharingDialogTab.PERMISSIONS); } React.useEffect(() => { if (!withExpiration) { setExpDate(undefined); } else { setExpDate(moment().add(2, 'hour')); } }, [withExpiration]); return ( Sharing settings {showTabs && { if (tb === SharingDialogTab.PERMISSIONS) { refreshPermissions(); } setTabNr(tb) } }> 0 ? '(' + sharingURLsNr + ')' : ''}`} disabled={saveEnabled} /> } {tabNr === SharingDialogTab.PERMISSIONS && } {tabNr === SharingDialogTab.URLS && } {tabNr === SharingDialogTab.URLS && withExpiration && <>
null, }} />
Maximum expiration date may be limited by the cluster configuration. } {tabNr === SharingDialogTab.PERMISSIONS && !sharingURLsDisabled && privateAccess && sharingURLsNr > 0 && Although there aren't specific permissions set, this is publicly accessible via Sharing URL(s). } {tabNr === SharingDialogTab.URLS && setWithExpiration(e.target.checked)} />} label="With expiration" /> } {tabNr !== SharingDialogTab.URLS && }
{ loading && }
); }; const loadingIndicatorStyles: CustomStyleRulesCallback<'root'> = theme => ({ root: { position: 'absolute', top: 0, right: 0, bottom: 0, left: 0, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: 'rgba(255, 255, 255, 0.8)', }, }); const LoadingIndicator = withStyles(loadingIndicatorStyles)( (props: WithStyles<'root'>) => );