From 15bf3c8eaa93a44c3a32f064539ef5c39fb57334 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Sun, 14 Nov 2021 00:03:17 +0200 Subject: [PATCH] remove files from dossier ctor --- ...dossier-overview-bulk-actions.component.ts | 6 ++-- .../dossier-overview-screen.component.ts | 3 +- .../dossiers-listing-actions.component.html | 9 ++++-- .../dossiers-listing-actions.component.ts | 28 ++++++------------- .../dossiers-listing-screen.component.ts | 1 + .../search-screen/search-screen.component.ts | 4 ++- .../file-drop/file-drop.component.ts | 6 ++-- .../services/file-upload.service.ts | 8 +++--- .../entity-services/dossiers.service.ts | 15 ++-------- .../entity-services/files-map.service.ts | 4 +-- .../src/app/services/notifications.service.ts | 5 +++- .../red-ui/src/app/state/app-state.service.ts | 8 ++++-- .../src/lib/dossiers/dossier.model.ts | 3 +- 13 files changed, 45 insertions(+), 55 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.ts index 9ccc7b34a..090de12f3 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.ts @@ -5,7 +5,7 @@ import { Dossier, File } from '@red/domain'; import { FileActionService } from '../../../../shared/services/file-action.service'; import { Observable } from 'rxjs'; import { DossiersDialogService } from '../../../../services/dossiers-dialog.service'; -import { CircleButtonTypes, ConfirmationDialogInput, ListingService, LoadingService } from '@iqser/common-ui'; +import { CircleButtonTypes, ConfirmationDialogInput, EntitiesService, ListingService, LoadingService } from '@iqser/common-ui'; import { TranslateService } from '@ngx-translate/core'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { LongPressEvent } from '@shared/directives/long-press.directive'; @@ -35,6 +35,7 @@ export class DossierOverviewBulkActionsComponent { private readonly _fileActionService: FileActionService, private readonly _loadingService: LoadingService, private readonly _translateService: TranslateService, + private readonly _entitiesService: EntitiesService, private readonly _listingService: ListingService, private readonly _userPreferenceService: UserPreferenceService, ) {} @@ -44,7 +45,8 @@ export class DossierOverviewBulkActionsComponent { } get areAllFilesSelected() { - return this.dossier.files.length !== 0 && this.selectedFiles.length === this.dossier.files.length; + const allFilesCount = this._entitiesService.all.length; + return allFilesCount !== 0 && this.selectedFiles.length === allFilesCount; } get areSomeFilesSelected() { diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts index 85b26c5a0..33b0f4905 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.ts @@ -109,6 +109,7 @@ export class DossierOverviewScreenComponent extends ListingComponent imple activatedRoute: ActivatedRoute, ) { super(_injector); + this._appStateService.reset(); this.dossierId = activatedRoute.snapshot.paramMap.get('dossierId'); this.actionConfigs = this._configService.actionConfig(this.dossierId); this.dossier$ = this._dossiersService.getEntityChanged$(this.dossierId); @@ -311,7 +312,7 @@ export class DossierOverviewScreenComponent extends ListingComponent imple } private async _uploadFiles(files: FileUploadModel[]) { - const fileCount = await this._fileUploadService.uploadFiles(files); + const fileCount = await this._fileUploadService.uploadFiles(files, this.dossierId); if (fileCount) { this._statusOverlayService.openUploadStatusOverlay(); } diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.html index 1e253bfff..a1d5d69c9 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.html @@ -1,4 +1,5 @@ - + +
- +
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.ts index d97d37ac6..4b7743be9 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-actions/dossiers-listing-actions.component.ts @@ -3,10 +3,11 @@ import { PermissionsService } from '@services/permissions.service'; import { CircleButtonTypes, StatusBarConfig } from '@iqser/common-ui'; import { UserService } from '@services/user.service'; import { AppStateService } from '@state/app-state.service'; -import { Dossier, StatusSorter } from '@red/domain'; +import { Dossier, DossierStats, StatusSorter } from '@red/domain'; import { DossiersDialogService } from '../../../../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'; @Component({ selector: 'redaction-dossiers-listing-actions', @@ -24,31 +25,18 @@ export class DossiersListingActionsComponent { @Output() readonly actionPerformed = new EventEmitter(); constructor( - readonly permissionsService: PermissionsService, readonly appStateService: AppStateService, - private readonly _dialogService: DossiersDialogService, private readonly _userService: UserService, + readonly permissionsService: PermissionsService, + readonly filesMapService: FilesMapService, + private readonly _dialogService: DossiersDialogService, private readonly _userPreferenceService: UserPreferenceService, ) {} - get statusConfig(): readonly StatusBarConfig[] { - if (!this.dossier) { - return []; - } - - const obj = this.dossier.files.reduce((acc, file) => { - const status = file.status; - if (!acc[status]) { - acc[status] = 1; - } else { - acc[status]++; - } - return acc; - }, {}); - - return Object.keys(obj) + statusConfig(stats: DossierStats): readonly StatusBarConfig[] { + return Object.keys(stats.fileCountPerWorkflowStatus) .sort(StatusSorter.byStatus) - .map(status => ({ length: obj[status], color: status })); + .map(status => ({ length: stats.fileCountPerWorkflowStatus[status], color: status })); } forceReanalysisAction($event: LongPressEvent) { diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/screen/dossiers-listing-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/screen/dossiers-listing-screen.component.ts index ab35a2aa2..bfe5c87e3 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/screen/dossiers-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/screen/dossiers-listing-screen.component.ts @@ -63,6 +63,7 @@ export class DossiersListingScreenComponent private readonly _filesService: FilesService, ) { super(_injector); + this._appStateService.reset(); } ngOnInit(): void { diff --git a/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts index 8fe5e62c3..35daad415 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts @@ -21,6 +21,7 @@ import { RouterHistoryService } from '@services/router-history.service'; import { DossiersService } from '@services/entity-services/dossiers.service'; import { PlatformSearchService } from '../../shared/services/platform-search.service'; import { Dossier, IMatchedDocument, ISearchInput, ISearchListItem, ISearchResponse } from '@red/domain'; +import { FilesMapService } from '@services/entity-services/files-map.service'; function toSearchInput(query: string, dossierIds: List | string): ISearchInput { return { @@ -66,6 +67,7 @@ export class SearchScreenComponent extends ListingComponent imp private readonly _dossiersService: DossiersService, readonly routerHistoryService: RouterHistoryService, private readonly _translateService: TranslateService, + private readonly _filesMapService: FilesMapService, private readonly _platformSearchService: PlatformSearchService, ) { super(_injector); @@ -127,7 +129,7 @@ export class SearchScreenComponent extends ListingComponent imp } private _toListItem({ dossierId, fileId, unmatchedTerms, highlights, score }: IMatchedDocument): ISearchListItem { - const file = this._dossiersService.find(dossierId, fileId); + const file = this._filesMapService.get(dossierId, fileId); if (!file) { return undefined; } diff --git a/apps/red-ui/src/app/modules/upload-download/file-drop/file-drop.component.ts b/apps/red-ui/src/app/modules/upload-download/file-drop/file-drop.component.ts index e02e1310d..4df48a628 100644 --- a/apps/red-ui/src/app/modules/upload-download/file-drop/file-drop.component.ts +++ b/apps/red-ui/src/app/modules/upload-download/file-drop/file-drop.component.ts @@ -35,9 +35,7 @@ export class FileDropComponent { @HostListener('drop', ['$event']) onDrop(event: DragEvent) { - const dossierId = this._activatedRoute.snapshot.paramMap.get('dossierId'); - console.log(dossierId); - handleFileDrop(event, this._dossiersService.find(dossierId), this.uploadFiles.bind(this)); + handleFileDrop(event, this._dossiersService.activeDossier, this.uploadFiles.bind(this)); } @HostListener('dragover', ['$event']) @@ -47,7 +45,7 @@ export class FileDropComponent { } async uploadFiles(files: FileUploadModel[]) { - const fileCount = await this._fileUploadService.uploadFiles(files); + const fileCount = await this._fileUploadService.uploadFiles(files, this._dossiersService.activeDossierId); if (fileCount) { this._statusOverlayService.openUploadStatusOverlay(); } diff --git a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts index 46d233762..b81c09c84 100644 --- a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts +++ b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts @@ -9,7 +9,7 @@ import { UploadDownloadDialogService } from './upload-download-dialog.service'; import { IFileUploadResult } from '@red/domain'; import { isCsv } from '@utils/file-drop-utils'; import { ErrorMessageService, GenericService, HeadersConfiguration, RequiredParam, Validate } from '@iqser/common-ui'; -import { DossiersService } from '@services/entity-services/dossiers.service'; +import { FilesMapService } from '@services/entity-services/files-map.service'; export interface ActiveUpload { subscription: Subscription; @@ -28,7 +28,7 @@ export class FileUploadService extends GenericService { constructor( private readonly _appStateService: AppStateService, - private readonly _dossiersService: DossiersService, + private readonly _filesMapService: FilesMapService, private readonly _applicationRef: ApplicationRef, private readonly _translateService: TranslateService, private readonly _configService: ConfigService, @@ -55,10 +55,10 @@ export class FileUploadService extends GenericService { } } - async uploadFiles(files: FileUploadModel[]): Promise { + async uploadFiles(files: FileUploadModel[], dossierId?: string): Promise { const maxSizeMB = this._configService.values.MAX_FILE_SIZE_MB; const maxSizeBytes = maxSizeMB * 1024 * 1024; - const dossierFiles = this._dossiersService.activeDossier.files; + const dossierFiles = this._filesMapService.get(dossierId); let option: 'overwrite' | 'skip'; for (let idx = 0; idx < files.length; ++idx) { const file = files[idx]; 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 aea9f90c1..f47af6086 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 @@ -1,6 +1,6 @@ import { Injectable, Injector } from '@angular/core'; import { EntitiesService, List, QueryParam, RequiredParam, shareLast, Toaster, Validate } from '@iqser/common-ui'; -import { Dossier, File, IDossier, IDossierRequest } from '@red/domain'; +import { Dossier, IDossier, IDossierRequest } from '@red/domain'; import { catchError, filter, map, switchMap, tap } from 'rxjs/operators'; import { BehaviorSubject, combineLatest, Observable, of, throwError } from 'rxjs'; import { ActivationEnd, Router } from '@angular/router'; @@ -58,10 +58,6 @@ export class DossiersService extends EntitiesService { }); } - get allFiles(): File[] { - return this.all.reduce((acc: File[], { files }) => [...acc, ...files], []); - } - get activeDossier(): Dossier | undefined { return this._activeDossier$.value; } @@ -70,13 +66,6 @@ export class DossiersService extends EntitiesService { return this._activeDossier$.value?.dossierId; } - find(dossierId: string): Dossier | undefined; - find(dossierId: string, fileId: string): File | undefined; - find(dossierId: string, fileId?: string): Dossier | File | undefined { - const dossier = super.find(dossierId); - return fileId ? dossier?.files.find(file => file.fileId === fileId) : dossier; - } - replace(newDossier: Dossier) { super.replace(newDossier); if (newDossier.dossierId === this.activeDossierId) { @@ -105,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, stats]) => new Dossier(updatedDossier, stats[0])), tap(newDossier => this.replace(newDossier)), catchError(showToast), ); diff --git a/apps/red-ui/src/app/services/entity-services/files-map.service.ts b/apps/red-ui/src/app/services/entity-services/files-map.service.ts index 14e1aec82..d7c102db0 100644 --- a/apps/red-ui/src/app/services/entity-services/files-map.service.ts +++ b/apps/red-ui/src/app/services/entity-services/files-map.service.ts @@ -20,12 +20,12 @@ export class FilesMapService { return this._map.has(dossierId); } - get(key: string): File[] | undefined; + get(key: string): File[]; get(key: string, id: string): File | undefined; get(key: string, id?: string): File | File[] | undefined { const value = this._map.get(key)?.value; if (!id) { - return value; + return value ?? []; } return value?.find(item => item.id === id); } diff --git a/apps/red-ui/src/app/services/notifications.service.ts b/apps/red-ui/src/app/services/notifications.service.ts index 7563f5dca..56ee31c01 100644 --- a/apps/red-ui/src/app/services/notifications.service.ts +++ b/apps/red-ui/src/app/services/notifications.service.ts @@ -9,6 +9,7 @@ import { notificationsTranslations } from '../translations/notifications-transla import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DossiersService } from '@services/entity-services/dossiers.service'; import { UserService } from '@services/user.service'; +import { FilesMapService } from '@services/entity-services/files-map.service'; @Injectable({ providedIn: 'root', @@ -19,6 +20,7 @@ export class NotificationsService extends GenericService { private readonly _translateService: TranslateService, private readonly _dossiersService: DossiersService, private readonly _userService: UserService, + private readonly _filesMapService: FilesMapService, ) { super(_injector, 'notification'); } @@ -61,7 +63,8 @@ export class NotificationsService extends GenericService { const fileId = notification.target.fileId; const dossierId = notification.target.dossierId; const dossier = this._dossiersService.find(dossierId); - const file = dossier?.files?.find(f => f.fileId === fileId); + const files = this._filesMapService.get(dossierId); + const file = files?.find(f => f.fileId === fileId); return this._translateService.instant(translation, { fileHref: file?.routerLink, 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 e14833f65..b0eb7a1ee 100644 --- a/apps/red-ui/src/app/state/app-state.service.ts +++ b/apps/red-ui/src/app/state/app-state.service.ts @@ -87,6 +87,9 @@ export class AppStateService { } get activeFile(): File | undefined { + if (!this.activeFileId) { + return; + } return this._filesMapService.get(this._dossiersService.activeDossierId, this.activeFileId); } @@ -135,8 +138,7 @@ export class AppStateService { const oldDossier = this._dossiersService.find(p.dossierId); const type = oldDossier?.type ?? (await this._getDictionaryFor(p)); const stats = dossierStats.find(s => s.dossierId === p.dossierId); - console.log(stats); - this._dossiersService.replace(new Dossier(p, stats, [], type)); + this._dossiersService.replace(new Dossier(p, stats, type)); }); return Promise.all(mappedDossiers$); } @@ -472,7 +474,7 @@ export class AppStateService { } private async _updateLastActiveFileForDossier(dossierId: string, fileId: string) { - this._dossiersService.activeDossier.files.forEach(f => { + this._filesMapService.get(dossierId).forEach(f => { f.lastOpened = f.fileId === fileId; }); diff --git a/libs/red-domain/src/lib/dossiers/dossier.model.ts b/libs/red-domain/src/lib/dossiers/dossier.model.ts index a27ed0246..cff5a0b16 100644 --- a/libs/red-domain/src/lib/dossiers/dossier.model.ts +++ b/libs/red-domain/src/lib/dossiers/dossier.model.ts @@ -1,4 +1,3 @@ -import { File } from '../files'; import { IListable, List } from '@iqser/common-ui'; import { IDossier } from './dossier'; import { DossierStatus } from './types'; @@ -29,7 +28,7 @@ export class Dossier implements IDossier, IListable { readonly stats$: Observable; private readonly _stats$: BehaviorSubject; - constructor(dossier: IDossier, stats: DossierStats, readonly files: List = [], public type?: IDictionary) { + constructor(dossier: IDossier, stats: DossierStats, public type?: IDictionary) { this.dossierId = dossier.dossierId; this.approverIds = dossier.approverIds; this.date = dossier.date;