From 271a29d6568d92629c0fe8f5541677e59975e1b6 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Sun, 13 Nov 2022 17:18:34 +0200 Subject: [PATCH] RED-5482: wip permissions --- .../app/models/file/annotation.permissions.ts | 22 ++++++++++++++----- .../annotation-actions.component.ts | 4 +++- .../highlights-separator.component.html | 2 ++ .../highlights-separator.component.ts | 2 ++ .../pdf-annotation-actions.service.ts | 4 +++- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/apps/red-ui/src/app/models/file/annotation.permissions.ts b/apps/red-ui/src/app/models/file/annotation.permissions.ts index d583408ab..c6c6963f1 100644 --- a/apps/red-ui/src/app/models/file/annotation.permissions.ts +++ b/apps/red-ui/src/app/models/file/annotation.permissions.ts @@ -1,6 +1,8 @@ import { AnnotationWrapper } from './annotation.wrapper'; import { Dictionary } from '@red/domain'; import { isArray } from 'lodash-es'; +import { IqserPermissionsService } from '@iqser/common-ui'; +import { ROLES } from '@users/roles'; export class AnnotationPermissions { canUndo = true; @@ -16,12 +18,20 @@ export class AnnotationPermissions { canRecategorizeImage = true; canForceHint = true; - static forUser(isApprover: boolean, annotations: AnnotationWrapper | AnnotationWrapper[], entities: Dictionary[]) { + static forUser( + isApprover: boolean, + annotations: AnnotationWrapper | AnnotationWrapper[], + entities: Dictionary[], + permissionsService: IqserPermissionsService, + ) { if (!isArray(annotations)) { annotations = [annotations]; } const summedPermissions: AnnotationPermissions = new AnnotationPermissions(); + const canAddRedaction = permissionsService.has(ROLES.redactions.write); + const canRequestRedaction = permissionsService.has(ROLES.redactions.request); + const canAddOrRequestRedaction = canAddRedaction || canRequestRedaction; for (const annotation of annotations) { const permissions: AnnotationPermissions = new AnnotationPermissions(); @@ -30,27 +40,29 @@ export class AnnotationPermissions { permissions.canAcceptSuggestion = isApprover && (annotation.isSuggestion || annotation.isDeclinedSuggestion); permissions.canRejectSuggestion = isApprover && annotation.isSuggestion; - permissions.canForceHint = annotation.isIgnoredHint && !annotation.pending; - permissions.canForceRedaction = annotation.isSkipped && !annotation.isFalsePositive && !annotation.pending; + permissions.canForceHint = canAddOrRequestRedaction && annotation.isIgnoredHint && !annotation.pending; + permissions.canForceRedaction = + canAddOrRequestRedaction && annotation.isSkipped && !annotation.isFalsePositive && !annotation.pending; permissions.canAcceptRecommendation = annotation.isRecommendation && !annotation.pending; const annotationEntity = entities.find(entity => entity.type === annotation.type); permissions.canMarkAsFalsePositive = annotation.canBeMarkedAsFalsePositive && annotationEntity.hasDictionary; permissions.canRemoveOrSuggestToRemoveOnlyHere = - !annotation.pending && (annotation.isRedacted || (annotation.isHint && !annotation.isImage)); + canAddOrRequestRedaction && !annotation.pending && (annotation.isRedacted || (annotation.isHint && !annotation.isImage)); permissions.canRemoveOrSuggestToRemoveFromDictionary = annotation.isModifyDictionary && (annotation.isRedacted || annotation.isSkipped || annotation.isHint) && !annotation.pending && !annotation.hasBeenResized; - permissions.canChangeLegalBasis = annotation.isRedacted && !annotation.pending; + permissions.canChangeLegalBasis = canAddOrRequestRedaction && annotation.isRedacted && !annotation.pending; permissions.canRecategorizeImage = ((annotation.isImage && !annotation.isSuggestion) || annotation.isSuggestionRecategorizeImage) && !annotation.pending; permissions.canResizeAnnotation = + canAddOrRequestRedaction && (((annotation.isRedacted || annotation.isImage) && !annotation.isSuggestion) || annotation.isSuggestionResize || annotation.isRecommendation) && diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotation-actions/annotation-actions.component.ts b/apps/red-ui/src/app/modules/file-preview/components/annotation-actions/annotation-actions.component.ts index c1edd7665..540bc6543 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/annotation-actions/annotation-actions.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/annotation-actions/annotation-actions.component.ts @@ -6,7 +6,7 @@ import { AnnotationActionsService } from '../../services/annotation-actions.serv import { AnnotationReferencesService } from '../../services/annotation-references.service'; import { MultiSelectService } from '../../services/multi-select.service'; import { FilePreviewStateService } from '../../services/file-preview-state.service'; -import { HelpModeService } from '@iqser/common-ui'; +import { HelpModeService, IqserPermissionsService } from '@iqser/common-ui'; import { ViewModeService } from '../../services/view-mode.service'; import { REDAnnotationManager } from '../../../pdf-viewer/services/annotation-manager.service'; import { ROLES } from '@users/roles'; @@ -38,6 +38,7 @@ export class AnnotationActionsComponent implements OnChanges { readonly multiSelectService: MultiSelectService, private readonly _state: FilePreviewStateService, private readonly _permissionsService: PermissionsService, + private readonly _iqserPermissionsService: IqserPermissionsService, private readonly _annotationManager: REDAnnotationManager, readonly annotationActionsService: AnnotationActionsService, readonly annotationReferencesService: AnnotationReferencesService, @@ -119,6 +120,7 @@ export class AnnotationActionsComponent implements OnChanges { this._permissionsService.isApprover(dossier), this.annotations, this._state.dictionaries, + this._iqserPermissionsService, ); } } diff --git a/apps/red-ui/src/app/modules/file-preview/components/highlights-separator/highlights-separator.component.html b/apps/red-ui/src/app/modules/file-preview/components/highlights-separator/highlights-separator.component.html index bb3f17b9f..6decfe8c6 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/highlights-separator/highlights-separator.component.html +++ b/apps/red-ui/src/app/modules/file-preview/components/highlights-separator/highlights-separator.component.html @@ -6,6 +6,7 @@
AnnotationPermissions.forUser(isApprover, a, this.#state.dictionaries)); + const permissions = annotations.map(a => + AnnotationPermissions.forUser(isApprover, a, this.#state.dictionaries, this.#iqserPermissionsService), + ); return { canResize: permissions.length === 1 && permissions[0].canResizeAnnotation, canChangeLegalBasis: permissions.reduce((acc, next) => acc && next.canChangeLegalBasis, true),