typed-reactive-form
Version:
Allows creation of a ReactiveForm based on a class with its properties properly decorated.
82 lines (74 loc) • 2.39 kB
JavaScript
import 'reflect-metadata';
import { FormGroup as FormGroup$1, FormControl } from '@angular/forms';
const formMemberKey = 'formMember';
const formGroupKey = 'formGroup';
function FormMember(options) {
return (target, key) => {
let formMembers = Reflect.getMetadata(formMemberKey, target);
if (formMembers) {
formMembers.push({ property: key, options: getOptions(options) });
}
else {
formMembers = [{ property: key, options: getOptions(options) }];
Reflect.defineMetadata(formMemberKey, formMembers, target);
}
};
}
function getOptions(options) {
const defaultOptions = {
defaultValue: null,
validators: [],
};
if (options) {
Object.assign(defaultOptions, options);
}
return defaultOptions;
}
function FormGroup(constructor) {
return (target, key) => {
let formArrays = Reflect.getMetadata(formGroupKey, target);
if (formArrays) {
formArrays.push({ property: key, constructor });
}
else {
formArrays = [{ property: key, constructor }];
Reflect.defineMetadata(formGroupKey, formArrays, target);
}
};
}
class TypedReactiveForm extends FormGroup$1 {
constructor(c, context) {
super(createControls(new c(), context));
}
}
function createControls(instance, context) {
const result = {};
const members = getFormMemberDetails(instance);
members.forEach(member => {
const options = member.options;
if (!options.context || options.context.length === 0 || options.context.includes(context)) {
result[member.property] = new FormControl(instance[member.property], options.validators);
}
});
const groups = getFormGroupDetails(instance);
if (groups) {
groups.forEach(group => {
result[group.property] = new TypedReactiveForm(group.constructor);
});
}
return result;
}
function getFormMemberDetails(instance) {
return Reflect.getMetadata(formMemberKey, instance);
}
function getFormGroupDetails(instance) {
return Reflect.getMetadata(formGroupKey, instance);
}
/*
* Public API Surface of typed-reactive-form
*/
/**
* Generated bundle index. Do not edit.
*/
export { FormGroup, FormMember, TypedReactiveForm };
//# sourceMappingURL=typed-reactive-form.js.map