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