ngx-reactive-forms-utils
Version:
Reactive forms in Angular are a great way to manage forms. This library provides utilities that make it easier to work with reactive forms.
1 lines • 20.9 kB
Source Map (JSON)
{"version":3,"file":"ngx-reactive-forms-utils.mjs","sources":["../../../../libs/reactive-forms-utils/src/lib/custom-error-message-utils.ts","../../../../libs/reactive-forms-utils/src/lib/control-errors-display/control-errors-display.component.ts","../../../../libs/reactive-forms-utils/src/lib/control-errors-display/control-errors-display.component.html","../../../../libs/reactive-forms-utils/src/lib/brithday.util.ts","../../../../libs/reactive-forms-utils/src/lib/custom-validators.ts","../../../../libs/reactive-forms-utils/src/lib/form-debug.util.ts","../../../../libs/reactive-forms-utils/src/lib/form-debug-display/form-debug-display.component.ts","../../../../libs/reactive-forms-utils/src/lib/form-debug-display/form-debug-display.component.html","../../../../libs/reactive-forms-utils/src/ngx-reactive-forms-utils.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype CustomErrorMesageFunction = (...args: any[]) => string;\n\nexport interface CustomErrorMessages {\n\t// eslint-disable-next-line @typescript-eslint/ban-types\n\t[key: string]: CustomErrorMesageFunction;\n}\n\nexport function addCustomErrorMessage(name: string, fn: CustomErrorMesageFunction) {\n\tdefaultCustomErrorMessages[name] = fn;\n}\n\nexport const defaultCustomErrorMessages: CustomErrorMessages = {\n\trequired: () => `This field is required`,\n\tminlength: ({ requiredLength, actualLength }: { requiredLength: number; actualLength: number }) =>\n\t\t`Expected length of ${requiredLength} but got ${actualLength}`,\n\tmaxlength: ({ requiredLength, actualLength }: { requiredLength: number; actualLength: number }) =>\n\t\t`Expected length of ${requiredLength} but got ${actualLength}`,\n\tmin: ({ min }: { min: number }) => `You must provide a minimum value of ${min}.`,\n\tmax: ({ max, actual }: { max: number; actual: number }) =>\n\t\t`You entered a value of ${actual}, but the max you can enter is ${max}.`,\n\temail: () => `Your email address is not valid.`,\n\tnumber: () => `This field can only contain numbers.`,\n\tconfirmStringMatch: ({ field1, field2 }) => {\n\t\tconst formattedField1: string = field1.replace(/([a-zA-Z])(?=[A-Z])/g, '$1 ').toLowerCase();\n\t\tconst formattedField2: string = field2.replace(/([a-zA-Z])(?=[A-Z])/g, '$1 ').toLowerCase();\n\t\treturn `The values of ${formattedField1} and ${formattedField2} don't match.`;\n\t},\n\tminAge: ({ minAge, actual }) => `You must be at least ${minAge} years old. You are currently ${actual} years old.`,\n\tmaxAge: ({ maxAge, actual }) =>\n\t\t`You must be no more than ${maxAge} years old. You are currently ${actual} years old.`,\n};\n\nexport const FORM_ERRORS = new InjectionToken('FORM_ERRORS', {\n\tprovidedIn: 'root',\n\tfactory: () => defaultCustomErrorMessages,\n});\n\nexport const FORM_ERRORS_DEBOUNCE_TIME = new InjectionToken('FORM_ERRORS_DEBOUNCE_TIME', {\n\tprovidedIn: 'root',\n\tfactory: () => 0,\n});\n","import { AfterContentInit, Component, ContentChild, Inject, Input } from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { Observable, debounceTime, map, startWith } from 'rxjs';\nimport { CustomErrorMessages, FORM_ERRORS, FORM_ERRORS_DEBOUNCE_TIME } from '../custom-error-message-utils';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n\tselector: 'ngx-control-errors-display',\n\ttemplateUrl: './control-errors-display.component.html',\n\tstyleUrls: ['./control-errors-display.component.scss'],\n\tstandalone: true,\n\timports: [AsyncPipe],\n})\nexport class ControlErrorsDisplayComponent implements AfterContentInit {\n\t@Input() containerClasses = '';\n\t@Input() errorClasses = '';\n\t@Input() rules = ['touched'];\n\n\t@ContentChild(NgControl, { static: true }) control!: NgControl;\n\n\terrorsList$: Observable<string[]> | undefined;\n\n\tget rulesBroken() {\n\t\treturn this.rules.every((rule) => this.control[rule as keyof NgControl]);\n\t}\n\n\tprivate _errorMessages: CustomErrorMessages = this._errors;\n\n\tconstructor(\n\t\t@Inject(FORM_ERRORS) private _errors: CustomErrorMessages,\n\t\t@Inject(FORM_ERRORS_DEBOUNCE_TIME) private debounceTime: number,\n\t) {}\n\n\tngAfterContentInit() {\n\t\tif (this.control) {\n\t\t\tthis.errorsList$ = this.control.statusChanges?.pipe(\n\t\t\t\tstartWith(this.control.status),\n\t\t\t\tdebounceTime(this.debounceTime),\n\t\t\t\tmap(() => {\n\t\t\t\t\tconst errors = this.control.errors;\n\n\t\t\t\t\tif (errors) {\n\t\t\t\t\t\treturn Object.keys(errors).map((errorKey) => {\n\t\t\t\t\t\t\tconst getError = this._errorMessages[errorKey];\n\t\t\t\t\t\t\treturn getError ? getError(errors[errorKey]) : 'Unknown Error';\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn [];\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n}\n","<div class=\"{{ containerClasses }}\">\n\t<ng-content></ng-content>\n\n\t@if (rulesBroken) {\n\t\t@if (errorsList$ | async; as errorsList) {\n\t\t\t@if (errorsList && errorsList.length) {\n\t\t\t\t@for (error of errorsList; track error) {\n\t\t\t\t\t<p class=\"{{ errorClasses }}\">{{ error }}</p>\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n</div>\n","export function calculateAge(birthdate: string | Date) {\n\tconst currentDate = fixTimezoneOffset(new Date());\n\tconst birthDate = fixTimezoneOffset(new Date(birthdate));\n\n\tlet age = currentDate.getFullYear() - birthDate.getFullYear();\n\n\tif (\n\t\tcurrentDate.getMonth() < birthDate.getMonth() ||\n\t\t(currentDate.getMonth() === birthDate.getMonth() && currentDate.getDate() < birthDate.getDate())\n\t) {\n\t\tage--;\n\t}\n\n\treturn age;\n}\n\nfunction fixTimezoneOffset(date: Date) {\n\treturn new Date(date.getTime() - date.getTimezoneOffset() * 60000);\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\nimport { calculateAge } from './brithday.util';\n\nexport abstract class CustomValidators {\n\tstatic phoneNumber(control: AbstractControl): ValidationErrors | null {\n\t\tif (!control.value) {\n\t\t\treturn null;\n\t\t}\n\t\t// eslint-disable-next-line no-useless-escape\n\t\tconst PHONE_REGEX = /^(1\\s?)?((\\([2-9][0-9]{2}\\))|[2-9][0-9]{2})[\\s\\-]?[2-9][0-9]{2}[\\s\\-]?[0-9]{4}$/;\n\t\treturn PHONE_REGEX.test(control.value) ? null : { phoneNumber: true };\n\t}\n\n\tstatic number(control: AbstractControl): ValidationErrors | null {\n\t\t// eslint-disable-next-line no-useless-escape\n\t\tconst NUMBER_REGEX = /^([0-9])*([\\.])?[0-9]+$/;\n\t\treturn NUMBER_REGEX.test(control.value) ? null : { number: true };\n\t}\n\n\tstatic validZipCode(control: AbstractControl): ValidationErrors | null {\n\t\tif (!control.value) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// XXXXX or XXXXX-XXXX\n\t\tconst ZIP_REGEX = /(^\\d{5}$)|(^\\d{5}-\\d{4}$)/;\n\t\treturn ZIP_REGEX.test(control.value) ? null : { validZipCode: true };\n\t}\n\n\tstatic confirmStringMatch(field1: string, field2: string): ValidatorFn {\n\t\treturn (form): ValidationErrors | null => {\n\t\t\tconst valueControl = form.get(field1);\n\t\t\tconst confirmValueControl = form.get(field2);\n\n\t\t\tif (!valueControl || !confirmValueControl || !valueControl.value || !confirmValueControl.value) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (confirmValueControl.errors && !confirmValueControl.errors[field2]) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (valueControl.value !== confirmValueControl.value) {\n\t\t\t\tconfirmValueControl.setErrors({ confirmStringMatch: { field1, field2 } });\n\t\t\t\treturn { confirmStringMatch: { field1, field2 } };\n\t\t\t}\n\n\t\t\tconfirmValueControl.setErrors(null);\n\t\t\treturn null;\n\t\t};\n\t}\n\n\tstatic minAge(minAge: number): ValidatorFn {\n\t\treturn (control: AbstractControl) => {\n\t\t\tif (!control.value) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst birthDate = new Date(control.value);\n\t\t\tconst age = calculateAge(birthDate);\n\n\t\t\tif (age < minAge) {\n\t\t\t\treturn { minAge: { minAge, actual: age } };\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\t}\n\n\tstatic maxAge(maxAge: number): ValidatorFn {\n\t\treturn (control: AbstractControl) => {\n\t\t\tif (!control.value) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst birthDate = new Date(control.value);\n\t\t\tconst age = calculateAge(birthDate);\n\n\t\t\tif (age > maxAge) {\n\t\t\t\treturn { maxAge: { maxAge, actual: age } };\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\t}\n}\n","import { AbstractControl, Form, FormControlStatus, FormGroup, ValidationErrors } from '@angular/forms';\nimport { combineLatest, EMPTY, map, Observable, of, startWith } from 'rxjs';\n\nexport enum FormDebugFieldEnum {\n\tValue = 'Value',\n\tFormErrors = 'FormErrors',\n\tControlErrors = 'ControlErrors',\n\tStatus = 'Status',\n\tValid = 'Valid',\n\tInvalid = 'Invalid',\n}\nexport type FormDebugField =\n\t| FormDebugFieldEnum.Value\n\t| FormDebugFieldEnum.FormErrors\n\t| FormDebugFieldEnum.ControlErrors\n\t| FormDebugFieldEnum.Status\n\t| FormDebugFieldEnum.Valid\n\t| FormDebugFieldEnum.Invalid;\n\nexport interface ControlErrorStatusDisplay {\n\terrors: ValidationErrors | null;\n\tstatus: FormControlStatus;\n}\nexport interface FormDebugValue {\n\tvalue?: Record<string, any>;\n\tformErrors?: ValidationErrors | null;\n\tcontrolErrors?: Record<string, ControlErrorStatusDisplay>;\n\tstatus?: FormControlStatus;\n\tvalid?: boolean;\n\tinvalid?: boolean;\n}\n\nexport const DEFAULT_DEBUG_FIELDS: FormDebugField[] = Object.keys(FormDebugFieldEnum).map(\n\t(key) => key as FormDebugFieldEnum,\n);\n\nexport function debugForm(\n\tform: FormGroup,\n\tdebugFields: FormDebugField[] = [...DEFAULT_DEBUG_FIELDS],\n): Observable<FormDebugValue | typeof EMPTY> {\n\tif (!form) {\n\t\treturn of(EMPTY);\n\t}\n\n\treturn combineLatest([\n\t\tform.valueChanges.pipe(startWith(form.value)),\n\t\tform.statusChanges.pipe(startWith(form.status)),\n\t]).pipe(\n\t\tmap(() => {\n\t\t\tconst returnObject: FormDebugValue = {};\n\n\t\t\tif (debugFields.includes(FormDebugFieldEnum.Value)) {\n\t\t\t\treturnObject.value = form.value;\n\t\t\t}\n\n\t\t\tif (debugFields.includes(FormDebugFieldEnum.FormErrors)) {\n\t\t\t\treturnObject.formErrors = form.errors;\n\t\t\t}\n\n\t\t\tif (debugFields.includes(FormDebugFieldEnum.ControlErrors)) {\n\t\t\t\tconst controlErrors = Object.keys(form.controls).reduce(\n\t\t\t\t\t(acc, controlName) => {\n\t\t\t\t\t\tconst control = form.get(controlName);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t[controlName]: {\n\t\t\t\t\t\t\t\terrors: control?.errors,\n\t\t\t\t\t\t\t\tstatus: control?.status,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as Record<string, ControlErrorStatusDisplay>;\n\t\t\t\t\t},\n\t\t\t\t\t{} as Record<string, ControlErrorStatusDisplay>,\n\t\t\t\t);\n\n\t\t\t\treturnObject.controlErrors = controlErrors;\n\t\t\t}\n\n\t\t\tif (debugFields.includes(FormDebugFieldEnum.Status)) {\n\t\t\t\treturnObject.status = form.status;\n\t\t\t}\n\n\t\t\tif (debugFields.includes(FormDebugFieldEnum.Valid)) {\n\t\t\t\treturnObject.valid = form.valid;\n\t\t\t}\n\n\t\t\treturn returnObject;\n\t\t}),\n\t);\n}\n","import { Component, Input, SimpleChanges } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { debugForm, DEFAULT_DEBUG_FIELDS, FormDebugField, FormDebugValue } from '../form-debug.util';\nimport { AsyncPipe, JsonPipe } from '@angular/common';\nimport { EMPTY, Observable } from 'rxjs';\n\n@Component({\n\tselector: 'ngx-form-debug-display',\n\tstandalone: true,\n\timports: [AsyncPipe, JsonPipe],\n\ttemplateUrl: './form-debug-display.component.html',\n\tstyleUrls: ['./form-debug-display.component.scss'],\n})\nexport class FormDebugDisplayComponent {\n\t@Input() debugFields: FormDebugField[] = [...DEFAULT_DEBUG_FIELDS];\n\t@Input({ required: true }) form!: FormGroup; // No need for getter/setter\n\tpublic debugData$!: Observable<FormDebugValue | typeof EMPTY>;\n\n\tngOnChanges(changes: SimpleChanges) {\n\t\tif (changes['form'] || changes['debugFields']) {\n\t\t\tif (this.form) {\n\t\t\t\tthis.debugData$ = debugForm(this.form, this.debugFields);\n\t\t\t}\n\t\t}\n\t}\n}\n","@if (form) {\n\t<pre><code>\n{{ debugData$ | async | json }}\n</code></pre>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}