UNPKG

form-service-dynamic

Version:

A dynamic form creation service for Angular applications.

162 lines (154 loc) 7.72 kB
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