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 });
});
}
}