Merge branch 'master' into VM/RED-8748
This commit is contained in:
parent
7cc64d6aa2
commit
18b3da9c1e
@ -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<boolean> {
|
||||
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;
|
||||
};
|
||||
}
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
></redaction-kms-signature-configuration>
|
||||
</ng-container>
|
||||
|
||||
<div [class.hidden]="!digitalSignature" class="changes-box">
|
||||
<div [class.hidden]="!digitalSignature || !showChangesBox()" class="changes-box z-index-1000">
|
||||
<iqser-icon-button
|
||||
(action)="saveDigitalSignature()"
|
||||
[disabled]="disabled"
|
||||
|
||||
@ -20,3 +20,7 @@ form {
|
||||
input[name='keySecret']:not(:placeholder-shown) {
|
||||
font-family: 'secret', serif;
|
||||
}
|
||||
|
||||
.z-index-1000 {
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core';
|
||||
import { ChangeDetectorRef, Component, computed, OnInit, ViewChild } from '@angular/core';
|
||||
import { IconButtonTypes, IqserPermissionsService, LoadingService, Toaster } from '@iqser/common-ui';
|
||||
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
|
||||
import { RouterHistoryService } from '@services/router-history.service';
|
||||
@ -24,6 +24,7 @@ export class DigitalSignatureScreenComponent implements OnInit {
|
||||
readonly iconButtonTypes = IconButtonTypes;
|
||||
readonly roles = Roles;
|
||||
readonly currentUser = getCurrentUser<User>();
|
||||
readonly showChangesBox = computed(() => !this._loadingService.isLoading());
|
||||
|
||||
digitalSignature: IPkcsDigitalSignatureRequest | IKmsDigitalSignatureRequest;
|
||||
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -274,6 +274,7 @@ export class PdfViewer {
|
||||
this.#instance.UI.hotkeys.on('esc', {
|
||||
keydown: e => {
|
||||
e.preventDefault();
|
||||
this.#clickSelectToolButton();
|
||||
},
|
||||
keyup: e => {
|
||||
e.preventDefault();
|
||||
|
||||
@ -31,4 +31,13 @@ export class DashboardStatsService extends EntitiesService<IDashboardStats, Dash
|
||||
tap(entities => this.setEntities(entities)),
|
||||
);
|
||||
}
|
||||
|
||||
loadForTemplate(dossierTemplateId: string) {
|
||||
const singleTemplateStatsUrl = `/${this._serviceName}/dossier-template/${dossierTemplateId}/stats`;
|
||||
return this._http.get<DashboardStats>(singleTemplateStatsUrl).pipe(
|
||||
map(entity => new DashboardStats(entity)),
|
||||
switchMap(entity => this.#dossierStatesService.loadAllForTemplate(dossierTemplateId).pipe(map(() => entity))),
|
||||
tap(entity => this.addEntity(entity)),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<IDossierTemplate, D
|
||||
private readonly _fileAttributesService: FileAttributesService,
|
||||
private readonly _dossierTemplateStatsService: DossierTemplateStatsService,
|
||||
private readonly _dictionaryService: DictionaryService,
|
||||
private readonly _defaultColorsService: DefaultColorsService,
|
||||
private readonly _watermarksService: WatermarkService,
|
||||
) {
|
||||
super();
|
||||
}
|
||||
|
||||
loadAll(): Observable<DossierTemplate[]> {
|
||||
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<IDossierTemplate, D
|
||||
/* Load stats before updating entities */
|
||||
switchMap(templates => {
|
||||
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<IDossierTemplate, D
|
||||
);
|
||||
}
|
||||
|
||||
loadDossierTemplate(dossierTemplateId: string) {
|
||||
return this._getOne([dossierTemplateId], this._defaultModelPath).pipe(
|
||||
map(entity => new DossierTemplate(entity)),
|
||||
switchMap(template => this._dossierTemplateStatsService.getFor([dossierTemplateId]).pipe(map(() => template))),
|
||||
tap(template => this.addEntity(template)),
|
||||
);
|
||||
}
|
||||
|
||||
delete(body: List): Observable<boolean> {
|
||||
const showToast = (error: HttpErrorResponse) => {
|
||||
if (error.status === HttpStatusCode.Conflict) {
|
||||
@ -72,7 +65,7 @@ export class DossierTemplatesService extends EntitiesService<IDossierTemplate, D
|
||||
|
||||
return super._post(body, `${this._defaultModelPath}/delete`).pipe(
|
||||
catchError(showToast),
|
||||
switchMap(error => (error ? of(false) : this.loadAll().pipe(mapTo(true)))),
|
||||
switchMap(error => (error ? of(false) : this.loadAll().pipe(map(() => true)))),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -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<IDefaultColors, Defaul
|
||||
);
|
||||
}
|
||||
|
||||
loadAll(dossierTemplateIds: string[]): Observable<DefaultColors[]> {
|
||||
return forkJoin(dossierTemplateIds.map(id => super.getFor<IDefaultColors>(id))).pipe(
|
||||
mapEach(defaultColors => new DefaultColors(defaultColors)),
|
||||
tap(defaultColors => this.setEntities(defaultColors)),
|
||||
loadForDossierTemplate(dossierTemplateId: string): Observable<DefaultColors> {
|
||||
return super.getFor<IDefaultColors>(dossierTemplateId).pipe(
|
||||
map(defaultColors => new DefaultColors(defaultColors)),
|
||||
tap(defaultColors => this.addEntity(defaultColors)),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -1492,7 +1492,7 @@
|
||||
},
|
||||
"is-excluded": "Schwärzungen für dieses Dokument deaktiviert.",
|
||||
"multi-select": {
|
||||
"close": ""
|
||||
"close": "Close bulk select"
|
||||
}
|
||||
},
|
||||
"text-highlights": "Earmarks",
|
||||
|
||||
@ -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",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user