From 0971adb8a6ab977ec97c18a16645dd93d11e975c Mon Sep 17 00:00:00 2001 From: npgiano Date: Mon, 9 Mar 2026 15:04:59 -0400 Subject: [PATCH 1/7] Option to supress gift related events to dataLayer when on eCard pages --- packages/scripts/dist/data-layer.d.ts | 1 + packages/scripts/dist/data-layer.js | 25 +++++++++++++++++- packages/scripts/dist/interfaces/options.d.ts | 1 + packages/scripts/dist/interfaces/options.js | 1 + packages/scripts/src/data-layer.ts | 26 ++++++++++++++++++- packages/scripts/src/interfaces/options.ts | 2 ++ 6 files changed, 54 insertions(+), 2 deletions(-) diff --git a/packages/scripts/dist/data-layer.d.ts b/packages/scripts/dist/data-layer.d.ts index 6bf15c09..0d814dbb 100644 --- a/packages/scripts/dist/data-layer.d.ts +++ b/packages/scripts/dist/data-layer.d.ts @@ -5,6 +5,7 @@ export declare class DataLayer { private static instance; private encoder; private endOfGiftProcessStorageKey; + private giftFields; private excludedFields; private hashedFields; private retainedEmailField; diff --git a/packages/scripts/dist/data-layer.js b/packages/scripts/dist/data-layer.js index 05f6b705..dd17c5e4 100644 --- a/packages/scripts/dist/data-layer.js +++ b/packages/scripts/dist/data-layer.js @@ -24,6 +24,19 @@ export class DataLayer { this._form = EnForm.getInstance(); this.encoder = new TextEncoder(); this.endOfGiftProcessStorageKey = "ENGRID_END_OF_GIFT_PROCESS_EVENTS"; + // pageJson entries related to the gift process + this.giftFields = [ + "amount", + "currency", + "donationLogId", + "feeCover", + "giftProcess", + "paymentType", + "receiptNumber", + "recurring", + "transactionId", + "transactionType" + ]; this.excludedFields = [ // Credit Card "transaction.ccnumber", @@ -103,11 +116,21 @@ export class DataLayer { // Collect all data layer variables to push at once const dataLayerData = {}; if (ENGrid.getGiftProcess()) { + // EN will chain together gift process data on the page json when redirecting from a completed donation to an ecard. + // Since the ecard page can be embedded on the thank you page of a donation, this can cause confusion in the data layer with events + // firing for both the donation and the ecard on the same page. + if (ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SupressPurchaseEcard")) { + this.logger.log("⛔ Gift process was detected BUT supressing EN_SUCCESSFUL_DONATIO event due to SupressPurchaseEcard option enabled"); + return; + } this.logger.log("EN_SUCCESSFUL_DONATION"); this.addEndOfGiftProcessEventsToDataLayer(); } if (window.pageJson) { - const pageJson = window.pageJson; + let pageJson = window.pageJson; + if (ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SupressPurchaseEcard")) { + pageJson = pageJson.filter((entry) => !this.giftFields.includes(entry.key)); + } for (const property in pageJson) { const key = `EN_PAGEJSON_${property.toUpperCase()}`; const value = pageJson[property]; diff --git a/packages/scripts/dist/interfaces/options.d.ts b/packages/scripts/dist/interfaces/options.d.ts index 598f98b6..e702779a 100644 --- a/packages/scripts/dist/interfaces/options.d.ts +++ b/packages/scripts/dist/interfaces/options.d.ts @@ -18,6 +18,7 @@ export interface Options { UseAmountValidatorFromEN?: boolean; SkipToMainContentLink?: boolean; SrcDefer?: boolean; + SupressPurchaseEcard?: boolean; NeverBounceAPI?: string | null; NeverBounceDateField?: string | null; NeverBounceDateFormat?: string; diff --git a/packages/scripts/dist/interfaces/options.js b/packages/scripts/dist/interfaces/options.js index a9672ba2..b114315a 100644 --- a/packages/scripts/dist/interfaces/options.js +++ b/packages/scripts/dist/interfaces/options.js @@ -17,6 +17,7 @@ export const OptionsDefaults = { UseAmountValidatorFromEN: false, SkipToMainContentLink: true, SrcDefer: true, + SupressPurchaseEcard: false, NeverBounceAPI: null, NeverBounceDateField: null, NeverBounceStatusField: null, diff --git a/packages/scripts/src/data-layer.ts b/packages/scripts/src/data-layer.ts index 5834fca1..e90e8c78 100644 --- a/packages/scripts/src/data-layer.ts +++ b/packages/scripts/src/data-layer.ts @@ -23,6 +23,20 @@ export class DataLayer { private encoder = new TextEncoder(); private endOfGiftProcessStorageKey = "ENGRID_END_OF_GIFT_PROCESS_EVENTS"; + // pageJson entries related to the gift process + private giftFields = [ + "amount", + "currency", + "donationLogId", + "feeCover", + "giftProcess", + "paymentType", + "receiptNumber", + "recurring", + "transactionId", + "transactionType" + ] + private excludedFields = [ // Credit Card "transaction.ccnumber", @@ -113,12 +127,22 @@ export class DataLayer { const dataLayerData: { [key: string]: any } = {}; if (ENGrid.getGiftProcess()) { + // EN will chain together gift process data on the page json when redirecting from a completed donation to an ecard. + // Since the ecard page can be embedded on the thank you page of a donation, this can cause confusion in the data layer with events + // firing for both the donation and the ecard on the same page. + if(ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SupressPurchaseEcard")) { + this.logger.log("⛔ Gift process was detected BUT supressing EN_SUCCESSFUL_DONATIO event due to SupressPurchaseEcard option enabled"); + return; + } this.logger.log("EN_SUCCESSFUL_DONATION"); this.addEndOfGiftProcessEventsToDataLayer(); } if (window.pageJson) { - const pageJson = window.pageJson as Record; + let pageJson = window.pageJson as Record; + if(ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SupressPurchaseEcard")) { + pageJson = pageJson.filter((entry: Record) => !this.giftFields.includes(entry.key)); + } for (const property in pageJson) { const key = `EN_PAGEJSON_${property.toUpperCase()}`; const value = pageJson[property]; diff --git a/packages/scripts/src/interfaces/options.ts b/packages/scripts/src/interfaces/options.ts index 29ba2284..d8ae56dc 100644 --- a/packages/scripts/src/interfaces/options.ts +++ b/packages/scripts/src/interfaces/options.ts @@ -18,6 +18,7 @@ export interface Options { UseAmountValidatorFromEN?: boolean; SkipToMainContentLink?: boolean; SrcDefer?: boolean; + SupressPurchaseEcard?: boolean; NeverBounceAPI?: string | null; NeverBounceDateField?: string | null; NeverBounceDateFormat?: string; @@ -208,6 +209,7 @@ export const OptionsDefaults: Options = { UseAmountValidatorFromEN: false, SkipToMainContentLink: true, SrcDefer: true, + SupressPurchaseEcard: false, NeverBounceAPI: null, NeverBounceDateField: null, NeverBounceStatusField: null, From 02883eb3fa4759b68b9d38c142f78a3db96163be Mon Sep 17 00:00:00 2001 From: npgiano Date: Mon, 9 Mar 2026 15:12:02 -0400 Subject: [PATCH 2/7] Spelling error --- packages/scripts/src/data-layer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scripts/src/data-layer.ts b/packages/scripts/src/data-layer.ts index e90e8c78..0b75a4db 100644 --- a/packages/scripts/src/data-layer.ts +++ b/packages/scripts/src/data-layer.ts @@ -131,7 +131,7 @@ export class DataLayer { // Since the ecard page can be embedded on the thank you page of a donation, this can cause confusion in the data layer with events // firing for both the donation and the ecard on the same page. if(ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SupressPurchaseEcard")) { - this.logger.log("⛔ Gift process was detected BUT supressing EN_SUCCESSFUL_DONATIO event due to SupressPurchaseEcard option enabled"); + this.logger.log("⛔ Gift process was detected BUT supressing EN_SUCCESSFUL_DONATION event due to SupressPurchaseEcard option enabled"); return; } this.logger.log("EN_SUCCESSFUL_DONATION"); From e57e4a5699b01a49a855f4a44bc1f770654c0c17 Mon Sep 17 00:00:00 2001 From: npgiano Date: Mon, 9 Mar 2026 15:17:18 -0400 Subject: [PATCH 3/7] Real Spelling Error --- packages/scripts/dist/data-layer.js | 6 +++--- packages/scripts/dist/interfaces/options.d.ts | 2 +- packages/scripts/dist/interfaces/options.js | 2 +- packages/scripts/src/data-layer.ts | 6 +++--- packages/scripts/src/interfaces/options.ts | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/scripts/dist/data-layer.js b/packages/scripts/dist/data-layer.js index dd17c5e4..9d228138 100644 --- a/packages/scripts/dist/data-layer.js +++ b/packages/scripts/dist/data-layer.js @@ -119,8 +119,8 @@ export class DataLayer { // EN will chain together gift process data on the page json when redirecting from a completed donation to an ecard. // Since the ecard page can be embedded on the thank you page of a donation, this can cause confusion in the data layer with events // firing for both the donation and the ecard on the same page. - if (ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SupressPurchaseEcard")) { - this.logger.log("⛔ Gift process was detected BUT supressing EN_SUCCESSFUL_DONATIO event due to SupressPurchaseEcard option enabled"); + if (ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard")) { + this.logger.log("⛔ Gift process was detected BUT suppressing EN_SUCCESSFUL_DONATION event due to SuppressPurchaseEcard option enabled"); return; } this.logger.log("EN_SUCCESSFUL_DONATION"); @@ -128,7 +128,7 @@ export class DataLayer { } if (window.pageJson) { let pageJson = window.pageJson; - if (ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SupressPurchaseEcard")) { + if (ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard")) { pageJson = pageJson.filter((entry) => !this.giftFields.includes(entry.key)); } for (const property in pageJson) { diff --git a/packages/scripts/dist/interfaces/options.d.ts b/packages/scripts/dist/interfaces/options.d.ts index e702779a..ddbb0aac 100644 --- a/packages/scripts/dist/interfaces/options.d.ts +++ b/packages/scripts/dist/interfaces/options.d.ts @@ -18,7 +18,7 @@ export interface Options { UseAmountValidatorFromEN?: boolean; SkipToMainContentLink?: boolean; SrcDefer?: boolean; - SupressPurchaseEcard?: boolean; + SuppressPurchaseEcard?: boolean; NeverBounceAPI?: string | null; NeverBounceDateField?: string | null; NeverBounceDateFormat?: string; diff --git a/packages/scripts/dist/interfaces/options.js b/packages/scripts/dist/interfaces/options.js index b114315a..17ed8faf 100644 --- a/packages/scripts/dist/interfaces/options.js +++ b/packages/scripts/dist/interfaces/options.js @@ -17,7 +17,7 @@ export const OptionsDefaults = { UseAmountValidatorFromEN: false, SkipToMainContentLink: true, SrcDefer: true, - SupressPurchaseEcard: false, + SuppressPurchaseEcard: false, NeverBounceAPI: null, NeverBounceDateField: null, NeverBounceStatusField: null, diff --git a/packages/scripts/src/data-layer.ts b/packages/scripts/src/data-layer.ts index 0b75a4db..ae25d93b 100644 --- a/packages/scripts/src/data-layer.ts +++ b/packages/scripts/src/data-layer.ts @@ -130,8 +130,8 @@ export class DataLayer { // EN will chain together gift process data on the page json when redirecting from a completed donation to an ecard. // Since the ecard page can be embedded on the thank you page of a donation, this can cause confusion in the data layer with events // firing for both the donation and the ecard on the same page. - if(ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SupressPurchaseEcard")) { - this.logger.log("⛔ Gift process was detected BUT supressing EN_SUCCESSFUL_DONATION event due to SupressPurchaseEcard option enabled"); + if(ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard")) { + this.logger.log("⛔ Gift process was detected BUT suppressing EN_SUCCESSFUL_DONATION event due to SuppressPurchaseEcard option enabled"); return; } this.logger.log("EN_SUCCESSFUL_DONATION"); @@ -140,7 +140,7 @@ export class DataLayer { if (window.pageJson) { let pageJson = window.pageJson as Record; - if(ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SupressPurchaseEcard")) { + if(ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard")) { pageJson = pageJson.filter((entry: Record) => !this.giftFields.includes(entry.key)); } for (const property in pageJson) { diff --git a/packages/scripts/src/interfaces/options.ts b/packages/scripts/src/interfaces/options.ts index d8ae56dc..5d3c86af 100644 --- a/packages/scripts/src/interfaces/options.ts +++ b/packages/scripts/src/interfaces/options.ts @@ -18,7 +18,7 @@ export interface Options { UseAmountValidatorFromEN?: boolean; SkipToMainContentLink?: boolean; SrcDefer?: boolean; - SupressPurchaseEcard?: boolean; + SuppressPurchaseEcard?: boolean; NeverBounceAPI?: string | null; NeverBounceDateField?: string | null; NeverBounceDateFormat?: string; @@ -209,7 +209,7 @@ export const OptionsDefaults: Options = { UseAmountValidatorFromEN: false, SkipToMainContentLink: true, SrcDefer: true, - SupressPurchaseEcard: false, + SuppressPurchaseEcard: false, NeverBounceAPI: null, NeverBounceDateField: null, NeverBounceStatusField: null, From 16aeec66f142b1e0c6f634bdcf71b08fb9447891 Mon Sep 17 00:00:00 2001 From: npgiano Date: Mon, 9 Mar 2026 15:20:32 -0400 Subject: [PATCH 4/7] Allow remainder of onLoad to run if suppress is hit --- packages/scripts/dist/data-layer.js | 7 ++++--- packages/scripts/src/data-layer.ts | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/scripts/dist/data-layer.js b/packages/scripts/dist/data-layer.js index 9d228138..26bd26a9 100644 --- a/packages/scripts/dist/data-layer.js +++ b/packages/scripts/dist/data-layer.js @@ -121,10 +121,11 @@ export class DataLayer { // firing for both the donation and the ecard on the same page. if (ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard")) { this.logger.log("⛔ Gift process was detected BUT suppressing EN_SUCCESSFUL_DONATION event due to SuppressPurchaseEcard option enabled"); - return; } - this.logger.log("EN_SUCCESSFUL_DONATION"); - this.addEndOfGiftProcessEventsToDataLayer(); + else { + this.logger.log("EN_SUCCESSFUL_DONATION"); + this.addEndOfGiftProcessEventsToDataLayer(); + } } if (window.pageJson) { let pageJson = window.pageJson; diff --git a/packages/scripts/src/data-layer.ts b/packages/scripts/src/data-layer.ts index ae25d93b..b87a2ec2 100644 --- a/packages/scripts/src/data-layer.ts +++ b/packages/scripts/src/data-layer.ts @@ -132,10 +132,10 @@ export class DataLayer { // firing for both the donation and the ecard on the same page. if(ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard")) { this.logger.log("⛔ Gift process was detected BUT suppressing EN_SUCCESSFUL_DONATION event due to SuppressPurchaseEcard option enabled"); - return; + } else { + this.logger.log("EN_SUCCESSFUL_DONATION"); + this.addEndOfGiftProcessEventsToDataLayer(); } - this.logger.log("EN_SUCCESSFUL_DONATION"); - this.addEndOfGiftProcessEventsToDataLayer(); } if (window.pageJson) { From d6a384dbfd7ffcb3b6aebd50b953ad8c96dd8ed2 Mon Sep 17 00:00:00 2001 From: npgiano Date: Mon, 9 Mar 2026 15:54:31 -0400 Subject: [PATCH 5/7] Fix per-property filtering --- packages/scripts/dist/data-layer.js | 6 +++--- packages/scripts/src/data-layer.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/scripts/dist/data-layer.js b/packages/scripts/dist/data-layer.js index 26bd26a9..a673f501 100644 --- a/packages/scripts/dist/data-layer.js +++ b/packages/scripts/dist/data-layer.js @@ -129,10 +129,10 @@ export class DataLayer { } if (window.pageJson) { let pageJson = window.pageJson; - if (ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard")) { - pageJson = pageJson.filter((entry) => !this.giftFields.includes(entry.key)); - } for (const property in pageJson) { + if (ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard") && this.giftFields.includes(property)) { + continue; + } const key = `EN_PAGEJSON_${property.toUpperCase()}`; const value = pageJson[property]; dataLayerData[key] = this.transformJSON(value); diff --git a/packages/scripts/src/data-layer.ts b/packages/scripts/src/data-layer.ts index b87a2ec2..b6fbd4b1 100644 --- a/packages/scripts/src/data-layer.ts +++ b/packages/scripts/src/data-layer.ts @@ -140,10 +140,10 @@ export class DataLayer { if (window.pageJson) { let pageJson = window.pageJson as Record; - if(ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard")) { - pageJson = pageJson.filter((entry: Record) => !this.giftFields.includes(entry.key)); - } for (const property in pageJson) { + if(ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard") && this.giftFields.includes(property) ) { + continue; + } const key = `EN_PAGEJSON_${property.toUpperCase()}`; const value = pageJson[property]; dataLayerData[key] = this.transformJSON(value); From e786b6cae17cf0aea671b6259521ca41c14ce572 Mon Sep 17 00:00:00 2001 From: Fernando Santos Date: Thu, 19 Mar 2026 18:32:31 -0300 Subject: [PATCH 6/7] Consolidate ECARD suppression in DataLayer --- packages/scripts/src/data-layer.ts | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/scripts/src/data-layer.ts b/packages/scripts/src/data-layer.ts index b6fbd4b1..d940bcc8 100644 --- a/packages/scripts/src/data-layer.ts +++ b/packages/scripts/src/data-layer.ts @@ -34,8 +34,8 @@ export class DataLayer { "receiptNumber", "recurring", "transactionId", - "transactionType" - ] + "transactionType", + ]; private excludedFields = [ // Credit Card @@ -125,13 +125,19 @@ export class DataLayer { private onLoad() { // Collect all data layer variables to push at once const dataLayerData: { [key: string]: any } = {}; + const suppressEcardData = + ENGrid.getPageType() === "ECARD" && + ENGrid.getOption("SuppressPurchaseEcard"); if (ENGrid.getGiftProcess()) { // EN will chain together gift process data on the page json when redirecting from a completed donation to an ecard. - // Since the ecard page can be embedded on the thank you page of a donation, this can cause confusion in the data layer with events + // Since the ecard page can be embedded on the thank you page of a donation, this can cause confusion in the data layer with events // firing for both the donation and the ecard on the same page. - if(ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard")) { - this.logger.log("⛔ Gift process was detected BUT suppressing EN_SUCCESSFUL_DONATION event due to SuppressPurchaseEcard option enabled"); + if (suppressEcardData) { + this.logger.log( + "⛔ Gift process was detected BUT suppressing EN_SUCCESSFUL_DONATION event due to SuppressPurchaseEcard option enabled" + ); + window.sessionStorage.removeItem(this.endOfGiftProcessStorageKey); } else { this.logger.log("EN_SUCCESSFUL_DONATION"); this.addEndOfGiftProcessEventsToDataLayer(); @@ -139,9 +145,9 @@ export class DataLayer { } if (window.pageJson) { - let pageJson = window.pageJson as Record; + const pageJson = window.pageJson as Record; for (const property in pageJson) { - if(ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard") && this.giftFields.includes(property) ) { + if (suppressEcardData && this.giftFields.includes(property)) { continue; } const key = `EN_PAGEJSON_${property.toUpperCase()}`; From b01c8a50d0c02d200d1af9c5d367b48ae621d160 Mon Sep 17 00:00:00 2001 From: Fernando Santos Date: Thu, 19 Mar 2026 18:33:27 -0300 Subject: [PATCH 7/7] Consolidate ECARD suppression in DataLayer (asset) --- packages/scripts/dist/data-layer.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/scripts/dist/data-layer.js b/packages/scripts/dist/data-layer.js index a673f501..9a31766b 100644 --- a/packages/scripts/dist/data-layer.js +++ b/packages/scripts/dist/data-layer.js @@ -35,7 +35,7 @@ export class DataLayer { "receiptNumber", "recurring", "transactionId", - "transactionType" + "transactionType", ]; this.excludedFields = [ // Credit Card @@ -115,12 +115,15 @@ export class DataLayer { onLoad() { // Collect all data layer variables to push at once const dataLayerData = {}; + const suppressEcardData = ENGrid.getPageType() === "ECARD" && + ENGrid.getOption("SuppressPurchaseEcard"); if (ENGrid.getGiftProcess()) { // EN will chain together gift process data on the page json when redirecting from a completed donation to an ecard. - // Since the ecard page can be embedded on the thank you page of a donation, this can cause confusion in the data layer with events + // Since the ecard page can be embedded on the thank you page of a donation, this can cause confusion in the data layer with events // firing for both the donation and the ecard on the same page. - if (ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard")) { + if (suppressEcardData) { this.logger.log("⛔ Gift process was detected BUT suppressing EN_SUCCESSFUL_DONATION event due to SuppressPurchaseEcard option enabled"); + window.sessionStorage.removeItem(this.endOfGiftProcessStorageKey); } else { this.logger.log("EN_SUCCESSFUL_DONATION"); @@ -128,9 +131,9 @@ export class DataLayer { } } if (window.pageJson) { - let pageJson = window.pageJson; + const pageJson = window.pageJson; for (const property in pageJson) { - if (ENGrid.getPageType() === "ECARD" && ENGrid.getOption("SuppressPurchaseEcard") && this.giftFields.includes(property)) { + if (suppressEcardData && this.giftFields.includes(property)) { continue; } const key = `EN_PAGEJSON_${property.toUpperCase()}`;