/* eslint-disable max-len */ import { Component, forwardRef } from '@angular/core'; import { ControlValueAccessor, FormGroup, Validators, NG_VALUE_ACCESSOR, NG_VALIDATORS, ValidationErrors, FormBuilder, Validator } from '@angular/forms'; import { PartialObserver } from 'rxjs'; import { validNumber } from '../../../util/validator/valid-number.validator'; /* eslint-enable max-len */ @Component({ selector: 'lib-foundation-strip-form', templateUrl: './foundation-strip-form.component.html', styleUrls: ['./foundation-strip-form.component.css'], providers: [ { // Pour faire fonctionner la fonction writeValue. provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => FoundationStripFormComponent), multi: true }, { // Pour forcer l'implémentation du validator. provide: NG_VALIDATORS, useExisting: forwardRef(() => FoundationStripFormComponent), multi: true } ] }) export class FoundationStripFormComponent implements ControlValueAccessor, Validator { foundation: FormGroup; // FormBuilder est injecté. Son utilisation est moins verbeuse que "new FormGroup". constructor(private fromBuilder: FormBuilder) { this.foundation = this.fromBuilder.group({ // Validators.required : doit être non vide // validNumber : validateur perso pour valider un nombre. width: [null, [Validators.required, validNumber]] }); } // ControlValueAccessor public onTouched!: () => void; // val est l'interface contenant les données writeValue(val: FoundationStrip): void { val && this.foundation.setValue(val, { emitEvent: false }); } registerOnChange( fn?: PartialObserver<{ [key: string]: string | undefined }> ): void { this.foundation.valueChanges.subscribe(fn); } registerOnTouched(fn: () => void): void { this.onTouched = fn; } setDisabledState?(isDisabled: boolean): void { isDisabled ? this.foundation.disable() : this.foundation.enable(); } validate(): ValidationErrors | null // Si la form foundation ne contient que les sous-formulaires // dont les validateurs ne sont pas déclarées l'instanciation // this.foundation = this.fromBuilder.group, il faudra faire : // return this.form.controls.subform1.valid && this.form.controls.subform2.valid ? return this.foundation.valid ? null : { invalidForm: { valid: false, message: 'basicInfoForm fields are invalid' } }; } }