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 {