From 56765ea81ed61508f0b2f2ce65c73b00aea42f40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Fri, 6 May 2022 18:12:51 +0300 Subject: [PATCH] RED-3796: Working downloads & search --- apps/red-ui/src/app/app-routing.module.ts | 34 +++++++++---------- .../table-item/table-item.component.ts | 2 +- .../template-stats.component.html | 8 ++--- .../template-stats.component.scss | 1 + .../dossier-details-stats.component.ts | 6 ++-- ...ossier-overview-screen-header.component.ts | 2 +- .../add-dossier-dialog.component.ts | 2 +- .../edit-dossier-team.component.html | 10 +++--- .../edit-dossier-general-info.component.ts | 2 +- .../dossiers-listing-actions.component.html | 2 +- .../dossiers-listing-actions.component.ts | 2 +- .../table-item/table-item.component.ts | 2 +- .../dossiers-listing/config.service.ts | 4 +-- .../accept-recommendation-dialog.component.ts | 5 +-- .../manual-annotation-dialog.component.ts | 5 +-- .../services/annotation-actions.service.ts | 2 +- .../search-screen/search-screen.component.ts | 12 +++---- .../dictionary-manager.component.ts | 2 +- .../dossiers/active-dossiers.service.ts | 18 ++++++++-- .../dossiers/dossiers-cache.service.ts | 11 +++--- .../platform-search.service.ts | 20 +++++------ .../services/entity-services/trash.service.ts | 2 +- .../src/app/services/permissions.service.ts | 2 +- libs/common-ui | 2 +- .../src/lib/dossiers/dossier.model.ts | 6 ++-- .../src/lib/trash/trash-dossier.model.ts | 5 ++- 26 files changed, 86 insertions(+), 83 deletions(-) diff --git a/apps/red-ui/src/app/app-routing.module.ts b/apps/red-ui/src/app/app-routing.module.ts index e4ae72779..a9c7fc151 100644 --- a/apps/red-ui/src/app/app-routing.module.ts +++ b/apps/red-ui/src/app/app-routing.module.ts @@ -46,6 +46,23 @@ const routes: Routes = [ requiredRoles: ['RED_USER', 'RED_MANAGER'], }, }, + { + path: 'downloads', + component: DownloadsListScreenComponent, + canActivate: [CompositeRouteGuard], + data: { + routeGuards: [AuthGuard, RedRoleGuard], + }, + }, + { + path: 'search', + loadChildren: () => import('./modules/search/search.module').then(m => m.SearchModule), + canActivate: [CompositeRouteGuard], + data: { + routeGuards: [AuthGuard, RedRoleGuard], + requiredRoles: ['RED_USER', 'RED_MANAGER'], + }, + }, { path: `:${DOSSIER_TEMPLATE_ID}`, children: [ @@ -80,23 +97,6 @@ const routes: Routes = [ requiredRoles: ['RED_USER', 'RED_MANAGER'], }, }, - { - path: 'downloads', - component: DownloadsListScreenComponent, - canActivate: [CompositeRouteGuard], - data: { - routeGuards: [AuthGuard, RedRoleGuard], - }, - }, - { - path: 'search', - loadChildren: () => import('./modules/search/search.module').then(m => m.SearchModule), - canActivate: [CompositeRouteGuard], - data: { - routeGuards: [AuthGuard, RedRoleGuard, DossiersGuard], - requiredRoles: ['RED_USER', 'RED_MANAGER'], - }, - }, ], }, { diff --git a/apps/red-ui/src/app/modules/archive/components/table-item/table-item.component.ts b/apps/red-ui/src/app/modules/archive/components/table-item/table-item.component.ts index 84c4bcd65..b978de713 100644 --- a/apps/red-ui/src/app/modules/archive/components/table-item/table-item.component.ts +++ b/apps/red-ui/src/app/modules/archive/components/table-item/table-item.component.ts @@ -22,7 +22,7 @@ export class TableItemComponent implements OnChanges { ngOnChanges() { if (this.dossier) { - this.#ngOnChanges$.next(this.dossier.dossierId); + this.#ngOnChanges$.next(this.dossier.id); } } } 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 1536fe05b..be41704eb 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 @@ -36,20 +36,20 @@ -
+
-
+
{ - await firstValueFrom(this._filesService.loadAll(this.dossier.dossierId)); + await firstValueFrom(this._filesService.loadAll(this.dossier.id)); }); } } diff --git a/apps/red-ui/src/app/modules/dossier-overview/components/screen-header/dossier-overview-screen-header.component.ts b/apps/red-ui/src/app/modules/dossier-overview/components/screen-header/dossier-overview-screen-header.component.ts index 666a68e48..ced3ba7d5 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/components/screen-header/dossier-overview-screen-header.component.ts +++ b/apps/red-ui/src/app/modules/dossier-overview/components/screen-header/dossier-overview-screen-header.component.ts @@ -51,7 +51,7 @@ export class DossierOverviewScreenHeaderComponent implements OnInit { ) {} ngOnInit() { - this.actionConfigs = this.configService.actionConfig(this.dossier.dossierId, this.listingService.areSomeSelected$); + this.actionConfigs = this.configService.actionConfig(this.dossier.id, this.listingService.areSomeSelected$); } async reanalyseDossier() { 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 6bd41503d..b6be00297 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 @@ -77,7 +77,7 @@ export class AddDossierDialogComponent extends BaseDialogComponent { await this._router.navigate([savedDossier.routerLink]); if (options?.addMembers) { this._dialogService.openDialog('editDossier', null, { - dossierId: savedDossier.dossierId, + dossierId: savedDossier.id, section: 'members', }); } diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.html b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.html index de53985b0..c446cf066 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.html +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.html @@ -3,7 +3,7 @@ {{ 'assign-dossier-owner.dialog.single-user' | translate }} - + {{ userId | name }} @@ -11,12 +11,12 @@
-
+
-
+
{ - const stats = this._dossierStatsService.get(dossier.dossierId); + const stats = this._dossierStatsService.get(dossier.id); return stats?.fileCountPerWorkflowStatus[filter.id]; }; private _annotationFilterChecker = (dossier: Dossier, filter: INestedFilter) => { - const stats = this._dossierStatsService.get(dossier.dossierId); + const stats = this._dossierStatsService.get(dossier.id); switch (filter.id) { // case 'analysis': { // return stats.reanalysisRequired; diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/accept-recommendation-dialog/accept-recommendation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/accept-recommendation-dialog/accept-recommendation-dialog.component.ts index a945a3430..a63b328a3 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/accept-recommendation-dialog/accept-recommendation-dialog.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/accept-recommendation-dialog/accept-recommendation-dialog.component.ts @@ -54,10 +54,7 @@ export class AcceptRecommendationDialogComponent extends BaseDialogComponent imp async ngOnInit() { super.ngOnInit(); - this.possibleDictionaries = await this._dictionaryService.getDictionariesOptions( - this._dossier.dossierTemplateId, - this._dossier.dossierId, - ); + this.possibleDictionaries = await this._dictionaryService.getDictionariesOptions(this._dossier.dossierTemplateId, this._dossier.id); this.form.patchValue({ dictionary: this.possibleDictionaries.find(dict => dict.type === this.data.annotations[0].recommendationType).type, }); diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts index 4fc46241b..de35d8d0b 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts @@ -76,10 +76,7 @@ export class ManualAnnotationDialogComponent extends BaseDialogComponent impleme async ngOnInit() { super.ngOnInit(); - this.possibleDictionaries = await this._dictionaryService.getDictionariesOptions( - this._dossier.dossierTemplateId, - this._dossier.dossierId, - ); + this.possibleDictionaries = await this._dictionaryService.getDictionariesOptions(this._dossier.dossierTemplateId, this._dossier.id); const data = await firstValueFrom(this._justificationsService.getForDossierTemplate(this._dossier.dossierTemplateId)); this.legalOptions = data.map(lbm => ({ legalBasis: lbm.reason, diff --git a/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts b/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts index faa35213f..bd202f432 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts @@ -427,7 +427,7 @@ export class AnnotationActionsService { value: text, }; - this._processObsAndEmit(this._manualRedactionService.resizeOrSuggestResize([resizeRequest], data.dossier.dossierId, fileId)); + this._processObsAndEmit(this._manualRedactionService.resizeOrSuggestResize([resizeRequest], data.dossier.id, fileId)); }); } diff --git a/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts b/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts index eed89ea85..6276490ab 100644 --- a/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts +++ b/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts @@ -20,10 +20,9 @@ import { RouterHistoryService } from '@services/router-history.service'; import { Dossier, IMatchedDocument, ISearchListItem, ISearchResponse } from '@red/domain'; import { FilesMapService } from '@services/entity-services/files-map.service'; import { PlatformSearchService } from '@services/entity-services/platform-search.service'; -import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; -import { ArchivedDossiersService } from '@services/dossiers/archived-dossiers.service'; import { FeaturesService } from '@services/features.service'; import { DOSSIERS_ARCHIVE } from '@utils/constants'; +import { DossiersCacheService } from '../../../services/dossiers/dossiers-cache.service'; @Component({ templateUrl: './search-screen.component.html', @@ -66,8 +65,7 @@ export class SearchScreenComponent extends ListingComponent imp protected readonly _injector: Injector, private readonly _activatedRoute: ActivatedRoute, private readonly _loadingService: LoadingService, - private readonly _activeDossiersService: ActiveDossiersService, - private readonly _archivedDossiersService: ArchivedDossiersService, + private readonly _dossiersCacheService: DossiersCacheService, readonly routerHistoryService: RouterHistoryService, private readonly _translateService: TranslateService, private readonly _filesMapService: FilesMapService, @@ -83,13 +81,12 @@ export class SearchScreenComponent extends ListingComponent imp const checked = dossierIds.includes(id); return new NestedFilter({ id, label: dossierName, checked }); }; - const allDossiers = [...this._activeDossiersService.all, ...this._archivedDossiersService.all]; const dossierNameFilter: IFilterGroup = { slug: 'dossiers', label: this._translateService.instant('search-screen.filters.by-dossier'), filterceptionPlaceholder: this._translateService.instant('search-screen.filters.search-placeholder'), icon: 'red:folder', - filters: allDossiers.map(dossierToFilter), + filters: this._dossiersCacheService.all.map(dossierToFilter), checker: keyChecker('dossierId'), }; this.filterService.addFilterGroups([dossierNameFilter]); @@ -166,10 +163,11 @@ export class SearchScreenComponent extends ListingComponent imp }: IMatchedDocument): ISearchListItem { const file = this._filesMapService.get(dossierId, fileId); if (!file) { + console.error('Missing file'); return undefined; } - const dossier = (dossierArchived ? this._archivedDossiersService : this._activeDossiersService).find(dossierId); + const dossier = this._dossiersCacheService.get(dossierId); return { id: fileId, 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 935b36fb6..004482d7f 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 @@ -82,7 +82,7 @@ export class DictionaryManagerComponent implements OnChanges { return; } - this._onDossierChanged(dossier.dossierTemplateId, dossier.dossierId) + this._onDossierChanged(dossier.dossierTemplateId, dossier.id) .pipe(take(1)) .subscribe(entries => { this.diffEditorText = entries; 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 54a4f8d01..817d9e97f 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 @@ -1,16 +1,25 @@ import { Injectable, Injector } from '@angular/core'; -import { switchMap, tap } from 'rxjs/operators'; -import { timer } from 'rxjs'; import { CHANGED_CHECK_INTERVAL, DOSSIERS_ROUTE } from '@utils/constants'; import { DossiersService } from './dossiers.service'; +import { Observable, timer } from 'rxjs'; +import { switchMap, tap } from 'rxjs/operators'; +import { Dossier } from '@red/domain'; @Injectable({ providedIn: 'root', }) export class ActiveDossiersService extends DossiersService { + private _initializedRefresh = false; + constructor(protected readonly _injector: Injector) { super(_injector, 'dossier', DOSSIERS_ROUTE); + } + initializeRefresh() { + if (this._initializedRefresh) { + return; + } + this._initializedRefresh = true; timer(CHANGED_CHECK_INTERVAL, CHANGED_CHECK_INTERVAL) .pipe( switchMap(() => this.loadOnlyChanged()), @@ -18,4 +27,9 @@ export class ActiveDossiersService extends DossiersService { ) .subscribe(); } + + loadAll(): Observable { + this.initializeRefresh(); + return super.loadAll(); + } } diff --git a/apps/red-ui/src/app/services/dossiers/dossiers-cache.service.ts b/apps/red-ui/src/app/services/dossiers/dossiers-cache.service.ts index 72b955c21..76570444b 100644 --- a/apps/red-ui/src/app/services/dossiers/dossiers-cache.service.ts +++ b/apps/red-ui/src/app/services/dossiers/dossiers-cache.service.ts @@ -3,7 +3,6 @@ import { ActiveDossiersService } from './active-dossiers.service'; import { ArchivedDossiersService } from './archived-dossiers.service'; import { firstValueFrom, forkJoin, merge } from 'rxjs'; import { map, skip, take } from 'rxjs/operators'; -import { flatten } from 'lodash-es'; import { Dossier } from '@red/domain'; @Injectable({ @@ -27,23 +26,27 @@ export class DossiersCacheService { return !localStorage.getItem('dossiers'); } + get all(): Dossier[] { + return this._dossiers; + } + async load(): Promise { await firstValueFrom( forkJoin([this._activeDossiersService.loadAll().pipe(take(1)), this._archivedDossiersService.loadAll().pipe(take(1))]).pipe( - map(list => flatten(list)), + map(list => list.flat()), ), ); this.set(); } set(): void { - const dossiers = flatten([this._activeDossiersService.all, this._archivedDossiersService.all]); + const dossiers = [this._activeDossiersService.all, this._archivedDossiersService.all].flat(); this._dossiers = dossiers; localStorage.setItem('dossiers', JSON.stringify(dossiers)); this.changed$.emit(); } get(dossierId: string) { - return this._dossiers.find(dossier => dossier.dossierId === dossierId); + return this._dossiers.find(dossier => dossier.id === dossierId); } } diff --git a/apps/red-ui/src/app/services/entity-services/platform-search.service.ts b/apps/red-ui/src/app/services/entity-services/platform-search.service.ts index a0d03df4f..671a4fdd1 100644 --- a/apps/red-ui/src/app/services/entity-services/platform-search.service.ts +++ b/apps/red-ui/src/app/services/entity-services/platform-search.service.ts @@ -2,20 +2,17 @@ import { Injectable, Injector } from '@angular/core'; import { GenericService } from '@iqser/common-ui'; import { Dossier, IMatchedDocument, ISearchInput, ISearchRequest, ISearchResponse } from '@red/domain'; import { Observable, of, zip } from 'rxjs'; -import { mapTo, switchMap } from 'rxjs/operators'; -import { ActiveDossiersService } from '../dossiers/active-dossiers.service'; +import { map, switchMap } from 'rxjs/operators'; import { FilesMapService } from './files-map.service'; import { FilesService } from './files.service'; -import { ArchivedDossiersService } from '../dossiers/archived-dossiers.service'; -import { DossiersService } from '../dossiers/dossiers.service'; +import { DossiersCacheService } from '../dossiers/dossiers-cache.service'; @Injectable({ providedIn: 'root' }) export class PlatformSearchService extends GenericService { constructor( protected readonly _injector: Injector, private readonly _filesService: FilesService, - private readonly _activeDossiersService: ActiveDossiersService, - private readonly _archivedDossiersService: ArchivedDossiersService, + private readonly _dossiersCacheService: DossiersCacheService, private readonly _filesMapService: FilesMapService, ) { super(_injector, 'search-v2'); @@ -42,17 +39,16 @@ export class PlatformSearchService extends GenericService { return this._post(body).pipe(switchMap(searchValue => this._loadMissingFiles$(searchValue))); } - private _dossiersWithMissingFiles(searchResponse: ISearchResponse, service: DossiersService): Dossier[] { - const documentsOfType = searchResponse.matchedDocuments.filter(document => service.has(document.dossierId)); + private _dossiersWithMissingFiles(searchResponse: ISearchResponse): Dossier[] { + const documentsOfType = searchResponse.matchedDocuments.filter(document => this._dossiersCacheService.get(document.dossierId)); const fileNotLoaded = ({ dossierId, fileId }: IMatchedDocument) => !this._filesMapService.get(dossierId, fileId); const dossiersWithNotLoadedFiles = documentsOfType.filter(fileNotLoaded).map(document => document.dossierId); - return Array.from(new Set(dossiersWithNotLoadedFiles)).map(dossierId => service.find(dossierId)); + return Array.from(new Set(dossiersWithNotLoadedFiles)).map(dossierId => this._dossiersCacheService.get(dossierId)); } private _loadMissingFiles$(searchResponse: ISearchResponse): Observable { - const services = [this._activeDossiersService, this._archivedDossiersService]; - const dossiers = services.map(service => this._dossiersWithMissingFiles(searchResponse, service)).flat(); - return dossiers.length ? this._loadFilesFor$(dossiers).pipe(mapTo(searchResponse)) : of(searchResponse); + const dossiers = this._dossiersWithMissingFiles(searchResponse); + return dossiers.length ? this._loadFilesFor$(dossiers).pipe(map(() => searchResponse)) : of(searchResponse); } private _loadFilesFor$(dossiers: Dossier[]) { 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 e0cf923fb..506a44315 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 @@ -34,7 +34,7 @@ export class TrashService extends GenericService { this._toaster.error(_('dossier-listing.delete.delete-failed'), { params: dossier }); return of({}); }; - return this.delete(dossier.dossierId, 'dossier').pipe( + return this.delete(dossier.id, 'dossier').pipe( switchMap(() => this._activeDossiersService.loadAll()), catchError(showToast), ); diff --git a/apps/red-ui/src/app/services/permissions.service.ts b/apps/red-ui/src/app/services/permissions.service.ts index e7c0fca74..33210687e 100644 --- a/apps/red-ui/src/app/services/permissions.service.ts +++ b/apps/red-ui/src/app/services/permissions.service.ts @@ -33,7 +33,7 @@ export class PermissionsService { } displayReanalyseBtn(dossier: Dossier): boolean { - return this.isApprover(dossier) && !!this._filesMapService.get(dossier.dossierId).find(f => f.analysisRequired); + return this.isApprover(dossier) && !!this._filesMapService.get(dossier.id).find(f => f.analysisRequired); } canUploadFiles(dossier: Dossier): boolean { diff --git a/libs/common-ui b/libs/common-ui index dc9323a0e..224e078b5 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit dc9323a0ec4d2cdc8ffbb31df67995531160462c +Subproject commit 224e078b583a33c1e4a621c071d0a24d2d49d4c6 diff --git a/libs/red-domain/src/lib/dossiers/dossier.model.ts b/libs/red-domain/src/lib/dossiers/dossier.model.ts index b356a4a03..d84139928 100644 --- a/libs/red-domain/src/lib/dossiers/dossier.model.ts +++ b/libs/red-domain/src/lib/dossiers/dossier.model.ts @@ -25,6 +25,7 @@ export class Dossier implements IDossier, IListable { readonly hasReviewers: boolean; readonly routerLink: string; readonly dossiersListRouterLink: string; + readonly id: string; constructor(dossier: IDossier) { this.dossierId = dossier.dossierId; @@ -47,15 +48,12 @@ export class Dossier implements IDossier, IListable { this.archivedTime = dossier.archivedTime; this.hasReviewers = !!this.memberIds && this.memberIds.length > 1; + this.id = this.dossierId; const routerPath = (this.isArchived ? ARCHIVE_ROUTE : DOSSIERS_ROUTE) as string; this.dossiersListRouterLink = `/main/${this.dossierTemplateId}/${routerPath}`; this.routerLink = `${this.dossiersListRouterLink}/${this.dossierId}`; } - get id(): string { - return this.dossierId; - } - get searchKey(): string { return this.dossierName; } diff --git a/libs/red-domain/src/lib/trash/trash-dossier.model.ts b/libs/red-domain/src/lib/trash/trash-dossier.model.ts index fc0d78981..db1b61104 100644 --- a/libs/red-domain/src/lib/trash/trash-dossier.model.ts +++ b/libs/red-domain/src/lib/trash/trash-dossier.model.ts @@ -16,6 +16,7 @@ export class TrashDossier extends TrashItem { readonly dueDate?: string; readonly ownerId: string; readonly softDeletedTime: string; + readonly id: string; constructor( dossier: IDossier, @@ -35,10 +36,8 @@ export class TrashDossier extends TrashItem { // Because of migrations, for some this is not set this.softDeletedTime = dossier.softDeletedTime || '-'; this.canRestore = this.canRestore && this._hasRestoreRights; - } - get id(): string { - return this.dossierId; + this.id = this.dossierId; } get searchKey(): string {