From 30dbee52d26f23997ce575a80948236142b28187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Wed, 4 May 2022 19:03:39 +0300 Subject: [PATCH] RED-3796: Use dossier template stats endpoint --- .../src/app/guards/dashboard-guard.service.ts | 14 +++ .../guards/dossier-template-exists.guard.ts | 2 +- .../src/app/guards/dossier-templates.guard.ts | 8 +- .../app/guards/entity-exists-guard.service.ts | 2 +- .../base-entity-screen.component.ts | 2 +- .../dossier-template-breadcrumbs.component.ts | 2 +- ...add-edit-dossier-state-dialog.component.ts | 4 +- ...-edit-dossier-template-dialog.component.ts | 2 +- ...clone-dossier-template-dialog.component.ts | 2 +- ...m-delete-dossier-state-dialog.component.ts | 4 +- ...ributes-configurations-dialog.component.ts | 2 +- .../default-colors-screen.component.ts | 2 +- ...sier-templates-listing-screen.component.ts | 2 +- ...ile-attributes-listing-screen.component.ts | 2 +- .../dossier-template-info-screen.component.ts | 2 +- ...add-edit-justification-dialog.component.ts | 2 +- .../justifications-dialog.service.ts | 2 +- .../reports-screen.component.ts | 2 +- .../screens/trash/trash-screen.component.ts | 2 +- .../dossier-template-actions.component.ts | 3 +- .../archive/services/config.service.ts | 2 +- .../template-stats.component.html | 35 ++++++-- .../template-stats.component.scss | 17 ++-- .../template-stats.component.ts | 45 +++------- .../dashboard-screen.component.html | 5 +- .../dashboard-screen.component.ts | 5 +- .../app/modules/dashboard/dashboard.module.ts | 5 +- .../dossier-details-stats.component.ts | 4 +- .../dossier-details.component.ts | 4 +- .../dossier-overview/config.service.ts | 2 +- .../dossier-overview-screen.component.ts | 2 +- .../services/bulk-actions.service.ts | 2 +- .../add-dossier-dialog.component.ts | 4 +- .../edit-dossier-general-info.component.ts | 4 +- .../file-actions/file-actions.component.ts | 3 +- .../services/dossiers-dialog.service.ts | 8 +- .../shared/services/file-assign.service.ts | 2 +- .../dossier/shared/shared-dossiers.module.ts | 2 +- .../dossiers-listing-actions.component.ts | 2 +- .../dossiers-listing-details.component.html | 20 ++--- .../dossiers-listing-details.component.ts | 70 +++------------ .../dossiers-listing/config.service.ts | 2 +- .../dossiers-listing-screen.component.ts | 7 +- .../document-info/document-info.component.ts | 2 +- .../services/document-info.service.ts | 2 +- .../dictionary-manager.component.ts | 2 +- .../dossier-name-column.component.ts | 2 +- .../simple-doughnut-chart.component.scss | 1 + .../simple-doughnut-chart.component.ts | 19 ++-- .../team-members/team-members.component.ts | 2 +- .../src/app/services/breadcrumbs.service.ts | 2 +- .../dashboard-stats.service.ts | 29 ++++++ .../dossier-templates.service.ts | 6 +- .../dossiers/active-dossiers.service.ts | 9 -- .../app/services/dossiers/dossiers.service.ts | 36 ++------ .../entity-services/dossier-states.service.ts | 2 +- .../services/entity-services/trash.service.ts | 5 -- .../app/services/translate-chart.service.ts | 21 ++++- apps/red-ui/src/assets/i18n/de.json | 8 +- apps/red-ui/src/assets/i18n/en.json | 8 +- libs/common-ui | 2 +- .../dashboard-stats.model.ts | 89 +++++++++++++++++++ .../lib/dossier-templates/dashboard-stats.ts | 33 +++++++ .../src/lib/dossier-templates/index.ts | 2 + 64 files changed, 348 insertions(+), 249 deletions(-) create mode 100644 apps/red-ui/src/app/guards/dashboard-guard.service.ts rename apps/red-ui/src/app/modules/dossier/{ => shared}/services/dossiers-dialog.service.ts (71%) create mode 100644 apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts rename apps/red-ui/src/app/services/{entity-services => dossier-templates}/dossier-templates.service.ts (93%) create mode 100644 libs/red-domain/src/lib/dossier-templates/dashboard-stats.model.ts create mode 100644 libs/red-domain/src/lib/dossier-templates/dashboard-stats.ts diff --git a/apps/red-ui/src/app/guards/dashboard-guard.service.ts b/apps/red-ui/src/app/guards/dashboard-guard.service.ts new file mode 100644 index 000000000..a9eec07ae --- /dev/null +++ b/apps/red-ui/src/app/guards/dashboard-guard.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate } from '@angular/router'; +import { firstValueFrom } from 'rxjs'; +import { DashboardStatsService } from '@services/dossier-templates/dashboard-stats.service'; + +@Injectable({ providedIn: 'root' }) +export class DashboardGuard implements CanActivate { + constructor(private readonly _dashboardStatsService: DashboardStatsService) {} + + async canActivate(route: ActivatedRouteSnapshot): Promise { + await firstValueFrom(this._dashboardStatsService.loadAll()); + return true; + } +} 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 655a56dfe..a50d2c8a2 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 { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; @Injectable({ providedIn: 'root' }) diff --git a/apps/red-ui/src/app/guards/dossier-templates.guard.ts b/apps/red-ui/src/app/guards/dossier-templates.guard.ts index 9a163ee8f..7495d23ff 100644 --- a/apps/red-ui/src/app/guards/dossier-templates.guard.ts +++ b/apps/red-ui/src/app/guards/dossier-templates.guard.ts @@ -1,15 +1,11 @@ import { Injectable } from '@angular/core'; import { CanActivate } from '@angular/router'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { firstValueFrom } from 'rxjs'; -import { DictionaryService } from '@services/entity-services/dictionary.service'; @Injectable({ providedIn: 'root' }) export class DossierTemplatesGuard implements CanActivate { - constructor( - private readonly _dossierTemplatesService: DossierTemplatesService, - private readonly _dictionaryService: DictionaryService, - ) {} + constructor(private readonly _dossierTemplatesService: DossierTemplatesService) {} async canActivate(): Promise { await firstValueFrom(this._dossierTemplatesService.loadAll()); 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 f363829ff..012583808 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 @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate, Router } from '@angular/router'; import { DOSSIER_TEMPLATE_ID, ENTITY_TYPE } from '@utils/constants'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; @Injectable({ providedIn: 'root' }) export class EntityExistsGuard implements CanActivate { 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 3551ba542..e76e6980e 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 @@ -6,7 +6,7 @@ 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/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; import { map } from 'rxjs/operators'; import { PermissionsService } from '@services/permissions.service'; 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 da0e9ac58..b5108a29e 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 @@ -1,5 +1,5 @@ import { Component, Input } from '@angular/core'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { Observable, of } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; import { ActivatedRoute } from '@angular/router'; diff --git a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-state-dialog/add-edit-dossier-state-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-state-dialog/add-edit-dossier-state-dialog.component.ts index f9ad50bd4..c3c8dab56 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-state-dialog/add-edit-dossier-state-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-state-dialog/add-edit-dossier-state-dialog.component.ts @@ -23,7 +23,7 @@ export class AddEditDossierStateDialogComponent extends BaseDialogComponent { private readonly _formBuilder: FormBuilder, private readonly _loadingService: LoadingService, private readonly _toaster: Toaster, - private readonly _dossierStateService: DossierStatesService, + private readonly _dossierStatesService: DossierStatesService, protected readonly _injector: Injector, protected readonly _dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) readonly data: DialogData, @@ -45,7 +45,7 @@ export class AddEditDossierStateDialogComponent extends BaseDialogComponent { }; this._loadingService.start(); try { - await firstValueFrom(this._dossierStateService.createOrUpdate(dossierState)); + await firstValueFrom(this._dossierStatesService.createOrUpdate(dossierState)); this._toaster.success(_('add-edit-dossier-state.success'), { params: { type: this.type } }); this._dialogRef.close(); } catch (e) {} diff --git a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-template-dialog/add-edit-dossier-template-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-template-dialog/add-edit-dossier-template-dialog.component.ts index 8a5534542..e98272044 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-template-dialog/add-edit-dossier-template-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dossier-template-dialog/add-edit-dossier-template-dialog.component.ts @@ -3,7 +3,7 @@ import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/fo import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { applyIntervalConstraints } from '@utils/date-inputs-utils'; import { downloadTypesTranslations } from '../../../../translations/download-types-translations'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { BaseDialogComponent, LoadingService, Toaster } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DossierTemplate, DownloadFileType, IDossierTemplate } from '@red/domain'; diff --git a/apps/red-ui/src/app/modules/admin/dialogs/clone-dossier-template-dialog/clone-dossier-template-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/clone-dossier-template-dialog/clone-dossier-template-dialog.component.ts index 3ae953481..c26e9b629 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/clone-dossier-template-dialog/clone-dossier-template-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/clone-dossier-template-dialog/clone-dossier-template-dialog.component.ts @@ -1,6 +1,6 @@ import { Component, Inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { DossierTemplate } from '@red/domain'; import { LoadingService, Toaster } from '@iqser/common-ui'; import { firstValueFrom } from 'rxjs'; diff --git a/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-dossier-state-dialog/confirm-delete-dossier-state-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-dossier-state-dialog/confirm-delete-dossier-state-dialog.component.ts index 910b6e977..5d32ec0c7 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-dossier-state-dialog/confirm-delete-dossier-state-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-dossier-state-dialog/confirm-delete-dossier-state-dialog.component.ts @@ -29,7 +29,7 @@ export class ConfirmDeleteDossierStateDialogComponent { private readonly _formBuilder: FormBuilder, private readonly _loadingService: LoadingService, private readonly _toaster: Toaster, - private readonly _dossierStateService: DossierStatesService, + private readonly _dossierStatesService: DossierStatesService, private readonly _dialogRef: MatDialogRef, private readonly _activeDossiersService: ActiveDossiersService, private readonly _archivedDossiersService: ArchivedDossiersService, @@ -55,7 +55,7 @@ export class ConfirmDeleteDossierStateDialogComponent { async save(): Promise { this._loadingService.start(); - await firstValueFrom(this._dossierStateService.deleteState(this.data.toBeDeletedState, this.replaceDossierStatusId)); + await firstValueFrom(this._dossierStatesService.deleteState(this.data.toBeDeletedState, this.replaceDossierStatusId)); await firstValueFrom( forkJoin([this._activeDossiersService.loadAll().pipe(take(1)), this._archivedDossiersService.loadAll().pipe(take(1))]), ); diff --git a/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.ts index 6c20af995..45334ed9c 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.ts @@ -4,7 +4,7 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { FileAttributeEncodingTypes, IFileAttributesConfig } from '@red/domain'; import { fileAttributeEncodingTypesTranslations } from '../../translations/file-attribute-encoding-types-translations'; import { BaseDialogComponent, Toaster } from '@iqser/common-ui'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { firstValueFrom } from 'rxjs'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { FileAttributesService } from '@services/entity-services/file-attributes.service'; 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 d93f3e956..97643322c 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 @@ -13,7 +13,7 @@ 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/entity-services/dossier-templates.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'; 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 896cd6ed9..1059bbc20 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 @@ -15,7 +15,7 @@ import { import { UserService } from '@services/user.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { RouterHistoryService } from '@services/router-history.service'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { firstValueFrom } from 'rxjs'; @Component({ 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 a06e24ba3..36f8ee278 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 @@ -28,7 +28,7 @@ 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/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { DOSSIER_TEMPLATE_ID } from '@utils/constants'; @Component({ 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 e1cfc90a0..c953e8a70 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 @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { ActivatedRoute } from '@angular/router'; import { Observable } from 'rxjs'; import { DossierTemplate, DossierTemplateStats } from '@red/domain'; diff --git a/apps/red-ui/src/app/modules/admin/screens/justifications/add-edit-justification-dialog/add-edit-justification-dialog.component.ts b/apps/red-ui/src/app/modules/admin/screens/justifications/add-edit-justification-dialog/add-edit-justification-dialog.component.ts index 5a53c1d98..4d61f4f73 100644 --- a/apps/red-ui/src/app/modules/admin/screens/justifications/add-edit-justification-dialog/add-edit-justification-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/justifications/add-edit-justification-dialog/add-edit-justification-dialog.component.ts @@ -3,7 +3,7 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { Justification } from '@red/domain'; import { JustificationsService } from '@services/entity-services/justifications.service'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { BaseDialogComponent, LoadingService } from '@iqser/common-ui'; import { firstValueFrom } from 'rxjs'; diff --git a/apps/red-ui/src/app/modules/admin/screens/justifications/justifications-dialog.service.ts b/apps/red-ui/src/app/modules/admin/screens/justifications/justifications-dialog.service.ts index 6fcf1f246..668de1d80 100644 --- a/apps/red-ui/src/app/modules/admin/screens/justifications/justifications-dialog.service.ts +++ b/apps/red-ui/src/app/modules/admin/screens/justifications/justifications-dialog.service.ts @@ -10,7 +10,7 @@ import { } from '@iqser/common-ui'; import { AddEditJustificationDialogComponent } from './add-edit-justification-dialog/add-edit-justification-dialog.component'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { JustificationsService } from '@services/entity-services/justifications.service'; import { Justification } from '@red/domain'; import { firstValueFrom } from 'rxjs'; 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 04ddca911..1742a103a 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 @@ -10,7 +10,7 @@ import { import { removeBraces } from '@utils/functions'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { AdminDialogService } from '../../../services/admin-dialog.service'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { ReportTemplateService } from '@services/report-template.service'; import { BehaviorSubject, firstValueFrom } from 'rxjs'; import { ActivatedRoute } from '@angular/router'; diff --git a/apps/red-ui/src/app/modules/admin/screens/trash/trash-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/trash/trash-screen.component.ts index 335e5c128..8f77182f1 100644 --- a/apps/red-ui/src/app/modules/admin/screens/trash/trash-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/trash/trash-screen.component.ts @@ -18,7 +18,7 @@ import { TrashItem } from '@red/domain'; import { TrashService } from '@services/entity-services/trash.service'; import { FilesService } from '@services/entity-services/files.service'; import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; @Component({ templateUrl: './trash-screen.component.html', 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 f43070a56..172e66f72 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 @@ -3,7 +3,7 @@ import { ActivatedRoute, Router } from '@angular/router'; import { AdminDialogService } from '../../../services/admin-dialog.service'; import { CircleButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; import { UserService } from '@services/user.service'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.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'; @@ -37,6 +37,7 @@ export class DossierTemplateActionsComponent implements OnInit { openEditDossierTemplateDialog($event: MouseEvent) { this._dialogService.openDialog('addEditDossierTemplate', $event, this.dossierTemplateId); } + openCloneDossierTemplateDialog($event: MouseEvent) { this._dialogService.openDialog('cloneDossierTemplate', $event, this.dossierTemplateId); } diff --git a/apps/red-ui/src/app/modules/archive/services/config.service.ts b/apps/red-ui/src/app/modules/archive/services/config.service.ts index 227fecad7..29ebf051e 100644 --- a/apps/red-ui/src/app/modules/archive/services/config.service.ts +++ b/apps/red-ui/src/app/modules/archive/services/config.service.ts @@ -5,7 +5,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { dossierMemberChecker, dossierTemplateChecker } from '@utils/index'; import { UserService } from '@services/user.service'; import { TranslateService } from '@ngx-translate/core'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; @Injectable() export class ConfigService { diff --git a/apps/red-ui/src/app/modules/dashboard/components/template-stats/template-stats.component.html b/apps/red-ui/src/app/modules/dashboard/components/template-stats/template-stats.component.html index 1eb4e5072..efc0d7ac0 100644 --- a/apps/red-ui/src/app/modules/dashboard/components/template-stats/template-stats.component.html +++ b/apps/red-ui/src/app/modules/dashboard/components/template-stats/template-stats.component.html @@ -1,13 +1,32 @@ -
- - {{ dossierTemplate.name }} -
- +
+ +
+ {{ dossierTemplate.name }} + {{ dossierTemplate.id }} +
+
+ +
+
+
-
stats2
-
+
{{ dossierTemplate.name }} @@ -22,5 +41,5 @@ [type]="iconButtonTypes.primary" icon="iqser:plus" > -
+
diff --git a/apps/red-ui/src/app/modules/dashboard/components/template-stats/template-stats.component.scss b/apps/red-ui/src/app/modules/dashboard/components/template-stats/template-stats.component.scss index 7f20e26b4..18acdf1c2 100644 --- a/apps/red-ui/src/app/modules/dashboard/components/template-stats/template-stats.component.scss +++ b/apps/red-ui/src/app/modules/dashboard/components/template-stats/template-stats.component.scss @@ -1,6 +1,7 @@ .dialog { flex-direction: row; max-width: unset; + min-height: unset; margin: 0 0 16px 0; .heading { @@ -11,22 +12,20 @@ } } - > div { + &.empty { + justify-content: space-between; + align-items: center; + padding: 24px; + } + + &:not(.empty) > div { padding: 24px; display: flex; flex-direction: column; - flex: 1; &:not(:first-child) { - align-items: center; justify-content: center; border-left: 1px solid var(--iqser-separator); } - - &.empty { - flex-direction: row; - justify-content: space-between; - align-items: center; - } } } diff --git a/apps/red-ui/src/app/modules/dashboard/components/template-stats/template-stats.component.ts b/apps/red-ui/src/app/modules/dashboard/components/template-stats/template-stats.component.ts index bf1042717..c8181b4e4 100644 --- a/apps/red-ui/src/app/modules/dashboard/components/template-stats/template-stats.component.ts +++ b/apps/red-ui/src/app/modules/dashboard/components/template-stats/template-stats.component.ts @@ -1,49 +1,28 @@ -import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; -import { DossierTemplate, DossierTemplateStats } from '@red/domain'; -import { BehaviorSubject, Observable } from 'rxjs'; -import { switchMap } from 'rxjs/operators'; -import { DossierTemplateStatsService } from '@services/entity-services/dossier-template-stats.service'; +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { DashboardStats } from '@red/domain'; import { IconButtonTypes } from '@iqser/common-ui'; -import { DossiersDialogService } from '../../../dossier/services/dossiers-dialog.service'; -import { Router } from '@angular/router'; +import { DossiersDialogService } from '../../../dossier/shared/services/dossiers-dialog.service'; +import { TranslateService } from '@ngx-translate/core'; +import { TranslateChartService } from '@services/translate-chart.service'; @Component({ - selector: 'redaction-template-stats [dossierTemplateId]', + selector: 'redaction-template-stats [stats]', templateUrl: './template-stats.component.html', styleUrls: ['./template-stats.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class TemplateStatsComponent implements OnChanges { +export class TemplateStatsComponent { readonly iconButtonTypes = IconButtonTypes; - @Input() dossierTemplateId: string; - - readonly dossierTemplate$: Observable; - readonly stats$: Observable; - readonly #ngOnChanges$ = new BehaviorSubject(undefined); + @Input() stats: DashboardStats; constructor( - private readonly _dossierTemplatesService: DossierTemplatesService, - private readonly _dossierTemplateStatsService: DossierTemplateStatsService, private readonly _dialogService: DossiersDialogService, - private readonly _router: Router, - ) { - this.dossierTemplate$ = this.#ngOnChanges$.pipe(switchMap(id => this._dossierTemplatesService.getEntityChanged$(id))); - this.stats$ = this.#ngOnChanges$.pipe(switchMap(id => this._dossierTemplateStatsService.watch$(id))); - } - - get empty(): boolean { - return false; - } - - ngOnChanges() { - if (this.dossierTemplateId) { - this.#ngOnChanges$.next(this.dossierTemplateId); - } - } + private readonly _translateService: TranslateService, + readonly translateChartService: TranslateChartService, + ) {} newDossier(): void { - this._dialogService.openDialog('addDossier', null, { dossierTemplateId: this.dossierTemplateId }); + this._dialogService.openDialog('addDossier', null, { dossierTemplateId: this.stats.dossierTemplateId }); } } diff --git a/apps/red-ui/src/app/modules/dashboard/dashboard-screen/dashboard-screen.component.html b/apps/red-ui/src/app/modules/dashboard/dashboard-screen/dashboard-screen.component.html index abd8f5ad8..b87902860 100644 --- a/apps/red-ui/src/app/modules/dashboard/dashboard-screen/dashboard-screen.component.html +++ b/apps/red-ui/src/app/modules/dashboard/dashboard-screen/dashboard-screen.component.html @@ -9,8 +9,5 @@
- +
diff --git a/apps/red-ui/src/app/modules/dashboard/dashboard-screen/dashboard-screen.component.ts b/apps/red-ui/src/app/modules/dashboard/dashboard-screen/dashboard-screen.component.ts index 09bac094f..e413f5d90 100644 --- a/apps/red-ui/src/app/modules/dashboard/dashboard-screen/dashboard-screen.component.ts +++ b/apps/red-ui/src/app/modules/dashboard/dashboard-screen/dashboard-screen.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { UserService } from '../../../services/user.service'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DashboardStatsService } from '@services/dossier-templates/dashboard-stats.service'; @Component({ selector: 'redaction-dashboard-screen', @@ -10,6 +10,7 @@ import { DossierTemplatesService } from '@services/entity-services/dossier-templ }) export class DashboardScreenComponent { readonly currentUser = this._userService.currentUser; + readonly stats$ = this._dashboardStatsService.all$; - constructor(private readonly _userService: UserService, readonly dossierTemplatesService: DossierTemplatesService) {} + constructor(private readonly _userService: UserService, private readonly _dashboardStatsService: DashboardStatsService) {} } diff --git a/apps/red-ui/src/app/modules/dashboard/dashboard.module.ts b/apps/red-ui/src/app/modules/dashboard/dashboard.module.ts index 00d7d285c..3fcc0de17 100644 --- a/apps/red-ui/src/app/modules/dashboard/dashboard.module.ts +++ b/apps/red-ui/src/app/modules/dashboard/dashboard.module.ts @@ -4,10 +4,11 @@ import { DashboardScreenComponent } from './dashboard-screen/dashboard-screen.co import { RouterModule } from '@angular/router'; import { SharedModule } from '../shared/shared.module'; import { TemplateStatsComponent } from './components/template-stats/template-stats.component'; -import { DossierTemplatesGuard } from '../../guards/dossier-templates.guard'; import { CompositeRouteGuard } from '@iqser/common-ui'; import { SharedDossiersModule } from '../dossier/shared/shared-dossiers.module'; import { BreadcrumbTypes } from '@red/domain'; +import { DossierTemplatesGuard } from '../../guards/dossier-templates.guard'; +import { DashboardGuard } from '../../guards/dashboard-guard.service'; const routes = [ { @@ -15,8 +16,8 @@ const routes = [ component: DashboardScreenComponent, canActivate: [CompositeRouteGuard], data: { - routeGuards: [DossierTemplatesGuard], breadcrumbs: [BreadcrumbTypes.dashboard], + routeGuards: [DossierTemplatesGuard, DashboardGuard], }, }, ]; diff --git a/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.ts b/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.ts index eb0f1d0ce..7418a07bb 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.ts +++ b/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.ts @@ -1,10 +1,10 @@ import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; import { Dossier, DossierAttributeWithValue, DossierStats } from '@red/domain'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { FilesService } from '@services/entity-services/files.service'; import { firstValueFrom, Observable } from 'rxjs'; import { DossierStatsService } from '@services/dossiers/dossier-stats.service'; -import { DossiersDialogService } from '../../../dossier/services/dossiers-dialog.service'; +import { DossiersDialogService } from '../../../dossier/shared/services/dossiers-dialog.service'; @Component({ selector: 'redaction-dossier-details-stats', diff --git a/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details/dossier-details.component.ts b/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details/dossier-details.component.ts index b7cd35d50..9214c1424 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details/dossier-details.component.ts +++ b/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details/dossier-details.component.ts @@ -10,7 +10,7 @@ import { ActivatedRoute } from '@angular/router'; import { firstValueFrom, Observable } from 'rxjs'; import { DossierStatsService } from '@services/dossiers/dossier-stats.service'; import { map, pluck, switchMap } from 'rxjs/operators'; -import { DossiersDialogService } from '../../../dossier/services/dossiers-dialog.service'; +import { DossiersDialogService } from '../../../dossier/shared/services/dossiers-dialog.service'; import { FilesService } from '@services/entity-services/files.service'; import { DOSSIER_ID } from '@utils/constants'; import { DossiersService } from '@services/dossiers/dossiers.service'; @@ -80,7 +80,7 @@ export class DossierDetailsComponent { key: status, })); documentsChartData.sort((a, b) => StatusSorter.byStatus(a.key, b.key)); - return this.translateChartService.translateStatus(documentsChartData); + return this.translateChartService.translateLabels(documentsChartData); } #calculateStatusConfig(stats: DossierStats): ProgressBarConfigModel[] { diff --git a/apps/red-ui/src/app/modules/dossier-overview/config.service.ts b/apps/red-ui/src/app/modules/dossier-overview/config.service.ts index 3361e3ab4..1bb5b8b2e 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/config.service.ts +++ b/apps/red-ui/src/app/modules/dossier-overview/config.service.ts @@ -17,7 +17,7 @@ import { PermissionsService } from '@services/permissions.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { TranslateService } from '@ngx-translate/core'; import { UserService } from '@services/user.service'; -import { DossiersDialogService } from '../dossier/services/dossiers-dialog.service'; +import { DossiersDialogService } from '../dossier/shared/services/dossiers-dialog.service'; import { annotationFilterChecker, RedactionFilterSorter } from '../../utils'; import { workloadTranslations } from '../dossier/translations/workload-translations'; import { ConfigService as AppConfigService } from '@services/config.service'; diff --git a/apps/red-ui/src/app/modules/dossier-overview/screen/dossier-overview-screen.component.ts b/apps/red-ui/src/app/modules/dossier-overview/screen/dossier-overview-screen.component.ts index 3f845465f..04f5092f3 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/screen/dossier-overview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier-overview/screen/dossier-overview-screen.component.ts @@ -28,7 +28,7 @@ import { PermissionsService } from '@services/permissions.service'; import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; import { FileAttributesService } from '@services/entity-services/file-attributes.service'; import { ConfigService } from '../config.service'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { UserPreferenceService } from '@services/user-preference.service'; import { FilesMapService } from '@services/entity-services/files-map.service'; import { FilesService } from '@services/entity-services/files.service'; diff --git a/apps/red-ui/src/app/modules/dossier-overview/services/bulk-actions.service.ts b/apps/red-ui/src/app/modules/dossier-overview/services/bulk-actions.service.ts index 018dfd6b4..7877dd3c2 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/services/bulk-actions.service.ts +++ b/apps/red-ui/src/app/modules/dossier-overview/services/bulk-actions.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { Dossier, File } from '@red/domain'; -import { DossiersDialogService } from '../../dossier/services/dossiers-dialog.service'; +import { DossiersDialogService } from '../../dossier/shared/services/dossiers-dialog.service'; import { ConfirmationDialogInput, LoadingService } from '@iqser/common-ui'; import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; import { FilesService } from '@services/entity-services/files.service'; 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 ecf117bcd..6bd41503d 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 @@ -5,13 +5,13 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { downloadTypesTranslations } from '../../../../translations/download-types-translations'; import { BaseDialogComponent, IconButtonTypes, LoadingService, SaveOptions } from '@iqser/common-ui'; import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +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 '../../services/dossiers-dialog.service'; +import { DossiersDialogService } from '../../shared/services/dossiers-dialog.service'; interface DialogData { readonly dossierTemplateId?: string; 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 abcdf8c98..5844f7680 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 @@ -2,14 +2,14 @@ import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Dossier, IDossierRequest, IDossierTemplate } from '@red/domain'; import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-dossier-section.interface'; -import { DossiersDialogService } from '../../../services/dossiers-dialog.service'; +import { DossiersDialogService } from '../../../shared/services/dossiers-dialog.service'; import { PermissionsService } from '@services/permissions.service'; import { Router } from '@angular/router'; import { MatDialogRef } from '@angular/material/dialog'; import { EditDossierDialogComponent } from '../edit-dossier-dialog.component'; import { ConfirmationDialogInput, ConfirmOptions, IconButtonTypes, LoadingService, TitleColors, Toaster } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +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'; diff --git a/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts b/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts index 51b7578b3..56584737c 100644 --- a/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts +++ b/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostBinding, Input, OnChanges, Optional, ViewChild } from '@angular/core'; import { PermissionsService } from '@services/permissions.service'; import { Action, ActionTypes, Dossier, File } from '@red/domain'; -import { DossiersDialogService } from '../../../services/dossiers-dialog.service'; +import { DossiersDialogService } from '../../services/dossiers-dialog.service'; import { CircleButtonType, CircleButtonTypes, @@ -24,7 +24,6 @@ import { ExcludedPagesService } from '../../../../file-preview/services/excluded import { DocumentInfoService } from '../../../../file-preview/services/document-info.service'; import { ExpandableFileActionsComponent } from '@shared/components/expandable-file-actions/expandable-file-actions.component'; import { firstValueFrom, Observable } from 'rxjs'; -import { RedactionImportService } from '../../services/redaction-import.service'; import { PageRotationService } from '../../../../file-preview/services/page-rotation.service'; @Component({ diff --git a/apps/red-ui/src/app/modules/dossier/services/dossiers-dialog.service.ts b/apps/red-ui/src/app/modules/dossier/shared/services/dossiers-dialog.service.ts similarity index 71% rename from apps/red-ui/src/app/modules/dossier/services/dossiers-dialog.service.ts rename to apps/red-ui/src/app/modules/dossier/shared/services/dossiers-dialog.service.ts index 41ce299fc..18811f5d5 100644 --- a/apps/red-ui/src/app/modules/dossier/services/dossiers-dialog.service.ts +++ b/apps/red-ui/src/app/modules/dossier/shared/services/dossiers-dialog.service.ts @@ -1,10 +1,10 @@ import { Injectable } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { AddDossierDialogComponent } from '../dialogs/add-dossier-dialog/add-dossier-dialog.component'; -import { EditDossierDialogComponent } from '../dialogs/edit-dossier-dialog/edit-dossier-dialog.component'; -import { AssignReviewerApproverDialogComponent } from '../dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component'; +import { AddDossierDialogComponent } from '../../dialogs/add-dossier-dialog/add-dossier-dialog.component'; +import { EditDossierDialogComponent } from '../../dialogs/edit-dossier-dialog/edit-dossier-dialog.component'; +import { AssignReviewerApproverDialogComponent } from '../../dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component'; import { ConfirmationDialogComponent, DialogConfig, DialogService, largeDialogConfig } from '@iqser/common-ui'; -import { ImportRedactionsDialogComponent } from '../../file-preview/dialogs/import-redactions-dialog/import-redactions-dialog'; +import { ImportRedactionsDialogComponent } from '../../../file-preview/dialogs/import-redactions-dialog/import-redactions-dialog'; type DialogType = 'confirm' | 'editDossier' | 'addDossier' | 'assignFile' | 'importRedactions'; diff --git a/apps/red-ui/src/app/modules/dossier/shared/services/file-assign.service.ts b/apps/red-ui/src/app/modules/dossier/shared/services/file-assign.service.ts index 63718d1fe..b346509a5 100644 --- a/apps/red-ui/src/app/modules/dossier/shared/services/file-assign.service.ts +++ b/apps/red-ui/src/app/modules/dossier/shared/services/file-assign.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { UserService } from '@services/user.service'; import { Dossier, File } from '@red/domain'; -import { DossiersDialogService } from '../../services/dossiers-dialog.service'; +import { DossiersDialogService } from './dossiers-dialog.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { FilesService } from '@services/entity-services/files.service'; import { ConfirmationDialogInput, LoadingService, Toaster } from '@iqser/common-ui'; diff --git a/apps/red-ui/src/app/modules/dossier/shared/shared-dossiers.module.ts b/apps/red-ui/src/app/modules/dossier/shared/shared-dossiers.module.ts index 57cb8d531..99ad2410c 100644 --- a/apps/red-ui/src/app/modules/dossier/shared/shared-dossiers.module.ts +++ b/apps/red-ui/src/app/modules/dossier/shared/shared-dossiers.module.ts @@ -4,7 +4,7 @@ import { FileAssignService } from './services/file-assign.service'; import { FileActionsComponent } from './components/file-actions/file-actions.component'; import { SharedModule } from '@shared/shared.module'; import { RedactionImportService } from './services/redaction-import.service'; -import { DossiersDialogService } from '../services/dossiers-dialog.service'; +import { DossiersDialogService } from './services/dossiers-dialog.service'; import { EditDossierDialogComponent } from '../dialogs/edit-dossier-dialog/edit-dossier-dialog.component'; import { AddDossierDialogComponent } from '../dialogs/add-dossier-dialog/add-dossier-dialog.component'; import { AssignReviewerApproverDialogComponent } from '../dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component'; diff --git a/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.ts b/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.ts index ed03d6ded..8339f752c 100644 --- a/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.ts +++ b/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.ts @@ -3,7 +3,7 @@ import { PermissionsService } from '@services/permissions.service'; import { CircleButtonTypes, List, ScrollableParentView, ScrollableParentViews, StatusBarConfig } from '@iqser/common-ui'; import { UserService } from '@services/user.service'; import { Dossier, DossierStats, File } from '@red/domain'; -import { DossiersDialogService } from '../../../dossier/services/dossiers-dialog.service'; +import { DossiersDialogService } from '../../../dossier/shared/services/dossiers-dialog.service'; import { LongPressEvent } from '@shared/directives/long-press.directive'; import { UserPreferenceService } from '@services/user-preference.service'; import { FilesMapService } from '@services/entity-services/files-map.service'; diff --git a/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.html b/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.html index 3cd68756d..38b884779 100644 --- a/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.html +++ b/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.html @@ -1,25 +1,24 @@ -
+
-
+
-
{{ stats.totalAnalyzedPages | number }}
-
+
{{ stats.numberOfPages | number }}
+
-
{{ stats.totalPeople }}
+
{{ stats.numberOfPeople }}
@@ -28,10 +27,9 @@
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 d2033d0f1..4974c67f9 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,15 +1,12 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { DoughnutChartConfig } from '@shared/components/simple-doughnut-chart/simple-doughnut-chart.component'; -import { FilterService, mapEach } from '@iqser/common-ui'; -import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; -import { combineLatest, Observable } from 'rxjs'; -import { DossierStats, FileCountPerWorkflowStatus, StatusSorter } from '@red/domain'; -import { workflowFileStatusTranslations } from '../../../../translations/file-status-translations'; +import { Observable } from 'rxjs'; import { TranslateChartService } from '@services/translate-chart.service'; -import { filter, map, switchMap } from 'rxjs/operators'; -import { DossierStatsService } from '@services/dossiers/dossier-stats.service'; -import { TranslateService } from '@ngx-translate/core'; -import { DossierStatesMapService } from '@services/entity-services/dossier-states-map.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'; +import { DashboardStats } from '@red/domain'; @Component({ selector: 'redaction-dossiers-listing-details', @@ -18,59 +15,20 @@ import { DossierStatesMapService } from '@services/entity-services/dossier-state changeDetection: ChangeDetectionStrategy.OnPush, }) export class DossiersListingDetailsComponent { + readonly stats$: Observable; readonly documentsChartData$: Observable; readonly dossiersChartData$: Observable; constructor( - readonly filterService: FilterService, - readonly activeDossiersService: ActiveDossiersService, - private readonly _dossierStatsMap: DossierStatsService, + private readonly _dashboardStatsService: DashboardStatsService, private readonly _translateChartService: TranslateChartService, - private readonly _dossierStatesMapService: DossierStatesMapService, - private readonly _translateService: TranslateService, + private readonly _route: ActivatedRoute, ) { - this.documentsChartData$ = this.activeDossiersService.all$.pipe( - mapEach(dossier => _dossierStatsMap.watch$(dossier.dossierId)), - switchMap(stats$ => combineLatest(stats$)), - filter(stats => !stats.some(s => s === undefined)), - map(stats => this._toChartData(stats)), + const dossierTemplateId: string = this._route.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); + this.stats$ = this._dashboardStatsService.getEntityChanged$(dossierTemplateId); + this.dossiersChartData$ = this.stats$.pipe( + map(s => this._translateChartService.translateDossierStates(s.dossiersChartData, dossierTemplateId)), ); - - this.dossiersChartData$ = this.activeDossiersService.all$.pipe(map(() => this._toDossierChartData())); - } - - private _toDossierChartData(): DoughnutChartConfig[] { - const configArray: DoughnutChartConfig[] = this._dossierStatesMapService.stats; - const undefinedStateLength = - this.activeDossiersService.all.length - configArray.map(v => v.value).reduce((acc, val) => acc + val, 0); - configArray.push({ - value: undefinedStateLength, - label: this._translateService.instant('edit-dossier-dialog.general-info.form.dossier-state.placeholder'), - color: '#E2E4E9', - }); - - return configArray; - } - - private _toChartData(stats: DossierStats[]) { - const chartData: FileCountPerWorkflowStatus = {}; - stats.forEach(stat => { - const statuses: FileCountPerWorkflowStatus = stat.fileCountPerWorkflowStatus; - Object.keys(statuses).forEach(status => { - chartData[status] = chartData[status] ? (chartData[status] as number) + (statuses[status] as number) : statuses[status]; - }); - }); - - const documentsChartData = Object.keys(chartData).map( - status => - ({ - value: chartData[status], - color: status, - label: workflowFileStatusTranslations[status], - key: status, - } as DoughnutChartConfig), - ); - documentsChartData.sort((a, b) => StatusSorter.byStatus(a.key, b.key)); - return this._translateChartService.translateStatus(documentsChartData); + this.documentsChartData$ = this.stats$.pipe(map(s => this._translateChartService.translateWorkflowStatus(s.documentsChartData))); } } diff --git a/apps/red-ui/src/app/modules/dossiers-listing/config.service.ts b/apps/red-ui/src/app/modules/dossiers-listing/config.service.ts index ee63347c8..426d157e1 100644 --- a/apps/red-ui/src/app/modules/dossiers-listing/config.service.ts +++ b/apps/red-ui/src/app/modules/dossiers-listing/config.service.ts @@ -10,7 +10,7 @@ import { dossierMemberChecker, dossierStateChecker, RedactionFilterSorter } from import { workloadTranslations } from '../dossier/translations/workload-translations'; import { DossierStatsService } from '@services/dossiers/dossier-stats.service'; import { DossierStatesMapService } from '@services/entity-services/dossier-states-map.service'; -import { DossiersDialogService } from '../dossier/services/dossiers-dialog.service'; +import { DossiersDialogService } from '../dossier/shared/services/dossiers-dialog.service'; @Injectable() export class ConfigService { 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 8bf91957f..0b7b59ea3 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 @@ -6,9 +6,10 @@ import { DefaultListingServicesTmp, EntitiesService, ListingComponent, OnAttach, import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { ConfigService } from '../config.service'; import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { tap } from 'rxjs/operators'; -import { DossiersDialogService } from '../../dossier/services/dossiers-dialog.service'; +import { DossiersDialogService } from '../../dossier/shared/services/dossiers-dialog.service'; +import { Router } from '@angular/router'; @Component({ templateUrl: './dossiers-listing-screen.component.html', @@ -40,8 +41,10 @@ export class DossiersListingScreenComponent extends ListingComponent im private readonly _configService: ConfigService, private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _dialogService: DossiersDialogService, + private readonly _router: Router, ) { super(_injector); + this._router.routeReuseStrategy.shouldReuseRoute = () => false; } get defaultDossierTemplateId(): string { diff --git a/apps/red-ui/src/app/modules/file-preview/components/document-info/document-info.component.ts b/apps/red-ui/src/app/modules/file-preview/components/document-info/document-info.component.ts index c84117b21..70a2777ea 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/document-info/document-info.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/document-info/document-info.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { DocumentInfoService } from '../../services/document-info.service'; import { combineLatest, Observable, switchMap } from 'rxjs'; import { PermissionsService } from '@services/permissions.service'; diff --git a/apps/red-ui/src/app/modules/file-preview/services/document-info.service.ts b/apps/red-ui/src/app/modules/file-preview/services/document-info.service.ts index 60023ef3a..db0e9ed95 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/document-info.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/document-info.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, merge, Observable } from 'rxjs'; import { shareLast } from '@iqser/common-ui'; import { filter, map, startWith, tap, withLatestFrom } from 'rxjs/operators'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { FileAttributesService } from '@services/entity-services/file-attributes.service'; import { FilesMapService } from '@services/entity-services/files-map.service'; import { File, IFileAttributeConfig } from '@red/domain'; diff --git a/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts b/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts index 02ec11ae4..935b36fb6 100644 --- a/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts @@ -6,7 +6,7 @@ import { Dictionary, DICTIONARY_TYPE_KEY_MAP, DictionaryType, Dossier, DossierTe import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DictionaryService } from '@services/entity-services/dictionary.service'; import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { EditorComponent } from '@shared/components/editor/editor.component'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration; diff --git a/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.ts b/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.ts index 6b7635966..94b423232 100644 --- a/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; import { Dossier, DossierStats } from '@red/domain'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { List } from '@iqser/common-ui'; import dayjs from 'dayjs'; diff --git a/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.scss b/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.scss index 2e474e4dd..51fdd8722 100644 --- a/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.scss +++ b/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.scss @@ -47,6 +47,7 @@ > div { border-radius: 4px; padding: 3px 8px; + width: 100%; &:not(:last-child) { margin-bottom: 8px; diff --git a/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.ts b/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.ts index d91417945..ffa553406 100644 --- a/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnChanges, OnInit } from '@angular/core'; +import { Component, Input, OnChanges, OnInit, Optional } from '@angular/core'; import { Color } from '@red/domain'; import { FilterService, INestedFilter } from '@iqser/common-ui'; import { Observable, of } from 'rxjs'; @@ -30,17 +30,20 @@ export class SimpleDoughnutChartComponent implements OnChanges, OnInit { filtersEnabled: boolean; chartData: any[] = []; - perimeter: number; cx = 0; cy = 0; size = 0; filters$: Observable; - constructor(readonly filterService: FilterService) { - this.filterService.filterGroups$.subscribe(() => { - this.filtersEnabled = !!this.filterService.filterGroups.find(g => g.slug === this.filterKey); - }); + constructor(@Optional() readonly filterService: FilterService) { + if (filterService) { + this.filterService.filterGroups$.subscribe(() => { + this.filtersEnabled = !!this.filterService.filterGroups.find(g => g.slug === this.filterKey); + }); + } else { + this.filtersEnabled = false; + } } get circumference(): number { @@ -56,7 +59,7 @@ export class SimpleDoughnutChartComponent implements OnChanges, OnInit { } ngOnInit() { - this.filters$ = this.filterService.getFilterModels$(this.filterKey) ?? of([]); + this.filters$ = (this.filtersEnabled && this.filterService.getFilterModels$(this.filterKey)) ?? of([]); } ngOnChanges(): void { @@ -67,7 +70,7 @@ export class SimpleDoughnutChartComponent implements OnChanges, OnInit { } filterChecked$(key: string): Observable { - return this.filters$.pipe(map(all => all?.find(e => e.id === key)?.checked)); + return this.filtersEnabled ? this.filters$.pipe(map(all => all?.find(e => e.id === key)?.checked)) : of(false); } calculateChartData() { diff --git a/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts b/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts index fc3d0f8e0..2ec1357f0 100644 --- a/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts @@ -1,7 +1,7 @@ import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { CircleButtonTypes, List } from '@iqser/common-ui'; import { UserService } from '@services/user.service'; -import { DossiersDialogService } from '../../../dossier/services/dossiers-dialog.service'; +import { DossiersDialogService } from '../../../dossier/shared/services/dossiers-dialog.service'; @Component({ selector: 'redaction-team-members', diff --git a/apps/red-ui/src/app/services/breadcrumbs.service.ts b/apps/red-ui/src/app/services/breadcrumbs.service.ts index 1cd1d22aa..27f1bf465 100644 --- a/apps/red-ui/src/app/services/breadcrumbs.service.ts +++ b/apps/red-ui/src/app/services/breadcrumbs.service.ts @@ -10,7 +10,7 @@ import { DOSSIER_ID, DOSSIER_TEMPLATE_ID, DOSSIERS_ARCHIVE, FILE_ID } from '@uti import { DossiersService } from '@services/dossiers/dossiers.service'; import { dossiersServiceResolver } from '@services/entity-services/dossiers.service.provider'; import { FeaturesService } from '@services/features.service'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; export type RouterLinkActiveOptions = { exact: boolean } | IsActiveMatchOptions; export type BreadcrumbDisplayType = 'text' | 'dropdown'; diff --git a/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts b/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts new file mode 100644 index 000000000..79819f682 --- /dev/null +++ b/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts @@ -0,0 +1,29 @@ +import { EntitiesService, mapEach } from '@iqser/common-ui'; +import { DashboardStats, IDashboardStats } from '@red/domain'; +import { Injectable, Injector } from '@angular/core'; +import { NGXLogger } from 'ngx-logger'; +import { Observable } from 'rxjs'; +import { map, switchMap, tap } from 'rxjs/operators'; +import { DossierStatesService } from '@services/entity-services/dossier-states.service'; + +@Injectable({ + providedIn: 'root', +}) +export class DashboardStatsService extends EntitiesService { + constructor( + protected readonly _injector: Injector, + private readonly _dossierStatesService: DossierStatesService, + private readonly _logger: NGXLogger, + ) { + super(_injector, DashboardStats, 'dossier-template/stats'); + } + + loadAll(): Observable { + return this.getAll(this._defaultModelPath).pipe( + mapEach(entity => new DashboardStats(entity)), + switchMap(entities => this._dossierStatesService.loadAllForAllTemplates().pipe(map(() => entities))), + tap(entities => entities.sort((a, b) => (a.numberOfActiveDossiers > 0 && b.numberOfActiveDossiers === 0 ? -1 : 1))), + tap(entities => this.setEntities(entities)), + ); + } +} diff --git a/apps/red-ui/src/app/services/entity-services/dossier-templates.service.ts b/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts similarity index 93% rename from apps/red-ui/src/app/services/entity-services/dossier-templates.service.ts rename to apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts index a6479d814..979e3d9e5 100644 --- a/apps/red-ui/src/app/services/entity-services/dossier-templates.service.ts +++ b/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts @@ -2,12 +2,12 @@ import { EntitiesService, List, mapEach, RequiredParam, Toaster, Validate } from import { DossierTemplate, IDossierTemplate } from '@red/domain'; import { Injectable, Injector } from '@angular/core'; import { forkJoin, Observable, of } from 'rxjs'; -import { FileAttributesService } from './file-attributes.service'; +import { FileAttributesService } from '../entity-services/file-attributes.service'; import { catchError, mapTo, switchMap, tap } from 'rxjs/operators'; -import { DossierTemplateStatsService } from '@services/entity-services/dossier-template-stats.service'; +import { DossierTemplateStatsService } from '../entity-services/dossier-template-stats.service'; import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { DictionaryService } from '@services/entity-services/dictionary.service'; +import { DictionaryService } from '../entity-services/dictionary.service'; const DOSSIER_TEMPLATE_CONFLICT_MSG = _('dossier-templates-listing.error.conflict'); const GENERIC_MSG = _('dossier-templates-listing.error.generic'); diff --git a/apps/red-ui/src/app/services/dossiers/active-dossiers.service.ts b/apps/red-ui/src/app/services/dossiers/active-dossiers.service.ts index 95291300e..54a4f8d01 100644 --- a/apps/red-ui/src/app/services/dossiers/active-dossiers.service.ts +++ b/apps/red-ui/src/app/services/dossiers/active-dossiers.service.ts @@ -4,11 +4,6 @@ import { timer } from 'rxjs'; import { CHANGED_CHECK_INTERVAL, DOSSIERS_ROUTE } from '@utils/constants'; import { DossiersService } from './dossiers.service'; -export interface IDossiersStats { - totalPeople: number; - totalAnalyzedPages: number; -} - @Injectable({ providedIn: 'root', }) @@ -23,8 +18,4 @@ export class ActiveDossiersService extends DossiersService { ) .subscribe(); } - - getCountWithState(dossierStatusId: string): number { - return this.all.filter(dossier => dossier.dossierStatusId === dossierStatusId).length; - } } diff --git a/apps/red-ui/src/app/services/dossiers/dossiers.service.ts b/apps/red-ui/src/app/services/dossiers/dossiers.service.ts index 32d44d88f..2a576a40f 100644 --- a/apps/red-ui/src/app/services/dossiers/dossiers.service.ts +++ b/apps/red-ui/src/app/services/dossiers/dossiers.service.ts @@ -1,23 +1,21 @@ -import { EntitiesService, List, mapEach, QueryParam, RequiredParam, shareLast, Toaster, Validate } from '@iqser/common-ui'; +import { EntitiesService, List, mapEach, QueryParam, RequiredParam, Toaster, Validate } from '@iqser/common-ui'; import { Dossier, DossierStats, IDossier, IDossierChanges, IDossierRequest } from '@red/domain'; -import { combineLatest, forkJoin, Observable, of, Subject, throwError } from 'rxjs'; +import { forkJoin, Observable, of, Subject, throwError } from 'rxjs'; import { catchError, filter, map, switchMap, tap } from 'rxjs/operators'; import { Injector } from '@angular/core'; -import { DossierStatesService } from '../entity-services/dossier-states.service'; import { DossierStatsService } from './dossier-stats.service'; -import { IDossiersStats } from './active-dossiers.service'; import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { NGXLogger } from 'ngx-logger'; +import { DashboardStatsService } from '@services/dossier-templates/dashboard-stats.service'; const CONFLICT_MSG = _('add-dossier-dialog.errors.dossier-already-exists'); const GENERIC_MSG = _('add-dossier-dialog.errors.generic'); export abstract class DossiersService extends EntitiesService { readonly dossierFileChanges$ = new Subject(); - readonly generalStats$ = this.all$.pipe(switchMap(entities => this.#generalStats$(entities))); protected readonly _dossierStatsService = this._injector.get(DossierStatsService); - protected readonly _dossierStateService = this._injector.get(DossierStatesService); + protected readonly _dashboardStatsService = this._injector.get(DashboardStatsService); protected readonly _toaster = this._injector.get(Toaster); protected readonly _logger = this._injector.get(NGXLogger); @@ -64,7 +62,7 @@ export abstract class DossiersService extends EntitiesService mapEach(entity => new Dossier(entity)), /* Load stats before updating entities */ switchMap(dossiers => this._dossierStatsService.getFor(dossierIds(dossiers)).pipe(map(() => dossiers))), - switchMap(dossiers => this._dossierStateService.loadAllForAllTemplates().pipe(map(() => dossiers))), + switchMap(dossiers => this._dashboardStatsService.loadAll().pipe(map(() => dossiers))), tap(dossiers => this.setEntities(dossiers)), ); } @@ -86,28 +84,4 @@ export abstract class DossiersService extends EntitiesService switchMap(dossier => this._dossierStatsService.getFor([dossier.dossierId])), ); } - - #computeStats(entities: List): IDossiersStats { - let totalAnalyzedPages = 0; - const totalPeople = new Set(); - - entities.forEach(dossier => { - dossier.memberIds?.forEach(m => totalPeople.add(m)); - totalAnalyzedPages += this._dossierStatsService.get(dossier.dossierId).numberOfPages; - }); - - return { - totalPeople: totalPeople.size, - totalAnalyzedPages, - }; - } - - #generalStats$(entities: List): Observable { - const stats$ = entities.map(entity => this._dossierStatsService.watch$(entity.dossierId)); - return combineLatest(stats$).pipe( - filter(stats => stats.every(s => !!s)), - map(() => this.#computeStats(entities)), - shareLast(), - ); - } } diff --git a/apps/red-ui/src/app/services/entity-services/dossier-states.service.ts b/apps/red-ui/src/app/services/entity-services/dossier-states.service.ts index 7e2659262..1fa21f731 100644 --- a/apps/red-ui/src/app/services/entity-services/dossier-states.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dossier-states.service.ts @@ -2,7 +2,7 @@ import { Injectable, Injector } from '@angular/core'; import { EntitiesService, mapEach, RequiredParam, Toaster, Validate } from '@iqser/common-ui'; import { DossierState, IDossierState } from '@red/domain'; import { EMPTY, forkJoin, Observable, switchMap } from 'rxjs'; -import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { catchError, defaultIfEmpty, tap } from 'rxjs/operators'; import { DossierStatesMapService } from '@services/entity-services/dossier-states-map.service'; import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http'; diff --git a/apps/red-ui/src/app/services/entity-services/trash.service.ts b/apps/red-ui/src/app/services/entity-services/trash.service.ts index 841bda468..e0cf923fb 100644 --- a/apps/red-ui/src/app/services/entity-services/trash.service.ts +++ b/apps/red-ui/src/app/services/entity-services/trash.service.ts @@ -12,11 +12,6 @@ import { flatMap } from 'lodash-es'; import { DossierStatsService } from '@services/dossiers/dossier-stats.service'; import { FilesService } from '@services/entity-services/files.service'; -export interface IDossiersStats { - totalPeople: number; - totalAnalyzedPages: number; -} - @Injectable({ providedIn: 'root', }) diff --git a/apps/red-ui/src/app/services/translate-chart.service.ts b/apps/red-ui/src/app/services/translate-chart.service.ts index 97c14b8e6..335022e91 100644 --- a/apps/red-ui/src/app/services/translate-chart.service.ts +++ b/apps/red-ui/src/app/services/translate-chart.service.ts @@ -2,17 +2,34 @@ import { Injectable } from '@angular/core'; import { DoughnutChartConfig } from '@shared/components/simple-doughnut-chart/simple-doughnut-chart.component'; import { TranslateService } from '@ngx-translate/core'; import { rolesTranslations } from '../translations/roles-translations'; +import { workflowFileStatusTranslations } from '../translations/file-status-translations'; +import { DossierStatesMapService } from './entity-services/dossier-states-map.service'; @Injectable({ providedIn: 'root', }) export class TranslateChartService { - constructor(private readonly _translateService: TranslateService) {} + constructor(private readonly _translateService: TranslateService, private readonly _dossierStatesMapService: DossierStatesMapService) {} - translateStatus(config: DoughnutChartConfig[]): DoughnutChartConfig[] { + translateLabels(config: DoughnutChartConfig[]): DoughnutChartConfig[] { return config.map(val => ({ ...val, label: this._translateService.instant(val.label) })); } + translateDossierStates(config: DoughnutChartConfig[], dossierTemplateId: string): DoughnutChartConfig[] { + return config.map(val => { + if (!val.key) { + return { ...val, label: this._translateService.instant(val.label) }; + } else { + const dossierState = this._dossierStatesMapService.get(dossierTemplateId, val.key); + return { ...val, key: null, label: dossierState.name, color: dossierState.color }; + } + }); + } + + translateWorkflowStatus(config: DoughnutChartConfig[]): DoughnutChartConfig[] { + return config.map(val => ({ ...val, label: this._translateService.instant(workflowFileStatusTranslations[val.label] as string) })); + } + translateRoles(config: DoughnutChartConfig[]): DoughnutChartConfig[] { return config.map(val => ({ ...val, diff --git a/apps/red-ui/src/assets/i18n/de.json b/apps/red-ui/src/assets/i18n/de.json index c7e80f795..bbedce60f 100644 --- a/apps/red-ui/src/assets/i18n/de.json +++ b/apps/red-ui/src/assets/i18n/de.json @@ -775,10 +775,6 @@ }, "stats": { "analyzed-pages": "Seiten", - "charts": { - "dossiers": "Dossiers", - "total-documents": "Anzahl der Dokumente" - }, "total-people": "Anzahl der Benutzer" }, "table-col-names": { @@ -793,6 +789,10 @@ "title": "{length} {length, plural, one{aktives Dossier} other{aktive Dossiers}}" } }, + "dossier-template-charts": { + "active-dossiers": "Aktive Dossiers", + "total-documents": "Anzahl der Dokumente" + }, "dossier-overview": { "approve": "Genehmigen", "approve-disabled": "Das Dokument kann erst genehmigt werden, wenn eine Analyse auf Basis der aktuellen Wörterbücher durchgeführt wurde und die Vorschläge bearbeitet wurden.", diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index 506ab0e25..e7cb7e021 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -775,10 +775,6 @@ }, "stats": { "analyzed-pages": "{count, plural, one{Page} other{Pages}}", - "charts": { - "dossiers": "{count, plural, one{Dossier} other{Dossiers}}", - "total-documents": "Total Documents" - }, "total-people": "Total users" }, "table-col-names": { @@ -793,6 +789,10 @@ "title": "{length} active {length, plural, one{Dossier} other{Dossiers}}" } }, + "dossier-template-charts": { + "active-dossiers": "Active {count, plural, one{Dossier} other{Dossiers}}", + "total-documents": "Total Documents" + }, "dossier-overview": { "approve": "Approve", "approve-disabled": "File can only be approved once it has been analysed with the latest dictionaries and all suggestions have been processed.", diff --git a/libs/common-ui b/libs/common-ui index f06c007be..5444b09e6 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit f06c007bec1a7da5c257e68d6df8c806419ceb2b +Subproject commit 5444b09e647672383a0b39d23400a98d7efb6536 diff --git a/libs/red-domain/src/lib/dossier-templates/dashboard-stats.model.ts b/libs/red-domain/src/lib/dossier-templates/dashboard-stats.model.ts new file mode 100644 index 000000000..d99a9b03c --- /dev/null +++ b/libs/red-domain/src/lib/dossier-templates/dashboard-stats.model.ts @@ -0,0 +1,89 @@ +import { IDashboardStats, ProcessingFileStatus, StatusSorter, WorkflowFileStatus } from '@red/domain'; +import { IListable } from '@iqser/common-ui'; +import { DoughnutChartConfig } from '@shared/components/simple-doughnut-chart/simple-doughnut-chart.component'; + +export class DashboardStats implements IListable, IDashboardStats { + readonly dossierCountByStatus: [ + { + count: number; + statusId: string; + }, + ]; + readonly dossierTemplateId: string; + readonly dossiersInTemplate: [string]; + readonly fileCountPerProcessingStatus: [ + { + readonly count: number; + readonly processingStatus: ProcessingFileStatus; + }, + ]; + readonly fileCountPerWorkflowStatus: [ + { + readonly count: number; + readonly workflowStatus: WorkflowFileStatus; + }, + ]; + readonly name: string; + readonly numberOfActiveDossiers: number; + readonly numberOfActiveFiles: number; + readonly numberOfArchivedDossiers: number; + readonly numberOfDeletedDossiers: number; + readonly numberOfExcludedPages: number; + readonly numberOfPages: number; + readonly numberOfPeople: number; + readonly numberOfSoftDeletedFiles: number; + readonly dossiersChartData: DoughnutChartConfig[]; + readonly documentsChartData: DoughnutChartConfig[]; + + constructor(stats: IDashboardStats) { + this.dossierCountByStatus = stats.dossierCountByStatus; + this.dossierTemplateId = stats.dossierTemplateId; + this.dossiersInTemplate = stats.dossiersInTemplate; + this.fileCountPerProcessingStatus = stats.fileCountPerProcessingStatus; + this.fileCountPerWorkflowStatus = stats.fileCountPerWorkflowStatus; + this.name = stats.name; + this.numberOfActiveDossiers = stats.numberOfActiveDossiers; + this.numberOfActiveFiles = stats.numberOfActiveFiles; + this.numberOfArchivedDossiers = stats.numberOfArchivedDossiers; + this.numberOfDeletedDossiers = stats.numberOfDeletedDossiers; + this.numberOfExcludedPages = stats.numberOfExcludedPages; + this.numberOfPages = stats.numberOfPages; + this.numberOfPeople = stats.numberOfPeople; + this.numberOfSoftDeletedFiles = stats.numberOfSoftDeletedFiles; + + this.dossiersChartData = this._dossiersChartData; + this.documentsChartData = this._documentsChartData; + } + + get isEmpty(): boolean { + return this.numberOfActiveDossiers === 0; + } + + get id(): string { + return this.dossierTemplateId; + } + + get searchKey(): string { + return this.name; + } + + private get _dossiersChartData(): DoughnutChartConfig[] { + return this.dossierCountByStatus.map(d => ({ + value: d.count, + color: '#e2e4e9', + label: 'edit-dossier-dialog.general-info.form.dossier-state.placeholder', + key: d.statusId, + })); + } + + private get _documentsChartData(): DoughnutChartConfig[] { + const configArray: DoughnutChartConfig[] = this.fileCountPerWorkflowStatus.map(d => ({ + value: d.count, + color: d.workflowStatus, + label: d.workflowStatus, + key: d.workflowStatus, + })); + configArray.sort((a: DoughnutChartConfig, b) => StatusSorter.byStatus(a.label, b.label)); + return configArray; + } +} diff --git a/libs/red-domain/src/lib/dossier-templates/dashboard-stats.ts b/libs/red-domain/src/lib/dossier-templates/dashboard-stats.ts new file mode 100644 index 000000000..b7db72f1d --- /dev/null +++ b/libs/red-domain/src/lib/dossier-templates/dashboard-stats.ts @@ -0,0 +1,33 @@ +import { ProcessingFileStatus, WorkflowFileStatus } from '@red/domain'; + +export interface IDashboardStats { + readonly dossierCountByStatus: [ + { + count: number; + statusId: string; + }, + ]; + readonly dossierTemplateId: string; + readonly dossiersInTemplate: [string]; + readonly fileCountPerProcessingStatus: [ + { + readonly count: number; + readonly processingStatus: ProcessingFileStatus; + }, + ]; + readonly fileCountPerWorkflowStatus: [ + { + readonly count: number; + readonly workflowStatus: WorkflowFileStatus; + }, + ]; + readonly name: string; + readonly numberOfActiveDossiers: number; + readonly numberOfActiveFiles: number; + readonly numberOfArchivedDossiers: number; + readonly numberOfDeletedDossiers: number; + readonly numberOfExcludedPages: number; + readonly numberOfPages: number; + readonly numberOfPeople: number; + readonly numberOfSoftDeletedFiles: number; +} diff --git a/libs/red-domain/src/lib/dossier-templates/index.ts b/libs/red-domain/src/lib/dossier-templates/index.ts index cf815ad22..8af5fc988 100644 --- a/libs/red-domain/src/lib/dossier-templates/index.ts +++ b/libs/red-domain/src/lib/dossier-templates/index.ts @@ -2,4 +2,6 @@ export * from './dossier-template'; export * from './dossier-template.model'; export * from './dossier-template-stats'; export * from './dossier-template-stats.model'; +export * from './dashboard-stats'; +export * from './dashboard-stats.model'; export * from './types';