import { dialogActions } from "store/dialog/dialog-actions";
import { withDialog } from "store/dialog/with-dialog";
-import { SHARING_DIALOG_NAME, SharingPublicAccessFormData, SHARING_PUBLIC_ACCESS_FORM_NAME, SHARING_INVITATION_FORM_NAME, SharingManagementFormData, SharingInvitationFormData, VisibilityLevel, getSharingMangementFormData, getSharingPublicAccessFormData } from './sharing-dialog-types';
+import {
+ SHARING_DIALOG_NAME,
+ SHARING_INVITATION_FORM_NAME,
+ SharingManagementFormData,
+ SharingInvitationFormData,
+ getSharingMangementFormData,
+} from './sharing-dialog-types';
import { Dispatch } from 'redux';
import { ServiceRepository } from "services/services";
import { FilterBuilder } from 'services/api/filter-builder';
import { RootState } from 'store/store';
import { getDialog } from 'store/dialog/dialog-reducer';
import { PermissionLevel } from 'models/permission';
-import { getPublicGroupUuid } from "store/workflow-panel/workflow-panel-actions";
import { PermissionResource } from 'models/permission';
import { differenceWith } from "lodash";
import { withProgress } from "store/progress-indicator/with-progress";
import { progressIndicatorActions } from 'store/progress-indicator/progress-indicator-actions';
import { snackbarActions, SnackbarKind } from "../snackbar/snackbar-actions";
-import { extractUuidKind, extractUuidObjectType, ResourceKind, ResourceObjectType } from "models/resource";
+import {
+ extractUuidKind,
+ extractUuidObjectType,
+ ResourceKind,
+ ResourceObjectType
+} from "models/resource";
import { resourcesActions } from "store/resources/resources-actions";
export const openSharingDialog = (resourceUuid: string, refresh?: () => void) =>
export const saveSharingDialogChanges = async (dispatch: Dispatch, getState: () => RootState) => {
dispatch(progressIndicatorActions.START_WORKING(SHARING_DIALOG_NAME));
- await dispatch<any>(savePublicPermissionChanges);
await dispatch<any>(saveManagementChanges);
await dispatch<any>(sendInvitations);
dispatch(reset(SHARING_INVITATION_FORM_NAME));
try {
const resourceUuid = dialog.data.resourceUuid;
const { items } = await permissionService.listResourcePermissions(resourceUuid);
- dispatch<any>(initializePublicAccessForm(items));
await dispatch<any>(initializeManagementForm(items));
// For collections, we need to load the public sharing tokens
if (extractUuidObjectType(resourceUuid) === ResourceObjectType.COLLECTION) {
};
const managementPermissions = permissionLinks
- .filter(item =>
- item.tailUuid !== getPublicGroupUuid(getState()))
.map(({ tailUuid, name, uuid }) => ({
email: getEmail(tailUuid),
permissions: name as PermissionLevel,
dispatch(initialize(SHARING_MANAGEMENT_FORM_NAME, managementFormData));
};
-const initializePublicAccessForm = (permissionLinks: PermissionResource[]) =>
- (dispatch: Dispatch, getState: () => RootState, ) => {
-
- const [publicPermission] = permissionLinks
- .filter(item => item.tailUuid === getPublicGroupUuid(getState()));
-
- const publicAccessFormData: SharingPublicAccessFormData = publicPermission
- ? {
- visibility: VisibilityLevel.PUBLIC,
- permissionUuid: publicPermission.uuid,
- }
- : {
- visibility: permissionLinks.length > 0
- ? VisibilityLevel.SHARED
- : VisibilityLevel.PRIVATE,
- permissionUuid: '',
- };
-
- dispatch(initialize(SHARING_PUBLIC_ACCESS_FORM_NAME, publicAccessFormData));
- };
-
-const savePublicPermissionChanges = async (_: Dispatch, getState: () => RootState, { permissionService }: ServiceRepository) => {
- const state = getState();
- const { user } = state.auth;
- const dialog = getDialog<SharingDialogData>(state.dialog, SHARING_DIALOG_NAME);
- if (dialog && user) {
- const { permissionUuid, visibility } = getSharingPublicAccessFormData(state);
-
- if (permissionUuid) {
- if (visibility === VisibilityLevel.PUBLIC) {
- await permissionService.update(permissionUuid, {
- name: PermissionLevel.CAN_READ
- });
- } else {
- await permissionService.delete(permissionUuid);
- }
-
- } else if (visibility === VisibilityLevel.PUBLIC) {
-
- await permissionService.create({
- ownerUuid: user.uuid,
- headUuid: dialog.data.resourceUuid,
- tailUuid: getPublicGroupUuid(state),
- name: PermissionLevel.CAN_READ,
- });
- }
- }
-};
-
const saveManagementChanges = async (_: Dispatch, getState: () => RootState, { permissionService }: ServiceRepository) => {
const state = getState();
const { user } = state.auth;
const dialog = getDialog<string>(state.dialog, SHARING_DIALOG_NAME);
if (dialog && user) {
const { initialPermissions, permissions } = getSharingMangementFormData(state);
- const { visibility } = getSharingPublicAccessFormData(state);
-
- if (visibility === VisibilityLevel.PRIVATE) {
- for (const permission of initialPermissions) {
- await permissionService.delete(permission.permissionUuid);
- }
- } else {
- const cancelledPermissions = differenceWith(
- initialPermissions,
- permissions,
- (a, b) => a.permissionUuid === b.permissionUuid
- );
+ const cancelledPermissions = differenceWith(
+ initialPermissions,
+ permissions,
+ (a, b) => a.permissionUuid === b.permissionUuid
+ );
- for (const { permissionUuid } of cancelledPermissions) {
- await permissionService.delete(permissionUuid);
- }
+ for (const { permissionUuid } of cancelledPermissions) {
+ await permissionService.delete(permissionUuid);
+ }
- for (const permission of permissions) {
- await permissionService.update(permission.permissionUuid, { name: permission.permissions });
- }
+ for (const permission of permissions) {
+ await permissionService.update(permission.permissionUuid, { name: permission.permissions });
}
}
};
-const sendInvitations = async (_: Dispatch, getState: () => RootState, { permissionService, userService }: ServiceRepository) => {
+const sendInvitations = async (_: Dispatch, getState: () => RootState, { permissionService }: ServiceRepository) => {
const state = getState();
const { user } = state.auth;
const dialog = getDialog<SharingDialogData>(state.dialog, SHARING_DIALOG_NAME);
+++ /dev/null
-// Copyright (C) The Arvados Authors. All rights reserved.
-//
-// SPDX-License-Identifier: AGPL-3.0
-
-import React from 'react';
-import { Grid, StyleRulesCallback, Divider, Typography } from '@material-ui/core';
-import { Field, WrappedFieldProps } from 'redux-form';
-import { WithStyles } from '@material-ui/core/styles';
-import withStyles from '@material-ui/core/styles/withStyles';
-import { VisibilityLevelSelect } from './visibility-level-select';
-import { VisibilityLevel } from 'store/sharing-dialog/sharing-dialog-types';
-
-const sharingPublicAccessStyles: StyleRulesCallback<'root'> = theme => ({
- root: {
- padding: `${theme.spacing.unit * 2}px 0`,
- }
-});
-
-const SharingPublicAccessForm = withStyles(sharingPublicAccessStyles)(
- ({ classes, visibility }: WithStyles<'root'> & { visibility: VisibilityLevel }) =>
- <>
- <Divider />
- <Grid container alignItems='center' spacing={8} className={classes.root}>
- <Grid item xs={8}>
- <Typography variant='subtitle1'>
- {renderVisibilityInfo(visibility)}
- </Typography>
- </Grid>
- <Grid item xs={4} container wrap='nowrap'>
- <Field name='visibility' component={VisibilityLevelSelectComponent} />
- </Grid>
- </Grid>
- </>
-);
-
-const renderVisibilityInfo = (visibility: VisibilityLevel) => {
- switch (visibility) {
- case VisibilityLevel.PUBLIC:
- return 'Anyone can access';
- case VisibilityLevel.SHARED:
- return 'Specific people can access';
- case VisibilityLevel.PRIVATE:
- return 'Only you can access';
- default:
- return '';
- }
-};
-
-export default ({ visibility }: { visibility: VisibilityLevel }) =>
- <SharingPublicAccessForm {...{ visibility }} />;
-
-const VisibilityLevelSelectComponent = ({ input }: WrappedFieldProps) =>
- <VisibilityLevelSelect fullWidth disableUnderline {...input} />;
+++ /dev/null
-// Copyright (C) The Arvados Authors. All rights reserved.
-//
-// SPDX-License-Identifier: AGPL-3.0
-
-import React from 'react';
-import { MenuItem, Select, withStyles, StyleRulesCallback } from '@material-ui/core';
-import Lock from '@material-ui/icons/Lock';
-import People from '@material-ui/icons/People';
-import Public from '@material-ui/icons/Public';
-import { WithStyles } from '@material-ui/core/styles';
-import { SelectProps } from '@material-ui/core/Select';
-import { SelectItem } from './select-item';
-import { VisibilityLevel } from 'store/sharing-dialog/sharing-dialog-types';
-
-
-type VisibilityLevelSelectClasses = 'value';
-
-const VisibilityLevelSelectStyles: StyleRulesCallback<VisibilityLevelSelectClasses> = theme => ({
- value: {
- marginLeft: theme.spacing.unit,
- }
-});
-export const VisibilityLevelSelect = withStyles(VisibilityLevelSelectStyles)(
- ({ classes, ...props }: SelectProps & WithStyles<VisibilityLevelSelectClasses>) =>
- <Select
- {...props}
- renderValue={renderPermissionItem}
- inputProps={{ classes }}>
- <MenuItem value={VisibilityLevel.PUBLIC}>
- {renderPermissionItem(VisibilityLevel.PUBLIC)}
- </MenuItem>
- <MenuItem value={VisibilityLevel.SHARED}>
- {renderPermissionItem(VisibilityLevel.SHARED)}
- </MenuItem>
- <MenuItem value={VisibilityLevel.PRIVATE}>
- {renderPermissionItem(VisibilityLevel.PRIVATE)}
- </MenuItem>
- </Select>);
-
-const renderPermissionItem = (value: string) =>
- <SelectItem {...{ value, icon: getIcon(value) }} />;
-
-const getIcon = (value: string) => {
- switch (value) {
- case VisibilityLevel.PUBLIC:
- return Public;
- case VisibilityLevel.SHARED:
- return People;
- case VisibilityLevel.PRIVATE:
- return Lock;
- default:
- return Lock;
- }
-};