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 01/11] 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 02/11] 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 03/11] 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; From 12c9e57674cba18afe922bc23eacbd80ad36716f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Wed, 6 Apr 2022 15:40:04 +0300 Subject: [PATCH 04/11] RED-3804: Route role guard --- apps/red-ui/src/app/modules/admin/admin-routing.module.ts | 1 + 1 file changed, 1 insertion(+) 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 73b51330a..d142d6642 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 @@ -166,6 +166,7 @@ const routes: Routes = [ canActivate: [CompositeRouteGuard], data: { routeGuards: [AuthGuard, RedRoleGuard, PermissionsGuard], + requiredRoles: ['RED_ADMIN'], permissionsObject: 'Dossier', }, loadChildren: () => import('./screens/permissions/permissions.module').then(m => m.PermissionsModule), From 745316dbf118836d8fa92ea5733a8f991bcb44ef Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Wed, 6 Apr 2022 12:44:17 +0000 Subject: [PATCH 05/11] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3214 -> 3215 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f703c5767..b71395a0d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.401.0", + "version": "3.402.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index f881bb5312d5b1e0cd7916c265ac2aeb53a326ba..65c51551bddf9a72c46c4cb190e59ebf1acdfea0 100644 GIT binary patch delta 3128 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 Ro!c+A{U3f08rT3(003-1DZKyy From 9d3b41777234e339b5caf8bee77064d1cb2fc22f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Wed, 6 Apr 2022 17:16:25 +0300 Subject: [PATCH 06/11] RED-3762: Use dictionary label in file workload --- .../services/annotation-processing.service.ts | 7 ++++- .../annotation-card.component.html | 2 +- .../annotation-card.component.ts | 31 +++++++++++++++++-- .../file-preview-screen.component.html | 2 +- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/services/annotation-processing.service.ts b/apps/red-ui/src/app/modules/dossier/services/annotation-processing.service.ts index 1bb000a10..6886c42eb 100644 --- a/apps/red-ui/src/app/modules/dossier/services/annotation-processing.service.ts +++ b/apps/red-ui/src/app/modules/dossier/services/annotation-processing.service.ts @@ -5,9 +5,13 @@ import { Filter, handleCheckedValue, IFilter, INestedFilter, NestedFilter } from import { annotationTypesTranslations } from '../../../translations/annotation-types-translations'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { IViewedPage } from '@red/domain'; +import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; +import { FilePreviewStateService } from '../../file-preview/services/file-preview-state.service'; @Injectable() export class AnnotationProcessingService { + constructor(private readonly _state: FilePreviewStateService, private readonly _dictionariesMapService: DictionariesMapService) {} + static secondaryAnnotationFilters(viewedPages?: IViewedPage[]): INestedFilter[] { const _viewedPages = viewedPages ? viewedPages.map(page => page.page) : []; return [ @@ -70,9 +74,10 @@ export class AnnotationProcessingService { if (!parentFilter) { parentFilter = this._createParentFilter(a.superType, filterMap, filters); } + const dictionary = this._dictionariesMapService.getDictionary(a.type, this._state.dossierTemplateId); const childFilter: IFilter = { id: a.filterKey, - label: a.type, + label: dictionary.label, checked: false, matches: 1, }; diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotation-card/annotation-card.component.html b/apps/red-ui/src/app/modules/file-preview/components/annotation-card/annotation-card.component.html index 66b1d335b..92d177391 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/annotation-card/annotation-card.component.html +++ b/apps/red-ui/src/app/modules/file-preview/components/annotation-card/annotation-card.component.html @@ -12,7 +12,7 @@ {{ annotation.descriptor | translate }}: {{ annotation.type | humanize: false }} + >{{ (dictionary$ | async).label }}
: {{ annotation.shortContent }} diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotation-card/annotation-card.component.ts b/apps/red-ui/src/app/modules/file-preview/components/annotation-card/annotation-card.component.ts index a0aed4893..efc604721 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/annotation-card/annotation-card.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/annotation-card/annotation-card.component.ts @@ -1,6 +1,12 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges } from '@angular/core'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { MultiSelectService } from '../../services/multi-select.service'; +import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; +import { DOSSIER_ID } from '@utils/constants'; +import { ActivatedRoute } from '@angular/router'; +import { DossiersService } from '@services/dossiers/dossiers.service'; +import { Dictionary } from '@red/domain'; +import { BehaviorSubject } from 'rxjs'; @Component({ selector: 'redaction-annotation-card', @@ -8,9 +14,28 @@ import { MultiSelectService } from '../../services/multi-select.service'; styleUrls: ['./annotation-card.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class AnnotationCardComponent { +export class AnnotationCardComponent implements OnChanges { @Input() annotation: AnnotationWrapper; @Input() isSelected = false; + readonly dictionary$ = new BehaviorSubject(undefined); + readonly #dossierTemplateId: string; - constructor(readonly multiSelectService: MultiSelectService) {} + constructor( + readonly multiSelectService: MultiSelectService, + private readonly _route: ActivatedRoute, + private readonly _dictionariesMapService: DictionariesMapService, + private readonly _dossiersService: DossiersService, + ) { + const dossierId: string = _route.snapshot.paramMap.get(DOSSIER_ID); + this.#dossierTemplateId = this._dossiersService.find(dossierId).dossierTemplateId; + } + + ngOnChanges(changes: SimpleChanges): void { + if (changes.annotation) { + if (this.annotation.type !== 'manual' && !this.annotation.isHighlight) { + const dictionary = this._dictionariesMapService.getDictionary(this.annotation.type, this.#dossierTemplateId); + this.dictionary$.next(dictionary); + } + } + } } diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.html b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.html index af343e3d6..e4ed0ac06 100644 --- a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.html +++ b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.html @@ -123,6 +123,6 @@ [dossierTemplateId]="state.dossierTemplateId" > - {{ filter.label | humanize: false }} + {{ filter.label }} From af9df98c19428cb3258771b0b5a5482999fc5aad Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Wed, 6 Apr 2022 14:20:27 +0000 Subject: [PATCH 07/11] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3215 -> 3215 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b71395a0d..df1acde45 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.402.0", + "version": "3.403.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 65c51551bddf9a72c46c4cb190e59ebf1acdfea0..494f388639adab1bf0960a700d98aab9571406fb 100644 GIT binary patch delta 3127 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 Rx&30>{{aqP=$rsh003wsB0~TG delta 3127 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 Date: Wed, 6 Apr 2022 17:23:46 +0300 Subject: [PATCH 08/11] RED-3773: File workload status change permissions --- apps/red-ui/src/app/services/permissions.service.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/red-ui/src/app/services/permissions.service.ts b/apps/red-ui/src/app/services/permissions.service.ts index 2963c85e1..7fe6bfc1b 100644 --- a/apps/red-ui/src/app/services/permissions.service.ts +++ b/apps/red-ui/src/app/services/permissions.service.ts @@ -276,15 +276,15 @@ export class PermissionsService { } private _canSetUnderApproval(file: File, dossier: Dossier): boolean { - return dossier.isActive && file.isUnderReview && this.isReviewerOrApprover(file, dossier); + return dossier.isActive && file.isUnderReview && this.isFileAssignee(file); } private _canUndoApproval(file: File, dossier: Dossier): boolean { - return dossier.isActive && file.isApproved && this.isApprover(dossier); + return dossier.isActive && file.isApproved && this.isFileAssignee(file); } private _canBeApproved(file: File, dossier: Dossier): boolean { - return dossier.isActive && file.canBeApproved; + return dossier.isActive && file.canBeApproved && this.isFileAssignee(file); } private _canAssignUser(file: File, dossier: Dossier) { @@ -306,10 +306,10 @@ export class PermissionsService { } private _canSetToNew(file: File, dossier: Dossier): boolean { - return dossier.isActive && file.isUnderReview && this.isDossierMember(dossier); + return dossier.isActive && file.isUnderReview && this.isFileAssignee(file); } private _canSetUnderReview(file: File, dossier: Dossier): boolean { - return dossier.isActive && file.isUnderApproval; + return dossier.isActive && file.isUnderApproval && this.isFileAssignee(file); } } From 268d5da61fb98f509982b9cf5b760a2f91481ed3 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Wed, 6 Apr 2022 14:27:45 +0000 Subject: [PATCH 09/11] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3215 -> 3214 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index df1acde45..a35d57fea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.403.0", + "version": "3.404.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 494f388639adab1bf0960a700d98aab9571406fb..a1171713a86ab1cd18f9a2d1f91b721ac0e9972f 100644 GIT binary patch delta 3125 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 Date: Wed, 6 Apr 2022 17:54:50 +0300 Subject: [PATCH 10/11] RED-3769: Import redactions permissions --- apps/red-ui/src/app/services/permissions.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/red-ui/src/app/services/permissions.service.ts b/apps/red-ui/src/app/services/permissions.service.ts index 7fe6bfc1b..ab6aebaab 100644 --- a/apps/red-ui/src/app/services/permissions.service.ts +++ b/apps/red-ui/src/app/services/permissions.service.ts @@ -228,7 +228,7 @@ export class PermissionsService { } canImportRedactions(file: File, dossier: Dossier) { - return dossier.isActive && (this.isFileAssignee(file) || this.isApprover(dossier)) && !file.isApproved; + return dossier.isActive && this.isFileAssignee(file) && !file.isApproved; } private _canOcrFile(file: File, dossier: Dossier): boolean { From 034acff3194fcea080d3c38895c79259f51e9388 Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Wed, 6 Apr 2022 14:58:54 +0000 Subject: [PATCH 11/11] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3214 -> 3216 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a35d57fea..47423d8fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.404.0", + "version": "3.405.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index a1171713a86ab1cd18f9a2d1f91b721ac0e9972f..ae2ae3d18ff8bdd2a2f23d027207f18b32372887 100644 GIT binary patch delta 3101 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