{"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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"}