ngx-show-form-errors
Version:
An Angular library providing a directive to automatically display form error messages.
1 lines • 21.2 kB
Source Map (JSON)
{"version":3,"file":"ngx-show-form-errors.mjs","sources":["../../../projects/ngx-show-form-errors/src/lib/auxiliars/cssClassConfig.ts","../../../projects/ngx-show-form-errors/src/lib/auxiliars/ShowFormErrorsBase.ts","../../../projects/ngx-show-form-errors/src/lib/auxiliars/HtmlHelper.ts","../../../projects/ngx-show-form-errors/src/lib/auxiliars/ControlToValidate.ts","../../../projects/ngx-show-form-errors/src/lib/auxiliars/ShowFormErrorsSingleControl.ts","../../../projects/ngx-show-form-errors/src/lib/auxiliars/ShowFormErrorsForm.ts","../../../projects/ngx-show-form-errors/src/lib/ngx-show-form-errors.directive.ts","../../../projects/ngx-show-form-errors/src/public-api.ts","../../../projects/ngx-show-form-errors/src/ngx-show-form-errors.ts"],"sourcesContent":["/*\n * Copyright (c) Vinícius Bastos da Silva 2025\n * This file is part of ngx-show-form-errors.\n * Licensed under the GNU Lesser General Public License v3 (LGPL v3).\n * See the LICENSE file in the project root for full details.\n*/\n\nexport const cssClassConfig = {\n invalidControl: 'is-invalid',\n containerErrors: 'invalid-feedback',\n itemError: 'invalid-feedback-item',\n itemErrorHide: 'd-none',\n}\n","/*\n * Copyright (c) Vinícius Bastos da Silva 2025\n * This file is part of ngx-show-form-errors.\n * Licensed under the GNU Lesser General Public License v3 (LGPL v3).\n * See the LICENSE file in the project root for full details.\n*/\n\nimport { ControlToValidate } from \"./ControlToValidate\";\nimport { Subscription } from \"rxjs\";\nimport { ElementRef } from \"@angular/core\";\nimport { cssClassConfig } from \"./cssClassConfig\";\n\nexport abstract class ShowFormErrorsBase {\n protected controlsToValidate: ControlToValidate[] = [];\n\n protected formElement!: HTMLFormElement;\n\n public subscriptionsToUnsubscribe: Subscription[] = [];\n\n private get formIdPrefix(): string { return this.formElement?.id ? `${this.formElement.id}-` : ''; }\n\n constructor(protected elementRef: ElementRef, private formWasSubmitted: () => boolean) { }\n\n public abstract loadControls(): void;\n\n public transformTemplates() {\n this.controlsToValidate.forEach(controlToValidate =>\n controlToValidate.transformErrorMessagesTemplate(this.formIdPrefix));\n }\n\n public bindEventToRefreshValidationMessagesOnControls() {\n for (let controlToValidate of this.controlsToValidate) {\n this.formElement?.addEventListener('submit', this.refreshValidationMessagesState.bind(this, controlToValidate));\n\n // Without valueChanges or statusChanges, the message will only change on blur, and not while the user types\n const statusChangesSubscription =\n controlToValidate.control.statusChanges.subscribe(_ =>\n this.refreshValidationMessagesState(controlToValidate));\n\n this.subscriptionsToUnsubscribe.push(statusChangesSubscription);\n\n controlToValidate.htmlElement.addEventListener('blur',\n _ => this.refreshValidationMessagesState(controlToValidate));\n }\n }\n\n protected refreshValidationMessagesState(controlToValidate: ControlToValidate) {\n if (!this.fieldShouldShowError(controlToValidate))\n return;\n\n controlToValidate.htmlElement.classList.toggle('is-invalid', controlToValidate.control.invalid);\n\n controlToValidate.invalidFeedback.items.forEach(({ validator, element }) =>\n element.classList.toggle(cssClassConfig.itemErrorHide, !controlToValidate.controlHasError(validator)));\n }\n\n // It can be a function defined by the user in the future\n private fieldShouldShowError(controlToValidate: ControlToValidate): boolean {\n const formIsSubmitted = this.formWasSubmitted() ?? false;\n const controlIsTouched = controlToValidate.control.touched;\n\n return formIsSubmitted || controlIsTouched; // || controlToValidate.control.dirty;\n }\n\n public refreshValidationMessagesStateForAllControls() {\n this.controlsToValidate.forEach(controlToValidate =>\n this.refreshValidationMessagesState(controlToValidate));\n }\n}\n","/*\n * Copyright (c) Vinícius Bastos da Silva 2025\n * This file is part of ngx-show-form-errors.\n * Licensed under the GNU Lesser General Public License v3 (LGPL v3).\n * See the LICENSE file in the project root for full details.\n*/\n\nexport class HtmlHelper {\n\n public static getClosestFormParent(element: HTMLElement): HTMLFormElement {\n let formElement = element.closest('form');\n if (!formElement)\n throw new Error('NgxShowFormErrorsDirective: No form found');\n\n return formElement;\n }\n\n\n public static formControlHasADataField(formElement: HTMLFormElement, controlName: string): boolean {\n return !!formElement.querySelector(`[data-field=\"${controlName}\"]`)\n }\n}\n","/*\n * Copyright (c) Vinícius Bastos da Silva 2025\n * This file is part of ngx-show-form-errors.\n * Licensed under the GNU Lesser General Public License v3 (LGPL v3).\n * See the LICENSE file in the project root for full details.\n*/\n\nimport { FormControl } from '@angular/forms';\nimport { cssClassConfig } from './cssClassConfig';\n\nexport class ControlToValidate {\n public invalidFeedback: {\n container: HTMLElement;\n items: { validator: string; element: HTMLElement }[];\n };\n\n constructor(\n public readonly htmlElement: HTMLElement,\n public readonly control: FormControl,\n public readonly controlName: string\n ) {\n const invalidFeedbackContainer = this.queryInClosestParentUntilForm(\n htmlElement,\n `[data-field=\"${this.controlName}\"]`\n );\n const elements = Array.from(\n invalidFeedbackContainer.querySelectorAll('[data-validator]')\n ) as HTMLElement[];\n\n const invalidFeedbackItems = elements.map((element) => ({\n validator: element.dataset['validator']!,\n element,\n }));\n\n this.invalidFeedback = {\n container: invalidFeedbackContainer,\n items: invalidFeedbackItems,\n };\n }\n\n private queryInClosestParentUntilForm(\n el: HTMLElement,\n selector: string\n ): HTMLElement {\n const res = el.parentElement?.querySelector(selector);\n if (\n !res &&\n el.parentElement &&\n el.parentElement?.tagName.toLowerCase() !== 'body'\n )\n return this.queryInClosestParentUntilForm(el.parentElement, selector);\n\n return res as HTMLElement;\n }\n\n public transformErrorMessagesTemplate(formIdPrefix: string) {\n this.invalidFeedback.container.classList.add(\n cssClassConfig.containerErrors\n );\n\n this.invalidFeedback.items.forEach(\n ({ validator, element }) => {\n const controlIdentifier =\n this.htmlElement.id || this.controlName;\n const validatorName = validator.replace('.', '-');\n\n element.id = formIdPrefix + controlIdentifier + '-' + validatorName;\n element.classList.add(cssClassConfig.itemError);\n element.classList.add(cssClassConfig.itemErrorHide);\n }\n );\n }\n\n public controlHasError(validator: string): boolean {\n if (!this.control.errors) return false;\n\n const validatorsToCheck = validator.split('.'); // Ex: 'required.minlength'\n const existingErrors = Object.keys(this.control.errors).filter(e => this.control.errors![e]);\n\n return validatorsToCheck.some(v => existingErrors.includes(v));\n }\n\n}\n","/*\n * Copyright (c) Vinícius Bastos da Silva 2025\n * This file is part of ngx-show-form-errors.\n * Licensed under the GNU Lesser General Public License v3 (LGPL v3).\n * See the LICENSE file in the project root for full details.\n*/\n\nimport { FormControl, NgControl } from \"@angular/forms\";\nimport { ShowFormErrorsBase } from \"./ShowFormErrorsBase\";\nimport { HtmlHelper } from \"./HtmlHelper\";\nimport { ElementRef } from \"@angular/core\";\nimport { ControlToValidate } from \"./ControlToValidate\";\n\nexport class ShowFormErrorsSingleControl extends ShowFormErrorsBase {\n constructor(elementRef: ElementRef, private ngControl: NgControl, formWasSubmitted: () => boolean) {\n super(elementRef, formWasSubmitted);\n }\n\n public loadControls(): void {\n const htmlElement = this.elementRef.nativeElement;\n\n this.formElement = HtmlHelper.getClosestFormParent(htmlElement);\n\n const controlName =\n htmlElement.getAttribute('name') ??\n htmlElement.getAttribute('formControlName');\n this.controlsToValidate.push(new ControlToValidate(htmlElement, this.ngControl.control as FormControl, controlName));\n }\n}\n","/*\n * Copyright (c) Vinícius Bastos da Silva 2025\n * This file is part of ngx-show-form-errors.\n * Licensed under the GNU Lesser General Public License v3 (LGPL v3).\n * See the LICENSE file in the project root for full details.\n*/\n\nimport { FormControl, FormGroup, NgControl } from \"@angular/forms\";\nimport { ShowFormErrorsBase } from \"./ShowFormErrorsBase\";\nimport { ElementRef } from \"@angular/core\";\nimport { ControlToValidate } from \"./ControlToValidate\";\nimport { HtmlHelper } from \"./HtmlHelper\";\n\nexport class ShowFormErrorsForm extends ShowFormErrorsBase {\n\n constructor(elementRef: ElementRef, private formGroup: FormGroup, formWasSubmitted: () => boolean) {\n super(elementRef, formWasSubmitted);\n }\n\n public loadControls() {\n this.formElement = this.elementRef.nativeElement;\n this.formGroup = this.formGroup;\n\n const controls = this.formGroup.controls;\n for (let controlName in controls) {\n if (!HtmlHelper.formControlHasADataField(this.formElement, controlName))\n continue;\n\n const element = this.formElement.querySelector<HTMLElement>(`[name=\"${controlName}\"], [formControlName=\"${controlName}\"]`);\n if (element == null)\n throw new Error(`Control ${controlName} not found!`);\n\n this.controlsToValidate.push(new ControlToValidate(element, controls[controlName] as FormControl, controlName));\n }\n\n }\n}\n","/*\n * Copyright (c) Vinícius Bastos da Silva 2025\n * This file is part of ngx-show-form-errors.\n * Licensed under the GNU Lesser General Public License v3 (LGPL v3).\n * See the LICENSE file in the project root for full details.\n*/\n\nimport { AfterViewInit, Directive, ElementRef, OnDestroy, Optional } from '@angular/core';\nimport { FormGroupDirective, NgControl, NgForm } from '@angular/forms';\nimport { ShowFormErrorsBase } from './auxiliars/ShowFormErrorsBase';\nimport { ShowFormErrorsSingleControl } from './auxiliars/ShowFormErrorsSingleControl';\nimport { ShowFormErrorsForm } from './auxiliars/ShowFormErrorsForm';\n\n@Directive({\n selector: '[ngxShowFormErrors]',\n standalone: true,\n})\nexport class NgxShowFormErrorsDirective implements AfterViewInit, OnDestroy {\n\n private showFormErrors?: ShowFormErrorsBase;\n constructor(\n private readonly elementRef: ElementRef,\n @Optional() private readonly ngControl: NgControl,\n @Optional() private readonly ngForm: NgForm,\n @Optional() private readonly formGroupDirective: FormGroupDirective) { }\n\n ngAfterViewInit() {\n const formWasSubmitted = () => (this.ngForm || this.formGroupDirective)?.submitted;\n\n switch (true) {\n case !!this.ngControl:\n this.showFormErrors = new ShowFormErrorsSingleControl(this.elementRef, this.ngControl, formWasSubmitted);\n this.showFormErrors.loadControls();\n this.showFormErrors.transformTemplates();\n this.showFormErrors.bindEventToRefreshValidationMessagesOnControls();\n break;\n case !!this.ngForm:\n // That is necessary because the ngForm is async\n Promise.resolve().then(() => {\n this.showFormErrors = new ShowFormErrorsForm(this.elementRef, this.ngForm.form, formWasSubmitted);\n this.showFormErrors.loadControls();\n this.showFormErrors.transformTemplates();\n this.showFormErrors.bindEventToRefreshValidationMessagesOnControls();\n\n this.showFormErrors.refreshValidationMessagesStateForAllControls();\n });\n\n break;\n case !!this.formGroupDirective:\n const formGroupWasSubmitted = () => this.formGroupDirective.submitted;\n this.showFormErrors = new ShowFormErrorsForm(this.elementRef, this.formGroupDirective.form, formGroupWasSubmitted);\n this.showFormErrors.loadControls();\n this.showFormErrors.transformTemplates();\n this.showFormErrors.bindEventToRefreshValidationMessagesOnControls();\n break;\n default:\n throw new Error('NgxShowFormErrorsDirective: No control or form found');\n }\n }\n\n ngOnDestroy(): void {\n this.showFormErrors?.subscriptionsToUnsubscribe.forEach(s => s.unsubscribe());\n }\n}\n","/*\n * Public API Surface of ngx-show-form-errors\n */\n\nexport * from './lib/ngx-show-form-errors.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}