PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.19.7
GiveWP – Donation Plugin and Fundraising Platform v2.19.7
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 / Form / LegacyConsumer / resources / js / conditinal-fields.js
give / src / Form / LegacyConsumer / resources / js Last commit date
conditinal-fields.js 4 years ago
conditinal-fields.js
219 lines
1 document.addEventListener('readystatechange', (event) => {
2 if (event.target.readyState !== 'complete') {
3 return null;
4 }
5
6 const state = {};
7
8 /**
9 * Get list of watched fields.
10 * @since 2.15.0
11 *
12 * @return object
13 */
14 function getWatchedElementNames(donationForm) {
15 const fields = {};
16
17 donationForm.querySelectorAll('[data-field-visibility-conditions]').forEach(function (fieldContainer) {
18 const visibilityConditions = JSON.parse(fieldContainer.getAttribute('data-field-visibility-conditions'));
19 const visibilityCondition = visibilityConditions[0]; // Currently we support only one visibility condition.
20 let fieldContainerSelector = `[data-field-name="${fieldContainer.getAttribute('data-field-name')}"]`;
21 let {field} = visibilityCondition;
22
23 // Get field. It will tell use real name of field.
24 field = document.querySelector(`[name="${field}"], [name="${field}[]"]`);
25
26 if (field) {
27 fields[field.name] = {
28 ...fields[field.name],
29 [fieldContainerSelector]: visibilityConditions,
30 };
31 }
32 });
33
34 return fields;
35 }
36
37 /**
38 * @since 2.15.0
39 *
40 * @param operator
41 * @param firstData
42 * @param secondData
43 *
44 * @return boolean
45 */
46 function compareWithOperator(operator, firstData, secondData) {
47 return {
48 '=': firstData === secondData,
49 '!=': firstData !== secondData,
50 '>': firstData > secondData,
51 '>=': firstData >= secondData,
52 '<': firstData < secondData,
53 '<=': firstData <= secondData,
54 }[operator];
55 }
56
57 /**
58 * Handle fields visibility.
59 * @since 2.15.0
60 */
61 function handleVisibility(donationForm, watchedFieldName, visibilityConditionsForWatchedField) {
62 for (const [fieldContainerSelector, visibilityConditions] of Object.entries(
63 visibilityConditionsForWatchedField
64 )) {
65 const fieldWrapper = donationForm.querySelector(fieldContainerSelector);
66 const fieldName = fieldWrapper.getAttribute('data-field-name');
67 const visibilityCondition = visibilityConditions[0]; // Currently we support only one visibility condition.
68 let visible = false;
69 const {operator, value} = visibilityCondition;
70
71 const inputs = donationForm.querySelectorAll(`[name="${watchedFieldName}"]`);
72 let hasFieldController = !!inputs.length;
73
74 if (hasFieldController) {
75 inputs.forEach((input) => {
76 const fieldType = input.getAttribute('type');
77
78 // Make an exception for the amount field and parse the value
79 const inputValue =
80 input.name === 'give-amount'
81 ? Give.fn.unFormatCurrency(
82 input.value,
83 Give.form.fn.getInfo('decimal_separator', donationForm)
84 )
85 : input.value;
86
87 const comparisonResult = compareWithOperator(operator, inputValue, value);
88
89 if (fieldType === 'checkbox') {
90 if (
91 (comparisonResult && input.checked && operator === '=') ||
92 (!input.checked && operator === '!=')
93 ) {
94 visible = true;
95 }
96 } else if (fieldType === 'radio') {
97 if (input.checked && comparisonResult) {
98 visible = true;
99 }
100 } else if (comparisonResult) {
101 visible = true;
102 }
103 });
104
105 // Show or Hide field wrapper.
106 if (visible) {
107 const field = fieldWrapper.querySelector(`[name="${fieldName}"][data-required]`);
108 fieldWrapper.classList.remove('give-hidden');
109
110 // Make hidden flagged required field required.
111 if (field) {
112 field.setAttribute('required', '');
113 field.removeAttribute('data-required');
114 }
115 } else {
116 const field = fieldWrapper.querySelector(`[name="${fieldName}"][required]`);
117 fieldWrapper.classList.add('give-hidden');
118
119 // Make hidden required field non-required.
120 if (field) {
121 field.removeAttribute('required');
122 field.setAttribute('data-required', '1');
123 }
124 }
125 }
126 }
127 }
128
129 /**
130 * Setup state for condition visibility settings.
131 * state contains list of watched elements per donation form.
132 *
133 * @since 2.15.0
134 */
135 function addVisibilityConditionsToStateForDonationForm(donationForm) {
136 const uniqueDonationFormId = donationForm.getAttribute('data-id');
137 const watchedFields = getWatchedElementNames(donationForm);
138
139 // Add donation form to state only if visibility conditions exiting for at least form field.
140 if (uniqueDonationFormId && Object.keys(watchedFields).length) {
141 state[uniqueDonationFormId] = watchedFields;
142 }
143 }
144
145 /**
146 * @since 2.15.0
147 * @param donationForm
148 */
149 function applyVisibilityConditionsToDonationForm(donationForm) {
150 const uniqueDonationFormId = donationForm.getAttribute('data-id');
151
152 if (uniqueDonationFormId && uniqueDonationFormId in state) {
153 const formState = state[uniqueDonationFormId];
154
155 for (const [watchedFieldName, visibilityConditions] of Object.entries(formState)) {
156 handleVisibility(
157 document.querySelector(`form[data-id="${uniqueDonationFormId}"]`).closest('.give-form'),
158 watchedFieldName,
159 visibilityConditions
160 );
161 }
162 }
163 }
164
165 /**
166 * @since 2.15.0
167 */
168 function addChangeEventToWatchedElementsForDonationForm(donationFormUniqueId) {
169 const donationForm = document
170 .querySelector(`form.give-form[data-id="${donationFormUniqueId}"`)
171 .closest('form.give-form');
172
173 if (!donationForm || !state.hasOwnProperty(donationFormUniqueId)) {
174 return;
175 }
176
177 for (const [watchedElementName, VisibilityConditions] of Object.entries(state[donationFormUniqueId])) {
178 document.querySelectorAll(`[name = "${watchedElementName}"]`).forEach((field) => {
179 jQuery(field).on(
180 'input change blur',
181 handleVisibility.bind(null, donationForm, watchedElementName, VisibilityConditions)
182 );
183 });
184 }
185 }
186
187 /**
188 * @since 2.15.0
189 */
190 function bootVisibilityConditionsFormAllDonationForm() {
191 document.querySelectorAll('form.give-form').forEach(addVisibilityConditionsToStateForDonationForm);
192
193 // Apply visibility conditions.
194 // Add change event to watched field.
195 for (const [donationFormUniqueId, donationFormState] of Object.entries(state)) {
196 for (const [watchedFieldName, visibilityConditions] of Object.entries(donationFormState)) {
197 handleVisibility(
198 document.querySelector(`form[data-id="${donationFormUniqueId}"]`).closest('.give-form'),
199 watchedFieldName,
200 visibilityConditions
201 );
202 }
203
204 addChangeEventToWatchedElementsForDonationForm(donationFormUniqueId);
205 }
206 }
207
208 bootVisibilityConditionsFormAllDonationForm();
209
210 // Apply visibility conditions to donation form when donor switch gateway.
211 document.addEventListener('give_gateway_loaded', (event) => {
212 const donationForm = document.getElementById(event.detail.formIdAttribute);
213 const uniqueDonationFormId = donationForm.getAttribute('data-id');
214 addVisibilityConditionsToStateForDonationForm(donationForm);
215 applyVisibilityConditionsToDonationForm(donationForm);
216 addChangeEventToWatchedElementsForDonationForm(uniqueDonationFormId);
217 });
218 });
219