PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.22.3
GiveWP – Donation Plugin and Fundraising Platform v2.22.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 4 years ago
summary.js
231 lines
1 import accounting from 'accounting';
2
3 /**
4 * @since 2.17.0
5 */
6 window.GiveDonationSummary = {
7 init: function () {
8 GiveDonationSummary.initAmount();
9 GiveDonationSummary.initFrequency();
10 GiveDonationSummary.initFees();
11 GiveDonationSummary.initTotal();
12 },
13
14 /**
15 * @since 2.17.0
16 */
17 initAmount: function () {
18 GiveDonationSummary.observe('[name="give-amount"]', function (targetNode, $form) {
19 $form.find('[data-tag="amount"]').html(GiveDonationSummary.format_amount(targetNode.value, $form));
20 });
21 },
22
23 /**
24 * Recurring frequency
25 *
26 * @since 2.17.0
27 */
28 initFrequency: function () {
29 // Donor's Choice Recurring
30 GiveDonationSummary.observe(
31 '[name="give-recurring-period"]',
32 GiveDonationSummary.handleDonorsChoiceRecurringFrequency
33 );
34
35 // Admin Defined Recurring
36 GiveDonationSummary.observe('[name="give-price-id"]', GiveDonationSummary.handleAdminDefinedRecurringFrequency);
37
38 // Admin Defined Recurring - "Set Donation"
39 GiveDonationSummary.observe(
40 '[name="_give_is_donation_recurring"]',
41 GiveDonationSummary.handleAdminDefinedSetDonationFrequency
42 );
43
44 // Admin Defined Recurring - "Multi-level"
45 GiveDonationSummary.observe('[name="give-price-id"]', GiveDonationSummary.handleAdminDefinedRecurringFrequency);
46 },
47
48 /**
49 * @since 2.18.0
50 */
51 handleDonorsChoiceRecurringFrequency: function (targetNode, $form) {
52 $form.find('.js-give-donation-summary-frequency-help-text').toggle(!targetNode.checked);
53 $form.find('[data-tag="frequency"]').toggle(!targetNode.checked);
54 $form.find('[data-tag="recurring"]').toggle(targetNode.checked).html(targetNode.dataset['periodLabel']);
55
56 // Donor's Choice Period
57 const donorsChoice = document.querySelector('[name="give-recurring-period-donors-choice"]');
58 if (donorsChoice) {
59 const donorsChoiceValue = donorsChoice.options[donorsChoice.selectedIndex].value || false;
60 if (donorsChoiceValue) {
61 $form
62 .find('[data-tag="recurring"]')
63 .html(GiveDonationSummaryData.recurringLabelLookup[donorsChoiceValue]);
64 }
65 }
66 },
67
68 /**
69 * @since 2.18.0
70 */
71 handleAdminDefinedRecurringFrequency: function (targetNode, $form) {
72 const priceID = targetNode.value;
73 const recurringDetailsEl = document.querySelector('.give_recurring_donation_details');
74
75 if (!recurringDetailsEl) {
76 return;
77 }
78
79 const recurringDetails = JSON.parse(recurringDetailsEl.value);
80
81 if ('undefined' !== typeof recurringDetails['multi']) {
82 const isRecurring = 'yes' === recurringDetails['multi'][priceID]['_give_recurring'];
83 const periodLabel = recurringDetails['multi'][priceID]['give_recurring_pretty_text'];
84
85 $form.find('.js-give-donation-summary-frequency-help-text').toggle(!isRecurring);
86 $form.find('[data-tag="frequency"]').toggle(!isRecurring);
87 $form.find('[data-tag="recurring"]').toggle(isRecurring).html(periodLabel);
88 }
89 },
90
91 handleAdminDefinedSetDonationFrequency: function (targetNode, $form) {
92 const isRecurring = targetNode.value;
93 const adminChoice = document.querySelector('.give-recurring-admin-choice');
94
95 if (isRecurring && adminChoice) {
96 $form.find('.js-give-donation-summary-frequency-help-text').toggle(!isRecurring);
97 $form.find('[data-tag="frequency"]').toggle(!isRecurring);
98 $form.find('[data-tag="recurring"]').html(adminChoice.textContent);
99 }
100 },
101
102 /**
103 * @since 2.17.0
104 */
105 initFees: function () {
106 GiveDonationSummary.observe('.give_fee_mode_checkbox', GiveDonationSummary.handleFees);
107 },
108
109 /**
110 * @since 2.18.0
111 */
112 handleFees: function (targetNode, $form) {
113 $form.find('.fee-break-down-message').hide();
114 $form.find('.js-give-donation-summary-fees').toggle(targetNode.checked);
115
116 if (!targetNode.checked) {
117 return;
118 }
119
120 // Hack: (Currency Switcher) The total is always stored using a the decimal separator as set by the primary currency.
121 const formData = new FormData($form[0]);
122 const fee = formData.get('give-fee-amount');
123 $form.find('[data-tag="fees"]').html(GiveDonationSummary.format_amount(fee, $form));
124 },
125
126 /**
127 * @since 2.17.0
128 */
129 initTotal: function () {
130 GiveDonationSummary.observe('.give-final-total-amount', function (targetNode, $form) {
131 // Hack: (Currency Switcher) The total is always stored using a the decimal seperator as set by the primary currency.
132 const total = targetNode.dataset.total.replace('.', Give.form.fn.getInfo('decimal_separator', $form));
133 $form.find('[data-tag="total"]').html(GiveDonationSummary.format_amount(total, $form));
134 });
135
136 // Hack: Force an initial mutation for the Total Amount observer
137 const totalAmount = document.querySelector('.give-final-total-amount');
138 if (totalAmount) {
139 totalAmount.dataset.total = totalAmount.dataset.total;
140 }
141 },
142
143 /**
144 * Hack: Placeholder callback, which is only used when the gateway changes.
145 */
146 handleNavigateBack: function () {},
147
148 /**
149 * Hack: Changing gateways re-renders parts of the form via AJAX.
150 */
151 onGatewayLoadSuccess: function () {
152 const inserted = jQuery('#give_purchase_form_wrap .give-donation-summary-section').detach();
153 if (inserted.length) {
154 jQuery('.give-donation-summary-section').remove();
155 inserted.appendTo('#donate-fieldset');
156 GiveDonationSummary.initTotal();
157
158 // Overwrite the handler because updating the gateway breaks the original binding.
159 GiveDonationSummary.handleNavigateBack = function (e) {
160 e.stopPropagation();
161 e.preventDefault();
162 window.formNavigator.back();
163 };
164 }
165 },
166
167 /**
168 * Observe an element and respond to changes to that element.
169 *
170 * @since 2.17.0
171 *
172 * @param {string} selectors
173 * @param {callable} callback
174 * @param {boolean} callImmediately
175 */
176 observe: function (selectors, callback, callImmediately = true) {
177 const targetNode = document.querySelector(selectors);
178
179 if (!targetNode) return;
180
181 const $form = jQuery(targetNode.closest('.give-form'));
182
183 new MutationObserver(function (mutationsList) {
184 for (const mutation of mutationsList) {
185 // Use traditional 'for loops' for IE 11
186 if (mutation.type === 'attributes') {
187 /**
188 * @param targetNode The node matching the element as defined by the specific selectors
189 * @param $form The closest `.give-form` node to the targetNode, wrapped in jQuery
190 */
191 callback(mutation.target, $form);
192 }
193 }
194 }).observe(targetNode, {attributes: true});
195
196 if (callImmediately) {
197 callback(targetNode, $form);
198 }
199 },
200
201 /**
202 * Helper function to get the formatted amount
203 *
204 * @since 2.17.0
205 *
206 * @param {string/number} amount
207 * @param {jQuery} $form
208 */
209 format_amount: function (amount, $form) {
210 // Normalize amounts to JS number format
211 amount = amount
212 .replace(Give.form.fn.getInfo('thousands_separator', $form), '')
213 .replace(Give.form.fn.getInfo('decimal_separator', $form), '.');
214
215 const currency = Give.form.fn.getInfo('currency_code', $form);
216 const precision = GiveDonationSummaryData.currencyPrecisionLookup[currency];
217
218 // Format with accounting.js, according to the configuration
219 return accounting.formatMoney(amount, {
220 symbol: Give.form.fn.getInfo('currency_symbol', $form),
221 format: 'before' === Give.form.fn.getInfo('currency_position', $form) ? '%s%v' : '%v%s',
222 decimal: Give.form.fn.getInfo('decimal_separator', $form),
223 thousand: Give.form.fn.getInfo('thousands_separator', $form),
224 precision: precision,
225 });
226 },
227 };
228
229 jQuery(document).on('give:postInit', GiveDonationSummary.init);
230 jQuery(document).on('Give:onGatewayLoadSuccess', GiveDonationSummary.onGatewayLoadSuccess);
231