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