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