diff --git a/src/app/features/deposit/components/presentationals/deposit-form/deposit-form.presentational.ts b/src/app/features/deposit/components/presentationals/deposit-form/deposit-form.presentational.ts index 8a473bbf2b66d12d61f234c21e8d434793658801..53e213e1c13ec6ed4f2b62e72d35b64fbc017a19 100644 --- a/src/app/features/deposit/components/presentationals/deposit-form/deposit-form.presentational.ts +++ b/src/app/features/deposit/components/presentationals/deposit-form/deposit-form.presentational.ts @@ -99,6 +99,7 @@ import { import { debounceTime, distinctUntilChanged, + filter, map, tap, } from "rxjs/operators"; @@ -107,8 +108,8 @@ import { ConfirmDialog, ConfirmDialogData, isArray, - isEmptyString, isFalse, + isInstanceOf, isNonEmptyArray, isNonEmptyString, isNotNullNorUndefined, @@ -661,21 +662,12 @@ export class DepositFormPresentational extends AbstractPresentational implements private computeValidationTitleLanguage(subType: Enums.Deposit.DepositFriendlyNameSubTypeEnum): void { const formControlTitleLanguage = this.form.get(DepositFormRuleHelper.pathTitleLanguage) as FormControl; - const formArrayLanguages = this.form.get(DepositFormRuleHelper.pathLanguages) as FormArray; if ([ Enums.Deposit.DepositFriendlyNameSubTypeEnum.THESIS, Enums.Deposit.DepositFriendlyNameSubTypeEnum.MASTER_OF_ADVANCED_STUDIES, Enums.Deposit.DepositFriendlyNameSubTypeEnum.MASTER_DEGREE, Enums.Deposit.DepositFriendlyNameSubTypeEnum.PRIVATE_DOCTOR_THESIS, ].indexOf(subType) !== -1) { - if (isNullOrUndefined(formControlTitleLanguage.value) || isEmptyString(formControlTitleLanguage.value)) { - if (formArrayLanguages.controls.length > 0) { - const languageDeposit = formArrayLanguages.controls[0].get(this.formDefinitionDepositFormLanguage.language)?.value; - if (isNonEmptyString(languageDeposit)) { - formControlTitleLanguage.setValue(languageDeposit); - } - } - } formControlTitleLanguage.setValidators([SolidifyValidator, Validators.required]); } else { formControlTitleLanguage.setValidators([SolidifyValidator]); @@ -939,6 +931,7 @@ export class DepositFormPresentational extends AbstractPresentational implements this.subscribe(this._observeValueChangeForUpdateErrorNumber(this.formGroupThirdStepContributors).pipe( distinctUntilChanged(), + filter(numberError => isNotNullNorUndefined(this.model)), // allow to avoid to display error on creation step due to import tap(numberError => { this.errorThirdStepContributors = numberError; this.stepper.triggerDetectChanges(); @@ -948,6 +941,7 @@ export class DepositFormPresentational extends AbstractPresentational implements this.subscribe(this._observeValueChangeForUpdateErrorNumber(this.formGroupFourthStepDescription).pipe( distinctUntilChanged(), + filter(numberError => isNotNullNorUndefined(this.model)), // allow to avoid to display error on creation step due to import tap(numberError => { this.errorFourthStepDescription = numberError; this.stepper.triggerDetectChanges(); @@ -963,8 +957,8 @@ export class DepositFormPresentational extends AbstractPresentational implements ); } - private _getNumberFormError(formGroupFourthStepDescription: FormGroup): number { - const errors = this._collectErrorsInArray(formGroupFourthStepDescription); + private _getNumberFormError(formGroupFourthStepDescription: FormGroup, stopOnFirstArray: boolean = true): number { + const errors = this._collectErrorsInArray(formGroupFourthStepDescription, stopOnFirstArray); if (isNullOrUndefined(errors)) { return 0; } @@ -972,7 +966,13 @@ export class DepositFormPresentational extends AbstractPresentational implements } private _isFormGroup(control: AbstractControl): control is FormGroup { - return !!(<FormGroup> control).controls; + // TODO MOVE INTO SOLIDIFIY + return isInstanceOf(control, FormGroup) && !!(<FormGroup> control).controls; + } + + private _isFormArray(control: AbstractControl): control is FormArray { + // TODO MOVE INTO SOLIDIFIY + return isInstanceOf(control, FormArray) && !!(<FormArray> control).controls; } private _collectErrorsInNestedObject(control: AbstractControl): any | null { @@ -994,13 +994,25 @@ export class DepositFormPresentational extends AbstractPresentational implements } } - private _collectErrorsInArray(control: AbstractControl, listErrors: any[] = []): any[] | null { - // TODO MOVE INTO SOLIDIFY + private _collectErrorsInArray(control: AbstractControl, stopOnInvalidArray: boolean, listErrors: any[] = []): any[] | null { + // TODO MOVE INTO SOLIDIFIY if (this._isFormGroup(control)) { Object.entries(control.controls).forEach((c) => { - this._collectErrorsInArray(c[1], listErrors); + const abstractControl: AbstractControl = c[1]; + this._collectErrorsInArray(abstractControl, stopOnInvalidArray, listErrors); }); return listErrors; + } else if (this._isFormArray(control)) { + Object.entries(control.controls).forEach((c) => { + const abstractControl: AbstractControl = c[1]; + if (stopOnInvalidArray && control.status === "INVALID") { + if (abstractControl.status === "INVALID") { + listErrors.push({"arrayItemInError": true}); + } + } else { + this._collectErrorsInArray(abstractControl, stopOnInvalidArray, listErrors); + } + }); } else { if (isNotNullNorUndefined(control.errors) && (control.dirty || control.touched)) { listErrors.push(control.errors);