@4site/engrid-scripts 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/.prettierrc.js +226 -0
  2. package/LICENSE +24 -0
  3. package/dist/a11y.d.ts +6 -0
  4. package/dist/a11y.js +46 -0
  5. package/dist/add-name-to-message.d.ts +5 -0
  6. package/dist/add-name-to-message.js +49 -0
  7. package/dist/advocacy.d.ts +7 -0
  8. package/dist/advocacy.js +34 -0
  9. package/dist/amount-label.d.ts +6 -0
  10. package/dist/amount-label.js +29 -0
  11. package/dist/app.d.ts +19 -0
  12. package/dist/app.js +340 -0
  13. package/dist/apple-pay.d.ts +13 -0
  14. package/dist/apple-pay.js +169 -0
  15. package/dist/auto-country-select.d.ts +10 -0
  16. package/dist/auto-country-select.js +63 -0
  17. package/dist/auto-year.d.ts +7 -0
  18. package/dist/auto-year.js +35 -0
  19. package/dist/autocomplete.d.ts +5 -0
  20. package/dist/autocomplete.js +38 -0
  21. package/dist/autosubmit.d.ts +5 -0
  22. package/dist/autosubmit.js +14 -0
  23. package/dist/branding-html.d.ts +14 -0
  24. package/dist/branding-html.js +70 -0
  25. package/dist/capitalize-fields.d.ts +7 -0
  26. package/dist/capitalize-fields.js +22 -0
  27. package/dist/click-to-expand.d.ts +4 -0
  28. package/dist/click-to-expand.js +39 -0
  29. package/dist/cookie.d.ts +53 -0
  30. package/dist/cookie.js +76 -0
  31. package/dist/country-disable.d.ts +4 -0
  32. package/dist/country-disable.js +22 -0
  33. package/dist/country-redirect.d.ts +7 -0
  34. package/dist/country-redirect.js +61 -0
  35. package/dist/custom-currency.d.ts +9 -0
  36. package/dist/custom-currency.js +112 -0
  37. package/dist/data-attributes.d.ts +5 -0
  38. package/dist/data-attributes.js +122 -0
  39. package/dist/data-hide.d.ts +15 -0
  40. package/dist/data-hide.js +66 -0
  41. package/dist/data-layer.d.ts +23 -0
  42. package/dist/data-layer.js +312 -0
  43. package/dist/data-replace.d.ts +26 -0
  44. package/dist/data-replace.js +76 -0
  45. package/dist/debug-hidden-fields.d.ts +4 -0
  46. package/dist/debug-hidden-fields.js +42 -0
  47. package/dist/debug-panel.d.ts +27 -0
  48. package/dist/debug-panel.js +508 -0
  49. package/dist/deprecated.d.ts +5 -0
  50. package/dist/deprecated.js +40 -0
  51. package/dist/digital-wallets.d.ts +8 -0
  52. package/dist/digital-wallets.js +143 -0
  53. package/dist/ecard-to-target.d.ts +11 -0
  54. package/dist/ecard-to-target.js +73 -0
  55. package/dist/ecard.d.ts +8 -0
  56. package/dist/ecard.js +61 -0
  57. package/dist/embedded-ecard.d.ts +18 -0
  58. package/dist/embedded-ecard.js +267 -0
  59. package/dist/en-validators.d.ts +10 -0
  60. package/dist/en-validators.js +89 -0
  61. package/dist/engrid.d.ts +49 -0
  62. package/dist/engrid.js +547 -0
  63. package/dist/event-tickets.d.ts +3 -0
  64. package/dist/event-tickets.js +24 -0
  65. package/dist/events/country.d.ts +12 -0
  66. package/dist/events/country.js +42 -0
  67. package/dist/events/donation-amount.d.ts +16 -0
  68. package/dist/events/donation-amount.js +119 -0
  69. package/dist/events/donation-frequency.d.ts +17 -0
  70. package/dist/events/donation-frequency.js +115 -0
  71. package/dist/events/en-form.d.ts +20 -0
  72. package/dist/events/en-form.js +52 -0
  73. package/dist/events/index.d.ts +6 -0
  74. package/dist/events/index.js +6 -0
  75. package/dist/events/processing-fees.d.ts +20 -0
  76. package/dist/events/processing-fees.js +92 -0
  77. package/dist/events/remember-me-events.d.ts +18 -0
  78. package/dist/events/remember-me-events.js +36 -0
  79. package/dist/exit-intent-lightbox.d.ts +14 -0
  80. package/dist/exit-intent-lightbox.js +145 -0
  81. package/dist/expand-region-name.d.ts +7 -0
  82. package/dist/expand-region-name.js +44 -0
  83. package/dist/fast-form-fill.d.ts +8 -0
  84. package/dist/fast-form-fill.js +75 -0
  85. package/dist/freshaddress.d.ts +18 -0
  86. package/dist/freshaddress.js +204 -0
  87. package/dist/give-by-select.d.ts +9 -0
  88. package/dist/give-by-select.js +82 -0
  89. package/dist/iframe.d.ts +16 -0
  90. package/dist/iframe.js +217 -0
  91. package/dist/index.d.ts +82 -0
  92. package/dist/index.js +84 -0
  93. package/dist/input-has-value-and-focus.d.ts +9 -0
  94. package/dist/input-has-value-and-focus.js +50 -0
  95. package/dist/input-placeholders.d.ts +7 -0
  96. package/dist/input-placeholders.js +82 -0
  97. package/dist/interfaces/ecard-to-target-options.d.ts +9 -0
  98. package/dist/interfaces/ecard-to-target-options.js +8 -0
  99. package/dist/interfaces/embedded-ecard-options.d.ts +8 -0
  100. package/dist/interfaces/embedded-ecard-options.js +7 -0
  101. package/dist/interfaces/exit-intent-options.d.ts +13 -0
  102. package/dist/interfaces/exit-intent-options.js +13 -0
  103. package/dist/interfaces/options.d.ts +147 -0
  104. package/dist/interfaces/options.js +50 -0
  105. package/dist/interfaces/translate-options.d.ts +7 -0
  106. package/dist/interfaces/translate-options.js +42 -0
  107. package/dist/interfaces/upsell-options.d.ts +24 -0
  108. package/dist/interfaces/upsell-options.js +33 -0
  109. package/dist/live-currency.d.ts +15 -0
  110. package/dist/live-currency.js +140 -0
  111. package/dist/live-frequency.d.ts +13 -0
  112. package/dist/live-frequency.js +109 -0
  113. package/dist/live-variables.d.ts +21 -0
  114. package/dist/live-variables.js +147 -0
  115. package/dist/loader.d.ts +10 -0
  116. package/dist/loader.js +175 -0
  117. package/dist/logger.d.ts +16 -0
  118. package/dist/logger.js +84 -0
  119. package/dist/media-attribution.d.ts +4 -0
  120. package/dist/media-attribution.js +66 -0
  121. package/dist/menu.d.ts +0 -0
  122. package/dist/menu.js +1 -0
  123. package/dist/min-max-amount.d.ts +13 -0
  124. package/dist/min-max-amount.js +71 -0
  125. package/dist/mobile-cta.d.ts +9 -0
  126. package/dist/mobile-cta.js +71 -0
  127. package/dist/modal.d.ts +19 -0
  128. package/dist/modal.js +129 -0
  129. package/dist/neverbounce.d.ts +23 -0
  130. package/dist/neverbounce.js +244 -0
  131. package/dist/other-amount.d.ts +6 -0
  132. package/dist/other-amount.js +70 -0
  133. package/dist/page-background.d.ts +7 -0
  134. package/dist/page-background.js +55 -0
  135. package/dist/plaid.d.ts +6 -0
  136. package/dist/plaid.js +49 -0
  137. package/dist/postal-code-validator.d.ts +20 -0
  138. package/dist/postal-code-validator.js +118 -0
  139. package/dist/premium-gift.d.ts +10 -0
  140. package/dist/premium-gift.js +115 -0
  141. package/dist/progress-bar.d.ts +3 -0
  142. package/dist/progress-bar.js +40 -0
  143. package/dist/remember-me.d.ts +61 -0
  144. package/dist/remember-me.js +358 -0
  145. package/dist/required-if-visible.d.ts +8 -0
  146. package/dist/required-if-visible.js +60 -0
  147. package/dist/set-attr.d.ts +4 -0
  148. package/dist/set-attr.js +31 -0
  149. package/dist/set-recurr-freq.d.ts +7 -0
  150. package/dist/set-recurr-freq.js +70 -0
  151. package/dist/show-hide-radio-checkboxes.d.ts +13 -0
  152. package/dist/show-hide-radio-checkboxes.js +161 -0
  153. package/dist/show-if-amount.d.ts +15 -0
  154. package/dist/show-if-amount.js +117 -0
  155. package/dist/show-if-present.d.ts +7 -0
  156. package/dist/show-if-present.js +79 -0
  157. package/dist/skip-link.d.ts +4 -0
  158. package/dist/skip-link.js +36 -0
  159. package/dist/src-defer.d.ts +6 -0
  160. package/dist/src-defer.js +70 -0
  161. package/dist/supporter-hub.d.ts +9 -0
  162. package/dist/supporter-hub.js +75 -0
  163. package/dist/swap-amounts.d.ts +45 -0
  164. package/dist/swap-amounts.js +81 -0
  165. package/dist/thank-you-page-conditional-content.d.ts +8 -0
  166. package/dist/thank-you-page-conditional-content.js +46 -0
  167. package/dist/ticker.d.ts +11 -0
  168. package/dist/ticker.js +66 -0
  169. package/dist/tidycontact.d.ts +46 -0
  170. package/dist/tidycontact.js +1202 -0
  171. package/dist/translate-fields.d.ts +12 -0
  172. package/dist/translate-fields.js +548 -0
  173. package/dist/universal-opt-in.d.ts +7 -0
  174. package/dist/universal-opt-in.js +91 -0
  175. package/dist/upsell-lightbox.d.ts +31 -0
  176. package/dist/upsell-lightbox.js +363 -0
  177. package/dist/url-params-to-body-attrs.d.ts +5 -0
  178. package/dist/url-params-to-body-attrs.js +14 -0
  179. package/dist/url-to-form.d.ts +7 -0
  180. package/dist/url-to-form.js +32 -0
  181. package/dist/us-only-form.d.ts +4 -0
  182. package/dist/us-only-form.js +30 -0
  183. package/dist/version.d.ts +1 -0
  184. package/dist/version.js +1 -0
  185. package/dist/vgs.d.ts +16 -0
  186. package/dist/vgs.js +250 -0
  187. package/dist/welcome-back.d.ts +10 -0
  188. package/dist/welcome-back.js +112 -0
  189. package/package.json +32 -0
@@ -0,0 +1,358 @@
1
+ import * as cookie from "./cookie";
2
+ import { EnForm, RememberMeEvents } from "./events";
3
+ const tippy = require("tippy.js").default;
4
+ export class RememberMe {
5
+ constructor(options) {
6
+ this._form = EnForm.getInstance();
7
+ this._events = RememberMeEvents.getInstance();
8
+ this.iframe = null;
9
+ this.remoteUrl = options.remoteUrl ? options.remoteUrl : null;
10
+ this.cookieName = options.cookieName
11
+ ? options.cookieName
12
+ : "engrid-autofill";
13
+ this.cookieExpirationDays = options.cookieExpirationDays
14
+ ? options.cookieExpirationDays
15
+ : 365;
16
+ this.rememberMeOptIn = options.checked ? options.checked : false;
17
+ this.fieldNames = options.fieldNames ? options.fieldNames : [];
18
+ this.fieldDonationAmountRadioName = options.fieldDonationAmountRadioName
19
+ ? options.fieldDonationAmountRadioName
20
+ : "transaction.donationAmt";
21
+ this.fieldDonationAmountOtherName = options.fieldDonationAmountOtherName
22
+ ? options.fieldDonationAmountOtherName
23
+ : "transaction.donationAmt.other";
24
+ this.fieldDonationRecurrPayRadioName =
25
+ options.fieldDonationRecurrPayRadioName
26
+ ? options.fieldDonationRecurrPayRadioName
27
+ : "transaction.recurrpay";
28
+ this.fieldDonationAmountOtherCheckboxID =
29
+ options.fieldDonationAmountOtherCheckboxID
30
+ ? options.fieldDonationAmountOtherCheckboxID
31
+ : "#en__field_transaction_donationAmt4";
32
+ this.fieldOptInSelectorTarget = options.fieldOptInSelectorTarget
33
+ ? options.fieldOptInSelectorTarget
34
+ : ".en__field--emailAddress.en__field";
35
+ this.fieldOptInSelectorTargetLocation =
36
+ options.fieldOptInSelectorTargetLocation
37
+ ? options.fieldOptInSelectorTargetLocation
38
+ : "after";
39
+ this.fieldClearSelectorTarget = options.fieldClearSelectorTarget
40
+ ? options.fieldClearSelectorTarget
41
+ : 'label[for="en__field_supporter_firstName"]';
42
+ this.fieldClearSelectorTargetLocation =
43
+ options.fieldClearSelectorTargetLocation
44
+ ? options.fieldClearSelectorTargetLocation
45
+ : "before";
46
+ this.fieldData = {};
47
+ if (this.useRemote()) {
48
+ this.createIframe(() => {
49
+ if (this.iframe && this.iframe.contentWindow) {
50
+ this.iframe.contentWindow.postMessage(JSON.stringify({ key: this.cookieName, operation: "read" }), "*");
51
+ this._form.onSubmit.subscribe(() => {
52
+ if (this.rememberMeOptIn) {
53
+ this.readFields();
54
+ this.saveCookieToRemote();
55
+ }
56
+ });
57
+ }
58
+ }, (event) => {
59
+ let data;
60
+ if (event.data &&
61
+ typeof event.data === "string" &&
62
+ this.isJson(event.data)) {
63
+ data = JSON.parse(event.data);
64
+ }
65
+ if (data &&
66
+ data.key &&
67
+ data.value !== undefined &&
68
+ data.key === this.cookieName) {
69
+ this.updateFieldData(data.value);
70
+ this.writeFields();
71
+ let hasFieldData = Object.keys(this.fieldData).length > 0;
72
+ if (!hasFieldData) {
73
+ this.insertRememberMeOptin();
74
+ }
75
+ else {
76
+ this.insertClearRememberMeLink();
77
+ }
78
+ }
79
+ });
80
+ }
81
+ else {
82
+ this.readCookie();
83
+ let hasFieldData = Object.keys(this.fieldData).length > 0;
84
+ if (!hasFieldData) {
85
+ this.insertRememberMeOptin();
86
+ this.rememberMeOptIn = false;
87
+ }
88
+ else {
89
+ this.insertClearRememberMeLink();
90
+ this.rememberMeOptIn = true;
91
+ }
92
+ this.writeFields();
93
+ this._form.onSubmit.subscribe(() => {
94
+ if (this.rememberMeOptIn) {
95
+ this.readFields();
96
+ this.saveCookie();
97
+ }
98
+ });
99
+ }
100
+ }
101
+ updateFieldData(jsonData) {
102
+ if (jsonData) {
103
+ let data = JSON.parse(jsonData);
104
+ for (let i = 0; i < this.fieldNames.length; i++) {
105
+ if (data[this.fieldNames[i]] !== undefined) {
106
+ this.fieldData[this.fieldNames[i]] = decodeURIComponent(data[this.fieldNames[i]]);
107
+ }
108
+ }
109
+ }
110
+ }
111
+ insertClearRememberMeLink() {
112
+ let clearRememberMeField = document.getElementById("clear-autofill-data");
113
+ if (!clearRememberMeField) {
114
+ const clearAutofillLabel = "clear autofill";
115
+ clearRememberMeField = document.createElement("a");
116
+ clearRememberMeField.setAttribute("id", "clear-autofill-data");
117
+ clearRememberMeField.classList.add("label-tooltip");
118
+ clearRememberMeField.setAttribute("style", "cursor: pointer;");
119
+ clearRememberMeField.innerHTML = `(${clearAutofillLabel})`;
120
+ const targetField = this.getElementByFirstSelector(this.fieldClearSelectorTarget);
121
+ if (targetField) {
122
+ if (this.fieldClearSelectorTargetLocation === "after") {
123
+ targetField.appendChild(clearRememberMeField);
124
+ }
125
+ else {
126
+ targetField.prepend(clearRememberMeField);
127
+ }
128
+ }
129
+ }
130
+ clearRememberMeField.addEventListener("click", (e) => {
131
+ e.preventDefault();
132
+ this.clearFields(["supporter.country" /*, 'supporter.emailAddress'*/]);
133
+ if (this.useRemote()) {
134
+ this.clearCookieOnRemote();
135
+ }
136
+ else {
137
+ this.clearCookie();
138
+ }
139
+ let clearAutofillLink = document.getElementById("clear-autofill-data");
140
+ if (clearAutofillLink) {
141
+ clearAutofillLink.style.display = "none";
142
+ }
143
+ this.rememberMeOptIn = false;
144
+ this._events.dispatchClear();
145
+ window.dispatchEvent(new CustomEvent("RememberMe_Cleared"));
146
+ });
147
+ this._events.dispatchLoad(true);
148
+ window.dispatchEvent(new CustomEvent("RememberMe_Loaded", { detail: { withData: true } }));
149
+ }
150
+ getElementByFirstSelector(selectorsString) {
151
+ // iterate through the selectors until we find one that exists
152
+ let targetField = null;
153
+ const selectorTargets = selectorsString.split(",");
154
+ for (let i = 0; i < selectorTargets.length; i++) {
155
+ targetField = document.querySelector(selectorTargets[i]);
156
+ if (targetField) {
157
+ break;
158
+ }
159
+ }
160
+ return targetField;
161
+ }
162
+ insertRememberMeOptin() {
163
+ let rememberMeOptInField = document.getElementById("remember-me-opt-in");
164
+ if (!rememberMeOptInField) {
165
+ const rememberMeLabel = "Remember Me";
166
+ const rememberMeInfo = `
167
+ Check “Remember me” to complete forms on this device faster.
168
+ While your financial information won’t be stored, you should only check this box from a personal device.
169
+ Click “Clear autofill” to remove the information from your device at any time.
170
+ `;
171
+ const rememberMeOptInFieldChecked = this.rememberMeOptIn ? "checked" : "";
172
+ const rememberMeOptInField = document.createElement("div");
173
+ rememberMeOptInField.classList.add("en__field", "en__field--checkbox", "en__field--question", "rememberme-wrapper");
174
+ rememberMeOptInField.setAttribute("id", "remember-me-opt-in");
175
+ rememberMeOptInField.setAttribute("style", "overflow-x: hidden;");
176
+ rememberMeOptInField.innerHTML = `
177
+ <div class="en__field__element en__field__element--checkbox">
178
+ <div class="en__field__item">
179
+ <input id="remember-me-checkbox" type="checkbox" class="en__field__input en__field__input--checkbox" ${rememberMeOptInFieldChecked} />
180
+ <label for="remember-me-checkbox" class="en__field__label en__field__label--item" style="white-space: nowrap;">
181
+ <div class="rememberme-content" style="display: inline-flex; align-items: center;">
182
+ ${rememberMeLabel}
183
+ <a id="rememberme-learn-more-toggle" style="display: inline-block; display: inline-flex; align-items: center; cursor: pointer; margin-left: 10px; margin-top: var(--rememberme-learn-more-toggle_margin-top)">
184
+ <svg style="height: 14px; width: auto; z-index: 1;" width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11 7H9V5H11V7ZM11 9H9V15H11V9ZM10 2C5.59 2 2 5.59 2 10C2 14.41 5.59 18 10 18C14.41 18 18 14.41 18 10C18 5.59 14.41 2 10 2ZM10 0C15.523 0 20 4.477 20 10C20 15.523 15.523 20 10 20C4.477 20 0 15.523 0 10C0 4.477 4.477 0 10 0Z" fill="currentColor"/></svg>
185
+ </a>
186
+ </div>
187
+ </label>
188
+ </div>
189
+ </div>
190
+ `;
191
+ const targetField = this.getElementByFirstSelector(this.fieldOptInSelectorTarget);
192
+ if (targetField && targetField.parentNode) {
193
+ targetField.parentNode.insertBefore(rememberMeOptInField, this.fieldOptInSelectorTargetLocation == "before"
194
+ ? targetField
195
+ : targetField.nextSibling);
196
+ const rememberMeCheckbox = document.getElementById("remember-me-checkbox");
197
+ if (rememberMeCheckbox) {
198
+ rememberMeCheckbox.addEventListener("change", () => {
199
+ if (rememberMeCheckbox.checked) {
200
+ this.rememberMeOptIn = true;
201
+ }
202
+ else {
203
+ this.rememberMeOptIn = false;
204
+ }
205
+ });
206
+ }
207
+ tippy("#rememberme-learn-more-toggle", { content: rememberMeInfo });
208
+ }
209
+ }
210
+ else if (this.rememberMeOptIn) {
211
+ rememberMeOptInField.checked = true;
212
+ }
213
+ this._events.dispatchLoad(false);
214
+ window.dispatchEvent(new CustomEvent("RememberMe_Loaded", { detail: { withData: false } }));
215
+ }
216
+ useRemote() {
217
+ return (!!this.remoteUrl &&
218
+ typeof window.postMessage === "function" &&
219
+ window.JSON &&
220
+ window.localStorage);
221
+ }
222
+ createIframe(iframeLoaded, messageReceived) {
223
+ if (this.remoteUrl) {
224
+ let iframe = document.createElement("iframe");
225
+ iframe.style.cssText =
226
+ "position:absolute;width:1px;height:1px;left:-9999px;";
227
+ iframe.src = this.remoteUrl;
228
+ iframe.setAttribute("sandbox", "allow-same-origin allow-scripts");
229
+ this.iframe = iframe;
230
+ document.body.appendChild(this.iframe);
231
+ this.iframe.addEventListener("load", () => iframeLoaded(), false);
232
+ window.addEventListener("message", (event) => {
233
+ var _a;
234
+ if (((_a = this.iframe) === null || _a === void 0 ? void 0 : _a.contentWindow) === event.source) {
235
+ messageReceived(event);
236
+ }
237
+ }, false);
238
+ }
239
+ }
240
+ clearCookie() {
241
+ this.fieldData = {};
242
+ this.saveCookie();
243
+ }
244
+ clearCookieOnRemote() {
245
+ this.fieldData = {};
246
+ this.saveCookieToRemote();
247
+ }
248
+ saveCookieToRemote() {
249
+ if (this.iframe && this.iframe.contentWindow) {
250
+ this.iframe.contentWindow.postMessage(JSON.stringify({
251
+ key: this.cookieName,
252
+ value: this.fieldData,
253
+ operation: "write",
254
+ expires: this.cookieExpirationDays,
255
+ }), "*");
256
+ }
257
+ }
258
+ readCookie() {
259
+ this.updateFieldData(cookie.get(this.cookieName) || "");
260
+ }
261
+ saveCookie() {
262
+ cookie.set(this.cookieName, JSON.stringify(this.fieldData), {
263
+ expires: this.cookieExpirationDays,
264
+ });
265
+ }
266
+ readFields() {
267
+ for (let i = 0; i < this.fieldNames.length; i++) {
268
+ let fieldSelector = "[name='" + this.fieldNames[i] + "']";
269
+ let field = document.querySelector(fieldSelector);
270
+ if (field) {
271
+ if (field.tagName === "INPUT") {
272
+ let type = field.getAttribute("type");
273
+ if (type === "radio" || type === "checkbox") {
274
+ field = document.querySelector(fieldSelector + ":checked");
275
+ }
276
+ this.fieldData[this.fieldNames[i]] = encodeURIComponent(field.value);
277
+ }
278
+ else if (field.tagName === "SELECT") {
279
+ this.fieldData[this.fieldNames[i]] = encodeURIComponent(field.value);
280
+ }
281
+ }
282
+ }
283
+ }
284
+ setFieldValue(field, value, overwrite = false) {
285
+ if (field && value !== undefined) {
286
+ if ((field.value && overwrite) || !field.value) {
287
+ field.value = value;
288
+ }
289
+ }
290
+ }
291
+ clearFields(skipFields) {
292
+ for (let key in this.fieldData) {
293
+ if (skipFields.includes(key)) {
294
+ delete this.fieldData[key];
295
+ }
296
+ else if (this.fieldData[key] === "") {
297
+ delete this.fieldData[key];
298
+ }
299
+ else {
300
+ this.fieldData[key] = "";
301
+ }
302
+ }
303
+ this.writeFields(true);
304
+ }
305
+ /**
306
+ * Writes the values from the fieldData object to the corresponding HTML input fields.
307
+ *
308
+ * This function iterates over the fieldNames array and for each field name, it selects the corresponding HTML input field.
309
+ * If the field is found and its tag name is "INPUT", it checks if the field name matches certain conditions (like being a donation recurring payment radio button or a donation amount radio button).
310
+ * Depending on these conditions, it either clicks the field or sets its value using the setFieldValue function.
311
+ * If the field tag name is "SELECT", it sets its value using the setFieldValue function.
312
+ *
313
+ * @param overwrite - A boolean indicating whether to overwrite the existing value of the fields. Defaults to false.
314
+ */
315
+ writeFields(overwrite = false) {
316
+ for (let i = 0; i < this.fieldNames.length; i++) {
317
+ let fieldSelector = "[name='" + this.fieldNames[i] + "']";
318
+ let field = document.querySelector(fieldSelector);
319
+ if (field) {
320
+ if (field.tagName === "INPUT") {
321
+ if (this.fieldNames[i] === this.fieldDonationRecurrPayRadioName) {
322
+ if (this.fieldData[this.fieldNames[i]] === "Y") {
323
+ field.click();
324
+ }
325
+ }
326
+ else if (this.fieldDonationAmountRadioName === this.fieldNames[i]) {
327
+ field = document.querySelector(fieldSelector +
328
+ "[value='" +
329
+ this.fieldData[this.fieldNames[i]] +
330
+ "']");
331
+ if (field) {
332
+ field.click();
333
+ }
334
+ else {
335
+ field = document.querySelector("input[name='" + this.fieldDonationAmountOtherName + "']");
336
+ this.setFieldValue(field, this.fieldData[this.fieldNames[i]], true);
337
+ }
338
+ }
339
+ else {
340
+ this.setFieldValue(field, this.fieldData[this.fieldNames[i]], overwrite);
341
+ }
342
+ }
343
+ else if (field.tagName === "SELECT") {
344
+ this.setFieldValue(field, this.fieldData[this.fieldNames[i]], true);
345
+ }
346
+ }
347
+ }
348
+ }
349
+ isJson(str) {
350
+ try {
351
+ JSON.parse(str);
352
+ }
353
+ catch (e) {
354
+ return false;
355
+ }
356
+ return true;
357
+ }
358
+ }
@@ -0,0 +1,8 @@
1
+ export declare class RequiredIfVisible {
2
+ private logger;
3
+ private _form;
4
+ private requiredIfVisibleElements;
5
+ constructor();
6
+ private shouldRun;
7
+ private validate;
8
+ }
@@ -0,0 +1,60 @@
1
+ import { EnForm, ENGrid, EngridLogger } from ".";
2
+ export class RequiredIfVisible {
3
+ constructor() {
4
+ this.logger = new EngridLogger("RequiredIfVisible", "#FFFFFF", "#811212", "🚥");
5
+ this._form = EnForm.getInstance();
6
+ this.requiredIfVisibleElements = document.querySelectorAll(`
7
+ .i-required .en__field,
8
+ .i1-required .en__field:nth-of-type(1),
9
+ .i2-required .en__field:nth-of-type(2),
10
+ .i3-required .en__field:nth-of-type(3),
11
+ .i4-required .en__field:nth-of-type(4),
12
+ .i5-required .en__field:nth-of-type(5),
13
+ .i6-required .en__field:nth-of-type(6),
14
+ .i7-required .en__field:nth-of-type(7),
15
+ .i8-required .en__field:nth-of-type(8),
16
+ .i9-required .en__field:nth-of-type(9),
17
+ .i10-required .en__field:nth-of-type(10),
18
+ .i11-required .en__field:nth-of-type(11)
19
+ `);
20
+ if (!this.shouldRun())
21
+ return;
22
+ this._form.onValidate.subscribe(this.validate.bind(this));
23
+ }
24
+ shouldRun() {
25
+ return this.requiredIfVisibleElements.length > 0;
26
+ }
27
+ validate() {
28
+ // We're converting the NodeListOf<HTMLElement> to an Array<HTMLElement>
29
+ // because we need to reverse the order of the elements so the last error
30
+ // is the highest element to get focus()
31
+ Array.from(this.requiredIfVisibleElements)
32
+ .reverse()
33
+ .forEach((field) => {
34
+ ENGrid.removeError(field);
35
+ if (ENGrid.isVisible(field)) {
36
+ this.logger.log(`${field.getAttribute("class")} is visible`);
37
+ const fieldElement = field.querySelector("input:not([type=hidden]) , select, textarea");
38
+ if (fieldElement &&
39
+ fieldElement.closest("[data-unhidden]") === null &&
40
+ !ENGrid.getFieldValue(fieldElement.getAttribute("name"))) {
41
+ const fieldLabel = field.querySelector(".en__field__label");
42
+ if (fieldLabel) {
43
+ this.logger.log(`${fieldLabel.innerText} is required`);
44
+ window.setTimeout(() => {
45
+ ENGrid.setError(field, `${fieldLabel.innerText} is required`);
46
+ }, 100);
47
+ }
48
+ else {
49
+ this.logger.log(`${fieldElement.getAttribute("name")} is required`);
50
+ window.setTimeout(() => {
51
+ ENGrid.setError(field, `This field is required`);
52
+ }, 100);
53
+ }
54
+ fieldElement.focus();
55
+ this._form.validate = false;
56
+ }
57
+ }
58
+ });
59
+ }
60
+ }
@@ -0,0 +1,4 @@
1
+ export declare class SetAttr {
2
+ private logger;
3
+ constructor();
4
+ }
@@ -0,0 +1,31 @@
1
+ /*+
2
+ The class is used to set body attributes via click handlers.
3
+ The format is "setattr--{attribute}--{value}".
4
+ e.g. setattr--data-engrid-hide-fast-address-details--true
5
+ */
6
+ import { ENGrid, EngridLogger } from ".";
7
+ export class SetAttr {
8
+ constructor() {
9
+ this.logger = new EngridLogger("SetAttr", "black", "yellow", "📌");
10
+ const enGrid = document.getElementById("engrid");
11
+ if (enGrid) {
12
+ enGrid.addEventListener("click", (e) => {
13
+ const clickedEl = e.target;
14
+ if (typeof clickedEl.className !== "string") {
15
+ return;
16
+ }
17
+ const clickedElClassNames = clickedEl.className.split(" ");
18
+ if (clickedElClassNames.some((className) => className.startsWith("setattr--"))) {
19
+ clickedEl.classList.forEach((className) => {
20
+ //Check element has class with format "setattr--attribute--value"
21
+ const match = className.match(/^setattr--(.+)--(.+)$/i);
22
+ if (match && match[1] && match[2]) {
23
+ this.logger.log(`Clicked element with class "${className}". Setting body attribute "${match[1]}" to "${match[2]}"`);
24
+ ENGrid.setBodyData(match[1].replace("data-engrid-", ""), match[2]);
25
+ }
26
+ });
27
+ }
28
+ });
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,7 @@
1
+ export declare class setRecurrFreq {
2
+ private _frequency;
3
+ private _amount;
4
+ private linkClass;
5
+ private checkboxName;
6
+ constructor();
7
+ }
@@ -0,0 +1,70 @@
1
+ import { ENGrid } from ".";
2
+ import { DonationFrequency, DonationAmount } from "./events";
3
+ export class setRecurrFreq {
4
+ constructor() {
5
+ this._frequency = DonationFrequency.getInstance();
6
+ this._amount = DonationAmount.getInstance();
7
+ this.linkClass = "setRecurrFreq-";
8
+ this.checkboxName = "engrid.recurrfreq";
9
+ // Watch the links that starts with linkClass
10
+ document
11
+ .querySelectorAll(`a[class^="${this.linkClass}"]`)
12
+ .forEach((element) => {
13
+ element.addEventListener("click", (e) => {
14
+ // Get the right class
15
+ const setRecurrFreqClass = element.className
16
+ .split(" ")
17
+ .filter((linkClass) => linkClass.startsWith(this.linkClass));
18
+ if (ENGrid.debug)
19
+ console.log(setRecurrFreqClass);
20
+ if (setRecurrFreqClass.length) {
21
+ e.preventDefault();
22
+ ENGrid.setFieldValue("transaction.recurrfreq", setRecurrFreqClass[0]
23
+ .substring(this.linkClass.length)
24
+ .toUpperCase());
25
+ this._frequency.load();
26
+ }
27
+ });
28
+ });
29
+ const currentFrequency = ENGrid.getFieldValue("transaction.recurrfreq").toUpperCase();
30
+ // Watch checkboxes with the name checkboxName
31
+ document.getElementsByName(this.checkboxName).forEach((element) => {
32
+ // Set checked status per currently-set frequency
33
+ const frequency = element.value.toUpperCase();
34
+ if (frequency === currentFrequency) {
35
+ element.checked = true;
36
+ }
37
+ else {
38
+ element.checked = false;
39
+ }
40
+ element.addEventListener("change", () => {
41
+ const frequency = element.value.toUpperCase();
42
+ if (element.checked) {
43
+ ENGrid.setFieldValue("transaction.recurrfreq", frequency);
44
+ ENGrid.setFieldValue("transaction.recurrpay", "Y");
45
+ this._frequency.load();
46
+ this._amount.setAmount(this._amount.amount, false);
47
+ }
48
+ else if (frequency !== "ONETIME") {
49
+ ENGrid.setFieldValue("transaction.recurrfreq", "ONETIME");
50
+ ENGrid.setFieldValue("transaction.recurrpay", "N");
51
+ this._frequency.load();
52
+ this._amount.setAmount(this._amount.amount, false);
53
+ }
54
+ });
55
+ });
56
+ // Uncheck the checkbox when frequency != checkbox value
57
+ this._frequency.onFrequencyChange.subscribe(() => {
58
+ const currentFrequency = this._frequency.frequency.toUpperCase();
59
+ document.getElementsByName(this.checkboxName).forEach((element) => {
60
+ const elementFrequency = element.value.toUpperCase();
61
+ if (element.checked && elementFrequency !== currentFrequency) {
62
+ element.checked = false;
63
+ }
64
+ else if (!element.checked && elementFrequency === currentFrequency) {
65
+ element.checked = true;
66
+ }
67
+ });
68
+ });
69
+ }
70
+ }
@@ -0,0 +1,13 @@
1
+ export declare class ShowHideRadioCheckboxes {
2
+ elements: NodeList;
3
+ classes: string;
4
+ private logger;
5
+ createDataAttributes(): void;
6
+ hideAll(): void;
7
+ hide(item: HTMLInputElement): void;
8
+ show(item: HTMLInputElement): void;
9
+ private toggleValue;
10
+ getSessionState(): any;
11
+ storeSessionState(): void;
12
+ constructor(elements: string, classes: string);
13
+ }