import { Component, OnInit } from '@angular/core'; import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms'; import { BaseComponent } from '../../../../core/common/base/base.component'; import { BaseCriteriaErrorModel } from '../../../../models/criteria/BaseCriteriaErrorModel'; @Component({ selector: 'app-base-criteria-component', template: '', providers: [ ] }) export class BaseCriteriaComponent extends BaseComponent implements OnInit { public refreshCallback: Function = null; public formGroup: FormGroup = null; constructor( public baseErrorModel?: BaseCriteriaErrorModel, ) { super(); } ngOnInit() { if (this.baseErrorModel == null) { this.baseErrorModel = new BaseCriteriaErrorModel(); } } controlModified(): void { this.clearErrorModel(); if (!this.isFormValid()) { return; } if (this.refreshCallback != null) { this.refreshCallback(); } } public isFormValid(): boolean { this.touchAllFormFields(this.formGroup); this.validateAllFormFields(this.formGroup); return this.formGroup.valid; } public getFormData(): any { return this.formGroup.value; } public getFormControl(controlName: string): AbstractControl { return this.formGroup.get(controlName); } public disableFormFields(formControl: AbstractControl) { formControl.disable(); } public validateAllFormFields(formControl: AbstractControl) { if (formControl instanceof FormControl) { formControl.updateValueAndValidity({ emitEvent: false }); } else if (formControl instanceof FormGroup) { Object.keys(formControl.controls).forEach(item => { const control = formControl.get(item); this.validateAllFormFields(control); }); } else if (formControl instanceof FormArray) { formControl.controls.forEach(item => { this.validateAllFormFields(item); }); } } public touchAllFormFields(formControl: AbstractControl) { if (formControl instanceof FormControl) { formControl.markAsTouched(); } else if (formControl instanceof FormGroup) { Object.keys(formControl.controls).forEach(item => { const control = formControl.get(item); this.touchAllFormFields(control); }); } else if (formControl instanceof FormArray) { formControl.controls.forEach(item => { this.touchAllFormFields(item); }); } } setRefreshCallback(callback: Function): void { this.refreshCallback = callback; } onCallbackError(error: any) { this.setErrorModel(error.error); this.validateAllFormFields(this.formGroup); } public setErrorModel(errorModel: BaseCriteriaErrorModel) { Object.keys(errorModel).forEach(item => { (this.baseErrorModel)[item] = (errorModel)[item]; }); } public clearErrorModel() { Object.keys(this.baseErrorModel).forEach(item => { (this.baseErrorModel)[item] = ''; }); } }