UNPKG

form-service-dynamic

Version:

A dynamic form creation service for Angular applications.

86 lines 12.2 kB
import { Injectable } from '@angular/core'; import { Validators } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; /** * @author Jean Paul <jeanpaulwebb@gmail.com> * @class FormServiceDynamic * @date 17/08/2023 */ export 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 }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1zZXJ2aWNlLWR5bmFtaWMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0tc2VydmljZS1keW5hbWljL3NyYy9saWIvZm9ybS1zZXJ2aWNlLWR5bmFtaWMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFJTCxVQUFVLEVBSVgsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBRXhCOzs7O0dBSUc7QUFJSCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQzVDLENBQUM7SUFFRCxVQUFVLENBQ1IsS0FBUSxFQUNSLE9BQTBDO1FBRTFDLE1BQU0sU0FBUyxHQUFtQyxFQUFFLENBQUM7UUFDckQsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLEVBQUU7WUFDekIsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMvQixNQUFNLFdBQVcsR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDcEUsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQ2xFO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBVSxFQUFFLE1BQW1CO1FBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUMxQyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUs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QyxDQUFDLElBQUksQ0FBQztJQUM5RixDQUFDOzhHQTdFVSxrQkFBa0I7a0hBQWxCLGtCQUFrQixjQUZqQixNQUFNOzsyRkFFUCxrQkFBa0I7a0JBSDlCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1CdWlsZGVyLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1Db250cm9sLFxuICBWYWxpZGF0b3JzLFxuICBWYWxpZGF0b3JGbixcbiAgQXN5bmNWYWxpZGF0b3JGbixcbiAgQWJzdHJhY3RDb250cm9sXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuLyoqXG4gKiBAYXV0aG9yIEplYW4gUGF1bCA8amVhbnBhdWx3ZWJiQGdtYWlsLmNvbT5cbiAqIEBjbGFzcyBGb3JtU2VydmljZUR5bmFtaWNcbiAqIEBkYXRlIDE3LzA4LzIwMjNcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRm9ybVNlcnZpY2VEeW5hbWljIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIpIHtcbiAgfVxuXG4gIGNyZWF0ZUZvcm08VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICAgIG1vZGVsOiBULFxuICAgIG9wdGlvbnM/OiB7IFtmaWVsZDogc3RyaW5nXTogRmllbGRDb25maWcgfVxuICApOiBGb3JtR3JvdXAge1xuICAgIGNvbnN0IGZvcm1Hcm91cDogeyBba2V5OiBzdHJpbmddOiBGb3JtQ29udHJvbCB9ID0ge307XG4gICAgZm9yIChjb25zdCBmaWVsZCBpbiBtb2RlbCkge1xuICAgICAgaWYgKG1vZGVsLmhhc093blByb3BlcnR5KGZpZWxkKSkge1xuICAgICAgICBjb25zdCBmaWVsZENvbmZpZyA9IG9wdGlvbnMgJiYgb3B0aW9uc1tmaWVsZF0gPyBvcHRpb25zW2ZpZWxkXSA6IHt9O1xuICAgICAgICBmb3JtR3JvdXBbZmllbGRdID0gdGhpcy5jcmVhdGVDb250cm9sKG1vZGVsW2ZpZWxkXSwgZmllbGRDb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cChmb3JtR3JvdXApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb250cm9sKHZhbHVlOiBhbnksIGNvbmZpZzogRmllbGRDb25maWcpOiBGb3JtQ29udHJvbCB7XG4gICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woXG4gICAgICB7dmFsdWU6IHZhbHVlLCBkaXNhYmxlZDogIWNvbmZpZy5lbmFibGVkfSxcbiAgICAgIHRoaXMubm9ybWFsaXplVmFsaWRhdGlvbnMoY29uZmlnLnZhbGlkYXRpb25zKSxcbiAgICAgIHRoaXMubm9ybWFsaXplQXN5bmNWYWxpZGF0aW9ucyhjb25maWcuYXN5bmNWYWxpZGF0aW9ucylcbiAgICApO1xuICAgIGlmIChjb25maWcuY3VzdG9tVmFsaWRhdGlvbikge1xuICAgICAgZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhbY29uZmlnLmN1c3RvbVZhbGlkYXRpb25dKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5hc3luY0N1c3RvbVZhbGlkYXRpb24pIHtcbiAgICAgIGZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyhbY29uZmlnLmFzeW5jQ3VzdG9tVmFsaWRhdGlvbl0pO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlcXVpcmVkSWYpIHtcbiAgICAgIGZvcm1Db250cm9sLnNldFZhbGlkYXRvcnMoW3RoaXMuY29uZGl0aW9uYWxseVJlcXVpcmVkVmFsaWRhdG9yKGNvbmZpZyldKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1Db250cm9sO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25kaXRpb25hbGx5UmVxdWlyZWRWYWxpZGF0b3IoY29uZmlnOiBGaWVsZENvbmZpZyk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNDb25kaXRpb25hbGx5UmVxdWlyZWQoY29uZmlnKSkge1xuICAgICAgICBpZiAoVmFsaWRhdG9ycy5yZXF1aXJlZChjb250cm9sKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7cmVxdWlyZWQ6IHRydWV9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpc0NvbmRpdGlvbmFsbHlSZXF1aXJlZChjb25maWc6IEZpZWxkQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbmZpZy5yZXF1aXJlZElmICYmIGNvbmZpZy5yZXF1aXJlZElmLmNvbmRpdGlvbiA/IGNvbmZpZy5yZXF1aXJlZElmLmNvbmRpdGlvbigpIDogZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVZhbGlkYXRpb25zKHZhbGlkYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkKTogVmFsaWRhdG9yRm4gfCBudWxsIHtcbiAgICBpZiAoIXZhbGlkYXRpb25zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdmFsaWRhdG9yQXJyYXk6IFZhbGlkYXRvckZuW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWxpZGF0aW9ucykge1xuICAgICAgaWYgKHZhbGlkYXRpb25zLmhhc093blByb3BlcnR5KGtleSkgJiYgVmFsaWRhdG9ycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHZhbGlkYXRvckFycmF5LnB1c2goKFZhbGlkYXRvcnMgYXMgYW55KVtrZXldKHZhbGlkYXRpb25zW2tleV0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvckFycmF5Lmxlbmd0aCA+IDAgPyBWYWxpZGF0b3JzLmNvbXBvc2UodmFsaWRhdG9yQXJyYXkpIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQXN5bmNWYWxpZGF0aW9ucyhhc3luY1ZhbGlkYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkKTogQXN5bmNWYWxpZGF0b3JGbiB8IG51bGwge1xuICAgIGlmICghYXN5bmNWYWxpZGF0aW9ucykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9yQXJyYXk6IEFzeW5jVmFsaWRhdG9yRm5bXSA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGFzeW5jVmFsaWRhdGlvbnMpIHtcbiAgICAgIGlmIChhc3luY1ZhbGlkYXRpb25zLmhhc093blByb3BlcnR5KGtleSkgJiYgVmFsaWRhdG9ycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGFzeW5jVmFsaWRhdG9yQXJyYXkucHVzaCgoVmFsaWRhdG9ycyBhcyBhbnkpW2tleV0oYXN5bmNWYWxpZGF0aW9uc1trZXldKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhc3luY1ZhbGlkYXRvckFycmF5Lmxlbmd0aCA+IDAgPyBWYWxpZGF0b3JzLmNvbXBvc2VBc3luYyhhc3luY1ZhbGlkYXRvckFycmF5KSA6IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZENvbmZpZyB7XG4gIHZhbHVlPzogYW55O1xuICB2YWxpZGF0aW9ucz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gIGFzeW5jVmFsaWRhdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICBlcnJvck1lc3NhZ2VzPzogeyBbZXJyb3I6IHN0cmluZ106IHN0cmluZyB9O1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgY3VzdG9tVmFsaWRhdGlvbj86IFZhbGlkYXRvckZuO1xuICBhc3luY0N1c3RvbVZhbGlkYXRpb24/OiBBc3luY1ZhbGlkYXRvckZuO1xuICByZXF1aXJlZElmPzogeyBjb25kaXRpb246ICgpID0+IGJvb2xlYW4gfTtcbn1cbiJdfQ==