@codeforges/ng-forms
Version:
Angular 4+ Dynamic form builder, decorate your models to generate forms or create them manually
46 lines • 2.07 kB
JavaScript
import * as _ from "lodash";
import { NgFormsMetadataKeys } from "../utils/decorators/NgFormsMetadataKeys";
import { BaseInputFactory } from "../inputs/base/BaseInputFactory";
import { FormFieldType } from "../utils/FormFieldType";
import { SelectOption } from "../inputs/SelectOption";
import 'reflect-metadata';
export class NgDynamicFormsModel {
constructor() {
this.inputs = [];
}
getFormFields() {
if (_.isEmpty(this.inputs)) {
_.forOwn(this, (value, propertyKey) => {
const formFieldOptions = this.getNgFormFieldMetadata(propertyKey);
if (formFieldOptions) {
formFieldOptions.fieldName = formFieldOptions.fieldName || propertyKey;
const selectOptions = this.buildSelectOptions(formFieldOptions, value);
this.inputs.push(this.buildBaseInput(formFieldOptions, value.toString(), selectOptions));
}
});
}
return this.inputs;
}
buildBaseInput(formFieldOptions, value, selectOptions) {
const params = this.hasSelectOptions(formFieldOptions) ?
{ selectOptions: selectOptions } : { value: value };
return BaseInputFactory.build(formFieldOptions.fieldType, formFieldOptions.fieldName, params);
}
hasSelectOptions(formFieldOptions) {
return formFieldOptions.fieldType === FormFieldType.SELECT
|| formFieldOptions.fieldType === FormFieldType.RADIO;
}
buildSelectOptions(formFieldOptions, value) {
let selectOptions;
if (this.hasSelectOptions(formFieldOptions)) {
selectOptions = _.map(value, (element) => {
return new SelectOption(element[formFieldOptions.selectOptionKeys.labelKey], element[formFieldOptions.selectOptionKeys.valueKey]);
});
}
return selectOptions;
}
getNgFormFieldMetadata(propertyKey) {
return Reflect.getMetadata(NgFormsMetadataKeys.NG_FORM_FIELD, this, propertyKey);
}
}
//# sourceMappingURL=NgDynamicFormsModel.js.map