ngx-mat-dynamic-form-builder
Version:
Build dynamic forms in Angular Material using Reactive forms.
118 lines • 16.2 kB
JavaScript
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { QuestionControlService } from '../services/question-control.service';
export class DynamicFormComponent {
constructor(qcs) {
this.qcs = qcs;
this.questions = [];
this.emitOnlyOnChange = false;
this.formResult = new EventEmitter();
}
ngOnInit() {
if (!this.questions || this.questions.length === 0) {
console.error('Questions are null or empty.');
return;
}
this.form = this.qcs.toFormGroup(this.questions);
// Emit if the form is valid from begining but not if on change flag is set.
if (!this.emitOnlyOnChange && this.form.valid) {
this.emitForm();
}
this._buttonText = this.buttonText || 'Save';
this.prepareConditionalControls();
this.prepareFilteredOptions();
this.form.statusChanges.subscribe(status => {
if (status === 'VALID') {
this.emitForm();
}
else {
this.formResult.emit(null);
}
;
});
}
emitForm() {
let validForm = this.form.getRawValue();
this.questions.forEach((q) => {
if (q.type && q.type === 'number') {
if (validForm[q.key])
validForm[q.key] = Number(validForm[q.key]);
}
});
this.formResult.emit(validForm);
}
prepareConditionalControls() {
this.changeSubscriptions = [];
// Listen for changes on other controlls
this.questions.forEach(q => {
if (q.conditional) {
// Subscribe to changes
const targetControl = this.form.controls[q.conditional.controlKey];
this.changeSubscriptions.push(targetControl.valueChanges.subscribe(value => {
if (Array.isArray(value)) {
value.includes(q.conditional.value) ? q.show = true : q.show = false;
}
else {
q.conditional.value === value ? q.show = true : q.show = false;
}
}));
// If values are set check them now
if (Array.isArray(targetControl.value)) {
targetControl.value.includes(q.conditional.value) ? q.show = true : q.show = false;
}
else if (targetControl.value && targetControl.value === q.conditional.value) {
q.show = true;
}
}
});
}
prepareFilteredOptions() {
this.filterSubscriptions = [];
this.questions.forEach((q) => {
if (q.selectionFilter) {
const targetControl = this.form.controls[q.selectionFilter.controlKey];
// If the target value changes, subscribe to load new selections
this.filterSubscriptions.push(targetControl.valueChanges.subscribe(value => {
q.selectionFilter.options$(value).subscribe(res => {
q.options$.next(res);
});
}));
// if target is set, then load them immediately
if (targetControl.value) {
q.selectionFilter.options$(targetControl.value).subscribe(res => {
q.options$.next(res);
});
}
}
});
}
ngOnDestroy() {
if (this.changeSubscriptions) {
this.changeSubscriptions.forEach(s => {
s.unsubscribe;
});
}
if (this.filterSubscriptions) {
this.filterSubscriptions.forEach(s => {
s.unsubscribe;
});
}
}
}
DynamicFormComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-mat-dynamic-form',
template: "<form [formGroup]=\"form\" fxLayout=\"column\">\n <div fxLayout=\"row wrap\" fxLayoutAlign=\"start center\">\n <div *ngFor=\"let question of questions; let i = index\" [fxFlex.xs]=\"question.xsFlex\"\n [fxFlex.gt-xs]=\"question.flex\">\n <ngx-mat-dynamic-form-question *ngIf=\"question.show\" [question]=\"question\" [form]=\"form\">\n </ngx-mat-dynamic-form-question>\n </div>\n <ng-content></ng-content>\n </div>\n</form>",
providers: [QuestionControlService],
styles: [""]
},] }
];
DynamicFormComponent.ctorParameters = () => [
{ type: QuestionControlService }
];
DynamicFormComponent.propDecorators = {
questions: [{ type: Input }],
buttonText: [{ type: Input }],
emitOnlyOnChange: [{ type: Input }],
formResult: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXQtZHluYW1pYy1mb3JtLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXNELE1BQU0sZUFBZSxDQUFDO0FBR25JLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBVzlFLE1BQU0sT0FBTyxvQkFBb0I7SUFjL0IsWUFBb0IsR0FBMkI7UUFBM0IsUUFBRyxHQUFILEdBQUcsQ0FBd0I7UUFadEMsY0FBUyxHQUF3QixFQUFFLENBQUM7UUFFcEMscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBQ2pDLGVBQVUsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQVNmLENBQUM7SUFFcEQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNsRCxPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUE7WUFDN0MsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakQsNEVBQTRFO1FBQzVFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDN0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2pCO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQztR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bUIsRUFBRTtZQUM1QixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNuQyxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxDQUFBO1NBQ0g7SUFDSCxDQUFDOzs7WUFuSEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxzQkFBc0I7Z0JBQ2hDLCtlQUE0QztnQkFFNUMsU0FBUyxFQUFFLENBQUMsc0JBQXNCLENBQUM7O2FBQ3BDOzs7WUFWUSxzQkFBc0I7Ozt3QkFhNUIsS0FBSzt5QkFDTCxLQUFLOytCQUNMLEtBQUs7eUJBQ0wsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSwgQ29udGVudENoaWxkcmVuLCBUZW1wbGF0ZVJlZiwgUXVlcnlMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFF1ZXN0aW9uQmFzZSB9IGZyb20gJy4uL2hlbHBlci1jbGFzc2VzL3F1ZXN0aW9uLWJhc2UnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFF1ZXN0aW9uQ29udHJvbFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWVzdGlvbi1jb250cm9sLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2VsZWN0UXVlc3Rpb24gfSBmcm9tICcuLi9oZWxwZXItY2xhc3Nlcy9xdWVzdGlvbi1zZWxlY3QnO1xyXG5pbXBvcnQgeyBUZXh0Ym94UXVlc3Rpb24gfSBmcm9tICcuLi9oZWxwZXItY2xhc3Nlcy9xdWVzdGlvbi10ZXh0Ym94JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LW1hdC1keW5hbWljLWZvcm0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9keW5hbWljLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2R5bmFtaWMtZm9ybS5jb21wb25lbnQuY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbUXVlc3Rpb25Db250cm9sU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIER5bmFtaWNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBASW5wdXQoKSBxdWVzdGlvbnM6IFF1ZXN0aW9uQmFzZTxhbnk+W10gPSBbXTtcclxuICBASW5wdXQoKSBidXR0b25UZXh0OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZW1pdE9ubHlPbkNoYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBmb3JtUmVzdWx0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIF9idXR0b25UZXh0OiBzdHJpbmc7XHJcblxyXG4gIGNoYW5nZVN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdO1xyXG4gIGZpbHRlclN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHFjczogUXVlc3Rpb25Db250cm9sU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9ucyB8fCB0aGlzLnF1ZXN0aW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc29sZS5lcnJvcignUXVlc3Rpb25zIGFyZSBudWxsIG9yIGVtcHR5LicpXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZm9ybSA9IHRoaXMucWNzLnRvRm9ybUdyb3VwKHRoaXMucXVlc3Rpb25zKTtcclxuICAgIC8vIEVtaXQgaWYgdGhlIGZvcm0gaXMgdmFsaWQgZnJvbSBiZWdpbmluZyBidXQgbm90IGlmIG9uIGNoYW5nZSBmbGFnIGlzIHNldC5cclxuICAgIGlmICghdGhpcy5lbWl0T25seU9uQ2hhbmdlICYmIHRoaXMuZm9ybS52YWxpZCkge1xyXG4gICAgICB0aGlzLmVtaXRGb3JtKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9idXR0b25UZXh0ID0gdGhpcy5idXR0b25UZXh0IHx8ICdTYXZlJztcclxuXHJcbiAgICB0aGlzLnByZXBhcmVDb25kaXRpb25hbENvbnRyb2xzKCk7XHJcblxyXG4gICAgdGhpcy5wcmVwYXJlRmlsdGVyZWRPcHRpb25zKCk7XHJcblxyXG4gICAgdGhpcy5mb3JtLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKHN0YXR1cyA9PiB7XHJcbiAgICAgIGlmIChzdGF0dXMgPT09ICdWQUxJRCcpIHtcclxuICAgICAgICB0aGlzLmVtaXRGb3JtKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtUmVzdWx0LmVtaXQobnVsbClcclxuICAgICAgfTtcclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbWl0Rm9ybSgpOiB2b2lkIHtcclxuICAgIGxldCB2YWxpZEZvcm0gPSB0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICAgIHRoaXMucXVlc3Rpb25zLmZvckVhY2goKHE6IFRleHRib3hRdWVzdGlvbjxhbnk+KSA9PiB7XHJcbiAgICAgIGlmIChxLnR5cGUgJiYgcS50eXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIGlmICh2YWxpZEZvcm1bcS5rZXldKVxyXG4gICAgICAgICAgdmFsaWRGb3JtW3Eua2V5XSA9IE51bWJlcih2YWxpZEZvcm1bcS5rZXldKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIHRoaXMuZm9ybVJlc3VsdC5lbWl0KHZhbGlkRm9ybSlcclxuICB9XHJcblxyXG4gIHByZXBhcmVDb25kaXRpb25hbENvbnRyb2xzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGFuZ2VTdWJzY3JpcHRpb25zID0gW107XHJcbiAgICAvLyBMaXN0ZW4gZm9yIGNoYW5nZXMgb24gb3RoZXIgY29udHJvbGxzXHJcbiAgICB0aGlzLnF1ZXN0aW9ucy5mb3JFYWNoKHEgPT4ge1xyXG4gICAgICBpZiAocS5jb25kaXRpb25hbCkge1xyXG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBjaGFuZ2VzXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0Q29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1txLmNvbmRpdGlvbmFsLmNvbnRyb2xLZXldO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlU3Vic2NyaXB0aW9ucy5wdXNoKHRhcmdldENvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdmFsdWUuaW5jbHVkZXMocS5jb25kaXRpb25hbC52YWx1ZSkgPyBxLnNob3cgPSB0cnVlIDogcS5zaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBxLmNvbmRpdGlvbmFsLnZhbHVlID09PSB2YWx1ZSA/IHEuc2hvdyA9IHRydWUgOiBxLnNob3cgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgLy8gSWYgdmFsdWVzIGFyZSBzZXQgY2hlY2sgdGhlbSBub3dcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXRDb250cm9sLnZhbHVlKSkge1xyXG4gICAgICAgICAgdGFyZ2V0Q29udHJvbC52YWx1ZS5pbmNsdWRlcyhxLmNvbmRpdGlvbmFsLnZhbHVlKSA/IHEuc2hvdyA9IHRydWUgOiBxLnNob3cgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldENvbnRyb2wudmFsdWUgJiYgdGFyZ2V0Q29udHJvbC52YWx1ZSA9PT0gcS5jb25kaXRpb25hbC52YWx1ZSkge1xyXG4gICAgICAgICAgcS5zaG93ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJlcGFyZUZpbHRlcmVkT3B0aW9ucygpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVyU3Vic2NyaXB0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5xdWVzdGlvbnMuZm9yRWFjaCgocTogU2VsZWN0UXVlc3Rpb248YW55PikgPT4ge1xyXG4gICAgICBpZiAocS5zZWxlY3Rpb25GaWx0ZXIpIHtcclxuICAgICAgICBjb25zdCB0YXJnZXRDb250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW3Euc2VsZWN0aW9uRmlsdGVyLmNvbnRyb2xLZXldO1xyXG4gICAgICAgIC8vIElmIHRoZSB0YXJnZXQgdmFsdWUgY2hhbmdlcywgc3Vic2NyaWJlIHRvIGxvYWQgbmV3IHNlbGVjdGlvbnNcclxuICAgICAgICB0aGlzLmZpbHRlclN1YnNjcmlwdGlvbnMucHVzaCh0YXJnZXRDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgICAgcS5zZWxlY3Rpb25GaWx0ZXIub3B0aW9ucyQodmFsdWUpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgICBxLm9wdGlvbnMkLm5leHQocmVzKVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgLy8gaWYgdGFyZ2V0IGlzIHNldCwgdGhlbiBsb2FkIHRoZW0gaW1tZWRpYXRlbHlcclxuICAgICAgICBpZiAodGFyZ2V0Q29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgICAgcS5zZWxlY3Rpb25GaWx0ZXIub3B0aW9ucyQodGFyZ2V0Q29udHJvbC52YWx1ZSkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHEub3B0aW9ucyQubmV4dChyZXMpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoYW5nZVN1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgdGhpcy5jaGFuZ2VTdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiB7XHJcbiAgICAgICAgcy51bnN1YnNjcmliZTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZpbHRlclN1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgdGhpcy5maWx0ZXJTdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiB7XHJcbiAgICAgICAgcy51bnN1YnNjcmliZTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19