PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.23.2
GiveWP – Donation Plugin and Fundraising Platform v2.23.2
4.16.4 4.16.3 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
218 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 initAmount: function () {
34 GiveDonationSummary.observe('[name="give-amount"]', function (targetNode, $form) {
35 $form.find('[data-tag="amount"]').html(GiveDonationSummary.getFormattedDonationAmount($form));
36 });
37 },
38
39 /**
40 * Recurring frequency
41 *
42 * @since 2.17.0
43 */
44 initFrequency: function () {
45 // Donor's Choice Recurring
46 GiveDonationSummary.observe(
47 '[name="give-recurring-period"]',
48 GiveDonationSummary.handleDonorsChoiceRecurringFrequency
49 );
50
51 // Admin Defined Recurring
52 GiveDonationSummary.observe('[name="give-price-id"]', GiveDonationSummary.handleAdminDefinedRecurringFrequency);
53
54 // Admin Defined Recurring - "Set Donation"
55 GiveDonationSummary.observe(
56 '[name="_give_is_donation_recurring"]',
57 GiveDonationSummary.handleAdminDefinedSetDonationFrequency
58 );
59
60 // Admin Defined Recurring - "Multi-level"
61 GiveDonationSummary.observe('[name="give-price-id"]', GiveDonationSummary.handleAdminDefinedRecurringFrequency);
62 },
63
64 /**
65 * @since 2.18.0
66 */
67 handleDonorsChoiceRecurringFrequency: function (targetNode, $form) {
68 $form.find('.js-give-donation-summary-frequency-help-text').toggle(!targetNode.checked);
69 $form.find('[data-tag="frequency"]').toggle(!targetNode.checked);
70 $form.find('[data-tag="recurring"]').toggle(targetNode.checked).html(targetNode.dataset['periodLabel']);
71
72 // Donor's Choice Period
73 const donorsChoice = document.querySelector('[name="give-recurring-period-donors-choice"]');
74 if (donorsChoice) {
75 const donorsChoiceValue = donorsChoice.options[donorsChoice.selectedIndex].value || false;
76 if (donorsChoiceValue) {
77 $form
78 .find('[data-tag="recurring"]')
79 .html(GiveDonationSummaryData.recurringLabelLookup[donorsChoiceValue]);
80 }
81 }
82 },
83
84 /**
85 * @since 2.18.0
86 */
87 handleAdminDefinedRecurringFrequency: function (targetNode, $form) {
88 const priceID = targetNode.value;
89 const recurringDetailsEl = document.querySelector('.give_recurring_donation_details');
90
91 if (!recurringDetailsEl) {
92 return;
93 }
94
95 const recurringDetails = JSON.parse(recurringDetailsEl.value);
96
97 if ('undefined' !== typeof recurringDetails['multi']) {
98 const isRecurring = 'yes' === recurringDetails['multi'][priceID]['_give_recurring'];
99 const periodLabel = recurringDetails['multi'][priceID]['give_recurring_pretty_text'];
100
101 $form.find('.js-give-donation-summary-frequency-help-text').toggle(!isRecurring);
102 $form.find('[data-tag="frequency"]').toggle(!isRecurring);
103 $form.find('[data-tag="recurring"]').toggle(isRecurring).html(periodLabel);
104 }
105 },
106
107 handleAdminDefinedSetDonationFrequency: function (targetNode, $form) {
108 const isRecurring = targetNode.value;
109 const adminChoice = document.querySelector('.give-recurring-admin-choice');
110
111 if (isRecurring && adminChoice) {
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"]').html(adminChoice.textContent);
115 }
116 },
117
118 /**
119 * @since 2.23.1 Remove dependency on checkbox. Removed first argument.
120 * @since 2.18.0
121 */
122 handleFees: function ($form) {
123 const feeModeEnableElement = $form.find('[name="give-fee-mode-enable"]');
124
125 if (!feeModeEnableElement || 'true' !== $form.find('[name="give-fee-mode-enable"]').val()) {
126 $form.find('.js-give-donation-summary-fees').toggle(false);
127 return;
128 }
129
130 $form.find('.js-give-donation-summary-fees').toggle(true);
131
132 const feeMessageTemplateParts = $form.find('.give-fee-message-label').attr('data-feemessage').split(' ');
133 const feeMessageParts = $form.find('.give-fee-message-label-text').text().split(' ');
134 const formattedFeeAmount = feeMessageParts
135 .filter((messagePart) => !feeMessageTemplateParts.includes(messagePart))
136 .pop();
137 $form.find('[data-tag="fees"]').html(formattedFeeAmount);
138 },
139
140 /**
141 * @since 2.17.0
142 */
143 initTotal: function () {
144 GiveDonationSummary.observe('.give-final-total-amount', function (targetNode, $form) {
145 $form.find('[data-tag="total"]').html(targetNode.textContent);
146
147 GiveDonationSummary.handleFees($form);
148 });
149
150 // Force an initial mutation for the Total Amount observer
151 const totalAmount = document.querySelector('.give-final-total-amount');
152 if (totalAmount) {
153 totalAmount.textContent = totalAmount.textContent;
154 }
155 },
156
157 /**
158 * Placeholder callback, which is only used when the gateway changes.
159 */
160 handleNavigateBack: function () {},
161
162 /**
163 * Changing gateways re-renders parts of the form via AJAX.
164 */
165 onGatewayLoadSuccess: function () {
166 const inserted = jQuery('#give_purchase_form_wrap .give-donation-summary-section').detach();
167 if (inserted.length) {
168 jQuery('.give-donation-summary-section').remove();
169 inserted.appendTo('#donate-fieldset');
170 GiveDonationSummary.initTotal();
171
172 // Overwrite the handler because updating the gateway breaks the original binding.
173 GiveDonationSummary.handleNavigateBack = function (e) {
174 e.stopPropagation();
175 e.preventDefault();
176 window.formNavigator.back();
177 };
178 }
179 },
180
181 /**
182 * Observe an element and respond to changes to that element.
183 *
184 * @since 2.17.0
185 *
186 * @param {string} selectors
187 * @param {callable} callback
188 * @param {boolean} callImmediately
189 */
190 observe: function (selectors, callback, callImmediately = true) {
191 const targetNode = document.querySelector(selectors);
192
193 if (!targetNode) return;
194
195 const $form = jQuery(targetNode.closest('.give-form'));
196
197 new MutationObserver(function (mutationsList) {
198 for (const mutation of mutationsList) {
199 // Use traditional 'for loops' for IE 11
200 if (mutation.type === 'attributes') {
201 /**
202 * @param targetNode The node matching the element as defined by the specific selectors
203 * @param $form The closest `.give-form` node to the targetNode, wrapped in jQuery
204 */
205 callback(mutation.target, $form);
206 }
207 }
208 }).observe(targetNode, {attributes: true});
209
210 if (callImmediately) {
211 callback(targetNode, $form);
212 }
213 },
214 };
215
216 jQuery(document).on('give:postInit', GiveDonationSummary.init);
217 jQuery(document).on('Give:onGatewayLoadSuccess', GiveDonationSummary.onGatewayLoadSuccess);
218