From 18b3da9c1e0ffa7b53d000df57bc6448699d9545 Mon Sep 17 00:00:00 2001 From: Valentin Mihai Date: Mon, 8 Apr 2024 14:39:27 +0300 Subject: [PATCH] Merge branch 'master' into VM/RED-8748 --- .../guards/dossier-template-exists.guard.ts | 27 +++++++++++++++-- .../digital-signature-screen.component.html | 2 +- .../digital-signature-screen.component.scss | 4 +++ .../digital-signature-screen.component.ts | 3 +- .../file-header/file-header.component.ts | 7 +++-- .../file-preview-screen.component.ts | 11 +++++-- .../services/annotation-manager.service.ts | 4 +++ .../pdf-viewer/services/pdf-viewer.service.ts | 1 + .../dashboard-stats.service.ts | 9 ++++++ .../dossier-templates.service.ts | 29 +++++++------------ .../entity-services/default-colors.service.ts | 11 ++++--- apps/red-ui/src/assets/i18n/redact/de.json | 2 +- apps/red-ui/src/assets/i18n/redact/en.json | 2 +- 13 files changed, 76 insertions(+), 36 deletions(-) diff --git a/apps/red-ui/src/app/guards/dossier-template-exists.guard.ts b/apps/red-ui/src/app/guards/dossier-template-exists.guard.ts index e59a1ebb4..203707cb1 100644 --- a/apps/red-ui/src/app/guards/dossier-template-exists.guard.ts +++ b/apps/red-ui/src/app/guards/dossier-template-exists.guard.ts @@ -7,14 +7,27 @@ import { DossierTemplateStatsService } from '@services/entity-services/dossier-t import { NGXLogger } from 'ngx-logger'; import { firstValueFrom } from 'rxjs'; import { UserPreferenceService } from '@users/user-preference.service'; +import { DictionaryService } from '@services/entity-services/dictionary.service'; +import { DefaultColorsService } from '@services/entity-services/default-colors.service'; +import { WatermarkService } from '@services/entity-services/watermark.service'; +import { FileAttributesService } from '@services/entity-services/file-attributes.service'; export function templateExistsWhenEnteringAdmin(): CanActivateFn { return async function (route: ActivatedRouteSnapshot): Promise { const dossierTemplateId: string = route.paramMap.get(DOSSIER_TEMPLATE_ID); + const fileAttributesService = inject(FileAttributesService); + const dictionaryService = inject(DictionaryService); + const defaultColorsService = inject(DefaultColorsService); + const watermarksService = inject(WatermarkService); + const router = inject(Router); const dossierTemplate = inject(DossierTemplateStatsService).get(dossierTemplateId); + await firstValueFrom(fileAttributesService.loadFileAttributesConfig(dossierTemplateId)); + await firstValueFrom(dictionaryService.loadDictionaryDataForDossierTemplate(dossierTemplateId)); + await firstValueFrom(defaultColorsService.loadForDossierTemplate(dossierTemplateId)); + await firstValueFrom(watermarksService.loadForDossierTemplate(dossierTemplateId)); if (!dossierTemplate) { - await inject(Router).navigate(['main', 'admin', 'dossier-templates']); + await router.navigate(['main', 'admin', 'dossier-templates']); return false; } return true; @@ -29,9 +42,13 @@ export function templateExistsWhenEnteringDossierList(): CanActivateFn { const logger = inject(NGXLogger); const router = inject(Router); const userPreferencesService = inject(UserPreferenceService); + const fileAttributesService = inject(FileAttributesService); + const dictionaryService = inject(DictionaryService); + const defaultColorsService = inject(DefaultColorsService); + const watermarksService = inject(WatermarkService); - await firstValueFrom(dashboardStatsService.loadAll()); - await firstValueFrom(dossierTemplatesService.loadAll()); + await firstValueFrom(dashboardStatsService.loadForTemplate(dossierTemplateId)); + await firstValueFrom(dossierTemplatesService.loadDossierTemplate(dossierTemplateId)); const dossierTemplateStats = dashboardStatsService.find(dossierTemplateId); if (!dossierTemplateStats || dossierTemplateStats.isEmpty) { logger.warn(`[ROUTES] Dossier template ${dossierTemplateId} not found, redirecting to main`); @@ -39,6 +56,10 @@ export function templateExistsWhenEnteringDossierList(): CanActivateFn { await router.navigate(['main']); return false; } + await firstValueFrom(fileAttributesService.loadFileAttributesConfig(dossierTemplateId)); + await firstValueFrom(dictionaryService.loadDictionaryDataForDossierTemplate(dossierTemplateId)); + await firstValueFrom(defaultColorsService.loadForDossierTemplate(dossierTemplateId)); + await firstValueFrom(watermarksService.loadForDossierTemplate(dossierTemplateId)); return true; }; } diff --git a/apps/red-ui/src/app/modules/admin/screens/digital-signature/digital-signature-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/digital-signature/digital-signature-screen.component.html index a83c6e586..59caf0512 100644 --- a/apps/red-ui/src/app/modules/admin/screens/digital-signature/digital-signature-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/digital-signature/digital-signature-screen.component.html @@ -30,7 +30,7 @@ > -
+
(); + readonly showChangesBox = computed(() => !this._loadingService.isLoading()); digitalSignature: IPkcsDigitalSignatureRequest | IKmsDigitalSignatureRequest; diff --git a/apps/red-ui/src/app/modules/file-preview/components/file-header/file-header.component.ts b/apps/red-ui/src/app/modules/file-preview/components/file-header/file-header.component.ts index 92a5bc574..9e9870857 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/file-header/file-header.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/file-header/file-header.component.ts @@ -63,8 +63,6 @@ export class FileHeaderComponent implements OnInit, AfterViewInit, OnDetach, OnD constructor( private readonly _changeRef: ChangeDetectorRef, private readonly _iqserPermissionsService: IqserPermissionsService, - private readonly _userPreferenceService: UserPreferenceService, - private readonly _iqserDialog: IqserDialog, private readonly _loadingService: LoadingService, private readonly _pdf: PdfViewer, private readonly _annotationDrawService: AnnotationDrawService, @@ -174,6 +172,11 @@ export class FileHeaderComponent implements OnInit, AfterViewInit, OnDetach, OnD .find(annotation => annotation.id === this._annotationManager.resizingAnnotationId); this._annotationActionsService.cancelResize(resizedAnnotation).then(); } + + if (this._annotationManager.selected.length) { + this._annotationManager.deselectAll(); + } + if (this._multiSelectService.active()) { this._multiSelectService.deactivate(); } diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts index d6629c346..93abb9623 100644 --- a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts @@ -266,9 +266,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni @Bind() handleEscInsideViewer($event: KeyboardEvent) { $event.preventDefault(); - if (this._multiSelectService.active()) { - this._multiSelectService.deactivate(); - } if (!!this._annotationManager.selected[0]) { const doesHaveWrapper = this._fileDataService.find(this._annotationManager.selected[0]?.Id); if (!doesHaveWrapper) { @@ -277,6 +274,14 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this._annotationManager.deselect(this._annotationManager.selected[0]?.Id); } } + + if (this._annotationManager.selected.length) { + this._annotationManager.deselectAll(); + } + + if (this._multiSelectService.active()) { + this._multiSelectService.deactivate(); + } } async ngOnAttach(previousRoute: ActivatedRouteSnapshot) { diff --git a/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-manager.service.ts b/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-manager.service.ts index 8472bdd93..e86b97e7c 100644 --- a/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-manager.service.ts +++ b/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-manager.service.ts @@ -98,6 +98,10 @@ export class REDAnnotationManager { this.#manager.deselectAnnotations(ann); } + deselectAll() { + this.deselect(this.selected.map(annotation => annotation.Id)); + } + hide(annotations: Annotation[]): void { this.#manager.hideAnnotations(annotations); } diff --git a/apps/red-ui/src/app/modules/pdf-viewer/services/pdf-viewer.service.ts b/apps/red-ui/src/app/modules/pdf-viewer/services/pdf-viewer.service.ts index 09fc4f9a7..a20d160d5 100644 --- a/apps/red-ui/src/app/modules/pdf-viewer/services/pdf-viewer.service.ts +++ b/apps/red-ui/src/app/modules/pdf-viewer/services/pdf-viewer.service.ts @@ -274,6 +274,7 @@ export class PdfViewer { this.#instance.UI.hotkeys.on('esc', { keydown: e => { e.preventDefault(); + this.#clickSelectToolButton(); }, keyup: e => { e.preventDefault(); diff --git a/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts b/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts index 80a7de45c..17249dd72 100644 --- a/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts +++ b/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts @@ -31,4 +31,13 @@ export class DashboardStatsService extends EntitiesService this.setEntities(entities)), ); } + + loadForTemplate(dossierTemplateId: string) { + const singleTemplateStatsUrl = `/${this._serviceName}/dossier-template/${dossierTemplateId}/stats`; + return this._http.get(singleTemplateStatsUrl).pipe( + map(entity => new DashboardStats(entity)), + switchMap(entity => this.#dossierStatesService.loadAllForTemplate(dossierTemplateId).pipe(map(() => entity))), + tap(entity => this.addEntity(entity)), + ); + } } diff --git a/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts b/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts index 13a45ae97..acad05cc7 100644 --- a/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts +++ b/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts @@ -4,10 +4,8 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { EntitiesService, Toaster } from '@iqser/common-ui'; import { List, mapEach } from '@iqser/common-ui/lib/utils'; import { DossierTemplate, IDossierTemplate } from '@red/domain'; -import { DefaultColorsService } from '@services/entity-services/default-colors.service'; -import { WatermarkService } from '@services/entity-services/watermark.service'; import { firstValueFrom, forkJoin, Observable, of } from 'rxjs'; -import { catchError, map, mapTo, switchMap, tap } from 'rxjs/operators'; +import { catchError, map, switchMap, tap } from 'rxjs/operators'; import { DictionaryService } from '../entity-services/dictionary.service'; import { DossierTemplateStatsService } from '../entity-services/dossier-template-stats.service'; import { FileAttributesService } from '../entity-services/file-attributes.service'; @@ -27,15 +25,11 @@ export class DossierTemplatesService extends EntitiesService { - const getAttributes = (entities: DossierTemplate[]) => - entities.map(e => this._fileAttributesService.loadFileAttributesConfig(e.id)); const dossierTemplateIds = (templates: DossierTemplate[]) => templates.map(d => d.id); return this.getAll().pipe( @@ -43,16 +37,7 @@ export class DossierTemplatesService extends EntitiesService { if (templates.length) { - return forkJoin([ - this._dossierTemplateStatsService.getFor(dossierTemplateIds(templates)), - ...getAttributes(templates), - // TODO: this should be removed and called only when needed - this._dictionaryService.loadDictionaryData(dossierTemplateIds(templates)), - // TODO: this should be removed and called only when needed - this._defaultColorsService.loadAll(dossierTemplateIds(templates)), - // TODO: this should be removed and called only when needed - this._watermarksService.loadAll(dossierTemplateIds(templates)), - ]).pipe(map(() => templates)); + return this._dossierTemplateStatsService.getFor(dossierTemplateIds(templates)).pipe(map(() => templates)); } return of(templates); }), @@ -60,6 +45,14 @@ export class DossierTemplatesService extends EntitiesService new DossierTemplate(entity)), + switchMap(template => this._dossierTemplateStatsService.getFor([dossierTemplateId]).pipe(map(() => template))), + tap(template => this.addEntity(template)), + ); + } + delete(body: List): Observable { const showToast = (error: HttpErrorResponse) => { if (error.status === HttpStatusCode.Conflict) { @@ -72,7 +65,7 @@ export class DossierTemplatesService extends EntitiesService (error ? of(false) : this.loadAll().pipe(mapTo(true)))), + switchMap(error => (error ? of(false) : this.loadAll().pipe(map(() => true)))), ); } diff --git a/apps/red-ui/src/app/services/entity-services/default-colors.service.ts b/apps/red-ui/src/app/services/entity-services/default-colors.service.ts index dbc5a6f7f..1ac6831d7 100644 --- a/apps/red-ui/src/app/services/entity-services/default-colors.service.ts +++ b/apps/red-ui/src/app/services/entity-services/default-colors.service.ts @@ -1,9 +1,8 @@ import { Injectable } from '@angular/core'; import { EntitiesService } from '@iqser/common-ui'; import { DefaultColors, DefaultColorType, IDefaultColors } from '@red/domain'; -import { forkJoin, Observable } from 'rxjs'; +import { Observable } from 'rxjs'; import { map, switchMap, tap } from 'rxjs/operators'; -import { mapEach } from '@iqser/common-ui/lib/utils'; @Injectable({ providedIn: 'root', @@ -23,10 +22,10 @@ export class DefaultColorsService extends EntitiesService { - return forkJoin(dossierTemplateIds.map(id => super.getFor(id))).pipe( - mapEach(defaultColors => new DefaultColors(defaultColors)), - tap(defaultColors => this.setEntities(defaultColors)), + loadForDossierTemplate(dossierTemplateId: string): Observable { + return super.getFor(dossierTemplateId).pipe( + map(defaultColors => new DefaultColors(defaultColors)), + tap(defaultColors => this.addEntity(defaultColors)), ); } diff --git a/apps/red-ui/src/assets/i18n/redact/de.json b/apps/red-ui/src/assets/i18n/redact/de.json index 8722b996a..24c7eccde 100644 --- a/apps/red-ui/src/assets/i18n/redact/de.json +++ b/apps/red-ui/src/assets/i18n/redact/de.json @@ -1492,7 +1492,7 @@ }, "is-excluded": "Schwärzungen für dieses Dokument deaktiviert.", "multi-select": { - "close": "" + "close": "Close bulk select" } }, "text-highlights": "Earmarks", diff --git a/apps/red-ui/src/assets/i18n/redact/en.json b/apps/red-ui/src/assets/i18n/redact/en.json index c7fbfdbc6..a373adab0 100644 --- a/apps/red-ui/src/assets/i18n/redact/en.json +++ b/apps/red-ui/src/assets/i18n/redact/en.json @@ -1492,7 +1492,7 @@ }, "is-excluded": "Redaction is disabled for this document.", "multi-select": { - "close": "Deactivate multi select" + "close": "Close bulk select" } }, "text-highlights": "Earmarks",