form-service-dynamic
Version:
A dynamic form creation service for Angular applications.
1 lines • 10.6 kB
Source Map (JSON)
{"version":3,"file":"form-service-dynamic.mjs","sources":["../../../projects/form-service-dynamic/src/lib/form-service-dynamic.service.ts","../../../projects/form-service-dynamic/src/lib/form-service-dynamic.component.ts","../../../projects/form-service-dynamic/src/lib/form-service-dynamic.module.ts","../../../projects/form-service-dynamic/src/lib/components/button/button.component.ts","../../../projects/form-service-dynamic/src/lib/components/button/button.component.html","../../../projects/form-service-dynamic/src/public-api.ts","../../../projects/form-service-dynamic/src/form-service-dynamic.ts"],"sourcesContent":["import {Injectable} from '@angular/core';\nimport {\n FormBuilder,\n FormGroup,\n FormControl,\n Validators,\n ValidatorFn,\n AsyncValidatorFn,\n AbstractControl\n} from '@angular/forms';\n\n/**\n * @author Jean Paul <jeanpaulwebb@gmail.com>\n * @class FormServiceDynamic\n * @date 17/08/2023\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class FormServiceDynamic {\n constructor(private formBuilder: FormBuilder) {\n }\n\n createForm<T extends Record<string, any>>(\n model: T,\n options?: { [field: string]: FieldConfig }\n ): FormGroup {\n const formGroup: { [key: string]: FormControl } = {};\n for (const field in model) {\n if (model.hasOwnProperty(field)) {\n const fieldConfig = options && options[field] ? options[field] : {};\n formGroup[field] = this.createControl(model[field], fieldConfig);\n }\n }\n return this.formBuilder.group(formGroup);\n }\n\n private createControl(value: any, config: FieldConfig): FormControl {\n const formControl = this.formBuilder.control(\n {value: value, disabled: !config.enabled},\n this.normalizeValidations(config.validations),\n this.normalizeAsyncValidations(config.asyncValidations)\n );\n if (config.customValidation) {\n formControl.setValidators([config.customValidation]);\n }\n if (config.asyncCustomValidation) {\n formControl.setAsyncValidators([config.asyncCustomValidation]);\n }\n if (config.requiredIf) {\n formControl.setValidators([this.conditionallyRequiredValidator(config)]);\n }\n return formControl;\n }\n\n private conditionallyRequiredValidator(config: FieldConfig): ValidatorFn {\n return (control: AbstractControl) => {\n if (this.isConditionallyRequired(config)) {\n if (Validators.required(control)) {\n return null;\n } else {\n return {required: true};\n }\n }\n return null;\n };\n }\n\n private isConditionallyRequired(config: FieldConfig): boolean {\n return config.requiredIf && config.requiredIf.condition ? config.requiredIf.condition() : false;\n }\n\n private normalizeValidations(validations: { [key: string]: any } | undefined): ValidatorFn | null {\n if (!validations) {\n return null;\n }\n const validatorArray: ValidatorFn[] = [];\n for (const key in validations) {\n if (validations.hasOwnProperty(key) && Validators.hasOwnProperty(key)) {\n validatorArray.push((Validators as any)[key](validations[key]));\n }\n }\n return validatorArray.length > 0 ? Validators.compose(validatorArray) : null;\n }\n\n private normalizeAsyncValidations(asyncValidations: { [key: string]: any } | undefined): AsyncValidatorFn | null {\n if (!asyncValidations) {\n return null;\n }\n const asyncValidatorArray: AsyncValidatorFn[] = [];\n for (const key in asyncValidations) {\n if (asyncValidations.hasOwnProperty(key) && Validators.hasOwnProperty(key)) {\n asyncValidatorArray.push((Validators as any)[key](asyncValidations[key]));\n }\n }\n return asyncValidatorArray.length > 0 ? Validators.composeAsync(asyncValidatorArray) : null;\n }\n}\n\nexport interface FieldConfig {\n value?: any;\n validations?: { [key: string]: any };\n asyncValidations?: { [key: string]: any };\n errorMessages?: { [error: string]: string };\n enabled?: boolean;\n customValidation?: ValidatorFn;\n asyncCustomValidation?: AsyncValidatorFn;\n requiredIf?: { condition: () => boolean };\n}\n","import { Component } from '@angular/core';\n/**\n * @author Jean Paul <jeanpaulwebb@gmail.com>\n * @class FormServiceDynamicComponent\n * @date 17/08/2023\n */\n@Component({\n selector: 'lib-form-service-dynamic',\n template: `\n <p>\n Form Service Dynamic Component\n </p>\n `,\n styles: [\n ]\n})\nexport class FormServiceDynamicComponent {\n\n}\n","import {NgModule} from '@angular/core';\nimport {FormServiceDynamicComponent} from './form-service-dynamic.component';\n\n@NgModule({\n declarations: [\n FormServiceDynamicComponent,\n ],\n imports: [],\n exports: [\n FormServiceDynamicComponent\n ]\n})\nexport class FormServiceDynamicModule {\n}\n","import {Component, Input} from '@angular/core'\nimport {NgClass} from \"@angular/common\";\n\n/**\n * @author Jean Paul <jeanpaulwebb@gmail.com>\n * @class ButtonComponent\n * @date 17/08/2023\n */\n@Component({\n selector: 'lib-button',\n templateUrl: './button.component.html',\n styleUrls: ['./button.component.scss'],\n standalone: true, //standalone components\n imports: [\n NgClass\n ],\n})\nexport class ButtonComponent {\n @Input() public variant!: 'primary' | 'secondary';\n @Input() public size: 'sm' | 'md' | 'lg' = 'md';\n}\n","<button [ngClass]=\"[variant, size]\">\n <ng-content></ng-content>\n</button>\n","/*\n * Public API Surface of form-service-dynamic\n */\n\nexport * from './lib/form-service-dynamic.service';\nexport * from './lib/form-service-dynamic.component';\nexport * from './lib/form-service-dynamic.module';\nexport * from './lib/components';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}