PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.27.2
GiveWP – Donation Plugin and Fundraising Platform v2.27.2
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / DonationSummary / resources / js / summary.js
give / src / DonationSummary / resources / js Last commit date
summary.js 3 years ago
summary.js
229 lines
1 /**
2 * @since 2.17.0
3 */
4 window.GiveDonationSummary = {
5 init: function () {
6 GiveDonationSummary.initAmount();
7 GiveDonationSummary.initFrequency();
8 GiveDonationSummary.initTotal();
9 },
10
11 /**
12 * This function returns formated donation amount.
13 *
14 * @since 2.23.1
15 * @return {string}
16 */
17 getFormattedDonationAmount: function ($form) {
18 const unFormattedAmount = Give.fn.unFormatCurrency(
19 $form.find('[name="give-amount"]').val(),
20 Give.form.fn.getInfo('decimal_separator', $form)
21 );
22
23 return Give.fn.formatCurrency(
24 unFormattedAmount,
25 {symbol: Give.form.fn.getInfo('currency_symbol', $form)},
26 $form
27 );
28 },
29
30 /**
31 * @since 2.17.0
32 *
33 * @since 2.24.0 add eventlistner for custom input amount changes.
34 */
35 initAmount: function () {
36 GiveDonationSummary.observe('[name="give-amount"]', function (targetNode, $form) {
37 $form.find('[data-tag="amount"]').html(GiveDonationSummary.getFormattedDonationAmount($form));
38 });
39
40 const targetNode = document.querySelector('[name="give-amount"]');
41 if (targetNode) {
42 const $form = jQuery(targetNode.closest('.give-form'));
43
44 targetNode.addEventListener('change', function () {
45 $form.find('[data-tag="amount"]').html(GiveDonationSummary.getFormattedDonationAmount($form));
46 });
47 }
48 },
49
50 /**
51 * Recurring frequency
52 *
53 * @since 2.17.0
54 */
55 initFrequency: function () {
56 // Donor's Choice Recurring
57 GiveDonationSummary.observe(
58 '[name="give-recurring-period"]',
59 GiveDonationSummary.handleDonorsChoiceRecurringFrequency
60 );
61
62 // Admin Defined Recurring
63 GiveDonationSummary.observe('[name="give-price-id"]', GiveDonationSummary.handleAdminDefinedRecurringFrequency);
64
65 // Admin Defined Recurring - "Set Donation"
66 GiveDonationSummary.observe(
67 '[name="_give_is_donation_recurring"]',
68 GiveDonationSummary.handleAdminDefinedSetDonationFrequency
69 );
70
71 // Admin Defined Recurring - "Multi-level"
72 GiveDonationSummary.observe('[name="give-price-id"]', GiveDonationSummary.handleAdminDefinedRecurringFrequency);
73 },
74
75 /**
76 * @since 2.18.0
77 */
78 handleDonorsChoiceRecurringFrequency: function (targetNode, $form) {
79 $form.find('.js-give-donation-summary-frequency-help-text').toggle(!targetNode.checked);
80 $form.find('[data-tag="frequency"]').toggle(!targetNode.checked);
81 $form.find('[data-tag="recurring"]').toggle(targetNode.checked).html(targetNode.dataset['periodLabel']);
82
83 // Donor's Choice Period
84 const donorsChoice = document.querySelector('[name="give-recurring-period-donors-choice"]');
85 if (donorsChoice) {
86 const donorsChoiceValue = donorsChoice.options[donorsChoice.selectedIndex].value || false;
87 if (donorsChoiceValue) {
88 $form
89 .find('[data-tag="recurring"]')
90 .html(GiveDonationSummaryData.recurringLabelLookup[donorsChoiceValue]);
91 }
92 }
93 },
94
95 /**
96 * @since 2.18.0
97 */
98 handleAdminDefinedRecurringFrequency: function (targetNode, $form) {
99 const priceID = targetNode.value;
100 const recurringDetailsEl = document.querySelector('.give_recurring_donation_details');
101
102 if (!recurringDetailsEl) {
103 return;
104 }
105
106 const recurringDetails = JSON.parse(recurringDetailsEl.value);
107
108 if ('undefined' !== typeof recurringDetails['multi']) {
109 const isRecurring = 'yes' === recurringDetails['multi'][priceID]['_give_recurring'];
110 const periodLabel = recurringDetails['multi'][priceID]['give_recurring_pretty_text'];
111
112 $form.find('.js-give-donation-summary-frequency-help-text').toggle(!isRecurring);
113 $form.find('[data-tag="frequency"]').toggle(!isRecurring);
114 $form.find('[data-tag="recurring"]').toggle(isRecurring).html(periodLabel);
115 }
116 },
117
118 handleAdminDefinedSetDonationFrequency: function (targetNode, $form) {
119 const isRecurring = targetNode.value;
120 const adminChoice = document.querySelector('.give-recurring-admin-choice');
121
122 if (isRecurring && adminChoice) {
123 $form.find('.js-give-donation-summary-frequency-help-text').toggle(!isRecurring);
124 $form.find('[data-tag="frequency"]').toggle(!isRecurring);
125 $form.find('[data-tag="recurring"]').html(adminChoice.textContent);
126 }
127 },
128
129 /**
130 * @since 2.23.1 Remove dependency on checkbox. Removed first argument.
131 * @since 2.18.0
132 */
133 handleFees: function ($form) {
134 const feeModeEnableElement = $form.find('[name="give-fee-mode-enable"]');
135
136 if (!feeModeEnableElement || 'true' !== $form.find('[name="give-fee-mode-enable"]').val()) {
137 $form.find('.js-give-donation-summary-fees').toggle(false);
138 return;
139 }
140
141 $form.find('.js-give-donation-summary-fees').toggle(true);
142
143 const feeMessageTemplateParts = $form.find('.give-fee-message-label').attr('data-feemessage').split(' ');
144 const feeMessageParts = $form.find('.give-fee-message-label-text').text().split(' ');
145 const formattedFeeAmount = feeMessageParts
146 .filter((messagePart) => !feeMessageTemplateParts.includes(messagePart))
147 .pop();
148 $form.find('[data-tag="fees"]').html(formattedFeeAmount);
149 },
150
151 /**
152 * @since 2.17.0
153 */
154 initTotal: function () {
155 GiveDonationSummary.observe('.give-final-total-amount', function (targetNode, $form) {
156 $form.find('[data-tag="total"]').html(targetNode.textContent);
157
158 GiveDonationSummary.handleFees($form);
159 });
160
161 // Force an initial mutation for the Total Amount observer
162 const totalAmount = document.querySelector('.give-final-total-amount');
163 if (totalAmount) {
164 totalAmount.textContent = totalAmount.textContent;
165 }
166 },
167
168 /**
169 * Placeholder callback, which is only used when the gateway changes.
170 */
171 handleNavigateBack: function () {},
172
173 /**
174 * Changing gateways re-renders parts of the form via AJAX.
175 */
176 onGatewayLoadSuccess: function () {
177 const inserted = jQuery('#give_purchase_form_wrap .give-donation-summary-section').detach();
178 if (inserted.length) {
179 jQuery('.give-donation-summary-section').remove();
180 inserted.appendTo('#donate-fieldset');
181 GiveDonationSummary.initTotal();
182
183 // Overwrite the handler because updating the gateway breaks the original binding.
184 GiveDonationSummary.handleNavigateBack = function (e) {
185 e.stopPropagation();
186 e.preventDefault();
187 window.formNavigator.back();
188 };
189 }
190 },
191
192 /**
193 * Observe an element and respond to changes to that element.
194 *
195 * @since 2.17.0
196 *
197 * @param {string} selectors
198 * @param {callable} callback
199 * @param {boolean} callImmediately
200 */
201 observe: function (selectors, callback, callImmediately = true) {
202 const targetNode = document.querySelector(selectors);
203
204 if (!targetNode) return;
205
206 const $form = jQuery(targetNode.closest('.give-form'));
207
208 new MutationObserver(function (mutationsList) {
209 for (const mutation of mutationsList) {
210 // Use traditional 'for loops' for IE 11
211 if (mutation.type === 'attributes') {
212 /**
213 * @param targetNode The node matching the element as defined by the specific selectors
214 * @param $form The closest `.give-form` node to the targetNode, wrapped in jQuery
215 */
216 callback(mutation.target, $form);
217 }
218 }
219 }).observe(targetNode, {attributes: true});
220
221 if (callImmediately) {
222 callback(targetNode, $form);
223 }
224 },
225 };
226
227 jQuery(document).on('give:postInit', GiveDonationSummary.init);
228 jQuery(document).on('Give:onGatewayLoadSuccess', GiveDonationSummary.onGatewayLoadSuccess);
229