@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.
- package/.prettierrc.js +226 -0
- package/LICENSE +24 -0
- package/dist/a11y.d.ts +6 -0
- package/dist/a11y.js +46 -0
- package/dist/add-name-to-message.d.ts +5 -0
- package/dist/add-name-to-message.js +49 -0
- package/dist/advocacy.d.ts +7 -0
- package/dist/advocacy.js +34 -0
- package/dist/amount-label.d.ts +6 -0
- package/dist/amount-label.js +29 -0
- package/dist/app.d.ts +19 -0
- package/dist/app.js +340 -0
- package/dist/apple-pay.d.ts +13 -0
- package/dist/apple-pay.js +169 -0
- package/dist/auto-country-select.d.ts +10 -0
- package/dist/auto-country-select.js +63 -0
- package/dist/auto-year.d.ts +7 -0
- package/dist/auto-year.js +35 -0
- package/dist/autocomplete.d.ts +5 -0
- package/dist/autocomplete.js +38 -0
- package/dist/autosubmit.d.ts +5 -0
- package/dist/autosubmit.js +14 -0
- package/dist/branding-html.d.ts +14 -0
- package/dist/branding-html.js +70 -0
- package/dist/capitalize-fields.d.ts +7 -0
- package/dist/capitalize-fields.js +22 -0
- package/dist/click-to-expand.d.ts +4 -0
- package/dist/click-to-expand.js +39 -0
- package/dist/cookie.d.ts +53 -0
- package/dist/cookie.js +76 -0
- package/dist/country-disable.d.ts +4 -0
- package/dist/country-disable.js +22 -0
- package/dist/country-redirect.d.ts +7 -0
- package/dist/country-redirect.js +61 -0
- package/dist/custom-currency.d.ts +9 -0
- package/dist/custom-currency.js +112 -0
- package/dist/data-attributes.d.ts +5 -0
- package/dist/data-attributes.js +122 -0
- package/dist/data-hide.d.ts +15 -0
- package/dist/data-hide.js +66 -0
- package/dist/data-layer.d.ts +23 -0
- package/dist/data-layer.js +312 -0
- package/dist/data-replace.d.ts +26 -0
- package/dist/data-replace.js +76 -0
- package/dist/debug-hidden-fields.d.ts +4 -0
- package/dist/debug-hidden-fields.js +42 -0
- package/dist/debug-panel.d.ts +27 -0
- package/dist/debug-panel.js +508 -0
- package/dist/deprecated.d.ts +5 -0
- package/dist/deprecated.js +40 -0
- package/dist/digital-wallets.d.ts +8 -0
- package/dist/digital-wallets.js +143 -0
- package/dist/ecard-to-target.d.ts +11 -0
- package/dist/ecard-to-target.js +73 -0
- package/dist/ecard.d.ts +8 -0
- package/dist/ecard.js +61 -0
- package/dist/embedded-ecard.d.ts +18 -0
- package/dist/embedded-ecard.js +267 -0
- package/dist/en-validators.d.ts +10 -0
- package/dist/en-validators.js +89 -0
- package/dist/engrid.d.ts +49 -0
- package/dist/engrid.js +547 -0
- package/dist/event-tickets.d.ts +3 -0
- package/dist/event-tickets.js +24 -0
- package/dist/events/country.d.ts +12 -0
- package/dist/events/country.js +42 -0
- package/dist/events/donation-amount.d.ts +16 -0
- package/dist/events/donation-amount.js +119 -0
- package/dist/events/donation-frequency.d.ts +17 -0
- package/dist/events/donation-frequency.js +115 -0
- package/dist/events/en-form.d.ts +20 -0
- package/dist/events/en-form.js +52 -0
- package/dist/events/index.d.ts +6 -0
- package/dist/events/index.js +6 -0
- package/dist/events/processing-fees.d.ts +20 -0
- package/dist/events/processing-fees.js +92 -0
- package/dist/events/remember-me-events.d.ts +18 -0
- package/dist/events/remember-me-events.js +36 -0
- package/dist/exit-intent-lightbox.d.ts +14 -0
- package/dist/exit-intent-lightbox.js +145 -0
- package/dist/expand-region-name.d.ts +7 -0
- package/dist/expand-region-name.js +44 -0
- package/dist/fast-form-fill.d.ts +8 -0
- package/dist/fast-form-fill.js +75 -0
- package/dist/freshaddress.d.ts +18 -0
- package/dist/freshaddress.js +204 -0
- package/dist/give-by-select.d.ts +9 -0
- package/dist/give-by-select.js +82 -0
- package/dist/iframe.d.ts +16 -0
- package/dist/iframe.js +217 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.js +84 -0
- package/dist/input-has-value-and-focus.d.ts +9 -0
- package/dist/input-has-value-and-focus.js +50 -0
- package/dist/input-placeholders.d.ts +7 -0
- package/dist/input-placeholders.js +82 -0
- package/dist/interfaces/ecard-to-target-options.d.ts +9 -0
- package/dist/interfaces/ecard-to-target-options.js +8 -0
- package/dist/interfaces/embedded-ecard-options.d.ts +8 -0
- package/dist/interfaces/embedded-ecard-options.js +7 -0
- package/dist/interfaces/exit-intent-options.d.ts +13 -0
- package/dist/interfaces/exit-intent-options.js +13 -0
- package/dist/interfaces/options.d.ts +147 -0
- package/dist/interfaces/options.js +50 -0
- package/dist/interfaces/translate-options.d.ts +7 -0
- package/dist/interfaces/translate-options.js +42 -0
- package/dist/interfaces/upsell-options.d.ts +24 -0
- package/dist/interfaces/upsell-options.js +33 -0
- package/dist/live-currency.d.ts +15 -0
- package/dist/live-currency.js +140 -0
- package/dist/live-frequency.d.ts +13 -0
- package/dist/live-frequency.js +109 -0
- package/dist/live-variables.d.ts +21 -0
- package/dist/live-variables.js +147 -0
- package/dist/loader.d.ts +10 -0
- package/dist/loader.js +175 -0
- package/dist/logger.d.ts +16 -0
- package/dist/logger.js +84 -0
- package/dist/media-attribution.d.ts +4 -0
- package/dist/media-attribution.js +66 -0
- package/dist/menu.d.ts +0 -0
- package/dist/menu.js +1 -0
- package/dist/min-max-amount.d.ts +13 -0
- package/dist/min-max-amount.js +71 -0
- package/dist/mobile-cta.d.ts +9 -0
- package/dist/mobile-cta.js +71 -0
- package/dist/modal.d.ts +19 -0
- package/dist/modal.js +129 -0
- package/dist/neverbounce.d.ts +23 -0
- package/dist/neverbounce.js +244 -0
- package/dist/other-amount.d.ts +6 -0
- package/dist/other-amount.js +70 -0
- package/dist/page-background.d.ts +7 -0
- package/dist/page-background.js +55 -0
- package/dist/plaid.d.ts +6 -0
- package/dist/plaid.js +49 -0
- package/dist/postal-code-validator.d.ts +20 -0
- package/dist/postal-code-validator.js +118 -0
- package/dist/premium-gift.d.ts +10 -0
- package/dist/premium-gift.js +115 -0
- package/dist/progress-bar.d.ts +3 -0
- package/dist/progress-bar.js +40 -0
- package/dist/remember-me.d.ts +61 -0
- package/dist/remember-me.js +358 -0
- package/dist/required-if-visible.d.ts +8 -0
- package/dist/required-if-visible.js +60 -0
- package/dist/set-attr.d.ts +4 -0
- package/dist/set-attr.js +31 -0
- package/dist/set-recurr-freq.d.ts +7 -0
- package/dist/set-recurr-freq.js +70 -0
- package/dist/show-hide-radio-checkboxes.d.ts +13 -0
- package/dist/show-hide-radio-checkboxes.js +161 -0
- package/dist/show-if-amount.d.ts +15 -0
- package/dist/show-if-amount.js +117 -0
- package/dist/show-if-present.d.ts +7 -0
- package/dist/show-if-present.js +79 -0
- package/dist/skip-link.d.ts +4 -0
- package/dist/skip-link.js +36 -0
- package/dist/src-defer.d.ts +6 -0
- package/dist/src-defer.js +70 -0
- package/dist/supporter-hub.d.ts +9 -0
- package/dist/supporter-hub.js +75 -0
- package/dist/swap-amounts.d.ts +45 -0
- package/dist/swap-amounts.js +81 -0
- package/dist/thank-you-page-conditional-content.d.ts +8 -0
- package/dist/thank-you-page-conditional-content.js +46 -0
- package/dist/ticker.d.ts +11 -0
- package/dist/ticker.js +66 -0
- package/dist/tidycontact.d.ts +46 -0
- package/dist/tidycontact.js +1202 -0
- package/dist/translate-fields.d.ts +12 -0
- package/dist/translate-fields.js +548 -0
- package/dist/universal-opt-in.d.ts +7 -0
- package/dist/universal-opt-in.js +91 -0
- package/dist/upsell-lightbox.d.ts +31 -0
- package/dist/upsell-lightbox.js +363 -0
- package/dist/url-params-to-body-attrs.d.ts +5 -0
- package/dist/url-params-to-body-attrs.js +14 -0
- package/dist/url-to-form.d.ts +7 -0
- package/dist/url-to-form.js +32 -0
- package/dist/us-only-form.d.ts +4 -0
- package/dist/us-only-form.js +30 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +1 -0
- package/dist/vgs.d.ts +16 -0
- package/dist/vgs.js +250 -0
- package/dist/welcome-back.d.ts +10 -0
- package/dist/welcome-back.js +112 -0
- 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,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
|
+
}
|
package/dist/set-attr.js
ADDED
|
@@ -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,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
|
+
}
|