RED-4032: Assignment permissions

This commit is contained in:
Adina Țeudan 2022-05-20 18:03:04 +03:00
parent ab1399c45a
commit 14193347fb
9 changed files with 30 additions and 24 deletions

View File

@ -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];

View File

@ -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';

View File

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

View File

@ -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 {

View File

@ -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');

View File

@ -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';

View File

@ -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',

View File

@ -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;

View File

@ -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 {