import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from "@angular/core"; import { FormGroup, FormBuilder, Validators, FormControl } from "@angular/forms"; import { IDynamicBaseControl, Validator } from "../../interfaces/dynamic-control.interface"; @Component({ exportAs: "dynamicForm", selector: "dynamic-form", template: `
`, styles: [] }) export class DynamicFormComponent implements OnInit { @Input() fields: IDynamicBaseControl[] = []; @Output() submit: EventEmitter = new EventEmitter(); form: FormGroup; get value() { return this.form.value; } constructor(private fb: FormBuilder) {} ngOnInit() { this.form = this.createControl(); } onSubmit(event: Event) { event.preventDefault(); event.stopPropagation(); if (this.form.valid) { this.submit.emit(this.form.value); } else { this.validateAllFormFields(this.form); } } createControl() { const group = this.fb.group({}); this.fields.forEach(field => { // if (field.type === "button") return; const control = this.fb.control( // field.value, this.bindValidations(field.validations || []) ); group.addControl(field.name, control); }); return group; } bindValidations(validations: any) { if (validations.length > 0) { const validList = []; validations.forEach(valid => { validList.push(valid.validator); }); return Validators.compose(validList); } return null; } validateAllFormFields(formGroup: FormGroup) { Object.keys(formGroup.controls).forEach(field => { const control = formGroup.get(field); control.markAsTouched({ onlySelf: true }); }); } }