X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/5124df4b34de48cdf5387197e7b728b7590e8ae8..852a6a393297d03ca5259ddb6aa7aedff4a000ea:/src/views-components/sharing-dialog/sharing-dialog-component.tsx diff --git a/src/views-components/sharing-dialog/sharing-dialog-component.tsx b/src/views-components/sharing-dialog/sharing-dialog-component.tsx index 4ff9150b..15d7f660 100644 --- a/src/views-components/sharing-dialog/sharing-dialog-component.tsx +++ b/src/views-components/sharing-dialog/sharing-dialog-component.tsx @@ -13,6 +13,9 @@ import { Paper, Tabs, Tab, + Checkbox, + FormControlLabel, + Typography, } from '@material-ui/core'; import { StyleRulesCallback, @@ -27,17 +30,29 @@ import { } 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; } export interface SharingDialogActionProps { onClose: () => void; onSave: () => void; - onCreateSharingToken: () => void; + onCreateSharingToken: (d: Date | undefined) => () => void; + refreshPermissions: () => void; } enum SharingDialogTab { PERMISSIONS = 0, @@ -45,15 +60,26 @@ enum SharingDialogTab { } export default (props: SharingDialogDataProps & SharingDialogActionProps) => { const { open, loading, saveEnabled, sharedResourceUuid, - onClose, onSave, onCreateSharingToken } = props; + sharingURLsNr, privateAccess, + onClose, onSave, onCreateSharingToken, refreshPermissions } = props; const showTabs = 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 && - setTabNr(tb)}> + { + if (tb === SharingDialogTab.PERMISSIONS) { + refreshPermissions(); + } + setTabNr(tb)} + }> - + 0 ? '('+sharingURLsNr+')' : ''}`} disabled={saveEnabled} /> } { tabNr === SharingDialogTab.PERMISSIONS && - - - + + + + + + } { tabNr === SharingDialogTab.URLS && @@ -87,31 +122,71 @@ export default (props: SharingDialogDataProps & SharingDialogActionProps) => { { tabNr === SharingDialogTab.PERMISSIONS && - } + + } + { tabNr === SharingDialogTab.URLS && withExpiration && <> + + + + {({ date, handleChange }) => (<> + + + + + {}} + onSecondsChange={() => {}} + onHourChange={handleChange} + /> + + )} + + + + + + Maximum expiration date may be limited by the cluster configuration. + + + + } + { tabNr === SharingDialogTab.PERMISSIONS && privateAccess && sharingURLsNr > 0 && + + + Although there aren't specific permissions set, this is publicly accessible via Sharing URL(s). + + + } - { tabNr === SharingDialogTab.URLS && + { tabNr === SharingDialogTab.URLS && <> + setWithExpiration(e.target.checked)} />} + label="With expiration" /> + - + } { tabNr === SharingDialogTab.PERMISSIONS && - } -