From 9ad4e2400a6c7becd4c675ad31fb4ebf348d195b Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Sun, 14 Nov 2021 14:42:09 +0200 Subject: [PATCH] remove dossier stats from dossier --- .../team-members-manager.component.ts | 3 +- .../edit-dossier-general-info.component.ts | 4 +- .../edit-dossier-team-members.component.ts | 3 +- .../dossier-details-stats.component.html | 2 +- .../dossier-details-stats.component.ts | 6 ++- .../dossier-details.component.html | 2 +- .../dossier-details.component.ts | 22 +++++++-- .../dossier-workload-column.component.html | 10 ++-- .../dossier-workload-column.component.ts | 3 +- .../dossiers-listing-actions.component.html | 2 +- .../dossiers-listing-actions.component.ts | 12 ++++- .../dossiers-listing-details.component.ts | 4 +- ...ssiers-listing-dossier-name.component.html | 6 +-- ...dossiers-listing-dossier-name.component.ts | 11 ++++- .../table-item/table-item.component.html | 17 ++++--- .../table-item/table-item.component.ts | 6 ++- .../dossiers-listing/config.service.ts | 33 ++++++++----- .../entity-services/dossier-stats.service.ts | 48 +++++++++++++------ .../entity-services/dossiers.service.ts | 6 +-- .../red-ui/src/app/state/app-state.service.ts | 5 +- .../src/lib/dossiers/dossier.model.ts | 14 +----- 21 files changed, 142 insertions(+), 77 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.ts b/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.ts index 3c39fec39..45d32208b 100644 --- a/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.ts +++ b/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { UserService } from '@services/user.service'; import { Toaster } from '@iqser/common-ui'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; @@ -9,6 +9,7 @@ import { Dossier, IDossier, IDossierRequest } from '@red/domain'; selector: 'redaction-team-members-manager', templateUrl: './team-members-manager.component.html', styleUrls: ['./team-members-manager.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class TeamMembersManagerComponent implements OnInit { teamForm: FormGroup; 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 6d288c92e..56c85330d 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 @@ -12,6 +12,7 @@ import { ConfirmationDialogInput, IconButtonTypes, TitleColors, Toaster } from ' import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DossiersService } from '@services/entity-services/dossiers.service'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierStatsService } from '@services/entity-services/dossier-stats.service'; @Component({ selector: 'redaction-edit-dossier-general-info', @@ -32,6 +33,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti readonly permissionsService: PermissionsService, private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _dossiersService: DossiersService, + private readonly _dossierStatsService: DossierStatsService, private readonly _formBuilder: FormBuilder, private readonly _dialogService: DossiersDialogService, private readonly _router: Router, @@ -71,7 +73,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti dossierTemplateId: [ { value: this.dossier.dossierTemplateId, - disabled: this.dossier.stats.hasFiles, + disabled: this._dossierStatsService.get(this.dossier.dossierId).hasFiles, }, Validators.required, ], diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/team-members/edit-dossier-team-members.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/team-members/edit-dossier-team-members.component.ts index cf0521c84..0878fffa0 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/team-members/edit-dossier-team-members.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/team-members/edit-dossier-team-members.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { Dossier } from '@red/domain'; import { EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { TeamMembersManagerComponent } from '../../../components/team-members-manager/team-members-manager.component'; @@ -8,6 +8,7 @@ import { UserService } from '@services/user.service'; selector: 'redaction-edit-dossier-team-members', templateUrl: './edit-dossier-team-members.component.html', styleUrls: ['./edit-dossier-team-members.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class EditDossierTeamMembersComponent implements EditDossierSectionInterface { readonly currentUser = this._userService.currentUser; diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.html index 8ce9e6f46..e39670382 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.html @@ -1,4 +1,4 @@ - +
{{ 'dossier-overview.dossier-details.stats.documents' | translate: { count: stats.numberOfFiles } }} diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.ts index 1ad524f4c..fe7c369d8 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.ts @@ -1,11 +1,12 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { Dossier, DossierAttributeWithValue, DossierTemplate } from '@red/domain'; +import { Dossier, DossierAttributeWithValue, DossierStats, DossierTemplate } from '@red/domain'; import { DossiersDialogService } from '../../../../services/dossiers-dialog.service'; import { DossiersService } from '@services/entity-services/dossiers.service'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; import { FilesService } from '@services/entity-services/files.service'; import { Observable } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; +import { DossierStatsService } from '@services/entity-services/dossier-stats.service'; @Component({ selector: 'redaction-dossier-details-stats', @@ -15,6 +16,7 @@ import { distinctUntilChanged, map } from 'rxjs/operators'; export class DossierDetailsStatsComponent implements OnInit { attributesExpanded = false; deletedFilesCount$: Observable; + dossierStats$: Observable; @Input() dossierAttributes: DossierAttributeWithValue[]; @Input() @@ -26,10 +28,12 @@ export class DossierDetailsStatsComponent implements OnInit { private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _dialogService: DossiersDialogService, private readonly _filesService: FilesService, + private readonly _dossierStatsService: DossierStatsService, readonly dossiersService: DossiersService, ) {} ngOnInit() { + this.dossierStats$ = this._dossierStatsService.watch$(this.dossier.dossierId); this.deletedFilesCount$ = this._filesService.getDeletedFilesFor(this.dossier.id).pipe( map(files => files.length), distinctUntilChanged(), diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.html index 7948aa15a..d02fb53b7 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.html @@ -38,7 +38,7 @@ >
- +
; + readonly dossierStats$: Observable; constructor( readonly appStateService: AppStateService, @@ -38,11 +49,16 @@ export class DossierDetailsComponent { readonly filterService: FilterService, private readonly _changeDetectorRef: ChangeDetectorRef, private readonly _userService: UserService, + private readonly _dossierStatsService: DossierStatsService, private readonly _toaster: Toaster, activatedRoute: ActivatedRoute, ) { this.dossierId = activatedRoute.snapshot.paramMap.get('dossierId'); - this.dossier$ = this.dossiersService.getEntityChanged$(this.dossierId); + this.dossier$ = this.dossiersService.getEntityChanged$(this.dossierId).pipe(shareLast()); + this.dossierStats$ = this.dossier$.pipe( + pluck('dossierId'), + switchMap(dossierId => this._dossierStatsService.watch$(dossierId)), + ); } get managers() { diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossier-workload-column/dossier-workload-column.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossier-workload-column/dossier-workload-column.component.html index ab348134d..361790fd9 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossier-workload-column/dossier-workload-column.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossier-workload-column/dossier-workload-column.component.html @@ -1,18 +1,20 @@ -
+
+ + +
(); + dossierStats$: Observable; constructor( readonly appStateService: AppStateService, @@ -33,9 +36,14 @@ export class DossiersListingActionsComponent { readonly permissionsService: PermissionsService, readonly filesMapService: FilesMapService, private readonly _dialogService: DossiersDialogService, + private readonly _dossierStatsService: DossierStatsService, private readonly _userPreferenceService: UserPreferenceService, ) {} + ngOnInit() { + this.dossierStats$ = this._dossierStatsService.watch$(this.dossier.dossierId); + } + statusConfig(stats: DossierStats): readonly StatusBarConfig[] { return Object.keys(stats.fileCountPerWorkflowStatus) .sort(StatusSorter.byStatus) diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts index 8ad182abc..5db91902b 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts @@ -8,6 +8,7 @@ import { fileStatusTranslations } from '../../../../translations/file-status-tra import { TranslateChartService } from '@services/translate-chart.service'; import { filter, map, switchMap } from 'rxjs/operators'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { DossierStatsService } from '@services/entity-services/dossier-stats.service'; @Component({ selector: 'redaction-dossiers-listing-details', @@ -22,10 +23,11 @@ export class DossiersListingDetailsComponent { constructor( readonly filterService: FilterService, readonly dossiersService: DossiersService, + private readonly _dossierStatsMap: DossierStatsService, private readonly _translateChartService: TranslateChartService, ) { this.documentsChartData$ = this.dossiersService.all$.pipe( - mapEach(dossier => dossier.stats$), + mapEach(dossier => _dossierStatsMap.watch$(dossier.dossierId)), switchMap(stats$ => combineLatest(stats$)), filter(stats => !stats.some(s => s === undefined)), map(stats => this._toChartData(stats)), diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.html index 4473efaa3..7f8d42a1e 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.html @@ -9,15 +9,15 @@
-
+
- {{ stats.numberOfFiles }} + {{ dossierStats.numberOfFiles }}
- {{ stats.numberOfPages }} + {{ dossierStats.numberOfPages }}
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.ts index 8454d65aa..5a270d9fc 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-dossier-name/dossiers-listing-dossier-name.component.ts @@ -1,6 +1,8 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; -import { Dossier } from '@red/domain'; +import { Dossier, DossierStats } from '@red/domain'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierStatsService } from '@services/entity-services/dossier-stats.service'; +import { DossiersService } from '@services/entity-services/dossiers.service'; @Component({ selector: 'redaction-dossiers-listing-dossier-name', @@ -10,8 +12,13 @@ import { DossierTemplatesService } from '@services/entity-services/dossier-templ }) export class DossiersListingDossierNameComponent { @Input() dossier: Dossier; + @Input() dossierStats: DossierStats; - constructor(private readonly _dossierTemplatesService: DossierTemplatesService) {} + constructor( + private readonly _dossierTemplatesService: DossierTemplatesService, + private readonly _dossierStatsService: DossierStatsService, + private readonly _dossiersService: DossiersService, + ) {} getDossierTemplateNameFor(dossierTemplateId: string): string { return this._dossierTemplatesService.find(dossierTemplateId).name; diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.html index b9b84e571..65d8b005e 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.html @@ -1,12 +1,17 @@ -
- -
-
- -
+ +
+ +
+ +
+ +
+
+
+
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.ts index 62ffd1013..b9b5f0927 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/table-item/table-item.component.ts @@ -1,13 +1,17 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { Dossier } from '@red/domain'; import { Required } from '@iqser/common-ui'; +import { DossierStatsService } from '@services/entity-services/dossier-stats.service'; @Component({ selector: 'redaction-table-item', templateUrl: './table-item.component.html', styleUrls: ['./table-item.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class TableItemComponent { @Input() @Required() dossier!: Dossier; @Output() readonly calculateData = new EventEmitter(); + + constructor(readonly dossierStatsService: DossierStatsService) {} } diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/config.service.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/config.service.ts index f108f2a97..388bd6dce 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/config.service.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/config.service.ts @@ -10,6 +10,7 @@ import { dossierMemberChecker, dossierTemplateChecker, RedactionFilterSorter } f import { workloadTranslations } from '../../translations/workload-translations'; import { AppStateService } from '@state/app-state.service'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; +import { DossierStatsService } from '@services/entity-services/dossier-stats.service'; @Injectable() export class ConfigService { @@ -19,6 +20,7 @@ export class ConfigService { private readonly _userService: UserService, private readonly _appStateService: AppStateService, private readonly _dossierTemplatesService: DossierTemplatesService, + private readonly _dossierStatsService: DossierStatsService, ) {} get tableConfig(): TableColumnConfig[] { @@ -85,23 +87,24 @@ export class ConfigService { entities?.forEach(entry => { entry.memberIds.forEach(f => allDistinctPeople.add(f)); allDistinctDossierTemplates.add(entry.dossierTemplateId); + const stats = this._dossierStatsService.get(entry.dossierId); - if (!entry.stats) { + if (!stats) { return; } - Object.keys(entry.stats?.fileCountPerWorkflowStatus).forEach(status => allDistinctFileStatus.add(status)); + Object.keys(stats?.fileCountPerWorkflowStatus).forEach(status => allDistinctFileStatus.add(status)); - if (entry.stats.hasHintsNoRedactionsFilePresent) { + if (stats.hasHintsNoRedactionsFilePresent) { allDistinctNeedsWork.add('hint'); } - if (entry.stats.hasRedactionsFilePresent) { + if (stats.hasRedactionsFilePresent) { allDistinctNeedsWork.add('redaction'); } - if (entry.stats.hasSuggestionsFilePresent) { + if (stats.hasSuggestionsFilePresent) { allDistinctNeedsWork.add('suggestion'); } - if (entry.stats.hasNoFlagsFilePresent) { + if (stats.hasNoFlagsFilePresent) { allDistinctNeedsWork.add('none'); } }); @@ -119,7 +122,7 @@ export class ConfigService { label: this._translateService.instant('filters.status'), icon: 'red:status', filters: statusFilters.sort((a, b) => StatusSorter[a.id] - StatusSorter[b.id]), - checker: this._dossierStatusChecker, + checker: (dossier: Dossier, filter: INestedFilter) => this._dossierStatusChecker(dossier, filter), }); const peopleFilters = [...allDistinctPeople].map( @@ -152,7 +155,7 @@ export class ConfigService { icon: 'red:needs-work', filterTemplate: needsWorkFilterTemplate, filters: needsWorkFilters.sort((a, b) => RedactionFilterSorter[a.id] - RedactionFilterSorter[b.id]), - checker: this._annotationFilterChecker, + checker: (dossier: Dossier, filter: INestedFilter) => this._annotationFilterChecker(dossier, filter), matchAll: true, }); @@ -199,24 +202,28 @@ export class ConfigService { return filterGroups; } - private _dossierStatusChecker = (dossier: Dossier, filter: INestedFilter) => dossier.stats.fileCountPerWorkflowStatus[filter.id]; + private _dossierStatusChecker = (dossier: Dossier, filter: INestedFilter) => { + const stats = this._dossierStatsService.get(dossier.dossierId); + return stats?.fileCountPerWorkflowStatus[filter.id]; + }; private _annotationFilterChecker = (dossier: Dossier, filter: INestedFilter) => { + const stats = this._dossierStatsService.get(dossier.dossierId); switch (filter.id) { // case 'analysis': { // return stats.reanalysisRequired; // } case 'suggestion': { - return dossier.stats.hasSuggestionsFilePresent; + return stats.hasSuggestionsFilePresent; } case 'redaction': { - return dossier.stats.hasRedactionsFilePresent; + return stats.hasRedactionsFilePresent; } case 'hint': { - return dossier.stats.hasHintsNoRedactionsFilePresent; + return stats.hasHintsNoRedactionsFilePresent; } case 'none': { - return dossier.stats.hasNoFlagsFilePresent; + return stats.hasNoFlagsFilePresent; } } }; diff --git a/apps/red-ui/src/app/services/entity-services/dossier-stats.service.ts b/apps/red-ui/src/app/services/entity-services/dossier-stats.service.ts index cf96b4ce5..9e64ebf61 100644 --- a/apps/red-ui/src/app/services/entity-services/dossier-stats.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dossier-stats.service.ts @@ -1,26 +1,44 @@ -import { Injectable, Injector } from '@angular/core'; -import { GenericService, mapEach, RequiredParam, Validate } from '@iqser/common-ui'; -import { Observable } from 'rxjs'; +import { Injectable } from '@angular/core'; +import { HeadersConfiguration, mapEach, RequiredParam, Validate } from '@iqser/common-ui'; +import { BehaviorSubject, Observable } from 'rxjs'; import { DossierStats, IDossierStats } from '@red/domain'; +import { HttpClient } from '@angular/common/http'; +import { tap } from 'rxjs/operators'; @Injectable({ providedIn: 'root', }) -export class DossierStatsService extends GenericService { - constructor(protected readonly _injector: Injector) { - super(_injector, 'dossier-stats'); - } +export class DossierStatsService { + private readonly _map = new Map>(); + + constructor(private readonly _http: HttpClient) {} @Validate() getFor(@RequiredParam() dossierIds: string[]): Observable { - return this._post(dossierIds).pipe(mapEach(entity => new DossierStats(entity))); + const request = this._http.post(`/${encodeURI('dossier-stats')}`, dossierIds, { + headers: HeadersConfiguration.getHeaders(), + observe: 'body', + }); + + return request.pipe( + mapEach(entity => new DossierStats(entity)), + tap(entities => entities.forEach(entity => this.set(entity))), + ); } - // @Validate() - // loadFor(@RequiredParam() dossierId: string): Observable { - // return this._getOne([dossierId]).pipe( - // map((entity: IDossierStats) => new DossierStats(entity)), - // tap((entity: DossierStats) => this.replace(entity)), - // ); - // } + get(key: string): DossierStats { + return this._map.get(key)?.value; + } + + set(stats: DossierStats): void { + if (!this._map.has(stats.dossierId)) { + this._map.set(stats.dossierId, new BehaviorSubject(stats)); + } else { + this._map.get(stats.dossierId).next(stats); + } + } + + watch$(key: string): Observable { + return this._map.get(key)?.asObservable(); + } } diff --git a/apps/red-ui/src/app/services/entity-services/dossiers.service.ts b/apps/red-ui/src/app/services/entity-services/dossiers.service.ts index f47af6086..c8c417701 100644 --- a/apps/red-ui/src/app/services/entity-services/dossiers.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dossiers.service.ts @@ -94,7 +94,7 @@ export class DossiersService extends EntitiesService { const stats$ = dossier$.pipe(switchMap(updatedDossier => this._dossierStatsService.getFor([updatedDossier.dossierId]))); return combineLatest([dossier$, stats$]).pipe( - map(([updatedDossier, stats]) => new Dossier(updatedDossier, stats[0])), + map(([updatedDossier]) => new Dossier(updatedDossier)), tap(newDossier => this.replace(newDossier)), catchError(showToast), ); @@ -132,7 +132,7 @@ export class DossiersService extends EntitiesService { entities.forEach(dossier => { dossier.memberIds?.forEach(m => totalPeople.add(m)); - totalAnalyzedPages += dossier.stats.numberOfPages; + totalAnalyzedPages += this._dossierStatsService.get(dossier.dossierId).numberOfPages; }); return { @@ -142,7 +142,7 @@ export class DossiersService extends EntitiesService { } private _generalStats$(entities: List): Observable { - const stats$ = entities.map(entity => entity.stats$); + const stats$ = entities.map(entity => this._dossierStatsService.watch$(entity.dossierId)); return combineLatest(stats$).pipe( filter(stats => stats.every(s => !!s)), map(() => this._computeStats(entities)), diff --git a/apps/red-ui/src/app/state/app-state.service.ts b/apps/red-ui/src/app/state/app-state.service.ts index 3f9b2d296..9deb63428 100644 --- a/apps/red-ui/src/app/state/app-state.service.ts +++ b/apps/red-ui/src/app/state/app-state.service.ts @@ -127,13 +127,12 @@ export class AppStateService { } const dossierIds = dossiers.map(dossier => dossier.dossierId); - const dossierStats = await this._dossierStatsService.getFor(dossierIds).toPromise(); + await this._dossierStatsService.getFor(dossierIds).toPromise(); const mappedDossiers$ = dossiers.map(async p => { const oldDossier = this._dossiersService.find(p.dossierId); const type = oldDossier?.type ?? (await this._getDictionaryFor(p)); - const stats = dossierStats.find(s => s.dossierId === p.dossierId); - this._dossiersService.replace(new Dossier(p, stats, type)); + this._dossiersService.replace(new Dossier(p, type)); }); return Promise.all(mappedDossiers$); } diff --git a/libs/red-domain/src/lib/dossiers/dossier.model.ts b/libs/red-domain/src/lib/dossiers/dossier.model.ts index cff5a0b16..10ad615d7 100644 --- a/libs/red-domain/src/lib/dossiers/dossier.model.ts +++ b/libs/red-domain/src/lib/dossiers/dossier.model.ts @@ -3,8 +3,6 @@ import { IDossier } from './dossier'; import { DossierStatus } from './types'; import { DownloadFileType } from '../shared'; import { IDictionary } from '../dictionaries'; -import { BehaviorSubject, Observable } from 'rxjs'; -import { DossierStats } from '../dossier-stats'; export class Dossier implements IDossier, IListable { readonly dossierId: string; @@ -25,10 +23,7 @@ export class Dossier implements IDossier, IListable { readonly watermarkEnabled: boolean; readonly hasReviewers: boolean; - readonly stats$: Observable; - private readonly _stats$: BehaviorSubject; - - constructor(dossier: IDossier, stats: DossierStats, public type?: IDictionary) { + constructor(dossier: IDossier, public type?: IDictionary) { this.dossierId = dossier.dossierId; this.approverIds = dossier.approverIds; this.date = dossier.date; @@ -46,9 +41,6 @@ export class Dossier implements IDossier, IListable { this.status = dossier.status; this.watermarkEnabled = dossier.watermarkEnabled; this.hasReviewers = !!this.memberIds && this.memberIds.length > 1; - - this._stats$ = new BehaviorSubject(stats); - this.stats$ = this._stats$.asObservable(); } get id(): string { @@ -63,10 +55,6 @@ export class Dossier implements IDossier, IListable { return this.dossierName; } - get stats(): DossierStats { - return this._stats$.getValue(); - } - hasMember(memberId: string): boolean { return !!this.memberIds && this.memberIds.indexOf(memberId) >= 0; }