form-service-dynamic
Version:
A dynamic form creation service for Angular applications.
162 lines (154 loc) • 7.72 kB
JavaScript
import * as i0 from '@angular/core';
import { Injectable, Component, NgModule, Input } from '@angular/core';
import * as i1 from '@angular/forms';
import { Validators } from '@angular/forms';
import { NgClass } from '@angular/common';
/**
* @author Jean Paul <jeanpaulwebb@gmail.com>
* @class FormServiceDynamic
* @date 17/08/2023
*/
class FormServiceDynamic {
constructor(formBuilder) {
this.formBuilder = formBuilder;
}
createForm(model, options) {
const formGroup = {};
for (const field in model) {
if (model.hasOwnProperty(field)) {
const fieldConfig = options && options[field] ? options[field] : {};
formGroup[field] = this.createControl(model[field], fieldConfig);
}
}
return this.formBuilder.group(formGroup);
}
createControl(value, config) {
const formControl = this.formBuilder.control({ value: value, disabled: !config.enabled }, this.normalizeValidations(config.validations), this.normalizeAsyncValidations(config.asyncValidations));
if (config.customValidation) {
formControl.setValidators([config.customValidation]);
}
if (config.asyncCustomValidation) {
formControl.setAsyncValidators([config.asyncCustomValidation]);
}
if (config.requiredIf) {
formControl.setValidators([this.conditionallyRequiredValidator(config)]);
}
return formControl;
}
conditionallyRequiredValidator(config) {
return (control) => {
if (this.isConditionallyRequired(config)) {
if (Validators.required(control)) {
return null;
}
else {
return { required: true };
}
}
return null;
};
}
isConditionallyRequired(config) {
return config.requiredIf && config.requiredIf.condition ? config.requiredIf.condition() : false;
}
normalizeValidations(validations) {
if (!validations) {
return null;
}
const validatorArray = [];
for (const key in validations) {
if (validations.hasOwnProperty(key) && Validators.hasOwnProperty(key)) {
validatorArray.push(Validators[key](validations[key]));
}
}
return validatorArray.length > 0 ? Validators.compose(validatorArray) : null;
}
normalizeAsyncValidations(asyncValidations) {
if (!asyncValidations) {
return null;
}
const asyncValidatorArray = [];
for (const key in asyncValidations) {
if (asyncValidations.hasOwnProperty(key) && Validators.hasOwnProperty(key)) {
asyncValidatorArray.push(Validators[key](asyncValidations[key]));
}
}
return asyncValidatorArray.length > 0 ? Validators.composeAsync(asyncValidatorArray) : null;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormServiceDynamic, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormServiceDynamic, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormServiceDynamic, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return [{ type: i1.FormBuilder }]; } });
/**
* @author Jean Paul <jeanpaulwebb@gmail.com>
* @class FormServiceDynamicComponent
* @date 17/08/2023
*/
class FormServiceDynamicComponent {
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormServiceDynamicComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: FormServiceDynamicComponent, selector: "lib-form-service-dynamic", ngImport: i0, template: `
<p>
Form Service Dynamic Component
</p>
`, isInline: true }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormServiceDynamicComponent, decorators: [{
type: Component,
args: [{ selector: 'lib-form-service-dynamic', template: `
<p>
Form Service Dynamic Component
</p>
` }]
}] });
class FormServiceDynamicModule {
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormServiceDynamicModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.1", ngImport: i0, type: FormServiceDynamicModule, declarations: [FormServiceDynamicComponent], exports: [FormServiceDynamicComponent] }); }
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormServiceDynamicModule }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: FormServiceDynamicModule, decorators: [{
type: NgModule,
args: [{
declarations: [
FormServiceDynamicComponent,
],
imports: [],
exports: [
FormServiceDynamicComponent
]
}]
}] });
/**
* @author Jean Paul <jeanpaulwebb@gmail.com>
* @class ButtonComponent
* @date 17/08/2023
*/
class ButtonComponent {
constructor() {
this.size = 'md';
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: ButtonComponent, isStandalone: true, selector: "lib-button", inputs: { variant: "variant", size: "size" }, ngImport: i0, template: "<button [ngClass]=\"[variant, size]\">\n <ng-content></ng-content>\n</button>\n", styles: ["button{border:none;border-radius:4px;cursor:pointer;color:#fff}button.primary{background-color:#00f}button.secondary{background-color:#8a2be2}button.sm{padding:3px 6px}button.md{padding:6px 12px}button.lg{padding:9px 18px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: ButtonComponent, decorators: [{
type: Component,
args: [{ selector: 'lib-button', standalone: true, imports: [
NgClass
], template: "<button [ngClass]=\"[variant, size]\">\n <ng-content></ng-content>\n</button>\n", styles: ["button{border:none;border-radius:4px;cursor:pointer;color:#fff}button.primary{background-color:#00f}button.secondary{background-color:#8a2be2}button.sm{padding:3px 6px}button.md{padding:6px 12px}button.lg{padding:9px 18px}\n"] }]
}], propDecorators: { variant: [{
type: Input
}], size: [{
type: Input
}] } });
/*
* Public API Surface of form-service-dynamic
*/
/**
* Generated bundle index. Do not edit.
*/
export { ButtonComponent, FormServiceDynamic, FormServiceDynamicComponent, FormServiceDynamicModule };
//# sourceMappingURL=form-service-dynamic.mjs.map