Dossier templates guard

This commit is contained in:
Adina Țeudan 2022-02-14 12:01:22 +02:00
parent 76996afbf0
commit 666ff573ef
35 changed files with 337 additions and 392 deletions

View File

@ -8,6 +8,7 @@ import { NgModule } from '@angular/core';
import { DownloadsListScreenComponent } from '@components/downloads-list-screen/downloads-list-screen.component';
import { AppStateGuard } from '@state/app-state.guard';
import { DossiersGuard } from '@guards/dossiers.guard';
import { DossierTemplatesGuard } from '@guards/dossier-templates.guard';
const routes: Routes = [
{
@ -36,7 +37,7 @@ const routes: Routes = [
loadChildren: () => import('./modules/dossier/dossiers.module').then(m => m.DossiersModule),
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard, DossiersGuard],
routeGuards: [AuthGuard, RedRoleGuard, DossierTemplatesGuard, AppStateGuard, DossiersGuard],
requiredRoles: ['RED_USER', 'RED_MANAGER'],
},
},

View File

@ -0,0 +1,18 @@
import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { firstValueFrom } from 'rxjs';
import { DictionaryService } from '@shared/services/dictionary.service';
@Injectable({ providedIn: 'root' })
export class DossierTemplatesGuard implements CanActivate {
constructor(
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dictionaryService: DictionaryService,
) {}
async canActivate(): Promise<boolean> {
await firstValueFrom(this._dossierTemplatesService.loadAll());
return true;
}
}

View File

@ -1,16 +1,11 @@
import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';
import { CanActivate } from '@angular/router';
import { DossiersService } from '@services/entity-services/dossiers.service';
import { TranslateService } from '@ngx-translate/core';
import { firstValueFrom } from 'rxjs';
@Injectable({ providedIn: 'root' })
export class DossiersGuard implements CanActivate {
constructor(
private readonly _dossiersService: DossiersService,
private readonly _translateService: TranslateService,
private readonly _router: Router,
) {}
constructor(private readonly _dossiersService: DossiersService) {}
async canActivate(): Promise<boolean> {
await firstValueFrom(this._dossiersService.loadAll());

View File

@ -18,6 +18,7 @@ import { TrashScreenComponent } from './screens/trash/trash-screen.component';
import { GeneralConfigScreenComponent } from './screens/general-config/general-config-screen.component';
import { BaseAdminScreenComponent } from './base-admin-screen/base-admin-screen.component';
import { BaseDossierTemplateScreenComponent } from './base-dossier-templates-screen/base-dossier-template-screen.component';
import { DossierTemplatesGuard } from '../../guards/dossier-templates.guard';
const routes: Routes = [
{ path: '', redirectTo: 'dossier-templates', pathMatch: 'full' },
@ -129,8 +130,9 @@ const routes: Routes = [
],
},
],
canActivate: [CompositeRouteGuard],
data: {
routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard],
routeGuards: [AuthGuard, RedRoleGuard, DossierTemplatesGuard, AppStateGuard],
requiredRoles: ['RED_MANAGER', 'RED_ADMIN'],
},
},

View File

@ -1,14 +1,14 @@
<div class="menu flex-2 visible-lg breadcrumbs-container">
<a
*ngIf="root || !!dossierTemplatesService.activeDossierTemplate"
[routerLink]="'/main/admin/dossier-templates'"
class="breadcrumb"
translate="dossier-templates.label"
></a>
<mat-icon svgIcon="iqser:arrow-right"></mat-icon>
<ng-container *ngIf="dossierTemplate$ | async as dossierTemplate">
<a
*ngIf="root || dossierTemplate"
[routerLink]="'/main/admin/dossier-templates'"
class="breadcrumb"
translate="dossier-templates.label"
></a>
<mat-icon svgIcon="iqser:arrow-right"></mat-icon>
<a [class.active]="(activeDictionary$ | async) === undefined" [routerLink]="dossierTemplate.routerLink" class="breadcrumb ml-0">
{{ dossierTemplate.name }}
</a>

View File

@ -1,6 +1,4 @@
import { Component, Input } from '@angular/core';
import { UserPreferenceService } from '@services/user-preference.service';
import { PermissionsService } from '@services/permissions.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { Observable, of } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
@ -19,20 +17,18 @@ export class DossierTemplateBreadcrumbsComponent {
readonly activeDictionary$: Observable<Dictionary>;
constructor(
readonly userPreferenceService: UserPreferenceService,
readonly permissionService: PermissionsService,
readonly dossierTemplatesService: DossierTemplatesService,
readonly dictionariesMapService: DictionariesMapService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dictionariesMapService: DictionariesMapService,
private readonly _route: ActivatedRoute,
) {
this.dossierTemplate$ = _route.paramMap.pipe(
map(params => params.get('dossierTemplateId')),
switchMap((dossierTemplateId: string) => this.dossierTemplatesService.getEntityChanged$(dossierTemplateId)),
switchMap((dossierTemplateId: string) => this._dossierTemplatesService.getEntityChanged$(dossierTemplateId)),
);
this.activeDictionary$ = _route.paramMap.pipe(
map(params => [params.get('dossierTemplateId'), params.get('dictionary')]),
switchMap(([dossierTemplateId, dictionary]: [string, string]) =>
dictionary ? this.dictionariesMapService.watch$(dossierTemplateId, dictionary) : of(undefined),
dictionary ? this._dictionariesMapService.watch$(dossierTemplateId, dictionary) : of(undefined),
),
);
}

View File

@ -10,7 +10,6 @@ import { DictionaryService } from '@shared/services/dictionary.service';
import { Dictionary, IDictionary } from '@red/domain';
import { UserService } from '@services/user.service';
import { map } from 'rxjs/operators';
import { HttpStatusCode } from '@angular/common/http';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
@Component({
@ -66,28 +65,17 @@ export class AddEditDictionaryDialogComponent extends BaseDialogComponent {
async save(): Promise<void> {
const dictionary = this._formToObject();
let observable: Observable<unknown>;
const dossierTemplateId = this._data.dossierTemplateId;
if (this.dictionary) {
// edit mode
observable = this._dictionaryService.updateDictionary(dictionary, dossierTemplateId, dictionary.type);
await firstValueFrom(this._dictionaryService.updateDictionary(dictionary, dossierTemplateId, dictionary.type));
} else {
// create mode
observable = this._dictionaryService.addDictionary({ ...dictionary, dossierTemplateId });
await firstValueFrom(this._dictionaryService.addDictionary({ ...dictionary, dossierTemplateId }));
}
return firstValueFrom(observable)
.then(() => this._dialogRef.close(true))
.catch(error => {
if (error.status === HttpStatusCode.Conflict) {
this._toaster.error(_('add-edit-dictionary.error.dictionary-already-exists'));
} else if (error.status === HttpStatusCode.BadRequest) {
this._toaster.error(_('add-edit-dictionary.error.invalid-color-or-rank'));
} else {
this._toaster.error(_('add-edit-dictionary.error.generic'));
}
});
this._dialogRef.close(true);
}
private _getForm(dictionary: Dictionary): FormGroup {

View File

@ -25,7 +25,7 @@ export class AddEditDossierAttributeDialogComponent extends BaseDialogComponent
protected readonly _injector: Injector,
protected readonly _dialogRef: MatDialogRef<AddEditDossierAttributeDialogComponent>,
@Inject(MAT_DIALOG_DATA)
readonly data: { readonly dossierAttribute: IDossierAttributeConfig },
readonly data: { readonly dossierAttribute: IDossierAttributeConfig; dossierTemplateId: string },
) {
super(_injector, _dialogRef);
this.form = this._getForm(this.dossierAttribute);
@ -37,7 +37,7 @@ export class AddEditDossierAttributeDialogComponent extends BaseDialogComponent
return true;
}
for (const key of Object.keys(this.form.getRawValue())) {
for (const key of Object.keys(this.form.getRawValue() as IDossierAttributeConfig)) {
if (this.dossierAttribute[key] !== this.form.get(key).value) {
return true;
}
@ -55,7 +55,7 @@ export class AddEditDossierAttributeDialogComponent extends BaseDialogComponent
...this.form.getRawValue(),
};
this._dossierAttributesService.createOrUpdate(attribute).subscribe(
this._dossierAttributesService.createOrUpdate(attribute, this.data.dossierTemplateId).subscribe(
() => {
this._dialogRef.close(true);
},

View File

@ -8,9 +8,10 @@ import { downloadTypesTranslations } from '../../../../translations/download-typ
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { BaseDialogComponent, LoadingService, Toaster } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DownloadFileType, IDossierTemplate } from '@red/domain';
import { DossierTemplate, DownloadFileType, IDossierTemplate } from '@red/domain';
import { HttpStatusCode } from '@angular/common/http';
import { DictionaryService } from '../../../shared/services/dictionary.service';
import { firstValueFrom } from 'rxjs';
@Component({
templateUrl: './add-edit-dossier-template-dialog.component.html',
@ -24,6 +25,7 @@ export class AddEditDossierTemplateDialogComponent extends BaseDialogComponent {
key: type,
label: downloadTypesTranslations[type],
}));
readonly dossierTemplate: DossierTemplate;
private _previousValidFrom: Moment;
private _previousValidTo: Moment;
private _lastValidFrom: Moment;
@ -37,9 +39,10 @@ export class AddEditDossierTemplateDialogComponent extends BaseDialogComponent {
protected readonly _injector: Injector,
protected readonly _dialogRef: MatDialogRef<AddEditDossierTemplateDialogComponent>,
private readonly _loadingService: LoadingService,
@Inject(MAT_DIALOG_DATA) readonly dossierTemplate: IDossierTemplate,
@Inject(MAT_DIALOG_DATA) readonly dossierTemplateId: string,
) {
super(_injector, _dialogRef);
this.dossierTemplate = this._dossierTemplatesService.find(this.dossierTemplateId);
this.form = this._getForm();
this.initialFormValue = this.form.getRawValue();
this.hasValidFrom = !!this.dossierTemplate?.validFrom;
@ -79,8 +82,7 @@ export class AddEditDossierTemplateDialogComponent extends BaseDialogComponent {
validFrom: this.hasValidFrom ? this.form.get('validFrom').value : null,
validTo: this.hasValidTo ? this.form.get('validTo').value : null,
} as IDossierTemplate;
await this._dossierTemplatesService.createOrUpdate(dossierTemplate).toPromise();
await this._dictionaryService.loadDictionaryData();
await firstValueFrom(this._dossierTemplatesService.createOrUpdate(dossierTemplate));
this._dialogRef.close(true);
} catch (error: any) {
const message =

View File

@ -1,9 +1,9 @@
import { ChangeDetectionStrategy, Component, Inject, Injector } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { FileAttributeEncodingTypes, IFileAttributesConfig } from '../../../../../../../../libs/red-domain/src';
import { FileAttributeEncodingTypes, IFileAttributesConfig } from '@red/domain';
import { fileAttributeEncodingTypesTranslations } from '../../translations/file-attribute-encoding-types-translations';
import { BaseDialogComponent, Toaster } from '../../../../../../../../libs/common-ui/src';
import { BaseDialogComponent, Toaster } from '@iqser/common-ui';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { firstValueFrom } from 'rxjs';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@ -17,7 +17,7 @@ import { FileAttributesService } from '@services/entity-services/file-attributes
export class FileAttributesConfigurationsDialogComponent extends BaseDialogComponent {
readonly encodingTypeOptions = Object.keys(FileAttributeEncodingTypes);
readonly translations = fileAttributeEncodingTypesTranslations;
private readonly _configuration: IFileAttributesConfig = this._data;
private readonly _configuration: IFileAttributesConfig = this._data.config;
constructor(
private readonly _formBuilder: FormBuilder,
@ -26,7 +26,7 @@ export class FileAttributesConfigurationsDialogComponent extends BaseDialogCompo
private readonly _toaster: Toaster,
protected readonly _injector: Injector,
protected readonly _dialogRef: MatDialogRef<FileAttributesConfigurationsDialogComponent>,
@Inject(MAT_DIALOG_DATA) private _data: IFileAttributesConfig,
@Inject(MAT_DIALOG_DATA) private _data: { config: IFileAttributesConfig; dossierTemplateId: string },
) {
super(_injector, _dialogRef);
this.form = this._getForm();
@ -49,12 +49,7 @@ export class FileAttributesConfigurationsDialogComponent extends BaseDialogCompo
this._configuration.encoding = this.form.get('encodingType').value;
try {
await firstValueFrom(
this._fileAttributesService.setFileAttributeConfig(
this._configuration,
this._dossierTemplatesService.activeDossierTemplateId,
),
);
await firstValueFrom(this._fileAttributesService.setFileAttributeConfig(this._configuration, this._data.dossierTemplateId));
this._toaster.success(_('file-attributes-configurations.update.success'));
} catch (e) {
this._toaster.error(_('file-attributes-configurations.update.error'));

View File

@ -1,4 +1,4 @@
import { ChangeDetectionStrategy, Component, forwardRef, Injector, OnInit } from '@angular/core';
import { ChangeDetectionStrategy, Component, forwardRef, Injector } from '@angular/core';
import { DefaultColorType, IColors } from '@red/domain';
import { AdminDialogService } from '../../services/admin-dialog.service';
import {
@ -15,6 +15,7 @@ import { UserService } from '@services/user.service';
import { DictionaryService } from '@shared/services/dictionary.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { firstValueFrom } from 'rxjs';
import { ActivatedRoute } from '@angular/router';
interface ListItem extends IListable {
readonly key: string;
@ -27,7 +28,7 @@ interface ListItem extends IListable {
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [...DefaultListingServices, { provide: ListingComponent, useExisting: forwardRef(() => DefaultColorsScreenComponent) }],
})
export class DefaultColorsScreenComponent extends ListingComponent<ListItem> implements OnInit {
export class DefaultColorsScreenComponent extends ListingComponent<ListItem> {
readonly circleButtonTypes = CircleButtonTypes;
readonly currentUser = this._userService.currentUser;
readonly translations = defaultColorsTranslations;
@ -37,6 +38,7 @@ export class DefaultColorsScreenComponent extends ListingComponent<ListItem> imp
{ label: _('default-colors-screen.table-col-names.color'), class: 'flex-center' },
];
private _colorsObj: IColors;
readonly #dossierTemplateId: string;
constructor(
protected readonly _injector: Injector,
@ -45,12 +47,10 @@ export class DefaultColorsScreenComponent extends ListingComponent<ListItem> imp
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dialogService: AdminDialogService,
private readonly _dictionaryService: DictionaryService,
private readonly _route: ActivatedRoute,
) {
super(_injector);
}
async ngOnInit() {
await this._loadColors();
this.#dossierTemplateId = _route.snapshot.paramMap.get('dossierTemplateId');
}
openEditColorDialog($event: MouseEvent, color: { key: DefaultColorType | string; value: string }) {
@ -60,18 +60,17 @@ export class DefaultColorsScreenComponent extends ListingComponent<ListItem> imp
{
colors: this._colorsObj,
colorKey: color.key,
dossierTemplateId: this._dossierTemplatesService.activeDossierTemplateId,
dossierTemplateId: this.#dossierTemplateId,
},
async () => {
await this._loadColors();
await this._dictionaryService.refreshDossierTemplate(this._dossierTemplatesService.activeDossierTemplateId);
},
);
}
private async _loadColors() {
this._loadingService.start();
const data = await firstValueFrom(this._dictionaryService.getColors(this._dossierTemplatesService.activeDossierTemplateId));
const data = await firstValueFrom(this._dictionaryService.getColors(this.#dossierTemplateId));
this._colorsObj = data;
const entities = Object.keys(data)
.map(key => ({

View File

@ -1,4 +1,4 @@
import { Component, forwardRef, Injector, OnInit } from '@angular/core';
import { Component, forwardRef, Injector } from '@angular/core';
import { DoughnutChartConfig } from '@shared/components/simple-doughnut-chart/simple-doughnut-chart.component';
import { TranslateService } from '@ngx-translate/core';
import {
@ -26,7 +26,7 @@ import { DictionariesMapService } from '@services/entity-services/dictionaries-m
styleUrls: ['./dictionary-listing-screen.component.scss'],
providers: [...DefaultListingServices, { provide: ListingComponent, useExisting: forwardRef(() => DictionaryListingScreenComponent) }],
})
export class DictionaryListingScreenComponent extends ListingComponent<Dictionary> implements OnInit {
export class DictionaryListingScreenComponent extends ListingComponent<Dictionary> {
readonly iconButtonTypes = IconButtonTypes;
readonly circleButtonTypes = CircleButtonTypes;
readonly currentUser = this._userService.currentUser;
@ -38,7 +38,7 @@ export class DictionaryListingScreenComponent extends ListingComponent<Dictionar
];
chartData: DoughnutChartConfig[] = [];
readonly templateStats$: Observable<DossierTemplateStats>;
templateStats: DossierTemplateStats;
readonly #dossierTemplateId: string;
constructor(
protected readonly _injector: Injector,
@ -54,13 +54,10 @@ export class DictionaryListingScreenComponent extends ListingComponent<Dictionar
) {
super(_injector);
_loadingService.start();
const dossierTemplateId = _route.snapshot.paramMap.get('dossierTemplateId');
this.templateStats = this._dossierTemplateStatsService.get(dossierTemplateId);
this.templateStats$ = this._dossierTemplateStatsService.watch$(dossierTemplateId).pipe(tap(stats => (this.templateStats = stats)));
}
async ngOnInit(): Promise<void> {
await this._loadDictionaryData(false);
this.#dossierTemplateId = _route.snapshot.paramMap.get('dossierTemplateId');
this.templateStats$ = this._dossierTemplateStatsService
.watch$(this.#dossierTemplateId)
.pipe(tap(templateStats => this._loadDictionaryData(templateStats)));
}
openDeleteDictionariesDialog($event?: MouseEvent, types = this.listingService.selected) {
@ -69,46 +66,30 @@ export class DictionaryListingScreenComponent extends ListingComponent<Dictionar
await firstValueFrom(
this._dictionaryService.deleteDictionaries(
types.map(t => t.type),
this._dossierTemplatesService.activeDossierTemplateId,
this.#dossierTemplateId,
),
);
await this._loadDictionaryData();
this._loadingService.stop();
});
}
openAddEditDictionaryDialog($event?: MouseEvent, dictionary?: Dictionary) {
this._dialogService.openDialog(
'addEditDictionary',
$event,
{
dictionary,
dossierTemplateId: this._dossierTemplatesService.activeDossierTemplateId,
},
async () => {
this._loadingService.start();
await this._loadDictionaryData();
this._loadingService.stop();
},
);
this._dialogService.openDialog('addEditDictionary', $event, {
dictionary,
dossierTemplateId: this.#dossierTemplateId,
});
}
private async _loadDictionaryData(refresh = true): Promise<void> {
if (refresh) {
await this._dictionaryService.loadDictionaryData();
}
const entities: Dictionary[] = this._dictionariesMapService
.get(this._dossierTemplatesService.activeDossierTemplateId)
.filter(d => !d.virtual);
private _loadDictionaryData(templateStats: DossierTemplateStats): void {
const entities: Dictionary[] = this._dictionariesMapService.get(this.#dossierTemplateId).filter(d => !d.virtual);
this.entitiesService.setEntities(entities);
this._calculateData();
this._calculateData(templateStats);
}
private _calculateData(): void {
private _calculateData(templateStats: DossierTemplateStats): void {
this.chartData = this.allEntities.map(dict => ({
value: this.templateStats.dictionarySummary(dict.type).entriesCount ?? 0,
value: templateStats.dictionarySummary(dict.type).entriesCount ?? 0,
color: dict.hexColor,
label: dict.label,
key: dict.type,

View File

@ -7,7 +7,6 @@ import { DictionaryManagerComponent } from '@shared/components/dictionary-manage
import { DictionaryService } from '@shared/services/dictionary.service';
import { CircleButtonTypes, LoadingService } from '@iqser/common-ui';
import { UserService } from '@services/user.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { Dictionary } from '@red/domain';
import { firstValueFrom, Observable, of } from 'rxjs';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
@ -35,7 +34,6 @@ export class DictionaryOverviewScreenComponent {
private readonly _userService: UserService,
private readonly _activatedRoute: ActivatedRoute,
private readonly _loadingService: LoadingService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dialogService: AdminDialogService,
protected readonly _translateService: TranslateService,
private readonly _dictionaryService: DictionaryService,
@ -56,19 +54,10 @@ export class DictionaryOverviewScreenComponent {
}
openEditDictionaryDialog(dictionary: Dictionary, $event: MouseEvent) {
this._dialogService.openDialog(
'addEditDictionary',
$event,
{
dictionary,
dossierTemplateId: dictionary.dossierTemplateId,
},
async () => {
this._loadingService.start();
await this._dictionaryService.loadDictionaryData();
this._loadingService.stop();
},
);
this._dialogService.openDialog('addEditDictionary', $event, {
dictionary,
dossierTemplateId: dictionary.dossierTemplateId,
});
}
openDeleteDictionaryDialog(dictionary: Dictionary, $event?: MouseEvent) {
@ -76,14 +65,7 @@ export class DictionaryOverviewScreenComponent {
this._dialogService.openDialog('confirm', $event, null, async () => {
await firstValueFrom(this._dictionaryService.deleteDictionaries([dictionary.type], dictionary.dossierTemplateId));
await this._dictionaryService.loadDictionaryData();
await this._router.navigate([
'/main',
'admin',
'dossier-templates',
this._dossierTemplatesService.activeDossierTemplateId,
'dictionaries',
]);
await this._router.navigate(['/main', 'admin', 'dossier-templates', dictionary.dossierTemplateId, 'dictionaries']);
});
}

View File

@ -14,9 +14,9 @@ import { dossierAttributeTypesTranslations } from '../../translations/dossier-at
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { UserService } from '@services/user.service';
import { DossierAttributeConfig, IDossierAttributeConfig } from '@red/domain';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { firstValueFrom } from 'rxjs';
import { ReportTemplateService } from '../../../../services/report-template.service';
import { ActivatedRoute } from '@angular/router';
@Component({
templateUrl: './dossier-attributes-listing-screen.component.html',
@ -38,17 +38,19 @@ export class DossierAttributesListingScreenComponent extends ListingComponent<Do
{ label: _('dossier-attributes-listing.table-col-names.placeholder'), width: '2fr' },
{ label: _('dossier-attributes-listing.table-col-names.type'), sortByKey: 'type' },
];
readonly #dossierTemplateId: string;
constructor(
protected readonly _injector: Injector,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dialogService: AdminDialogService,
private readonly _loadingService: LoadingService,
private readonly _dossierAttributesService: DossierAttributesService,
private readonly _userService: UserService,
private readonly _reportTemplateService: ReportTemplateService,
private readonly _route: ActivatedRoute,
) {
super(_injector);
this.#dossierTemplateId = _route.snapshot.paramMap.get('dossierTemplateId');
}
async ngOnInit(): Promise<void> {
@ -56,7 +58,7 @@ export class DossierAttributesListingScreenComponent extends ListingComponent<Do
}
async openConfirmDeleteAttributeDialog($event: MouseEvent, dossierAttribute?: DossierAttributeConfig) {
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
const dossierTemplateId = this.#dossierTemplateId;
const resp = await firstValueFrom(
this._reportTemplateService.getTemplatesByPlaceholder(dossierTemplateId, dossierAttribute.placeholder),
);
@ -64,13 +66,13 @@ export class DossierAttributesListingScreenComponent extends ListingComponent<Do
this._dialogService.openDialog('deleteAttribute', $event, { attribute: dossierAttribute, templates: resp }, async () => {
this._loadingService.start();
const ids = dossierAttribute ? [dossierAttribute.id] : this.listingService.selected.map(item => item.id);
await firstValueFrom(this._dossierAttributesService.delete(ids));
await firstValueFrom(this._dossierAttributesService.delete(ids, dossierTemplateId));
await this._loadData();
});
}
openAddEditAttributeDialog($event: MouseEvent, dossierAttribute?: IDossierAttributeConfig) {
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
const dossierTemplateId = this.#dossierTemplateId;
this._dialogService.openDialog('addEditDossierAttribute', $event, { dossierAttribute, dossierTemplateId }, async () =>
this._loadData(),
@ -79,7 +81,7 @@ export class DossierAttributesListingScreenComponent extends ListingComponent<Do
private async _loadData() {
this._loadingService.start();
await firstValueFrom(this._dossierAttributesService.loadAll());
await firstValueFrom(this._dossierAttributesService.loadAll(this.#dossierTemplateId));
this._loadingService.stop();
}
}

View File

@ -16,9 +16,7 @@ import { UserService } from '@services/user.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { RouterHistoryService } from '@services/router-history.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { HttpStatusCode } from '@angular/common/http';
import { firstValueFrom } from 'rxjs';
import { DictionaryService } from '../../../../shared/services/dictionary.service';
@Component({
templateUrl: './dossier-templates-listing-screen.component.html',
@ -48,7 +46,6 @@ export class DossierTemplatesListingScreenComponent extends ListingComponent<Dos
protected readonly _injector: Injector,
private readonly _userService: UserService,
private readonly _loadingService: LoadingService,
private readonly _dictionaryService: DictionaryService,
private readonly _dialogService: AdminDialogService,
readonly routerHistoryService: RouterHistoryService,
readonly userPreferenceService: UserPreferenceService,
@ -68,13 +65,6 @@ export class DossierTemplatesListingScreenComponent extends ListingComponent<Dos
}
private async _deleteTemplates(templateIds = this.listingService.selected.map(d => d.dossierTemplateId)) {
await firstValueFrom(this._dossierTemplatesService.delete(templateIds)).catch(error => {
if (error.status === HttpStatusCode.Conflict) {
this._toaster.error(_('dossier-templates-listing.error.conflict'));
} else {
this._toaster.error(_('dossier-templates-listing.error.generic'));
}
});
await this._dictionaryService.loadDictionaryData();
await firstValueFrom(this._dossierTemplatesService.delete(templateIds));
}
}

View File

@ -14,11 +14,11 @@ import { UserService } from '@services/user.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { FileAttributeConfig, IFileAttributeConfig, IFileAttributesConfig } from '@red/domain';
import { FileAttributesService } from '@services/entity-services/file-attributes.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { HttpStatusCode } from '@angular/common/http';
import { firstValueFrom } from 'rxjs';
import { ReportTemplateService } from '../../../../services/report-template.service';
import { DictionaryService } from '../../../shared/services/dictionary.service';
import { ActivatedRoute } from '@angular/router';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
@Component({
templateUrl: './file-attributes-listing-screen.component.html',
@ -51,19 +51,21 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
];
private _existingConfiguration: IFileAttributesConfig;
@ViewChild('fileInput') private _fileInput: ElementRef;
readonly #dossierTemplateId: string;
constructor(
protected readonly _injector: Injector,
private readonly _toaster: Toaster,
private readonly _userService: UserService,
private readonly _loadingService: LoadingService,
private readonly _dictionaryService: DictionaryService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dialogService: AdminDialogService,
private readonly _fileAttributesService: FileAttributesService,
private readonly _reportTemplateService: ReportTemplateService,
private readonly _route: ActivatedRoute,
) {
super(_injector);
this.#dossierTemplateId = _route.snapshot.paramMap.get('dossierTemplateId');
}
private get _numberOfDisplayedAttrs(): number {
@ -81,7 +83,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
openAddEditAttributeDialog($event: MouseEvent, fileAttribute?: IFileAttributeConfig) {
const data = {
fileAttribute,
dossierTemplateId: this._dossierTemplatesService.activeDossierTemplateId,
dossierTemplateId: this.#dossierTemplateId,
numberOfDisplayedAttrs: this._numberOfDisplayedAttrs,
numberOfFilterableAttrs: this._numberOfFilterableAttrs,
};
@ -91,7 +93,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
}
async openConfirmDeleteAttributeDialog($event: MouseEvent, fileAttribute?: FileAttributeConfig) {
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
const dossierTemplateId = this.#dossierTemplateId;
const resp = await firstValueFrom(
this._reportTemplateService.getTemplatesByPlaceholder(dossierTemplateId, fileAttribute.placeholder),
);
@ -108,7 +110,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
),
);
}
await this._dictionaryService.refreshDossierTemplate(dossierTemplateId);
await this._dossierTemplatesService.refreshDossierTemplate(dossierTemplateId);
await this._loadData();
});
}
@ -122,7 +124,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
null,
{
csv,
dossierTemplateId: this._dossierTemplatesService.activeDossierTemplateId,
dossierTemplateId: this.#dossierTemplateId,
existingConfiguration: this._existingConfiguration,
},
async () => this._loadData(),
@ -130,13 +132,14 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
}
openConfigurationsDialog($event: MouseEvent) {
this._dialogService.openDialog('fileAttributesConfigurations', $event, this._existingConfiguration);
this._dialogService.openDialog('fileAttributesConfigurations', $event, {
config: this._existingConfiguration,
dossierTemplateId: this.#dossierTemplateId,
});
}
private async _createNewFileAttributeAndRefreshView(newValue: IFileAttributeConfig): Promise<void> {
await firstValueFrom(
this._fileAttributesService.setFileAttributesConfig(newValue, this._dossierTemplatesService.activeDossierTemplateId),
).catch(error => {
await firstValueFrom(this._fileAttributesService.setFileAttributesConfig(newValue, this.#dossierTemplateId)).catch(error => {
if (error.status === HttpStatusCode.Conflict) {
this._toaster.error(_('file-attributes-listing.error.conflict'));
} else {
@ -144,7 +147,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
}
this._loadingService.stop();
});
await this._dictionaryService.refreshDossierTemplate(this._dossierTemplatesService.activeDossierTemplateId);
await this._dossierTemplatesService.refreshDossierTemplate(this.#dossierTemplateId);
await this._loadData();
}
@ -152,9 +155,7 @@ export class FileAttributesListingScreenComponent extends ListingComponent<FileA
this._loadingService.start();
try {
const response = await firstValueFrom(
this._fileAttributesService.getFileAttributesConfig(this._dossierTemplatesService.activeDossierTemplateId),
);
const response = await firstValueFrom(this._fileAttributesService.loadFileAttributesConfig(this.#dossierTemplateId));
this._existingConfiguration = response;
const fileAttributeConfig = response?.fileAttributeConfigs.map(item => new FileAttributeConfig(item)) || [];
this.entitiesService.setEntities(fileAttributeConfig);

View File

@ -29,6 +29,6 @@ export class DossierTemplateInfoScreenComponent {
}
openEditDossierTemplateDialog($event: MouseEvent, dossierTemplate: DossierTemplate) {
this._dialogService.openDialog('addEditDossierTemplate', $event, dossierTemplate);
this._dialogService.openDialog('addEditDossierTemplate', $event, dossierTemplate.id);
}
}

View File

@ -1,8 +1,8 @@
<section class="dialog">
<div
[translateParams]="{
type: justification ? 'edit' : 'create',
name: justification?.name
type: data.justification ? 'edit' : 'create',
name: data.justification?.name
}"
[translate]="'add-edit-justification.title'"
class="dialog-header heading-l"
@ -47,9 +47,9 @@
{{ 'add-edit-justification.actions.save' | translate }}
</button>
<div class="all-caps-label cancel" translate="add-edit-justification.actions.cancel" (click)="close()"></div>
<div (click)="close()" class="all-caps-label cancel" translate="add-edit-justification.actions.cancel"></div>
</div>
</form>
<iqser-circle-button class="dialog-close" icon="iqser:close" (action)="close()"></iqser-circle-button>
<iqser-circle-button (action)="close()" class="dialog-close" icon="iqser:close"></iqser-circle-button>
</section>

View File

@ -14,7 +14,6 @@ import { firstValueFrom } from 'rxjs';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AddEditJustificationDialogComponent extends BaseDialogComponent {
constructor(
private readonly _formBuilder: FormBuilder,
private readonly _justificationService: JustificationsService,
@ -22,7 +21,7 @@ export class AddEditJustificationDialogComponent extends BaseDialogComponent {
private readonly _loadingService: LoadingService,
protected readonly _injector: Injector,
protected readonly _dialogRef: MatDialogRef<AddEditJustificationDialogComponent>,
@Inject(MAT_DIALOG_DATA) public justification: Justification,
@Inject(MAT_DIALOG_DATA) public data: { justification?: Justification; dossierTemplateId: string },
) {
super(_injector, _dialogRef);
@ -31,10 +30,10 @@ export class AddEditJustificationDialogComponent extends BaseDialogComponent {
}
async save() {
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
const dossierTemplateId = this.data.dossierTemplateId;
this._loadingService.start();
await firstValueFrom(this._justificationService.createOrUpdate(this.form.getRawValue(), dossierTemplateId));
await firstValueFrom(this._justificationService.createOrUpdate(this.form.getRawValue() as Justification, dossierTemplateId));
await firstValueFrom(this._justificationService.loadAll(dossierTemplateId));
this._loadingService.stop();
this._dialogRef.close(true);
@ -42,9 +41,9 @@ export class AddEditJustificationDialogComponent extends BaseDialogComponent {
private _getForm(): FormGroup {
return this._formBuilder.group({
name: [{ value: this.justification?.name, disabled: !!this.justification }, Validators.required],
reason: [this.justification?.reason, Validators.required],
description: [this.justification?.description, Validators.required],
name: [{ value: this.data.justification?.name, disabled: !!this.data.justification }, Validators.required],
reason: [this.data.justification?.reason, Validators.required],
description: [this.data.justification?.description, Validators.required],
});
}
}

View File

@ -38,7 +38,7 @@ export class JustificationsDialogService extends DialogService<DialogType> {
super(_dialog);
}
confirmDelete(justifications: Justification[]) {
confirmDelete(justifications: Justification[], dossierTemplateId: string) {
const data = new ConfirmationDialogInput({
title: _('confirmation-dialog.delete-justification.title'),
titleColor: TitleColors.WARN,
@ -50,7 +50,6 @@ export class JustificationsDialogService extends DialogService<DialogType> {
});
this.openDialog('confirm', null, data, async () => {
this._loadingService.start();
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
const justificationIds = justifications.map(j => j.id);
await firstValueFrom(this._justificationService.delete(justificationIds, dossierTemplateId));
await firstValueFrom(this._justificationService.loadAll(dossierTemplateId));

View File

@ -11,11 +11,11 @@ import {
} from '@iqser/common-ui';
import { Justification } from '@red/domain';
import { JustificationsService } from '@services/entity-services/justifications.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { JustificationsDialogService } from '../justifications-dialog.service';
import { UserService } from '@services/user.service';
import { UserPreferenceService } from '@services/user-preference.service';
import { firstValueFrom } from 'rxjs';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'redaction-justifications-screen',
@ -38,30 +38,32 @@ export class JustificationsScreenComponent extends ListingComponent<Justificatio
{ label: _('justifications-listing.table-col-names.reason') },
{ label: _('justifications-listing.table-col-names.description'), width: '2fr' },
];
readonly #dossierTemplateId: string;
constructor(
protected readonly _injector: Injector,
private readonly _justificationService: JustificationsService,
private readonly _loadingService: LoadingService,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _dialogService: JustificationsDialogService,
readonly userPreferenceService: UserPreferenceService,
readonly userService: UserService,
private readonly _route: ActivatedRoute,
) {
super(_injector);
this.#dossierTemplateId = _route.snapshot.paramMap.get('dossierTemplateId');
}
async ngOnInit(): Promise<void> {
this._loadingService.start();
await firstValueFrom(this._justificationService.loadAll(this._dossierTemplatesService.activeDossierTemplateId));
await firstValueFrom(this._justificationService.loadAll(this.#dossierTemplateId));
this._loadingService.stop();
}
openAddJustificationDialog(): void {
this._dialogService.openDialog('addEditJustification', null, null);
this._dialogService.openDialog('addEditJustification', null, { justification: null, dossierTemplateId: this.#dossierTemplateId });
}
openConfirmDeleteDialog() {
this._dialogService.confirmDelete(this.listingService.selected);
this._dialogService.confirmDelete(this.listingService.selected, this.#dossierTemplateId);
}
}

View File

@ -4,6 +4,7 @@ import { CircleButtonTypes, ListingService, LoadingService } from '@iqser/common
import { JustificationsDialogService } from '../justifications-dialog.service';
import { UserService } from '@services/user.service';
import { UserPreferenceService } from '@services/user-preference.service';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'redaction-table-item',
@ -14,6 +15,7 @@ import { UserPreferenceService } from '@services/user-preference.service';
export class TableItemComponent {
readonly circleButtonTypes = CircleButtonTypes;
@Input() justification: Justification;
readonly #dossierTemplateId: string;
constructor(
private readonly _dialogService: JustificationsDialogService,
@ -21,13 +23,19 @@ export class TableItemComponent {
private readonly _listingService: ListingService<Justification>,
readonly userPreferenceService: UserPreferenceService,
readonly userService: UserService,
) {}
private readonly _route: ActivatedRoute,
) {
this.#dossierTemplateId = _route.snapshot.paramMap.get('dossierTemplateId');
}
openEditJustificationDialog() {
this._dialogService.openDialog('addEditJustification', null, this.justification);
this._dialogService.openDialog('addEditJustification', null, {
justification: this.justification,
dossierTemplateId: this.#dossierTemplateId,
});
}
openConfirmDeleteDialog() {
this._dialogService.confirmDelete([this.justification]);
this._dialogService.confirmDelete([this.justification], this.#dossierTemplateId);
}
}

View File

@ -13,6 +13,7 @@ import { AdminDialogService } from '../../../services/admin-dialog.service';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { ReportTemplateService } from '@services/report-template.service';
import { BehaviorSubject, firstValueFrom } from 'rxjs';
import { ActivatedRoute } from '@angular/router';
interface Placeholder {
placeholder: string;
@ -32,6 +33,7 @@ const placeholderTypes: PlaceholderType[] = ['generalPlaceholders', 'fileAttribu
export class ReportsScreenComponent implements OnInit {
placeholders$ = new BehaviorSubject<Placeholder[]>([]);
availableTemplates$ = new BehaviorSubject<IReportTemplate[]>([]);
readonly #dossierTemplateId: string;
@ViewChild('fileInput') private _fileInput: ElementRef;
@ -41,8 +43,11 @@ export class ReportsScreenComponent implements OnInit {
private readonly _dialogService: AdminDialogService,
private readonly _toaster: Toaster,
private readonly _loadingService: LoadingService,
private readonly _route: ActivatedRoute,
readonly permissionsService: PermissionsService,
) {}
) {
this.#dossierTemplateId = _route.snapshot.paramMap.get('dossierTemplateId');
}
async ngOnInit() {
this._loadingService.start();
@ -93,8 +98,6 @@ export class ReportsScreenComponent implements OnInit {
return;
}
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
if (this.availableTemplates$.value.some(template => template.fileName === file.name)) {
const data = new ConfirmationDialogInput({
title: _('confirmation-dialog.report-template-same-name.title'),
@ -108,17 +111,17 @@ export class ReportsScreenComponent implements OnInit {
this._dialogService.openDialog('confirm', null, data, null, async result => {
if (result) {
await this._openConfirmationDialog(file, dossierTemplateId);
await this._openConfirmationDialog(file);
}
});
} else {
await this._openConfirmationDialog(file, dossierTemplateId);
await this._openConfirmationDialog(file);
}
this._fileInput.nativeElement.value = null;
}
private async _openConfirmationDialog(file: File, dossierTemplateId: string) {
private async _openConfirmationDialog(file: File) {
if (this._isExcelFile(file)) {
const data = new ConfirmationDialogInput({
title: _('confirmation-dialog.upload-report-template.title'),
@ -132,12 +135,12 @@ export class ReportsScreenComponent implements OnInit {
});
this._dialogService.openDialog('confirm', null, data, null, async result => {
if (result) {
await firstValueFrom(this._reportTemplateService.uploadTemplateForm(dossierTemplateId, result > 1, file));
await firstValueFrom(this._reportTemplateService.uploadTemplateForm(this.#dossierTemplateId, result > 1, file));
await this._loadReportTemplates();
}
});
} else {
await firstValueFrom(this._reportTemplateService.uploadTemplateForm(dossierTemplateId, false, file));
await firstValueFrom(this._reportTemplateService.uploadTemplateForm(this.#dossierTemplateId, false, file));
await this._loadReportTemplates();
}
}
@ -149,15 +152,13 @@ export class ReportsScreenComponent implements OnInit {
private async _loadReportTemplates() {
this.availableTemplates$.next(
await firstValueFrom(
this._reportTemplateService.getAvailableReportTemplates(this._dossierTemplatesService.activeDossierTemplateId),
),
await firstValueFrom(this._reportTemplateService.getAvailableReportTemplates(this.#dossierTemplateId)),
);
}
private async _loadPlaceholders() {
const placeholdersResponse: IPlaceholdersResponse = await firstValueFrom(
this._reportTemplateService.getAvailablePlaceholders(this._dossierTemplatesService.activeDossierTemplateId),
this._reportTemplateService.getAvailablePlaceholders(this.#dossierTemplateId),
);
this.placeholders$.next(
placeholderTypes.flatMap(type =>

View File

@ -4,9 +4,9 @@ import { Debounce, IconButtonTypes, LoadingService, Toaster } from '@iqser/commo
import { TranslateService } from '@ngx-translate/core';
import { saveAs } from 'file-saver';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { RulesService } from '../../../services/rules.service';
import { firstValueFrom } from 'rxjs';
import { ActivatedRoute } from '@angular/router';
import ICodeEditor = monaco.editor.ICodeEditor;
import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration;
import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorConstructionOptions;
@ -36,16 +36,19 @@ export class RulesScreenComponent implements OnInit {
private _codeEditor: ICodeEditor;
private _decorations: string[] = [];
readonly #dossierTemplateId: string;
constructor(
readonly permissionsService: PermissionsService,
private readonly _rulesService: RulesService,
private readonly _changeDetectorRef: ChangeDetectorRef,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _toaster: Toaster,
protected readonly _translateService: TranslateService,
private readonly _loadingService: LoadingService,
) {}
private readonly _route: ActivatedRoute,
) {
this.#dossierTemplateId = _route.snapshot.paramMap.get('dossierTemplateId');
}
set isLeavingPage(isLeaving: boolean) {
this.isLeaving = isLeaving;
@ -95,7 +98,7 @@ export class RulesScreenComponent implements OnInit {
await firstValueFrom(
this._rulesService.uploadRules({
rules: this._codeEditor.getModel().getValue(),
dossierTemplateId: this._dossierTemplatesService.activeDossierTemplateId,
dossierTemplateId: this.#dossierTemplateId,
}),
).then(
async () => {
@ -125,7 +128,7 @@ export class RulesScreenComponent implements OnInit {
}
upload($event): void {
const file = $event.target.files[0];
const file: File = $event.target.files[0];
const fileReader = new FileReader();
if (file) {
@ -152,7 +155,7 @@ export class RulesScreenComponent implements OnInit {
private async _initialize() {
this._loadingService.start();
await firstValueFrom(this._rulesService.download(this._dossierTemplatesService.activeDossierTemplateId)).then(
await firstValueFrom(this._rulesService.download(this.#dossierTemplateId)).then(
rules => {
this.currentLines = this.initialLines = rules.rules.split('\n');
this.revert();

View File

@ -1,4 +1,4 @@
import { ChangeDetectorRef, Component, ElementRef, Inject, OnInit, ViewChild } from '@angular/core';
import { ChangeDetectorRef, Component, ElementRef, Inject, ViewChild } from '@angular/core';
import { PermissionsService } from '@services/permissions.service';
import WebViewer, { WebViewerInstance } from '@pdftron/webviewer';
import { environment } from '@environments/environment';
@ -11,7 +11,9 @@ import { stampPDFPage } from '@utils/page-stamper';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { WatermarkService } from '@shared/services/watermark.service';
import { firstValueFrom } from 'rxjs';
import { firstValueFrom, Observable, of, switchMap } from 'rxjs';
import { catchError, tap } from 'rxjs/operators';
import { ActivatedRoute } from '@angular/router';
export const DEFAULT_WATERMARK: IWatermark = {
text: null,
@ -27,9 +29,10 @@ export const DEFAULT_WATERMARK: IWatermark = {
templateUrl: './watermark-screen.component.html',
styleUrls: ['./watermark-screen.component.scss'],
})
export class WatermarkScreenComponent implements OnInit {
export class WatermarkScreenComponent {
readonly iconButtonTypes = IconButtonTypes;
readonly form: FormGroup = this._getForm();
readonly #dossierTemplateId: string;
private _instance: WebViewerInstance;
private _watermark: IWatermark = {};
@ViewChild('viewer', { static: true })
@ -45,8 +48,10 @@ export class WatermarkScreenComponent implements OnInit {
private readonly _formBuilder: FormBuilder,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _loadingService: LoadingService,
private readonly _route: ActivatedRoute,
) {
this._loadingService.start();
this.#dossierTemplateId = this._route.snapshot.paramMap.get('dossierTemplateId');
}
get changed(): boolean {
@ -61,8 +66,8 @@ export class WatermarkScreenComponent implements OnInit {
return false;
}
ngOnInit(): void {
this._loadWatermark();
async ngOnInit(): Promise<void> {
await firstValueFrom(this._loadWatermark());
}
@Debounce()
@ -70,26 +75,27 @@ export class WatermarkScreenComponent implements OnInit {
await this._drawWatermark();
}
save() {
const watermark = {
...this.form.getRawValue(),
};
const dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId;
async save(): Promise<void> {
const watermark: IWatermark = this.form.getRawValue();
const observable = watermark.text
? this._watermarkService.saveWatermark(watermark, dossierTemplateId)
: this._watermarkService.deleteWatermark(dossierTemplateId);
? this._watermarkService.saveWatermark(watermark, this.#dossierTemplateId)
: this._watermarkService.deleteWatermark(this.#dossierTemplateId);
firstValueFrom(observable).then(
() => {
this._loadWatermark();
this._toaster.success(
watermark.text ? _('watermark-screen.action.change-success') : _('watermark-screen.action.delete-success'),
);
},
() => this._toaster.error(_('watermark-screen.action.error')),
);
try {
await firstValueFrom(
observable.pipe(
switchMap(() => this._loadWatermark()),
tap(() => {
this._toaster.success(
watermark.text ? _('watermark-screen.action.change-success') : _('watermark-screen.action.delete-success'),
);
}),
),
);
} catch (error) {
this._toaster.error(_('watermark-screen.action.error'));
}
}
async revert() {
@ -106,18 +112,14 @@ export class WatermarkScreenComponent implements OnInit {
}
}
private _loadWatermark() {
this._watermarkService.getWatermark(this._dossierTemplatesService.activeDossierTemplateId).subscribe(
watermark => {
private _loadWatermark(): Observable<IWatermark> {
return this._watermarkService.getWatermark(this.#dossierTemplateId).pipe(
catchError(() => of(DEFAULT_WATERMARK)),
tap(watermark => {
this._watermark = watermark;
this.form.setValue({ ...this._watermark });
this.form.setValue({ ...watermark });
this._loadViewer();
},
() => {
this._watermark = DEFAULT_WATERMARK;
this.form.setValue({ ...this._watermark });
this._loadViewer();
},
}),
);
}
@ -132,7 +134,7 @@ export class WatermarkScreenComponent implements OnInit {
isReadOnly: true,
backendType: 'ems',
},
this._viewer.nativeElement,
this._viewer.nativeElement as HTMLElement,
).then(instance => {
this._instance = instance;
@ -162,12 +164,12 @@ export class WatermarkScreenComponent implements OnInit {
const pdfNet = this._instance.Core.PDFNet;
const document = await this._instance.Core.documentViewer.getDocument().getPDFDoc();
const text = this.form.get('text').value || '';
const fontSize = this.form.get('fontSize').value;
const fontType = this.form.get('fontType').value;
const text: string = this.form.get('text').value || '';
const fontSize: number = this.form.get('fontSize').value;
const fontType: string = this.form.get('fontType').value;
const orientation: WatermarkOrientation = this.form.get('orientation').value;
const opacity = this.form.get('opacity').value;
const color = this.form.get('hexColor').value;
const opacity: number = this.form.get('opacity').value;
const color: string = this.form.get('hexColor').value;
await stampPDFPage(document, pdfNet, text, fontSize, fontType, orientation, opacity, color, [1]);
this._instance.Core.documentViewer.refreshAll();

View File

@ -11,7 +11,6 @@ import { ConfirmDeleteUsersDialogComponent } from '../dialogs/confirm-delete-use
import { FileAttributesCsvImportDialogComponent } from '../dialogs/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component';
import { AddEditDossierAttributeDialogComponent } from '../dialogs/add-edit-dossier-attribute-dialog/add-edit-dossier-attribute-dialog.component';
import { ConfirmationDialogComponent, DialogConfig, DialogService, largeDialogConfig } from '@iqser/common-ui';
import { AddEditJustificationDialogComponent } from '../screens/justifications/add-edit-justification-dialog/add-edit-justification-dialog.component';
import { UploadDictionaryDialogComponent } from '../dialogs/upload-dictionary-dialog/upload-dictionary-dialog.component';
import { FileAttributesConfigurationsDialogComponent } from '../dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component';
@ -28,7 +27,6 @@ type DialogType =
| 'smtpAuthConfig'
| 'addEditDossierTemplate'
| 'addEditDossierAttribute'
| 'addEditJustification'
| 'uploadDictionary';
@Injectable()
@ -81,10 +79,6 @@ export class AdminDialogService extends DialogService<DialogType> {
component: AddEditDossierAttributeDialogComponent,
dialogConfig: { autoFocus: true },
},
addEditJustification: {
component: AddEditJustificationDialogComponent,
dialogConfig: { autoFocus: true },
},
uploadDictionary: {
component: UploadDictionaryDialogComponent,
},

View File

@ -1,11 +1,9 @@
import { Component, Input, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { ActivatedRoute, Router } from '@angular/router';
import { AdminDialogService } from '../../../services/admin-dialog.service';
import { CircleButtonTypes, LoadingService, Toaster } from '@iqser/common-ui';
import { UserService } from '@services/user.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { HttpStatusCode } from '@angular/common/http';
import { firstValueFrom } from 'rxjs';
import { DictionaryService } from '../../../../shared/services/dictionary.service';
@ -22,6 +20,7 @@ export class DossierTemplateActionsComponent implements OnInit {
constructor(
private readonly _router: Router,
private readonly _route: ActivatedRoute,
private readonly _toaster: Toaster,
private readonly _userService: UserService,
private readonly _loadingService: LoadingService,
@ -30,36 +29,21 @@ export class DossierTemplateActionsComponent implements OnInit {
private readonly _dossierTemplatesService: DossierTemplatesService,
) {}
get dossierTemplate() {
return this._dossierTemplatesService.find(this.dossierTemplateId);
}
ngOnInit() {
this.dossierTemplateId ??= this._dossierTemplatesService.activeDossierTemplateId;
this.dossierTemplateId ??= this._route.snapshot.paramMap.get('dossierTemplateId');
}
openEditDossierTemplateDialog($event: any) {
this._dialogService.openDialog('addEditDossierTemplate', $event, this.dossierTemplate);
openEditDossierTemplateDialog($event: MouseEvent) {
this._dialogService.openDialog('addEditDossierTemplate', $event, this.dossierTemplateId);
}
openDeleteDossierTemplateDialog($event?: MouseEvent) {
this._dialogService.openDialog('confirm', $event, null, async () => {
this._loadingService.start();
await firstValueFrom(this._dossierTemplatesService.delete([this.dossierTemplateId]))
.then(async () => {
await firstValueFrom(this._dossierTemplatesService.loadAll());
await this._dictionaryService.loadDictionaryData();
await this._router.navigate(['main', 'admin']);
})
.catch(error => {
if (error.status === HttpStatusCode.Conflict) {
this._toaster.error(_('dossier-templates-listing.error.conflict'));
} else {
this._toaster.error(_('dossier-templates-listing.error.generic'));
}
this._loadingService.stop();
});
await firstValueFrom(this._dossierTemplatesService.delete([this.dossierTemplateId]));
await this._router.navigate(['main', 'admin']);
this._loadingService.stop();
});
}

View File

@ -34,7 +34,7 @@ export class DocumentInfoDialogComponent extends BaseDialogComponent implements
async ngOnInit() {
super.ngOnInit();
this.attributes = (
await firstValueFrom(this._fileAttributesService.getFileAttributesConfig(this._dossier.dossierTemplateId))
await firstValueFrom(this._fileAttributesService.loadFileAttributesConfig(this._dossier.dossierTemplateId))
).fileAttributeConfigs.filter(attr => attr.editable);
this.form = this._getForm();
this.initialFormValue = this.form.getRawValue();

View File

@ -1,7 +1,6 @@
import { Injectable, Injector } from '@angular/core';
import { Dossier, DossierAttributeConfig, DossierAttributeWithValue, IDossierAttribute, IDossierAttributeConfig } from '@red/domain';
import { firstValueFrom, Observable } from 'rxjs';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { EntitiesService, List, mapEach, RequiredParam, Validate } from '@iqser/common-ui';
import { map, tap } from 'rxjs/operators';
@ -9,7 +8,7 @@ import { map, tap } from 'rxjs/operators';
providedIn: 'root',
})
export class DossierAttributesService extends EntitiesService<DossierAttributeConfig, IDossierAttributeConfig> {
constructor(private readonly _dossierTemplatesService: DossierTemplatesService, protected readonly _injector: Injector) {
constructor(protected readonly _injector: Injector) {
super(_injector, DossierAttributeConfig, 'dossier-attributes');
}
@ -32,12 +31,12 @@ export class DossierAttributesService extends EntitiesService<DossierAttributeCo
}
@Validate()
delete(@RequiredParam() ids: List, dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId): Observable<unknown> {
delete(@RequiredParam() ids: List, dossierTemplateId: string): Observable<unknown> {
const queryParams = ids.map(id => ({ key: 'dossierAttributeIds', value: id }));
return this._post(null, `${this._defaultModelPath}/config/delete/${dossierTemplateId}`, queryParams);
}
loadAll(dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId): Observable<DossierAttributeConfig[]> {
loadAll(dossierTemplateId: string): Observable<DossierAttributeConfig[]> {
return this.getConfig(dossierTemplateId).pipe(
map(entities => entities ?? []),
mapEach(entity => new DossierAttributeConfig(entity)),
@ -48,7 +47,7 @@ export class DossierAttributesService extends EntitiesService<DossierAttributeCo
@Validate()
createOrUpdate(
@RequiredParam() attributeConfig: IDossierAttributeConfig,
dossierTemplateId = this._dossierTemplatesService.activeDossierTemplateId,
dossierTemplateId: string,
): Observable<IDossierAttributeConfig> {
return this._post(attributeConfig, `${this._defaultModelPath}/config/${dossierTemplateId}`);
}

View File

@ -1,15 +1,15 @@
import { Injectable, Injector } from '@angular/core';
import { firstValueFrom, forkJoin, Observable, of, throwError } from 'rxjs';
import { EntitiesService, List, QueryParam, RequiredParam, Toaster, Validate } from '@iqser/common-ui';
import { Dictionary, DossierTemplate, IColors, IDictionary, IUpdateDictionary } from '@red/domain';
import { Dictionary, IColors, IDictionary, IUpdateDictionary } from '@red/domain';
import { catchError, map, mapTo, switchMap, tap } from 'rxjs/operators';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DossierTemplateStatsService } from '@services/entity-services/dossier-template-stats.service';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
import { FALLBACK_COLOR } from '@utils/constants';
import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service';
import { hexToRgb } from '@utils/functions';
import { FileAttributesService } from '@services/entity-services/file-attributes.service';
import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http';
const MIN_WORD_LENGTH = 2;
@ -20,7 +20,6 @@ export class DictionaryService extends EntitiesService<Dictionary, IDictionary>
constructor(
private readonly _toaster: Toaster,
protected readonly _injector: Injector,
private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _fileAttributesService: FileAttributesService,
private readonly _dossierTemplateStatsService: DossierTemplateStatsService,
private readonly _dictionariesMapService: DictionariesMapService,
@ -45,7 +44,12 @@ export class DictionaryService extends EntitiesService<Dictionary, IDictionary>
const queryParams = dossierId ? [{ key: 'dossierId', value: dossierId }] : undefined;
const url = `${this._defaultModelPath}/type/${dossierTemplateId}/delete`;
return this._post<unknown>(body, url, queryParams).pipe(
switchMap(dictionaries => this._dossierTemplateStatsService.getFor([dossierTemplateId]).pipe(mapTo(dictionaries))),
switchMap(dictionaries =>
forkJoin([
this._dossierTemplateStatsService.getFor([dossierTemplateId]),
this.loadDictionaryDataForDossierTemplate(dossierTemplateId),
]).pipe(mapTo(dictionaries)),
),
);
}
@ -90,11 +94,17 @@ export class DictionaryService extends EntitiesService<Dictionary, IDictionary>
@RequiredParam() dossierTemplateId: string,
@RequiredParam() type: string,
dossierId?: string,
) {
): Observable<Dictionary> {
const url = `${this._defaultModelPath}/type/${type}/${dossierTemplateId}`;
const queryParams = dossierId ? [{ key: 'dossierId', value: dossierId }] : undefined;
return this._post(body, url, queryParams).pipe(
switchMap(dictionary => this._dossierTemplateStatsService.getFor([dossierTemplateId]).pipe(mapTo(dictionary))),
catchError((error: HttpErrorResponse) => this.#addUpdateDictionaryErrorToast(error)),
switchMap(dictionary =>
forkJoin([
this._dossierTemplateStatsService.getFor([dossierTemplateId]),
this.loadDictionaryDataForDossierTemplate(dossierTemplateId),
]).pipe(map(() => this._dictionariesMapService.get(dictionary.dossierTemplateId, dictionary.type))),
),
);
}
@ -102,18 +112,27 @@ export class DictionaryService extends EntitiesService<Dictionary, IDictionary>
* Set system colors for redaction
*/
@Validate()
setColors(@RequiredParam() body: IColors, @RequiredParam() dossierTemplateId: string) {
return this._post(body, `color/${dossierTemplateId}`);
setColors(@RequiredParam() body: IColors, @RequiredParam() dossierTemplateId: string): Observable<Dictionary[]> {
return this._post(body, `color/${dossierTemplateId}`).pipe(
switchMap(() => this.loadDictionaryDataForDossierTemplate(dossierTemplateId)),
);
}
/**
* Creates entry type with colors, hint and caseInsensitive
*/
@Validate()
addDictionary(@RequiredParam() dictionary: IDictionary, dossierId?: string) {
addDictionary(@RequiredParam() dictionary: IDictionary, dossierId?: string): Observable<Dictionary> {
const queryParams = dossierId ? [{ key: 'dossierId', value: dossierId }] : undefined;
return this._post(dictionary, `${this._defaultModelPath}/type`, queryParams).pipe(
switchMap(() => this._dossierTemplateStatsService.getFor([dictionary.dossierTemplateId])),
catchError((error: HttpErrorResponse) => this.#addUpdateDictionaryErrorToast(error)),
switchMap(() =>
forkJoin([
this._dossierTemplateStatsService.getFor([dictionary.dossierTemplateId]),
this.loadDictionaryDataForDossierTemplate(dictionary.dossierTemplateId),
]),
),
map(() => this._dictionariesMapService.get(dictionary.dossierTemplateId, dictionary.type)),
);
}
@ -180,71 +199,15 @@ export class DictionaryService extends EntitiesService<Dictionary, IDictionary>
return possibleDictionaries;
}
async loadDictionaryDataIfNecessary() {
if (this._dictionariesMapService.empty) {
await this.loadDictionaryData();
}
}
async loadDictionaryData(): Promise<void> {
loadDictionaryData(dossierTemplatesIds: string[]): Observable<Dictionary[][]> {
const observables: Observable<Dictionary[]>[] = [];
for (const dossierTemplate of this._dossierTemplatesService.all) {
observables.push(this._loadDictionaryDataForDossierTemplate$(dossierTemplate.dossierTemplateId));
for (const dossierTemplateId of dossierTemplatesIds) {
observables.push(this.loadDictionaryDataForDossierTemplate(dossierTemplateId));
}
await firstValueFrom(forkJoin(observables));
return forkJoin(observables);
}
async refreshDossierTemplateDictionaryData(dossierTemplateId: string): Promise<void> {
await firstValueFrom(this._loadDictionaryDataForDossierTemplate$(dossierTemplateId));
}
// TODO: Maybe move this in dossier templates service
async refreshDossierTemplate(dossierTemplateId: string) {
const dossierTemplate = await firstValueFrom(this._dossierTemplatesService.get(dossierTemplateId));
await firstValueFrom(this._fileAttributesService.getFileAttributesConfig(dossierTemplateId));
const newDossierTemplate = new DossierTemplate(dossierTemplate);
this._dossierTemplatesService.replace(newDossierTemplate);
await this.refreshDossierTemplateDictionaryData(dossierTemplateId);
}
/**
* Add dictionary entries with entry type.
*/
@Validate()
private _addEntry(
@RequiredParam() body: List,
@RequiredParam() dossierTemplateId: string,
@RequiredParam() type: string,
dossierId?: string,
removeCurrent?: boolean,
) {
const queryParams: List<QueryParam> = [
{ key: 'dossierId', value: dossierId },
{ key: 'removeCurrent', value: removeCurrent },
];
const url = `${this._defaultModelPath}/${type}/${dossierTemplateId}`;
return this._post(body, url, queryParams);
}
/**
* Delete dictionary entries with entry type.
*/
@Validate()
private _deleteEntries(
@RequiredParam() body: List,
@RequiredParam() dossierTemplateId: string,
@RequiredParam() type: string,
@RequiredParam() dossierId?: string,
) {
const queryParams = dossierId ? [{ key: 'dossierId', value: dossierId }] : undefined;
const url = `${this._defaultModelPath}/delete/${type}/${dossierTemplateId}`;
return this._post(body, url, queryParams);
}
private _loadDictionaryDataForDossierTemplate$(dossierTemplateId: string): Observable<Dictionary[]> {
loadDictionaryDataForDossierTemplate(dossierTemplateId: string): Observable<Dictionary[]> {
const types$: Observable<Dictionary[]> = this.getAllDictionaries(dossierTemplateId).pipe(
map(typesResponse => typesResponse.types.map(type => new Dictionary(type))),
);
@ -305,4 +268,49 @@ export class DictionaryService extends EntitiesService<Dictionary, IDictionary>
.pipe(map(([types, virtualTypes]: Dictionary[][]) => [...types, ...virtualTypes]))
.pipe(tap(dictionaries => this._dictionariesMapService.set(dossierTemplateId, dictionaries)));
}
#addUpdateDictionaryErrorToast(error: HttpErrorResponse): Observable<never> {
if (error.status === HttpStatusCode.Conflict) {
this._toaster.error(_('add-edit-dictionary.error.dictionary-already-exists'));
} else if (error.status === HttpStatusCode.BadRequest) {
this._toaster.error(_('add-edit-dictionary.error.invalid-color-or-rank'));
} else {
this._toaster.error(_('add-edit-dictionary.error.generic'));
}
return throwError(() => error);
}
/**
* Add dictionary entries with entry type.
*/
@Validate()
private _addEntry(
@RequiredParam() body: List,
@RequiredParam() dossierTemplateId: string,
@RequiredParam() type: string,
dossierId?: string,
removeCurrent?: boolean,
) {
const queryParams: List<QueryParam> = [
{ key: 'dossierId', value: dossierId },
{ key: 'removeCurrent', value: removeCurrent },
];
const url = `${this._defaultModelPath}/${type}/${dossierTemplateId}`;
return this._post(body, url, queryParams);
}
/**
* Delete dictionary entries with entry type.
*/
@Validate()
private _deleteEntries(
@RequiredParam() body: List,
@RequiredParam() dossierTemplateId: string,
@RequiredParam() type: string,
@RequiredParam() dossierId?: string,
) {
const queryParams = dossierId ? [{ key: 'dossierId', value: dossierId }] : undefined;
const url = `${this._defaultModelPath}/delete/${type}/${dossierTemplateId}`;
return this._post(body, url, queryParams);
}
}

View File

@ -1,79 +1,75 @@
import { EntitiesService, List, mapEach, RequiredParam, Validate } from '@iqser/common-ui';
import { EntitiesService, List, mapEach, RequiredParam, Toaster, Validate } from '@iqser/common-ui';
import { DossierTemplate, IDossierTemplate } from '@red/domain';
import { Injectable, Injector } from '@angular/core';
import { BehaviorSubject, forkJoin, Observable } from 'rxjs';
import { forkJoin, Observable, throwError } from 'rxjs';
import { FileAttributesService } from './file-attributes.service';
import { ActivationEnd, Router } from '@angular/router';
import { currentComponentRoute } from '@utils/functions';
import { mapTo, switchMap, tap } from 'rxjs/operators';
import { catchError, mapTo, switchMap, tap } from 'rxjs/operators';
import { DossierTemplateStatsService } from '@services/entity-services/dossier-template-stats.service';
import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { DictionaryService } from '@shared/services/dictionary.service';
const DOSSIER_TEMPLATE_CONFLICT_MSG = _('dossier-templates-listing.error.conflict');
const GENERIC_MSG = _('dossier-templates-listing.error.generic');
@Injectable({
providedIn: 'root',
})
export class DossierTemplatesService extends EntitiesService<DossierTemplate, IDossierTemplate> {
readonly activeDossierTemplate$: Observable<DossierTemplate | undefined>;
private readonly _activeDossierTemplate$ = new BehaviorSubject<DossierTemplate | undefined>(undefined);
constructor(
protected readonly _injector: Injector,
private readonly _toaster: Toaster,
private readonly _fileAttributesService: FileAttributesService,
private readonly _router: Router,
private readonly _dossierTemplateStatsService: DossierTemplateStatsService,
private readonly _dictionaryService: DictionaryService,
) {
super(_injector, DossierTemplate, 'dossier-template');
this.activeDossierTemplate$ = this._activeDossierTemplate$.asObservable();
_router.events.pipe(currentComponentRoute).subscribe((event: ActivationEnd) => {
const dossierTemplateId = event.snapshot.paramMap.get('dossierTemplateId');
const sameIdAsCurrentActive = dossierTemplateId === this._activeDossierTemplate$.getValue()?.dossierTemplateId;
if (sameIdAsCurrentActive) {
return;
}
if (dossierTemplateId === null || dossierTemplateId === undefined) {
return this._activeDossierTemplate$.next(undefined);
}
if (!this.has(dossierTemplateId)) {
this._activeDossierTemplate$.next(undefined);
return this._router.navigate(['/main/admin/dossier-templates']).then();
}
this._activeDossierTemplate$.next(this.find(dossierTemplateId));
});
}
get activeDossierTemplate(): DossierTemplate | undefined {
return this._activeDossierTemplate$.value;
}
get activeDossierTemplateId(): string | undefined {
return this._activeDossierTemplate$.value?.dossierTemplateId;
}
loadAll(): Observable<DossierTemplate[]> {
const getAttributes = (entities: DossierTemplate[]) => entities.map(e => this._fileAttributesService.getFileAttributesConfig(e.id));
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(
mapEach(entity => new DossierTemplate(entity)),
/* Load stats before updating entities */
switchMap(templates =>
forkJoin([this._dossierTemplateStatsService.getFor(dossierTemplateIds(templates)), ...getAttributes(templates)]).pipe(
mapTo(templates),
),
forkJoin([
this._dossierTemplateStatsService.getFor(dossierTemplateIds(templates)),
...getAttributes(templates),
this._dictionaryService.loadDictionaryData(dossierTemplateIds(templates)),
]).pipe(mapTo(templates)),
),
tap(templates => this.setEntities(templates)),
);
}
delete(body: List): Observable<unknown> {
return super._post(body, `${this._defaultModelPath}/delete`).pipe(switchMap(() => this.loadAll()));
const showToast = (error: HttpErrorResponse) => {
if (error.status === HttpStatusCode.Conflict) {
this._toaster.error(DOSSIER_TEMPLATE_CONFLICT_MSG);
} else {
this._toaster.error(GENERIC_MSG);
}
return throwError(() => error);
};
return super._post(body, `${this._defaultModelPath}/delete`).pipe(
catchError(showToast),
switchMap(() => this.loadAll()),
);
}
@Validate()
createOrUpdate(@RequiredParam() body: IDossierTemplate) {
return this._post(body).pipe(switchMap(() => this.loadAll()));
}
refreshDossierTemplate(dossierTemplateId: string): Observable<any> {
return forkJoin([
this._fileAttributesService.loadFileAttributesConfig(dossierTemplateId),
this._dictionaryService.loadDictionaryDataForDossierTemplate(dossierTemplateId),
]);
}
}

View File

@ -24,7 +24,7 @@ interface ChangesDetails {
}
const DOSSIER_EXISTS_MSG = _('add-dossier-dialog.errors.dossier-already-exists');
const GENERIC_MGS = _('add-dossier-dialog.errors.generic');
const GENERIC_MSG = _('add-dossier-dialog.errors.generic');
@Injectable({
providedIn: 'root',
@ -72,7 +72,7 @@ export class DossiersService extends EntitiesService<Dossier, IDossier> {
@Validate()
createOrUpdate(@RequiredParam() dossier: IDossierRequest): Observable<Dossier | undefined> {
const showToast = (error: HttpErrorResponse) => {
this._toaster.error(error.status === HttpStatusCode.Conflict ? DOSSIER_EXISTS_MSG : GENERIC_MGS);
this._toaster.error(error.status === HttpStatusCode.Conflict ? DOSSIER_EXISTS_MSG : GENERIC_MSG);
return throwError(error);
};

View File

@ -24,7 +24,7 @@ export class FileAttributesService extends EntitiesService<FileAttributeConfig,
* Get the file attributes that can be used at importing csv.
*/
@Validate()
getFileAttributesConfig(@RequiredParam() dossierTemplateId: string): Observable<IFileAttributesConfig> {
loadFileAttributesConfig(@RequiredParam() dossierTemplateId: string): Observable<IFileAttributesConfig> {
const request$ = this._getOne<IFileAttributesConfig>(['config', dossierTemplateId]);
return request$.pipe(
tap(entities => entities.fileAttributeConfigs.sort((c1, c2) => c1.placeholder.localeCompare(c2.placeholder))),

View File

@ -25,8 +25,6 @@ export class AppStateGuard implements CanActivate {
if (this._userService.currentUser.isUser || this._userService.currentUser.isAdmin) {
await firstValueFrom(this._userService.loadAll());
await this._dossierTemplatesService.loadAllIfEmpty();
await this._dictionaryService.loadDictionaryDataIfNecessary();
}
const { dossierTemplateId, type } = route.params;

@ -1 +1 @@
Subproject commit b040815b8568d8a4fce8faef2afc57fe6fce2e10
Subproject commit 77e22758239cf564965e82579e662416a6349010