diff --git a/apps/red-ui/src/app/app-routing.module.ts b/apps/red-ui/src/app/app-routing.module.ts index 3226143ee..e8a717c16 100644 --- a/apps/red-ui/src/app/app-routing.module.ts +++ b/apps/red-ui/src/app/app-routing.module.ts @@ -9,7 +9,7 @@ import { DownloadsListScreenComponent } from '@components/downloads-list-screen/ import { DossiersGuard } from '@guards/dossiers.guard'; import { ACTIVE_DOSSIERS_SERVICE, ARCHIVED_DOSSIERS_SERVICE } from './tokens'; import { FeaturesGuard } from '@guards/features-guard.service'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; +import { ARCHIVE_ROUTE, DOSSIER_TEMPLATE_ID, DOSSIERS_ARCHIVE, DOSSIERS_ROUTE } from '@red/domain'; import { DossierTemplatesGuard } from '@guards/dossier-templates.guard'; import { DossierTemplateExistsGuard } from '@guards/dossier-template-exists.guard'; import { DashboardGuard } from '@guards/dashboard-guard.service'; diff --git a/apps/red-ui/src/app/guards/dossier-files-guard.ts b/apps/red-ui/src/app/guards/dossier-files-guard.ts index 63d9948dd..4b0e5bd68 100644 --- a/apps/red-ui/src/app/guards/dossier-files-guard.ts +++ b/apps/red-ui/src/app/guards/dossier-files-guard.ts @@ -3,9 +3,8 @@ import { ActivatedRouteSnapshot, CanActivate, Router } from '@angular/router'; import { FilesMapService } from '@services/entity-services/files-map.service'; import { FilesService } from '@services/entity-services/files.service'; import { firstValueFrom } from 'rxjs'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; +import { DOSSIER_ID, DOSSIER_TEMPLATE_ID } from '@red/domain'; import { DossiersService } from '@services/dossiers/dossiers.service'; -import { DOSSIER_ID } from '@red/domain'; @Injectable({ providedIn: 'root' }) export class DossierFilesGuard implements CanActivate { diff --git a/apps/red-ui/src/app/guards/dossier-template-exists.guard.ts b/apps/red-ui/src/app/guards/dossier-template-exists.guard.ts index b53592a16..4099bc313 100644 --- a/apps/red-ui/src/app/guards/dossier-template-exists.guard.ts +++ b/apps/red-ui/src/app/guards/dossier-template-exists.guard.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate, Router } from '@angular/router'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; +import { DOSSIER_TEMPLATE_ID } from '@red/domain'; import { DashboardStatsService } from '@services/dossier-templates/dashboard-stats.service'; @Injectable({ providedIn: 'root' }) diff --git a/apps/red-ui/src/app/guards/entity-exists-guard.service.ts b/apps/red-ui/src/app/guards/entity-exists-guard.service.ts index 012583808..7d6e379d7 100644 --- a/apps/red-ui/src/app/guards/entity-exists-guard.service.ts +++ b/apps/red-ui/src/app/guards/entity-exists-guard.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate, Router } from '@angular/router'; -import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@utils/constants'; +import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; @@ -13,8 +13,8 @@ export class EntityExistsGuard implements CanActivate { ) {} async canActivate(route: ActivatedRouteSnapshot): Promise { - const dossierTemplateId: string = route.paramMap.get(DOSSIER_TEMPLATE_ID); - const type: string = route.paramMap.get(ENTITY_TYPE); + const dossierTemplateId = route.paramMap.get(DOSSIER_TEMPLATE_ID); + const type = route.paramMap.get(ENTITY_TYPE); if (!this._dictionariesMapService.get(dossierTemplateId, type)) { const dossierTemplate = this._dossierTemplatesService.find(dossierTemplateId); 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 5788fa076..02946717e 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 @@ -15,7 +15,7 @@ import { GeneralConfigScreenComponent } from './screens/general-config/general-c import { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component'; import { BaseDossierTemplateScreenComponent } from './base-dossier-templates-screen/base-dossier-template-screen.component'; import { DossierTemplatesGuard } from '@guards/dossier-templates.guard'; -import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@utils/constants'; +import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain'; import { DossierTemplateExistsGuard } from '@guards/dossier-template-exists.guard'; import { EntityExistsGuard } from '@guards/entity-exists-guard.service'; import { DossierStatesListingScreenComponent } from './screens/dossier-states-listing/dossier-states-listing-screen.component'; 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 b5a1672de..e8b16024c 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 @@ -4,8 +4,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { adminSideNavTranslations } from '../translations/admin-side-nav-translations'; import { UserService } from '@services/user.service'; import { ActivatedRoute } from '@angular/router'; -import { ENTITY_TYPE } from '@utils/constants'; -import { AdminSideNavType, AdminSideNavTypes } from '@red/domain'; +import { AdminSideNavType, AdminSideNavTypes, ENTITY_TYPE } from '@red/domain'; interface NavItem { readonly label: string; diff --git a/apps/red-ui/src/app/modules/admin/base-entity-screen/base-entity-screen.component.html b/apps/red-ui/src/app/modules/admin/base-entity-screen/base-entity-screen.component.html index 119abe9e6..df042e323 100644 --- a/apps/red-ui/src/app/modules/admin/base-entity-screen/base-entity-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/base-entity-screen/base-entity-screen.component.html @@ -5,7 +5,7 @@
diff --git a/apps/red-ui/src/app/modules/admin/base-entity-screen/base-entity-screen.component.ts b/apps/red-ui/src/app/modules/admin/base-entity-screen/base-entity-screen.component.ts index e76e6980e..654906fa3 100644 --- a/apps/red-ui/src/app/modules/admin/base-entity-screen/base-entity-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/base-entity-screen/base-entity-screen.component.ts @@ -1,10 +1,9 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@utils/constants'; +import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@red/domain'; import { ActivatedRoute, Router } from '@angular/router'; import { firstValueFrom, Observable } from 'rxjs'; import { AdminDialogService } from '../services/admin-dialog.service'; import { DictionaryService } from '@services/entity-services/dictionary.service'; -import { UserService } from '@services/user.service'; import { LoadingService } from '@iqser/common-ui'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; @@ -16,26 +15,24 @@ import { PermissionsService } from '@services/permissions.service'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class BaseEntityScreenComponent { - readonly currentUser = this._userService.currentUser; readonly disabledItems$: Observable; readonly canDeleteEntity$: Observable; readonly #dossierTemplateId: string; readonly #entityType: string; constructor( - private readonly _route: ActivatedRoute, - private readonly _userService: UserService, + route: ActivatedRoute, + private readonly _router: Router, + dictionaryMapService: DictionariesMapService, private readonly _loadingService: LoadingService, private readonly _dialogService: AdminDialogService, private readonly _dictionaryService: DictionaryService, - private readonly _dictionaryMapService: DictionariesMapService, - private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _permissionsService: PermissionsService, - private readonly _router: Router, + private readonly _dossierTemplatesService: DossierTemplatesService, ) { - this.#dossierTemplateId = this._route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); - this.#entityType = this._route.snapshot.paramMap.get(ENTITY_TYPE); - const entity$ = this._dictionaryMapService.watch$(this.#dossierTemplateId, this.#entityType); + this.#dossierTemplateId = route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); + this.#entityType = route.snapshot.paramMap.get(ENTITY_TYPE); + const entity$ = dictionaryMapService.watch$(this.#dossierTemplateId, this.#entityType); this.canDeleteEntity$ = entity$.pipe(map(entity => this._permissionsService.canDeleteEntities(entity))); this.disabledItems$ = entity$.pipe( map(entity => (entity.hasDictionary ? [] : ['dictionary', 'false-positive', 'false-recommendations'])), diff --git a/apps/red-ui/src/app/modules/admin/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component.ts b/apps/red-ui/src/app/modules/admin/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component.ts index b5108a29e..44e499a80 100644 --- a/apps/red-ui/src/app/modules/admin/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component.ts +++ b/apps/red-ui/src/app/modules/admin/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component.ts @@ -3,9 +3,8 @@ import { DossierTemplatesService } from '@services/dossier-templates/dossier-tem import { Observable, of } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; import { ActivatedRoute } from '@angular/router'; -import { Dictionary, DossierTemplate } from '@red/domain'; +import { Dictionary, DOSSIER_TEMPLATE_ID, DossierTemplate, ENTITY_TYPE } from '@red/domain'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; -import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@utils/constants'; @Component({ selector: 'redaction-dossier-template-breadcrumbs', @@ -20,16 +19,16 @@ export class DossierTemplateBreadcrumbsComponent { constructor( private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _dictionariesMapService: DictionariesMapService, - private readonly _route: ActivatedRoute, + route: ActivatedRoute, ) { - this.dossierTemplate$ = _route.paramMap.pipe( + this.dossierTemplate$ = route.paramMap.pipe( map(params => params.get(DOSSIER_TEMPLATE_ID)), - switchMap((dossierTemplateId: string) => this._dossierTemplatesService.getEntityChanged$(dossierTemplateId)), + switchMap(dossierTemplateId => _dossierTemplatesService.getEntityChanged$(dossierTemplateId)), ); - this.activeDictionary$ = _route.paramMap.pipe( - map(params => [params.get(DOSSIER_TEMPLATE_ID), params.get(ENTITY_TYPE)]), - switchMap(([dossierTemplateId, dictionary]: [string, string]) => - dictionary ? this._dictionariesMapService.watch$(dossierTemplateId, dictionary) : of(undefined), + this.activeDictionary$ = route.paramMap.pipe( + map(params => [params.get(DOSSIER_TEMPLATE_ID), params.get(ENTITY_TYPE)] as const), + switchMap(([dossierTemplateId, dictionary]) => + dictionary ? _dictionariesMapService.watch$(dossierTemplateId, dictionary) : of(undefined), ), ); } diff --git a/apps/red-ui/src/app/modules/admin/screens/default-colors/default-colors-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/default-colors/default-colors-screen.component.ts index 97643322c..a53a3774f 100644 --- a/apps/red-ui/src/app/modules/admin/screens/default-colors/default-colors-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/default-colors/default-colors-screen.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, forwardRef, Injector, OnInit } from '@angular/core'; -import { DefaultColorType, IColors } from '@red/domain'; +import { DefaultColorType, DOSSIER_TEMPLATE_ID, IColors, User } from '@red/domain'; import { AdminDialogService } from '../../services/admin-dialog.service'; import { CircleButtonTypes, @@ -13,10 +13,8 @@ import { defaultColorsTranslations } from '../../translations/default-colors-tra import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { UserService } from '@services/user.service'; import { DictionaryService } from '@services/entity-services/dictionary.service'; -import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { firstValueFrom } from 'rxjs'; import { ActivatedRoute } from '@angular/router'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; interface ListItem extends IListable { readonly key: string; @@ -31,27 +29,28 @@ interface ListItem extends IListable { }) export class DefaultColorsScreenComponent extends ListingComponent implements OnInit { readonly circleButtonTypes = CircleButtonTypes; - readonly currentUser = this._userService.currentUser; + readonly currentUser: User; readonly translations = defaultColorsTranslations; readonly tableHeaderLabel = _('default-colors-screen.table-header.title'); readonly tableColumnConfigs: TableColumnConfig[] = [ { label: _('default-colors-screen.table-col-names.key'), sortByKey: 'searchKey', width: '2fr' }, { label: _('default-colors-screen.table-col-names.color'), class: 'flex-center' }, ]; - private _colorsObj: IColors; + + #colorsObj: IColors; readonly #dossierTemplateId: string; constructor( + route: ActivatedRoute, + userService: UserService, protected readonly _injector: Injector, - private readonly _userService: UserService, private readonly _loadingService: LoadingService, - private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _dialogService: AdminDialogService, private readonly _dictionaryService: DictionaryService, - private readonly _route: ActivatedRoute, ) { super(_injector); - this.#dossierTemplateId = _route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); + this.currentUser = userService.currentUser; + this.#dossierTemplateId = route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); } openEditColorDialog($event: MouseEvent, color: { key: DefaultColorType | string; value: string }) { @@ -59,7 +58,7 @@ export class DefaultColorsScreenComponent extends ListingComponent imp 'editColor', $event, { - colors: this._colorsObj, + colors: this.#colorsObj, colorKey: color.key, dossierTemplateId: this.#dossierTemplateId, }, @@ -76,7 +75,7 @@ export class DefaultColorsScreenComponent extends ListingComponent imp private async _loadColors() { this._loadingService.start(); const data = await firstValueFrom(this._dictionaryService.getColors(this.#dossierTemplateId)); - this._colorsObj = data; + this.#colorsObj = data; const entities = Object.keys(data) .map(key => ({ id: key, diff --git a/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts index 2a09f4108..c22cf5c3e 100644 --- a/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts @@ -13,11 +13,10 @@ import { DossierAttributesService } from '@shared/services/controller-wrappers/d import { dossierAttributeTypesTranslations } from '../../translations/dossier-attribute-types-translations'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { UserService } from '@services/user.service'; -import { DossierAttributeConfig, IDossierAttributeConfig } from '@red/domain'; +import { DOSSIER_TEMPLATE_ID, DossierAttributeConfig, IDossierAttributeConfig } from '@red/domain'; import { firstValueFrom } from 'rxjs'; import { ReportTemplateService } from '../../../../services/report-template.service'; import { ActivatedRoute } from '@angular/router'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; @Component({ templateUrl: './dossier-attributes-listing-screen.component.html', diff --git a/apps/red-ui/src/app/modules/admin/screens/dossier-templates-listing/dossier-templates-listing-screen/dossier-templates-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/dossier-templates-listing/dossier-templates-listing-screen/dossier-templates-listing-screen.component.ts index 1059bbc20..c5a28286e 100644 --- a/apps/red-ui/src/app/modules/admin/screens/dossier-templates-listing/dossier-templates-listing-screen/dossier-templates-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/dossier-templates-listing/dossier-templates-listing-screen/dossier-templates-listing-screen.component.ts @@ -10,7 +10,6 @@ import { ListingComponent, LoadingService, TableColumnConfig, - Toaster, } from '@iqser/common-ui'; import { UserService } from '@services/user.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; @@ -44,7 +43,6 @@ export class DossierTemplatesListingScreenComponent extends ListingComponent([]); + readonly currentUser: User; + readonly initialEntries$ = new BehaviorSubject([]); isLeavingPage = false; readonly type: DictionaryType; readonly #dossierTemplateId: string; readonly #entityType: string; @ViewChild('dictionaryManager', { static: false }) private readonly _dictionaryManager: DictionaryManagerComponent; - @ViewChild('fileInput') private readonly _fileInput: ElementRef; constructor( - private readonly _userService: UserService, + route: ActivatedRoute, + userService: UserService, private readonly _loadingService: LoadingService, private readonly _dictionaryService: DictionaryService, - private readonly _route: ActivatedRoute, ) { - this.#dossierTemplateId = _route.parent.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); - this.#entityType = _route.parent.snapshot.paramMap.get(ENTITY_TYPE); - this.type = this._route.snapshot.routeConfig.path as DictionaryType; + this.currentUser = userService.currentUser; + this.#dossierTemplateId = route.parent.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); + this.#entityType = route.parent.snapshot.paramMap.get(ENTITY_TYPE); + this.type = route.snapshot.routeConfig.path as DictionaryType; } get changed() { diff --git a/apps/red-ui/src/app/modules/admin/screens/entities/screens/info/info.component.ts b/apps/red-ui/src/app/modules/admin/screens/entities/screens/info/info.component.ts index dd78827cb..b551a6be2 100644 --- a/apps/red-ui/src/app/modules/admin/screens/entities/screens/info/info.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/entities/screens/info/info.component.ts @@ -1,7 +1,6 @@ import { ChangeDetectionStrategy, Component, HostListener, ViewChild } from '@angular/core'; -import { Dictionary } from '@red/domain'; +import { Dictionary, DOSSIER_TEMPLATE_ID, ENTITY_TYPE, User } from '@red/domain'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; -import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@utils/constants'; import { ActivatedRoute } from '@angular/router'; import { UserService } from '@services/user.service'; import { PermissionsService } from '@services/permissions.service'; @@ -16,20 +15,21 @@ import { Observable } from 'rxjs'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class InfoComponent { - readonly currentUser = this._userService.currentUser; + readonly currentUser: User; readonly entity$: Observable; readonly dossierTemplateId: string; @ViewChild(AddEditEntityComponent) private readonly _addEditEntityComponent: AddEditEntityComponent; constructor( - private readonly _dictionariesMapService: DictionariesMapService, - private readonly _route: ActivatedRoute, - private readonly _userService: UserService, + route: ActivatedRoute, + userService: UserService, + dictionariesMapService: DictionariesMapService, readonly permissionsService: PermissionsService, ) { - this.dossierTemplateId = this._route.parent.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); - const entityType = this._route.parent.snapshot.paramMap.get(ENTITY_TYPE); - this.entity$ = this._dictionariesMapService.watch$(this.dossierTemplateId, entityType); + this.currentUser = userService.currentUser; + this.dossierTemplateId = route.parent.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); + const entityType = route.parent.snapshot.paramMap.get(ENTITY_TYPE); + this.entity$ = dictionariesMapService.watch$(this.dossierTemplateId, entityType); } get disabled(): boolean { diff --git a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts index 36f8ee278..86985fe3a 100644 --- a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts @@ -22,14 +22,12 @@ import { import { fileAttributeTypesTranslations } from '../../translations/file-attribute-types-translations'; import { UserService } from '@services/user.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { FileAttributeConfig, IFileAttributeConfig, IFileAttributesConfig } from '@red/domain'; +import { DOSSIER_TEMPLATE_ID, FileAttributeConfig, IFileAttributeConfig, IFileAttributesConfig, User } from '@red/domain'; import { FileAttributesService } from '@services/entity-services/file-attributes.service'; import { HttpStatusCode } from '@angular/common/http'; import { firstValueFrom } from 'rxjs'; -import { ReportTemplateService } from '../../../../services/report-template.service'; import { ActivatedRoute } from '@angular/router'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; @Component({ templateUrl: './file-attributes-listing-screen.component.html', @@ -43,7 +41,7 @@ import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; export class FileAttributesListingScreenComponent extends ListingComponent implements OnInit, OnDestroy { readonly iconButtonTypes = IconButtonTypes; readonly circleButtonTypes = CircleButtonTypes; - readonly currentUser = this._userService.currentUser; + readonly currentUser: User; readonly translations = fileAttributeTypesTranslations; readonly tableHeaderLabel = _('file-attributes-listing.table-header.title'); readonly tableColumnConfigs: TableColumnConfig[] = [ @@ -60,24 +58,24 @@ export class FileAttributesListingScreenComponent extends ListingComponent; + @ViewChild('impactedTemplates') private readonly _impactedTemplatesRef: TemplateRef; private _existingConfiguration: IFileAttributesConfig; @ViewChild('fileInput') private _fileInput: ElementRef; readonly #dossierTemplateId: string; constructor( - protected readonly _injector: Injector, + route: ActivatedRoute, + userService: UserService, private readonly _toaster: Toaster, - private readonly _userService: UserService, + protected readonly _injector: Injector, private readonly _loadingService: LoadingService, - private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _dialogService: AdminDialogService, private readonly _fileAttributesService: FileAttributesService, - private readonly _reportTemplateService: ReportTemplateService, - private readonly _route: ActivatedRoute, + private readonly _dossierTemplatesService: DossierTemplatesService, ) { super(_injector); - this.#dossierTemplateId = _route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); + this.currentUser = userService.currentUser; + this.#dossierTemplateId = route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); } private get _numberOfDisplayedAttrs(): number { @@ -111,7 +109,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent { diff --git a/apps/red-ui/src/app/modules/admin/screens/info/info-screen/dossier-template-info-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/info/info-screen/dossier-template-info-screen.component.ts index c953e8a70..701d41570 100644 --- a/apps/red-ui/src/app/modules/admin/screens/info/info-screen/dossier-template-info-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/info/info-screen/dossier-template-info-screen.component.ts @@ -2,11 +2,10 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { ActivatedRoute } from '@angular/router'; import { Observable } from 'rxjs'; -import { DossierTemplate, DossierTemplateStats } from '@red/domain'; +import { DOSSIER_TEMPLATE_ID, DossierTemplate, DossierTemplateStats } from '@red/domain'; import { DossierTemplateStatsService } from '@services/entity-services/dossier-template-stats.service'; import { AdminDialogService } from '../../../services/admin-dialog.service'; import { PermissionsService } from '@services/permissions.service'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; import { dossierTemplateStatusTranslations } from '../../../translations/dossier-template-status-translations'; @Component({ @@ -20,15 +19,15 @@ export class DossierTemplateInfoScreenComponent { readonly translations = dossierTemplateStatusTranslations; constructor( - private readonly _dossierTemplatesService: DossierTemplatesService, - private readonly _dossierTemplateStatsService: DossierTemplateStatsService, - private readonly _dialogService: AdminDialogService, - private readonly _route: ActivatedRoute, + route: ActivatedRoute, readonly permissionsService: PermissionsService, + dossierTemplatesService: DossierTemplatesService, + private readonly _dialogService: AdminDialogService, + dossierTemplateStatsService: DossierTemplateStatsService, ) { - const dossierTemplateId = _route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); - this.dossierTemplate$ = this._dossierTemplatesService.getEntityChanged$(dossierTemplateId); - this.dossierTemplateStats$ = this._dossierTemplateStatsService.watch$(dossierTemplateId); + const dossierTemplateId = route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); + this.dossierTemplate$ = dossierTemplatesService.getEntityChanged$(dossierTemplateId); + this.dossierTemplateStats$ = dossierTemplateStatsService.watch$(dossierTemplateId); } openEditDossierTemplateDialog($event: MouseEvent, dossierTemplate: DossierTemplate) { diff --git a/apps/red-ui/src/app/modules/admin/screens/justifications/justifications-screen/justifications-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/justifications/justifications-screen/justifications-screen.component.ts index aad1a6d2e..518c1a533 100644 --- a/apps/red-ui/src/app/modules/admin/screens/justifications/justifications-screen/justifications-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/justifications/justifications-screen/justifications-screen.component.ts @@ -9,14 +9,13 @@ import { LoadingService, TableColumnConfig, } from '@iqser/common-ui'; -import { Justification } from '@red/domain'; +import { DOSSIER_TEMPLATE_ID, Justification } from '@red/domain'; import { JustificationsService } from '@services/entity-services/justifications.service'; import { JustificationsDialogService } from '../justifications-dialog.service'; import { UserService } from '@services/user.service'; import { UserPreferenceService } from '@services/user-preference.service'; import { firstValueFrom } from 'rxjs'; import { ActivatedRoute } from '@angular/router'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; @Component({ selector: 'redaction-justifications-screen', @@ -54,6 +53,10 @@ export class JustificationsScreenComponent extends ListingComponent { this._loadingService.start(); await firstValueFrom(this._justificationService.loadAll(this.#dossierTemplateId)); @@ -67,8 +70,4 @@ export class JustificationsScreenComponent extends ListingComponent
- + + - + +
diff --git a/apps/red-ui/src/app/modules/admin/screens/justifications/table-item/table-item.component.ts b/apps/red-ui/src/app/modules/admin/screens/justifications/table-item/table-item.component.ts index a03b711f2..2b715e2ab 100644 --- a/apps/red-ui/src/app/modules/admin/screens/justifications/table-item/table-item.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/justifications/table-item/table-item.component.ts @@ -1,11 +1,11 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; -import { Justification } from '@red/domain'; -import { CircleButtonTypes, ListingService, LoadingService } from '@iqser/common-ui'; +import { DOSSIER_TEMPLATE_ID, Justification, User } from '@red/domain'; +import { CircleButtonTypes } from '@iqser/common-ui'; import { JustificationsDialogService } from '../justifications-dialog.service'; import { UserService } from '@services/user.service'; import { UserPreferenceService } from '@services/user-preference.service'; import { ActivatedRoute } from '@angular/router'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; +import { Observable } from 'rxjs'; @Component({ selector: 'redaction-table-item', @@ -16,17 +16,17 @@ import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; export class TableItemComponent { readonly circleButtonTypes = CircleButtonTypes; @Input() justification: Justification; + readonly currentUser$: Observable; readonly #dossierTemplateId: string; constructor( - private readonly _dialogService: JustificationsDialogService, - private readonly _loadingService: LoadingService, - private readonly _listingService: ListingService, + route: ActivatedRoute, + userService: UserService, readonly userPreferenceService: UserPreferenceService, - readonly userService: UserService, - private readonly _route: ActivatedRoute, + private readonly _dialogService: JustificationsDialogService, ) { - this.#dossierTemplateId = _route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); + this.currentUser$ = userService.currentUser$; + this.#dossierTemplateId = route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); } openEditJustificationDialog() { diff --git a/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen/reports-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen/reports-screen.component.ts index 1742a103a..13860af28 100644 --- a/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen/reports-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/reports/reports-screen/reports-screen.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { IPlaceholdersResponse, IReportTemplate } from '@red/domain'; +import { DOSSIER_TEMPLATE_ID, IPlaceholdersResponse, IReportTemplate } from '@red/domain'; import { download } from '@utils/file-download-utils'; import { ConfirmationDialogInput, LoadingService, Toaster } from '@iqser/common-ui'; import { PermissionsService } from '@services/permissions.service'; @@ -14,7 +14,6 @@ import { DossierTemplatesService } from '@services/dossier-templates/dossier-tem import { ReportTemplateService } from '@services/report-template.service'; import { BehaviorSubject, firstValueFrom } from 'rxjs'; import { ActivatedRoute } from '@angular/router'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; interface Placeholder { placeholder: string; diff --git a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts index 5551bfb1d..24ffb9c9b 100644 --- a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts @@ -1,13 +1,12 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import { PermissionsService } from '@services/permissions.service'; import { Debounce, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; -import { TranslateService } from '@ngx-translate/core'; import { saveAs } from 'file-saver'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { RulesService } from '../../../services/rules.service'; import { firstValueFrom } from 'rxjs'; import { ActivatedRoute } from '@angular/router'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; +import { DOSSIER_TEMPLATE_ID } from '@red/domain'; import ICodeEditor = monaco.editor.ICodeEditor; import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration; import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorConstructionOptions; @@ -44,11 +43,10 @@ export class RulesScreenComponent implements OnInit { private readonly _rulesService: RulesService, private readonly _changeDetectorRef: ChangeDetectorRef, private readonly _toaster: Toaster, - protected readonly _translateService: TranslateService, private readonly _loadingService: LoadingService, - private readonly _route: ActivatedRoute, + route: ActivatedRoute, ) { - this.#dossierTemplateId = _route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); + this.#dossierTemplateId = route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); } set isLeavingPage(isLeaving: boolean) { diff --git a/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.scss b/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.scss index 74143cc02..bbdca01c2 100644 --- a/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.scss +++ b/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.scss @@ -2,6 +2,7 @@ :host { display: flex; + flex-direction: row; flex-grow: 1; overflow: hidden; } diff --git a/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.ts index 28c15e08d..ce7d07ecc 100644 --- a/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.ts @@ -5,7 +5,7 @@ import { environment } from '@environments/environment'; import { HttpClient } from '@angular/common/http'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Debounce, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; -import { IWatermark, WatermarkOrientation, WatermarkOrientations } from '@red/domain'; +import { DOSSIER_TEMPLATE_ID, IWatermark, WatermarkOrientation, WatermarkOrientations } from '@red/domain'; import { BASE_HREF } from '../../../../../tokens'; import { stampPDFPage } from '@utils/page-stamper'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; @@ -13,7 +13,6 @@ import { WatermarkService } from '@shared/services/watermark.service'; import { firstValueFrom, Observable, of, switchMap } from 'rxjs'; import { catchError, tap } from 'rxjs/operators'; import { ActivatedRoute } from '@angular/router'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; export const DEFAULT_WATERMARK: IWatermark = { text: null, @@ -39,18 +38,18 @@ export class WatermarkScreenComponent implements OnInit { private _viewer: ElementRef; constructor( + route: ActivatedRoute, + private readonly _http: HttpClient, + private readonly _toaster: Toaster, + private readonly _formBuilder: FormBuilder, readonly permissionsService: PermissionsService, + private readonly _loadingService: LoadingService, @Inject(BASE_HREF) private readonly _baseHref: string, private readonly _watermarkService: WatermarkService, - private readonly _toaster: Toaster, - private readonly _http: HttpClient, private readonly _changeDetectorRef: ChangeDetectorRef, - private readonly _formBuilder: FormBuilder, - private readonly _loadingService: LoadingService, - private readonly _route: ActivatedRoute, ) { this._loadingService.start(); - this.#dossierTemplateId = this._route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); + this.#dossierTemplateId = route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); } get changed(): boolean { diff --git a/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-actions/dossier-template-actions.component.ts b/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-actions/dossier-template-actions.component.ts index 172e66f72..99156b63e 100644 --- a/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-actions/dossier-template-actions.component.ts +++ b/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-actions/dossier-template-actions.component.ts @@ -1,12 +1,11 @@ import { Component, Input, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { AdminDialogService } from '../../../services/admin-dialog.service'; -import { CircleButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; +import { CircleButtonTypes, LoadingService } from '@iqser/common-ui'; import { UserService } from '@services/user.service'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { firstValueFrom } from 'rxjs'; -import { DictionaryService } from '@services/entity-services/dictionary.service'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; +import { DOSSIER_TEMPLATE_ID } from '@red/domain'; @Component({ selector: 'redaction-dossier-template-actions', @@ -22,10 +21,8 @@ export class DossierTemplateActionsComponent implements OnInit { constructor( private readonly _router: Router, private readonly _route: ActivatedRoute, - private readonly _toaster: Toaster, private readonly _userService: UserService, private readonly _loadingService: LoadingService, - private readonly _dictionaryService: DictionaryService, private readonly _dialogService: AdminDialogService, private readonly _dossierTemplatesService: DossierTemplatesService, ) {} diff --git a/apps/red-ui/src/app/modules/archive/archive-routing.module.ts b/apps/red-ui/src/app/modules/archive/archive-routing.module.ts index 1eb531bf3..905d3924a 100644 --- a/apps/red-ui/src/app/modules/archive/archive-routing.module.ts +++ b/apps/red-ui/src/app/modules/archive/archive-routing.module.ts @@ -1,8 +1,7 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { BreadcrumbTypes, DOSSIER_ID } from '@red/domain'; +import { BreadcrumbTypes, DOSSIER_ID, FILE_ID } from '@red/domain'; import { ArchivedDossiersScreenComponent } from './screens/archived-dossiers-screen/archived-dossiers-screen.component'; -import { FILE_ID } from '@utils/constants'; import { CompositeRouteGuard } from '@iqser/common-ui'; import { ARCHIVED_DOSSIERS_SERVICE } from '../../tokens'; import { DossierFilesGuard } from '@guards/dossier-files-guard'; diff --git a/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts b/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts index 3fe2d2c26..307642038 100644 --- a/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts +++ b/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts @@ -1,11 +1,10 @@ import { ChangeDetectionStrategy, Component, forwardRef, Injector, OnInit } from '@angular/core'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DefaultListingServices, ListingComponent } from '@iqser/common-ui'; -import { Dossier } from '@red/domain'; +import { Dossier, DOSSIER_TEMPLATE_ID } from '@red/domain'; import { ConfigService } from '../../services/config.service'; import { tap } from 'rxjs/operators'; import { ArchivedDossiersService } from '@services/dossiers/archived-dossiers.service'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; import { Router } from '@angular/router'; @Component({ diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts index c8d84feeb..78d4443e0 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts @@ -1,6 +1,6 @@ import { Component, Inject, Injector, OnInit } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { DownloadFileType, IDossierRequest, IDossierTemplate, IReportTemplate } from '@red/domain'; +import { DOSSIER_TEMPLATE_ID, DownloadFileType, IDossierRequest, IDossierTemplate, IReportTemplate } from '@red/domain'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { downloadTypesTranslations } from '../../../../translations/download-types-translations'; import { BaseDialogComponent, IconButtonTypes, LoadingService, SaveOptions } from '@iqser/common-ui'; @@ -8,7 +8,6 @@ import { ActiveDossiersService } from '@services/dossiers/active-dossiers.servic import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { ReportTemplateService } from '@services/report-template.service'; import { firstValueFrom } from 'rxjs'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; import dayjs from 'dayjs'; import { Router } from '@angular/router'; import { DossiersDialogService } from '../../shared/services/dossiers-dialog.service'; diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts index 2f7bc49bb..00fefd5c1 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts @@ -94,10 +94,6 @@ export class AssignReviewerApproverDialogComponent { return user; } - isOwner(userId: string): boolean { - return userId === this.selectedUser; - } - async save() { this._loadingService.start(); try { diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts index e8c2e4592..407a1d3d6 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { Dossier, IDossierRequest, IDossierTemplate } from '@red/domain'; +import { Dossier, DOSSIER_TEMPLATE_ID, IDossierRequest, IDossierTemplate } from '@red/domain'; import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { DossiersDialogService } from '../../../shared/services/dossiers-dialog.service'; import { PermissionsService } from '@services/permissions.service'; @@ -12,7 +12,6 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { DossierStatsService } from '@services/dossiers/dossier-stats.service'; import { firstValueFrom } from 'rxjs'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; import { TranslateService } from '@ngx-translate/core'; import { DossiersService } from '@services/dossiers/dossiers.service'; import { TrashService } from '@services/entity-services/trash.service'; diff --git a/apps/red-ui/src/app/modules/dossier/dossiers-routing.module.ts b/apps/red-ui/src/app/modules/dossier/dossiers-routing.module.ts index bc1178c3f..18045c9ad 100644 --- a/apps/red-ui/src/app/modules/dossier/dossiers-routing.module.ts +++ b/apps/red-ui/src/app/modules/dossier/dossiers-routing.module.ts @@ -2,8 +2,7 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { DossierFilesGuard } from '@guards/dossier-files-guard'; import { CompositeRouteGuard } from '@iqser/common-ui'; -import { BreadcrumbTypes, DOSSIER_ID } from '@red/domain'; -import { FILE_ID } from '@utils/constants'; +import { BreadcrumbTypes, DOSSIER_ID, FILE_ID } from '@red/domain'; import { ACTIVE_DOSSIERS_SERVICE } from '../../tokens'; const routes: Routes = [ diff --git a/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts b/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts index b8f747e2f..f8620c3d1 100644 --- a/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts +++ b/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts @@ -1,11 +1,10 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { DashboardStats, DonutChartConfig } from '@red/domain'; +import { DashboardStats, DonutChartConfig, DOSSIER_TEMPLATE_ID } from '@red/domain'; import { Observable } from 'rxjs'; import { TranslateChartService } from '@services/translate-chart.service'; import { map } from 'rxjs/operators'; import { DashboardStatsService } from '@services/dossier-templates/dashboard-stats.service'; import { ActivatedRoute } from '@angular/router'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; @Component({ selector: 'redaction-dossiers-listing-details', @@ -23,7 +22,7 @@ export class DossiersListingDetailsComponent { dashboardStatsService: DashboardStatsService, private readonly _translateChartService: TranslateChartService, ) { - const dossierTemplateId: string = route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); + const dossierTemplateId = route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); this.stats$ = dashboardStatsService.getEntityChanged$(dossierTemplateId); this.dossiersChartConfig$ = this.stats$.pipe( diff --git a/apps/red-ui/src/app/modules/dossiers-listing/screen/dossiers-listing-screen.component.ts b/apps/red-ui/src/app/modules/dossiers-listing/screen/dossiers-listing-screen.component.ts index 895ac8c2a..8c218bb7a 100644 --- a/apps/red-ui/src/app/modules/dossiers-listing/screen/dossiers-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossiers-listing/screen/dossiers-listing-screen.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, forwardRef, Injector, OnInit, TemplateRef, ViewChild } from '@angular/core'; -import { Dossier } from '@red/domain'; +import { Dossier, DOSSIER_TEMPLATE_ID } from '@red/domain'; import { UserService } from '@services/user.service'; import { PermissionsService } from '@services/permissions.service'; import { ButtonConfig, DefaultListingServices, ListingComponent, OnAttach, TableComponent } from '@iqser/common-ui'; @@ -9,7 +9,6 @@ import { ActiveDossiersService } from '@services/dossiers/active-dossiers.servic import { tap } from 'rxjs/operators'; import { DossiersDialogService } from '../../dossier/shared/services/dossiers-dialog.service'; import { Router } from '@angular/router'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; import { UserPreferenceService } from '@services/user-preference.service'; @Component({ @@ -32,18 +31,18 @@ export class DossiersListingScreenComponent extends ListingComponent im @ViewChild(TableComponent) private readonly _tableComponent: TableComponent; constructor( + router: Router, protected readonly _injector: Injector, private readonly _userService: UserService, - readonly permissionsService: PermissionsService, - private readonly _activeDossiersService: ActiveDossiersService, private readonly _configService: ConfigService, + readonly permissionsService: PermissionsService, private readonly _dialogService: DossiersDialogService, - private readonly _router: Router, + private readonly _activeDossiersService: ActiveDossiersService, private readonly _userPreferenceService: UserPreferenceService, ) { super(_injector); - this.dossierTemplateId = this._router.routerState.snapshot.root.firstChild.firstChild.paramMap.get(DOSSIER_TEMPLATE_ID); - this._router.routeReuseStrategy.shouldReuseRoute = () => false; + this.dossierTemplateId = router.routerState.snapshot.root.firstChild.firstChild.paramMap.get(DOSSIER_TEMPLATE_ID); + router.routeReuseStrategy.shouldReuseRoute = () => false; this.buttonConfigs = this._configService.buttonsConfig(this.dossierTemplateId); } diff --git a/apps/red-ui/src/app/modules/file-preview/components/file-workload/file-workload.component.html b/apps/red-ui/src/app/modules/file-preview/components/file-workload/file-workload.component.html index 55cbdb3e3..2ba09b6b5 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/file-workload/file-workload.component.html +++ b/apps/red-ui/src/app/modules/file-preview/components/file-workload/file-workload.component.html @@ -17,7 +17,7 @@ (click)="multiSelectService.activate()" *ngIf="(multiSelectService.enabled$ | async) && (multiSelectInactive$ | async)" class="all-caps-label primary pointer" - iqserHelpMode="bulk_select_annotations" + iqserHelpMode="workload_in_editor" translate="file-preview.tabs.annotations.select" > @@ -25,7 +25,7 @@ [actionsTemplate]="annotationFilterActionTemplate" [primaryFiltersSlug]="'primaryFilters'" [secondaryFiltersSlug]="'secondaryFilters'" - iqserHelpMode="workload_filter" + iqserHelpMode="workload_in_editor" > diff --git a/apps/red-ui/src/app/modules/file-preview/components/view-switch/view-switch.component.html b/apps/red-ui/src/app/modules/file-preview/components/view-switch/view-switch.component.html index 330c24b2c..d581379e8 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/view-switch/view-switch.component.html +++ b/apps/red-ui/src/app/modules/file-preview/components/view-switch/view-switch.component.html @@ -4,7 +4,7 @@ [class.active]="viewModeService.isStandard" [matTooltip]="'file-preview.standard-tooltip' | translate" class="red-tab" - iqserHelpMode="view" + iqserHelpMode="views" > {{ 'file-preview.standard' | translate }} @@ -15,7 +15,7 @@ [disabled]="(canSwitchToDeltaView$ | async) === false" [matTooltip]="'file-preview.delta-tooltip' | translate" class="red-tab" - iqserHelpMode="view" + iqserHelpMode="views" > {{ 'file-preview.delta' | translate }} @@ -26,7 +26,7 @@ [disabled]="(canSwitchToRedactedView$ | async) === false" [matTooltip]="'file-preview.redacted-tooltip' | translate" class="red-tab" - iqserHelpMode="view" + iqserHelpMode="views" > {{ 'file-preview.redacted' | translate }} @@ -37,7 +37,7 @@ [disabled]="(canSwitchToHighlightsView$ | async) === false" [matTooltip]="'file-preview.text-highlights-tooltip' | translate" class="red-tab" - iqserHelpMode="view" + iqserHelpMode="views" > {{ 'file-preview.text-highlights' | translate }} diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts index c3b681167..9307aad26 100644 --- a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectorRef, Component, HostListener, NgZone, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core'; +import { ChangeDetectorRef, Component, HostListener, Injector, NgZone, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core'; import { ActivatedRoute, ActivatedRouteSnapshot, NavigationExtras, Router } from '@angular/router'; import { Core } from '@pdftron/webviewer'; import { @@ -39,7 +39,6 @@ import { MultiSelectService } from './services/multi-select.service'; import { DocumentInfoService } from './services/document-info.service'; import { ReanalysisService } from '@services/reanalysis.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { SkippedService } from './services/skipped.service'; import { FilePreviewStateService } from './services/file-preview-state.service'; import { filePreviewScreenProviders } from './file-preview-providers'; import { ManualRedactionService } from './services/manual-redaction.service'; @@ -49,22 +48,11 @@ import { ComponentCanDeactivate } from '@guards/can-deactivate.guard'; import { PdfViewer } from './services/pdf-viewer.service'; import { FilePreviewDialogService } from './services/file-preview-dialog.service'; import { FileDataService } from './services/file-data.service'; -import { ALL_HOTKEYS } from './shared/constants'; +import { ActionsHelpModeKeys, ALL_HOTKEYS } from './shared/constants'; import { NGXLogger } from 'ngx-logger'; import { StampService } from './services/stamp.service'; import Annotation = Core.Annotations.Annotation; -const HelpModeKeys = { - redaction: 'redaction_text', - 'manual-redaction': 'redaction_text', - recommendation: 'recommendation', - skipped: 'skipped', - hint: 'hint_text', - 'hint-ocr': 'hint_picture', - 'hint-formula': 'picture', - 'hint-image': 'image', -}; - @Component({ templateUrl: './file-preview-screen.component.html', styleUrls: ['./file-preview-screen.component.scss'], @@ -107,20 +95,17 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni private readonly _filterService: FilterService, private readonly _activatedRoute: ActivatedRoute, private readonly _loadingService: LoadingService, - private readonly _skippedService: SkippedService, private readonly _filesMapService: FilesMapService, private readonly _dossiersService: DossiersService, private readonly _fileDataService: FileDataService, private readonly _viewModeService: ViewModeService, private readonly _changeDetectorRef: ChangeDetectorRef, - private readonly _reanalysisService: ReanalysisService, private readonly _dialogService: FilePreviewDialogService, private readonly _pageRotationService: PageRotationService, private readonly _annotationDrawService: AnnotationDrawService, - private readonly _fileManagementService: FileManagementService, - private readonly _manualRedactionService: ManualRedactionService, private readonly _annotationProcessingService: AnnotationProcessingService, private readonly _stampService: StampService, + private readonly _injector: Injector, ) { super(); this.canPerformAnnotationActions$ = this._canPerformAnnotationActions$; @@ -197,7 +182,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this._loadingService.start(); this.pdf.hideAnnotations(annotations); const highlights = await this._fileDataService.loadTextHighlights(); - await this._annotationDrawService.drawAnnotations(highlights); + await this._annotationDrawService.draw(highlights); this._loadingService.stop(); } } @@ -240,7 +225,8 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this._subscribeToFileUpdates(); if (file?.analysisRequired && !file.excludedFromAutomaticAnalysis) { - const reanalyzeFiles = this._reanalysisService.reanalyzeFilesForDossier([file], this.dossierId, { force: true }); + const reanalysisService = this._injector.get(ReanalysisService); + const reanalyzeFiles = reanalysisService.reanalyzeFilesForDossier([file], this.dossierId, { force: true }); await firstValueFrom(reanalyzeFiles); } @@ -275,12 +261,14 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni if (selectedAnnotations.length > 0) { this.pdf.deleteAnnotations([selectedAnnotations[0].Id]); } - const add$ = this._manualRedactionService.addAnnotation( + const manualRedactionService = this._injector.get(ManualRedactionService); + const add$ = manualRedactionService.addAnnotation( wrappers.map(w => w.manualRedactionEntry).filter(e => e.positions[0].page <= file.numberOfPages), this.dossierId, this.fileId, ); - const addAndReload$ = add$.pipe(switchMap(() => this._filesService.reload(this.dossierId, file))); + const filesService = this._injector.get(FilesService); + const addAndReload$ = add$.pipe(switchMap(() => filesService.reload(this.dossierId, file))); return firstValueFrom(addAndReload$.pipe(catchError(() => of(undefined)))); }, ); @@ -382,14 +370,10 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this._scrollViews(); } - async downloadOriginalFile(file: File) { - const originalFile = this._fileManagementService.downloadOriginalFile( - this.dossierId, - this.fileId, - 'response', - file.cacheIdentifier, - ); - download(await firstValueFrom(originalFile), file.filename); + async downloadOriginalFile({ cacheIdentifier, dossierId, fileId, filename }: File) { + const fileManagementService = this._injector.get(FileManagementService); + const originalFile = fileManagementService.downloadOriginalFile(dossierId, fileId, 'response', cacheIdentifier); + download(await firstValueFrom(originalFile), filename); } loadAnnotations() { @@ -443,9 +427,9 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni const type = annotation?.typeLabel?.split('.')[1]; const typeValue = annotation?.typeValue; if (type === 'hint' && (typeValue === 'ocr' || typeValue === 'formula' || typeValue === 'image')) { - return HelpModeKeys[`${type}-${typeValue}`]; + return ActionsHelpModeKeys[`${type}-${typeValue}`]; } - return HelpModeKeys[type]; + return ActionsHelpModeKeys[type]; } #rebuildFilters() { @@ -492,19 +476,23 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni const changed = JSON.stringify(oldAnnotation) !== JSON.stringify(newAnnotation); if (changed && this.userPreferenceService.areDevFeaturesEnabled) { - import('@iqser/common-ui').then(commonUi => { - this._logger.info('[ANNOTATIONS] Changed annotation: ', { - value: oldAnnotation.value, - before: commonUi.deepDiffObj(newAnnotation, oldAnnotation), - after: commonUi.deepDiffObj(oldAnnotation, newAnnotation), - }); - }); + this.#logDiff(oldAnnotation, newAnnotation); } return changed; }); } + #logDiff(oldAnnotation: AnnotationWrapper, newAnnotation: AnnotationWrapper) { + import('@iqser/common-ui').then(commonUi => { + this._logger.info('[ANNOTATIONS] Changed annotation: ', { + value: oldAnnotation.value, + before: commonUi.deepDiffObj(newAnnotation, oldAnnotation), + after: commonUi.deepDiffObj(oldAnnotation, newAnnotation), + }); + }); + } + #deactivateMultiSelect() { this.multiSelectService.deactivate(); this.pdf.deselectAllAnnotations(); @@ -539,10 +527,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni .pipe(tap(() => this._handleDeletedFile())) .subscribe(); - this.addActiveScreenSubscription = this._skippedService.hideSkipped$ - .pipe(tap(hideSkipped => this._handleIgnoreAnnotationsDrawing(hideSkipped))) - .subscribe(); - this.addActiveScreenSubscription = combineLatest([this._viewModeService.viewMode$, this.state.file$]) .pipe( tap(([viewMode, file]) => { @@ -590,7 +574,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this._handleDeltaAnnotationFilters(currentFilters, this._fileDataService.all); } - await this._annotationDrawService.drawAnnotations(newAnnotations); + await this._annotationDrawService.draw(newAnnotations); this._logger.info(`[ANNOTATIONS] Redraw time: ${new Date().getTime() - startTime} ms for ${newAnnotations.length} annotations`); } @@ -620,15 +604,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni } } - private _handleIgnoreAnnotationsDrawing(hideSkipped: boolean): void { - const ignored = this.pdf.getAnnotations(a => a.getCustomData('skipped')); - if (hideSkipped) { - this.pdf.hideAnnotations(ignored); - } else { - this.pdf.showAnnotations(ignored); - } - } - private _setAnnotationsOpacity(annotations: Annotation[], restoreToOriginal: boolean = false) { annotations.forEach(annotation => { annotation['Opacity'] = restoreToOriginal ? parseFloat(annotation.getCustomData('opacity')) : 1; diff --git a/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts b/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts index 8a3ee9bc8..60d0a648b 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts @@ -437,7 +437,7 @@ export class AnnotationActionsService { annotationWrapper.resizing = false; this._pdf.deleteAnnotations([annotationWrapper.id]); - await this._annotationDrawService.drawAnnotations([annotationWrapper]); + await this._annotationDrawService.draw([annotationWrapper]); this._pdf.annotationManager.deselectAllAnnotations(); await this._fileDataService.annotationsChanged(); } diff --git a/apps/red-ui/src/app/modules/file-preview/services/annotation-draw.service.ts b/apps/red-ui/src/app/modules/file-preview/services/annotation-draw.service.ts index 5e6679f44..3cfb56abf 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/annotation-draw.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/annotation-draw.service.ts @@ -10,13 +10,13 @@ import { IRectangle, ISectionGrid, ISectionRectangle } from '@red/domain'; import { SkippedService } from './skipped.service'; import { firstValueFrom } from 'rxjs'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; -import { DossiersService } from '@services/dossiers/dossiers.service'; import { PdfViewer } from './pdf-viewer.service'; import { FilePreviewStateService } from './file-preview-state.service'; import { ViewModeService } from './view-mode.service'; import { FileDataService } from './file-data.service'; import { SuperTypes } from '@models/file/super-types'; import Annotation = Core.Annotations.Annotation; +import Quad = Core.Math.Quad; const DEFAULT_TEXT_ANNOTATION_OPACITY = 1; const DEFAULT_REMOVED_ANNOTATION_OPACITY = 0.2; @@ -25,7 +25,6 @@ const DEFAULT_REMOVED_ANNOTATION_OPACITY = 0.2; export class AnnotationDrawService { constructor( private readonly _dictionariesMapService: DictionariesMapService, - private readonly _dossiersService: DossiersService, private readonly _redactionLogService: RedactionLogService, private readonly _userPreferenceService: UserPreferenceService, private readonly _skippedService: SkippedService, @@ -35,9 +34,9 @@ export class AnnotationDrawService { private readonly _fileDataService: FileDataService, ) {} - drawAnnotations(annotationWrappers: readonly AnnotationWrapper[]) { + draw(annotations: readonly AnnotationWrapper[]) { const licenseKey = environment.licenseKey ? atob(environment.licenseKey) : null; - return this._pdf.PDFNet.runWithCleanup(() => this._drawAnnotations(annotationWrappers), licenseKey); + return this._pdf.PDFNet.runWithCleanup(() => this._draw(annotations), licenseKey); } getColor(superType: string, dictionary?: string) { @@ -85,7 +84,7 @@ export class AnnotationDrawService { return new this._pdf.instance.Core.Math.Quad(x1, y1, x2, y2, x3, y3, x4, y4); } - private async _drawAnnotations(annotationWrappers: readonly AnnotationWrapper[]) { + private async _draw(annotationWrappers: readonly AnnotationWrapper[]) { const annotations = annotationWrappers.map(annotation => this._computeAnnotation(annotation)).filter(a => !!a); this._pdf.annotationManager.addAnnotations(annotations, { imported: true }); await this._pdf.annotationManager.drawAnnotationsFromList(annotations); @@ -185,12 +184,12 @@ export class AnnotationDrawService { return annotation; } - private _rectanglesToQuads(positions: IRectangle[], pageNumber: number): any[] { + private _rectanglesToQuads(positions: IRectangle[], pageNumber: number): Quad[] { const pageHeight = this._pdf.documentViewer.getPageHeight(pageNumber); return positions.map(p => this._rectangleToQuad(p, pageHeight)); } - private _rectangleToQuad(rectangle: IRectangle, pageHeight: number): any { + private _rectangleToQuad(rectangle: IRectangle, pageHeight: number): Quad { const x1 = rectangle.topLeft.x; const y1 = pageHeight - (rectangle.topLeft.y + rectangle.height); diff --git a/apps/red-ui/src/app/modules/file-preview/services/file-preview-state.service.ts b/apps/red-ui/src/app/modules/file-preview/services/file-preview-state.service.ts index b3be2a8bd..ba8aec14d 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/file-preview-state.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/file-preview-state.service.ts @@ -1,13 +1,12 @@ import { Injectable, Injector } from '@angular/core'; import { combineLatest, firstValueFrom, from, merge, Observable, of, pairwise, Subject, switchMap } from 'rxjs'; -import { Dossier, DOSSIER_ID, File } from '@red/domain'; +import { Dossier, DOSSIER_ID, File, FILE_ID } from '@red/domain'; import { ActivatedRoute, Router } from '@angular/router'; import { FilesMapService } from '@services/entity-services/files-map.service'; import { PermissionsService } from '@services/permissions.service'; import { boolFactory } from '@iqser/common-ui'; import { filter, map, startWith, tap, withLatestFrom } from 'rxjs/operators'; import { FileManagementService } from '@services/entity-services/file-management.service'; -import { FILE_ID } from '@utils/constants'; import { dossiersServiceResolver } from '@services/entity-services/dossiers.service.provider'; import { wipeFilesCache } from '@red/cache'; import { DossiersService } from '@services/dossiers/dossiers.service'; diff --git a/apps/red-ui/src/app/modules/file-preview/services/skipped.service.ts b/apps/red-ui/src/app/modules/file-preview/services/skipped.service.ts index 9f1f6238f..a56db21ce 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/skipped.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/skipped.service.ts @@ -1,24 +1,38 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; -import { skip } from 'rxjs/operators'; +import { skip, tap } from 'rxjs/operators'; import { shareDistinctLast } from '@iqser/common-ui'; +import { PdfViewer } from './pdf-viewer.service'; @Injectable() export class SkippedService { readonly hideSkipped$: Observable; - private readonly _hideSkipped$ = new BehaviorSubject(false); + readonly #hideSkipped$ = new BehaviorSubject(false); - constructor() { - this.hideSkipped$ = this._hideSkipped$.pipe(shareDistinctLast(), skip(1)); + constructor(private readonly _pdf: PdfViewer) { + this.hideSkipped$ = this.#hideSkipped$.pipe( + tap(hideSkipped => this._handleIgnoreAnnotationsDrawing(hideSkipped)), + shareDistinctLast(), + skip(1), + ); } get hideSkipped(): boolean { - return this._hideSkipped$.value; + return this.#hideSkipped$.value; } toggleSkipped($event): void { $event.stopPropagation(); $event.preventDefault(); - this._hideSkipped$.next(!this.hideSkipped); + this.#hideSkipped$.next(!this.hideSkipped); + } + + private _handleIgnoreAnnotationsDrawing(hideSkipped: boolean): void { + const ignored = this._pdf.getAnnotations(a => a.getCustomData('skipped')); + if (hideSkipped) { + this._pdf.hideAnnotations(ignored); + } else { + this._pdf.showAnnotations(ignored); + } } } diff --git a/apps/red-ui/src/app/modules/file-preview/shared/constants.ts b/apps/red-ui/src/app/modules/file-preview/shared/constants.ts index 75e87885e..a61d3f581 100644 --- a/apps/red-ui/src/app/modules/file-preview/shared/constants.ts +++ b/apps/red-ui/src/app/modules/file-preview/shared/constants.ts @@ -1,6 +1,19 @@ -export const ALLOWED_KEYBOARD_SHORTCUTS: readonly string[] = ['+', '-', 'p', 'r', 'Escape'] as const; +import { List } from '@iqser/common-ui'; -export const ALL_HOTKEYS = ['Escape', 'F', 'f', 'ArrowUp', 'ArrowDown']; +export const ActionsHelpModeKeys = { + redaction: 'redaction_text', + 'manual-redaction': 'redaction_text', + recommendation: 'recommendation', + skipped: 'skipped', + hint: 'hint_text', + 'hint-ocr': 'hint_picture', + 'hint-formula': 'picture', + 'hint-image': 'picture', +} as const; + +export const ALLOWED_KEYBOARD_SHORTCUTS: List = ['+', '-', 'p', 'r', 'Escape'] as const; + +export const ALL_HOTKEYS: List = ['Escape', 'F', 'f', 'ArrowUp', 'ArrowDown'] as const; export type HeaderElementType = | 'SHAPE_TOOL_GROUP_BUTTON' diff --git a/apps/red-ui/src/app/services/breadcrumbs.service.ts b/apps/red-ui/src/app/services/breadcrumbs.service.ts index b570170f9..60d56a594 100644 --- a/apps/red-ui/src/app/services/breadcrumbs.service.ts +++ b/apps/red-ui/src/app/services/breadcrumbs.service.ts @@ -5,8 +5,7 @@ import { BehaviorSubject, Observable, of } from 'rxjs'; import { filter, pluck } from 'rxjs/operators'; import { FilesMapService } from '@services/entity-services/files-map.service'; import { TranslateService } from '@ngx-translate/core'; -import { BreadcrumbTypes, DOSSIER_ID, DOSSIERS_ARCHIVE } from '@red/domain'; -import { DOSSIER_TEMPLATE_ID, FILE_ID } from '@utils/constants'; +import { BreadcrumbTypes, DOSSIER_ID, DOSSIER_TEMPLATE_ID, DOSSIERS_ARCHIVE, FILE_ID } from '@red/domain'; import { DossiersService } from '@services/dossiers/dossiers.service'; import { dossiersServiceResolver } from '@services/entity-services/dossiers.service.provider'; import { FeaturesService } from '@services/features.service'; @@ -34,7 +33,7 @@ export type Breadcrumbs = List; }) export class BreadcrumbsService { readonly breadcrumbs$: Observable; - private readonly _store$ = new BehaviorSubject([]); + readonly #store$ = new BehaviorSubject([]); constructor( private readonly _injector: Injector, @@ -44,17 +43,17 @@ export class BreadcrumbsService { private readonly _dashboardStatsService: DashboardStatsService, private readonly _featuresService: FeaturesService, ) { - this.breadcrumbs$ = this._store$.asObservable(); + this.breadcrumbs$ = this.#store$.asObservable(); - this._router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(() => { - const root = this._router.routerState.snapshot.root; + _router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(() => { + const root = _router.routerState.snapshot.root; this._clear(); this._addBreadcrumbs(root); }); } get breadcrumbs() { - return this._store$.value; + return this.#store$.value; } private get _dossiersService(): DossiersService { @@ -73,11 +72,11 @@ export class BreadcrumbsService { } private _append(breadcrumb: Breadcrumb) { - this._store$.next([...this._store$.value, breadcrumb]); + this.#store$.next([...this.#store$.value, breadcrumb]); } private _clear() { - this._store$.next([]); + this.#store$.next([]); } private _addBreadcrumbs(route: ActivatedRouteSnapshot, params: Record = {}) { @@ -132,7 +131,7 @@ export class BreadcrumbsService { } private _dossierTemplateBreadcrumb(params: Record): Breadcrumb { - const dossierTemplateId: string = params[DOSSIER_TEMPLATE_ID]; + const dossierTemplateId = params[DOSSIER_TEMPLATE_ID]; return { name$: this._dashboardStatsService.getEntityChanged$(dossierTemplateId).pipe(pluck('name')), type: 'text' as BreadcrumbDisplayType, diff --git a/apps/red-ui/src/app/services/entity-services/dictionaries-map.service.ts b/apps/red-ui/src/app/services/entity-services/dictionaries-map.service.ts index f828d0326..248ee722d 100644 --- a/apps/red-ui/src/app/services/entity-services/dictionaries-map.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dictionaries-map.service.ts @@ -1,7 +1,6 @@ import { Injectable } from '@angular/core'; -import { Dictionary, IDictionary } from '@red/domain'; +import { Dictionary, DOSSIER_TEMPLATE_ID, IDictionary } from '@red/domain'; import { EntitiesMapService } from '@iqser/common-ui'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; @Injectable({ providedIn: 'root' }) export class DictionariesMapService extends EntitiesMapService { diff --git a/apps/red-ui/src/app/services/entity-services/dossier-states-map.service.ts b/apps/red-ui/src/app/services/entity-services/dossier-states-map.service.ts index dfdcd7287..1c6083cae 100644 --- a/apps/red-ui/src/app/services/entity-services/dossier-states-map.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dossier-states-map.service.ts @@ -1,7 +1,6 @@ import { Injectable } from '@angular/core'; -import { DonutChartConfig, DossierState, IDossierState } from '@red/domain'; +import { DonutChartConfig, DOSSIER_TEMPLATE_ID, DossierState, IDossierState } from '@red/domain'; import { EntitiesMapService } from '@iqser/common-ui'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; import { flatMap } from 'lodash-es'; @Injectable({ providedIn: 'root' }) diff --git a/apps/red-ui/src/app/services/entity-services/dossier-template-stats.service.ts b/apps/red-ui/src/app/services/entity-services/dossier-template-stats.service.ts index c368cf2db..b323ea579 100644 --- a/apps/red-ui/src/app/services/entity-services/dossier-template-stats.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dossier-template-stats.service.ts @@ -1,7 +1,6 @@ import { Injectable, Injector } from '@angular/core'; import { StatsService } from '@iqser/common-ui'; -import { DossierTemplateStats, IDossierTemplateStats } from '@red/domain'; -import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; +import { DOSSIER_TEMPLATE_ID, DossierTemplateStats, IDossierTemplateStats } from '@red/domain'; @Injectable({ providedIn: 'root', diff --git a/apps/red-ui/src/app/services/permissions.service.ts b/apps/red-ui/src/app/services/permissions.service.ts index ecd0da266..cde00d67a 100644 --- a/apps/red-ui/src/app/services/permissions.service.ts +++ b/apps/red-ui/src/app/services/permissions.service.ts @@ -12,19 +12,21 @@ export class PermissionsService { private readonly _featuresService: FeaturesService, ) {} - canEditEntities(user = this._userService.currentUser): boolean { - return user.isAdmin; + get #userId(): string { + return this._userService.currentUser.id; } - canDeleteEntities(entity: Dictionary | Dictionary[], user = this._userService.currentUser): boolean { + canEditEntities(): boolean { + return this.isAdmin(); + } + + canDeleteEntities(entity: Dictionary | Dictionary[]): boolean { const entities = entity instanceof Dictionary ? [entity] : entity; - return ( - entities.length && this.canEditEntities(user) && entities.reduce((acc, _entity) => this._canDeleteEntity(_entity) && acc, true) - ); + return entities.length && this.canEditEntities() && entities.reduce((acc, _entity) => this._canDeleteEntity(_entity) && acc, true); } - canPerformDossierStatesActions(user = this._userService.currentUser): boolean { - return user.isAdmin; + canPerformDossierStatesActions(): boolean { + return this.isAdmin(); } isReviewerOrApprover(file: File, dossier: Dossier): boolean { @@ -74,7 +76,7 @@ export class PermissionsService { } isFileAssignee(file: File): boolean { - return file.assignee === this._userService.currentUser.id; + return file.assignee === this.#userId; } canDeleteFile(file: File | File[], dossier: Dossier): boolean { @@ -130,16 +132,16 @@ export class PermissionsService { return files.reduce((acc, _file) => this._canSetUnderApproval(_file, dossier) && acc, true); } - isOwner(dossier: Dossier, user = this._userService.currentUser): boolean { - return dossier.ownerId === user.id; + isOwner(dossier: IDossier): boolean { + return dossier.ownerId === this.#userId; } - isApprover(dossier: Dossier, user = this._userService.currentUser): boolean { - return dossier.approverIds.indexOf(user.id) >= 0; + isApprover(dossier: Dossier): boolean { + return dossier.approverIds.indexOf(this.#userId) >= 0; } - isDossierMember(dossier: Dossier, user = this._userService.currentUser): boolean { - return dossier.memberIds.includes(user.id); + isDossierMember(dossier: Dossier): boolean { + return dossier.memberIds.includes(this.#userId); } canPerformAnnotationActions(file: File, dossier: Dossier): boolean { @@ -172,53 +174,51 @@ export class PermissionsService { } canDeleteDossier(dossier: IDossier): boolean { - return dossier.ownerId === this._userService.currentUser.id; + return this.isOwner(dossier); } canHardDeleteDossier(dossier: IDossier): boolean { - return this._userService.currentUser.isManager; + return this.isOwner(dossier); } canRestoreDossier(dossier: IDossier): boolean { - return this._userService.currentUser.isManager; + return this.isManager(); } canArchiveDossier(dossier: Dossier): boolean { - return ( - this._featuresService.isEnabled(DOSSIERS_ARCHIVE) && dossier.isActive && dossier.ownerId === this._userService.currentUser.id - ); + return this._featuresService.isEnabled(DOSSIERS_ARCHIVE) && dossier.isActive && this.isOwner(dossier); } - canEditDossier(dossier: Dossier, user = this._userService.currentUser): boolean { - return user.isManager && !!dossier?.ownerId; + canEditDossier(dossier: Dossier): boolean { + return this.isManager() && !!dossier?.ownerId; } - canEditDossierDictionary(dossier: Dossier, user = this._userService.currentUser): boolean { - return dossier.isActive && this.isDossierMember(dossier, user); + canEditDossierDictionary(dossier: Dossier): boolean { + return dossier.isActive && this.isDossierMember(dossier); } - canEditDossierDictionaryDisplayName(dossier: Dossier, user = this._userService.currentUser): boolean { - return dossier.isActive && this.isOwner(dossier, user); + canEditDossierDictionaryDisplayName(dossier: Dossier): boolean { + return dossier.isActive && this.isOwner(dossier); } - canEditDossierDictionaryAddAction(dossier: Dossier, user = this._userService.currentUser): boolean { - return dossier.isActive && this.isOwner(dossier, user); + canEditDossierDictionaryAddAction(dossier: Dossier): boolean { + return dossier.isActive && this.isOwner(dossier); } - canEditDossierAttributes(dossier: Dossier, user = this._userService.currentUser): boolean { - return dossier.isActive && this.isOwner(dossier, user); + canEditDossierAttributes(dossier: Dossier): boolean { + return dossier.isActive && this.isOwner(dossier); } canEditTeamMembers(): boolean { return this.isManager(); } - isAdmin(user = this._userService.currentUser): boolean { - return user.isAdmin; + isAdmin(): boolean { + return this._userService.currentUser.isAdmin; } - isManager(user = this._userService.currentUser): boolean { - return user.isManager; + isManager(): boolean { + return this._userService.currentUser.isManager; } canAddComment(file: File, dossier: Dossier): boolean { @@ -230,7 +230,7 @@ export class PermissionsService { } canDeleteComment(comment: IComment, file: File, dossier: Dossier) { - return (comment.user === this._userService.currentUser.id || this.isApprover(dossier)) && !file.isApproved; + return (comment.user === this.#userId || this.isApprover(dossier)) && !file.isApproved; } canImportRedactions(file: File, dossier: Dossier) { @@ -265,18 +265,11 @@ export class PermissionsService { } private _canEnableAutoAnalysis(file: File, dossier: Dossier): boolean { - return ( - dossier.isActive && file.excludedFromAutomaticAnalysis && file.assignee === this._userService.currentUser.id && !file.isApproved - ); + return dossier.isActive && file.excludedFromAutomaticAnalysis && this.isFileAssignee(file) && !file.isApproved; } private _canDisableAutoAnalysis(file: File, dossier: Dossier): boolean { - return ( - dossier.isActive && - !file.excludedFromAutomaticAnalysis && - file.assignee === this._userService.currentUser.id && - !file.isApproved - ); + return dossier.isActive && !file.excludedFromAutomaticAnalysis && this.isFileAssignee(file) && !file.isApproved; } private _canAssignToSelf(file: File, dossier: Dossier): boolean { diff --git a/apps/red-ui/src/app/utils/constants.ts b/apps/red-ui/src/app/utils/constants.ts index 49a1379a1..7f912541c 100644 --- a/apps/red-ui/src/app/utils/constants.ts +++ b/apps/red-ui/src/app/utils/constants.ts @@ -1,5 +1,2 @@ export const CHANGED_CHECK_INTERVAL = 5000; export const FALLBACK_COLOR = '#CCCCCC'; -export const FILE_ID = 'fileId'; -export const DOSSIER_TEMPLATE_ID = 'dossierTemplateId'; -export const ENTITY_TYPE = 'entity'; diff --git a/apps/red-ui/src/assets/config/config.json b/apps/red-ui/src/assets/config/config.json index 684210fa7..d8966dc0b 100644 --- a/apps/red-ui/src/assets/config/config.json +++ b/apps/red-ui/src/assets/config/config.json @@ -1,7 +1,7 @@ { "ADMIN_CONTACT_NAME": null, "ADMIN_CONTACT_URL": null, - "API_URL": "https://dev-08.iqser.cloud/redaction-gateway-v1", + "API_URL": "https://dev-05.iqser.cloud/redaction-gateway-v1", "APP_NAME": "RedactManager", "AUTO_READ_TIME": 3, "BACKEND_APP_VERSION": "4.4.40", @@ -17,7 +17,7 @@ "MAX_RETRIES_ON_SERVER_ERROR": 3, "OAUTH_CLIENT_ID": "redaction", "OAUTH_IDP_HINT": null, - "OAUTH_URL": "https://dev-08.iqser.cloud/auth/realms/redaction", + "OAUTH_URL": "https://dev-05.iqser.cloud/auth/realms/redaction", "RECENT_PERIOD_IN_HOURS": 24, "SELECTION_MODE": "structural", "MANUAL_BASE_URL": "https://docs.redactmanager.com/preview" diff --git a/apps/red-ui/src/assets/help-mode/links.json b/apps/red-ui/src/assets/help-mode/links.json index b77c4b8c3..0f6d5a053 100644 --- a/apps/red-ui/src/assets/help-mode/links.json +++ b/apps/red-ui/src/assets/help-mode/links.json @@ -1,10 +1,4 @@ { - "bulk_select_annotations": { - "en": "/en/index-en.html?contextId=bulk_select_annotations", - "de": "", - "it": "", - "fr": "" - }, "document_features_in_dossier": { "en": "/en/index-en.html?contextId=document_features_in_dossier", "de": "", @@ -71,8 +65,8 @@ "it": "", "fr": "" }, - "view": { - "en": "/en/index-en.html?contextId=view", + "views": { + "en": "/en/index-en.html?contextId=views", "de": "", "it": "", "fr": "" @@ -89,12 +83,6 @@ "it": "", "fr": "" }, - "workload_filter": { - "en": "/en/index-en.html?contextId=workload_filter", - "de": "", - "it": "", - "fr": "" - }, "dossiers_quickfilter_my_dossiers": { "en": "/en/index-en.html?contextId=dossiers_quickfilter_my_dossiers", "de": "", @@ -263,8 +251,8 @@ "it": "", "fr": "" }, - "image": { - "en": "/en/index-en.html?contextId=image", + "workload_in_editor": { + "en": "/en/index-en.html?contextId=workload_in_editor", "de": "", "it": "", "fr": "" diff --git a/libs/red-domain/src/lib/dossier-templates/types.ts b/libs/red-domain/src/lib/dossier-templates/constants.ts similarity index 68% rename from libs/red-domain/src/lib/dossier-templates/types.ts rename to libs/red-domain/src/lib/dossier-templates/constants.ts index 02c37c06f..aa890151f 100644 --- a/libs/red-domain/src/lib/dossier-templates/types.ts +++ b/libs/red-domain/src/lib/dossier-templates/constants.ts @@ -5,3 +5,6 @@ export const DossierTemplateStatuses = { } as const; export type DossierTemplateStatus = keyof typeof DossierTemplateStatuses; + +export const DOSSIER_TEMPLATE_ID = 'dossierTemplateId'; +export const ENTITY_TYPE = 'entity'; diff --git a/libs/red-domain/src/lib/dossier-templates/dossier-template.model.ts b/libs/red-domain/src/lib/dossier-templates/dossier-template.model.ts index 82f5cc5d3..1fc314d9b 100644 --- a/libs/red-domain/src/lib/dossier-templates/dossier-template.model.ts +++ b/libs/red-domain/src/lib/dossier-templates/dossier-template.model.ts @@ -1,7 +1,7 @@ import { IListable, List } from '@iqser/common-ui'; import { IDossierTemplate } from './dossier-template'; import { DownloadFileType } from '../shared'; -import { DossierTemplateStatus, DossierTemplateStatuses } from './types'; +import { DossierTemplateStatus, DossierTemplateStatuses } from './constants'; export class DossierTemplate implements IDossierTemplate, IListable { readonly createdBy: string; diff --git a/libs/red-domain/src/lib/dossier-templates/dossier-template.ts b/libs/red-domain/src/lib/dossier-templates/dossier-template.ts index f05c44084..054a7ab30 100644 --- a/libs/red-domain/src/lib/dossier-templates/dossier-template.ts +++ b/libs/red-domain/src/lib/dossier-templates/dossier-template.ts @@ -1,6 +1,6 @@ import { List } from '@iqser/common-ui'; import { DownloadFileType } from '../shared'; -import { DossierTemplateStatus } from './types'; +import { DossierTemplateStatus } from './constants'; export interface IDossierTemplate { /** diff --git a/libs/red-domain/src/lib/dossier-templates/index.ts b/libs/red-domain/src/lib/dossier-templates/index.ts index 8af5fc988..62ffeeea4 100644 --- a/libs/red-domain/src/lib/dossier-templates/index.ts +++ b/libs/red-domain/src/lib/dossier-templates/index.ts @@ -4,4 +4,4 @@ export * from './dossier-template-stats'; export * from './dossier-template-stats.model'; export * from './dashboard-stats'; export * from './dashboard-stats.model'; -export * from './types'; +export * from './constants'; diff --git a/libs/red-domain/src/lib/files/types.ts b/libs/red-domain/src/lib/files/types.ts index b5d702ffe..cde71691a 100644 --- a/libs/red-domain/src/lib/files/types.ts +++ b/libs/red-domain/src/lib/files/types.ts @@ -1,5 +1,7 @@ import { List } from '@iqser/common-ui'; +export const FILE_ID = 'fileId'; + export const WorkflowFileStatuses = { APPROVED: 'APPROVED', NEW: 'NEW', diff --git a/package.json b/package.json index a27b30f54..7a3f0422a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.468.0", + "version": "3.472.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 88c551af1..5da5dca36 100644 Binary files a/paligo-theme.tar.gz and b/paligo-theme.tar.gz differ