From 59b9e694587ecf959feb8342f439f0201dd316f9 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Mon, 22 Nov 2021 11:17:23 +0200 Subject: [PATCH] remove files related methods from app state --- .../src/app/guards/dossier-files-guard.ts | 7 +-- .../team-members-manager.component.html | 2 + ...dit-dossier-deleted-documents.component.ts | 4 +- .../dossier-details-stats.component.html | 12 ++--- .../dossier-details-stats.component.ts | 30 +++++------- .../dossier-details.component.html | 12 +---- .../dossier-details.component.ts | 9 +--- .../file-name-column.component.html | 6 +-- .../file-name-column.component.ts | 23 ++++++++- .../table-item/table-item.component.html | 2 +- .../table-item/table-item.component.ts | 1 + .../dossier-overview-screen.component.html | 17 +++---- .../dossier-overview-screen.component.ts | 5 +- .../file-preview-screen.component.ts | 14 +++--- .../file-actions/file-actions.component.ts | 15 ++++-- .../services/platform-search.service.ts | 7 ++- .../team-members/team-members.component.html | 6 ++- .../team-members/team-members.component.ts | 12 +++-- .../services/file-upload.service.ts | 6 +-- .../entity-services/files-map.service.ts | 3 -- .../services/entity-services/files.service.ts | 31 ++++++++++-- apps/red-ui/src/app/state/app-state.guard.ts | 4 -- .../red-ui/src/app/state/app-state.service.ts | 47 +------------------ libs/red-domain/src/lib/files/file.model.ts | 15 +----- 24 files changed, 129 insertions(+), 161 deletions(-) diff --git a/apps/red-ui/src/app/guards/dossier-files-guard.ts b/apps/red-ui/src/app/guards/dossier-files-guard.ts index fc849eb96..140d3ee0e 100644 --- a/apps/red-ui/src/app/guards/dossier-files-guard.ts +++ b/apps/red-ui/src/app/guards/dossier-files-guard.ts @@ -5,6 +5,7 @@ import { BreadcrumbsService } from '../services/breadcrumbs.service'; import { pluck } from 'rxjs/operators'; import { AppStateService } from '../state/app-state.service'; import { FilesMapService } from '../services/entity-services/files-map.service'; +import { FilesService } from '@services/entity-services/files.service'; @Injectable({ providedIn: 'root' }) export class DossierFilesGuard implements CanActivate, CanDeactivate { @@ -13,20 +14,20 @@ export class DossierFilesGuard implements CanActivate, CanDeactivate { private readonly _appStateService: AppStateService, private readonly _breadcrumbsService: BreadcrumbsService, private readonly _filesMapService: FilesMapService, + private readonly _filesService: FilesService, private readonly _router: Router, ) {} async canActivate(route: ActivatedRouteSnapshot): Promise { const dossierId = route.paramMap.get('dossierId'); - const dossier = this._dossiersService.find(dossierId); - if (!dossier) { + if (!this._dossiersService.has(dossierId)) { await this._router.navigate(['/main', 'dossiers']); return false; } if (!this._filesMapService.has(dossierId)) { - await this._appStateService.getFiles(dossier); + await this._filesService.loadAll(dossierId).toPromise(); } this._breadcrumbsService.append({ diff --git a/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.html b/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.html index e48a1fc4a..0dc4ec35f 100644 --- a/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.html +++ b/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.html @@ -14,6 +14,7 @@ (remove)="toggleSelected($event)" [canAdd]="false" [canRemove]="true" + [dossierId]="dossier.dossierId" [largeSpacing]="true" [memberIds]="selectedApproversList" [perLine]="13" @@ -27,6 +28,7 @@ (remove)="toggleSelected($event)" [canAdd]="false" [canRemove]="true" + [dossierId]="dossier.dossierId" [largeSpacing]="true" [memberIds]="selectedReviewers$ | async" [perLine]="13" diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/deleted-documents/edit-dossier-deleted-documents.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/deleted-documents/edit-dossier-deleted-documents.component.ts index 1ef89bd72..d194efffe 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/deleted-documents/edit-dossier-deleted-documents.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/deleted-documents/edit-dossier-deleted-documents.component.ts @@ -19,7 +19,6 @@ import { getLeftDateTime } from '@utils/functions'; import { Observable } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; import { DossiersDialogService } from '../../../services/dossiers-dialog.service'; -import { AppStateService } from '@state/app-state.service'; import { FilesService } from '@services/entity-services/files.service'; import { FileManagementService } from '../../../shared/services/file-management.service'; @@ -56,7 +55,6 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent f.fileId); await this._fileManagementService.restore(fileIds, this.dossier.id).toPromise(); this._removeFromList(fileIds); - await this._appStateService.reloadDossierFiles(files[0].dossierId); + await this._filesService.loadAll(files[0].dossierId).toPromise(); this.updateDossier.emit(); } 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 d350e144d..48e260639 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 @@ -34,15 +34,15 @@
- {{ dossierTemplate(dossier).name }} + {{ dossierTemplateName }}
- -
+
- - {{ file.primaryAttribute }} + + {{ primaryAttribute }}
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/table-item/file-name-column/file-name-column.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/table-item/file-name-column/file-name-column.component.ts index bc764a9c7..dbb49eea1 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/table-item/file-name-column/file-name-column.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/table-item/file-name-column/file-name-column.component.ts @@ -1,5 +1,6 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; import { File } from '@red/domain'; +import { FileAttributesService } from '@services/entity-services/file-attributes.service'; @Component({ selector: 'redaction-file-name-column', @@ -7,6 +8,24 @@ import { File } from '@red/domain'; styleUrls: ['./file-name-column.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class FileNameColumnComponent { +export class FileNameColumnComponent implements OnChanges { @Input() file: File; + @Input() dossierTemplateId: string; + primaryAttribute: string; + + constructor(private readonly _fileAttributesService: FileAttributesService) {} + + ngOnChanges() { + const fileAttributesConfig = this._fileAttributesService.getFileAttributeConfig(this.dossierTemplateId); + if (fileAttributesConfig) { + const primary = fileAttributesConfig.fileAttributeConfigs?.find(c => c.primaryAttribute); + if (primary && this.file.fileAttributes?.attributeIdToValue) { + this.primaryAttribute = this.file.fileAttributes?.attributeIdToValue[primary.id]; + } + + if (!this.primaryAttribute) { + this.primaryAttribute = '-'; + } + } + } } diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/table-item/table-item.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/table-item/table-item.component.html index 1a9f75c89..a0a4be767 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/table-item/table-item.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/table-item/table-item.component.html @@ -1,5 +1,5 @@
- +
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/table-item/table-item.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/table-item/table-item.component.ts index d7bfd0034..97c1df33a 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/table-item/table-item.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/table-item/table-item.component.ts @@ -11,5 +11,6 @@ import { Required } from '@iqser/common-ui'; export class TableItemComponent { @Input() @Required() file!: File; @Input() @Required() displayedAttributes!: IFileAttributeConfig[]; + @Input() dossierTemplateId: string; @Output() readonly calculateData = new EventEmitter(); } diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.html index f95dc48ab..973b7739c 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.html @@ -56,6 +56,15 @@ + + + + @@ -64,14 +73,6 @@ - - - - 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 7b226b0c4..724fbb019 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 @@ -46,7 +46,6 @@ import { DossierTemplatesService } from '@services/entity-services/dossier-templ import { LongPressEvent } from '@shared/directives/long-press.directive'; import { UserPreferenceService } from '@services/user-preference.service'; import { FilesMapService } from '@services/entity-services/files-map.service'; -import { DossierStatsService } from '@services/entity-services/dossier-stats.service'; import { FilesService } from '@services/entity-services/files.service'; @Component({ @@ -94,7 +93,6 @@ export class DossierOverviewScreenComponent extends ListingComponent imple readonly configService: ConfigService, private readonly _userPreferenceService: UserPreferenceService, private readonly _fileMapService: FilesMapService, - private readonly _dossierStatsService: DossierStatsService, activatedRoute: ActivatedRoute, ) { super(_injector); @@ -205,8 +203,7 @@ export class DossierOverviewScreenComponent extends ListingComponent imple } async reloadFiles() { - await this._appStateService.getFiles(this.currentDossier); - await this._dossierStatsService.getFor([this.dossierId]).toPromise(); + await this._filesService.loadAll(this.dossierId).toPromise(); this._computeAllFilters(); } diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts index 896d62199..e80f35094 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts @@ -367,7 +367,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni response.manualRedactionEntryWrapper.rectId, ); this._instance.Core.annotationManager.deleteAnnotation(annotation); - await this.appStateService.reloadFile(this.dossierId, this.fileId); + await this._filesService.reload(this.dossierId, this.fileId); const distinctPages = manualRedactionEntryWrapper.manualRedactionEntry.positions .map(p => p.page) .filter((item, pos, self) => self.indexOf(item) === pos); @@ -475,11 +475,11 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni case 'reanalyse': await this._loadFileData(true); this._updateCanPerformActions(); - await this.appStateService.reloadDossierFiles(this.dossierId); + await this._filesService.loadAll(this.dossierId).toPromise(); return; case 'exclude-pages': - await this.appStateService.reloadDossierFiles(this.dossierId); + await this._filesService.loadAll(this.dossierId).toPromise(); await this._loadFileData(true); this._cleanupAndRedrawManualAnnotations$(); await this._stampPDF(); @@ -508,7 +508,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni async assignToMe(file: File) { await this._fileActionService.assignToMe([file], async () => { - await this.appStateService.reloadFile(this.dossierId, this.fileId); + await this._filesService.reload(this.dossierId, this.fileId); this._updateCanPerformActions(); }); } @@ -521,7 +521,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni await this._filesService.setReviewerFor([fileId], dossierId, reviewerId).toPromise(); this._toaster.info(_('assignment.reviewer'), { params: { reviewerName, filename } }); - await this.appStateService.reloadFile(this.dossierId, this.fileId); + await this._filesService.reload(this.dossierId, this.fileId); this._updateCanPerformActions(); this.editingReviewer = false; } @@ -617,7 +617,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni private _subscribeToFileUpdates(): void { this.addSubscription = timer(0, 5000) - .pipe(switchMap(() => this.appStateService.reloadFile(this.dossierId, this.fileId))) + .pipe(switchMap(() => this._filesService.reload(this.dossierId, this.fileId))) .subscribe(); this.addSubscription = this._filesMapService.fileReanalysed$ .pipe(filter(file => file.fileId === this.fileId)) @@ -679,7 +679,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni const currentPageAnnotations = this.annotations.filter(a => a.pageNumber === page); const currentPageAnnotationIds = currentPageAnnotations.map(a => a.id); - await this.appStateService.reloadFile(this.dossierId, this.fileId); + await this._filesService.reload(this.dossierId, this.fileId); this.fileData.redactionLog = await this._fileDownloadService.loadRedactionLogFor(this.dossierId, this.fileId).toPromise(); this.rebuildFilters(); diff --git a/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts b/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts index 17e7bf8ac..313523ef5 100644 --- a/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts +++ b/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts @@ -20,6 +20,7 @@ import { LongPressEvent } from '@shared/directives/long-press.directive'; import { FileActionService } from '../../services/file-action.service'; import { DossiersService } from '@services/entity-services/dossiers.service'; import { FileManagementService } from '../../services/file-management.service'; +import { FilesService } from '@services/entity-services/files.service'; @Component({ selector: 'redaction-file-actions', @@ -70,6 +71,7 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnDestroy, private readonly _fileActionService: FileActionService, private readonly _loadingService: LoadingService, private readonly _fileManagementService: FileManagementService, + private readonly _filesService: FilesService, private readonly _userService: UserService, private readonly _toaster: Toaster, private readonly _userPreferenceService: UserPreferenceService, @@ -117,7 +119,7 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnDestroy, .catch(error => { this._toaster.error(_('error.http.generic'), { params: error }); }); - await this.appStateService.reloadDossierFiles(this.file.dossierId); + await this._filesService.loadAll(this.file.dossierId).toPromise(); this.actionPerformed.emit('delete'); this._loadingService.stop(); }, @@ -191,14 +193,17 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnDestroy, } reloadFiles(action: string) { - this.appStateService.getFiles(this.dossiersService.find(this.file.dossierId)).then(() => { - this.actionPerformed.emit(action); - }); + this._filesService + .loadAll(this.file.dossierId) + .toPromise() + .then(() => { + this.actionPerformed.emit(action); + }); } async toggleAnalysis() { await this._fileActionService.toggleAnalysis(this.file).toPromise(); - await this.appStateService.getFiles(this.dossiersService.find(this.file.dossierId)); + await this._filesService.loadAll(this.file.dossierId).toPromise(); this.actionPerformed.emit(this.file?.excluded ? 'enable-analysis' : 'disable-analysis'); } diff --git a/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts b/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts index 4ca679922..d47b466c4 100644 --- a/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts +++ b/apps/red-ui/src/app/modules/dossier/shared/services/platform-search.service.ts @@ -3,15 +3,15 @@ import { GenericService } from '@iqser/common-ui'; import { IMatchedDocument, ISearchInput, ISearchRequest, ISearchResponse } from '@red/domain'; import { Observable, of, zip } from 'rxjs'; import { mapTo, switchMap } from 'rxjs/operators'; -import { AppStateService } from '@state/app-state.service'; import { DossiersService } from '@services/entity-services/dossiers.service'; import { FilesMapService } from '@services/entity-services/files-map.service'; +import { FilesService } from '@services/entity-services/files.service'; @Injectable() export class PlatformSearchService extends GenericService { constructor( protected readonly _injector: Injector, - private readonly _appStateService: AppStateService, + private readonly _filesService: FilesService, private readonly _dossiersService: DossiersService, private readonly _filesMapService: FilesMapService, ) { @@ -47,7 +47,6 @@ export class PlatformSearchService extends GenericService { } private _loadFilesFor$(dossierIds: string[]) { - const dossiers = dossierIds.map(dossierId => this._dossiersService.find(dossierId)); - return zip(...dossiers.map(dossier => this._appStateService.getFiles(dossier))); + return zip(...dossierIds.map(dossierId => this._filesService.loadAll(dossierId))); } } diff --git a/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.html b/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.html index 06964777e..8750487ff 100644 --- a/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.html +++ b/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.html @@ -7,15 +7,18 @@ class="member" > +
+
+{{ overflowCount }}
+
+
diff --git a/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts b/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts index 1e24ef746..fc3d0f8e0 100644 --- a/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts @@ -1,6 +1,7 @@ import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { CircleButtonTypes, List } from '@iqser/common-ui'; import { UserService } from '@services/user.service'; +import { DossiersDialogService } from '../../../dossier/services/dossiers-dialog.service'; @Component({ selector: 'redaction-team-members', @@ -13,18 +14,18 @@ export class TeamMembersComponent { @Input() memberIds: List; @Input() perLine: number; + @Input() dossierId: string; @Input() canAdd = true; @Input() largeSpacing = false; @Input() canRemove = false; @Input() unremovableMembers: string[] = []; - @Output() openAssignDossierMembersDialog = new EventEmitter(); @Output() remove = new EventEmitter(); - @ViewChild('container', { static: true }) container: ElementRef; + @ViewChild('container', { static: true }) readonly container: ElementRef; expandedTeam = false; - constructor(private readonly _userService: UserService) {} + constructor(private readonly _userService: UserService, private readonly _dialogService: DossiersDialogService) {} get maxTeamMembersBeforeExpand(): number { return this.perLine - (this.canAdd ? 1 : 0); @@ -45,4 +46,9 @@ export class TeamMembersComponent { canRemoveMember(userId: string) { return this.canRemove && this.unremovableMembers.indexOf(userId) === -1; } + + openEditDossierDialog(): void { + const data = { dossierId: this.dossierId, section: 'members' }; + this._dialogService.openDialog('editDossier', null, data); + } } 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 880abbc58..ccf57e725 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 @@ -1,6 +1,5 @@ import { ApplicationRef, Injectable, Injector, OnDestroy } from '@angular/core'; import { FileUploadModel } from '../model/file-upload.model'; -import { AppStateService } from '@state/app-state.service'; import { HttpErrorResponse, HttpEventType } from '@angular/common/http'; import { interval, Subject, Subscription } from 'rxjs'; import { ConfigService } from '@services/config.service'; @@ -11,6 +10,7 @@ import { isCsv } from '@utils/file-drop-utils'; import { ErrorMessageService, GenericService, HeadersConfiguration, RequiredParam, Validate } from '@iqser/common-ui'; import { FilesMapService } from '@services/entity-services/files-map.service'; import { switchMap, tap, throttleTime } from 'rxjs/operators'; +import { FilesService } from '@services/entity-services/files.service'; export interface ActiveUpload { subscription: Subscription; @@ -30,7 +30,7 @@ export class FileUploadService extends GenericService impleme private readonly _subscriptions = new Subscription(); constructor( - private readonly _appStateService: AppStateService, + private readonly _filesService: FilesService, private readonly _filesMapService: FilesMapService, private readonly _applicationRef: ApplicationRef, private readonly _translateService: TranslateService, @@ -42,7 +42,7 @@ export class FileUploadService extends GenericService impleme super(_injector, 'upload'); const fileFetch$ = this._fetchFiles$.pipe( throttleTime(1500), - switchMap(dossierId => this._appStateService.reloadDossierFiles(dossierId)), + switchMap(dossierId => this._filesService.loadAll(dossierId)), ); this._subscriptions.add(fileFetch$.subscribe()); const interval$ = interval(2500).pipe(tap(() => this._handleUploads())); 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 d0758a22a..1402a468a 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 @@ -1,5 +1,4 @@ import { Injectable } from '@angular/core'; -import { FilesService } from '@services/entity-services/files.service'; import { BehaviorSubject, Observable, Subject } from 'rxjs'; import { File } from '@red/domain'; import { filter, startWith } from 'rxjs/operators'; @@ -10,8 +9,6 @@ export class FilesMapService { private readonly _entityChanged$ = new Subject(); private readonly _map = new Map>(); - constructor(private readonly _filesService: FilesService) {} - get$(dossierId: string) { if (!this._map.has(dossierId)) { this._map.set(dossierId, new BehaviorSubject([])); diff --git a/apps/red-ui/src/app/services/entity-services/files.service.ts b/apps/red-ui/src/app/services/entity-services/files.service.ts index ba8a1db0d..c4eefda84 100644 --- a/apps/red-ui/src/app/services/entity-services/files.service.ts +++ b/apps/red-ui/src/app/services/entity-services/files.service.ts @@ -1,26 +1,47 @@ import { Injectable, Injector } from '@angular/core'; -import { EntitiesService, List, RequiredParam, Validate } from '@iqser/common-ui'; +import { EntitiesService, List, mapEach, RequiredParam, Validate } from '@iqser/common-ui'; import { File, IFile } from '@red/domain'; import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; import { UserService } from '../user.service'; +import { FileAttributesService } from '@services/entity-services/file-attributes.service'; +import { FilesMapService } from '@services/entity-services/files-map.service'; +import { tap } from 'rxjs/operators'; @Injectable({ providedIn: 'root', }) export class FilesService extends EntitiesService { - constructor(protected readonly _injector: Injector, private readonly _userService: UserService) { + constructor( + protected readonly _injector: Injector, + private readonly _userService: UserService, + private readonly _fileAttributesService: FileAttributesService, + private readonly _filesMapService: FilesMapService, + ) { super(_injector, File, 'status'); } - fetch() { - this.get().pipe(map(files => files.map(file => new File(file, this._userService.getNameForId(file.currentReviewer))))); + loadAll(dossierId: string) { + const files$ = this.getFor(dossierId).pipe(mapEach(file => new File(file, this._userService.getNameForId(file.currentReviewer)))); + return files$.pipe(tap(files => this._filesMapService.set(dossierId, files))); } getOne(dossierId: string, fileId: string): Observable { return super._getOne([dossierId, fileId]); } + async reload(dossierId: string, fileId: string): Promise { + const oldFile = this._filesMapService.get(dossierId, fileId); + + if (!oldFile) { + return null; + } + + const rawFile = await this.getOne(dossierId, fileId).toPromise(); + const newFile = new File(rawFile, this._userService.getNameForId(rawFile.currentReviewer)); + this._filesMapService.replace(newFile); + return newFile; + } + @Validate() setUnderApprovalFor(@RequiredParam() body: List, @RequiredParam() dossierId: string, approverId: string) { const url = `${this._defaultModelPath}/under-approval/${dossierId}/bulk`; diff --git a/apps/red-ui/src/app/state/app-state.guard.ts b/apps/red-ui/src/app/state/app-state.guard.ts index a3f815db5..9071e2db3 100644 --- a/apps/red-ui/src/app/state/app-state.guard.ts +++ b/apps/red-ui/src/app/state/app-state.guard.ts @@ -2,9 +2,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate, Router } from '@angular/router'; import { AppStateService } from './app-state.service'; import { UserService } from '@services/user.service'; -import { DossiersService } from '@services/entity-services/dossiers.service'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; -import { FilesMapService } from '@services/entity-services/files-map.service'; @Injectable({ providedIn: 'root', @@ -12,8 +10,6 @@ import { FilesMapService } from '@services/entity-services/files-map.service'; export class AppStateGuard implements CanActivate { constructor( private readonly _appStateService: AppStateService, - private readonly _dossiersService: DossiersService, - private readonly _filesMapService: FilesMapService, private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _userService: UserService, private readonly _router: Router, 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 fd157f62c..5274db6f2 100644 --- a/apps/red-ui/src/app/state/app-state.service.ts +++ b/apps/red-ui/src/app/state/app-state.service.ts @@ -1,17 +1,13 @@ import { Injectable } from '@angular/core'; -import { Dictionary, Dossier, DossierTemplate, File, IColors } from '@red/domain'; +import { Dictionary, DossierTemplate, IColors } from '@red/domain'; import { ActivationEnd, Router } from '@angular/router'; -import { UserService } from '@services/user.service'; import { forkJoin, Observable, of } from 'rxjs'; import { catchError, map, tap } from 'rxjs/operators'; import { currentComponentRoute, FALLBACK_COLOR, hexToRgb } from '@utils/functions'; import { DossiersService } from '@services/entity-services/dossiers.service'; -import { FilesService } from '@services/entity-services/files.service'; import { DictionaryService } from '@shared/services/dictionary.service'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; import { FileAttributesService } from '@services/entity-services/file-attributes.service'; -import { DossierStatsService } from '@services/entity-services/dossier-stats.service'; -import { FilesMapService } from '@services/entity-services/files-map.service'; export interface AppState { activeFileId?: string; @@ -27,14 +23,10 @@ export class AppStateService { constructor( private readonly _router: Router, - private readonly _userService: UserService, private readonly _dossiersService: DossiersService, - private readonly _filesService: FilesService, private readonly _dictionaryService: DictionaryService, private readonly _dossierTemplatesService: DossierTemplatesService, - private readonly _dossierStatsService: DossierStatsService, private readonly _fileAttributesService: FileAttributesService, - private readonly _filesMapService: FilesMapService, ) { _router.events.pipe(currentComponentRoute).subscribe((event: ActivationEnd) => { const fileId = event.snapshot.paramMap.get('fileId'); @@ -96,37 +88,6 @@ export class AppStateService { return data ? data : this._dictionaryData[dossierTemplateId]['default']; } - async reloadFile(dossierId: string, fileId: string): Promise { - const dossier = this._dossiersService.find(dossierId); - const oldFile = this._filesMapService.get(dossierId, fileId); - - if (!oldFile || !dossier) { - return null; - } - - const iFile = await this._filesService.getOne(dossierId, fileId).toPromise(); - - const newFile = new File( - iFile, - this._userService.getNameForId(iFile.currentReviewer), - this._fileAttributesService.getFileAttributeConfig(dossier.dossierTemplateId), - ); - - this._filesMapService.replace(newFile); - return newFile; - } - - async getFiles(dossier: Dossier) { - const files = await this._filesService.getFor(dossier.id).toPromise(); - await this._dossierStatsService.getFor([dossier.id]).toPromise(); - - const fileAttributes = this._fileAttributesService.getFileAttributeConfig(dossier.dossierTemplateId); - const newFiles = files.map(iFile => new File(iFile, this._userService.getNameForId(iFile.currentReviewer), fileAttributes)); - this._filesMapService.set(dossier.dossierId, newFiles); - - return newFiles; - } - activateDictionary(dictionaryType: string) { if (this._dossierTemplatesService.activeDossierTemplate) { this._appState.activeDictionaryType = dictionaryType; @@ -142,12 +103,6 @@ export class AppStateService { this._appState.activeDictionaryType = null; } - async reloadDossierFiles(dossierId: string) { - if (dossierId) { - return this.getFiles(this._dossiersService.find(dossierId)); - } - } - async refreshDossierTemplate(dossierTemplateId: string) { const dossierTemplate = await this._dossierTemplatesService.get(dossierTemplateId).toPromise(); diff --git a/libs/red-domain/src/lib/files/file.model.ts b/libs/red-domain/src/lib/files/file.model.ts index 805cc5757..32bb3a190 100644 --- a/libs/red-domain/src/lib/files/file.model.ts +++ b/libs/red-domain/src/lib/files/file.model.ts @@ -2,7 +2,7 @@ import { Entity } from '@iqser/common-ui'; import { StatusSorter } from '../shared'; import { isProcessingStatuses, ProcessingFileStatus, ProcessingFileStatuses, WorkflowFileStatus, WorkflowFileStatuses } from './types'; import { IFile } from './file'; -import { FileAttributes, IFileAttributesConfig } from '../file-attributes'; +import { FileAttributes } from '../file-attributes'; export class File extends Entity implements IFile { readonly added?: string; @@ -54,7 +54,7 @@ export class File extends Entity implements IFile { readonly canBeOpened: boolean; readonly canBeOCRed: boolean; - constructor(file: IFile, readonly reviewerName: string, fileAttributesConfig?: IFileAttributesConfig) { + constructor(file: IFile, readonly reviewerName: string) { super(file); this.added = file.added; this.allManualRedactionsApplied = !!file.allManualRedactionsApplied; @@ -106,17 +106,6 @@ export class File extends Entity implements IFile { this.canBeOpened = !this.isError && !this.isPending && this.numberOfAnalyses > 0; this.canBeOCRed = !this.excluded && !this.lastOCRTime && (this.isUnassigned || this.isUnderReview || this.isUnderApproval); - if (fileAttributesConfig) { - const primary = fileAttributesConfig.fileAttributeConfigs?.find(c => c.primaryAttribute); - if (primary && file.fileAttributes?.attributeIdToValue) { - this.primaryAttribute = file.fileAttributes?.attributeIdToValue[primary.id]; - } - - if (!this.primaryAttribute) { - // Fallback here - this.primaryAttribute = '-'; - } - } if (!this.fileAttributes || !this.fileAttributes.attributeIdToValue) { this.fileAttributes = { attributeIdToValue: {} }; }