Prepare for dossier changes check

This commit is contained in:
Adina Țeudan 2021-11-18 16:11:02 +02:00
parent f86f75953e
commit 3afaedd878
6 changed files with 37 additions and 26 deletions

View File

@ -34,7 +34,7 @@ import { PdfViewerUtils } from '../../utils/pdf-viewer.utils';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { ActivatedRoute } from '@angular/router';
import { toPosition } from '../../utils/pdf-calculation.utils';
import { DossiersService } from '../../../../services/entity-services/dossiers.service';
import { DossiersService } from '@services/entity-services/dossiers.service';
import Tools = Core.Tools;
import TextTool = Tools.TextTool;
import Annotation = Core.Annotations.Annotation;

View File

@ -1,7 +1,7 @@
import { Component, Input, OnChanges } from '@angular/core';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { AppStateService } from '@state/app-state.service';
import { DossiersService } from '../../../../services/entity-services/dossiers.service';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { File } from '@red/domain';
@Component({

View File

@ -1,7 +1,7 @@
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { AppStateService } from '@state/app-state.service';
import { File } from '@red/domain';
import { DossiersService } from '../../../../../../../services/entity-services/dossiers.service';
import { DossiersService } from '@services/entity-services/dossiers.service';
@Component({
selector: 'redaction-file-workload-column',

View File

@ -12,7 +12,8 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { ConfigService } from '../config.service';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { FilesService } from '@services/entity-services/files.service';
import { DossierTemplatesService } from '../../../../../services/entity-services/dossier-templates.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { switchMap, tap } from 'rxjs/operators';
@Component({
templateUrl: './dossiers-listing-screen.component.html',
@ -59,10 +60,12 @@ export class DossiersListingScreenComponent extends ListingComponent<Dossier> im
ngOnInit(): void {
this.computeAllFilters();
this.addSubscription = timer(0, 20000).subscribe(async () => {
await this._dossiersService.loadAll().toPromise();
this.computeAllFilters();
});
this.addSubscription = timer(20000, 20000)
.pipe(
switchMap(() => this._dossiersService.loadAll()),
tap(() => this.computeAllFilters()),
)
.subscribe();
}
ngOnAttach(): void {

View File

@ -1,8 +1,8 @@
import { Injectable, Injector } from '@angular/core';
import { EntitiesService, List, mapEach, QueryParam, RequiredParam, shareLast, Toaster, Validate } from '@iqser/common-ui';
import { EntitiesService, List, QueryParam, RequiredParam, shareLast, Toaster, Validate } from '@iqser/common-ui';
import { Dossier, IDossier, IDossierRequest } from '@red/domain';
import { catchError, filter, map, switchMap, tap, withLatestFrom } from 'rxjs/operators';
import { combineLatest, Observable, of, throwError } from 'rxjs';
import { catchError, filter, map, mapTo, switchMap, tap } from 'rxjs/operators';
import { combineLatest, iif, Observable, of, throwError } from 'rxjs';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { HttpErrorResponse } from '@angular/common/http';
import { DossierStatsService } from '@services/entity-services/dossier-stats.service';
@ -20,6 +20,7 @@ const GENERIC_MGS = _('add-dossier-dialog.errors.generic');
})
export class DossiersService extends EntitiesService<Dossier, IDossier> {
readonly generalStats$ = this.all$.pipe(switchMap(entities => this._generalStats$(entities)));
private _lastCheckedForChanges = '0';
constructor(
private readonly _toaster: Toaster,
@ -29,18 +30,25 @@ export class DossiersService extends EntitiesService<Dossier, IDossier> {
super(_injector, Dossier, 'dossier');
}
loadAll(modelPath: string = this._defaultModelPath, queryParams?: List<QueryParam>): Observable<Dossier[]> {
const req$ = super.loadAll(modelPath, queryParams).pipe(shareLast());
const getStats$ = req$.pipe(
mapEach(dossier => dossier.dossierId),
switchMap(ids => this._dossierStatsService.getFor(ids)),
private get _hasChanges$(): Observable<boolean> {
return this._post<{ value: boolean }>({ since: this._lastCheckedForChanges }, `${this._defaultModelPath}/changes`).pipe(
map(res => res.value),
tap(() => this._updateLastChanged()),
);
return getStats$.pipe(
withLatestFrom(req$),
map(([, dossiers]) => dossiers),
}
loadAll(): Observable<Dossier[]> {
const dossierIds = (dossiers: Dossier[]) => dossiers.map(d => d.dossierId);
return super.loadAll().pipe(
tap(() => this._updateLastChanged()),
switchMap(dossiers => this._dossierStatsService.getFor(dossierIds(dossiers)).pipe(mapTo(dossiers))),
);
}
loadAllIfChanged(): Observable<boolean> {
return this._hasChanges$.pipe(switchMap(changed => iif(() => changed, this.loadAll()).pipe(mapTo(changed))));
}
@Validate()
createOrUpdate(@RequiredParam() dossier: IDossierRequest): Observable<Dossier | undefined> {
const showToast = (error: HttpErrorResponse) => {
@ -48,12 +56,8 @@ export class DossiersService extends EntitiesService<Dossier, IDossier> {
return throwError(error);
};
const dossier$ = this._post(dossier).pipe(shareLast());
const stats$ = dossier$.pipe(switchMap(updatedDossier => this._dossierStatsService.getFor([updatedDossier.dossierId])));
return combineLatest([dossier$, stats$]).pipe(
map(([updatedDossier]) => new Dossier(updatedDossier)),
tap(newDossier => this.replace([newDossier])),
return this._post(dossier).pipe(
switchMap(newDossier => this.loadAll().pipe(map(() => this.find(newDossier.dossierId)))),
catchError(showToast),
);
}
@ -84,6 +88,10 @@ export class DossiersService extends EntitiesService<Dossier, IDossier> {
return super.delete(body, 'deleted-dossiers/hard-delete', body).toPromise();
}
private _updateLastChanged(): void {
this._lastCheckedForChanges = new Date().toISOString();
}
private _computeStats(entities: List<Dossier>): IDossiersStats {
let totalAnalyzedPages = 0;
const totalPeople = new Set<string>();

View File

@ -31,7 +31,7 @@ export class AppStateGuard implements CanActivate {
}
if (this._userService.currentUser.isUser) {
await this._dossiersService.loadAllIfEmpty();
await this._dossiersService.loadAll().toPromise();
}
const { dossierId, fileId, dossierTemplateId, type } = route.params;