RED-5482: wip permissions

This commit is contained in:
Dan Percic 2022-11-13 17:18:34 +02:00
parent 56235e65f1
commit 271a29d656
5 changed files with 27 additions and 7 deletions

View File

@ -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) &&

View File

@ -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,
);
}
}

View File

@ -6,6 +6,7 @@
<div *ngIf="(isWritable$ | async) && (multiSelectInactive$ | async)" [iqserHelpMode]="'highlights'">
<iqser-circle-button
(action)="convertHighlights(highlightGroup)"
*allow="roles.highlights.convert"
[icon]="'red:convert'"
[size]="28"
[tooltipPosition]="'above'"
@ -16,6 +17,7 @@
<iqser-circle-button
(action)="removeHighlights(highlightGroup)"
*allow="roles.highlights.delete"
[icon]="'iqser:trash'"
[size]="28"
[tooltipPosition]="'above'"

View File

@ -6,6 +6,7 @@ import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { FilePreviewDialogService } from '../../services/file-preview-dialog.service';
import { FileDataService } from '../../services/file-data.service';
import { MultiSelectService } from '../../services/multi-select.service';
import { ROLES } from '@users/roles';
@Component({
selector: 'redaction-highlights-separator [highlightGroup] [annotation]',
@ -20,6 +21,7 @@ export class HighlightsSeparatorComponent {
readonly circleButtonTypes = CircleButtonTypes;
readonly isWritable$ = this._state.isWritable$;
readonly multiSelectInactive$ = this._multiSelectService.inactive$;
readonly roles = ROLES;
constructor(
private readonly _dialogService: FilePreviewDialogService,

View File

@ -143,7 +143,9 @@ export class PdfAnnotationActionsService {
const dossier = this.#state.dossier;
const isApprover = this.#permissionsService.isApprover(dossier);
const permissions = annotations.map(a => 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),