From a31413635a2443489ed67521ef7cb8dd0007f7d2 Mon Sep 17 00:00:00 2001 From: Fernando Santos Date: Wed, 24 Jun 2026 13:01:59 -0400 Subject: [PATCH] Core: Trigger watchForError callbacks from setError --- packages/scripts/dist/engrid.d.ts | 1 + packages/scripts/dist/engrid.js | 33 +++++++++++++++---------- packages/scripts/src/engrid.ts | 40 +++++++++++++++++++++---------- 3 files changed, 49 insertions(+), 25 deletions(-) diff --git a/packages/scripts/dist/engrid.d.ts b/packages/scripts/dist/engrid.d.ts index 09b97941..5dddf87c 100644 --- a/packages/scripts/dist/engrid.d.ts +++ b/packages/scripts/dist/engrid.d.ts @@ -54,6 +54,7 @@ export declare abstract class ENGrid { static removeHtml(target: string): void; static slugify(text: string): string; static watchForError(callback: Function): void; + private static getErrorCallbackKey; static getPaymentType(): string; static setPaymentType(paymentType: string): void; static isInViewport(element: HTMLElement): boolean; diff --git a/packages/scripts/dist/engrid.js b/packages/scripts/dist/engrid.js index 6d323b87..3aebd394 100644 --- a/packages/scripts/dist/engrid.js +++ b/packages/scripts/dist/engrid.js @@ -1,3 +1,4 @@ +const errorCallbacks = new Map(); export class ENGrid { constructor() { if (!ENGrid.enForm) { @@ -426,6 +427,7 @@ export class ENGrid { else { errorMessageElement.innerHTML = errorMessage; } + errorCallbacks.forEach((callback) => callback()); } } static removeError(element) { @@ -510,6 +512,24 @@ export class ENGrid { // This function is used to run a callback function when an error is displayed on the page static watchForError(callback) { const errorElement = document.querySelector(".en__errorList"); + const callbackType = ENGrid.getErrorCallbackKey(callback); + // Register callback so setError can trigger it too + if (!errorCallbacks.has(callbackType)) { + errorCallbacks.set(callbackType, callback); + } + if (errorElement && !errorElement.dataset[callbackType]) { + errorElement.dataset[callbackType] = "true"; + const observer = new MutationObserver(function (mutations) { + mutations.forEach(function (mutation) { + if (mutation.type === "childList" && mutation.addedNodes.length > 0) { + callback(); + } + }); + }); + observer.observe(errorElement, { childList: true }); + } + } + static getErrorCallbackKey(callback) { const capitalize = (word) => word.charAt(0).toUpperCase() + word.slice(1); // Avoid duplicate callbacks let callbackType = callback.toString(); @@ -523,18 +543,7 @@ export class ENGrid { callbackType = callbackType.replace(/[^a-zA-Z0-9]/g, ""); // Limit to 20 characters and add prefix callbackType = callbackType.substring(0, 20); - callbackType = "engrid" + capitalize(callbackType); - if (errorElement && !errorElement.dataset[callbackType]) { - errorElement.dataset[callbackType] = "true"; - const observer = new MutationObserver(function (mutations) { - mutations.forEach(function (mutation) { - if (mutation.type === "childList" && mutation.addedNodes.length > 0) { - callback(); - } - }); - }); - observer.observe(errorElement, { childList: true }); - } + return "engrid" + capitalize(callbackType); } // Get the Payment Type static getPaymentType() { diff --git a/packages/scripts/src/engrid.ts b/packages/scripts/src/engrid.ts index 29ea04e3..79fae0d8 100644 --- a/packages/scripts/src/engrid.ts +++ b/packages/scripts/src/engrid.ts @@ -1,5 +1,7 @@ import { Options } from "."; +const errorCallbacks = new Map(); + export abstract class ENGrid { constructor() { if (!ENGrid.enForm) { @@ -492,6 +494,7 @@ export abstract class ENGrid { } else { errorMessageElement.innerHTML = errorMessage; } + errorCallbacks.forEach((callback) => callback()); } } static removeError(element: string | HTMLElement) { @@ -592,8 +595,31 @@ export abstract class ENGrid { const errorElement = document.querySelector( ".en__errorList" ) as HTMLUListElement; + const callbackType = ENGrid.getErrorCallbackKey(callback); + + // Register callback so setError can trigger it too + if (!errorCallbacks.has(callbackType)) { + errorCallbacks.set(callbackType, callback); + } + + if (errorElement && !errorElement.dataset[callbackType]) { + errorElement.dataset[callbackType] = "true"; + + const observer = new MutationObserver(function (mutations) { + mutations.forEach(function (mutation) { + if (mutation.type === "childList" && mutation.addedNodes.length > 0) { + callback(); + } + }); + }); + observer.observe(errorElement, { childList: true }); + } + } + + private static getErrorCallbackKey(callback: Function): string { const capitalize = (word: string) => word.charAt(0).toUpperCase() + word.slice(1); + // Avoid duplicate callbacks let callbackType = callback.toString(); if (callbackType.indexOf("function") === 0) { @@ -606,19 +632,7 @@ export abstract class ENGrid { callbackType = callbackType.replace(/[^a-zA-Z0-9]/g, ""); // Limit to 20 characters and add prefix callbackType = callbackType.substring(0, 20); - callbackType = "engrid" + capitalize(callbackType); - if (errorElement && !errorElement.dataset[callbackType]) { - errorElement.dataset[callbackType] = "true"; - - const observer = new MutationObserver(function (mutations) { - mutations.forEach(function (mutation) { - if (mutation.type === "childList" && mutation.addedNodes.length > 0) { - callback(); - } - }); - }); - observer.observe(errorElement, { childList: true }); - } + return "engrid" + capitalize(callbackType); } // Get the Payment Type static getPaymentType(): string {