From e64c8c29a07d208df136e30231d990c91df597b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Tue, 5 Apr 2022 17:48:19 +0300 Subject: [PATCH 1/3] RED-3804: Entity permissions initial --- apps/red-ui/src/app/app.module.ts | 3 ++ .../src/app/guards/permissions-guard.ts | 15 +++++++++ .../app/modules/admin/admin-routing.module.ts | 12 +++++++ .../admin-side-nav.component.ts | 1 + .../screens/permissions/config.service.ts | 25 ++++++++++++++ .../permissions-screen.component.html | 17 ++++++++++ .../permissions-screen.component.scss | 4 +++ .../permissions-screen.component.ts | 25 ++++++++++++++ .../screens/permissions/permissions.module.ts | 16 +++++++++ .../entity-permissions.service.ts | 33 +++++++++++++++++++ libs/red-domain/src/index.ts | 1 + libs/red-domain/src/lib/permissions/index.ts | 1 + .../src/lib/permissions/permissions.ts | 16 +++++++++ 13 files changed, 169 insertions(+) create mode 100644 apps/red-ui/src/app/guards/permissions-guard.ts create mode 100644 apps/red-ui/src/app/modules/admin/screens/permissions/config.service.ts create mode 100644 apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.html create mode 100644 apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.scss create mode 100644 apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.ts create mode 100644 apps/red-ui/src/app/modules/admin/screens/permissions/permissions.module.ts create mode 100644 apps/red-ui/src/app/services/entity-services/entity-permissions.service.ts create mode 100644 libs/red-domain/src/lib/permissions/index.ts create mode 100644 libs/red-domain/src/lib/permissions/permissions.ts diff --git a/apps/red-ui/src/app/app.module.ts b/apps/red-ui/src/app/app.module.ts index 083976f28..01f721622 100644 --- a/apps/red-ui/src/app/app.module.ts +++ b/apps/red-ui/src/app/app.module.ts @@ -125,6 +125,9 @@ const components = [AppComponent, AuthErrorComponent, NotificationsComponent, Sp PDF: { enabled: false, }, + STATS: { + enabled: false, + }, }, } as ILoggerConfig, }, diff --git a/apps/red-ui/src/app/guards/permissions-guard.ts b/apps/red-ui/src/app/guards/permissions-guard.ts new file mode 100644 index 000000000..10ce0bf34 --- /dev/null +++ b/apps/red-ui/src/app/guards/permissions-guard.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate } from '@angular/router'; +import { firstValueFrom } from 'rxjs'; +import { EntityPermissionsService } from '../services/entity-services/entity-permissions.service'; + +@Injectable({ providedIn: 'root' }) +export class PermissionsGuard implements CanActivate { + constructor(private readonly _entityPermissionsService: EntityPermissionsService) {} + + async canActivate(route: ActivatedRouteSnapshot): Promise { + const targetObject = route.data.permissionsObject; + await firstValueFrom(this._entityPermissionsService.loadPermissionsMappingFor(targetObject)); + return true; + } +} diff --git a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts b/apps/red-ui/src/app/modules/admin/admin-routing.module.ts index 0f1446a68..5387a4017 100644 --- a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin-routing.module.ts @@ -24,6 +24,8 @@ import { DossierStatesListingScreenComponent } from './screens/dossier-states-li import { DossiersGuard } from '@guards/dossiers.guard'; import { ACTIVE_DOSSIERS_SERVICE } from '../../tokens'; import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component'; +import { TargetObjects } from '@red/domain'; +import { PermissionsGuard } from '../../guards/permissions-guard'; const routes: Routes = [ { path: '', redirectTo: 'dossier-templates', pathMatch: 'full' }, @@ -159,6 +161,16 @@ const routes: Routes = [ requiredRoles: ['RED_USER_ADMIN'], }, }, + { + path: 'dossier-permissions', + component: BaseAdminScreenComponent, + canActivate: [CompositeRouteGuard], + data: { + routeGuards: [AuthGuard, RedRoleGuard, PermissionsGuard], + permissionsObject: TargetObjects.Dossier, + }, + loadChildren: () => import('./screens/permissions/permissions.module').then(m => m.PermissionsModule), + }, { path: 'license-info', component: LicenseInformationScreenComponent, diff --git a/apps/red-ui/src/app/modules/admin/admin-side-nav/admin-side-nav.component.ts b/apps/red-ui/src/app/modules/admin/admin-side-nav/admin-side-nav.component.ts index 94d8f5d60..b5a1672de 100644 --- a/apps/red-ui/src/app/modules/admin/admin-side-nav/admin-side-nav.component.ts +++ b/apps/red-ui/src/app/modules/admin/admin-side-nav/admin-side-nav.component.ts @@ -44,6 +44,7 @@ export class AdminSideNavComponent implements OnInit { }, { screen: 'audit', label: _('admin-side-nav.audit'), hideIf: !this.currentUser.isAdmin }, { screen: 'users', label: _('admin-side-nav.user-management'), hideIf: !this.currentUser.isUserAdmin }, + { screen: 'dossier-permissions', label: _('dossier-permissions'), hideIf: !this.currentUser.isAdmin }, { screen: 'general-config', label: _('admin-side-nav.configurations'), diff --git a/apps/red-ui/src/app/modules/admin/screens/permissions/config.service.ts b/apps/red-ui/src/app/modules/admin/screens/permissions/config.service.ts new file mode 100644 index 000000000..66116c6d8 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/permissions/config.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { TableColumnConfig } from '@iqser/common-ui'; +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { EntityPermissionsService } from '@services/entity-services/entity-permissions.service'; +import { TargetObjects } from '@red/domain'; + +@Injectable() +export class ConfigService { + constructor(private readonly _entityPermissionsService: EntityPermissionsService) {} + + get tableConfig(): TableColumnConfig[] { + const columns = this._entityPermissionsService.getPermissionsMapping(TargetObjects.Dossier)[0].mappedPermissions.map(c => ({ + label: c.name, + notTranslatable: true, + })); + + return [ + { + label: _('dossier-overview.table-col-names.name'), + width: '3fr', + }, + ...columns, + ]; + } +} diff --git a/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.html new file mode 100644 index 000000000..831ec43fd --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.html @@ -0,0 +1,17 @@ + + + +
+
+ + + + + + + +
+ +
abc
+
+
diff --git a/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.scss b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.scss new file mode 100644 index 000000000..fdab5672e --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.scss @@ -0,0 +1,4 @@ +:host { + flex-grow: 1; + overflow: hidden; +} diff --git a/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.ts new file mode 100644 index 000000000..970945725 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.ts @@ -0,0 +1,25 @@ +import { ChangeDetectionStrategy, Component, forwardRef, Injector } from '@angular/core'; +import { DefaultListingServices, ListingComponent, TableColumnConfig } from '@iqser/common-ui'; +import { User } from '@red/domain'; +import { ConfigService } from '../config.service'; +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { EntityPermissionsService } from '@services/entity-services/entity-permissions.service'; + +@Component({ + templateUrl: './permissions-screen.component.html', + styleUrls: ['./permissions-screen.component.scss'], + providers: [...DefaultListingServices, { provide: ListingComponent, useExisting: forwardRef(() => PermissionsScreenComponent) }], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class PermissionsScreenComponent extends ListingComponent { + readonly tableColumnConfigs: TableColumnConfig[] = this._configService.tableConfig; + readonly tableHeaderLabel = _('dossier-permissions.table-header.title'); + + constructor( + protected readonly _injector: Injector, + private readonly _configService: ConfigService, + private readonly _entityPermissionsService: EntityPermissionsService, + ) { + super(_injector); + } +} diff --git a/apps/red-ui/src/app/modules/admin/screens/permissions/permissions.module.ts b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions.module.ts new file mode 100644 index 000000000..f96d895c5 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { SharedModule } from '@shared/shared.module'; +import { PermissionsScreenComponent } from './permissions-screen/permissions-screen.component'; +import { ConfigService } from './config.service'; +import { CommonUiModule } from '@iqser/common-ui'; + +const routes = [{ path: '', component: PermissionsScreenComponent }]; + +@NgModule({ + declarations: [PermissionsScreenComponent], + imports: [RouterModule.forChild(routes), CommonModule, SharedModule, CommonUiModule], + providers: [ConfigService], +}) +export class PermissionsModule {} diff --git a/apps/red-ui/src/app/services/entity-services/entity-permissions.service.ts b/apps/red-ui/src/app/services/entity-services/entity-permissions.service.ts new file mode 100644 index 000000000..4c6408a3f --- /dev/null +++ b/apps/red-ui/src/app/services/entity-services/entity-permissions.service.ts @@ -0,0 +1,33 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService } from '@iqser/common-ui'; +import { IPermissionsMapping, TargetObject } from '@red/domain'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root', +}) +export class EntityPermissionsService extends GenericService { + readonly #permissionsMapping$ = new BehaviorSubject>>({}); + + constructor(protected readonly _injector: Injector) { + super(_injector, 'permissions'); + } + + getPermissionsMapping(targetObject: TargetObject): IPermissionsMapping[] { + return this.#permissionsMapping$.value[targetObject]; + } + + loadPermissionsMappingFor(targetObject: TargetObject, params = ''): Observable { + return this._http.get(`/${this._defaultModelPath}/${targetObject}${params}`).pipe( + tap(mapping => { + this.#permissionsMapping$.next({ ...this.#permissionsMapping$.value, [targetObject]: mapping }); + }), + ); + } + + // + // getTargetObjects(): Observable { + // return this._http.get(`/${this._defaultModelPath}/target-object`); + // } +} diff --git a/libs/red-domain/src/index.ts b/libs/red-domain/src/index.ts index 99077ba8e..bd2f2a0df 100644 --- a/libs/red-domain/src/index.ts +++ b/libs/red-domain/src/index.ts @@ -23,3 +23,4 @@ export * from './lib/dossier-stats'; export * from './lib/dossier-state'; export * from './lib/trash'; export * from './lib/text-highlight'; +export * from './lib/permissions'; diff --git a/libs/red-domain/src/lib/permissions/index.ts b/libs/red-domain/src/lib/permissions/index.ts new file mode 100644 index 000000000..c85954d3e --- /dev/null +++ b/libs/red-domain/src/lib/permissions/index.ts @@ -0,0 +1 @@ +export * from './permissions'; diff --git a/libs/red-domain/src/lib/permissions/permissions.ts b/libs/red-domain/src/lib/permissions/permissions.ts new file mode 100644 index 000000000..5d49152d1 --- /dev/null +++ b/libs/red-domain/src/lib/permissions/permissions.ts @@ -0,0 +1,16 @@ +export const TargetObjects = { + Dossier: 'Dossier', +} as const; + +export type TargetObject = keyof typeof TargetObjects; + +export interface IPermission { + mask: number; + name: string; + sort: number; +} + +export interface IPermissionsMapping { + mappedPermissions: IPermission[]; + targetPermission: IPermission; +} From 628c222f682b4dfdf13999232bc32adbf94491f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Wed, 6 Apr 2022 00:36:11 +0300 Subject: [PATCH 2/3] RED-3804: Display permission values --- .../src/app/guards/permissions-guard.ts | 3 +- .../screens/permissions/config.service.ts | 21 +++++------- .../permissions-screen.component.html | 9 +++-- .../permissions-screen.component.ts | 20 ++++++++--- .../entity-permissions.service.ts | 34 +++++++++++++++++++ .../permissions-configuration-map.service.ts | 20 +++++++++++ .../permissions-map.service.ts | 10 ++++++ .../entity-permissions.service.ts | 33 ------------------ libs/red-domain/src/lib/permissions/index.ts | 2 ++ .../permissions/permissions-mapping.model.ts | 27 +++++++++++++++ .../lib/permissions/permissions-mapping.ts | 12 +++++++ .../src/lib/permissions/permissions.ts | 11 ------ 12 files changed, 135 insertions(+), 67 deletions(-) create mode 100644 apps/red-ui/src/app/services/entity-permissions/entity-permissions.service.ts create mode 100644 apps/red-ui/src/app/services/entity-permissions/permissions-configuration-map.service.ts create mode 100644 apps/red-ui/src/app/services/entity-permissions/permissions-map.service.ts delete mode 100644 apps/red-ui/src/app/services/entity-services/entity-permissions.service.ts create mode 100644 libs/red-domain/src/lib/permissions/permissions-mapping.model.ts create mode 100644 libs/red-domain/src/lib/permissions/permissions-mapping.ts diff --git a/apps/red-ui/src/app/guards/permissions-guard.ts b/apps/red-ui/src/app/guards/permissions-guard.ts index 10ce0bf34..71fb90557 100644 --- a/apps/red-ui/src/app/guards/permissions-guard.ts +++ b/apps/red-ui/src/app/guards/permissions-guard.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate } from '@angular/router'; import { firstValueFrom } from 'rxjs'; -import { EntityPermissionsService } from '../services/entity-services/entity-permissions.service'; +import { EntityPermissionsService } from '../services/entity-permissions/entity-permissions.service'; @Injectable({ providedIn: 'root' }) export class PermissionsGuard implements CanActivate { @@ -10,6 +10,7 @@ export class PermissionsGuard implements CanActivate { async canActivate(route: ActivatedRouteSnapshot): Promise { const targetObject = route.data.permissionsObject; await firstValueFrom(this._entityPermissionsService.loadPermissionsMappingFor(targetObject)); + await firstValueFrom(this._entityPermissionsService.loadPermissionsFor(targetObject)); return true; } } diff --git a/apps/red-ui/src/app/modules/admin/screens/permissions/config.service.ts b/apps/red-ui/src/app/modules/admin/screens/permissions/config.service.ts index 66116c6d8..bb7e96575 100644 --- a/apps/red-ui/src/app/modules/admin/screens/permissions/config.service.ts +++ b/apps/red-ui/src/app/modules/admin/screens/permissions/config.service.ts @@ -1,25 +1,20 @@ import { Injectable } from '@angular/core'; import { TableColumnConfig } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { EntityPermissionsService } from '@services/entity-services/entity-permissions.service'; -import { TargetObjects } from '@red/domain'; +import { PermissionsMapping, TargetObject } from '@red/domain'; +import { PermissionsConfigurationMapService } from '@services/entity-permissions/permissions-configuration-map.service'; @Injectable() export class ConfigService { - constructor(private readonly _entityPermissionsService: EntityPermissionsService) {} + constructor(private readonly _permissionsConfigurationMapService: PermissionsConfigurationMapService) {} - get tableConfig(): TableColumnConfig[] { - const columns = this._entityPermissionsService.getPermissionsMapping(TargetObjects.Dossier)[0].mappedPermissions.map(c => ({ - label: c.name, + tableConfig(targetObject: TargetObject): TableColumnConfig[] { + const columns = this._permissionsConfigurationMapService.getMappedPermissions(targetObject).map(p => ({ + label: p, notTranslatable: true, + class: 'flex-center', })); - return [ - { - label: _('dossier-overview.table-col-names.name'), - width: '3fr', - }, - ...columns, - ]; + return [{ label: _('dossier-overview.table-col-names.name') }, ...columns]; } } diff --git a/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.html index 831ec43fd..46de6fe08 100644 --- a/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.html @@ -1,17 +1,16 @@ -
-
+
+
{{ config.targetPermission.name }}
+
- +
- -
abc
diff --git a/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.ts index 970945725..d7cfa1e39 100644 --- a/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.ts @@ -1,9 +1,12 @@ import { ChangeDetectionStrategy, Component, forwardRef, Injector } from '@angular/core'; import { DefaultListingServices, ListingComponent, TableColumnConfig } from '@iqser/common-ui'; -import { User } from '@red/domain'; +import { PermissionsMapping, TargetObject } from '@red/domain'; import { ConfigService } from '../config.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { EntityPermissionsService } from '@services/entity-services/entity-permissions.service'; +import { EntityPermissionsService } from '@services/entity-permissions/entity-permissions.service'; +import { ActivatedRoute } from '@angular/router'; +import { PermissionsMapService } from '@services/entity-permissions/permissions-map.service'; +import { PermissionsConfigurationMapService } from '@services/entity-permissions/permissions-configuration-map.service'; @Component({ templateUrl: './permissions-screen.component.html', @@ -11,15 +14,24 @@ import { EntityPermissionsService } from '@services/entity-services/entity-permi providers: [...DefaultListingServices, { provide: ListingComponent, useExisting: forwardRef(() => PermissionsScreenComponent) }], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class PermissionsScreenComponent extends ListingComponent { - readonly tableColumnConfigs: TableColumnConfig[] = this._configService.tableConfig; +export class PermissionsScreenComponent extends ListingComponent { + readonly tableColumnConfigs: TableColumnConfig[]; readonly tableHeaderLabel = _('dossier-permissions.table-header.title'); + readonly targetObject: TargetObject; + readonly mappedPermissions: string[]; constructor( protected readonly _injector: Injector, private readonly _configService: ConfigService, private readonly _entityPermissionsService: EntityPermissionsService, + private readonly _permissionsMapService: PermissionsMapService, + private readonly _permissionsConfigurationMapService: PermissionsConfigurationMapService, + private readonly _route: ActivatedRoute, ) { super(_injector); + this.targetObject = _route.snapshot.data.permissionsObject as TargetObject; + this.tableColumnConfigs = this._configService.tableConfig(this.targetObject); + this.mappedPermissions = this._permissionsConfigurationMapService.getMappedPermissions(this.targetObject); + this.entitiesService.setEntities(this._permissionsMapService.get(this.targetObject)); } } diff --git a/apps/red-ui/src/app/services/entity-permissions/entity-permissions.service.ts b/apps/red-ui/src/app/services/entity-permissions/entity-permissions.service.ts new file mode 100644 index 000000000..9dd938167 --- /dev/null +++ b/apps/red-ui/src/app/services/entity-permissions/entity-permissions.service.ts @@ -0,0 +1,34 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService, mapEach } from '@iqser/common-ui'; +import { IPermissionsMapping, PermissionsMapping, TargetObject } from '@red/domain'; +import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators'; +import { PermissionsConfigurationMapService } from './permissions-configuration-map.service'; +import { PermissionsMapService } from './permissions-map.service'; + +@Injectable({ + providedIn: 'root', +}) +export class EntityPermissionsService extends GenericService { + constructor( + protected readonly _injector: Injector, + private readonly _permissionsConfigurationMapService: PermissionsConfigurationMapService, + private readonly _permissionsMapService: PermissionsMapService, + ) { + super(_injector, 'permissions'); + } + + loadPermissionsMappingFor(targetObject: TargetObject): Observable { + return this._http.get(`/${this._defaultModelPath}/${targetObject}/mapping`).pipe( + mapEach(mapping => new PermissionsMapping(mapping, targetObject)), + tap(mappings => this._permissionsConfigurationMapService.set(targetObject as string, mappings)), + ); + } + + loadPermissionsFor(targetObject: TargetObject): Observable { + return this._http.get(`/${this._defaultModelPath}/${targetObject}`).pipe( + mapEach(mapping => new PermissionsMapping(mapping, targetObject)), + tap(mappings => this._permissionsMapService.set(targetObject as string, mappings)), + ); + } +} diff --git a/apps/red-ui/src/app/services/entity-permissions/permissions-configuration-map.service.ts b/apps/red-ui/src/app/services/entity-permissions/permissions-configuration-map.service.ts new file mode 100644 index 000000000..3e0a9685a --- /dev/null +++ b/apps/red-ui/src/app/services/entity-permissions/permissions-configuration-map.service.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@angular/core'; +import { IPermissionsMapping, PermissionsMapping, TargetObject } from '@red/domain'; +import { EntitiesMapService } from '@iqser/common-ui'; + +@Injectable({ providedIn: 'root' }) +export class PermissionsConfigurationMapService extends EntitiesMapService { + constructor() { + super('name'); + } + + getMappedPermissions(targetObject: TargetObject): string[] { + return Array.from( + new Set( + this.get(targetObject as string) + .flatMap(p => p.mappedPermissions) + .map(p => p.name), + ), + ); + } +} diff --git a/apps/red-ui/src/app/services/entity-permissions/permissions-map.service.ts b/apps/red-ui/src/app/services/entity-permissions/permissions-map.service.ts new file mode 100644 index 000000000..b2f63f9ed --- /dev/null +++ b/apps/red-ui/src/app/services/entity-permissions/permissions-map.service.ts @@ -0,0 +1,10 @@ +import { Injectable } from '@angular/core'; +import { IPermissionsMapping, PermissionsMapping } from '@red/domain'; +import { EntitiesMapService } from '@iqser/common-ui'; + +@Injectable({ providedIn: 'root' }) +export class PermissionsMapService extends EntitiesMapService { + constructor() { + super('name'); + } +} diff --git a/apps/red-ui/src/app/services/entity-services/entity-permissions.service.ts b/apps/red-ui/src/app/services/entity-services/entity-permissions.service.ts deleted file mode 100644 index 4c6408a3f..000000000 --- a/apps/red-ui/src/app/services/entity-services/entity-permissions.service.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Injectable, Injector } from '@angular/core'; -import { GenericService } from '@iqser/common-ui'; -import { IPermissionsMapping, TargetObject } from '@red/domain'; -import { BehaviorSubject, Observable } from 'rxjs'; -import { tap } from 'rxjs/operators'; - -@Injectable({ - providedIn: 'root', -}) -export class EntityPermissionsService extends GenericService { - readonly #permissionsMapping$ = new BehaviorSubject>>({}); - - constructor(protected readonly _injector: Injector) { - super(_injector, 'permissions'); - } - - getPermissionsMapping(targetObject: TargetObject): IPermissionsMapping[] { - return this.#permissionsMapping$.value[targetObject]; - } - - loadPermissionsMappingFor(targetObject: TargetObject, params = ''): Observable { - return this._http.get(`/${this._defaultModelPath}/${targetObject}${params}`).pipe( - tap(mapping => { - this.#permissionsMapping$.next({ ...this.#permissionsMapping$.value, [targetObject]: mapping }); - }), - ); - } - - // - // getTargetObjects(): Observable { - // return this._http.get(`/${this._defaultModelPath}/target-object`); - // } -} diff --git a/libs/red-domain/src/lib/permissions/index.ts b/libs/red-domain/src/lib/permissions/index.ts index c85954d3e..bb52be96a 100644 --- a/libs/red-domain/src/lib/permissions/index.ts +++ b/libs/red-domain/src/lib/permissions/index.ts @@ -1 +1,3 @@ +export * from './permissions-mapping'; export * from './permissions'; +export * from './permissions-mapping.model'; diff --git a/libs/red-domain/src/lib/permissions/permissions-mapping.model.ts b/libs/red-domain/src/lib/permissions/permissions-mapping.model.ts new file mode 100644 index 000000000..4f760204c --- /dev/null +++ b/libs/red-domain/src/lib/permissions/permissions-mapping.model.ts @@ -0,0 +1,27 @@ +import { Entity } from '@iqser/common-ui'; +import { IPermissionsMapping, TargetObject } from './permissions-mapping'; +import { IPermission } from './permissions'; + +export class PermissionsMapping extends Entity implements IPermissionsMapping { + routerLink = undefined; + mappedPermissions: IPermission[]; + targetPermission: IPermission; + + constructor(permissionsMapping: IPermissionsMapping, readonly targetObject: TargetObject) { + super(permissionsMapping); + this.mappedPermissions = permissionsMapping.mappedPermissions; + this.targetPermission = permissionsMapping.targetPermission; + } + + get id(): string { + return this.targetPermission.name; + } + + get searchKey(): string { + return this.targetPermission.name; + } + + getValue(permission: string): boolean { + return this.mappedPermissions.some(p => p.name === permission); + } +} diff --git a/libs/red-domain/src/lib/permissions/permissions-mapping.ts b/libs/red-domain/src/lib/permissions/permissions-mapping.ts new file mode 100644 index 000000000..ad04665b2 --- /dev/null +++ b/libs/red-domain/src/lib/permissions/permissions-mapping.ts @@ -0,0 +1,12 @@ +import { IPermission } from './permissions'; + +export const TargetObjects = { + Dossier: 'Dossier', +} as const; + +export type TargetObject = keyof typeof TargetObjects; + +export interface IPermissionsMapping { + mappedPermissions: IPermission[]; + targetPermission: IPermission; +} diff --git a/libs/red-domain/src/lib/permissions/permissions.ts b/libs/red-domain/src/lib/permissions/permissions.ts index 5d49152d1..8efa79e79 100644 --- a/libs/red-domain/src/lib/permissions/permissions.ts +++ b/libs/red-domain/src/lib/permissions/permissions.ts @@ -1,16 +1,5 @@ -export const TargetObjects = { - Dossier: 'Dossier', -} as const; - -export type TargetObject = keyof typeof TargetObjects; - export interface IPermission { mask: number; name: string; sort: number; } - -export interface IPermissionsMapping { - mappedPermissions: IPermission[]; - targetPermission: IPermission; -} From 663851ab14e2799e276245e7fddb5e83c029da87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Wed, 6 Apr 2022 15:30:01 +0300 Subject: [PATCH 3/3] RED-3804: Update entity permissions --- .../src/app/guards/permissions-guard.ts | 4 +- .../app/modules/admin/admin-routing.module.ts | 3 +- .../screens/permissions/config.service.ts | 10 ++-- .../permissions-screen.component.html | 20 ++++--- .../permissions-screen.component.ts | 37 +++++++++++-- .../translations/permissions-translations.ts | 14 +++++ .../annotation-details.component.ts | 6 +-- .../entity-permissions.service.ts | 27 +++++++--- .../permissions-configuration-map.service.ts | 6 +-- apps/red-ui/src/assets/i18n/de.json | 52 +++++++++++++------ apps/red-ui/src/assets/i18n/en.json | 52 +++++++++++++------ .../permissions/permissions-mapping.model.ts | 19 ++++--- .../lib/permissions/permissions-mapping.ts | 6 --- 13 files changed, 177 insertions(+), 79 deletions(-) create mode 100644 apps/red-ui/src/app/modules/admin/translations/permissions-translations.ts diff --git a/apps/red-ui/src/app/guards/permissions-guard.ts b/apps/red-ui/src/app/guards/permissions-guard.ts index 71fb90557..6e43decd2 100644 --- a/apps/red-ui/src/app/guards/permissions-guard.ts +++ b/apps/red-ui/src/app/guards/permissions-guard.ts @@ -9,8 +9,8 @@ export class PermissionsGuard implements CanActivate { async canActivate(route: ActivatedRouteSnapshot): Promise { const targetObject = route.data.permissionsObject; - await firstValueFrom(this._entityPermissionsService.loadPermissionsMappingFor(targetObject)); - await firstValueFrom(this._entityPermissionsService.loadPermissionsFor(targetObject)); + await firstValueFrom(this._entityPermissionsService.loadConfigFor(targetObject)); + await firstValueFrom(this._entityPermissionsService.loadFor(targetObject)); return true; } } diff --git a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts b/apps/red-ui/src/app/modules/admin/admin-routing.module.ts index 5387a4017..73b51330a 100644 --- a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin-routing.module.ts @@ -24,7 +24,6 @@ import { DossierStatesListingScreenComponent } from './screens/dossier-states-li import { DossiersGuard } from '@guards/dossiers.guard'; import { ACTIVE_DOSSIERS_SERVICE } from '../../tokens'; import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component'; -import { TargetObjects } from '@red/domain'; import { PermissionsGuard } from '../../guards/permissions-guard'; const routes: Routes = [ @@ -167,7 +166,7 @@ const routes: Routes = [ canActivate: [CompositeRouteGuard], data: { routeGuards: [AuthGuard, RedRoleGuard, PermissionsGuard], - permissionsObject: TargetObjects.Dossier, + permissionsObject: 'Dossier', }, loadChildren: () => import('./screens/permissions/permissions.module').then(m => m.PermissionsModule), }, diff --git a/apps/red-ui/src/app/modules/admin/screens/permissions/config.service.ts b/apps/red-ui/src/app/modules/admin/screens/permissions/config.service.ts index bb7e96575..d4b22c715 100644 --- a/apps/red-ui/src/app/modules/admin/screens/permissions/config.service.ts +++ b/apps/red-ui/src/app/modules/admin/screens/permissions/config.service.ts @@ -1,20 +1,20 @@ import { Injectable } from '@angular/core'; import { TableColumnConfig } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { PermissionsMapping, TargetObject } from '@red/domain'; +import { PermissionsMapping } from '@red/domain'; import { PermissionsConfigurationMapService } from '@services/entity-permissions/permissions-configuration-map.service'; +import { permissionsTranslations } from '../../translations/permissions-translations'; @Injectable() export class ConfigService { constructor(private readonly _permissionsConfigurationMapService: PermissionsConfigurationMapService) {} - tableConfig(targetObject: TargetObject): TableColumnConfig[] { + tableConfig(targetObject: string): TableColumnConfig[] { const columns = this._permissionsConfigurationMapService.getMappedPermissions(targetObject).map(p => ({ - label: p, - notTranslatable: true, + label: permissionsTranslations.mapped[p], class: 'flex-center', })); - return [{ label: _('dossier-overview.table-col-names.name') }, ...columns]; + return [{ label: _('permissions-screen.table-col-names.permission') }, ...columns]; } } diff --git a/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.html index 46de6fe08..abbb71cdf 100644 --- a/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.html @@ -1,16 +1,20 @@ + +
-
{{ config.targetPermission.name }}
+
{{ translations[targetObject][config.searchKey] | translate }}
- - - - - - - +
diff --git a/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.ts index d7cfa1e39..d39ec4380 100644 --- a/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/permissions/permissions-screen/permissions-screen.component.ts @@ -1,13 +1,20 @@ import { ChangeDetectionStrategy, Component, forwardRef, Injector } from '@angular/core'; -import { DefaultListingServices, ListingComponent, TableColumnConfig } from '@iqser/common-ui'; -import { PermissionsMapping, TargetObject } from '@red/domain'; +import { DefaultListingServices, ListingComponent, LoadingService, SortingOrders, TableColumnConfig } from '@iqser/common-ui'; +import { PermissionsMapping } from '@red/domain'; import { ConfigService } from '../config.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { EntityPermissionsService } from '@services/entity-permissions/entity-permissions.service'; import { ActivatedRoute } from '@angular/router'; import { PermissionsMapService } from '@services/entity-permissions/permissions-map.service'; import { PermissionsConfigurationMapService } from '@services/entity-permissions/permissions-configuration-map.service'; +import { firstValueFrom } from 'rxjs'; +import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; +import { tap } from 'rxjs/operators'; +import { permissionsTranslations } from '../../../translations/permissions-translations'; +import { UserService } from '@services/user.service'; +import { RouterHistoryService } from '@services/router-history.service'; +@UntilDestroy() @Component({ templateUrl: './permissions-screen.component.html', styleUrls: ['./permissions-screen.component.scss'], @@ -15,23 +22,43 @@ import { PermissionsConfigurationMapService } from '@services/entity-permissions changeDetection: ChangeDetectionStrategy.OnPush, }) export class PermissionsScreenComponent extends ListingComponent { + readonly currentUser = this._userService.currentUser; + readonly translations = permissionsTranslations; readonly tableColumnConfigs: TableColumnConfig[]; - readonly tableHeaderLabel = _('dossier-permissions.table-header.title'); - readonly targetObject: TargetObject; + readonly tableHeaderLabel = _('permissions-screen.table-header.title'); + readonly targetObject: string; readonly mappedPermissions: string[]; constructor( protected readonly _injector: Injector, private readonly _configService: ConfigService, + private readonly _userService: UserService, + private readonly _loadingService: LoadingService, private readonly _entityPermissionsService: EntityPermissionsService, private readonly _permissionsMapService: PermissionsMapService, private readonly _permissionsConfigurationMapService: PermissionsConfigurationMapService, private readonly _route: ActivatedRoute, + readonly routerHistoryService: RouterHistoryService, ) { super(_injector); - this.targetObject = _route.snapshot.data.permissionsObject as TargetObject; + this.targetObject = _route.snapshot.data.permissionsObject; this.tableColumnConfigs = this._configService.tableConfig(this.targetObject); this.mappedPermissions = this._permissionsConfigurationMapService.getMappedPermissions(this.targetObject); this.entitiesService.setEntities(this._permissionsMapService.get(this.targetObject)); + this.sortingService.setSortingOption({ + column: 'sort', + order: SortingOrders.asc, + }); + this._permissionsMapService + .get$(this.targetObject) + .pipe(tap(permissions => this.entitiesService.setEntities(permissions))) + .pipe(untilDestroyed(this)) + .subscribe(); + } + + async togglePermission(targetPermission: string, changedPermission: string): Promise { + this._loadingService.start(); + await firstValueFrom(this._entityPermissionsService.togglePermission(this.targetObject, targetPermission, changedPermission)); + this._loadingService.stop(); } } diff --git a/apps/red-ui/src/app/modules/admin/translations/permissions-translations.ts b/apps/red-ui/src/app/modules/admin/translations/permissions-translations.ts new file mode 100644 index 000000000..73f904abb --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/translations/permissions-translations.ts @@ -0,0 +1,14 @@ +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; + +export const permissionsTranslations: Record> = { + mapped: { + OWNER: _('permissions-screen.mapped.owner'), + APPROVE: _('permissions-screen.mapped.approve'), + REVIEW: _('permissions-screen.mapped.review'), + EVERYONE_ELSE: _('permissions-screen.mapped.everyone-else'), + }, + Dossier: { + VIEW_OBJECT: _('permissions-screen.dossier.view'), + ACCESS_OBJECT: _('permissions-screen.dossier.access'), + }, +} as const; diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotation-details/annotation-details.component.ts b/apps/red-ui/src/app/modules/file-preview/components/annotation-details/annotation-details.component.ts index c31751bdd..98c6d1940 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/annotation-details/annotation-details.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/annotation-details/annotation-details.component.ts @@ -57,18 +57,18 @@ export class AnnotationDetailsComponent implements OnChanges { [ { icon: 'red:dictionary', - description: 'annotation-engines.dictionary', + description: _('annotation-engines.dictionary'), show: AnnotationDetailsComponent._isBasedOn(annotation, Engines.DICTIONARY), translateParams: { isHint: this.annotation.hint }, }, { icon: 'red:ai', - description: 'annotation-engines.ner', + description: _('annotation-engines.ner'), show: AnnotationDetailsComponent._isBasedOn(annotation, Engines.NER), }, { icon: 'red:rule', - description: 'annotation-engines.rule', + description: _('annotation-engines.rule'), show: AnnotationDetailsComponent._isBasedOn(annotation, Engines.RULE), translateParams: { rule: this.annotation.legalBasisValue || '' }, }, diff --git a/apps/red-ui/src/app/services/entity-permissions/entity-permissions.service.ts b/apps/red-ui/src/app/services/entity-permissions/entity-permissions.service.ts index 9dd938167..1881672f6 100644 --- a/apps/red-ui/src/app/services/entity-permissions/entity-permissions.service.ts +++ b/apps/red-ui/src/app/services/entity-permissions/entity-permissions.service.ts @@ -1,8 +1,8 @@ import { Injectable, Injector } from '@angular/core'; import { GenericService, mapEach } from '@iqser/common-ui'; -import { IPermissionsMapping, PermissionsMapping, TargetObject } from '@red/domain'; +import { IPermissionsMapping, PermissionsMapping } from '@red/domain'; import { Observable } from 'rxjs'; -import { tap } from 'rxjs/operators'; +import { switchMap, tap } from 'rxjs/operators'; import { PermissionsConfigurationMapService } from './permissions-configuration-map.service'; import { PermissionsMapService } from './permissions-map.service'; @@ -18,17 +18,32 @@ export class EntityPermissionsService extends GenericService { + loadConfigFor(targetObject: string): Observable { return this._http.get(`/${this._defaultModelPath}/${targetObject}/mapping`).pipe( mapEach(mapping => new PermissionsMapping(mapping, targetObject)), - tap(mappings => this._permissionsConfigurationMapService.set(targetObject as string, mappings)), + tap(mappings => this._permissionsConfigurationMapService.set(targetObject, mappings)), ); } - loadPermissionsFor(targetObject: TargetObject): Observable { + loadFor(targetObject: string): Observable { return this._http.get(`/${this._defaultModelPath}/${targetObject}`).pipe( mapEach(mapping => new PermissionsMapping(mapping, targetObject)), - tap(mappings => this._permissionsMapService.set(targetObject as string, mappings)), + tap(mappings => this._permissionsMapService.set(targetObject, mappings)), ); } + + togglePermission(targetObject: string, targetPermission: string, changedPermission: string): Observable { + const config = this._permissionsConfigurationMapService.get(targetObject); + const targetPermissionConfig = config.find(p => p.searchKey === targetPermission); + const permissions = this._permissionsMapService.get(targetObject); + const currentTargetPermissionValues = this._permissionsMapService.get(targetObject, targetPermission); + const index = currentTargetPermissionValues.mappedPermissions.findIndex(p => p.name === changedPermission); + if (index !== -1) { + currentTargetPermissionValues.mappedPermissions.splice(index, 1); + } else { + const permission = targetPermissionConfig.mappedPermissions.find(p => p.name === changedPermission); + currentTargetPermissionValues.mappedPermissions.push(permission); + } + return this._post(permissions, `${this._defaultModelPath}/${targetObject}`).pipe(switchMap(() => this.loadFor(targetObject))); + } } diff --git a/apps/red-ui/src/app/services/entity-permissions/permissions-configuration-map.service.ts b/apps/red-ui/src/app/services/entity-permissions/permissions-configuration-map.service.ts index 3e0a9685a..7000d1056 100644 --- a/apps/red-ui/src/app/services/entity-permissions/permissions-configuration-map.service.ts +++ b/apps/red-ui/src/app/services/entity-permissions/permissions-configuration-map.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { IPermissionsMapping, PermissionsMapping, TargetObject } from '@red/domain'; +import { IPermissionsMapping, PermissionsMapping } from '@red/domain'; import { EntitiesMapService } from '@iqser/common-ui'; @Injectable({ providedIn: 'root' }) @@ -8,10 +8,10 @@ export class PermissionsConfigurationMapService extends EntitiesMapService p.mappedPermissions) .map(p => p.name), ), diff --git a/apps/red-ui/src/assets/i18n/de.json b/apps/red-ui/src/assets/i18n/de.json index 0791a1408..4e80d9a79 100644 --- a/apps/red-ui/src/assets/i18n/de.json +++ b/apps/red-ui/src/assets/i18n/de.json @@ -36,6 +36,22 @@ }, "header-new": "Dossier erstellen" }, + "add-edit-clone-dossier-template": { + "error": { + "conflict": "Dossiervorlage konnte nicht erstellt werden: Es existiert bereits eine Dossiervorlage mit demselben Namen.", + "generic": "Fehler beim Erstellen der Dossiervorlage." + }, + "form": { + "description": "Beschreibung", + "description-placeholder": "Beschreibung eingeben", + "name": "Name der Dossier-Vorlage", + "name-placeholder": "Namen eingeben", + "valid-from": "Gültig ab", + "valid-to": "Gültig bis" + }, + "save": "Dossier-Vorlage speichern", + "title": "{type, select, edit{Dossier-Vorlage {name} bearbeiten} create{Dossier-Vorlage erstellen} clone{} other{}}" + }, "add-edit-dossier-attribute": { "error": { "generic": "Attribut konnte nicht gespeichert werden!" @@ -61,22 +77,6 @@ "success": "", "title": "" }, - "add-edit-clone-dossier-template": { - "error": { - "conflict": "Dossiervorlage konnte nicht erstellt werden: Es existiert bereits eine Dossiervorlage mit demselben Namen.", - "generic": "Fehler beim Erstellen der Dossiervorlage." - }, - "form": { - "description": "Beschreibung", - "description-placeholder": "Beschreibung eingeben", - "name": "Name der Dossier-Vorlage", - "name-placeholder": "Namen eingeben", - "valid-from": "Gültig ab", - "valid-to": "Gültig bis" - }, - "save": "Dossier-Vorlage speichern", - "title": "{type, select, edit{Dossier-Vorlage {name} bearbeiten} create{Dossier-Vorlage erstellen} clone{} other{}}" - }, "add-edit-entity": { "error": { "entity-already-exists": "", @@ -864,6 +864,7 @@ "under-review": "In Review", "upload-files": "Sie können Dateien überall per Drag and Drop platzieren..." }, + "dossier-permissions": "", "dossier-states-listing": { "action": { "delete": "", @@ -1625,6 +1626,25 @@ }, "toggle-tooltips": "{active, select, true{Disable} false{Enable} other{}} Kurzinfos für Anmerkungen" }, + "permissions-screen": { + "dossier": { + "access": "", + "view": "" + }, + "label": "", + "mapped": { + "approve": "", + "everyone-else": "", + "owner": "", + "review": "" + }, + "table-col-names": { + "permission": "" + }, + "table-header": { + "title": "" + } + }, "processing-status": { "ocr": "", "pending": "", diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index ac7c5913d..31e76781b 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -36,6 +36,22 @@ }, "header-new": "Create Dossier" }, + "add-edit-clone-dossier-template": { + "error": { + "conflict": "Failed to create dossier template: a dossier template with the same name already exists.", + "generic": "Failed to create dossier template." + }, + "form": { + "description": "Description", + "description-placeholder": "Enter Description", + "name": "Dossier Template Name", + "name-placeholder": "Enter Name", + "valid-from": "Valid from", + "valid-to": "Valid to" + }, + "save": "Save Dossier Template", + "title": "{type, select, edit{Edit {name}} create{Create} clone{Clone} other{}} Dossier Template" + }, "add-edit-dossier-attribute": { "error": { "generic": "Failed to save attribute!" @@ -61,22 +77,6 @@ "success": "Successfully {type, select, edit{updated} create{created} other{}} the dossier state!", "title": "{type, select, edit{Edit {name}} create{Create} other{}} Dossier State" }, - "add-edit-clone-dossier-template": { - "error": { - "conflict": "Failed to create dossier template: a dossier template with the same name already exists.", - "generic": "Failed to create dossier template." - }, - "form": { - "description": "Description", - "description-placeholder": "Enter Description", - "name": "Dossier Template Name", - "name-placeholder": "Enter Name", - "valid-from": "Valid from", - "valid-to": "Valid to" - }, - "save": "Save Dossier Template", - "title": "{type, select, edit{Edit {name}} create{Create} clone{Clone} other{}} Dossier Template" - }, "add-edit-entity": { "error": { "entity-already-exists": "Entity with this name already exists!", @@ -864,6 +864,7 @@ "under-review": "Under Review", "upload-files": "Drag & drop files anywhere..." }, + "dossier-permissions": "Dossier Permissions", "dossier-states-listing": { "action": { "delete": "Delete State", @@ -1625,6 +1626,25 @@ }, "toggle-tooltips": "{active, select, true{Disable} false{Enable} other{}} annotation tooltips" }, + "permissions-screen": { + "dossier": { + "access": "Access Dossier", + "view": "View Dossier" + }, + "label": "{targetObject, select, Dossier{Dossier} other{}} Permissions", + "mapped": { + "approve": "Approvers", + "everyone-else": "Everyone else", + "owner": "Owner", + "review": "Reviewers" + }, + "table-col-names": { + "permission": "Permission" + }, + "table-header": { + "title": "{length} {length, plural, one{Permission} other{Permissions}}" + } + }, "processing-status": { "ocr": "OCR", "pending": "Pending", diff --git a/libs/red-domain/src/lib/permissions/permissions-mapping.model.ts b/libs/red-domain/src/lib/permissions/permissions-mapping.model.ts index 4f760204c..d06839806 100644 --- a/libs/red-domain/src/lib/permissions/permissions-mapping.model.ts +++ b/libs/red-domain/src/lib/permissions/permissions-mapping.model.ts @@ -1,16 +1,21 @@ import { Entity } from '@iqser/common-ui'; -import { IPermissionsMapping, TargetObject } from './permissions-mapping'; +import { IPermissionsMapping } from './permissions-mapping'; import { IPermission } from './permissions'; export class PermissionsMapping extends Entity implements IPermissionsMapping { - routerLink = undefined; - mappedPermissions: IPermission[]; - targetPermission: IPermission; + readonly routerLink = undefined; + readonly mappedPermissions: IPermission[]; + readonly targetPermission: IPermission; + readonly sort: number; - constructor(permissionsMapping: IPermissionsMapping, readonly targetObject: TargetObject) { + readonly #currentValuesMap = new Map(); + + constructor(permissionsMapping: IPermissionsMapping, readonly targetObject: string) { super(permissionsMapping); this.mappedPermissions = permissionsMapping.mappedPermissions; this.targetPermission = permissionsMapping.targetPermission; + this.sort = this.targetPermission.sort; + this.mappedPermissions.forEach(permission => this.#currentValuesMap.set(permission.name, true)); } get id(): string { @@ -21,7 +26,7 @@ export class PermissionsMapping extends Entity implements I return this.targetPermission.name; } - getValue(permission: string): boolean { - return this.mappedPermissions.some(p => p.name === permission); + getValue(permissionName: string): boolean { + return this.#currentValuesMap.has(permissionName); } } diff --git a/libs/red-domain/src/lib/permissions/permissions-mapping.ts b/libs/red-domain/src/lib/permissions/permissions-mapping.ts index ad04665b2..1baf6a87a 100644 --- a/libs/red-domain/src/lib/permissions/permissions-mapping.ts +++ b/libs/red-domain/src/lib/permissions/permissions-mapping.ts @@ -1,11 +1,5 @@ import { IPermission } from './permissions'; -export const TargetObjects = { - Dossier: 'Dossier', -} as const; - -export type TargetObject = keyof typeof TargetObjects; - export interface IPermissionsMapping { mappedPermissions: IPermission[]; targetPermission: IPermission;