From 282606d6586ed26675ef27f9f53cfeb0375dafc8 Mon Sep 17 00:00:00 2001 From: Lucas Di Pentima Date: Fri, 13 May 2022 11:30:23 -0300 Subject: [PATCH] 16115: Further sharing dialog cleanup. * Removes code related to the "public access" form. * Avoids filtering out permissions from anonymous users. Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima --- .../sharing-dialog/sharing-dialog-actions.ts | 99 +++++-------------- .../sharing-dialog/sharing-dialog-types.ts | 16 --- .../sharing-public-access-form-component.tsx | 53 ---------- .../sharing-public-access-form.tsx | 23 ----- .../visibility-level-select.tsx | 54 ---------- 5 files changed, 24 insertions(+), 221 deletions(-) delete mode 100644 src/views-components/sharing-dialog/sharing-public-access-form-component.tsx delete mode 100644 src/views-components/sharing-dialog/sharing-public-access-form.tsx delete mode 100644 src/views-components/sharing-dialog/visibility-level-select.tsx diff --git a/src/store/sharing-dialog/sharing-dialog-actions.ts b/src/store/sharing-dialog/sharing-dialog-actions.ts index bb3b692f..985b345e 100644 --- a/src/store/sharing-dialog/sharing-dialog-actions.ts +++ b/src/store/sharing-dialog/sharing-dialog-actions.ts @@ -4,7 +4,13 @@ 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'; @@ -13,13 +19,17 @@ import { SHARING_MANAGEMENT_FORM_NAME } from 'store/sharing-dialog/sharing-dialo 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) => @@ -37,7 +47,6 @@ export const connectSharingDialogProgress = withProgress(SHARING_DIALOG_NAME); export const saveSharingDialogChanges = async (dispatch: Dispatch, getState: () => RootState) => { dispatch(progressIndicatorActions.START_WORKING(SHARING_DIALOG_NAME)); - await dispatch(savePublicPermissionChanges); await dispatch(saveManagementChanges); await dispatch(sendInvitations); dispatch(reset(SHARING_INVITATION_FORM_NAME)); @@ -127,7 +136,6 @@ const loadSharingDialog = async (dispatch: Dispatch, getState: () => RootState, try { const resourceUuid = dialog.data.resourceUuid; const { items } = await permissionService.listResourcePermissions(resourceUuid); - dispatch(initializePublicAccessForm(items)); await dispatch(initializeManagementForm(items)); // For collections, we need to load the public sharing tokens if (extractUuidObjectType(resourceUuid) === ResourceObjectType.COLLECTION) { @@ -167,8 +175,6 @@ const initializeManagementForm = (permissionLinks: PermissionResource[]) => }; const managementPermissions = permissionLinks - .filter(item => - item.tailUuid !== getPublicGroupUuid(getState())) .map(({ tailUuid, name, uuid }) => ({ email: getEmail(tailUuid), permissions: name as PermissionLevel, @@ -183,86 +189,29 @@ const initializeManagementForm = (permissionLinks: PermissionResource[]) => 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(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(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(state.dialog, SHARING_DIALOG_NAME); diff --git a/src/store/sharing-dialog/sharing-dialog-types.ts b/src/store/sharing-dialog/sharing-dialog-types.ts index a05224e2..7ca8b5c5 100644 --- a/src/store/sharing-dialog/sharing-dialog-types.ts +++ b/src/store/sharing-dialog/sharing-dialog-types.ts @@ -7,21 +7,9 @@ import { getFormValues, isDirty } from 'redux-form'; import { RootState } from 'store/store'; export const SHARING_DIALOG_NAME = 'SHARING_DIALOG_NAME'; -export const SHARING_PUBLIC_ACCESS_FORM_NAME = 'SHARING_PUBLIC_ACCESS_FORM_NAME'; export const SHARING_MANAGEMENT_FORM_NAME = 'SHARING_MANAGEMENT_FORM_NAME'; export const SHARING_INVITATION_FORM_NAME = 'SHARING_INVITATION_FORM_NAME'; -export enum VisibilityLevel { - PRIVATE = 'Private', - SHARED = 'Shared', - PUBLIC = 'Public', -} - -export interface SharingPublicAccessFormData { - visibility: VisibilityLevel; - permissionUuid: string; -} - export interface SharingManagementFormData { permissions: SharingManagementFormDataRow[]; initialPermissions: SharingManagementFormDataRow[]; @@ -47,10 +35,6 @@ export interface SharingInvitationFormPersonData { export const getSharingMangementFormData = (state: any) => getFormValues(SHARING_MANAGEMENT_FORM_NAME)(state) as SharingManagementFormData; -export const getSharingPublicAccessFormData = (state: any) => - getFormValues(SHARING_PUBLIC_ACCESS_FORM_NAME)(state) as SharingPublicAccessFormData; - export const hasChanges = (state: RootState) => - isDirty(SHARING_PUBLIC_ACCESS_FORM_NAME)(state) || isDirty(SHARING_MANAGEMENT_FORM_NAME)(state) || isDirty(SHARING_INVITATION_FORM_NAME)(state); diff --git a/src/views-components/sharing-dialog/sharing-public-access-form-component.tsx b/src/views-components/sharing-dialog/sharing-public-access-form-component.tsx deleted file mode 100644 index 8fb427af..00000000 --- a/src/views-components/sharing-dialog/sharing-public-access-form-component.tsx +++ /dev/null @@ -1,53 +0,0 @@ -// 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 }) => - <> - - - - - {renderVisibilityInfo(visibility)} - - - - - - - -); - -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 }) => - ; - -const VisibilityLevelSelectComponent = ({ input }: WrappedFieldProps) => - ; diff --git a/src/views-components/sharing-dialog/sharing-public-access-form.tsx b/src/views-components/sharing-dialog/sharing-public-access-form.tsx deleted file mode 100644 index 2a216b04..00000000 --- a/src/views-components/sharing-dialog/sharing-public-access-form.tsx +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (C) The Arvados Authors. All rights reserved. -// -// SPDX-License-Identifier: AGPL-3.0 - -import { reduxForm } from 'redux-form'; -import { compose } from 'redux'; -import { connect } from 'react-redux'; -import SharingPublicAccessFormComponent from './sharing-public-access-form-component'; -import { SHARING_PUBLIC_ACCESS_FORM_NAME } from 'store/sharing-dialog/sharing-dialog-types'; -import { RootState } from 'store/store'; -import { getSharingPublicAccessFormData } from '../../store/sharing-dialog/sharing-dialog-types'; - -export const SharingPublicAccessForm = compose( - reduxForm( - { form: SHARING_PUBLIC_ACCESS_FORM_NAME } - ), - connect( - (state: RootState) => { - const { visibility } = getSharingPublicAccessFormData(state); - return { visibility }; - } - ) -)(SharingPublicAccessFormComponent); diff --git a/src/views-components/sharing-dialog/visibility-level-select.tsx b/src/views-components/sharing-dialog/visibility-level-select.tsx deleted file mode 100644 index 5746de1f..00000000 --- a/src/views-components/sharing-dialog/visibility-level-select.tsx +++ /dev/null @@ -1,54 +0,0 @@ -// 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 = theme => ({ - value: { - marginLeft: theme.spacing.unit, - } -}); -export const VisibilityLevelSelect = withStyles(VisibilityLevelSelectStyles)( - ({ classes, ...props }: SelectProps & WithStyles) => - ); - -const renderPermissionItem = (value: string) => - ; - -const getIcon = (value: string) => { - switch (value) { - case VisibilityLevel.PUBLIC: - return Public; - case VisibilityLevel.SHARED: - return People; - case VisibilityLevel.PRIVATE: - return Lock; - default: - return Lock; - } -}; -- 2.30.2