diff --git a/apps/red-ui/src/app/modules/shared/components/select/select.component.ts b/apps/red-ui/src/app/modules/shared/components/select/select.component.ts index 5d2ac6076..6507c44b7 100644 --- a/apps/red-ui/src/app/modules/shared/components/select/select.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/select/select.component.ts @@ -1,10 +1,21 @@ -import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, HostBinding, Input, TemplateRef, ViewChild } from '@angular/core'; +import { NgForOf, NgTemplateOutlet } from '@angular/common'; +import { + AfterViewInit, + ChangeDetectorRef, + Component, + ElementRef, + HostBinding, + Input, + OnChanges, + SimpleChanges, + TemplateRef, + ViewChild, +} from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; import { MatChipListbox, MatChipSelectionChange, MatChipsModule } from '@angular/material/chips'; -import { StopPropagationDirective } from '@iqser/common-ui'; -import { NgForOf, NgTemplateOutlet } from '@angular/common'; -import { TranslateModule } from '@ngx-translate/core'; import { MatIconModule } from '@angular/material/icon'; +import { StopPropagationDirective } from '@iqser/common-ui'; +import { TranslateModule } from '@ngx-translate/core'; @Component({ selector: 'redaction-select', @@ -20,7 +31,7 @@ import { MatIconModule } from '@angular/material/icon'; ], imports: [StopPropagationDirective, NgTemplateOutlet, TranslateModule, NgForOf, MatChipsModule, MatIconModule], }) -export class SelectComponent implements AfterViewInit, ControlValueAccessor { +export class SelectComponent implements AfterViewInit, ControlValueAccessor, OnChanges { private _value: any[] = []; private _onChange: (value: any[]) => void; @Input() optionTemplate?: TemplateRef<{ option: any }>; @@ -48,12 +59,21 @@ export class SelectComponent implements AfterViewInit, ControlValueAccessor { return !!this._height; } + ngOnChanges(changes: SimpleChanges) { + if (changes.options && this.chipList) { + // This is completely shite, but we need to call _selectChips after the chips have been rendered + setTimeout(() => { + this._selectChips(this._value); + }); + } + } + @Input() valueMapper: (option: any) => any = option => option.key; ngAfterViewInit(): void { setTimeout(() => { this._selectChips(this._value); - this._changeDetector.detectChanges(); + this._changeDetector.markForCheck(); }); } @@ -78,12 +98,10 @@ export class SelectComponent implements AfterViewInit, ControlValueAccessor { registerOnTouched(): void {} writeValue(value: any[]): void { - if (this.chipList && value) { - this._selectChips(value); - } else if (value) { - this._value = value; - } else { - this._value = []; + this._value = value ?? []; + + if (this.chipList) { + this._selectChips(this._value); } } diff --git a/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.html b/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.html index af225b1bb..b959ed6db 100644 --- a/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.html +++ b/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.html @@ -51,15 +51,13 @@ [dossierTemplateId]="dossierTemplateId" [label]="'dossier-watermark-selector.watermark' | translate" formControlName="watermarkId" - > - + > - + >
diff --git a/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts b/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts index 1a23e19fd..dd99a767a 100644 --- a/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts +++ b/apps/red-ui/src/app/modules/shared/dialogs/add-dossier-dialog/add-dossier-dialog.component.ts @@ -1,5 +1,5 @@ import { Component, Inject, OnInit } from '@angular/core'; -import { UntypedFormGroup, Validators } from '@angular/forms'; +import { Validators } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { Router } from '@angular/router'; import { BaseDialogComponent, getConfig, IconButtonTypes, IqserPermissionsService, SaveOptions } from '@iqser/common-ui'; @@ -27,16 +27,12 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On readonly roles = Roles; readonly iconButtonTypes = IconButtonTypes; hasDueDate = false; - downloadTypes: { key: DownloadFileType; label: string }[] = ['ORIGINAL', 'PREVIEW', 'DELTA_PREVIEW', 'REDACTED'] - .map((type: DownloadFileType) => ({ + readonly downloadTypes: { key: DownloadFileType; label: string }[] = ['ORIGINAL', 'PREVIEW', 'DELTA_PREVIEW', 'REDACTED'].map( + (type: DownloadFileType) => ({ key: type, label: downloadTypesTranslations[type], - })) - .filter( - element => - !this.permissionsService.has(Roles.getRss) || - (this.permissionsService.has(Roles.getRss) && !['DELTA_PREVIEW', 'REDACTED'].includes(element.key)), - ); + }), + ); dossierTemplates: IDossierTemplate[]; availableReportTypes: IReportTemplate[] = []; dossierTemplateId: string; @@ -53,8 +49,8 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On @Inject(MAT_DIALOG_DATA) readonly data: DialogData, ) { super(_dialogRef); - this._getDossierTemplates(); - this.form = this._getForm(); + this.#getDossierTemplates(); + this.form = this.#getForm(); this.initialFormValue = this.form.getRawValue(); } @@ -82,7 +78,7 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On async save(options?: SaveOptions) { this._loadingService.start(); - const savedDossier = await firstValueFrom(this._activeDossiersService.createOrUpdate(this._formToObject())); + const savedDossier = await firstValueFrom(this._activeDossiersService.createOrUpdate(this.#formToObject())); if (savedDossier) { await this._router.navigate([`/${this._tenantsService.activeTenantId}${savedDossier.routerLink}`]); if (options?.addMembers) { @@ -102,20 +98,7 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On // get current selected dossierTemplate const dossierTemplate = this.dossierTemplates.find(r => r.dossierTemplateId === dossierTemplateId); - if (dossierTemplate) { - this._loadingService.start(); - this.availableReportTypes = - (await this._reportTemplateController.getAvailableReportTemplates(dossierTemplate.dossierTemplateId)) || []; - // update dropdown values - this.form.patchValue( - { - downloadFileTypes: dossierTemplate.downloadFileTypes, - reportTemplateIds: [], // TODO DEFAULT - }, - { emitEvent: false }, - ); - this._loadingService.stop(); - } else { + if (!dossierTemplate) { this.availableReportTypes = []; this.form.patchValue( { @@ -124,10 +107,24 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On }, { emitEvent: false }, ); + return; } + + this._loadingService.start(); + this.availableReportTypes = + (await this._reportTemplateController.getAvailableReportTemplates(dossierTemplate.dossierTemplateId)) || []; + const reportTemplateIds = this.#config.IS_DOCUMINE ? [this.availableReportTypes.at(0).templateId] : []; + this.form.patchValue( + { + downloadFileTypes: dossierTemplate.downloadFileTypes, + reportTemplateIds: reportTemplateIds, + }, + { emitEvent: false }, + ); + this._loadingService.stop(); } - private _getForm(): UntypedFormGroup { + #getForm() { return this._formBuilder.group( { dossierName: [null, Validators.required], @@ -143,13 +140,13 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On validators: control => { const hasReports = control.value.reportTemplateIds?.length > 0; const hasDownloadTypes = control.value.downloadFileTypes?.length > 0; - return this.#config.IS_DOCUMINE || hasReports || hasDownloadTypes ? null : { downloadPackage: true }; + return hasReports || hasDownloadTypes ? null : { downloadPackage: true }; }, }, ); } - private _getDossierTemplates() { + #getDossierTemplates() { this.dossierTemplates = this._dossierTemplatesService.all .filter(r => { const notYetValid = !!r.validFrom && dayjs(r.validFrom).isAfter(dayjs()); @@ -159,7 +156,7 @@ export class AddDossierDialogComponent extends BaseDialogComponent implements On .sort((t1, t2) => t1.name.toLowerCase().localeCompare(t2.name.toLowerCase())); } - private _formToObject(): IDossierRequest { + #formToObject(): IDossierRequest { return { dossierName: this.form.get('dossierName').value, description: this.form.get('description').value,