From 08d23a31186bd2fb00985af9a5475670d7d7404b Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Fri, 1 Oct 2021 14:54:09 +0300 Subject: [PATCH] move some methods to dossiers service --- .../notifications/notifications.component.ts | 6 ++-- .../confirm-delete-users-dialog.component.ts | 6 ++-- .../document-info/document-info.component.ts | 6 ++-- .../document-info-dialog.component.ts | 6 ++-- .../edit-dossier-dialog.component.ts | 4 ++- .../search-screen/search-screen.component.ts | 10 +++--- .../dossier/services/dossiers.service.ts | 12 +++++++ .../dictionary-manager.component.html | 2 +- .../dictionary-manager.component.ts | 8 ++--- .../src/app/services/permissions.service.ts | 11 ++++-- apps/red-ui/src/app/state/app-state.guard.ts | 6 ++-- .../red-ui/src/app/state/app-state.service.ts | 35 ++++++------------- 12 files changed, 60 insertions(+), 52 deletions(-) diff --git a/apps/red-ui/src/app/components/notifications/notifications.component.ts b/apps/red-ui/src/app/components/notifications/notifications.component.ts index 841ea9b8c..66b7a888c 100644 --- a/apps/red-ui/src/app/components/notifications/notifications.component.ts +++ b/apps/red-ui/src/app/components/notifications/notifications.component.ts @@ -8,6 +8,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { UserService } from '@services/user.service'; import { NotificationType, NotificationTypeEnum } from '@models/notification-types'; import { notificationsTranslations } from '../../translations/notifications-translations'; +import { DossiersService } from '../../modules/dossier/services/dossiers.service'; @Component({ selector: 'redaction-notifications', @@ -23,6 +24,7 @@ export class NotificationsComponent { private readonly _userService: UserService, private readonly _notificationControllerService: NotificationControllerService, private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _datePipe: DatePipe ) { this._notificationControllerService.getNotifications(false).subscribe((response: NotificationResponse) => { @@ -96,12 +98,12 @@ export class NotificationsComponent { } private _getDossierName(dossierId: string | undefined) { - const dossier = this._appStateService.getDossierById(dossierId); + const dossier = this._dossiersService.find(dossierId); return dossier?.dossierName || this._translateService.instant(_('dossier')); } private _getFileName(dossierId: string | undefined, fileId: string | undefined) { - const file = this._appStateService.getFileById(dossierId, fileId); + const file = this._dossiersService.find(dossierId, fileId); return file?.filename || this._translateService.instant(_('file')); } diff --git a/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-users-dialog/confirm-delete-users-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-users-dialog/confirm-delete-users-dialog.component.ts index bd63dad28..8f9c5eb26 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-users-dialog/confirm-delete-users-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-users-dialog/confirm-delete-users-dialog.component.ts @@ -1,10 +1,10 @@ import { Component, Inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { UserControllerService } from '@redaction/red-ui-http'; -import { AppStateService } from '@state/app-state.service'; import { LoadingService } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { User } from '@models/user'; +import { DossiersService } from '../../../dossier/services/dossiers.service'; @Component({ selector: 'redaction-confirm-delete-users-dialog', @@ -20,13 +20,13 @@ export class ConfirmDeleteUsersDialogComponent { dossiersCount: number; constructor( - private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _loadingService: LoadingService, private readonly _userControllerService: UserControllerService, readonly dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) readonly users: User[] ) { - this.dossiersCount = this._appStateService.allDossiers.filter(dw => { + this.dossiersCount = this._dossiersService.all.filter(dw => { for (const user of this.users) { if (dw.memberIds.indexOf(user.id) !== -1) { return true; diff --git a/apps/red-ui/src/app/modules/dossier/components/document-info/document-info.component.ts b/apps/red-ui/src/app/modules/dossier/components/document-info/document-info.component.ts index 785e0135a..0331901d1 100644 --- a/apps/red-ui/src/app/modules/dossier/components/document-info/document-info.component.ts +++ b/apps/red-ui/src/app/modules/dossier/components/document-info/document-info.component.ts @@ -5,6 +5,7 @@ import { DossiersDialogService } from '../../services/dossiers-dialog.service'; import { AutoUnsubscribe } from '@iqser/common-ui'; import { File } from '@models/file/file'; import { FileAttributesService } from '../../services/file-attributes.service'; +import { DossiersService } from '../../services/dossiers.service'; @Component({ selector: 'redaction-document-info', @@ -13,12 +14,13 @@ import { FileAttributesService } from '../../services/file-attributes.service'; }) export class DocumentInfoComponent extends AutoUnsubscribe implements OnInit { @Input() file: File; - @Output() closeDocumentInfoView = new EventEmitter(); + @Output() readonly closeDocumentInfoView = new EventEmitter(); fileAttributesConfig: FileAttributesConfig; constructor( private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _fileAttributesService: FileAttributesService, private readonly _dialogService: DossiersDialogService ) { @@ -26,7 +28,7 @@ export class DocumentInfoComponent extends AutoUnsubscribe implements OnInit { } get dossier() { - return this._appStateService.getDossierById(this.file.dossierId); + return this._dossiersService.find(this.file.dossierId); } get dossierTemplateName(): string { diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/document-info-dialog/document-info-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/document-info-dialog/document-info-dialog.component.ts index 9625d86c1..f00ca3baf 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/document-info-dialog/document-info-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/document-info-dialog/document-info-dialog.component.ts @@ -5,6 +5,7 @@ import { AppStateService } from '@state/app-state.service'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { Dossier } from '@state/model/dossier'; import { FileAttributesService } from '../../services/file-attributes.service'; +import { DossiersService } from '../../services/dossiers.service'; @Component({ templateUrl: './document-info-dialog.component.html', @@ -15,17 +16,18 @@ export class DocumentInfoDialogComponent implements OnInit { file: IFile; attributes: IFileAttributeConfig[]; - private _dossier: Dossier; + private readonly _dossier: Dossier; constructor( private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _formBuilder: FormBuilder, private readonly _fileAttributesService: FileAttributesService, public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: IFile ) { this.file = this.data; - this._dossier = this._appStateService.getDossierById(this.file.dossierId); + this._dossier = this._dossiersService.find(this.file.dossierId); } async ngOnInit() { diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts index 8090b67f0..438dce15b 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts @@ -12,6 +12,7 @@ import { EditDossierAttributesComponent } from './attributes/edit-dossier-attrib import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { EditDossierDeletedDocumentsComponent } from './deleted-documents/edit-dossier-deleted-documents.component'; import { AppStateService } from '@state/app-state.service'; +import { DossiersService } from '../../services/dossiers.service'; type Section = 'dossierInfo' | 'downloadPackage' | 'dossierDictionary' | 'members' | 'dossierAttributes' | 'deletedDocuments'; @@ -34,6 +35,7 @@ export class EditDossierDialogComponent { constructor( private readonly _toaster: Toaster, private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _changeRef: ChangeDetectorRef, @Inject(MAT_DIALOG_DATA) private readonly _data: { @@ -106,7 +108,7 @@ export class EditDossierDialogComponent { updatedDossier() { this._toaster.success(_('edit-dossier-dialog.change-successful'), { params: { dossierName: this.dossier.dossierName } }); - this.dossier = this._appStateService.getDossierById(this.dossier.id); + this.dossier = this._dossiersService.find(this.dossier.id); this._changeRef.detectChanges(); this.afterSave(); } 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 bba7db62b..0859f04fd 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 @@ -12,12 +12,12 @@ import { List, MatchedDocument, SearchControllerService, SearchResult } from '@r import { BehaviorSubject, Observable } from 'rxjs'; import { debounceTime, map, skip, switchMap, tap } from 'rxjs/operators'; import { ActivatedRoute, Router } from '@angular/router'; -import { AppStateService } from '@state/app-state.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { fileStatusTranslations } from '../../translations/file-status-translations'; import { SearchPositions } from '@shared/components/page-header/models/search-positions.type'; import { TranslateService } from '@ngx-translate/core'; import { RouterHistoryService } from '@services/router-history.service'; +import { DossiersService } from '../../services/dossiers.service'; interface ListItem extends IListable { readonly dossierId: string; @@ -65,7 +65,7 @@ export class SearchScreenComponent extends ListingComponent implements protected readonly _injector: Injector, private readonly _activatedRoute: ActivatedRoute, private readonly _loadingService: LoadingService, - private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, readonly routerHistoryService: RouterHistoryService, private readonly _translateService: TranslateService, private readonly _searchControllerService: SearchControllerService @@ -77,7 +77,7 @@ export class SearchScreenComponent extends ListingComponent implements label: this._translateService.instant('search-screen.filters.by-dossier'), filterceptionPlaceholder: this._translateService.instant('search-screen.filters.search-placeholder'), icon: 'red:folder', - filters: this._appStateService.allDossiers.map( + filters: this._dossiersService.all.map( dossier => new NestedFilter({ id: dossier.id, @@ -135,7 +135,7 @@ export class SearchScreenComponent extends ListingComponent implements } private _toListItem({ dossierId, fileId, unmatchedTerms, highlights }: MatchedDocument): ListItem { - const file = this._appStateService.getFileById(dossierId, fileId); + const file = this._dossiersService.find(dossierId, fileId); if (!file) { return undefined; } @@ -147,7 +147,7 @@ export class SearchScreenComponent extends ListingComponent implements highlights, status: file.status, numberOfPages: file.numberOfPages, - dossierName: this._appStateService.getDossierById(dossierId).dossierName, + dossierName: this._dossiersService.find(dossierId).dossierName, filename: file.filename, searchKey: file.filename, routerLink: `/main/dossiers/${dossierId}/file/${fileId}` diff --git a/apps/red-ui/src/app/modules/dossier/services/dossiers.service.ts b/apps/red-ui/src/app/modules/dossier/services/dossiers.service.ts index d90bbf2f3..d07cfa696 100644 --- a/apps/red-ui/src/app/modules/dossier/services/dossiers.service.ts +++ b/apps/red-ui/src/app/modules/dossier/services/dossiers.service.ts @@ -7,6 +7,7 @@ import { TEMPORARY_INJECTOR } from './injector'; import { BehaviorSubject, Observable } from 'rxjs'; import { ActivationEnd, Router } from '@angular/router'; import { BaseScreenComponent } from '@components/base-screen/base-screen.component'; +import { File } from '@models/file/file'; export interface IDossiersStats { totalPeople: number; @@ -50,6 +51,17 @@ export class DossiersService extends EntitiesService { }); } + find(dossierId: string): Dossier | undefined; + find(dossierId: string, fileId: string): File | undefined; + find(dossierId: string, fileId?: string): Dossier | File | undefined { + const getDossier = () => this.all.find(dossier => dossier.dossierId === dossierId); + if (!fileId) { + return getDossier(); + } + + return getDossier().files.find(file => file.fileId === fileId); + } + get(): Observable; get(dossierId: string): Observable; get(dossierId?: string): Observable { diff --git a/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.html b/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.html index f5c16d073..5b097423b 100644 --- a/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.html +++ b/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.html @@ -33,7 +33,7 @@
{{ selectDossier.dossierName | translate }} - + {{ dossier.dossierName }} 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 33bfc20ed..270dd1efe 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 @@ -1,11 +1,11 @@ import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core'; -import { AppStateService } from '@state/app-state.service'; import { Debounce, IconButtonTypes, List } from '@iqser/common-ui'; import { Observable } from 'rxjs'; import { map, take } from 'rxjs/operators'; import { Dossier } from '@state/model/dossier'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DictionaryService } from '@shared/services/dictionary.service'; +import { DossiersService } from '../../../dossier/services/dossiers.service'; import ICodeEditor = monaco.editor.ICodeEditor; import IDiffEditor = monaco.editor.IDiffEditor; import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration; @@ -44,7 +44,7 @@ export class DictionaryManagerComponent implements OnChanges, OnInit { private _decorations: string[] = []; private _searchDecorations: string[] = []; - constructor(private readonly _dictionaryService: DictionaryService, private readonly _appStateService: AppStateService) {} + constructor(private readonly _dictionaryService: DictionaryService, readonly dossiersService: DossiersService) {} private _dossier: Dossier = this.selectDossier as Dossier; @@ -72,10 +72,6 @@ export class DictionaryManagerComponent implements OnChanges, OnInit { }); } - get dossiers() { - return this._appStateService.allDossiers; - } - get editorValue(): string { return this.currentEntries.join('\n'); } diff --git a/apps/red-ui/src/app/services/permissions.service.ts b/apps/red-ui/src/app/services/permissions.service.ts index 02a6d9658..3832abb3e 100644 --- a/apps/red-ui/src/app/services/permissions.service.ts +++ b/apps/red-ui/src/app/services/permissions.service.ts @@ -4,12 +4,17 @@ import { UserService } from './user.service'; import { File } from '@models/file/file'; import { Comment } from '@redaction/red-ui-http'; import { Dossier } from '@state/model/dossier'; +import { DossiersService } from '../modules/dossier/services/dossiers.service'; @Injectable({ providedIn: 'root' }) export class PermissionsService { - constructor(private readonly _appStateService: AppStateService, private readonly _userService: UserService) {} + constructor( + private readonly _appStateService: AppStateService, + private readonly _userService: UserService, + private readonly _dossiersService: DossiersService + ) {} private get _activeFile(): File | undefined { return this._appStateService.activeFile; @@ -113,8 +118,8 @@ export class PermissionsService { return ['UNDER_REVIEW', 'UNDER_APPROVAL'].includes(file?.status) && this.isFileReviewer(file); } - canDownloadFiles(file = this._activeFile): boolean { - const dossier = this._appStateService.getDossierById(file?.dossierId); + canDownloadFiles(file: File): boolean { + const dossier = this._dossiersService.find(file?.dossierId); if (!dossier) { return false; } 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 39c225494..113c461c2 100644 --- a/apps/red-ui/src/app/state/app-state.guard.ts +++ b/apps/red-ui/src/app/state/app-state.guard.ts @@ -2,6 +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 '../modules/dossier/services/dossiers.service'; @Injectable({ providedIn: 'root' @@ -9,6 +10,7 @@ import { UserService } from '@services/user.service'; export class AppStateGuard implements CanActivate { constructor( private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _userService: UserService, private readonly _router: Router ) {} @@ -30,12 +32,12 @@ export class AppStateGuard implements CanActivate { const { dossierId, fileId, dossierTemplateId, type } = route.params; - if (dossierId && !this._appStateService.getDossierById(dossierId)) { + if (dossierId && !this._dossiersService.find(dossierId)) { await this._router.navigate(['main', 'dossiers']); return false; } - if (fileId && !this._appStateService.getFileById(dossierId, fileId)) { + if (fileId && !this._dossiersService.find(dossierId, fileId)) { await this._router.navigate(['main', 'dossiers', dossierId]); return false; } 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 ccd6bc37e..12cfe91de 100644 --- a/apps/red-ui/src/app/state/app-state.service.ts +++ b/apps/red-ui/src/app/state/app-state.service.ts @@ -80,7 +80,7 @@ export class AppStateService { } get aggregatedFiles(): File[] { - return this.allDossiers.reduce((acc, { files }) => [...acc, ...files], []); + return this._dossiersService.all.reduce((acc, { files }) => [...acc, ...files], []); } get activeDossierTemplateId(): string | undefined { @@ -113,15 +113,7 @@ export class AppStateService { } get activeDossier(): Dossier | undefined { - return this.allDossiers.find(p => p.id === this.activeDossierId); - } - - get allDossiers(): Dossier[] { - return this._appState.dossiers; - } - - get hasDossiers() { - return this.allDossiers?.length > 0; + return this._dossiersService.all.find(p => p.id === this.activeDossierId); } get activeFile(): File | undefined { @@ -194,14 +186,6 @@ export class AppStateService { return data ? data : this._dictionaryData[dossierTemplateId]['default']; } - getDossierById(id: string) { - return this.allDossiers.find(dossier => dossier.id === id); - } - - getFileById(dossierId: string, fileId: string) { - return this.getDossierById(dossierId)?.files.find(file => file.fileId === fileId); - } - async loadAllDossiers(emitEvents = true) { const dossiers = await this._dossiersService.get().toPromise(); if (!dossiers) { @@ -267,7 +251,7 @@ export class AppStateService { async updateDossierDictionary(dossierTemplateId: string, dossierId: string) { // dossier exists, load its dictionary - const dossier = this.getDossierById(dossierId); + const dossier = this._dossiersService.find(dossierId); try { dossier.type = await this._dictionaryService.getFor(dossierTemplateId, 'dossier_redaction', dossierId).toPromise(); } catch (e) { @@ -323,9 +307,10 @@ export class AppStateService { .toPromise() .then( () => { - const index = this.allDossiers.findIndex(p => p.id === dossier.id); - this._appState.dossiers.splice(index, 1); - this._dossiersService.setEntities(this._appState.dossiers); + const dossiers = this._dossiersService.all; + const index = dossiers.findIndex(p => p.id === dossier.id); + dossiers.splice(index, 1); + this._dossiersService.setEntities([...dossiers]); }, () => this._toaster.error(_('dossier-listing.delete.delete-failed'), { params: dossier }) ); @@ -334,7 +319,7 @@ export class AppStateService { async createOrUpdateDossier(dossier: DossierRequest) { try { const updatedDossier = await this._dossiersService.createOrUpdate(dossier); - let foundDossier = this.allDossiers.find(p => p.id === updatedDossier.dossierId); + let foundDossier = this._dossiersService.find(updatedDossier.dossierId); if (foundDossier) { this._appState.dossiers.splice(this._appState.dossiers.indexOf(foundDossier), 1); foundDossier = new Dossier(updatedDossier, foundDossier.files); @@ -389,7 +374,7 @@ export class AppStateService { } async loadAllDossiersIfNecessary() { - if (!this.allDossiers.length) { + if (!this._dossiersService.all.length) { await this.loadAllDossiers(); } } @@ -660,7 +645,7 @@ export class AppStateService { } private _getExistingFiles(dossierId: string): List { - const dossier = this.allDossiers.find(p => p.id === dossierId); + const dossier = this._dossiersService.find(dossierId); return dossier?.files ?? []; }