From 14193347fb13cdad36494eef672b0b5f12648d5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Fri, 20 May 2022 18:03:04 +0300 Subject: [PATCH] RED-4032: Assignment permissions --- ...sign-reviewer-approver-dialog.component.ts | 3 +++ .../src/app/services/breadcrumbs.service.ts | 10 +++++----- .../dashboard-stats.service.ts | 2 +- .../dossiers/archived-dossiers.service.ts | 2 +- .../app/services/dossiers/dossiers.service.ts | 2 +- .../entity-services/dossier-states.service.ts | 4 ++-- .../services/entity-services/trash.service.ts | 8 ++++---- .../src/app/services/notifications.service.ts | 4 ++-- .../src/app/services/permissions.service.ts | 19 +++++++++++-------- 9 files changed, 30 insertions(+), 24 deletions(-) diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts index 5751f277c..fecae4d7a 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts +++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts @@ -47,6 +47,9 @@ export class AssignReviewerApproverDialogComponent { get userOptions() { const unassignUser = this._canUnassignFiles && this.data.withUnassignedOption ? [undefined] : []; + if (!this.permissionsService.canAssignUser(this.data.files, this.dossier)) { + return [...unassignUser]; + } return this.data.mode === 'approver' ? [...this.dossier.approverIds, ...unassignUser] : [...this.dossier.memberIds, ...unassignUser]; diff --git a/apps/red-ui/src/app/services/breadcrumbs.service.ts b/apps/red-ui/src/app/services/breadcrumbs.service.ts index f4d640ff6..44f157203 100644 --- a/apps/red-ui/src/app/services/breadcrumbs.service.ts +++ b/apps/red-ui/src/app/services/breadcrumbs.service.ts @@ -3,13 +3,13 @@ import { List } from '@iqser/common-ui'; import { ActivatedRouteSnapshot, IsActiveMatchOptions, NavigationEnd, Router } from '@angular/router'; import { BehaviorSubject, Observable, of } from 'rxjs'; import { filter, pluck } from 'rxjs/operators'; -import { FilesMapService } from '@services/files/files-map.service'; +import { FilesMapService } from './files/files-map.service'; import { TranslateService } from '@ngx-translate/core'; import { BreadcrumbTypes, DOSSIER_ID, DOSSIER_TEMPLATE_ID, DOSSIERS_ARCHIVE, FILE_ID } from '@red/domain'; -import { DossiersService } from '@services/dossiers/dossiers.service'; -import { dossiersServiceResolver } from '@services/entity-services/dossiers.service.provider'; -import { FeaturesService } from '@services/features.service'; -import { DashboardStatsService } from '@services/dossier-templates/dashboard-stats.service'; +import { DossiersService } from './dossiers/dossiers.service'; +import { dossiersServiceResolver } from './entity-services/dossiers.service.provider'; +import { FeaturesService } from './features.service'; +import { DashboardStatsService } from './dossier-templates/dashboard-stats.service'; export type RouterLinkActiveOptions = { exact: boolean } | IsActiveMatchOptions; export type BreadcrumbDisplayType = 'text' | 'dropdown'; diff --git a/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts b/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts index 2003fe426..24a1687ef 100644 --- a/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts +++ b/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts @@ -4,7 +4,7 @@ import { Injectable, Injector } from '@angular/core'; import { NGXLogger } from 'ngx-logger'; import { Observable } from 'rxjs'; import { map, switchMap, tap } from 'rxjs/operators'; -import { DossierStatesService } from '@services/entity-services/dossier-states.service'; +import { DossierStatesService } from '../entity-services/dossier-states.service'; const templatesSorter = (a: DashboardStats, b: DashboardStats) => { if (a.numberOfActiveDossiers > 0 && b.numberOfActiveDossiers === 0) { diff --git a/apps/red-ui/src/app/services/dossiers/archived-dossiers.service.ts b/apps/red-ui/src/app/services/dossiers/archived-dossiers.service.ts index a140a587e..9a572140b 100644 --- a/apps/red-ui/src/app/services/dossiers/archived-dossiers.service.ts +++ b/apps/red-ui/src/app/services/dossiers/archived-dossiers.service.ts @@ -6,7 +6,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { ActiveDossiersService } from './active-dossiers.service'; import { DossiersService } from './dossiers.service'; import { FilesMapService } from '../files/files-map.service'; -import { FeaturesService } from '@services/features.service'; +import { FeaturesService } from '../features.service'; @Injectable({ providedIn: 'root' }) export class ArchivedDossiersService extends DossiersService { diff --git a/apps/red-ui/src/app/services/dossiers/dossiers.service.ts b/apps/red-ui/src/app/services/dossiers/dossiers.service.ts index 2a576a40f..e7d2809ab 100644 --- a/apps/red-ui/src/app/services/dossiers/dossiers.service.ts +++ b/apps/red-ui/src/app/services/dossiers/dossiers.service.ts @@ -7,7 +7,7 @@ import { DossierStatsService } from './dossier-stats.service'; import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { NGXLogger } from 'ngx-logger'; -import { DashboardStatsService } from '@services/dossier-templates/dashboard-stats.service'; +import { DashboardStatsService } from '../dossier-templates/dashboard-stats.service'; const CONFLICT_MSG = _('add-dossier-dialog.errors.dossier-already-exists'); const GENERIC_MSG = _('add-dossier-dialog.errors.generic'); diff --git a/apps/red-ui/src/app/services/entity-services/dossier-states.service.ts b/apps/red-ui/src/app/services/entity-services/dossier-states.service.ts index 1fa21f731..7b8cfd323 100644 --- a/apps/red-ui/src/app/services/entity-services/dossier-states.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dossier-states.service.ts @@ -2,9 +2,9 @@ import { Injectable, Injector } from '@angular/core'; import { EntitiesService, mapEach, RequiredParam, Toaster, Validate } from '@iqser/common-ui'; import { DossierState, IDossierState } from '@red/domain'; import { EMPTY, forkJoin, Observable, switchMap } from 'rxjs'; -import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; +import { DossierTemplatesService } from '../dossier-templates/dossier-templates.service'; import { catchError, defaultIfEmpty, tap } from 'rxjs/operators'; -import { DossierStatesMapService } from '@services/entity-services/dossier-states-map.service'; +import { DossierStatesMapService } from '../entity-services/dossier-states-map.service'; import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; diff --git a/apps/red-ui/src/app/services/entity-services/trash.service.ts b/apps/red-ui/src/app/services/entity-services/trash.service.ts index 4552f8ce8..d888d42bf 100644 --- a/apps/red-ui/src/app/services/entity-services/trash.service.ts +++ b/apps/red-ui/src/app/services/entity-services/trash.service.ts @@ -6,11 +6,11 @@ import { forkJoin, map, Observable, of } from 'rxjs'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { ConfigService } from '../config.service'; import { PermissionsService } from '../permissions.service'; -import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; -import { UserService } from '@services/user.service'; +import { ActiveDossiersService } from '../dossiers/active-dossiers.service'; +import { UserService } from '../user.service'; import { flatMap } from 'lodash-es'; -import { DossierStatsService } from '@services/dossiers/dossier-stats.service'; -import { FilesService } from '@services/files/files.service'; +import { DossierStatsService } from '../dossiers/dossier-stats.service'; +import { FilesService } from '../files/files.service'; @Injectable({ providedIn: 'root', diff --git a/apps/red-ui/src/app/services/notifications.service.ts b/apps/red-ui/src/app/services/notifications.service.ts index f2eed9725..0066d9c0c 100644 --- a/apps/red-ui/src/app/services/notifications.service.ts +++ b/apps/red-ui/src/app/services/notifications.service.ts @@ -6,11 +6,11 @@ import { Dossier, INotification, Notification, NotificationTypes } from '@red/do import { map, switchMap, tap } from 'rxjs/operators'; import { notificationsTranslations } from '@translations/notifications-translations'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { UserService } from '@services/user.service'; +import { UserService } from './user.service'; import dayjs from 'dayjs'; import { CHANGED_CHECK_INTERVAL } from '@utils/constants'; import { BASE_HREF } from '../tokens'; -import { DossiersCacheService } from '@services/dossiers/dossiers-cache.service'; +import { DossiersCacheService } from './dossiers/dossiers-cache.service'; const INCLUDE_SEEN = false; diff --git a/apps/red-ui/src/app/services/permissions.service.ts b/apps/red-ui/src/app/services/permissions.service.ts index f87d59f30..98dc43d9f 100644 --- a/apps/red-ui/src/app/services/permissions.service.ts +++ b/apps/red-ui/src/app/services/permissions.service.ts @@ -285,10 +285,8 @@ export class PermissionsService { return dossier.isActive && !file.excludedFromAutomaticAnalysis && this.isFileAssignee(file) && !file.isApproved; } - private _canAssignToSelf(file: File, dossier: Dossier): boolean { - const precondition = - dossier.isActive && this.isDossierMember(dossier) && !this.isFileAssignee(file) && !file.isError && !file.isProcessing; - return precondition && (file.isNew || file.isUnderReview || (file.isUnderApproval && this.isApprover(dossier))); + private _assignmentPrecondition(file: File, dossier: Dossier): boolean { + return dossier.isActive && !file.isError && !file.isProcessing; } private _canSetUnderApproval(file: File, dossier: Dossier): boolean { @@ -303,14 +301,19 @@ export class PermissionsService { return dossier.isActive && file.canBeApproved && this.isFileAssignee(file); } + private _canAssignToSelf(file: File, dossier: Dossier): boolean { + const precondition = this._assignmentPrecondition(file, dossier) && !this.isFileAssignee(file); + return precondition && (this.isApprover(dossier) || (this.isDossierMember(dossier) && (file.isNew || file.isUnderReview))); + } + private _canAssignUser(file: File, dossier: Dossier) { - const precondition = dossier.isActive && !file.isProcessing && !file.isError && !file.isApproved && this.isApprover(dossier); + const precondition = this._assignmentPrecondition(file, dossier); if (precondition) { - if ((file.isNew || file.isUnderReview) && dossier.hasReviewers) { + if ((file.isNew || file.isUnderReview) && dossier.hasReviewers && this.isDossierMember(dossier)) { return true; } - if (file.isUnderApproval && dossier.approverIds.length > 1) { + if (file.isUnderApproval && dossier.approverIds.length > 1 && this.isApprover(dossier)) { return true; } } @@ -318,7 +321,7 @@ export class PermissionsService { } private _canUnassignUser(file: File, dossier: Dossier) { - return dossier.isActive && (file.isUnderReview || file.isUnderApproval) && (this.isFileAssignee(file) || this.isApprover(dossier)); + return this._assignmentPrecondition(file, dossier) && !!file.assignee && (this.isApprover(dossier) || this.isFileAssignee(file)); } private _canSetToNew(file: File, dossier: Dossier): boolean {