// 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 '@material-ui/core'; import { CustomStyleRulesCallback } from 'common/custom-theme'; import { WithStyles, withStyles } from '@material-ui/core/styles'; 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 { BasePicker, Calendar, MuiPickersUtilsProvider, TimePickerView } from 'material-ui-pickers'; import DateFnsUtils from "@date-io/date-fns"; import moment from 'moment'; import { SharingPublicAccessForm } from './sharing-public-access-form'; 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); // 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').minutes(0).seconds(0).toDate()); } }, [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 && <> {({ date, handleChange }) => (<> { }} onSecondsChange={() => { }} onHourChange={handleChange} /> )} 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" /> } { 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'>) => );