UNPKG

angular-dynamic-forms-ai

Version:

AI-enhanced dynamic form generator for Angular using Template-Driven Forms

1 lines 23.2 kB
{"version":3,"file":"angular-dynamic-forms-ai.mjs","sources":["../../../projects/dynamic-forms/src/lib/services/ai-validation.service.ts","../../../projects/dynamic-forms/src/lib/components/dynamic-form.component.ts","../../../projects/dynamic-forms/src/lib/dynamic-forms.module.ts","../../../projects/dynamic-forms/src/public-api.ts","../../../projects/dynamic-forms/src/angular-dynamic-forms-ai.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { FormFieldConfig } from '../interfaces/form-field.interface';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AiValidationService {\n private validationRules = new Map<string, RegExp>([\n ['email', /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/],\n ['phone', /^\\+?[\\d\\s-]{10,}$/],\n ['url', /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([\\/\\w .-]*)*\\/?$/],\n ['zipcode', /^\\d{5}(-\\d{4})?$/],\n ]);\n\n suggestValidations(field: FormFieldConfig): FormFieldConfig {\n const fieldNameLower = field.name.toLowerCase();\n const validations = { ...field.validations } || {};\n\n // Email validation\n if (fieldNameLower.includes('email')) {\n validations.email = true;\n validations.required = true;\n field.type = 'email';\n }\n\n // Password validation\n if (fieldNameLower.includes('password')) {\n validations.required = true;\n validations.minLength = 6;\n field.type = 'password';\n validations.pattern = '^(?=.*[A-Za-z])(?=.*\\\\d)[A-Za-z\\\\d]{6,}$';\n }\n\n // Phone validation\n if (fieldNameLower.includes('phone')) {\n validations.pattern = this.validationRules.get('phone')?.toString().slice(1, -1);\n validations.required = true;\n }\n\n // Name validation\n if (fieldNameLower.includes('name')) {\n validations.required = true;\n validations.minLength = 2;\n }\n\n // URL validation\n if (fieldNameLower.includes('url') || fieldNameLower.includes('website')) {\n validations.pattern = this.validationRules.get('url')?.toString().slice(1, -1);\n }\n\n // Zip code validation\n if (fieldNameLower.includes('zip')) {\n validations.pattern = this.validationRules.get('zipcode')?.toString().slice(1, -1);\n }\n\n field.validations = validations;\n field.errorMessages = this.generateErrorMessages(field);\n\n return field;\n }\n\n private generateErrorMessages(field: FormFieldConfig): { [key: string]: string } {\n const messages: { [key: string]: string } = {};\n const validations = field.validations || {};\n\n if (validations.required) {\n messages.required = `${field.label} is required`;\n }\n\n if (validations.minLength) {\n messages.minlength = `${field.label} must be at least ${validations.minLength} characters`;\n }\n\n if (validations.maxLength) {\n messages.maxlength = `${field.label} cannot exceed ${validations.maxLength} characters`;\n }\n\n if (validations.email) {\n messages.email = `Please enter a valid email address`;\n }\n\n if (validations.pattern) {\n messages.pattern = this.getPatternErrorMessage(field.name);\n }\n\n return messages;\n }\n\n private getPatternErrorMessage(fieldName: string): string {\n const fieldNameLower = fieldName.toLowerCase();\n \n if (fieldNameLower.includes('password')) {\n return 'Password must contain at least one letter and one number';\n }\n if (fieldNameLower.includes('phone')) {\n return 'Please enter a valid phone number';\n }\n if (fieldNameLower.includes('url') || fieldNameLower.includes('website')) {\n return 'Please enter a valid URL';\n }\n if (fieldNameLower.includes('zip')) {\n return 'Please enter a valid ZIP code';\n }\n\n return 'Please enter a valid value';\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { NgForm } from '@angular/forms';\nimport { FormConfig, FormFieldConfig } from '../interfaces/form-field.interface';\nimport { AiValidationService } from '../services/ai-validation.service';\n\n@Component({\n selector: 'lib-dynamic-form',\n template: `\n <form #form=\"ngForm\" (ngSubmit)=\"onSubmit(form)\" class=\"dynamic-form\" [attr.aria-label]=\"formConfig.fields[0]?.label + ' form'\">\n <div *ngFor=\"let field of formConfig.fields\" class=\"form-field\" [ngClass]=\"{'hidden': !isFieldVisible(field)}\">\n <label [for]=\"field.name\" class=\"form-label\">\n {{ field.label }}\n <span *ngIf=\"field.validations?.required\" class=\"required-marker\">*</span>\n </label>\n\n <ng-container [ngSwitch]=\"field.type\">\n <!-- Text, Email, Number, Password inputs -->\n <input *ngSwitchCase=\"'text'\" \n [type]=\"field.type\"\n [id]=\"field.name\"\n [name]=\"field.name\"\n [placeholder]=\"field.placeholder || ''\"\n [(ngModel)]=\"field.value\"\n #fieldModel=\"ngModel\"\n [required]=\"field.validations?.required\"\n [minlength]=\"field.validations?.minLength\"\n [maxlength]=\"field.validations?.maxLength\"\n [pattern]=\"field.validations?.pattern\"\n [email]=\"field.validations?.email\"\n class=\"form-input\"\n [ngClass]=\"{'error': fieldModel.invalid && (fieldModel.dirty || fieldModel.touched)}\"\n [attr.aria-invalid]=\"fieldModel.invalid && (fieldModel.dirty || fieldModel.touched)\"\n [attr.aria-describedby]=\"field.name + '-error'\">\n\n <input *ngSwitchCase=\"'email'\"\n type=\"email\"\n [id]=\"field.name\"\n [name]=\"field.name\"\n [placeholder]=\"field.placeholder || ''\"\n [(ngModel)]=\"field.value\"\n #fieldModel=\"ngModel\"\n [required]=\"field.validations?.required\"\n [email]=\"true\"\n class=\"form-input\"\n [ngClass]=\"{'error': fieldModel.invalid && (fieldModel.dirty || fieldModel.touched)}\"\n [attr.aria-invalid]=\"fieldModel.invalid && (fieldModel.dirty || fieldModel.touched)\"\n [attr.aria-describedby]=\"field.name + '-error'\">\n\n <input *ngSwitchCase=\"'number'\"\n type=\"number\"\n [id]=\"field.name\"\n [name]=\"field.name\"\n [placeholder]=\"field.placeholder || ''\"\n [(ngModel)]=\"field.value\"\n #fieldModel=\"ngModel\"\n [required]=\"field.validations?.required\"\n class=\"form-input\"\n [ngClass]=\"{'error': fieldModel.invalid && (fieldModel.dirty || fieldModel.touched)}\"\n [attr.aria-invalid]=\"fieldModel.invalid && (fieldModel.dirty || fieldModel.touched)\"\n [attr.aria-describedby]=\"field.name + '-error'\">\n\n <input *ngSwitchCase=\"'password'\"\n type=\"password\"\n [id]=\"field.name\"\n [name]=\"field.name\"\n [placeholder]=\"field.placeholder || ''\"\n [(ngModel)]=\"field.value\"\n #fieldModel=\"ngModel\"\n [required]=\"field.validations?.required\"\n [minlength]=\"field.validations?.minLength\"\n [pattern]=\"field.validations?.pattern\"\n class=\"form-input\"\n [ngClass]=\"{'error': fieldModel.invalid && (fieldModel.dirty || fieldModel.touched)}\"\n [attr.aria-invalid]=\"fieldModel.invalid && (fieldModel.dirty || fieldModel.touched)\"\n [attr.aria-describedby]=\"field.name + '-error'\">\n\n <!-- Select dropdown -->\n <select *ngSwitchCase=\"'select'\"\n [id]=\"field.name\"\n [name]=\"field.name\"\n [(ngModel)]=\"field.value\"\n #fieldModel=\"ngModel\"\n [required]=\"field.validations?.required\"\n class=\"form-select\"\n [ngClass]=\"{'error': fieldModel.invalid && (fieldModel.dirty || fieldModel.touched)}\"\n [attr.aria-invalid]=\"fieldModel.invalid && (fieldModel.dirty || fieldModel.touched)\"\n [attr.aria-describedby]=\"field.name + '-error'\">\n <option value=\"\">Select {{ field.label }}</option>\n <option *ngFor=\"let option of field.options\" [value]=\"option.value\">\n {{ option.label }}\n </option>\n </select>\n\n <!-- Textarea -->\n <textarea *ngSwitchCase=\"'textarea'\"\n [id]=\"field.name\"\n [name]=\"field.name\"\n [placeholder]=\"field.placeholder || ''\"\n [(ngModel)]=\"field.value\"\n #fieldModel=\"ngModel\"\n [required]=\"field.validations?.required\"\n [minlength]=\"field.validations?.minLength\"\n [maxlength]=\"field.validations?.maxLength\"\n class=\"form-textarea\"\n [ngClass]=\"{'error': fieldModel.invalid && (fieldModel.dirty || fieldModel.touched)}\"\n [attr.aria-invalid]=\"fieldModel.invalid && (fieldModel.dirty || fieldModel.touched)\"\n [attr.aria-describedby]=\"field.name + '-error'\">\n </textarea>\n </ng-container>\n\n <!-- Error messages -->\n <div *ngIf=\"fieldModel.invalid && (fieldModel.dirty || fieldModel.touched)\"\n class=\"error-messages\"\n [id]=\"field.name + '-error'\"\n role=\"alert\">\n <div *ngIf=\"fieldModel.errors?.required\">\n {{ field.errorMessages?.required }}\n </div>\n <div *ngIf=\"fieldModel.errors?.minlength\">\n {{ field.errorMessages?.minlength }}\n </div>\n <div *ngIf=\"fieldModel.errors?.maxlength\">\n {{ field.errorMessages?.maxlength }}\n </div>\n <div *ngIf=\"fieldModel.errors?.email\">\n {{ field.errorMessages?.email }}\n </div>\n <div *ngIf=\"fieldModel.errors?.pattern\">\n {{ field.errorMessages?.pattern }}\n </div>\n </div>\n </div>\n\n <button type=\"submit\"\n [disabled]=\"!form.valid\"\n [class]=\"formConfig.submitButton?.class || 'submit-button'\"\n [attr.aria-disabled]=\"!form.valid\">\n {{ formConfig.submitButton?.text || 'Submit' }}\n </button>\n </form>\n `,\n styles: [`\n .dynamic-form {\n max-width: 600px;\n margin: 0 auto;\n padding: 20px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n }\n\n .form-field {\n margin-bottom: 20px;\n }\n\n .form-label {\n display: block;\n margin-bottom: 8px;\n font-weight: 500;\n color: #333;\n }\n\n .required-marker {\n color: #dc3545;\n margin-left: 4px;\n }\n\n .form-input,\n .form-select,\n .form-textarea {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid #ced4da;\n border-radius: 4px;\n font-size: 16px;\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n }\n\n .form-textarea {\n min-height: 100px;\n resize: vertical;\n }\n\n .form-input:focus,\n .form-select:focus,\n .form-textarea:focus {\n border-color: #80bdff;\n outline: 0;\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n }\n\n .error {\n border-color: #dc3545;\n }\n\n .error:focus {\n border-color: #dc3545;\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n }\n\n .error-messages {\n margin-top: 5px;\n color: #dc3545;\n font-size: 14px;\n }\n\n .hidden {\n display: none;\n }\n\n .submit-button {\n background-color: #007bff;\n color: white;\n padding: 10px 20px;\n border: none;\n border-radius: 4px;\n font-size: 16px;\n cursor: pointer;\n transition: background-color 0.15s ease-in-out;\n }\n\n .submit-button:hover:not(:disabled) {\n background-color: #0056b3;\n }\n\n .submit-button:disabled {\n background-color: #6c757d;\n cursor: not-allowed;\n opacity: 0.65;\n }\n\n @media (max-width: 768px) {\n .dynamic-form {\n padding: 15px;\n }\n }\n `]\n})\nexport class DynamicFormComponent implements OnInit {\n @Input() formConfig!: FormConfig;\n @Output() formSubmit = new EventEmitter<any>();\n\n constructor(private aiValidationService: AiValidationService) {}\n\n ngOnInit() {\n // Apply AI-based validation rules to each field\n this.formConfig.fields = this.formConfig.fields.map(field => \n this.aiValidationService.suggestValidations(field)\n );\n }\n\n isFieldVisible(field: FormFieldConfig): boolean {\n if (!field.conditionalDisplay) {\n return true;\n }\n\n const dependentField = this.formConfig.fields.find(\n f => f.name === field.conditionalDisplay?.dependsOn\n );\n\n return dependentField?.value === field.conditionalDisplay.showWhen;\n }\n\n onSubmit(form: NgForm) {\n if (form.valid) {\n const formData = this.formConfig.fields.reduce((acc, field) => {\n if (this.isFieldVisible(field)) {\n acc[field.name] = field.value;\n }\n return acc;\n }, {} as any);\n\n this.formSubmit.emit(formData);\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DynamicFormComponent } from './components/dynamic-form.component';\nimport { AiValidationService } from './services/ai-validation.service';\n\n@NgModule({\n declarations: [\n DynamicFormComponent\n ],\n imports: [\n CommonModule,\n FormsModule\n ],\n exports: [\n DynamicFormComponent\n ],\n providers: [\n AiValidationService\n ]\n})\nexport class DynamicFormsModule { }\n","/*\n * Public API Surface of dynamic-forms\n */\n\nexport * from './lib/dynamic-forms.module';\nexport * from './lib/interfaces/form-field.interface';\nexport * from './lib/services/ai-validation.service';\nexport * from './lib/components/dynamic-form.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AiValidationService"],"mappings":"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"}