PluginProbe ʕ •ᴥ•ʔ
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI / 3.5.3
Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder with AI v3.5.3
3.5.3 3.5.2 3.5.1 3.5.0 3.4.8 3.4.7 3.4.6 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5.1 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.10 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.6.1 1.6.7 1.7.0 1.7.0.1 1.7.0.2 1.7.0.3 1.7.1 1.7.2 1.7.2.1 1.7.2.2 1.7.3 1.7.4 1.7.5 1.7.5.1 1.7.5.2 1.7.6 1.7.7 1.7.7.1 1.7.7.2 1.7.8 1.7.9 1.8.0 1.8.0.1 1.8.1 1.8.2 1.8.2.1 1.8.2.2 1.8.2.3 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.0.1 1.9.1 1.9.2 1.9.3 1.9.4 1.9.4.1 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.0.1 2.0.1 2.0.2 2.0.3 2.0.3.1 2.0.4 2.0.4.1 2.0.5 2.0.6 2.0.7 2.0.8 2.0.8.1 2.0.9 3.0.0 3.0.0.1 3.0.1 3.0.2 3.0.3 3.0.3.1 3.0.4 3.0.4.1 3.0.4.2 3.0.5 3.0.5.1 3.0.5.2 3.0.6 3.0.6.1 3.0.7.1 3.0.8 3.0.8.1 3.0.9 3.0.9.1 3.0.9.2 3.0.9.3 3.0.9.4 3.0.9.5 3.1.0 3.1.1 3.1.2 3.2.0 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.3.0 3.4.0 3.4.1 3.4.2 3.4.2.1 3.4.3 3.4.4 3.4.5 trunk 1.0 1.0.1 1.0.2 1.0.3
everest-forms / assets / js / admin / form-builder.js
everest-forms / assets / js / admin Last commit date
admin.js 1 month ago admin.min.js 1 month ago chart.js 2 years ago chart.min.js 1 year ago customize-controls.js 1 year ago customize-controls.min.js 1 year ago customize-preview.js 1 year ago customize-preview.min.js 1 year ago deactivation-feedback.js 2 years ago deactivation-feedback.min.js 2 years ago editor.js 8 years ago editor.min.js 5 years ago everest-forms-survey-polls-quiz-builder.js 2 years ago everest-forms-survey-polls-quiz-builder.min.js 2 years ago evf-admin-email.js 2 years ago evf-admin-email.min.js 1 year ago evf-clipboard.js 8 years ago evf-clipboard.min.js 8 years ago evf-enhanced-select.js 3 years ago evf-enhanced-select.min.js 2 years ago evf-file-uploader.js 2 years ago evf-file-uploader.min.js 2 years ago evf-setup.js 2 years ago evf-setup.min.js 2 years ago extensions.js 3 years ago extensions.min.js 2 years ago form-builder.js 1 week ago form-builder.min.js 1 month ago form-template-controller.js 3 years ago form-template-controller.min.js 3 years ago printThis.min.js 2 years ago progressbar.js 2 years ago progressbar.min.js 1 year ago randomColor.js 2 years ago randomColor.min.js 2 years ago settings.js 1 week ago settings.min.js 1 week ago shortcode-form-embed.js 2 years ago shortcode-form-embed.min.js 2 years ago tool-import-entries.js 2 years ago tool-import-entries.min.js 2 years ago tools.js 1 month ago tools.min.js 1 month ago upgrade.js 1 month ago upgrade.min.js 1 month ago
form-builder.js
9059 lines
1 /* global evf_data, jconfirm, PerfectScrollbar, evfSetClipboard, evfClearClipboard */
2 (function ($, evf_data) {
3 var $builder;
4
5 var EVFPanelBuilder = {
6 /**
7 * Start the panel builder.
8 */
9 init: function () {
10 $(document).ready(function ($) {
11 if (!$('evf-panel-integrations-button a').hasClass('active')) {
12 $('#everest-forms-panel-integrations')
13 .find('.everest-forms-panel-sidebar a')
14 .first()
15 .addClass('active');
16 if (
17 $('#everest-forms-panel-integrations')
18 .find('.everest-forms-panel-sidebar a')
19 .hasClass('active')
20 ) {
21 $('#everest-forms-panel-integrations')
22 .find('.everest-forms-panel-sidebar a')
23 .next('.everest-forms-active-connections')
24 .first()
25 .addClass('active');
26 }
27 $('.everest-forms-panel-content')
28 .find('.evf-panel-content-section')
29 .first()
30 .addClass('active');
31 }
32
33 //To remove script tag.
34 $(document).on(
35 'input change',
36 '.everest-forms-field-option-row-choices input[name$="[label]"]',
37 function (e) {
38 var $value = $(this).val();
39 $(this).val(
40 $value.replace(/<\s*script/gi, '').replace(/\s+on\w+\s*=/gi, ' '),
41 );
42 },
43 );
44
45 $(document).on(
46 'input change',
47 'input[name$="[required-field-message]"]',
48 function (e) {
49 var $value = $(this).val();
50
51 const htmlTagPattern = /<[^>]*>/;
52 const htmlEntityPattern = /&[a-zA-Z0-9#]+;/;
53
54 if (htmlTagPattern.test($value) || htmlEntityPattern.test($value)) {
55 $(this).val('');
56 } else {
57 $(this).val(
58 $value
59 .replace(/<\s*script/gi, '')
60 .replace(/\s+on\w+\s*=/gi, ' '),
61 );
62 }
63 },
64 );
65
66 $(document).on(
67 'click',
68 '.back-button, [href*="evf-builder"]:not([href*="form_id"])',
69 function (e) {
70 if (!window.location.search.includes('form_id')) {
71 return;
72 }
73 e.preventDefault();
74 window.location.href =
75 window.location.origin +
76 window.location.pathname +
77 '?page=evf-builder';
78 },
79 );
80
81 /**
82 * Disable row when form is disabled.
83 *
84 * @since 3.2.0
85 */
86 $('.wp-list-table .everest-forms-toggle-form input').each(function () {
87 if (!$(this).prop('checked')) {
88 $(this)
89 .closest('tr')
90 .find('td')
91 .not('.has-row-actions, .column-enabled')
92 .addClass('evf-disable-row');
93 } else {
94 $(this)
95 .closest('tr')
96 .find('td')
97 .not('.has-row-actions, .column-enabled')
98 .removeClass('evf-disable-row');
99 }
100 });
101 });
102
103 $(document).ready(function ($) {
104 if ('1' === $('.everest-forms-min-max-date-format input').val()) {
105 $('.everest-forms-min-date')
106 .addClass('flatpickr-field')
107 .flatpickr({
108 disableMobile: true,
109 onChange: function (selectedDates, dateStr, instance) {
110 $('.everest-forms-min-date').val(dateStr);
111 },
112 onOpen: function (selectedDates, dateStr, instance) {
113 instance.set('maxDate', $('.everest-forms-max-date').val());
114 },
115 });
116
117 $('.everest-forms-max-date')
118 .addClass('flatpickr-field')
119 .flatpickr({
120 disableMobile: true,
121 onChange: function (selectedDates, dateStr, instance) {
122 $('.everest-forms-max-date').val(dateStr);
123 },
124 onOpen: function (selectedDates, dateStr, instance) {
125 instance.set('minDate', $('.everest-forms-min-date').val());
126 },
127 });
128 }
129
130 $('.everest-forms-min-max-date-format').each(function () {
131 if ($(this).find('input[type="checkbox"]').is(':checked')) {
132 $(this)
133 .next('.everest-forms-min-max-date-range-format')
134 .removeClass('everest-forms-hidden');
135 $(this)
136 .next()
137 .next('.everest-forms-min-max-date-option')
138 .removeClass('everest-forms-hidden');
139 if (
140 $(this)
141 .next('.everest-forms-min-max-date-range-format')
142 .find('input[type="checkbox"]')
143 .is(':checked')
144 ) {
145 $(this)
146 .next()
147 .next()
148 .next('.everest-forms-min-max-date-range-option')
149 .removeClass('everest-forms-hidden');
150 $(this)
151 .next()
152 .next('.everest-forms-min-max-date-option')
153 .addClass('everest-forms-hidden');
154 }
155 } else {
156 $(this)
157 .next()
158 .next()
159 .next('.everest-forms-min-max-date-range-option')
160 .addClass('everest-forms-hidden');
161 $(this)
162 .next('.everest-forms-min-max-date-range-format')
163 .addClass('everest-forms-hidden');
164 $(this)
165 .next()
166 .next('.everest-forms-min-max-date-option')
167 .addClass('everest-forms-hidden');
168 }
169 });
170
171 $('.everest-forms-row-option select.evf-field-show-hide').each(
172 function () {
173 $(this).find('[selected="selected"]').prop('selected', true);
174 },
175 );
176 });
177
178 if (
179 $('#everest-forms-builder').find('.everest-forms-field-file-upload')
180 .length > 0
181 ) {
182 if (!evf_data.is_pro) {
183 $('#everest-forms-add-fields-file-upload').addClass(
184 'evf-one-time-draggable-field',
185 );
186 }
187 }
188
189 if (
190 $('#everest-forms-builder').find(
191 '.everest-forms-field-payment-gateway-selector',
192 ).length > 0
193 ) {
194 $('#everest-forms-add-fields-payment-gateway-selector').addClass(
195 'evf-one-time-draggable-field',
196 );
197 }
198 EVFPanelBuilder.syncPaymentMethodDependentFields();
199
200 // Keep Payment Gateway field availability in sync with Payments tab toggles.
201 $(document).on(
202 'change click',
203 [
204 '#everest-forms-panel-field-paymentsstripe-enable_stripe',
205 '#everest-forms-panel-field-paypal-enable_paypal',
206 // Razorpay toggle id varies by version/addon; support both.
207 '#everest-forms-panel-field-paymentsrazorpay-enable_razorpay',
208 '#everest-forms-panel-field-razorpay-enable_razorpay',
209 'input[name*="[razorpay]"][name*="enable_razorpay"]',
210 '#everest-forms-panel-field-authorize_net-enable_authorize_net',
211 '#everest-forms-panel-field-square-enable_square',
212 '#everest-forms-panel-field-paymentsmollie-enable_mollie',
213 ].join(','),
214 function () {
215 EVFPanelBuilder.syncPaymentMethodDependentFields();
216 },
217 );
218
219 // Hard-block enabling any payment gateway when Payment Gateway field is present.
220 // Some addons use custom toggle wrappers that can still flip even if the underlying checkbox is disabled,
221 // so we intercept the interaction and immediately revert.
222 (function () {
223 var blockedSelectors = [
224 '#everest-forms-panel-field-paymentsstripe-enable_stripe',
225 '#everest-forms-panel-field-paypal-enable_paypal',
226 // Razorpay toggle id varies by version/addon; support both.
227 '#everest-forms-panel-field-paymentsrazorpay-enable_razorpay',
228 '#everest-forms-panel-field-razorpay-enable_razorpay',
229 'input[name*="[razorpay]"][name*="enable_razorpay"]',
230 '#everest-forms-panel-field-authorize_net-enable_authorize_net',
231 '#everest-forms-panel-field-square-enable_square',
232 '#everest-forms-panel-field-paymentsmollie-enable_mollie',
233 ];
234
235 // Capture-phase blocker: prevents addon handlers from running at all,
236 // avoiding a brief UI flash (settings rows showing) before our popup appears.
237 // We also guard "change" to catch programmatic enables.
238 if (!window.__evfPgwPaymentsToggleCaptureBound) {
239 window.__evfPgwPaymentsToggleCaptureBound = true;
240
241 function evfPgwFieldPresent() {
242 return (
243 $('#everest-forms-builder')
244 .find('.everest-forms-field-payment-gateway-selector')
245 .length > 0
246 );
247 }
248
249 function evfFindBlockedRootFromEvent(evt) {
250 if (!evt || !evt.target || !evt.target.closest) {
251 return null;
252 }
253 return evt.target.closest(blockedSelectors.join(','));
254 }
255
256 function evfFindCheckbox($root) {
257 if (!$root || !$root.length) {
258 return $();
259 }
260 if ($root.is('input[type="checkbox"]')) {
261 return $root;
262 }
263 var $in = $root.find('input[type="checkbox"]').first();
264 if ($in.length) {
265 return $in;
266 }
267 return $root.closest('li').find('input[type="checkbox"]').first();
268 }
269
270 function evfShowPopup() {
271 var title = 'Field Unavailable';
272 var closeText = (evf_data && evf_data.i18n_close) || 'Close';
273 var content =
274 'Payment Gateway is currently in use. Remove Payment Gateway to enable this field.';
275
276 if (typeof $.confirm === 'function') {
277 $.confirm({
278 title: title,
279 content: content,
280 buttons: {
281 close: {
282 text: closeText,
283 },
284 },
285 });
286 } else {
287 window.alert(content);
288 }
289 }
290
291 function evfBlockEnable(evt) {
292 if (!evfPgwFieldPresent()) {
293 return;
294 }
295
296 var root = evfFindBlockedRootFromEvent(evt);
297 if (!root) {
298 return;
299 }
300
301 var $checkbox = evfFindCheckbox($(root));
302
303 // Only show notice when enabling (unchecked -> checked).
304 // If already checked, user is disabling; allow silently.
305 if ($checkbox.length && $checkbox.is(':checked')) {
306 return;
307 }
308
309 evt.preventDefault();
310 evt.stopPropagation();
311
312 if ($checkbox.length) {
313 $checkbox.prop('checked', false);
314 }
315
316 evfShowPopup();
317 }
318
319 ['pointerdown', 'mousedown', 'click'].forEach(function (type) {
320 document.addEventListener(type, evfBlockEnable, true);
321 });
322
323 // Catch programmatic enables (change fires after state flips).
324 document.addEventListener(
325 'change',
326 function (evt) {
327 if (!evfPgwFieldPresent()) {
328 return;
329 }
330 var root = evfFindBlockedRootFromEvent(evt);
331 if (!root) {
332 return;
333 }
334 var $checkbox = evfFindCheckbox($(root));
335 if ($checkbox.length && $checkbox.is(':checked')) {
336 evt.preventDefault();
337 evt.stopPropagation();
338 $checkbox.prop('checked', false);
339 evfShowPopup();
340 }
341 },
342 true,
343 );
344 }
345
346 // Note: we intentionally rely on the capture-phase blocker above.
347 // A bubble-phase handler can run after the checkbox state flips, which would show the
348 // notice when DISABLING. Capture-phase guarantees we only block ENABLE attempts.
349 })();
350
351
352 if (!$('evf-panel-payments-button a').hasClass('active')) {
353 $('#everest-forms-panel-payments')
354 .find('.everest-forms-panel-sidebar a')
355 .first()
356 .addClass('active');
357 $('.everest-forms-panel-content')
358 .find('.evf-payment-setting-content')
359 .first()
360 .addClass('active');
361 }
362
363 // Copy shortcode from the builder.
364 $(document.body)
365 .find('#copy-shortcode')
366 .on('click', this.copyShortcode)
367 .on('aftercopy', this.copySuccess)
368 .on('aftercopyfailure', this.copyFail);
369
370 // Copy shortcode from form list table.
371 $(document.body)
372 .find('.evf-copy-shortcode')
373 .each(function () {
374 $(this)
375 .on('click', EVFPanelBuilder.copyShortcode)
376 .on('aftercopy', EVFPanelBuilder.copySuccess)
377 .on('aftercopyfailure', EVFPanelBuilder.copyFail);
378 });
379
380 // Document ready.
381 $(document).ready(EVFPanelBuilder.ready);
382
383 // Page load.
384 $(window).on('load', EVFPanelBuilder.load);
385
386 // Initialize builder UI fields.
387 $(document.body)
388 .on('evf-init-builder-fields', function () {
389 EVFPanelBuilder.bindFields();
390 })
391 .trigger('evf-init-builder-fields');
392
393 // Adjust builder width.
394 $(document.body)
395 .on('adjust_builder_width', function () {
396 var adminMenuWidth = $('#adminmenuwrap').width();
397
398 $('#everest-forms-builder-form').css({
399 width: 'calc(100% - ' + adminMenuWidth + 'px)',
400 });
401 })
402 .trigger('adjust_builder_width');
403
404 $(document.body).on('click', '#collapse-button', function () {
405 $('#everest-forms-builder-form').width('');
406 $(document.body).trigger('adjust_builder_width');
407 });
408
409 $(window)
410 .on('resize orientationchange', function () {
411 var resizeTimer;
412
413 clearTimeout(resizeTimer);
414 resizeTimer = setTimeout(function () {
415 $('#everest-forms-builder').width('');
416 $(document.body).trigger('adjust_builder_width');
417 }, 250);
418 })
419 .trigger('resize');
420
421 EVFPanelBuilder.bindPrivacyPolicyActions();
422 $(document.body).on(
423 'evf_field_drop_complete',
424 function (e, field_type, dragged_field_id) {
425 EVFPanelBuilder.bindEditMetaKey(dragged_field_id);
426 // Keep Payment Gateway ↔ Payments tab constraints in sync after any field drop.
427 if (EVFPanelBuilder.syncPaymentMethodDependentFields) {
428 EVFPanelBuilder.syncPaymentMethodDependentFields();
429 }
430
431 // Set defaults in privacy policy field.
432 if ('privacy-policy' === field_type) {
433 var consent_message = evf_data.i18n_privacy_policy_consent_message;
434 $('#everest-forms-field-' + dragged_field_id)
435 .find('.evf-privacy-policy-consent-message')
436 .html(consent_message);
437 $('#everest-forms-field-option-' + dragged_field_id)
438 .find('.evf-privacy-policy-consent-message')
439 .val(consent_message);
440 $(
441 '.everest-forms-field-options #everest-forms-field-option-row-' +
442 dragged_field_id +
443 '-required',
444 )
445 .find('input')
446 .click();
447 }
448
449 if ('country' === field_type) {
450 $(
451 '#everest-forms-field-option-row-' +
452 dragged_field_id +
453 '-default',
454 )
455 .find('select.evf-select2-multiple > option')
456 .prop('selected', true);
457 }
458
459 // Payment Gateway field: server-rendered field-map options use saved form data;
460 // repopulate from the builder canvas so existing fields appear without reload.
461 if ('payment-gateway-selector' === field_type) {
462 EVFPanelBuilder.refreshFieldMapSelectsInContainer(
463 '#everest-forms-field-option-' + dragged_field_id,
464 dragged_field_id,
465 );
466 }
467 },
468 );
469
470 // Rating point validation error tips.
471 $(document.body)
472 .on('blur', '.evf-number-of-stars[type=number]', function () {
473 $('.evf_error_tip').fadeOut('100', function () {
474 $(this).remove();
475 });
476 })
477
478 .on('change click', '.evf-number-of-stars[type=number]', function (e) {
479 var number_of_stars = parseInt($(this).val(), 10);
480
481 if (number_of_stars > 100) {
482 $(this).val('100');
483 EVFPanelBuilder.livePreviewNumberOfRating($(this));
484 }
485 })
486
487 .on('keyup click', '.evf-number-of-stars[type=number]', function () {
488 var number_of_stars = parseInt($(this).val(), 10);
489
490 if (number_of_stars > 100) {
491 $(document.body).triggerHandler('evf_add_error_tip', [
492 $(this),
493 'i18n_field_rating_greater_than_max_value_error',
494 evf_data,
495 ]);
496 } else {
497 $(document.body).triggerHandler('evf_remove_error_tip', [
498 $(this),
499 'i18n_field_rating_greater_than_max_value_error',
500 ]);
501 }
502 });
503
504 // Live effect for Rating field Number of Stars option.
505 $(document).on(
506 'keyup mouseup',
507 '.everest-forms-field-option-row-number_of_stars input',
508 function () {
509 EVFPanelBuilder.livePreviewNumberOfRating(this);
510 },
511 );
512
513 // Live effect for Rating field icon option.
514 $(document).on(
515 'change',
516 '.everest-forms-field-option-row-rating-icon input[type=radio]',
517 function () {
518 var $this = $(this),
519 value = $this.val(),
520 id = $this.parent().data('field-id'),
521 icon_color = $('#everest-forms-field-' + id + ' .rating-icon')
522 .find('svg')
523 .first()
524 .css('fill');
525 ($icons = $('#everest-forms-field-' + id + ' .rating-icon')),
526 (iconClass =
527 '<svg width="32" height="32" viewBox="0 0 32 32" style="fill:' +
528 icon_color +
529 '"><path d="M20.33 11.45L16 2.69l-4.33 8.76L2 12.86l7 6.82-1.65 9.64L16 24.77l8.65 4.55L23 19.68l7-6.82-9.67-1.41z"/></svg>');
530 if ('heart' === value) {
531 iconClass =
532 '<svg width="32" height="32" viewBox="0 0 32 32" style="fill:' +
533 icon_color +
534 '"><path d="M27.66 16.94L16 28 4.34 16.94a7.31 7.31 0 0 1 0-10.72A8.21 8.21 0 0 1 10 4a6.5 6.5 0 0 1 5 2l1 1s.88-.89 1-1a6.5 6.5 0 0 1 5-2 8.21 8.21 0 0 1 5.66 2.22 7.31 7.31 0 0 1 0 10.72z"/></svg>';
535 } else if ('thumb' === value) {
536 iconClass =
537 '<svg width="32" height="32" viewBox="0 0 32 32" style="fill:' +
538 icon_color +
539 '"><path d="M30 14.88a3.42 3.42 0 0 0-3.36-3.36h-4.85l.14-.42a2.42 2.42 0 0 1 .2-.39c.08-.14.14-.24.17-.31.21-.4.37-.72.48-1a7.39 7.39 0 0 0 .33-1.05A5.71 5.71 0 0 0 23 4a3.48 3.48 0 0 0-3-2 1.61 1.61 0 0 0-1.43.89C18.34 3.13 17 7 17 7a5.44 5.44 0 0 1-1 2c-.57.75-2.6 3-3.2 3.71s-1.05 1-1.33 1C10 13.74 10 15.71 10 16v9c0 .3 0 2.2 1.52 2.2a12.7 12.7 0 0 1 2.76.77A15.6 15.6 0 0 0 21 30a8.9 8.9 0 0 0 5.74-1.92C30 25 30 15.88 30 14.88zM5 14a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0v-7a3 3 0 0 0-3-3zm0 11a1 1 0 1 1 1-1 1 1 0 0 1-1 1z"/></svg>';
540 } else if ('smiley' === value) {
541 iconClass =
542 '<svg width="32" height="32" viewBox="0 0 32 32" style="fill:' +
543 icon_color +
544 '"><path d="M16 2a14 14 0 1 0 14 14A14 14 0 0 0 16 2zm4 8a2 2 0 1 1-2 2 2 2 0 0 1 2-2zm-8 0a2 2 0 1 1-2 2 2 2 0 0 1 2-2zm4 14a9.23 9.23 0 0 1-8.16-4.89l1.32-.71a7.76 7.76 0 0 0 13.68 0l1.32.71A9.23 9.23 0 0 1 16 24z"/></svg>';
545 } else if ('bulb' === value) {
546 iconClass =
547 '<svg width="32" height="32" viewBox="0 0 32 32" style="fill:' +
548 icon_color +
549 '"><path d="M16 2.25A9.76 9.76 0 0 0 6.25 12c0 3.21 2 5.68 3.52 7.48A6.28 6.28 0 0 1 11.25 23a.76.76 0 0 0 .75.75h8a.74.74 0 0 0 .74-.64 10 10 0 0 1 1.53-3.69c.24-.35.49-.7.75-1.06 1.28-1.77 2.73-3.79 2.73-6.36A9.76 9.76 0 0 0 16 2.25zM20 25.25h-8a.75.75 0 0 0 0 1.5h8a.75.75 0 0 0 0-1.5zM19 28.25h-6a.75.75 0 0 0 0 1.5h6a.75.75 0 0 0 0-1.5z"/></svg>';
550 }
551
552 $icons.html(iconClass);
553 },
554 );
555
556 // Live effect for Rating field icon color option.
557 $(document).ready(function ($) {
558 $(
559 '.everest-forms-field-option-row-icon_color input.colorpicker',
560 ).wpColorPicker({
561 change: function (event) {
562 var $this = $(this),
563 value = $this.val(),
564 id = $this
565 .closest('.everest-forms-field-option-row')
566 .data('field-id'),
567 $icons = $('#everest-forms-field-' + id + ' .rating-icon svg');
568
569 $icons.css('fill', value);
570 },
571 });
572 });
573
574 $(document).on('click', '.evf-edit-meta-key-icon', function () {
575 var $wrapper = $(this).closest('.evf-meta-key-input-wrapper'),
576 $input = $wrapper.find('.evf-input-meta-key'),
577 $original_value = $(this).data('meta_key');
578
579 $input.prop('readonly', false).focus();
580
581 $(document).find('.evf-meta-key-copy-btn').hide();
582 $(this).hide();
583
584 if ($wrapper.find('.evf-meta-key-actions').length === 0) {
585 $wrapper.append(`
586 <span class="evf-meta-key-actions">
587 <span class="evf-save-meta-key-icon" style="cursor: pointer;">
588 <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
589 <rect x="1.20078" y="0.600195" width="22.8" height="22.8" rx="1.2" fill="white"/>
590 <rect x="1.20078" y="0.600195" width="22.8" height="22.8" rx="1.2" stroke="#E1E1E1" stroke-width="0.8"/>
591 <path d="M17.2689 8.5L10.8522 14.9167L7.93555 12" stroke="#383838" stroke-width="1.16667" stroke-linecap="round" stroke-linejoin="round"/>
592 </svg>
593 </span>
594 <span class="evf-cancel-meta-key-icon" style="cursor: pointer;" data-original_value="${$original_value}">
595 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
596 <rect x="0.800391" y="0.600195" width="22.8" height="22.8" rx="1.2" fill="white"/>
597 <rect x="0.800391" y="0.600195" width="22.8" height="22.8" rx="1.2" stroke="#E1E1E1" stroke-width="0.8"/>
598 <path d="M12.2026 12.8161L9.34427 15.6745C9.23733 15.7814 9.10122 15.8349 8.93594 15.8349C8.77066 15.8349 8.63455 15.7814 8.5276 15.6745C8.42066 15.5675 8.36719 15.4314 8.36719 15.2661C8.36719 15.1009 8.42066 14.9648 8.5276 14.8578L11.3859 11.9995L8.5276 9.14115C8.42066 9.0342 8.36719 8.89809 8.36719 8.73281C8.36719 8.56753 8.42066 8.43142 8.5276 8.32448C8.63455 8.21753 8.77066 8.16406 8.93594 8.16406C9.10122 8.16406 9.23733 8.21753 9.34427 8.32448L12.2026 11.1828L15.0609 8.32448C15.1679 8.21753 15.304 8.16406 15.4693 8.16406C15.6345 8.16406 15.7707 8.21753 15.8776 8.32448C15.9845 8.43142 16.038 8.56753 16.038 8.73281C16.038 8.89809 15.9845 9.0342 15.8776 9.14115L13.0193 11.9995L15.8776 14.8578C15.9845 14.9648 16.038 15.1009 16.038 15.2661C16.038 15.4314 15.9845 15.5675 15.8776 15.6745C15.7707 15.7814 15.6345 15.8349 15.4693 15.8349C15.304 15.8349 15.1679 15.7814 15.0609 15.6745L12.2026 12.8161Z" fill="#383838"/>
599 </svg>
600 </span>
601 </span>
602 `);
603 }
604
605 if ($wrapper.find('.evf-meta-key-warning').length === 0) {
606 $wrapper.after(`
607 <div class="evf-meta-key-warning" >
608 <div class="everest-forms-meta-key-warning-icon">
609 <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
610 <path fill-rule="evenodd" clip-rule="evenodd" d="M7.99935 1.99984C4.68564 1.99984 1.99935 4.68613 1.99935 7.99984C1.99935 11.3135 4.68564 13.9998 7.99935 13.9998C11.3131 13.9998 13.9993 11.3135 13.9993 7.99984C13.9993 4.68613 11.3131 1.99984 7.99935 1.99984ZM0.666016 7.99984C0.666016 3.94975 3.94926 0.666504 7.99935 0.666504C12.0494 0.666504 15.3327 3.94975 15.3327 7.99984C15.3327 12.0499 12.0494 15.3332 7.99935 15.3332C3.94926 15.3332 0.666016 12.0499 0.666016 7.99984ZM7.99935 7.33317C8.36754 7.33317 8.66602 7.63165 8.66602 7.99984V10.6665C8.66602 11.0347 8.36754 11.3332 7.99935 11.3332C7.63116 11.3332 7.33268 11.0347 7.33268 10.6665V7.99984C7.33268 7.63165 7.63116 7.33317 7.99935 7.33317ZM7.99935 4.6665C7.63116 4.6665 7.33268 4.96498 7.33268 5.33317C7.33268 5.70136 7.63116 5.99984 7.99935 5.99984H8.00602C8.37421 5.99984 8.67268 5.70136 8.67268 5.33317C8.67268 4.96498 8.37421 4.6665 8.00602 4.6665H7.99935Z" fill="#EE9936"/>
611 </svg>
612 </div>
613 <div>
614 <strong>Caution:</strong> We don't recommend changing this unless necessary, as it affects data retrieval.
615 </div>
616 </div>
617 `);
618 }
619
620 $(document).on('click', '.evf-cancel-meta-key-icon', function () {
621 var $wrapper = $(this).closest('.evf-meta-key-input-wrapper'),
622 $input = $wrapper.find('.evf-input-meta-key'),
623 originalValue = $(this).data('original_value');
624 $(document).find('.evf-meta-key-copy-btn').show();
625 $input.val(originalValue);
626
627 $input.prop('readonly', true);
628
629 $wrapper.find('.evf-meta-key-actions').remove();
630 $wrapper.find('.evf-edit-meta-key-icon').show();
631 $wrapper.next('.evf-meta-key-warning').remove();
632 });
633
634 $(document).on('click', '.evf-save-meta-key-icon', function () {
635 var $wrapper = $(this).closest('.evf-meta-key-input-wrapper'),
636 $input = $wrapper.find('.evf-input-meta-key');
637 $(document).find('.evf-meta-key-copy-btn').show();
638 $input.prop('readonly', true);
639
640 $wrapper.find('.evf-meta-key-actions').remove();
641 $wrapper.find('.evf-edit-meta-key-icon').show();
642 $wrapper.next('.evf-meta-key-warning').remove();
643 });
644 });
645 },
646
647 /**
648 * Copy shortcode.
649 *
650 * @param {Object} evt Copy event.
651 */
652 copyShortcode: function (evt) {
653 evfClearClipboard();
654 evfSetClipboard(
655 $(this).closest('.evf-shortcode-field').find('input').val(),
656 $(this),
657 );
658 evt.preventDefault();
659 },
660
661 /**
662 * Display a "Copied!" tip when success copying.
663 */
664 copySuccess: function () {
665 $(this)
666 .tooltipster('content', $(this).attr('data-copied'))
667 .trigger('mouseenter')
668 .on('mouseleave', function () {
669 var $this = $(this);
670
671 setTimeout(function () {
672 $this.tooltipster('content', $this.attr('data-tip'));
673 }, 1000);
674 });
675 },
676
677 /**
678 * Displays the copy error message when failure copying.
679 */
680 copyFail: function () {
681 $(this).closest('.evf-shortcode-field').find('input').focus().select();
682 },
683
684 /**
685 * Page load.
686 *
687 * @since 1.0.0
688 */
689 load: function () {
690 $('.everest-forms-overlay').fadeOut();
691 },
692
693 /**
694 * Document ready.
695 *
696 * @since 1.0.0
697 */
698 ready: function () {
699 // Cache builder element.
700 $builder = $('#everest-forms-builder');
701
702 // Bind all actions.
703 EVFPanelBuilder.bindUIActions();
704
705 // Bind edit form actions.
706 EVFPanelBuilder.bindEditActions();
707
708 // jquery-confirm defaults.
709 jconfirm.defaults = {
710 closeIcon: true,
711 backgroundDismiss: true,
712 escapeKey: true,
713 animationBounce: 1,
714 useBootstrap: false,
715 theme: 'modern',
716 boxWidth: '400px',
717 columnClass: 'evf-responsive-class',
718 };
719
720 // Enable Perfect Scrollbar.
721 if ('undefined' !== typeof PerfectScrollbar) {
722 var tab_content = $('.everest-forms-tab-content'),
723 evf_panel = $('.everest-forms-panel');
724
725 if (tab_content.length >= 1) {
726 window.evf_tab_scroller = new PerfectScrollbar(
727 '.everest-forms-tab-content',
728 {
729 suppressScrollX: true,
730 },
731 );
732 }
733
734 evf_panel.each(function () {
735 var section_panel = $(this);
736 var panel_id = section_panel.attr('id');
737
738 if (section_panel.find('.everest-forms-panel-sidebar').length >= 1) {
739 window.evf_setting_scroller = new PerfectScrollbar(
740 '#' + panel_id + ' .everest-forms-panel-sidebar',
741 );
742 }
743 });
744 }
745
746 // Enable Limit length.
747 $builder.on(
748 'change',
749 '.everest-forms-field-option-row-limit_enabled input',
750 function (event) {
751 EVFPanelBuilder.updateTextFieldsLimitControls(
752 $(event.target)
753 .parents('.everest-forms-field-option-row-limit_enabled')
754 .data().fieldId,
755 event.target.checked,
756 );
757 },
758 );
759
760 $builder.on(
761 'change',
762 '.everest-forms-field-option-row-min_length_enabled input',
763 function (event) {
764 EVFPanelBuilder.updateTextFieldsMinLengthControls(
765 $(event.target)
766 .parents('.everest-forms-field-option-row-min_length_enabled')
767 .data().fieldId,
768 event.target.checked,
769 );
770 },
771 );
772
773 // Enable enhanced select.
774 $builder.on(
775 'change',
776 '.everest-forms-field-option-select .everest-forms-field-option-row-enhanced_select input',
777 function (event) {
778 EVFPanelBuilder.enhancedSelectFieldStyle(
779 $(event.target)
780 .parents('.everest-forms-field-option-row-enhanced_select')
781 .data().fieldId,
782 event.target.checked,
783 );
784 },
785 );
786
787 // Enable Multiple options.
788 $builder.on(
789 'click',
790 '.everest-forms-field-option-row-choices .everest-forms-btn-group span',
791 function (event) {
792 if (
793 $(this).hasClass('upgrade-modal') &&
794 'checkbox' === $(this).data('type')
795 ) {
796 $(this).parent().find('span').addClass('is-active');
797 $(this).removeClass('is-active');
798 EVFPanelBuilder.updateEnhandedSelectField(
799 $(event.target)
800 .parents('.everest-forms-field-option-row-choices')
801 .data().fieldId,
802 false,
803 );
804 } else {
805 $(this).parent().find('span').removeClass('is-active');
806 $(this).addClass('is-active');
807 EVFPanelBuilder.updateEnhandedSelectField(
808 $(event.target)
809 .parents('.everest-forms-field-option-row-choices')
810 .data().fieldId,
811 'multiple' === $(this).data('selection'),
812 );
813 }
814
815 // Show 'Select All' Checkbox for Dropdown field only if multiple selection is active
816 if (
817 'multiple' === $(this).data('selection') &&
818 'checkbox' === $(this).data('type') &&
819 $(this).hasClass('is-active')
820 ) {
821 var $field_id = $(this).parent().parent().data('field-id');
822 $(
823 '#everest-forms-field-option-row-' + $field_id + '-select_all',
824 ).show();
825 } else {
826 var $field_id = $(this).parent().parent().data('field-id');
827 $(
828 '#everest-forms-field-option-row-' + $field_id + '-select_all',
829 ).hide();
830 }
831 },
832 );
833
834 // By default hide the 'Select All' checkbox for Dropdown field
835 $(document.body).on(
836 'click',
837 '.everest-forms-field, .everest-forms-field-select[data-field-type="select"]',
838 function () {
839 $builder
840 .find(
841 '.everest-forms-field-option-row-choices .everest-forms-btn-group span',
842 )
843 .each(function () {
844 var $field_id = $(this).parent().parent().data('field-id');
845
846 if (
847 'multiple' === $(this).data('selection') &&
848 'checkbox' === $(this).data('type') &&
849 $(this).hasClass('is-active')
850 ) {
851 $('#everest-forms-field-option-' + $field_id + '-select_all')
852 .parent()
853 .parent()
854 .parent()
855 .show();
856 } else {
857 $('#everest-forms-field-option-' + $field_id + '-select_all')
858 .parent()
859 .parent()
860 .parent()
861 .hide();
862 }
863 });
864 },
865 );
866
867 // Search fields input.
868 $builder.on('keyup', '.everest-forms-search-fields', function () {
869 var searchTerm = $(this).val().toLowerCase();
870
871 // Show/hide fields.
872 $('.evf-registered-item').each(function () {
873 var $this = $(this);
874 (field_type = $this.data('field-type')),
875 (field_label = $this.text().toLowerCase());
876
877 if (
878 field_type.search(searchTerm) > -1 ||
879 field_label.search(searchTerm) > -1
880 ) {
881 $this.addClass('evf-searched-item');
882 $this.show();
883 } else {
884 $this.removeClass('evf-searched-item');
885 $this.hide();
886 }
887 });
888
889 // Show/hide field group.
890 $('.everest-forms-add-fields-group').each(function () {
891 var count = $(this).find(
892 '.evf-registered-item.evf-searched-item',
893 ).length;
894
895 if (0 >= count) {
896 $(this).hide();
897 } else {
898 $(this).show();
899 }
900 });
901
902 // Show/hide fields not found indicator.
903 if ($('.evf-registered-item.evf-searched-item').length) {
904 $('.everest-forms-fields-not-found').addClass('hidden');
905 } else {
906 $('.everest-forms-fields-not-found').removeClass('hidden');
907 }
908 });
909
910 // Collapse the form builder
911 $builder.on('click', '#evf-collapse', function (event) {
912 event.preventDefault();
913 var $this = $(this);
914
915 if ($this.hasClass('open')) {
916 $this.removeClass('open').addClass('close');
917 $this
918 .closest('.everest-forms-panel-sidebar-content')
919 .removeClass('collapsed');
920 } else {
921 $this.removeClass('close').addClass('open');
922 $this
923 .closest('.everest-forms-panel-sidebar-content')
924 .addClass('collapsed');
925 }
926 });
927
928 // Action available for each binding.
929 $(document).trigger('everest_forms_ready');
930 },
931
932 /**
933 * Update text fields limit controls.
934 *
935 * @since 1.5.10
936 *
937 * @param {number} fieldId Field ID.
938 * @param {bool} checked Whether an option is checked or not.
939 */
940 updateTextFieldsLimitControls: function (fieldId, checked) {
941 if (!checked) {
942 $(
943 '#everest-forms-field-option-row-' + fieldId + '-limit_controls',
944 ).addClass('everest-forms-hidden');
945 } else {
946 $(
947 '#everest-forms-field-option-row-' + fieldId + '-limit_controls',
948 ).removeClass('everest-forms-hidden');
949 }
950 },
951
952 /**
953 * Update text fields min length controls.
954 *
955 * @since 1.5.10
956 *
957 * @param {number} fieldId Field ID.
958 * @param {bool} checked Whether an option is checked or not.
959 */
960 updateTextFieldsMinLengthControls: function (fieldId, checked) {
961 if (!checked) {
962 $(
963 '#everest-forms-field-option-row-' + fieldId + '-min_length_controls',
964 ).addClass('everest-forms-hidden');
965 } else {
966 $(
967 '#everest-forms-field-option-row-' + fieldId + '-min_length_controls',
968 ).removeClass('everest-forms-hidden');
969 }
970 },
971
972 /**
973 * Enhanced select fields style.
974 *
975 * @since 1.7.1
976 *
977 * @param {number} fieldId Field ID.
978 * @param {bool} checked Whether an option is checked or not.
979 */
980 enhancedSelectFieldStyle: function (fieldId, checked) {
981 var $primary = $('#everest-forms-field-' + fieldId + ' .primary-input'),
982 isEnhanced = $(
983 '#everest-forms-field-option-' + fieldId + '-enhanced_select',
984 ).is(':checked');
985
986 if (checked && isEnhanced && $primary.prop('multiple')) {
987 $primary.addClass('evf-enhanced-select');
988 $(document.body).trigger('evf-enhanced-select-init');
989 } else {
990 $primary.removeClass('evf-enhanced-select enhanced');
991 $primary.filter('.select2-hidden-accessible').selectWoo('destroy');
992 }
993 },
994
995 /**
996 * Update enhanced select field component.
997 *
998 * @since 1.7.1
999 *
1000 * @param {number} fieldId Field ID.
1001 * @param {bool} isMultiple Whether an option is multiple or not.
1002 */
1003 updateEnhandedSelectField: function (fieldId, isMultiple) {
1004 var $primary = $('#everest-forms-field-' + fieldId + ' .primary-input'),
1005 $placeholder = $primary.find('.placeholder'),
1006 $hiddenField = $(
1007 '#everest-forms-field-option-' + fieldId + '-multiple_choices',
1008 ),
1009 $optionChoicesItems = $(
1010 '#everest-forms-field-option-row-' +
1011 fieldId +
1012 '-choices input.default',
1013 ),
1014 selectedChoices = $optionChoicesItems.filter(':checked');
1015
1016 // Update hidden field value.
1017 $hiddenField.val(isMultiple ? 1 : 0);
1018
1019 // Add/remove a `multiple` attribute.
1020 $primary.prop('multiple', isMultiple);
1021
1022 // Change a `Choices` fields type:
1023 // radio - needed for single selection
1024 // checkbox - needed for multiple selection
1025 $optionChoicesItems.prop('type', isMultiple ? 'checkbox' : 'radio');
1026
1027 // For single selection we can choose only one.
1028 if (!isMultiple && selectedChoices.length) {
1029 $optionChoicesItems.prop('checked', false);
1030 $(selectedChoices.get(0)).prop('checked', true);
1031 }
1032
1033 // Toggle selection for a placeholder.
1034 if ($placeholder.length && isMultiple) {
1035 $placeholder.prop('selected', !isMultiple);
1036 }
1037
1038 // Update a primary field.
1039 EVFPanelBuilder.enhancedSelectFieldStyle(fieldId, isMultiple);
1040 },
1041
1042 /**
1043 * Element bindings.
1044 *
1045 * @since 1.0.0
1046 */
1047 bindUIActions: function () {
1048 EVFPanelBuilder.bindDefaultTabs();
1049 EVFPanelBuilder.checkEmptyGrid();
1050 EVFPanelBuilder.bindFields();
1051 EVFPanelBuilder.bindFormPreview();
1052 EVFPanelBuilder.bindFormPreviewWithKeyEvent();
1053 EVFPanelBuilder.bindFormEntriesWithKeyEvent();
1054 EVFPanelBuilder.bindGridSwitcher();
1055 EVFPanelBuilder.bindFieldSettings();
1056 EVFPanelBuilder.bindFieldDelete();
1057 EVFPanelBuilder.bindFieldDeleteWithKeyEvent();
1058 EVFPanelBuilder.bindFieldMultiSelect();
1059 EVFPanelBuilder.bindCloneField();
1060 EVFPanelBuilder.bindSaveOption();
1061 EVFPanelBuilder.bindEmbedOption();
1062 EVFPanelBuilder.bindSaveOptionWithKeyEvent();
1063 EVFPanelBuilder.bindOpenShortcutKeysModalWithKeyEvent();
1064 EVFPanelBuilder.bindLayoutContainers();
1065 EVFPanelBuilder.bindAddRowColumnPicker();
1066 EVFPanelBuilder.bindAddNewRow();
1067 EVFPanelBuilder.bindRemoveRow();
1068 EVFPanelBuilder.bindFormSettings();
1069 EVFPanelBuilder.bindFormEmail();
1070 EVFPanelBuilder.bindFormSmsNotifications();
1071 EVFPanelBuilder.bindFormConversational();
1072 EVFPanelBuilder.bindFormIntegrations();
1073 EVFPanelBuilder.bindFormPayment();
1074 EVFPanelBuilder.choicesInit();
1075 EVFPanelBuilder.bindToggleHandleActions();
1076 EVFPanelBuilder.bindLabelEditInputActions();
1077 EVFPanelBuilder.bindSyncedInputActions();
1078 EVFPanelBuilder.init_datepickers();
1079 EVFPanelBuilder.init_payment_subscription_plan_field();
1080 EVFPanelBuilder.bindBulkOptionActions();
1081 EVFPanelBuilder.bindAkismetInit();
1082 EVFPanelBuilder.bindFormSubmissionMinWaitingTime();
1083 EVFPanelBuilder.bindEditMetaKey();
1084
1085 // Fields Panel.
1086 EVFPanelBuilder.bindUIActionsFields();
1087
1088 if (evf_data.tab === 'field-options') {
1089 $('.evf-panel-field-options-button').trigger('click');
1090 }
1091
1092 $(document.body).on(
1093 'everest-forms-field-drop',
1094 '.evf-registered-buttons .evf-registered-item',
1095 function () {
1096 EVFPanelBuilder.fieldDrop($(this).clone());
1097 },
1098 );
1099
1100 $(document.body).on(
1101 'click',
1102 '.evf-registered-buttons .evf-registered-item:not(.upgrade-modal):not(.evf-upgrade-addon):not(.enable-stripe-model):not(.enable-authorize-net-model):not(.enable-payment-subscription-plan):not(.everest-forms-pro-is_square_install):not(.enable-square-model):not(.evf-one-time-draggable-field):not(.recaptcha_empty_key_validate):not(.hcaptcha_empty_key_validate):not(.turnstile_empty_key_validate)',
1103 function () {
1104 EVFPanelBuilder.fieldDrop($(this).clone());
1105 },
1106 );
1107
1108 EVFPanelBuilder.bindRowFieldPopover();
1109 },
1110 /**
1111 * Bind user action handlers for the Add Bulk Options feature.
1112 */
1113 bindBulkOptionActions: function () {
1114 // Toggle `Bulk Add` option.
1115 $(document.body).on('click', '.evf-toggle-bulk-options', function (e) {
1116 e.preventDefault();
1117 var $panel = $(this)
1118 .closest('.everest-forms-field-option')
1119 .find('.everest-forms-field-option-row-add_bulk_options');
1120 if ($panel.hasClass('everest-forms-hidden')) {
1121 $panel.stop(true, true).removeClass('everest-forms-hidden').hide().slideDown();
1122 } else {
1123 $panel.stop(true, true).slideUp(function () {
1124 $(this).addClass('everest-forms-hidden').css('display', '');
1125 });
1126 }
1127 });
1128 // Toggle presets list.
1129 $(document.body).on('click', '.evf-toggle-presets-list', function (e) {
1130 e.preventDefault();
1131 $(this)
1132 .closest('.everest-forms-field-option')
1133 .find('.everest-forms-field-option-row .evf-options-presets')
1134 .removeAttr('hidden')
1135 .slideToggle();
1136 });
1137 // Add custom list of options.
1138 $(document.body).on('click', '.evf-add-bulk-options', function (e) {
1139 var $option_row = $(this).closest('.everest-forms-field-option-row');
1140 var field_id = $option_row.data('field-id');
1141
1142 if ($option_row.length) {
1143 var $choices = $option_row
1144 .closest('.everest-forms-field-option')
1145 .find('.everest-forms-field-option-row-choices .evf-choices-list');
1146 var $bulk_options_container = $option_row.find(
1147 'textarea#everest-forms-field-option-' +
1148 field_id +
1149 '-add_bulk_options',
1150 );
1151 var options_texts = $bulk_options_container
1152 .val()
1153 .replace(/<\s*script/gi, '')
1154 .replace(/\s+on\w+\s*=/gi, ' ')
1155 .split('\n');
1156
1157 EVFPanelBuilder.addBulkOptions(options_texts, $choices);
1158 $bulk_options_container.val('');
1159 }
1160 });
1161 // Add presets of options.
1162 $(document.body).on('click', '.evf-options-preset-label', function (e) {
1163 var $option_row = $(this).closest('.everest-forms-field-option-row');
1164 var field_id = $option_row.data('field-id');
1165
1166 if ($option_row.length) {
1167 var options_texts = $(this)
1168 .closest('.evf-options-preset')
1169 .find('.evf-options-preset-value')
1170 .val();
1171
1172 $option_row
1173 .find(
1174 'textarea#everest-forms-field-option-' +
1175 field_id +
1176 '-add_bulk_options',
1177 )
1178 .val(options_texts);
1179 $(this).closest('.evf-options-presets').slideUp();
1180 }
1181 });
1182 //Add toggle option for password validation and strength meter.
1183 $(document.body).on(
1184 'click',
1185 '.everest-forms-field-option-row-password_strength',
1186 function () {
1187 if ($(this).find('[type="checkbox"]:first').prop('checked')) {
1188 $(this)
1189 .next()
1190 .find('[type="checkbox"]:first')
1191 .prop('checked', false);
1192 // $(this).prev().find('.everest-forms-inner-options').hide();
1193 }
1194 },
1195 );
1196 $(document.body).on(
1197 'click',
1198 '.everest-forms-field-option-row-password_validation',
1199 function () {
1200 if ($(this).find('[type="checkbox"]:first').prop('checked')) {
1201 $(this)
1202 .prev()
1203 .find('[type="checkbox"]:first')
1204 .prop('checked', false);
1205 $(this)
1206 .prev()
1207 .find('.everest-forms-inner-options')
1208 .addClass('everest-forms-hidden');
1209 }
1210 },
1211 );
1212 },
1213
1214 /**
1215 * Add a list of options at once.
1216 *
1217 * @param {Array<string>} options_texts List of options to add.
1218 * @param {object} $choices_container Options container where the options should be added.
1219 */
1220 addBulkOptions: function (options_texts, $choices_container) {
1221 options_texts.forEach(function (option_text) {
1222 if ('' !== option_text) {
1223 var $add_button = $choices_container.find('li').last().find('a.add');
1224 EVFPanelBuilder.choiceAdd(null, $add_button, option_text.trim());
1225 }
1226 });
1227 },
1228
1229 /**
1230 * Initialize date pickers like min/max date, disable dates etc.
1231 *
1232 * @since 1.6.6
1233 */
1234 init_datepickers: function () {
1235 var date_format = $('.everest-forms-disable-dates').data('date-format'),
1236 selection_mode = 'multiple';
1237
1238 // Initialize "Disable dates" option's date pickers that hasn't been initialized.
1239 $('.everest-forms-disable-dates').each(function () {
1240 if (!$(this).get(0)._flatpickr) {
1241 $(this).flatpickr({
1242 dateFormat: date_format,
1243 mode: selection_mode,
1244 });
1245 }
1246 });
1247
1248 // Reformat the selected dates input value for `Disable dates` option when the date format changes.
1249 $(document.body).on('change', '.evf-date-format', function (e) {
1250 var $disable_dates = $(
1251 '.everest-forms-field-option:visible .everest-forms-disable-dates',
1252 ),
1253 flatpicker = $disable_dates.get(0)._flatpickr,
1254 selectedDates = flatpicker.selectedDates,
1255 date_format = $(this).val(),
1256 formatedDates = [];
1257
1258 selectedDates.forEach(function (date) {
1259 formatedDates.push(flatpickr.formatDate(date, date_format));
1260 });
1261 flatpicker.set('dateFormat', date_format);
1262 $disable_dates.val(formatedDates.join(', '));
1263 });
1264
1265 // Clear disabled dates.
1266 $(document.body).on('click', '.evf-clear-disabled-dates', function () {
1267 $('.everest-forms-field-option:visible .everest-forms-disable-dates')
1268 .get(0)
1269 ._flatpickr.clear();
1270 });
1271
1272 // Triggring Setting Toggler.
1273 $('.everest-forms-field-date-time').each(function () {
1274 var id = $(this).attr('data-field-id');
1275 EVFPanelBuilder.dateSettingToggler(
1276 id,
1277 $('#everest-forms-field-option-' + id + '-datetime_style').val(),
1278 );
1279 });
1280
1281 if ($('.everest-forms-slot-booking input').is(':checked')) {
1282 //checked and hide past dates.
1283 disable_past_date = $(document).find(
1284 '.everest-forms-past-date-disable-format input',
1285 );
1286 required = $(document).find(
1287 '.everest-forms-field-option-row-required input',
1288 );
1289 disable_past_date.attr('checked', true);
1290 required.prop('checked', true);
1291 disable_past_date.parent().parent().parent().hide();
1292 }
1293 },
1294 /**
1295 * Normalize a date to local midnight for day comparisons.
1296 *
1297 * @param {Date} date Input date.
1298 * @return {Date}
1299 */
1300 normalize_subscription_expiry_day: function (date) {
1301 var normalized = new Date(date.getTime());
1302 normalized.setHours(0, 0, 0, 0);
1303 return normalized;
1304 },
1305
1306 /**
1307 * Whether a calendar day falls inside the active trial window (not past dates).
1308 *
1309 * @param {jQuery} $li Plan choice row.
1310 * @param {Date} dayDate Calendar day.
1311 * @return {boolean}
1312 */
1313 is_subscription_expiry_trial_day: function ($li, dayDate) {
1314 if (
1315 !dayDate ||
1316 !$li ||
1317 !$li.length ||
1318 !$li.find('.evf-enable-trial-period').is(':checked')
1319 ) {
1320 return false;
1321 }
1322
1323 var today = new Date();
1324 today.setHours(0, 0, 0, 0);
1325 var trialMin =
1326 EVFPanelBuilder.get_subscription_expiry_min_date($li);
1327 var day = EVFPanelBuilder.normalize_subscription_expiry_day(dayDate);
1328
1329 return (
1330 day.getTime() >= today.getTime() &&
1331 day.getTime() < trialMin.getTime()
1332 );
1333 },
1334
1335 /**
1336 * First allowed expiry date for a plan choice (matches SubscriptionSchedule billing_start_date).
1337 *
1338 * @param {jQuery} $li Plan choice row.
1339 * @return {Date} Midnight local date.
1340 */
1341 get_subscription_expiry_min_date: function ($li) {
1342 var min = new Date();
1343 min.setHours(0, 0, 0, 0);
1344
1345 if (!$li || !$li.length) {
1346 return min;
1347 }
1348
1349 if (!$li.find('.evf-enable-trial-period').is(':checked')) {
1350 return min;
1351 }
1352
1353 var count = parseInt(
1354 $li.find('.evf-spt-panel--trial input[type="number"]').val(),
1355 10,
1356 );
1357 if (isNaN(count) || count < 1) {
1358 count = 1;
1359 }
1360
1361 var period =
1362 $li.find('.evf-spt-panel--trial select').val() || 'day';
1363
1364 switch (period) {
1365 case 'week':
1366 min.setDate(min.getDate() + count * 7);
1367 break;
1368 case 'month':
1369 min.setMonth(min.getMonth() + count);
1370 break;
1371 case 'year':
1372 min.setFullYear(min.getFullYear() + count);
1373 break;
1374 case 'day':
1375 default:
1376 min.setDate(min.getDate() + count);
1377 break;
1378 }
1379
1380 return min;
1381 },
1382
1383 /**
1384 * Show or hide expiry hint when trial blocks early dates.
1385 *
1386 * @param {jQuery} $li Plan choice row.
1387 * @param {Date} minDate First selectable expiry date.
1388 */
1389 sync_subscription_expiry_trial_hint: function ($li, minDate) {
1390 var $detail = $li.find('.evf-spt-panel--expiry .evf-spt-panel-detail');
1391 var $hint = $detail.find('.evf-expiry-trial-hint');
1392
1393 if (!$hint.length) {
1394 $hint = $(
1395 '<p class="evf-expiry-trial-hint description" role="note"></p>',
1396 );
1397 $detail.append($hint);
1398 }
1399
1400 if (!$li.find('.evf-enable-trial-period').is(':checked')) {
1401 $hint.hide().text('');
1402 return;
1403 }
1404
1405 var label =
1406 typeof flatpickr !== 'undefined'
1407 ? flatpickr.formatDate(minDate, 'Y-m-d')
1408 : minDate.toISOString().slice(0, 10);
1409 var template =
1410 (evf_data && evf_data.i18n_expiry_trial_min_date) ||
1411 'Expiry must be on or after the trial ends (%s).';
1412
1413 $hint.text(template.replace('%s', label)).show();
1414 },
1415
1416 /**
1417 * Anchor element for positioning the expiry calendar under the date input.
1418 *
1419 * @param {jQuery} $input Expiry date input.
1420 * @return {HTMLElement}
1421 */
1422 get_subscription_expiry_picker_anchor: function ($input) {
1423 var $anchor = $input.closest('.evf-spt-panel-detail');
1424
1425 if (!$anchor.length) {
1426 $anchor = $input.closest('.evf-general-setting-field');
1427 }
1428
1429 if (!$anchor.length) {
1430 $anchor = $input.parent();
1431 }
1432
1433 return $anchor[0];
1434 },
1435
1436 /**
1437 * Close open subscription expiry flatpickr calendars.
1438 *
1439 * @param {HTMLElement|null} exceptInput Optional input to keep open.
1440 */
1441 close_subscription_expiry_pickers: function (exceptInput) {
1442 $('.evf-radio-subscription-expiry-input').each(function () {
1443 if (exceptInput && this === exceptInput) {
1444 return;
1445 }
1446
1447 if (this._flatpickr && this._flatpickr.isOpen) {
1448 this._flatpickr.close();
1449 }
1450
1451 $(this).removeClass('active');
1452 });
1453 },
1454
1455 /**
1456 * Clear subscription plan expiry date input and flatpickr state.
1457 *
1458 * @param {jQuery} $li Plan choice row.
1459 */
1460 clear_subscription_plan_expiry_date: function ($li) {
1461 var $expiryInput = $li.find('.evf-radio-subscription-expiry-input');
1462
1463 $expiryInput.val('');
1464
1465 if ($expiryInput.length && $expiryInput[0]._flatpickr) {
1466 $expiryInput[0]._flatpickr.clear();
1467 }
1468 },
1469
1470 /**
1471 * Toggle flatpickr when the expiry input is clicked.
1472 *
1473 * @param {object} instance Flatpickr instance.
1474 */
1475 bind_subscription_expiry_picker_toggle: function (instance) {
1476 var $input = $(instance.input);
1477
1478 $input.off('click.evfExpiryPicker').on('click.evfExpiryPicker', function (e) {
1479 e.preventDefault();
1480 e.stopPropagation();
1481
1482 if (instance.isOpen) {
1483 instance.close();
1484 return;
1485 }
1486
1487 EVFPanelBuilder.close_subscription_expiry_pickers(instance.input);
1488 instance.open();
1489 });
1490 },
1491
1492 /**
1493 * Update minDate on open expiry pickers after trial settings change.
1494 *
1495 * @param {jQuery} $scope Optional plan choice row.
1496 */
1497 update_subscription_expiry_min_dates: function ($scope) {
1498 var $inputs =
1499 $scope && $scope.length
1500 ? $scope.find('.evf-radio-subscription-expiry-input')
1501 : $(
1502 '.everest-forms-field-option-payment-subscription-plan .evf-radio-subscription-expiry-input',
1503 );
1504
1505 $inputs.each(function () {
1506 var el = this;
1507 var $li = $(el).closest('li');
1508
1509 if (!el._flatpickr) {
1510 return;
1511 }
1512
1513 var minDate =
1514 EVFPanelBuilder.get_subscription_expiry_min_date($li);
1515
1516 el._flatpickr.set('minDate', minDate);
1517 EVFPanelBuilder.sync_subscription_expiry_trial_hint(
1518 $li,
1519 minDate,
1520 );
1521
1522 if (
1523 el._flatpickr.selectedDates[0] &&
1524 el._flatpickr.selectedDates[0] < minDate
1525 ) {
1526 el._flatpickr.clear();
1527 }
1528
1529 el._flatpickr.redraw();
1530 });
1531 },
1532
1533 /**
1534 * Flatpickr for subscription plan expiry date (builder only).
1535 *
1536 * @param {jQuery} $scope Optional container (plan choice row).
1537 */
1538 init_subscription_expiry_date_pickers: function ($scope) {
1539 var $inputs =
1540 $scope && $scope.length
1541 ? $scope.find('.evf-radio-subscription-expiry-input')
1542 : $(
1543 '.everest-forms-field-option-payment-subscription-plan:visible .evf-radio-subscription-expiry-input',
1544 );
1545
1546 var blockedTitle =
1547 (evf_data && evf_data.i18n_expiry_trial_blocked_day) ||
1548 'This date is within the trial period and cannot be used as the expiry date.';
1549
1550 $inputs.each(function () {
1551 var $input = $(this);
1552 var el = this;
1553 var $li = $input.closest('li');
1554 var savedDate = $.trim($input.val());
1555 var dateFormat = $input.data('date-format') || 'Y-m-d';
1556
1557 if (el._flatpickr && !el._flatpickr.config.static) {
1558 el._flatpickr.destroy();
1559 }
1560
1561 if (el._flatpickr) {
1562 var minDate =
1563 EVFPanelBuilder.get_subscription_expiry_min_date($li);
1564
1565 el._flatpickr.set('minDate', minDate);
1566
1567 if (savedDate) {
1568 el._flatpickr.setDate(savedDate, false);
1569
1570 if (el._flatpickr.selectedDates[0]) {
1571 $input.val(
1572 el._flatpickr.formatDate(
1573 el._flatpickr.selectedDates[0],
1574 dateFormat,
1575 ),
1576 );
1577 } else {
1578 $input.val(savedDate);
1579 }
1580 }
1581
1582 EVFPanelBuilder.sync_subscription_expiry_trial_hint(
1583 $li,
1584 minDate,
1585 );
1586 el._flatpickr.redraw();
1587 EVFPanelBuilder.bind_subscription_expiry_picker_toggle(
1588 el._flatpickr,
1589 );
1590 return;
1591 }
1592
1593 var $anchor = $(EVFPanelBuilder.get_subscription_expiry_picker_anchor($input));
1594 $anchor.addClass('evf-subscription-expiry-picker-anchor');
1595
1596 $input.flatpickr({
1597 dateFormat: dateFormat,
1598 defaultDate: savedDate || null,
1599 disableMobile: true,
1600 allowInput: false,
1601 clickOpens: false,
1602 closeOnSelect: true,
1603 static: true,
1604 position: 'below',
1605 animate: true,
1606 minDate:
1607 EVFPanelBuilder.get_subscription_expiry_min_date($li),
1608 monthSelectorType: 'dropdown',
1609 onOpen: function (selectedDates, dateStr, instance) {
1610 $(instance.input).addClass('active');
1611 },
1612 onClose: function (selectedDates, dateStr, instance) {
1613 $(instance.input).removeClass('active');
1614 },
1615 onDayCreate: function (dObj, dStr, fp, dayElem) {
1616 var $choiceLi = $(fp.input).closest('li');
1617 var dayDate = dayElem.dateObj;
1618
1619 dayElem.classList.remove('evf-expiry-trial-blocked');
1620 dayElem.removeAttribute('title');
1621
1622 if (
1623 EVFPanelBuilder.is_subscription_expiry_trial_day(
1624 $choiceLi,
1625 dayDate,
1626 )
1627 ) {
1628 dayElem.classList.add('evf-expiry-trial-blocked');
1629 dayElem.setAttribute('title', blockedTitle);
1630 }
1631 },
1632 onChange: function (selectedDates, dateStr, instance) {
1633 var trialMin =
1634 EVFPanelBuilder.get_subscription_expiry_min_date(
1635 $(instance.input).closest('li'),
1636 );
1637
1638 if (
1639 selectedDates[0] &&
1640 selectedDates[0] < trialMin
1641 ) {
1642 instance.clear();
1643 $(instance.input).val('');
1644 return;
1645 }
1646
1647 $(instance.input).val(dateStr).trigger('change');
1648 },
1649 onReady: function (selectedDates, dateStr, instance) {
1650 var $choiceLi = $(instance.input).closest('li');
1651 var trialMin =
1652 EVFPanelBuilder.get_subscription_expiry_min_date(
1653 $choiceLi,
1654 );
1655 var storedDate = $.trim($(instance.input).val());
1656
1657 if (instance.calendarContainer) {
1658 instance.calendarContainer.classList.add(
1659 'evf-subscription-expiry-calendar',
1660 );
1661 }
1662
1663 EVFPanelBuilder.bind_subscription_expiry_picker_toggle(
1664 instance,
1665 );
1666
1667 EVFPanelBuilder.sync_subscription_expiry_trial_hint(
1668 $choiceLi,
1669 trialMin,
1670 );
1671
1672 if (storedDate) {
1673 instance.setDate(storedDate, false);
1674 $(instance.input).val(
1675 instance.formatDate(
1676 instance.selectedDates[0],
1677 instance.config.dateFormat,
1678 ),
1679 );
1680 }
1681
1682 if (
1683 instance.selectedDates[0] &&
1684 instance.selectedDates[0] < trialMin
1685 ) {
1686 instance.clear();
1687 $(instance.input).val('');
1688 }
1689 },
1690 });
1691 });
1692 },
1693
1694 /**
1695 * For the subscription plan field.
1696 *
1697 * @since 3.0.9
1698 */
1699 init_payment_subscription_plan_field: function () {
1700 EVFPanelBuilder.init_subscription_expiry_date_pickers();
1701
1702 $('.everest-forms-field-payment-subscription-plan').each(function () {
1703 var fieldId = $(this).data('field-id');
1704 if (fieldId) {
1705 EVFPanelBuilder.subscriptionPlanChoiceUpdate(fieldId);
1706 }
1707 });
1708
1709 // Tab switching — delegated so it works for dynamically added choices.
1710 $(document.body).on(
1711 'click',
1712 '.evf-spt-tab',
1713 function () {
1714 EVFPanelBuilder.close_subscription_expiry_pickers();
1715
1716 var $tab = $(this);
1717 var $planTabs = $tab.closest('.evf-subscription-plan-tabs');
1718 var targetTab = $tab.data('tab');
1719
1720 $tab.closest('.evf-spt-strip')
1721 .find('.evf-spt-tab')
1722 .removeClass('evf-spt-tab--active');
1723 $tab.addClass('evf-spt-tab--active');
1724
1725 $planTabs.find('.evf-spt-panel').hide();
1726 $planTabs.find('.evf-spt-panel--' + targetTab).show();
1727
1728 if ('expiry' === targetTab) {
1729 EVFPanelBuilder.init_subscription_expiry_date_pickers(
1730 $tab.closest('li'),
1731 );
1732 }
1733 },
1734 );
1735
1736 // Trial toggle — dim inputs and update dot indicator.
1737 $(document.body).on(
1738 'change',
1739 '.evf-enable-trial-period',
1740 function () {
1741 var $li = $(this).closest('li');
1742 var isChecked = $(this).is(':checked');
1743 $li.find('.evf-spt-panel--trial .evf-spt-panel-detail').toggle(isChecked);
1744 $li.find('.evf-spt-tab--trial .evf-spt-dot').toggle(isChecked);
1745 EVFPanelBuilder.update_subscription_expiry_min_dates($li);
1746 },
1747 );
1748
1749 // Trial length/period — block expiry dates that fall inside the trial window.
1750 $(document.body).on(
1751 'change input',
1752 '.evf-spt-panel--trial input[type="number"], .evf-spt-panel--trial select',
1753 function () {
1754 EVFPanelBuilder.update_subscription_expiry_min_dates(
1755 $(this).closest('li'),
1756 );
1757 },
1758 );
1759
1760 // Expiry toggle — dim inputs, close calendar, update dot indicator.
1761 $(document.body).on(
1762 'change',
1763 '.evf-enable-expiry-date',
1764 function () {
1765 var $li = $(this).closest('li');
1766 var isChecked = $(this).is(':checked');
1767 $li.find('.evf-spt-panel--expiry .evf-spt-panel-detail').toggle(isChecked);
1768 $li.find('.evf-spt-tab--expiry .evf-spt-dot').toggle(isChecked);
1769
1770 if (isChecked) {
1771 EVFPanelBuilder.init_subscription_expiry_date_pickers($li);
1772 } else {
1773 EVFPanelBuilder.clear_subscription_plan_expiry_date($li);
1774 EVFPanelBuilder.close_subscription_expiry_pickers();
1775 }
1776 },
1777 );
1778
1779 // Update builder preview when recurring interval or period changes.
1780 $(document.body).on(
1781 'change input',
1782 '.evf-spt-panel--recurring input[type="number"], .evf-spt-panel--recurring select',
1783 function () {
1784 var fieldId = $(this).closest('.evf-choices-list').data('field-id');
1785 if (fieldId) {
1786 EVFPanelBuilder.subscriptionPlanChoiceUpdate(fieldId);
1787 }
1788 },
1789 );
1790
1791 // Update builder preview when trial toggle, count, or period changes.
1792 $(document.body).on(
1793 'change input',
1794 '.evf-enable-trial-period, .evf-spt-panel--trial input[type="number"], .evf-spt-panel--trial select',
1795 function () {
1796 var fieldId = $(this).closest('.evf-choices-list').data('field-id');
1797 if (fieldId) {
1798 EVFPanelBuilder.subscriptionPlanChoiceUpdate(fieldId);
1799 }
1800 },
1801 );
1802
1803 // Update builder preview when expiry toggle or date changes.
1804 $(document.body).on(
1805 'change',
1806 '.evf-enable-expiry-date, .evf-radio-subscription-expiry-input',
1807 function () {
1808 var fieldId = $(this).closest('.evf-choices-list').data('field-id');
1809 if (fieldId) {
1810 EVFPanelBuilder.subscriptionPlanChoiceUpdate(fieldId);
1811 }
1812 },
1813 );
1814
1815 $(document.body).on('evf_after_field_append', function (e, element_id) {
1816 var $field = $('#' + element_id);
1817 var field_type = $field.attr('data-field-type');
1818
1819 if ('payment-subscription-plan' === field_type) {
1820 var isRecurringEnable = $(
1821 '#everest-forms-panel-field-paypal-recurring',
1822 );
1823 $('#everest-forms-panel-field-paypal-interval_count-wrap').hide();
1824 $('#everest-forms-panel-field-paypal-period-wrap').hide();
1825
1826 $('#everest-forms-panel-field-stripe-plan_name-wrap').hide();
1827 $('#everest-forms-panel-field-stripe-interval_count-wrap').hide();
1828 $('#everest-forms-panel-field-stripe-period-wrap').hide();
1829
1830 $('#everest-forms-panel-field-mollie-subscription_description-wrap').hide();
1831 $('#everest-forms-panel-field-mollie-interval_count-wrap').hide();
1832 $('#everest-forms-panel-field-mollie-interval-wrap').hide();
1833 }
1834
1835 EVFPanelBuilder.syncPaymentMethodDependentFields();
1836 EVFPanelBuilder.refreshFieldMapSelectsFromField('add', element_id);
1837 });
1838
1839 $(document.body).on('evf_before_field_deleted', function (e, element_id) {
1840 EVFPanelBuilder.refreshFieldMapSelectsFromField(
1841 'remove',
1842 element_id,
1843 );
1844 var $field = $('#everest-forms-field-' + element_id);
1845 var field_type = $field.attr('data-field-type');
1846
1847 if ('payment-subscription-plan' === field_type) {
1848 $('#everest-forms-panel-field-paypal-interval_count-wrap').show();
1849 $('#everest-forms-panel-field-paypal-period-wrap').show();
1850
1851 $('#everest-forms-panel-field-stripe-plan_name-wrap').hide();
1852 $('#everest-forms-panel-field-stripe-interval_count-wrap').hide();
1853 $('#everest-forms-panel-field-stripe-period-wrap').hide();
1854
1855 $('#everest-forms-panel-field-mollie-subscription_description-wrap').show();
1856 $('#everest-forms-panel-field-mollie-interval_count-wrap').show();
1857 $('#everest-forms-panel-field-mollie-interval-wrap').show();
1858 }
1859
1860 // Run after DOM removal to accurately detect selector presence.
1861 setTimeout(function () {
1862 EVFPanelBuilder.syncPaymentMethodDependentFields();
1863 }, 0);
1864 });
1865
1866 var isRecurringEnable = $('#everest-forms-panel-field-paypal-recurring');
1867
1868 var wrapper = $('.everest-forms-field-wrap');
1869
1870 if (
1871 $(wrapper).find('.everest-forms-field-payment-subscription-plan')
1872 .length > 0
1873 ) {
1874 if ($(isRecurringEnable).is(':checked')) {
1875 $('#everest-forms-panel-field-paypal-interval_count-wrap').hide();
1876 $('#everest-forms-panel-field-paypal-period-wrap').hide();
1877
1878 $('#everest-forms-panel-field-stripe-plan_name-wrap').hide();
1879 $('#everest-forms-panel-field-stripe-interval_count-wrap').hide();
1880 $('#everest-forms-panel-field-stripe-period-wrap').hide();
1881 }
1882
1883 $(isRecurringEnable).on('click', function (e) {
1884 $('#everest-forms-panel-field-paypal-interval_count-wrap').hide();
1885 $('#everest-forms-panel-field-paypal-period-wrap').hide();
1886
1887 $('#everest-forms-panel-field-stripe-plan_name-wrap').hide();
1888 $('#everest-forms-panel-field-stripe-interval_count-wrap').hide();
1889 $('#everest-forms-panel-field-stripe-period-wrap').hide();
1890 });
1891 }
1892
1893 var isStripeRecurringEnable = $(
1894 '#everest-forms-panel-field-stripe-recurring',
1895 );
1896
1897 var wrapper = $('.everest-forms-field-wrap');
1898
1899 if (
1900 $(wrapper).find('.everest-forms-field-payment-subscription-plan')
1901 .length > 0
1902 ) {
1903 if ($(isStripeRecurringEnable).is(':checked')) {
1904 $('#everest-forms-panel-field-stripe-plan_name-wrap').hide();
1905 $('#everest-forms-panel-field-stripe-interval_count-wrap').hide();
1906 $('#everest-forms-panel-field-stripe-period-wrap').hide();
1907 }
1908
1909 $('#everest-forms-panel-field-mollie-subscription_description-wrap').hide();
1910 $('#everest-forms-panel-field-mollie-interval_count-wrap').hide();
1911 $('#everest-forms-panel-field-mollie-interval-wrap').hide();
1912 }
1913 $(isStripeRecurringEnable).on('click', function (e) {
1914 if (
1915 $(this).is(':checked') &&
1916 $(wrapper).find('.everest-forms-field-payment-subscription-plan')
1917 .length > 0
1918 ) {
1919 $('#everest-forms-panel-field-stripe-plan_name-wrap').hide();
1920 $('#everest-forms-panel-field-stripe-interval_count-wrap').hide();
1921 $('#everest-forms-panel-field-stripe-period-wrap').hide();
1922 }
1923 });
1924 },
1925
1926 /**
1927 * Form edit title actions.
1928 *
1929 * @since 1.6.0
1930 */
1931 bindEditActions: function () {
1932 // Delegates event to toggleEditTitle() on clicking.
1933 $('#edit-form-name').on('click', function (e) {
1934 e.stopPropagation();
1935
1936 if ('' !== $('#evf-edit-form-name').val().trim()) {
1937 EVFPanelBuilder.toggleEditTitle(e);
1938 }
1939 });
1940
1941 // Apply the title change to form name field.
1942 $('#evf-edit-form-name')
1943 .on('change keypress', function (e) {
1944 var $this = $(this);
1945
1946 e.stopPropagation();
1947
1948 if (13 === e.which && '' !== $(this).val().trim()) {
1949 EVFPanelBuilder.toggleEditTitle(e);
1950 }
1951
1952 if ('' !== $this.val().trim()) {
1953 $('#everest-forms-panel-field-settings-form_title').val(
1954 $this.val().trim(),
1955 );
1956 }
1957 })
1958 .on('click', function (e) {
1959 e.stopPropagation();
1960 });
1961
1962 // In case the user goes out of focus from title edit state.
1963 $(document)
1964 .not($('.everest-forms-title-desc'))
1965 .on('click', function (e) {
1966 var field = $('#evf-edit-form-name');
1967
1968 e.stopPropagation();
1969
1970 // Only allow flipping state if currently editing.
1971 if (
1972 !field.prop('disabled') &&
1973 field.val() &&
1974 '' !== field.val().trim()
1975 ) {
1976 EVFPanelBuilder.toggleEditTitle(e);
1977 }
1978 });
1979 },
1980
1981 // Toggles edit state.
1982 toggleEditTitle: function (event) {
1983 var $el = $('#edit-form-name'),
1984 $input_title = $el.siblings('#evf-edit-form-name');
1985
1986 event.preventDefault();
1987
1988 // Toggle disabled property.
1989 $input_title.prop('disabled', function (_, val) {
1990 return !val;
1991 });
1992
1993 if (!$input_title.hasClass('everst-forms-name-editing')) {
1994 $input_title.focus();
1995 }
1996
1997 $input_title.toggleClass('everst-forms-name-editing');
1998 },
1999
2000 //--------------------------------------------------------------------//
2001 // Fields Panel
2002 //--------------------------------------------------------------------//
2003
2004 /**
2005 * Creates a object from form elements.
2006 *
2007 * @since 1.6.0
2008 */
2009 formObject: function (el) {
2010 var form = jQuery(el),
2011 fields = form.find('[name]'),
2012 json = {},
2013 arraynames = {};
2014
2015 for (var v = 0; v < fields.length; v++) {
2016 var field = jQuery(fields[v]),
2017 name = field.prop('name').replace(/\]/gi, '').split('['),
2018 value = field.val(),
2019 lineconf = {};
2020
2021 if (
2022 (field.is(':radio') || field.is(':checkbox')) &&
2023 !field.is(':checked')
2024 ) {
2025 continue;
2026 }
2027 for (var i = name.length - 1; i >= 0; i--) {
2028 var nestname = name[i];
2029 if (typeof nestname === 'undefined') {
2030 nestname = '';
2031 }
2032 if (nestname.length === 0) {
2033 lineconf = [];
2034 if (typeof arraynames[name[i - 1]] === 'undefined') {
2035 arraynames[name[i - 1]] = 0;
2036 } else {
2037 arraynames[name[i - 1]] += 1;
2038 }
2039 nestname = arraynames[name[i - 1]];
2040 }
2041 if (i === name.length - 1) {
2042 if (value) {
2043 if (value === 'true') {
2044 value = true;
2045 } else if (value === 'false') {
2046 value = false;
2047 } else if (
2048 !isNaN(parseFloat(value)) &&
2049 parseFloat(value).toString() === value
2050 ) {
2051 value = parseFloat(value);
2052 } else if (
2053 typeof value === 'string' &&
2054 (value.substr(0, 1) === '{' || value.substr(0, 1) === '[')
2055 ) {
2056 try {
2057 value = JSON.parse(value);
2058 } catch (e) {}
2059 } else if (
2060 typeof value === 'object' &&
2061 value.length &&
2062 field.is('select')
2063 ) {
2064 var new_val = {};
2065 for (var i = 0; i < value.length; i++) {
2066 new_val['n' + i] = value[i];
2067 }
2068 value = new_val;
2069 }
2070 }
2071 lineconf[nestname] = value;
2072 } else {
2073 var newobj = lineconf;
2074 lineconf = {};
2075 lineconf[nestname] = newobj;
2076 }
2077 }
2078 $.extend(true, json, lineconf);
2079 }
2080
2081 return json;
2082 },
2083
2084 /**
2085 * Element bindings for Fields panel.
2086 *
2087 * @since 1.2.0
2088 */
2089 bindUIActionsFields: function () {
2090 // Add new field choice.
2091 $builder.on(
2092 'click',
2093 '.everest-forms-field-option-row-choices .add',
2094 function (event) {
2095 EVFPanelBuilder.choiceAdd(event, $(this));
2096 },
2097 );
2098
2099 // Delete field choice.
2100 $builder.on(
2101 'click',
2102 '.everest-forms-field-option-row-choices .remove',
2103 function (event) {
2104 EVFPanelBuilder.choiceDelete(event, $(this));
2105 },
2106 );
2107
2108 // Field choices defaults - (before change).
2109 $builder.on(
2110 'mousedown',
2111 '.everest-forms-field-option-row-choices input[type=radio]',
2112 function () {
2113 var $this = $(this);
2114
2115 if ($this.is(':checked')) {
2116 $this.attr('data-checked', '1');
2117 } else {
2118 $this.attr('data-checked', '0');
2119 }
2120 },
2121 );
2122
2123 // Field choices defaults.
2124 $builder.on(
2125 'click',
2126 '.everest-forms-field-option-row-choices input[type=radio]',
2127 function () {
2128 var $this = $(this),
2129 list = $this.parent().parent();
2130
2131 $this
2132 .parent()
2133 .parent()
2134 .find('input[type=radio]')
2135 .not(this)
2136 .prop('checked', false);
2137
2138 if ($this.attr('data-checked') === '1') {
2139 $this.prop('checked', false);
2140 $this.attr('data-checked', '0');
2141 }
2142
2143 EVFPanelBuilder.choiceUpdate(
2144 list.data('field-type'),
2145 list.data('field-id'),
2146 );
2147 },
2148 );
2149
2150 // Field choices update preview area.
2151 $builder.on(
2152 'change',
2153 '.everest-forms-field-option-row-choices input[type=checkbox]',
2154 function (e) {
2155 var list = $(this).parent().parent();
2156 EVFPanelBuilder.choiceUpdate(
2157 list.data('field-type'),
2158 list.data('field-id'),
2159 );
2160 },
2161 );
2162
2163 // Updates field choices text in almost real time.
2164 $builder.on(
2165 'keyup paste focusout',
2166 '.everest-forms-field-option-row-choices input.label, .everest-forms-field-option-row-choices input.value',
2167 function (e) {
2168 var list = $(this).parent().parent().parent();
2169 EVFPanelBuilder.choiceUpdate(
2170 list.data('field-type'),
2171 list.data('field-id'),
2172 );
2173 },
2174 );
2175
2176 // Field choices display value toggle.
2177 $builder.on(
2178 'change',
2179 '.everest-forms-field-option-row-show_values input',
2180 function (e) {
2181 $(this)
2182 .closest('.everest-forms-field-option')
2183 .find('.everest-forms-field-option-row-choices ul')
2184 .toggleClass('show-values');
2185 },
2186 );
2187
2188 // Field image choices toggle.
2189 $builder.on(
2190 'change',
2191 '.everest-forms-field-option-row-choices_images input',
2192 function () {
2193 var $this = $(this),
2194 field_id = $this.parent().parent().parent().data('field-id'),
2195 $fieldOptions = $('#everest-forms-field-option-' + field_id),
2196 $columnOptions = $(
2197 '#everest-forms-field-option-' + field_id + '-input_columns',
2198 ),
2199 type = $('#everest-forms-field-option-' + field_id)
2200 .find('.everest-forms-field-option-hidden-type')
2201 .val();
2202
2203 $this.parent().find('.notice').toggleClass('hidden');
2204 $fieldOptions
2205 .find('.everest-forms-field-option-row-choices ul')
2206 .toggleClass('show-images');
2207
2208 // Trigger columns changes.
2209 if ($this.is(':checked')) {
2210 $columnOptions.val('inline').trigger('change');
2211 } else {
2212 $columnOptions.val('').trigger('change');
2213 }
2214
2215 EVFPanelBuilder.choiceUpdate(type, field_id);
2216 },
2217 );
2218
2219 // Upload or add an image.
2220 $builder.on(
2221 'click',
2222 '.everest-forms-attachment-media-view .upload-button',
2223 function (event) {
2224 var $el = $(this),
2225 $wrapper,
2226 file_frame;
2227
2228 event.preventDefault();
2229
2230 // If the media frame already exists, reopen it.
2231 if (file_frame) {
2232 file_frame.open();
2233 return;
2234 }
2235
2236 // Create the media frame.
2237 file_frame = wp.media.frames.everestforms_media_frame = wp.media({
2238 title: evf_data.i18n_upload_image_title,
2239 className: 'media-frame everest-forms-media-frame',
2240 frame: 'select',
2241 multiple: false,
2242 library: {
2243 type: 'image',
2244 },
2245 button: {
2246 text: evf_data.i18n_upload_image_button,
2247 },
2248 });
2249
2250 // When an image is selected, run a callback.
2251 file_frame.on('select', function () {
2252 var attachment = file_frame
2253 .state()
2254 .get('selection')
2255 .first()
2256 .toJSON();
2257
2258 if ($el.hasClass('button-add-media')) {
2259 $el.hide();
2260 $wrapper = $el.parent();
2261 } else {
2262 $wrapper = $el.parent().parent().parent();
2263 }
2264
2265 $wrapper.find('.source').val(attachment.url);
2266 $wrapper.find('.attachment-thumb').remove();
2267 $wrapper
2268 .find('.thumbnail-image')
2269 .prepend(
2270 '<img class="attachment-thumb" src="' + attachment.url + '">',
2271 );
2272 $wrapper.find('.actions').show();
2273
2274 $builder.trigger('everestFormsImageUploadAdd', [$el, $wrapper]);
2275 });
2276
2277 // Finally, open the modal.
2278 file_frame.open();
2279 },
2280 );
2281
2282 // Remove and uploaded image.
2283 $builder.on(
2284 'click',
2285 '.everest-forms-attachment-media-view .remove-button',
2286 function (event) {
2287 event.preventDefault();
2288
2289 var $container = $(this).parent().parent();
2290
2291 $container.find('.attachment-thumb').remove();
2292 $container.parent().find('.source').val('');
2293 $container.parent().find('.button-add-media').show();
2294
2295 $builder.trigger('everestFormsImageUploadRemove', [
2296 $(this),
2297 $container,
2298 ]);
2299 },
2300 );
2301
2302 // Field choices image upload add/remove image.
2303 $builder.on(
2304 'everestFormsImageUploadAdd everestFormsImageUploadRemove',
2305 function (event, $this, $container) {
2306 var $el = $container.closest('.evf-choices-list'),
2307 type = $el.data('field-type'),
2308 field_id = $el.data('field-id');
2309
2310 EVFPanelBuilder.choiceUpdate(type, field_id);
2311 },
2312 );
2313
2314 // Toggle Layout advanced field option.
2315 $builder.on(
2316 'change',
2317 '.everest-forms-field-option-row-input_columns select',
2318 function () {
2319 var $this = $(this),
2320 value = $this.val(),
2321 field_id = $this.parent().data('field-id'),
2322 css_class = '';
2323
2324 if ('inline' === value) {
2325 css_class = 'everest-forms-list-inline';
2326 } else if ('' !== value) {
2327 css_class = 'everest-forms-list-' + value + '-columns';
2328 }
2329
2330 $('#everest-forms-field-' + field_id)
2331 .removeClass(
2332 'everest-forms-list-inline everest-forms-list-2-columns everest-forms-list-3-columns',
2333 )
2334 .addClass(css_class);
2335 },
2336 );
2337
2338 // Field sidebar tab toggle.
2339 $builder.on('click', '.everest-forms-fields-tab a', function (e) {
2340 e.preventDefault();
2341 EVFPanelBuilder.fieldTabChoice($(this).attr('id'));
2342 });
2343
2344 // Dragged field and hover over tab buttons - multipart.
2345 $(document).on(
2346 'mouseenter',
2347 '.everest-forms-tabs li[class*="part_"]',
2348 function () {
2349 if (
2350 false === $(this).hasClass('active') &&
2351 ($(document)
2352 .find('.everest-forms-field')
2353 .hasClass('ui-sortable-helper') ||
2354 $(document)
2355 .find('.evf-registered-buttons button.evf-registered-item')
2356 .hasClass('field-dragged'))
2357 ) {
2358 $(this).find('a').trigger('click');
2359 }
2360 },
2361 );
2362
2363 // Display toggle for "Address" field hidden option.
2364 $builder.on(
2365 'change',
2366 '.everest-forms-field-option-address input.hide',
2367 function () {
2368 var $this = $(this),
2369 id = $this.parent().parent().data('field-id'),
2370 subfield = $this.parent().parent().data('subfield');
2371 $('#everest-forms-field-' + id)
2372 .find('.everest-forms-' + subfield)
2373 .toggleClass('hidden');
2374 },
2375 );
2376
2377 // Real-time updates for "Show Label" field option.
2378 $builder.on(
2379 'input',
2380 '.everest-forms-field-option-row-label input',
2381 function () {
2382 var $this = $(this),
2383 value = $this
2384 .val()
2385 .replace(/<\s*script/gi, '')
2386 .replace(/\s+on\w+\s*=/gi, ' '),
2387 id = $this.parent().data('field-id'),
2388 $label = $('#everest-forms-field-' + id).find('.label-title .text');
2389 if ($label.hasClass('nl2br')) {
2390 $label.html(value.replace(/\n/g, '<br>'));
2391 } else if ('private-note' === $label.prevObject.data('field-type')) {
2392 value = value + ' (Admin Only)';
2393 $label.html(value);
2394 } else {
2395 $label.html(value);
2396 }
2397 },
2398 );
2399
2400 $builder.on(
2401 'change',
2402 '.everest-forms-field-option-row-enable_prepopulate input',
2403 function (event) {
2404 var id = $(this).parent().parent().parent().data('field-id');
2405
2406 $('#everest-forms-field-' + id).toggleClass('parameter_name');
2407
2408 // Toggle "Parameter Name" option.
2409 if ($(event.target).is(':checked')) {
2410 $(
2411 '#everest-forms-field-option-row-' + id + '-parameter_name',
2412 ).show();
2413 } else {
2414 $(
2415 '#everest-forms-field-option-row-' + id + '-parameter_name',
2416 ).hide();
2417 }
2418 },
2419 );
2420
2421 $builder.on(
2422 'change',
2423 '.everest-forms-field-option-row-enable_regex_validation input',
2424 function (event) {
2425 var id = $(this).parent().parent().parent().data('field-id');
2426
2427 $('#everest-forms-field-' + id).toggleClass('regex_value');
2428
2429 // Toggle "Parameter Name" option.
2430 if ($(event.target).is(':checked')) {
2431 $('#everest-forms-field-option-row-' + id + '-regex_value').show();
2432 $(
2433 '#everest-forms-field-option-row-' + id + '-regex_message',
2434 ).show();
2435 } else {
2436 $('#everest-forms-field-option-row-' + id + '-regex_value').hide();
2437 $(
2438 '#everest-forms-field-option-row-' + id + '-regex_message',
2439 ).hide();
2440 }
2441 },
2442 );
2443
2444 // Real-time updates for "Description" field option.
2445 $builder.on(
2446 'input',
2447 '.everest-forms-field-option-row-description textarea',
2448 function () {
2449 var $this = $(this);
2450 var id = $this.parent().data('field-id');
2451 var $desc = $('#everest-forms-field-' + id).find('.description');
2452 var value = $this.val();
2453
2454 // Sanitize the user input to prevent script injection, iframe injection, and remove event handlers
2455 value = value
2456 .replace(/<\s*script/gi, '')
2457 .replace(/<\s*iframe/gi, '')
2458 .replace(/\s+on\w+\s*=/gi, ' ');
2459
2460 if ($desc.hasClass('nl2br')) {
2461 $desc.html(value.replace(/\n/g, '<br>'));
2462 } else {
2463 $desc.html(value);
2464 }
2465 },
2466 );
2467
2468 // Real-time updates for "Required" field option.
2469 $builder.on(
2470 'change',
2471 '.everest-forms-field-option-row-required input',
2472 function (event) {
2473 var id = $(this).parent().parent().parent().data('field-id');
2474
2475 $('#everest-forms-field-' + id).toggleClass('required');
2476
2477 // Toggle "Required Field Message Setting" option.
2478 if ($(event.target).is(':checked')) {
2479 $(
2480 '#everest-forms-field-option-row-' +
2481 id +
2482 '-required_field_message_setting',
2483 ).show();
2484 if (
2485 $(
2486 '#everest-forms-field-option-' +
2487 id +
2488 '-required_field_message_setting-individual',
2489 ).is(':checked')
2490 ) {
2491 $(
2492 '#everest-forms-field-option-row-' +
2493 id +
2494 '-required-field-message',
2495 ).show();
2496 }
2497 } else {
2498 $(
2499 '#everest-forms-field-option-row-' +
2500 id +
2501 '-required_field_message_setting',
2502 ).hide();
2503 $(
2504 '#everest-forms-field-option-row-' +
2505 id +
2506 '-required-field-message',
2507 ).hide();
2508
2509 //unchecked the slot booking if date is not required.
2510 slot_booking = $(document).find(
2511 '.everest-forms-slot-booking input',
2512 );
2513 slot_booking.prop('checked', false);
2514 //show pass date input if hidden.
2515 $(document)
2516 .find('.everest-forms-past-date-disable-format input')
2517 .parent()
2518 .parent()
2519 .parent()
2520 .show();
2521 }
2522 },
2523 );
2524
2525 $builder.on(
2526 'change',
2527 '.everest-forms-field-option-row-required_field_message_setting input',
2528 function (event) {
2529 var id = $(this).parent().parent().parent().parent().data('field-id');
2530
2531 $('#everest-forms-field-' + id).toggleClass(
2532 'required_field_message_setting',
2533 );
2534
2535 // Toggle "Required Field Message" option.
2536 if ('individual' === $(this).val()) {
2537 $(
2538 '#everest-forms-field-option-row-' +
2539 id +
2540 '-required-field-message',
2541 ).show();
2542 } else {
2543 $(
2544 '#everest-forms-field-option-row-' +
2545 id +
2546 '-required-field-message',
2547 ).hide();
2548 }
2549 },
2550 );
2551
2552 // Real-time updates for "Confirmation" field option.
2553 $builder.on(
2554 'change',
2555 '.everest-forms-field-option-row-confirmation input',
2556 function (event) {
2557 var id = $(this).parent().parent().parent().data('field-id');
2558
2559 // Toggle "Confirmation" field option.
2560 if ($(event.target).is(':checked')) {
2561 $('#everest-forms-field-' + id)
2562 .find('.everest-forms-confirm')
2563 .removeClass('everest-forms-confirm-disabled')
2564 .addClass('everest-forms-confirm-enabled');
2565 $('#everest-forms-field-option-' + id)
2566 .removeClass('everest-forms-confirm-disabled')
2567 .addClass('everest-forms-confirm-enabled');
2568 } else {
2569 $('#everest-forms-field-' + id)
2570 .find('.everest-forms-confirm')
2571 .removeClass('everest-forms-confirm-enabled')
2572 .addClass('everest-forms-confirm-disabled');
2573 $('#everest-forms-field-option-' + id)
2574 .removeClass('everest-forms-confirm-enabled')
2575 .addClass('everest-forms-confirm-disabled');
2576 }
2577 },
2578 );
2579 // Real-time updates for slot booking
2580 $builder.on(
2581 'change',
2582 '.everest-forms-slot-booking input',
2583 function (event) {
2584 if ($(this).is(':checked')) {
2585 disable_past_date = $(document).find(
2586 '.everest-forms-past-date-disable-format input',
2587 );
2588 required = $(document).find(
2589 '.everest-forms-field-option-row-required input',
2590 );
2591
2592 //checked the required if it is not checked.
2593 if (required.is(':not(:checked)')) {
2594 required.prop('checked', true);
2595 }
2596
2597 if (disable_past_date.is(':not(:checked)')) {
2598 disable_past_date.prop('checked', true);
2599 }
2600 disable_past_date.parent().parent().parent().hide();
2601 } else {
2602 disable_past_date.parent().parent().parent().show();
2603 }
2604 },
2605 );
2606
2607 // Real-time updates for "Placeholder" field option.
2608 $builder.on(
2609 'input',
2610 '.everest-forms-field-option-row-placeholder input',
2611 function (e) {
2612 var $this = $(this),
2613 value = $this.val(),
2614 id = $this.parent().data('field-id'),
2615 $primary = $('#everest-forms-field-' + id).find(
2616 '.widefat:not(.secondary-input)',
2617 );
2618
2619 if ($primary.is('select')) {
2620 if (!value.length) {
2621 $primary.find('.placeholder').remove();
2622 } else {
2623 if ($primary.find('.placeholder').length) {
2624 $primary.find('.placeholder').text(value);
2625 } else {
2626 $primary.prepend(
2627 '<option class="placeholder" selected>' + value + '</option>',
2628 );
2629 }
2630
2631 $primary.data('placeholder', value);
2632
2633 if ($primary.hasClass('enhanced')) {
2634 $primary
2635 .parent()
2636 .find('.select2-search__field')
2637 .prop('placeholder', value);
2638 }
2639 }
2640 } else {
2641 $primary.attr('placeholder', value);
2642 }
2643 },
2644 );
2645
2646 // Real-time updates for "Address Placeholder" field options.
2647 $builder.on(
2648 'input',
2649 '.everest-forms-field-option-address input.placeholder',
2650 function (e) {
2651 var $this = $(this),
2652 value = $this.val(),
2653 id = $this.parent().parent().data('field-id'),
2654 subfield = $this.parent().parent().data('subfield');
2655 $('#everest-forms-field-' + id)
2656 .find('.everest-forms-' + subfield + ' input')
2657 .attr('placeholder', value);
2658 },
2659 );
2660
2661 // Real-time updates for "Confirmation Placeholder" field option.
2662 $builder.on(
2663 'input',
2664 '.everest-forms-field-option-row-confirmation_placeholder input',
2665 function () {
2666 var $this = $(this),
2667 value = $this.val(),
2668 id = $this.parent().data('field-id');
2669 $('#everest-forms-field-' + id)
2670 .find('.secondary-input')
2671 .attr('placeholder', value);
2672 },
2673 );
2674
2675 // Real-time updates for "Authorize.Net Card Number Placeholder" field option.
2676 $builder.on(
2677 'input',
2678 '.everest-forms-field-option-row-card_number_placeholder input',
2679 function () {
2680 var $this = $(this),
2681 value = $this.val(),
2682 id = $this.parent().data('field-id');
2683 $('#everest-forms-field-' + id)
2684 .find('.everest-forms-authorize-net-card-number input')
2685 .attr('placeholder', value);
2686 },
2687 );
2688
2689 // Real-time updates for "Authorize.Net CVC Placeholder" field option.
2690 $builder.on(
2691 'input',
2692 '.everest-forms-field-option-row-cvc_placeholder input',
2693 function () {
2694 var $this = $(this),
2695 value = $this.val(),
2696 id = $this.parent().data('field-id');
2697 $('#everest-forms-field-' + id)
2698 .find('.everest-forms-authorize-net-cvc input')
2699 .attr('placeholder', value);
2700 },
2701 );
2702
2703 // Real-time updates for "Hide Label" field option.
2704 $builder.on(
2705 'change',
2706 '.everest-forms-field-option-row-label_hide input',
2707 function () {
2708 var id = $(this).parent().parent().parent().data('field-id');
2709 $('#everest-forms-field-' + id).toggleClass('label_hide');
2710 },
2711 );
2712
2713 // Real-time updates for Sub Label visbility field option.
2714 $builder.on(
2715 'change',
2716 '.everest-forms-field-option-row-sublabel_hide input',
2717 function () {
2718 var id = $(this).parent().parent().parent().data('field-id');
2719 $('#everest-forms-field-' + id).toggleClass('sublabel_hide');
2720 },
2721 );
2722
2723 // Real-time updates for Date/Time and Name "Format" option.
2724 $builder.on(
2725 'change',
2726 '.everest-forms-field-option-row-datetime_format select, .everest-forms-field-option-row-phone_format select, .everest-forms-field-option-row-item_price select, .everest-forms-field-option-row-format select',
2727 function (e) {
2728 var $this = $(this),
2729 value = $this.val(),
2730 id = $this.parent().data('field-id');
2731 $('#everest-forms-field-' + id)
2732 .find('.format-selected')
2733 .removeClass()
2734 .addClass('format-selected format-selected-' + value);
2735 $('#everest-forms-field-option-' + id)
2736 .find('.format-selected')
2737 .removeClass()
2738 .addClass('format-selected format-selected-' + value);
2739 },
2740 );
2741
2742 // Setting options toggler.
2743 $builder.on(
2744 'change',
2745 '.everest-forms-field-option-row-datetime_style select',
2746 function () {
2747 EVFPanelBuilder.dateSettingToggler(
2748 $(this).parent().attr('data-field-id'),
2749 $(this).val(),
2750 );
2751 },
2752 );
2753
2754 // Enable Min Max Toggler.
2755 $(
2756 '.everest-forms-field-option-row-time_interval_format [id*=enable_min_max_time]',
2757 ).each(function () {
2758 if ($(this).prop('checked')) {
2759 $(this)
2760 .parent()
2761 .parent()
2762 .find('.input-group-col-2')
2763 .has(' [id*=min_time_hour]')
2764 .show();
2765 $(this)
2766 .parent()
2767 .parent()
2768 .find('.input-group-col-2')
2769 .has(' [id*=max_time_hour]')
2770 .show();
2771 $(this)
2772 .parent()
2773 .parent()
2774 .find('.input-group-col-2')
2775 .has(' [for*=select_min_time]')
2776 .show();
2777 $(this)
2778 .parent()
2779 .parent()
2780 .find('.input-group-col-2')
2781 .has('[for*=select_max_time]')
2782 .show();
2783 } else {
2784 $(this)
2785 .parent()
2786 .parent()
2787 .find('.input-group-col-2')
2788 .has('[id*=min_time_hour]')
2789 .hide();
2790 $(this)
2791 .parent()
2792 .parent()
2793 .find('.input-group-col-2')
2794 .has('[id*=max_time_hour]')
2795 .hide();
2796 $(this).parent().parent().find('[for*=select_min_time]').hide();
2797 $(this).parent().parent().find('[for*=select_max_time]').hide();
2798 }
2799 });
2800
2801 $builder.on(
2802 'click',
2803 '.everest-forms-field-option-row-time_interval_format [id*=enable_min_max_time]',
2804 function () {
2805 if ($(this).prop('checked')) {
2806 $(this)
2807 .parent()
2808 .parent()
2809 .find('.input-group-col-2')
2810 .has(' [id*=min_time_hour]')
2811 .show();
2812 $(this)
2813 .parent()
2814 .parent()
2815 .find('.input-group-col-2')
2816 .has(' [id*=max_time_hour]')
2817 .show();
2818 $(this).parent().parent().find('[for*=select_min_time]').show();
2819 $(this).parent().parent().find('[for*=select_max_time]').show();
2820 } else {
2821 $(this)
2822 .parent()
2823 .parent()
2824 .find('.input-group-col-2')
2825 .has('[id*=min_time_hour]')
2826 .hide();
2827 $(this)
2828 .parent()
2829 .parent()
2830 .find('.input-group-col-2')
2831 .has('[id*=max_time_hour]')
2832 .hide();
2833 $(this).parent().parent().find('[for*=select_min_time]').hide();
2834 $(this).parent().parent().find('[for*=select_max_time]').hide();
2835 }
2836 },
2837 );
2838
2839 // Time interval changes.
2840 $builder.on(
2841 'change',
2842 '.everest-forms-field-option-row-time_interval_format select[id*=time_format]',
2843 function () {
2844 min_hour = $(this)
2845 .parent()
2846 .siblings('.input-group-col-2')
2847 .find('[id*=min_time_hour]');
2848 max_hour = $(this)
2849 .parent()
2850 .siblings('.input-group-col-2')
2851 .find('[id*=max_time_hour]');
2852 var selected_min = min_hour.find('option:selected').val();
2853 var selected_max = max_hour.find('option:selected').val();
2854 var options = '',
2855 a,
2856 h;
2857 for (i = 0; i <= 23; i++) {
2858 if ($(this).val() === 'H:i') {
2859 options +=
2860 '<option value = "' +
2861 i +
2862 '">' +
2863 (i < 10 ? '0' + i : i) +
2864 '</option>';
2865 } else {
2866 a = ' PM';
2867 if (i < 12) {
2868 a = ' AM';
2869 h = i;
2870 } else {
2871 h = i - 12;
2872 }
2873 if (h == 0) {
2874 h = 12;
2875 }
2876 options += '<option value = "' + i + '">' + h + a + '</option>';
2877 }
2878 }
2879 min_hour.html(options);
2880 max_hour.html(options);
2881 min_hour
2882 .find('option[value=' + selected_min + ']')
2883 .prop('selected', true);
2884 max_hour
2885 .find('option[value=' + selected_max + ']')
2886 .prop('selected', true);
2887 },
2888 );
2889 },
2890
2891 /**
2892 * Setting options for Date Picker and Dropdown Toggler.
2893 */
2894 dateSettingToggler: function (id, type) {
2895 if (type == 'picker') {
2896 // Picker Date Setting Control
2897 $('#everest-forms-field-option-row-' + id + '-placeholder').show();
2898 $('#everest-forms-field-option-' + id + '-disable_dates').show();
2899 $(
2900 'label[for=everest-forms-field-option-' + id + '-disable_dates]',
2901 ).show();
2902 $('#everest-forms-field-option-' + id + '-date_mode-range')
2903 .parents()
2904 .find('everest-forms-checklist')
2905 .show();
2906 $('.everest-forms-field-option-row-date_format .time_interval').show();
2907 $('#everest-forms-field-option-' + id + '-date_localization').show();
2908 $(
2909 'label[for=everest-forms-field-option-' + id + '-date_localization]',
2910 ).show();
2911 $('#everest-forms-field-option-' + id + '-date_default')
2912 .parent()
2913 .parent()
2914 .parent()
2915 .show();
2916 $('#everest-forms-field-option-' + id + '-past_date_disable')
2917 .parent()
2918 .parent()
2919 .parent()
2920 .show();
2921 $('#everest-forms-field-option-' + id + '-enable_min_max')
2922 .parent()
2923 .parent()
2924 .parent()
2925 .show();
2926 //Check if min max date enabled.
2927 if (
2928 $('#everest-forms-field-option-' + id + '-enable_min_max').prop(
2929 'checked',
2930 )
2931 ) {
2932 $('#everest-forms-field-option-' + id + '-set_date_range')
2933 .parent()
2934 .show();
2935 if (
2936 $('#everest-forms-field-option-' + id + '-set_date_range').prop(
2937 'checked',
2938 )
2939 ) {
2940 $(
2941 '#everest-forms-field-option-row-' +
2942 id +
2943 '-date_format .everest-forms-min-max-date-range-option',
2944 ).removeClass('everest-forms-hidden');
2945 } else {
2946 $(
2947 '#everest-forms-field-option-row-' +
2948 id +
2949 '-date_format .everest-forms-min-max-date-option',
2950 ).removeClass('everest-forms-hidden');
2951 }
2952 }
2953 $('#everest-forms-field-option-' + id + '-time_interval').show();
2954 $('#everest-forms-field-option-' + id + '-enable_min_max_time')
2955 .parent()
2956 .parent()
2957 .parent()
2958 .hide();
2959 $(
2960 'label[for=everest-forms-field-option-' +
2961 id +
2962 '-enable_min_max_time]',
2963 ).hide();
2964 $(
2965 'label[for=everest-forms-field-option-' + id + '-select_min_time]',
2966 ).hide();
2967 $(
2968 'label[for=everest-forms-field-option-' + id + '-select_max_time]',
2969 ).hide();
2970 $('#everest-forms-field-option-' + id + '-min_time_hour')
2971 .parent()
2972 .hide();
2973 $('#everest-forms-field-option-' + id + '-max_time_hour')
2974 .parent()
2975 .hide();
2976 } else {
2977 // Dropdown Date Setting Control
2978 $('#everest-forms-field-option-' + id + '-date_mode-range')
2979 .parents()
2980 .find('everest-forms-checklist')
2981 .hide();
2982 $('#everest-forms-field-option-' + id + '-date_default')
2983 .parent()
2984 .parent()
2985 .parent()
2986 .hide();
2987 $('#everest-forms-field-option-' + id + '-past_date_disable')
2988 .parent()
2989 .parent()
2990 .parent()
2991 .hide();
2992 $('#everest-forms-field-option-row-' + id + '-placeholder').hide();
2993 $('#everest-forms-field-option-' + id + '-enable_min_max')
2994 .parent()
2995 .parent()
2996 .parent()
2997 .hide();
2998 $(
2999 '#everest-forms-field-option-row-' +
3000 id +
3001 '-date_format .everest-forms-min-max-date-option',
3002 ).addClass('everest-forms-hidden');
3003 $('#everest-forms-field-option-' + id + '-set_date_range')
3004 .parent()
3005 .parent()
3006 .parent()
3007 .hide();
3008 $(
3009 '#everest-forms-field-option-row-' +
3010 id +
3011 '-date_format .everest-forms-min-max-date-range-option',
3012 ).addClass('everest-forms-hidden');
3013 $('#everest-forms-field-option-' + id + '-disable_dates').hide();
3014 $(
3015 'label[for=everest-forms-field-option-' + id + '-disable_dates]',
3016 ).hide();
3017 $(
3018 '.everest-forms-field-option-row-date_format .everest-forms-checklist',
3019 ).hide();
3020 $('.everest-forms-field-option-row-date_format .time_interval').hide();
3021 $('#everest-forms-field-option-' + id + '-date_localization').hide();
3022 $(
3023 'label[for=everest-forms-field-option-' + id + '-date_localization]',
3024 ).hide();
3025 $('#everest-forms-field-option-' + id + '-time_interval').hide();
3026 $('#everest-forms-field-option-' + id + '-enable_min_max_time')
3027 .parent()
3028 .parent()
3029 .parent()
3030 .show();
3031 $(
3032 'label[for=everest-forms-field-option-' +
3033 id +
3034 '-enable_min_max_time]',
3035 ).show();
3036 //Check if min max time enabled.
3037 if (
3038 $('#everest-forms-field-option-' + id + '-enable_min_max_time').prop(
3039 'checked',
3040 )
3041 ) {
3042 $(
3043 'label[for=everest-forms-field-option-' + id + '-select_min_time]',
3044 ).show();
3045 $(
3046 'label[for=everest-forms-field-option-' + id + '-select_max_time]',
3047 ).show();
3048 $('#everest-forms-field-option-' + id + '-min_time_hour')
3049 .parent()
3050 .show();
3051 $('#everest-forms-field-option-' + id + '-max_time_hour')
3052 .parent()
3053 .show();
3054 }
3055 }
3056 },
3057
3058 /**
3059 * Make field choices sortable.
3060 *
3061 * @since 1.0.0
3062 *
3063 * @param {string} selector Selector.
3064 */
3065 choicesInit: function (selector) {
3066 selector = selector || '.everest-forms-field-option-row-choices ul';
3067
3068 $(selector).sortable({
3069 items: 'li',
3070 axis: 'y',
3071 handle: '.sort',
3072 scrollSensitivity: 40,
3073 stop: function (event) {
3074 var field_id = $(event.target).attr('data-field-id'),
3075 type = $('#everest-forms-field-option-' + field_id)
3076 .find('.everest-forms-field-option-hidden-type')
3077 .val();
3078
3079 EVFPanelBuilder.choiceUpdate(type, field_id);
3080 },
3081 });
3082 },
3083
3084 /**
3085 * Add new field choice.
3086 *
3087 * @since 1.6.0
3088 */
3089 choiceAdd: function (event, el, value) {
3090 if (event && event.preventDefault) {
3091 event.preventDefault();
3092 }
3093
3094 var $this = $(el),
3095 $parent = $this.parent(),
3096 checked = $parent.find('input.default').is(':checked'),
3097 fieldID = $this
3098 .closest('.everest-forms-field-option-row-choices')
3099 .data('field-id'),
3100 nextID = $parent.parent().attr('data-next-id'),
3101 type = $parent.parent().data('field-type'),
3102 $choice = $parent.clone().insertAfter($parent);
3103
3104 $choice.attr('data-key', nextID);
3105 $choice
3106 .find('input.label')
3107 .val(value)
3108 .attr(
3109 'name',
3110 'form_fields[' + fieldID + '][choices][' + nextID + '][label]',
3111 );
3112 $choice
3113 .find('input.value')
3114 .val(value)
3115 .attr(
3116 'name',
3117 'form_fields[' + fieldID + '][choices][' + nextID + '][value]',
3118 );
3119 $choice
3120 .find('input.source')
3121 .val('')
3122 .attr(
3123 'name',
3124 'form_fields[' + fieldID + '][choices][' + nextID + '][image]',
3125 );
3126 $choice
3127 .find('input.default')
3128 .attr(
3129 'name',
3130 'form_fields[' + fieldID + '][choices][' + nextID + '][default]',
3131 )
3132 .prop('checked', false);
3133 $choice.find('.attachment-thumb').remove();
3134 $choice.find('.button-add-media').show();
3135
3136 if ( 'payment-subscription-plan' === type ) {
3137 var oldChoiceKey = $parent.data( 'key' );
3138 $choice.find( 'input, select' ).each( function () {
3139 var name = $( this ).attr( 'name' );
3140 if ( name && name.indexOf( '[choices][' + oldChoiceKey + '][' ) !== -1 ) {
3141 $( this ).attr( 'name', name.replace(
3142 '[choices][' + oldChoiceKey + '][',
3143 '[choices][' + nextID + ']['
3144 ) );
3145 }
3146 } );
3147 $choice.find( '.evf-enable-trial-period' ).prop( 'checked', false );
3148 $choice.find( '.evf-enable-expiry-date' ).prop( 'checked', false );
3149 $choice.find( '[name*="[subscription_expiry_date]"]' ).val( '' );
3150 $choice.find( '.evf-spt-panel-detail' ).hide();
3151 $choice.find( '.evf-spt-dot' ).hide();
3152 }
3153
3154 if (checked === true) {
3155 $parent.find('input.default').prop('checked', true);
3156 }
3157
3158 nextID++;
3159 $parent.parent().attr('data-next-id', nextID);
3160 $builder.trigger('everestFormsChoiceAdd');
3161 EVFPanelBuilder.choiceUpdate(type, fieldID);
3162 },
3163
3164 /**
3165 * Delete field choice.
3166 *
3167 * @since 1.6.0
3168 */
3169 choiceDelete: function (event, el) {
3170 event.preventDefault();
3171
3172 var $this = $(el),
3173 $list = $this.parent().parent(),
3174 total = $list.find('li').length;
3175
3176 if (total < 2) {
3177 $.alert({
3178 title: false,
3179 content: evf_data.i18n_field_error_choice,
3180 icon: 'dashicons dashicons-info',
3181 type: 'blue',
3182 buttons: {
3183 ok: {
3184 text: evf_data.i18n_ok,
3185 btnClass: 'btn-confirm',
3186 keys: ['enter'],
3187 },
3188 },
3189 });
3190 } else {
3191 $this.parent().remove();
3192 EVFPanelBuilder.choiceUpdate(
3193 $list.data('field-type'),
3194 $list.data('field-id'),
3195 );
3196 $builder.trigger('everestFormsChoiceDelete');
3197 }
3198 },
3199
3200 /**
3201 * Update field choices in preview area, for the Fields panel.
3202 *
3203 * @since 1.6.0
3204 */
3205 choiceUpdate: function (type, id) {
3206 var $fieldOptions = $('#everest-forms-field-option-' + id);
3207 $primary = $('#everest-forms-field-' + id + ' .primary-input');
3208
3209 // Radio and Checkbox use _ template.
3210 if (
3211 'radio' === type ||
3212 'checkbox' === type ||
3213 'payment-multiple' === type ||
3214 'payment-checkbox' === type
3215 ) {
3216 var choices = [],
3217 formData = EVFPanelBuilder.formObject($fieldOptions),
3218 settings = formData.form_fields[id];
3219
3220 // Order of choices for a specific field.
3221 $('#everest-forms-field-option-' + id)
3222 .find('.evf-choices-list li')
3223 .each(function () {
3224 choices.push($(this).data('key'));
3225 });
3226
3227 var tmpl = wp.template('everest-forms-field-preview-choices'),
3228 type =
3229 'checkbox' === type || 'payment-checkbox' === type
3230 ? 'checkbox'
3231 : 'radio';
3232 data = {
3233 type: type,
3234 order: choices,
3235 settings: settings,
3236 amountFilter: EVFPanelBuilder.amountFilter,
3237 };
3238
3239 $('#everest-forms-field-' + id)
3240 .find('ul.primary-input')
3241 .replaceWith(tmpl(data));
3242
3243 return;
3244 }
3245
3246 if ('payment-subscription-plan' === type) {
3247 EVFPanelBuilder.subscriptionPlanChoiceUpdate(id);
3248 return;
3249 }
3250
3251 var new_choice;
3252
3253 if ('select' === type) {
3254 new_choice = '<option>{label}</option>';
3255 $primary.find('option').not('.placeholder').remove();
3256 }
3257
3258 $(
3259 '#everest-forms-field-option-row-' +
3260 id +
3261 '-choices .evf-choices-list li',
3262 ).each(function (index) {
3263 var $this = $(this),
3264 label = $this
3265 .find('input.label')
3266 .val()
3267 .replace(/<\s*script/gi, '')
3268 .replace(/\s+on\w+\s*=/gi, ' '),
3269 selected = $this.find('input.default').is(':checked'),
3270 choice = $(new_choice.replace('{label}', label));
3271
3272 $('#everest-forms-field-' + id + ' .primary-input').append(choice);
3273
3274 if (!label) {
3275 return;
3276 }
3277
3278 if (true === selected) {
3279 switch (type) {
3280 case 'select':
3281 choice.prop('selected', true);
3282 break;
3283 case 'radio':
3284 case 'checkbox':
3285 choice.find('input').prop('checked', true);
3286 break;
3287 }
3288 }
3289 });
3290 },
3291
3292 amountFilter: function (data, amount) {
3293 if ('right' === data.currency_symbol_pos) {
3294 return amount + ' ' + data.currency_symbol;
3295 } else {
3296 return data.currency_symbol + ' ' + amount;
3297 }
3298 },
3299
3300 /**
3301 * Re-render the builder canvas preview for a subscription plan field.
3302 *
3303 * @param {string|number} fieldId The field ID.
3304 */
3305 subscriptionPlanChoiceUpdate: function (fieldId) {
3306 var $optionsList = $('#everest-forms-field-option-row-' + fieldId + '-choices .evf-choices-list');
3307 var $preview = $('#everest-forms-field-' + fieldId + ' .primary-input');
3308 if (!$preview.length) {
3309 return;
3310 }
3311
3312 var periodSingular = { day: 'day', week: 'week', month: 'month', year: 'year' };
3313 var periodPlural = { day: 'days', week: 'weeks', month: 'months', year: 'years' };
3314
3315 var html = '';
3316
3317 $optionsList.find('li').each(function () {
3318 var $li = $(this);
3319 var label = $li.find('input.label').val() || '';
3320 var rawAmount = $li.find('input.value').val() || '0';
3321 var iCount = parseInt($li.find('input[name*="[interval_count]"]').val(), 10) || 1;
3322 var rPeriod = $li.find('select[name*="[recurring_period]"]').val() || 'month';
3323 var trialOn = $li.find('.evf-enable-trial-period').is(':checked');
3324 var tCount = parseInt($li.find('input[name*="[trail_interval_count]"]').val(), 10) || 1;
3325 var tPeriod = $li.find('select[name*="[trail_recurring_period]"]').val() || 'week';
3326 var isDefault = $li.find('input.default').is(':checked');
3327
3328 var pStr = iCount > 1
3329 ? (iCount + ' ' + (periodPlural[rPeriod] || rPeriod))
3330 : (periodSingular[rPeriod] || rPeriod);
3331 var periodSuffix = '/' + pStr;
3332 var amountStr = EVFPanelBuilder.amountFilter(evf_data, rawAmount);
3333
3334 var mainHtml = '<span class="evf-plan-main">'
3335 + '<span class="evf-plan-name">' + $('<span>').text(label).html() + '</span>'
3336 + '<strong class="evf-plan-price">' + $('<span>').text(amountStr + periodSuffix).html() + '</strong>'
3337 + '</span>';
3338
3339 var metaParts = [];
3340 if (trialOn) {
3341 var tStr = tCount + ' ' + (tCount > 1 ? (periodPlural[tPeriod] || tPeriod) : (periodSingular[tPeriod] || tPeriod));
3342 metaParts.push($('<span>').text(tStr + ' free trial').html());
3343 }
3344 var metaHtml = metaParts.length
3345 ? '<span class="evf-plan-meta">' + metaParts.join(' &middot; ') + '</span>'
3346 : '';
3347
3348 var liHtml = '<label class="everest-forms-field-label-inline"><span class="evf-plan-wrap">' + mainHtml + metaHtml + '</span></label>';
3349
3350 var itemClass = isDefault ? 'everest-forms-selected' : '';
3351 html += '<li class="' + itemClass + '"><input type="radio" disabled>' + liHtml + '</li>';
3352 });
3353
3354 $preview.html(html);
3355 },
3356
3357 bindFormSettings: function () {
3358 $('body').on('click', '.evf-setting-panel', function (e) {
3359 if ($(this).hasClass('upgrade-addons-settings')) {
3360 return;
3361 }
3362
3363 var data_setting_section = $(this).attr('data-section');
3364 $('.evf-setting-panel').removeClass('active');
3365 $('.everest-forms-active-email').removeClass('active');
3366 $('.everest-forms-active-sms-notifications').removeClass('active');
3367 $('.everest-forms-active-conversational-forms').removeClass('active');
3368 $('.evf-content-section').removeClass('active');
3369 $(this).addClass('active');
3370 $('.evf-content-' + data_setting_section + '-settings').addClass(
3371 'active',
3372 );
3373 e.preventDefault();
3374 });
3375
3376
3377 $('.evf-setting-panel').eq(0).trigger('click');
3378 },
3379 bindFormEmail: function () {
3380 $('body').on(
3381 'click',
3382 '.everest-forms-panel-sidebar-section-email',
3383 function (e) {
3384 $(this).siblings('.everest-forms-active-email').removeClass('active');
3385 $(this).next('.everest-forms-active-email').addClass('active');
3386 var container = $(this)
3387 .siblings('.everest-forms-active-email.active')
3388 .find('.everest-forms-active-email-connections-list li');
3389
3390 if (container.length) {
3391 container.children('.user-nickname').first().trigger('click');
3392 }
3393 e.preventDefault();
3394 },
3395 );
3396 },
3397 bindFormSmsNotifications: function () {
3398 $('body').on(
3399 'click',
3400 '.everest-forms-panel-sidebar-section-sms-notifications',
3401 function (e) {
3402 $(this)
3403 .siblings('.everest-forms-active-sms-notifications')
3404 .removeClass('active');
3405 $(this)
3406 .next('.everest-forms-active-sms-notifications')
3407 .addClass('active');
3408 var container = $(this)
3409 .siblings('.everest-forms-active-sms-notifications.active')
3410 .find(
3411 '.everest-forms-active-sms-notifications-connections-list li',
3412 );
3413
3414 if (container.length) {
3415 container.children('.user-nickname').first().trigger('click');
3416 }
3417 e.preventDefault();
3418 },
3419 );
3420 },
3421 bindFormConversational: function () {
3422 $('body').on(
3423 'click',
3424 '.everest-forms-panel-sidebar-section-conversational-forms ',
3425 function (e) {
3426 var $this = $(this);
3427 $(this)
3428 .siblings('.everest-forms-active-conversational-forms')
3429 .removeClass('active');
3430 $(this)
3431 .next('.everest-forms-active-conversational-forms')
3432 .addClass('active');
3433 var container = $(this).siblings(
3434 '.everest-forms-active-conversational-forms.active',
3435 );
3436
3437 if (container.length) {
3438 container.children('.evf-content-tab ').trigger('click');
3439 }
3440 e.preventDefault();
3441 },
3442 );
3443 },
3444 bindFormIntegrations: function () {
3445 $('body').on('click', '.evf-integrations-panel', function (e) {
3446 if ($(this).hasClass('upgrade-addons-settings')) {
3447 e.preventDefault();
3448 return;
3449 }
3450
3451 if ($(this).hasClass('evf-addon-install-trigger')) {
3452 e.preventDefault();
3453 return;
3454 }
3455
3456 var data_setting_section = $(this).attr('data-section');
3457 $('.evf-integrations-panel').removeClass('active');
3458 $('#everest-forms-panel-integrations')
3459 .find('.evf-panel-content-section')
3460 .removeClass('active');
3461 $(this).addClass('active');
3462 $(this)
3463 .parent()
3464 .find('.everest-forms-active-connections')
3465 .removeClass('active');
3466 $(this).next('.everest-forms-active-connections').addClass('active');
3467 var container = $(this)
3468 .siblings('.everest-forms-active-connections.active')
3469 .find('.everest-forms-active-connections-list li');
3470
3471 if (container.length) {
3472 container.children('.user-nickname').first().trigger('click');
3473 }
3474 $('.evf-panel-content-section-' + data_setting_section).addClass(
3475 'active',
3476 );
3477 e.preventDefault();
3478 });
3479 $('.evf-setting-panel').eq(0).trigger('click');
3480 },
3481 bindFormPayment: function () {
3482 $('body').on('click', '.evf-payments-panel', function (e) {
3483 if ($(this).hasClass('upgrade-addons-settings')) {
3484 e.preventDefault();
3485 return;
3486 }
3487
3488 var data_setting_section = $(this).attr('data-section');
3489 $('.evf-payments-panel').removeClass('active');
3490 $(this).siblings().removeClass('icon active');
3491 $(this).addClass('active');
3492 $(this)
3493 .parents('#everest-forms-panel-payments')
3494 .find('.evf-payment-setting-content')
3495 .removeClass('active')
3496 .hide();
3497 $('.evf-content-' + data_setting_section + '-settings')
3498 .addClass('active')
3499 .show();
3500 e.preventDefault();
3501 });
3502
3503 $('.evf-setting-panel').eq(0).trigger('click');
3504 },
3505 removeRow: function (row) {
3506 $.each(row.find('.everest-forms-field'), function () {
3507 var field_id = $(this).attr('data-field-id'),
3508 field_type = $(this).attr('data-field-type'),
3509 field_options = $('#everest-forms-field-option-' + field_id);
3510
3511 // Trigger before-delete event so addons can react.
3512 $(document.body).trigger('evf_before_field_deleted', [field_id]);
3513
3514 // Remove conditional logic references for this field.
3515 EVFPanelBuilder.conditionalLogicRemoveField(field_id);
3516 EVFPanelBuilder.conditionalLogicRemoveFieldIntegration(field_id);
3517 EVFPanelBuilder.paymentFieldRemoveFromQuantity(field_id);
3518 EVFPanelBuilder.oneTimeDraggableRemoveField(field_type);
3519
3520 $(this).remove();
3521
3522 field_options.remove();
3523 });
3524
3525 row.remove();
3526 },
3527 bindRemoveRow: function () {
3528 $('body').on('click', '.evf-delete-row', function () {
3529 var $this = $(this),
3530 total_rows = $('.evf-admin-row').length,
3531 current_row = $this.closest('.evf-admin-row'),
3532 row_id = current_row.attr('data-row-id'),
3533 current_part = $this
3534 .parents('.evf-admin-field-container')
3535 .attr('data-current-part'),
3536 multipart_active = $('#everest-forms-builder').hasClass(
3537 'multi-part-activated',
3538 );
3539
3540 if (current_part && multipart_active) {
3541 total_rows = $('#part_' + current_part).find('.evf-admin-row').length;
3542 }
3543
3544 if (total_rows < 2) {
3545 $.alert({
3546 title: evf_data.i18n_row_locked,
3547 content: evf_data.i18n_single_row_locked_msg,
3548 icon: 'dashicons dashicons-info',
3549 type: 'blue',
3550 buttons: {
3551 confirm: {
3552 text: evf_data.i18n_close,
3553 btnClass: 'btn-confirm',
3554 keys: ['enter'],
3555 },
3556 },
3557 });
3558 } else {
3559 $.confirm({
3560 title: false,
3561 content: evf_data.i18n_delete_row_confirm,
3562 type: 'red',
3563 closeIcon: false,
3564 backgroundDismiss: false,
3565 icon: 'dashicons dashicons-warning',
3566 buttons: {
3567 confirm: {
3568 text: evf_data.i18n_ok,
3569 btnClass: 'btn-confirm',
3570 keys: ['enter'],
3571 action: function () {
3572 EVFPanelBuilder.removeRow(current_row);
3573 $('.everest-forms-fields-tab')
3574 .find('a')
3575 .removeClass('active');
3576 $('.everest-forms-fields-tab')
3577 .find('a')
3578 .first()
3579 .addClass('active');
3580 $('.everest-forms-add-fields').show();
3581 $('#everest-forms-row-option-row_' + row_id).remove();
3582 },
3583 },
3584 cancel: {
3585 text: evf_data.i18n_cancel,
3586 },
3587 },
3588 });
3589 }
3590 });
3591 },
3592 /**
3593 * Row/canvas zones where layout presets can be dropped (main wrapper or multi-part #part_*).
3594 *
3595 * @return {jQuery}
3596 */
3597 getLayoutDropZones: function () {
3598 var $collection = $();
3599 $('.evf-admin-field-wrapper').each(function () {
3600 var $w = $(this);
3601 var $parts = $w.children('[id^="part_"]');
3602 if ($parts.length) {
3603 $collection = $collection.add($parts);
3604 } else {
3605 $collection = $collection.add($w);
3606 }
3607 });
3608 return $collection;
3609 },
3610 /**
3611 * Add a new row with a specific column layout.
3612 *
3613 * @param {number} columns Number of columns (1–4).
3614 * @param {jQuery|null} $afterRow Insert after this row.
3615 * @param {jQuery|null} $beforeRow Insert before this row (takes precedence over $afterRow).
3616 * @param {jQuery|null} $dropContext Element inside the builder (e.g. drop zone) to resolve multi-part wrapper.
3617 */
3618 addLayoutContainer: function (columns, $afterRow, $beforeRow, $dropContext) {
3619 var wrapper = $('.evf-admin-field-wrapper');
3620
3621 if ($dropContext && $dropContext.length) {
3622 var current_part = $dropContext
3623 .closest('.evf-admin-field-container')
3624 .attr('data-current-part');
3625 if (current_part) {
3626 var $partWrap = wrapper.find('#part_' + current_part);
3627 if ($partWrap.length) {
3628 wrapper = $partWrap;
3629 }
3630 }
3631 }
3632
3633 var row_ids = $('.evf-admin-row')
3634 .map(function () {
3635 return $(this).data('row-id');
3636 })
3637 .get(),
3638 max_row_id = row_ids.length ? Math.max.apply(Math, row_ids) : 0,
3639 row_clone = $('.evf-admin-row').eq(0).clone(),
3640 total_rows =
3641 parseInt($('.evf-add-row').first().attr('data-total-rows'), 10) || 0;
3642
3643 var current_part = $('.evf-admin-field-container').attr('data-current-part');
3644
3645 if (current_part) {
3646 wrapper = $('.evf-admin-field-wrapper').find('#part_' + current_part);
3647 }
3648
3649 max_row_id++;
3650 total_rows++;
3651
3652 row_clone.find('.evf-admin-grid').html('');
3653 row_clone.attr('data-row-id', max_row_id);
3654
3655 $('.evf-add-row').attr('data-total-rows', total_rows);
3656 $('.evf-add-row').attr('data-next-row-id', max_row_id);
3657
3658 if ($beforeRow && $beforeRow.length) {
3659 $beforeRow.before(row_clone);
3660 } else if ($afterRow && $afterRow.length) {
3661 $afterRow.after(row_clone);
3662 } else {
3663 wrapper.append(row_clone);
3664 }
3665
3666 row_clone
3667 .find('.evf-grid-selector[data-evf-grid="' + columns + '"]')
3668 .trigger('click');
3669
3670 EVFPanelBuilder.bindFields();
3671 EVFPanelBuilder.checkEmptyGrid();
3672
3673 if ($('.everest-forms-row-options').length) {
3674 var _row_id = max_row_id,
3675 _evf_data = window.evf_data;
3676 $.ajax({
3677 url: _evf_data.ajax_url,
3678 type: 'POST',
3679 data: {
3680 action: 'everest_forms_new_row',
3681 security: _evf_data.evf_add_row_nonce,
3682 form_id: _evf_data.form_id,
3683 row_id: _row_id,
3684 },
3685 success: function (xhr) {
3686 if (true === xhr.success && 'undefined' !== typeof xhr.data.html) {
3687 $(document)
3688 .find('.everest-forms-row-option-group')
3689 .append(xhr.data.html);
3690 EVFPanelBuilder.conditionalLogicAppendRow(_row_id);
3691 $(
3692 '#everest-forms-panel-field-form_rows-connection_row_' +
3693 _row_id +
3694 '-conditional_logic_status',
3695 ).prop('checked', false);
3696 }
3697 },
3698 });
3699 }
3700
3701 $('html, body').animate({ scrollTop: row_clone.offset().top - 100 }, 400);
3702 },
3703 bindLayoutContainers: function () {
3704 $('body').on('click', '.evf-layout-container-btn', function () {
3705 var columns = parseInt($(this).data('columns'), 10),
3706 $fieldContainer = $('.evf-admin-field-container:visible').first();
3707
3708 if (!$fieldContainer.length) {
3709 $fieldContainer = $('.evf-admin-field-container').first();
3710 }
3711
3712 var wrapper = $('.evf-admin-field-wrapper'),
3713 current_part = $fieldContainer.attr('data-current-part');
3714
3715 if (current_part) {
3716 var $partWrap = wrapper.find('#part_' + current_part);
3717 if ($partWrap.length) {
3718 wrapper = $partWrap;
3719 }
3720 }
3721
3722 var $lastRow = wrapper.children('.evf-admin-row').last();
3723 if ($lastRow.length) {
3724 EVFPanelBuilder.addLayoutContainer(
3725 columns,
3726 $lastRow,
3727 null,
3728 $fieldContainer,
3729 );
3730 } else {
3731 EVFPanelBuilder.addLayoutContainer(
3732 columns,
3733 null,
3734 null,
3735 $fieldContainer,
3736 );
3737 }
3738 });
3739 },
3740 bindAddRowColumnPicker: function () {
3741 if (!$('#evf-add-row-picker').length) {
3742 var $pickerGrid = $('<div></div>').css({
3743 display: 'grid',
3744 'grid-template-columns': 'repeat(4, 1fr)',
3745 gap: '6px',
3746 });
3747
3748 $('.evf-layout-container-btn').each(function () {
3749 var $btn = $(this),
3750 cols = parseInt($btn.data('columns'), 10),
3751 label = $btn.text().trim(),
3752 svgHtml = $btn.find('svg').prop('outerHTML') || '';
3753
3754 var $pickerBtn = $('<button type="button"></button>')
3755 .attr('data-columns', cols)
3756 .css({
3757 display: 'flex',
3758 'flex-direction': 'column',
3759 'align-items': 'center',
3760 'justify-content': 'center',
3761 padding: '10px 8px',
3762 border: '1px solid #edeff7',
3763 'border-radius': '4px',
3764 cursor: 'pointer',
3765 'font-size': '11px',
3766 'text-align': 'center',
3767 background: '#fbfbfd',
3768 color: '#383838',
3769 gap: '4px',
3770 'min-width': '80px',
3771 transition: 'border-color .12s,color .12s,background .12s',
3772 })
3773 .append(
3774 $('<span></span>')
3775 .css({ display: 'block', 'line-height': '1' })
3776 .html(svgHtml),
3777 )
3778 .append($('<span></span>').text(label));
3779
3780 $pickerGrid.append($pickerBtn);
3781 });
3782
3783 $('body').append(
3784 $('<div id="evf-add-row-picker"></div>')
3785 .css({
3786 display: 'none',
3787 position: 'fixed',
3788 background: '#fff',
3789 border: '1px solid #edeff7',
3790 'border-radius': '8px',
3791 'box-shadow': '0 8px 24px rgba(0,0,0,.08)',
3792 'z-index': '999999',
3793 padding: '10px',
3794 overflow: 'visible',
3795 })
3796 .append(
3797 '<div id="evf-add-row-picker-arrow" style="position:absolute;left:50%;transform:translateX(-50%);width:14px;height:8px;pointer-events:none;"></div>',
3798 )
3799 .append($pickerGrid),
3800 );
3801
3802 $('head').append(
3803 '<style id="evf-add-row-picker-style">' +
3804 '#evf-add-row-picker-arrow::before,#evf-add-row-picker-arrow::after{content:"";position:absolute;left:0;border-left:7px solid transparent;border-right:7px solid transparent}' +
3805 '#evf-add-row-picker-arrow::before{border-top:8px solid #edeff7;top:0}' +
3806 '#evf-add-row-picker-arrow::after{border-top:8px solid #fff;top:-1px}' +
3807 '#evf-add-row-picker-arrow.evf-arrow-down::before{border-top:none;border-bottom:8px solid #edeff7;top:auto;bottom:0}' +
3808 '#evf-add-row-picker-arrow.evf-arrow-down::after{border-top:none;border-bottom:8px solid #fff;bottom:1px}' +
3809 '</style>',
3810 );
3811
3812 $('#evf-add-row-picker svg').css({
3813 width: '24px',
3814 height: '24px',
3815 display: 'block',
3816 });
3817 }
3818
3819 // Intercept Add Row click (non-repeater) before bindAddNewRow fires.
3820 $('body').on(
3821 'click',
3822 '.evf-add-row:not(.repeater-row) span',
3823 function (e) {
3824 e.stopImmediatePropagation();
3825 var $span = $(this),
3826 $picker = $('#evf-add-row-picker'),
3827 $arrow = $('#evf-add-row-picker-arrow');
3828
3829 if ($picker.is(':visible')) {
3830 $picker.hide();
3831 return;
3832 }
3833
3834 var offset = $span.offset(),
3835 scrollLeft = $(window).scrollLeft(),
3836 scrollTop = $(window).scrollTop(),
3837 spanCX = offset.left - scrollLeft + $span.outerWidth() / 2,
3838 margin = 8;
3839
3840 $picker.show();
3841
3842 var pickerH = $picker.outerHeight(),
3843 pickerW = $picker.outerWidth(),
3844 top = offset.top - scrollTop - pickerH - 8,
3845 flipped = false;
3846
3847 if (top < margin) {
3848 top = offset.top - scrollTop + $span.outerHeight() + 8;
3849 flipped = true;
3850 }
3851
3852 var left = spanCX - pickerW / 2;
3853 left = Math.min(
3854 Math.max(margin, left),
3855 window.innerWidth - pickerW - margin,
3856 );
3857
3858 // Arrow: points toward the button
3859 var arrowX = spanCX - left - 7;
3860 arrowX = Math.min(Math.max(14, arrowX), pickerW - 28);
3861 if (flipped) {
3862 // Picker is below button — arrow at top pointing up toward button
3863 $arrow
3864 .addClass('evf-arrow-down')
3865 .css({ top: '-8px', bottom: 'auto', left: arrowX + 'px' });
3866 } else {
3867 // Picker is above button — arrow at bottom pointing down toward button
3868 $arrow
3869 .removeClass('evf-arrow-down')
3870 .css({ bottom: '-8px', top: 'auto', left: arrowX + 'px' });
3871 }
3872
3873 $picker.css({ top: top, left: left });
3874 },
3875 );
3876
3877 $(document.body).on(
3878 'click',
3879 '#evf-add-row-picker button[data-columns]',
3880 function () {
3881 var cols = parseInt($(this).data('columns'), 10);
3882 $('#evf-add-row-picker').hide();
3883 var $fieldContainer = $('.evf-admin-field-container:visible').first();
3884 if (!$fieldContainer.length) {
3885 $fieldContainer = $('.evf-admin-field-container').first();
3886 }
3887
3888 var wrapper = $('.evf-admin-field-wrapper'),
3889 current_part = $fieldContainer.attr('data-current-part');
3890
3891 if (current_part) {
3892 var $partWrap = wrapper.find('#part_' + current_part);
3893 if ($partWrap.length) {
3894 wrapper = $partWrap;
3895 }
3896 }
3897
3898 var $lastRow = wrapper.children('.evf-admin-row').last();
3899 if ($lastRow.length) {
3900 EVFPanelBuilder.addLayoutContainer(
3901 cols,
3902 $lastRow,
3903 null,
3904 $fieldContainer,
3905 );
3906 } else {
3907 EVFPanelBuilder.addLayoutContainer(
3908 cols,
3909 null,
3910 null,
3911 $fieldContainer,
3912 );
3913 }
3914 },
3915 );
3916
3917 $(document.body)
3918 .on(
3919 'mouseenter',
3920 '#evf-add-row-picker button[data-columns]',
3921 function () {
3922 $(this).css({
3923 'border-color': '#8c64c6',
3924 color: '#8c64c6',
3925 background: '#fff',
3926 });
3927 },
3928 )
3929 .on(
3930 'mouseleave',
3931 '#evf-add-row-picker button[data-columns]',
3932 function () {
3933 $(this).css({
3934 'border-color': '#edeff7',
3935 color: '#383838',
3936 background: '#fbfbfd',
3937 });
3938 },
3939 );
3940
3941 $(document).on('click.evf-add-row-picker', function (e) {
3942 if (!$(e.target).closest('#evf-add-row-picker, .evf-add-row').length) {
3943 $('#evf-add-row-picker').hide();
3944 }
3945 });
3946 },
3947 bindAddNewRow: function () {
3948 $('body').on('click', '.evf-add-row span', function () {
3949 $('#add-fields').trigger('click');
3950 var $this = $(this),
3951 wrapper = $('.evf-admin-field-wrapper'),
3952 row_ids = $('.evf-admin-row')
3953 .map(function () {
3954 return $(this).data('row-id');
3955 })
3956 .get(),
3957 max_row_id = Math.max.apply(Math, row_ids),
3958 row_clone = $('.evf-admin-row').eq(0).clone(),
3959 total_rows = $this.parent().attr('data-total-rows'),
3960 current_part = $this
3961 .parents('.evf-admin-field-container')
3962 .attr('data-current-part');
3963
3964 max_row_id++;
3965 total_rows++;
3966
3967 if (current_part) {
3968 wrapper = $('.evf-admin-field-wrapper').find('#part_' + current_part);
3969 }
3970
3971 // Row clone.
3972 row_clone.find('.evf-admin-grid').html('');
3973 row_clone.attr('data-row-id', max_row_id);
3974
3975 // Row infos.
3976 $this.parent().attr('data-total-rows', total_rows);
3977 $this.parent().attr('data-next-row-id', max_row_id);
3978
3979 if (
3980 0 < $('.everest-forms-row-options').length &&
3981 false === $this.closest('.evf-add-row').hasClass('repeater-row')
3982 ) {
3983 row_clone.find('div').hide();
3984
3985 row_clone
3986 .css({
3987 padding: '40px',
3988 })
3989 .append(
3990 '<i class="spinner is-active" style="margin:0px auto;"></i>',
3991 );
3992
3993 // Row append.
3994 wrapper.append(row_clone);
3995
3996 // Initialize fields UI.
3997 EVFPanelBuilder.bindFields();
3998 EVFPanelBuilder.checkEmptyGrid();
3999
4000 var row_id = row_clone.attr('data-row-id'),
4001 evf_data = window.evf_data;
4002 $.ajax({
4003 url: evf_data.ajax_url,
4004 type: 'POST',
4005 data: {
4006 action: 'everest_forms_new_row',
4007 security: evf_data.evf_add_row_nonce,
4008 form_id: evf_data.form_id,
4009 row_id: row_id,
4010 },
4011 success: function (xhr) {
4012 if (true === xhr.success) {
4013 if ('undefined' !== typeof xhr.data.html) {
4014 $(document)
4015 .find('.everest-forms-row-option-group')
4016 .append(xhr.data.html);
4017 EVFPanelBuilder.conditionalLogicAppendRow(row_id);
4018 // Disable conditional logic by default.
4019 $(
4020 '#everest-forms-panel-field-form_rows-connection_row_' +
4021 row_id +
4022 '-conditional_logic_status',
4023 ).prop('checked', false);
4024 }
4025 }
4026 },
4027 }).always(function () {
4028 row_clone.css({ padding: 0 });
4029
4030 row_clone.find('div').show();
4031
4032 row_clone.find('.evf-toggle-row-content').css('display', 'none');
4033
4034 row_clone.find('i').remove();
4035
4036 // Trigger event after row add.
4037 $this.trigger('everest-forms-after-add-row', row_clone);
4038 });
4039 } else {
4040 // Row append.
4041 wrapper.append(row_clone);
4042 // Initialize fields UI.
4043 EVFPanelBuilder.bindFields();
4044 EVFPanelBuilder.checkEmptyGrid();
4045 // Trigger event after row add.
4046 $this.trigger('everest-forms-after-add-row', row_clone);
4047 }
4048 });
4049 },
4050 bindCloneField: function () {
4051 $('body').on(
4052 'click',
4053 '.everest-forms-preview .everest-forms-field .everest-forms-field-duplicate',
4054 function () {
4055 var $field = $(this).closest('.everest-forms-field');
4056
4057 if ($field.hasClass('no-duplicate')) {
4058 $.alert({
4059 title: evf_data.i18n_field_locked,
4060 content: evf_data.i18n_field_locked_msg,
4061 icon: 'dashicons dashicons-info',
4062 type: 'blue',
4063 buttons: {
4064 confirm: {
4065 text: evf_data.i18n_close,
4066 btnClass: 'btn-confirm',
4067 keys: ['enter'],
4068 },
4069 },
4070 });
4071 } else {
4072 $.confirm({
4073 title: false,
4074 content: evf_data.i18n_duplicate_field_confirm,
4075 type: 'orange',
4076 closeIcon: false,
4077 backgroundDismiss: false,
4078 icon: 'dashicons dashicons-warning',
4079 buttons: {
4080 confirm: {
4081 text: evf_data.i18n_ok,
4082 btnClass: 'btn-confirm',
4083 keys: ['enter'],
4084 action: function () {
4085 EVFPanelBuilder.cloneFieldAction($field);
4086 },
4087 },
4088 cancel: {
4089 text: evf_data.i18n_cancel,
4090 },
4091 },
4092 });
4093 }
4094 },
4095 );
4096
4097 $('body').on('click', '.evf-admin-row .evf-duplicate-row', function () {
4098 var $row = $(this).closest('.evf-admin-row');
4099 if ($row.find('.everest-forms-field').hasClass('no-duplicate')) {
4100 $.alert({
4101 title: evf_data.i18n_field_locked,
4102 content: evf_data.i18n_row_locked_msg,
4103 icon: 'dashicons dashicons-info',
4104 type: 'blue',
4105 buttons: {
4106 confirm: {
4107 text: evf_data.i18n_close,
4108 btnClass: 'btn-confirm',
4109 keys: ['enter'],
4110 },
4111 },
4112 });
4113 } else {
4114 $.confirm({
4115 title: false,
4116 content: evf_data.i18n_duplicate_row_confirm,
4117 type: 'orange',
4118 closeIcon: false,
4119 backgroundDismiss: false,
4120 icon: 'dashicons dashicons-warning',
4121 buttons: {
4122 confirm: {
4123 text: evf_data.i18n_ok,
4124 btnClass: 'btn-confirm',
4125 keys: ['enter'],
4126 action: function () {
4127 EVFPanelBuilder.cloneRowAction($row);
4128 },
4129 },
4130 cancel: {
4131 text: evf_data.i18n_cancel,
4132 },
4133 },
4134 });
4135 }
4136 });
4137 },
4138 cloneRowAction: function (row) {
4139 (row_ids = $('.evf-admin-row')
4140 .map(function () {
4141 return $(this).data('row-id');
4142 })
4143 .get()),
4144 (max_row_id = Math.max.apply(Math, row_ids)),
4145 (row_clone = row.clone()),
4146 (total_rows = $('.evf-add-row').attr('data-total-rows'));
4147 max_row_id++;
4148 total_rows++;
4149
4150 // New row ID.
4151 row_clone.attr('data-row-id', max_row_id);
4152 // Initialize fields UI.
4153 $('.evf-add-row').attr('data-total-rows', total_rows);
4154 $('.evf-add-row').attr('data-next-row-id', max_row_id);
4155
4156 var data = {
4157 action: 'everest_forms_get_next_id',
4158 security: evf_data.evf_get_next_id,
4159 form_id: evf_data.form_id,
4160 fields: row_clone.find('.everest-forms-field').length,
4161 };
4162
4163 $.ajax({
4164 url: evf_data.ajax_url,
4165 data: data,
4166 type: 'POST',
4167 beforeSend: function () {
4168 $(document.body).trigger('init_field_options_toggle');
4169 },
4170 success: function (response) {
4171 if (
4172 typeof response.success === 'boolean' &&
4173 response.success === true
4174 ) {
4175 // Row append.
4176 row.after(row_clone);
4177 // Duplicating Fields
4178 $.each(response.data, function (index, data) {
4179 var field_id = data.field_id;
4180 var field_key = data.field_key;
4181 $('#everest-forms-field-id').val(field_id);
4182 field = row_clone.find('.everest-forms-field').eq(index);
4183 var element_field_id = field.attr('data-field-id');
4184 EVFPanelBuilder.render_node(field, element_field_id, field_key);
4185 field.remove();
4186 $(document.body).trigger('init_field_options_toggle');
4187 });
4188 // Binding fields.
4189 EVFPanelBuilder.bindFields();
4190 }
4191 },
4192 });
4193 },
4194 cloneFieldAction: function (field) {
4195 var element_field_id = field.attr('data-field-id');
4196 var form_id = evf_data.form_id;
4197 var data = {
4198 action: 'everest_forms_get_next_id',
4199 security: evf_data.evf_get_next_id,
4200 form_id: form_id,
4201 };
4202 $.ajax({
4203 url: evf_data.ajax_url,
4204 data: data,
4205 type: 'POST',
4206 beforeSend: function () {
4207 $(document.body).trigger('init_field_options_toggle');
4208 },
4209 success: function (response) {
4210 if (
4211 typeof response.success === 'boolean' &&
4212 response.success === true
4213 ) {
4214 var field_id = response.data.field_id;
4215 var field_key = response.data.field_key;
4216 $('#everest-forms-field-id').val(field_id);
4217 EVFPanelBuilder.render_node(field, element_field_id, field_key);
4218 $(document.body).trigger('init_field_options_toggle');
4219 }
4220 },
4221 });
4222 },
4223 render_node: function (field, old_key, new_key) {
4224 var option = $(
4225 '.everest-forms-field-options #everest-forms-field-option-' + old_key,
4226 );
4227 var old_field_label = $(
4228 '#everest-forms-field-option-' + old_key + '-label',
4229 ).val();
4230 var old_field_meta_key = $(
4231 '#everest-forms-field-option-' + old_key + '-meta-key',
4232 ).length
4233 ? $('#everest-forms-field-option-' + old_key + '-meta-key').val()
4234 : '';
4235 var field_type = field.attr('data-field-type'),
4236 newOptionHtml = option.html(),
4237 new_field_label = old_field_label + ' ' + evf_data.i18n_copy,
4238 new_meta_key =
4239 'html' !== field_type
4240 ? old_field_meta_key
4241 .replace(/\(|\)/g, '')
4242 .toLowerCase()
4243 .substring(0, old_field_meta_key.lastIndexOf('_')) +
4244 '_' +
4245 Math.floor(1000 + Math.random() * 9000)
4246 : '',
4247 newFieldCloned = field.clone();
4248 var regex = new RegExp(old_key, 'g');
4249 newOptionHtml = newOptionHtml.replace(regex, new_key);
4250 var newOption = $(
4251 '<div class="everest-forms-field-option everest-forms-field-option-' +
4252 field_type +
4253 '" id="everest-forms-field-option-' +
4254 new_key +
4255 '" data-field-id="' +
4256 new_key +
4257 '" />',
4258 );
4259 newOption.append(newOptionHtml);
4260 $.each(option.find(':input'), function () {
4261 var type = $(this).attr('type');
4262 var name = $(this).attr('name') ? $(this).attr('name') : '';
4263 var new_name = name.replace(regex, new_key);
4264 var value = '';
4265 if (type === 'text' || type === 'hidden') {
4266 value = $(this).val();
4267 newOption.find('input[name="' + new_name + '"]').val(value);
4268 newOption.find('input[value="' + old_key + '"]').val(new_key);
4269 } else if (type === 'checkbox' || type === 'radio') {
4270 if ($(this).is(':checked')) {
4271 newOption
4272 .find('input[name="' + new_name + '"]')
4273 .prop('checked', true)
4274 .attr('checked', 'checked');
4275 } else {
4276 newOption
4277 .find('[name="' + new_name + '"]')
4278 .prop('checked', false)
4279 .attr('checked', false);
4280 }
4281 } else if ($(this).is('select')) {
4282 if ($(this).find('option:selected').length) {
4283 var option_value = $(this).find('option:selected').val();
4284 newOption
4285 .find('[name="' + new_name + '"]')
4286 .find('[value="' + option_value + '"]')
4287 .prop('selected', true);
4288 }
4289 } else {
4290 if ($(this).val() !== '') {
4291 newOption.find('[name="' + new_name + '"]').val($(this).val());
4292 }
4293 }
4294 });
4295
4296 $('.everest-forms-field-options').append(newOption);
4297 $('#everest-forms-field-option-' + new_key + '-label').val(
4298 new_field_label,
4299 );
4300 $('#everest-forms-field-option-' + new_key + '-meta-key').val(
4301 new_meta_key,
4302 );
4303
4304 // Field Clone
4305 newFieldCloned.attr('class', field.attr('class'));
4306 newFieldCloned.attr('id', 'everest-forms-field-' + new_key);
4307 newFieldCloned.attr('data-field-id', new_key);
4308 newFieldCloned.attr('data-field-type', field_type);
4309 newFieldCloned.find('.label-title .text').text(new_field_label);
4310 field
4311 .closest('.evf-admin-grid')
4312 .find('[data-field-id="' + old_key + '"]')
4313 .after(newFieldCloned);
4314 $(document).trigger('everest-form-cloned', [new_key, field_type]);
4315 EVFPanelBuilder.switchToFieldOptionPanel(new_key); //switch to cloned field options
4316
4317 // Trigger an event indicating completion of render_node action for cloning.
4318 $(document.body).trigger('evf_render_node_complete', [
4319 field_type,
4320 new_key,
4321 newFieldCloned,
4322 newOption,
4323 ]);
4324 EVFPanelBuilder.updateBulkActionBar();
4325 },
4326 bindFieldDelete: function () {
4327 $('body').on(
4328 'click',
4329 '.everest-forms-preview .everest-forms-field .everest-forms-field-delete',
4330 function () {
4331 var $field = $(this).closest('.everest-forms-field');
4332 var field_id = $field.attr('data-field-id');
4333 var option_field = $('#everest-forms-field-option-' + field_id);
4334 var grid = $(this).closest('.evf-admin-grid');
4335
4336 if ($field.hasClass('no-delete')) {
4337 $.alert({
4338 title: evf_data.i18n_field_locked,
4339 content: evf_data.i18n_field_locked_msg,
4340 icon: 'dashicons dashicons-info',
4341 type: 'blue',
4342 buttons: {
4343 confirm: {
4344 text: evf_data.i18n_close,
4345 btnClass: 'btn-confirm',
4346 keys: ['enter'],
4347 },
4348 },
4349 });
4350 } else {
4351 $.confirm({
4352 title: false,
4353 content: evf_data.i18n_delete_field_confirm,
4354 type: 'red',
4355 closeIcon: false,
4356 backgroundDismiss: false,
4357 icon: 'dashicons dashicons-warning',
4358 buttons: {
4359 confirm: {
4360 text: evf_data.i18n_ok,
4361 btnClass: 'btn-confirm',
4362 keys: ['enter'],
4363 action: function () {
4364 $('.evf-panel-fields-button').trigger('click');
4365 $field.fadeOut('slow', function () {
4366 var removed_el_id = $field.attr('data-field-id');
4367 var field_type = $field.attr('data-field-type');
4368 $(document.body).trigger('evf_before_field_deleted', [
4369 removed_el_id,
4370 ]);
4371 $field.remove();
4372 option_field.remove();
4373 EVFPanelBuilder.checkEmptyGrid();
4374 $('.everest-forms-fields-tab')
4375 .find('a')
4376 .removeClass('active');
4377 $('.everest-forms-fields-tab')
4378 .find('a')
4379 .first()
4380 .addClass('active');
4381 $('.everest-forms-add-fields').show();
4382 EVFPanelBuilder.conditionalLogicRemoveField(
4383 removed_el_id,
4384 );
4385 EVFPanelBuilder.conditionalLogicRemoveFieldIntegration(
4386 removed_el_id,
4387 );
4388 EVFPanelBuilder.paymentFieldRemoveFromQuantity(
4389 removed_el_id,
4390 );
4391 EVFPanelBuilder.oneTimeDraggableRemoveField(field_type);
4392 });
4393 },
4394 },
4395 cancel: {
4396 text: evf_data.i18n_cancel,
4397 },
4398 },
4399 });
4400 }
4401 },
4402 );
4403 },
4404 bindFieldMultiSelect: function () {
4405 if (!$('#evf-multi-select-style').length) {
4406 $('head').append(
4407 '<style id="evf-multi-select-style">' +
4408 '.evf-field-selected{box-shadow:0 0 0 2px #7e3bd0!important;z-index:2;position:relative;border-radius:4px}' +
4409 '.evf-field-selected:hover{border:1px solid transparent!important;background:transparent!important}' +
4410 '.evf-field-selected::after{content:"\\2713";position:absolute;top:-8px;right:-8px;width:18px;height:18px;background:#7e3bd0;border-radius:50%;color:#fff;font-size:10px;font-weight:700;line-height:18px;text-align:center;pointer-events:none;z-index:10}' +
4411 '#evf-bulk-action-bar{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:#fff;border:1px solid #edeff7;border-radius:8px;padding:8px 12px;display:none;align-items:center;gap:6px;z-index:999999;box-shadow:0 8px 24px rgba(0,0,0,.08);white-space:nowrap;font-size:12px;color:#383838}' +
4412 '#evf-bulk-action-bar .evf-bulk-count{color:#7e3bd0;font-weight:600;font-size:12px;padding-right:2px}' +
4413 '#evf-bulk-action-bar .evf-bulk-sep{width:1px;height:20px;background:#edeff7;flex-shrink:0}' +
4414 '#evf-bulk-action-bar button{background:#fbfbfd;border:1px solid #edeff7;color:#383838;cursor:pointer;display:flex;align-items:center;gap:4px;padding:5px 10px;border-radius:4px;font-size:12px;transition:border-color .12s,color .12s,background .12s;line-height:1}' +
4415 '#evf-bulk-action-bar button:hover{border-color:#8c64c6;color:#8c64c6;background:#fff}' +
4416 '#evf-bulk-action-bar .evf-bulk-delete:hover{border-color:#dc3545;color:#dc3545;background:#fff}' +
4417 '#evf-bulk-action-bar .evf-bulk-deselect{background:transparent;border-color:transparent;color:#999;padding:5px 6px}' +
4418 '#evf-bulk-action-bar .evf-bulk-deselect:hover{border-color:#edeff7;color:#383838;background:#fbfbfd}' +
4419 '#evf-bulk-action-bar button .dashicons{font-size:14px;width:14px;height:14px;line-height:14px}' +
4420 '</style>',
4421 );
4422 }
4423
4424 if (!$('#evf-bulk-action-bar').length) {
4425 $('body').append(
4426 '<div id="evf-bulk-action-bar" role="toolbar">' +
4427 '<span class="evf-bulk-count"></span>' +
4428 '<div class="evf-bulk-sep"></div>' +
4429 '<button class="evf-bulk-move-up"><span class="dashicons dashicons-arrow-up-alt2"></span>Move Up</button>' +
4430 '<button class="evf-bulk-move-down"><span class="dashicons dashicons-arrow-down-alt2"></span>Move Down</button>' +
4431 '<div class="evf-bulk-sep"></div>' +
4432 '<button class="evf-bulk-delete"><span class="dashicons dashicons-trash"></span>Delete</button>' +
4433 '<div class="evf-bulk-sep"></div>' +
4434 '<button class="evf-bulk-deselect" title="Clear selection"><span class="dashicons dashicons-no-alt"></span></button>' +
4435 '</div>',
4436 );
4437 }
4438
4439 $(document.body).on(
4440 'click',
4441 '.everest-forms-preview .everest-forms-field',
4442 function (e) {
4443 if (!e.shiftKey) return;
4444 e.preventDefault();
4445 e.stopPropagation();
4446 $(this).toggleClass('evf-field-selected');
4447 EVFPanelBuilder.updateBulkActionBar();
4448 },
4449 );
4450
4451 $(document.body).on(
4452 'click',
4453 '#evf-bulk-action-bar .evf-bulk-deselect',
4454 function () {
4455 $('.evf-field-selected').removeClass('evf-field-selected');
4456 EVFPanelBuilder.updateBulkActionBar();
4457 },
4458 );
4459
4460 $(document.body).on(
4461 'click',
4462 '#evf-bulk-action-bar .evf-bulk-move-up',
4463 function () {
4464 var moved = false;
4465 $('.everest-forms-preview .evf-field-selected').each(function () {
4466 var $prev = $(this)
4467 .prevAll('.everest-forms-field:not(.evf-field-selected)')
4468 .first();
4469 if ($prev.length) {
4470 $prev.before($(this));
4471 moved = true;
4472 }
4473 });
4474 if (moved) {
4475 $(document).trigger('evf_sort_update_complete', {
4476 event: null,
4477 ui: null,
4478 });
4479 } else {
4480 $.alert({
4481 title: false,
4482 content: 'The selected ' + ($('.everest-forms-preview .evf-field-selected').length > 1 ? 'fields are' : 'field is') + ' already at the top.',
4483 icon: 'dashicons dashicons-info',
4484 type: 'blue',
4485 buttons: {
4486 ok: { text: 'OK', btnClass: 'btn-confirm', keys: ['enter'] },
4487 },
4488 });
4489 }
4490 },
4491 );
4492
4493 $(document.body).on(
4494 'click',
4495 '#evf-bulk-action-bar .evf-bulk-move-down',
4496 function () {
4497 var moved = false;
4498 $(
4499 $('.everest-forms-preview .evf-field-selected').toArray().reverse(),
4500 ).each(function () {
4501 var $next = $(this)
4502 .nextAll('.everest-forms-field:not(.evf-field-selected)')
4503 .first();
4504 if ($next.length) {
4505 $next.after($(this));
4506 moved = true;
4507 }
4508 });
4509 if (moved) {
4510 $(document).trigger('evf_sort_update_complete', {
4511 event: null,
4512 ui: null,
4513 });
4514 } else {
4515 $.alert({
4516 title: false,
4517 content: 'The selected ' + ($('.everest-forms-preview .evf-field-selected').length > 1 ? 'fields are' : 'field is') + ' already at the bottom.',
4518 icon: 'dashicons dashicons-info',
4519 type: 'blue',
4520 buttons: {
4521 ok: { text: 'OK', btnClass: 'btn-confirm', keys: ['enter'] },
4522 },
4523 });
4524 }
4525 },
4526 );
4527
4528 $(document.body).on(
4529 'click',
4530 '#evf-bulk-action-bar .evf-bulk-delete',
4531 function () {
4532 var $selected = $('.everest-forms-preview .evf-field-selected'),
4533 count = $selected.length;
4534 $.confirm({
4535 title: false,
4536 content:
4537 'Delete ' +
4538 count +
4539 ' selected field' +
4540 (count > 1 ? 's' : '') +
4541 '?',
4542 type: 'red',
4543 closeIcon: false,
4544 backgroundDismiss: false,
4545 icon: 'dashicons dashicons-warning',
4546 buttons: {
4547 confirm: {
4548 text: 'Delete',
4549 btnClass: 'btn-danger',
4550 action: function () {
4551 var pending = $selected.length;
4552 $('.evf-panel-fields-button').trigger('click');
4553 $selected.each(function () {
4554 var $field = $(this),
4555 fieldId = $field.attr('data-field-id'),
4556 field_type = $field.attr('data-field-type');
4557 $field.fadeOut(200, function () {
4558 $(document.body).trigger('evf_before_field_deleted', [
4559 fieldId,
4560 ]);
4561 $field.remove();
4562 $('#everest-forms-field-option-' + fieldId).remove();
4563 EVFPanelBuilder.conditionalLogicRemoveField(fieldId);
4564 EVFPanelBuilder.conditionalLogicRemoveFieldIntegration(
4565 fieldId,
4566 );
4567 EVFPanelBuilder.paymentFieldRemoveFromQuantity(fieldId);
4568 EVFPanelBuilder.oneTimeDraggableRemoveField(field_type);
4569 pending--;
4570 if (0 === pending) {
4571 EVFPanelBuilder.checkEmptyGrid();
4572 $('.everest-forms-fields-tab')
4573 .find('a')
4574 .removeClass('active');
4575 $('.everest-forms-fields-tab')
4576 .find('a')
4577 .first()
4578 .addClass('active');
4579 $('.everest-forms-add-fields').show();
4580 $('#evf-bulk-action-bar').hide();
4581 }
4582 });
4583 });
4584 },
4585 },
4586 cancel: {
4587 text: evf_data.i18n_close,
4588 btnClass: 'btn-default',
4589 },
4590 },
4591 });
4592 },
4593 );
4594
4595 $(document).on('keydown.evf-multi-select', function (e) {
4596 if (27 === e.keyCode && $('.evf-field-selected').length) {
4597 $('.evf-field-selected').removeClass('evf-field-selected');
4598 EVFPanelBuilder.updateBulkActionBar();
4599 }
4600 });
4601 },
4602 updateBulkActionBar: function () {
4603 var $bar = $('#evf-bulk-action-bar'),
4604 count = $('.evf-field-selected').length;
4605 if (count > 0) {
4606 $bar
4607 .find('.evf-bulk-count')
4608 .text(count + ' field' + (count > 1 ? 's' : '') + ' selected');
4609 $bar.css('display', 'flex');
4610 } else {
4611 $bar.hide();
4612 }
4613 },
4614 bindFieldDeleteWithKeyEvent: function () {
4615 $('body').on('keyup', function (e) {
4616 var $field = $('.everest-forms-preview .everest-forms-field.active');
4617 if (
4618 46 === e.which &&
4619 true === $field.hasClass('active') &&
4620 false === $field.hasClass('evf-delete-event-active')
4621 ) {
4622 if (false == $('.evf-admin-row').hasClass('evf-hover')) {
4623 return;
4624 }
4625 $field.addClass('evf-delete-event-active');
4626 var field_id = $field.attr('data-field-id');
4627 var option_field = $('#everest-forms-field-option-' + field_id);
4628 if ($field.hasClass('no-delete')) {
4629 $.alert({
4630 title: evf_data.i18n_field_locked,
4631 content: evf_data.i18n_field_locked_msg,
4632 icon: 'dashicons dashicons-info',
4633 type: 'blue',
4634 buttons: {
4635 confirm: {
4636 text: evf_data.i18n_close,
4637 btnClass: 'btn-confirm',
4638 keys: ['enter'],
4639 action: function () {
4640 $field.removeClass('evf-delete-event-active');
4641 },
4642 },
4643 },
4644 });
4645 } else {
4646 $.confirm({
4647 title: false,
4648 content: evf_data.i18n_delete_field_confirm,
4649 type: 'red',
4650 closeIcon: false,
4651 backgroundDismiss: false,
4652 icon: 'dashicons dashicons-warning',
4653 buttons: {
4654 confirm: {
4655 text: evf_data.i18n_ok,
4656 btnClass: 'btn-confirm',
4657 keys: ['enter'],
4658 action: function () {
4659 $('.evf-panel-fields-button').trigger('click');
4660 $field.fadeOut('slow', function () {
4661 var removed_el_id = $field.attr('data-field-id');
4662 $(document.body).trigger('evf_before_field_deleted', [
4663 removed_el_id,
4664 ]);
4665 $field.remove();
4666 option_field.remove();
4667 EVFPanelBuilder.checkEmptyGrid();
4668 $('.everest-forms-fields-tab')
4669 .find('a')
4670 .removeClass('active');
4671 $('.everest-forms-fields-tab')
4672 .find('a')
4673 .first()
4674 .addClass('active');
4675 $('.everest-forms-add-fields').show();
4676 EVFPanelBuilder.conditionalLogicRemoveField(
4677 removed_el_id,
4678 );
4679 EVFPanelBuilder.conditionalLogicRemoveFieldIntegration(
4680 removed_el_id,
4681 );
4682 EVFPanelBuilder.paymentFieldRemoveFromQuantity(
4683 removed_el_id,
4684 );
4685 });
4686 $field.removeClass('evf-delete-event-active');
4687 },
4688 },
4689 cancel: {
4690 text: evf_data.i18n_cancel,
4691 action: function () {
4692 $field.removeClass('evf-delete-event-active');
4693 },
4694 },
4695 },
4696 });
4697 }
4698 }
4699 });
4700 },
4701 syncSubscriptionPlanChoiceFieldsBeforeSave: function () {
4702 $(
4703 '.everest-forms-field-option-payment-subscription-plan .evf-choices-list > li',
4704 ).each(function () {
4705 var $li = $(this);
4706 var $trialEnable = $li.find('.evf-enable-trial-period');
4707 var $expiryEnable = $li.find('.evf-enable-expiry-date');
4708 var trialOn = $trialEnable.length && $trialEnable.is(':checked');
4709 var expiryOn = $expiryEnable.length && $expiryEnable.is(':checked');
4710 var $expiryInput = $li.find('.evf-radio-subscription-expiry-input');
4711
4712 // Exclude stale trial length fields when trial is off (prevents false trial in gateways).
4713 $li.find('.evf-spt-panel--trial input, .evf-spt-panel--trial select').prop(
4714 'disabled',
4715 !trialOn,
4716 );
4717
4718 // Exclude stale expiry date when expiry is off (do not infer enable from date alone).
4719 $expiryInput.prop('disabled', !expiryOn);
4720
4721 if (!expiryOn) {
4722 EVFPanelBuilder.clear_subscription_plan_expiry_date($li);
4723 } else if ($expiryInput.length && $expiryInput[0]._flatpickr) {
4724 var fp = $expiryInput[0]._flatpickr;
4725 if (fp.selectedDates && fp.selectedDates[0]) {
4726 $expiryInput.val(
4727 fp.formatDate(
4728 fp.selectedDates[0],
4729 $expiryInput.data('date-format') || 'Y-m-d',
4730 ),
4731 );
4732 }
4733 }
4734
4735 if ($trialEnable.length) {
4736 $trialEnable.prop('checked', !!trialOn);
4737 }
4738 });
4739 },
4740 bindSaveOption: function () {
4741 $('body').on('click', '.everest-forms-save-button', function () {
4742 var $this = $(this);
4743 var $form = $('form#everest-forms-builder-form');
4744 var structure = EVFPanelBuilder.getStructure();
4745 EVFPanelBuilder.syncSubscriptionPlanChoiceFieldsBeforeSave();
4746 var form_data = $form.serializeArray();
4747
4748 // Re-enable trial/expiry inputs so the builder UI stays interactive after save.
4749 $(
4750 '.everest-forms-field-option-payment-subscription-plan .evf-spt-panel--trial input, .everest-forms-field-option-payment-subscription-plan .evf-spt-panel--trial select',
4751 ).prop('disabled', false);
4752 $(
4753 '.everest-forms-field-option-payment-subscription-plan .evf-radio-subscription-expiry-input',
4754 ).prop('disabled', false);
4755 var form_title = $('#evf-edit-form-name').val().trim();
4756
4757 // Save form args.
4758 $(document).trigger('everest_forms_save_args', [form_data]);
4759
4760 if ('' === form_title) {
4761 $.alert({
4762 title: evf_data.i18n_field_title_empty,
4763 content: evf_data.i18n_field_title_payload,
4764 icon: 'dashicons dashicons-warning',
4765 type: 'red',
4766 buttons: {
4767 ok: {
4768 text: evf_data.i18n_ok,
4769 btnClass: 'btn-confirm',
4770 keys: ['enter'],
4771 },
4772 },
4773 });
4774 return;
4775 }
4776
4777 // Trigger a handler to let addon manipulate the form data if needed.
4778 if (
4779 $form.triggerHandler('everest_forms_process_ajax_data', [
4780 $this,
4781 form_data,
4782 ])
4783 ) {
4784 form_data = $form.triggerHandler('everest_forms_process_ajax_data', [
4785 $this,
4786 form_data,
4787 ]);
4788 }
4789
4790 $('.everest-forms-panel-content-wrap').block({
4791 message: null,
4792 overlayCSS: {
4793 background: '#fff',
4794 opacity: 0.6,
4795 },
4796 });
4797
4798 /* DB unwanted data erase start */
4799 var rfields_ids = [];
4800 $('.everest-forms-field[data-field-id]').each(function () {
4801 rfields_ids.push($(this).attr('data-field-id'));
4802 });
4803
4804 var form_data_length = form_data.length;
4805 while (form_data_length--) {
4806 if (form_data[form_data_length].name.startsWith('form_fields')) {
4807 var idflag = false;
4808 rfields_ids.forEach(function (element) {
4809 if (
4810 form_data[form_data_length].name.startsWith(
4811 'form_fields[' + element + ']',
4812 )
4813 ) {
4814 idflag = true;
4815 }
4816 });
4817 if (form_data_length > -1 && idflag === false) {
4818 form_data.splice(form_data_length, 1);
4819 }
4820 }
4821 }
4822 /* DB fix end */
4823
4824 var new_form_data = form_data.concat(structure);
4825 var data = {
4826 action: 'everest_forms_save_form',
4827 security: evf_data.evf_save_form,
4828 form_data: JSON.stringify(new_form_data),
4829 };
4830 $.ajax({
4831 url: evf_data.ajax_url,
4832 data: data,
4833 type: 'POST',
4834 beforeSend: function () {
4835 $this.addClass('processing');
4836 $this.find('.loading-dot').remove();
4837 $this.append('<span class="loading-dot"></span>');
4838 },
4839 success: function (response) {
4840 $this.removeClass('processing');
4841 $this.find('.loading-dot').remove();
4842
4843 //Response data of ajax.
4844 $(document).trigger('everest_forms_save_data', response.data);
4845
4846 if (!response.success) {
4847 $.alert({
4848 title: response.data.errorTitle,
4849 content: response.data.errorMessage,
4850 icon: 'dashicons dashicons-warning',
4851 type: 'red',
4852 buttons: {
4853 ok: {
4854 text: evf_data.i18n_ok,
4855 btnClass: 'btn-confirm',
4856 keys: ['enter'],
4857 },
4858 },
4859 });
4860 }
4861
4862 $('.everest-forms-panel-content-wrap').unblock();
4863 },
4864 });
4865 });
4866 },
4867 bindEmbedOption: function () {
4868 $('body').on('click', '.everest-forms-embed-button', function () {
4869 var data = {
4870 action: 'everest_forms_embed_form',
4871 security: evf_data.evf_embed_form,
4872 };
4873 var $this = $(this);
4874
4875 $.ajax({
4876 url: evf_data.ajax_url,
4877 data: data,
4878 type: 'POST',
4879 beforeSend: function () {
4880 $this.addClass('processing');
4881 $this.find('.loading-dot').remove();
4882 $this.append('<span class="loading-dot"></span>');
4883 },
4884 success: function (response) {
4885 $this.removeClass('processing');
4886 $this.find('.loading-dot').remove();
4887
4888 var $title = '<h4>Embed in Page</h4>';
4889
4890 var modelContent = '';
4891 var $message =
4892 '<div class="everest_forms_hide_container"><p>We can help embed your form with just a few clicks!</p>';
4893 var $selectExistingPage =
4894 '<button class="everest-forms-btn everest-forms-select-existing-page">Select Existing Page</button>';
4895 var $createNewPage =
4896 '<button class="everest-forms-btn everest-forms-create-new-page">Create New Page</button></div><div class="everest-forms-show-exist-page"></div>';
4897 modelContent = $message + $selectExistingPage + $createNewPage;
4898
4899 $.alert({
4900 title: $title,
4901 content: modelContent,
4902 type: 'blue',
4903 draggable:false,
4904 onContentReady: function () {
4905 var $formId = $('.everest-forms-embed-button').attr(
4906 'data-form_id',
4907 );
4908 $('.jconfirm-buttons').hide();
4909 //when clicked on 'Select Existing Page' button
4910 $('.everest-forms-select-existing-page').click(function () {
4911 $('.everest_forms_hide_container').hide();
4912 var $selectStart =
4913 '<div class="everest-forms-select-existing-post-container"><p>Select the page you would like to embed your form in.</p><select name="everest-forms-select-existing-page-name" id="everest-forms-select-existing-page-name">';
4914 var $option =
4915 '<option disabled selected>Select Page</option>';
4916
4917 response.data.forEach((page) => {
4918 $option +=
4919 '<option data-id="' +
4920 page.ID +
4921 '" value="' +
4922 page.ID +
4923 '">' +
4924 page.post_title +
4925 '</option>';
4926 });
4927
4928 var $selectEnd =
4929 '</select><button class="everest-forms-lets-go-btn" style="cursor:pointer">Lets Go!</button>';
4930 var $backBtn =
4931 '<div style="cursor:pointer" class="everest-forms-show-container">Go Back</div></div>';
4932
4933 modelContent = $selectStart + $option + $selectEnd + $backBtn;
4934
4935 $('.everest-forms-show-exist-page').append(modelContent);
4936
4937 $('.everest-forms-show-container').click(function () {
4938 $('.everest_forms_hide_container').show();
4939 $('.everest-forms-select-existing-post-container').remove();
4940 });
4941
4942 //When page is selected
4943 $('.everest-forms-select-existing-post-container').change(
4944 function () {
4945 var $pageId = $(this).find(':selected').val();
4946
4947 $('.everest-forms-lets-go-btn').click(function () {
4948 var data = {
4949 action: 'everest_forms_goto_edit_page',
4950 security: evf_data.evf_goto_edit_page,
4951 page_id: $pageId,
4952 form_id: $formId,
4953 };
4954 $.ajax({
4955 url: evf_data.ajax_url,
4956 type: 'POST',
4957 data: data,
4958 success: function (response) {
4959 if (response.success) {
4960 window.location = response.data;
4961 }
4962 },
4963 });
4964 });
4965 },
4966 );
4967 });
4968
4969 //when click on 'Create New Page' button
4970 $('.everest-forms-create-new-page').click(function () {
4971 $('.everest_forms_hide_container').hide();
4972
4973 var $title =
4974 '<div class="everest-forms-select-existing-post-container"><p>What would you like to call the new page?</p>';
4975 var $pageName = '<div><input type="text" name="page_title"/>';
4976 var $goBtn =
4977 '<button class="everest-forms-lets-go-btn" style="cursor:pointer">Lets Go!</button></div>';
4978 var $backBtn =
4979 '<div style="cursor:pointer" class="everest-forms-show-container">Go Back</div></div>';
4980
4981 modelContent = $title + $pageName + $goBtn + $backBtn;
4982 $(' .everest-forms-show-exist-page').append(modelContent);
4983
4984 $('.everest-forms-show-container').click(function () {
4985 $('.everest_forms_hide_container').show();
4986 $('.everest-forms-select-existing-post-container').remove();
4987 });
4988
4989 $('.everest-forms-lets-go-btn').click(function () {
4990 var $pageTitle = $("[name='page_title']").val();
4991
4992 var data = {
4993 action: 'everest_forms_goto_edit_page',
4994 security: evf_data.evf_goto_edit_page,
4995 page_title: $pageTitle,
4996 form_id: $formId,
4997 };
4998 $.ajax({
4999 url: evf_data.ajax_url,
5000 type: 'POST',
5001 data: data,
5002 success: function (response) {
5003 if (response.success) {
5004 window.location = response.data;
5005 }
5006 },
5007 });
5008 });
5009 });
5010 },
5011 });
5012 },
5013 });
5014 });
5015 },
5016 bindPreviewConfirmation: function () {
5017 $('.everest-preview-confirmation').each(function () {
5018 const $checkbox = $(this);
5019 const $target = $checkbox
5020 .closest('.everest-forms-panel-field-toggle')
5021 .next('.preview-confirm-select-wrapper');
5022
5023 if ($checkbox.is(':checked')) {
5024 $target.show();
5025 } else {
5026 $target.hide();
5027 }
5028
5029 $checkbox.on('change', function () {
5030 if ($(this).is(':checked')) {
5031 $target.show();
5032 } else {
5033 $target.hide();
5034 }
5035 });
5036 });
5037 },
5038 bindSaveOptionWithKeyEvent: function () {
5039 $('body').on('keydown', function (e) {
5040 if (e.ctrlKey || e.metaKey) {
5041 if (
5042 's' === String.fromCharCode(e.which).toLowerCase() ||
5043 83 === e.which
5044 ) {
5045 e.preventDefault();
5046 $('.everest-forms-save-button').trigger('click');
5047 }
5048 }
5049 });
5050 },
5051 bindOpenShortcutKeysModalWithKeyEvent: function () {
5052 $('body').on('keydown', function (e) {
5053 if (e.ctrlKey || e.metaKey) {
5054 if (
5055 'h' === String.fromCharCode(e.which).toLowerCase() ||
5056 72 === e.which
5057 ) {
5058 e.preventDefault();
5059 var shortcut_keys_html = '';
5060
5061 $.each(evf_data.i18n_shortcut_keys, function (key, value) {
5062 shortcut_keys_html += `
5063 <ul class="evf-shortcut-keyword">
5064 <li>
5065 <div class="evf-shortcut-title">${value}</div>
5066 <div class="evf-key">
5067 <span>${key.split('+')[0]}</span>
5068 <span>${key.split('+')[1]}</span>
5069 </div>
5070 </li>
5071 </ul>
5072 `;
5073 });
5074
5075 $.alert({
5076 title: evf_data.i18n_shortcut_key_title,
5077 content: shortcut_keys_html,
5078 icon: 'dashicons dashicons-info',
5079 type: 'blue',
5080 boxWidth: '550px',
5081 buttons: {
5082 confirm: {
5083 text: evf_data.i18n_close,
5084 btnClass: 'btn-confirm',
5085 keys: ['enter'],
5086 },
5087 },
5088 onContentReady: function () {
5089 $('body').on('keydown', function (e) {
5090 if (
5091 e.ctrlKey ||
5092 (e.metaKey &&
5093 'h' === String.fromCharCode(e.which).toLowerCase()) ||
5094 72 === e.which
5095 ) {
5096 $('.btn-confirm').trigger('click');
5097 }
5098 });
5099 },
5100 });
5101 }
5102 }
5103 });
5104 },
5105 getStructure: function () {
5106 var wrapper = $('.evf-admin-field-wrapper');
5107 var structure = [];
5108
5109 $.each(wrapper.find('.evf-admin-row'), function () {
5110 var $row = $(this),
5111 row_id = $row.attr('data-row-id');
5112
5113 $.each($row.find('.evf-admin-grid'), function () {
5114 var $grid = $(this),
5115 grid_id = $grid.attr('data-grid-id');
5116
5117 var array_index = 0;
5118 $.each($grid.find('.everest-forms-field'), function () {
5119 var structure_object = { name: '', value: '' };
5120 var field_id = $(this).attr('data-field-id');
5121 structure_object.name =
5122 'structure[row_' +
5123 row_id +
5124 '][grid_' +
5125 grid_id +
5126 '][' +
5127 array_index +
5128 ']';
5129 array_index++;
5130 structure_object.value = field_id;
5131 structure.push(structure_object);
5132 });
5133 if ($grid.find('.everest-forms-field').length < 1) {
5134 structure.push({
5135 name: 'structure[row_' + row_id + '][grid_' + grid_id + ']',
5136 value: '',
5137 });
5138 }
5139 });
5140 });
5141
5142 return structure;
5143 },
5144 getFieldArray: function (grid) {
5145 var fields = [];
5146 $.each(grid.find('.everest-forms-field'), function () {
5147 var field_id = $(this).attr('data-field-id');
5148 fields.push(field_id);
5149 });
5150 return fields;
5151 },
5152 checkEmptyGrid: function ($force) {
5153 $.each($('.evf-admin-grid'), function () {
5154 var $fields = $(this).find(
5155 '.everest-forms-field, .evf-registered-item:not(.ui-draggable-dragging)',
5156 );
5157 if ($fields.not('.ui-sortable-helper').length < 1) {
5158 $(this).addClass('evf-empty-grid');
5159 } else {
5160 $(this).removeClass('evf-empty-grid');
5161 }
5162 });
5163 EVFPanelBuilder.choicesInit();
5164 },
5165 bindDefaultTabs: function () {
5166 $(document).on('click', '.evf-nav-tab-wrapper a', function (e) {
5167 e.preventDefault();
5168 EVFPanelBuilder.switchTab($(this).data('panel'));
5169 });
5170 },
5171 switchTab: function (panel) {
5172 var $panel = $('#everest-forms-panel-' + panel),
5173 $panelBtn = $('.evf-panel-' + panel + '-button');
5174
5175 $('.evf-nav-tab-wrapper').find('a').removeClass('nav-tab-active');
5176 $panelBtn.addClass('nav-tab-active');
5177 $panel
5178 .closest('.evf-tab-content')
5179 .find('.everest-forms-panel')
5180 .removeClass('active');
5181 $panel.addClass('active');
5182
5183 if ('integrations' === panel) {
5184 var $firstConnected = $panel
5185 .find('.everest-forms-panel-sidebar a')
5186 .not('.evf-addon-install-trigger')
5187 .not('.upgrade-addons-settings')
5188 .first();
5189 if ($firstConnected.length) {
5190 $firstConnected.trigger('click');
5191 } else {
5192 $panel
5193 .find('.everest-forms-panel-sidebar a')
5194 .first()
5195 .addClass('active');
5196 }
5197 } else if ('payments' === panel) {
5198 if (!$panel.find('.everest-forms-panel-sidebar a').hasClass('active')) {
5199 $panel
5200 .find('.everest-forms-panel-sidebar a')
5201 .first()
5202 .addClass('active');
5203 }
5204
5205 if (
5206 !$('.everest-forms-panel-content')
5207 .find('.evf-panel-content-section')
5208 .hasClass('active')
5209 ) {
5210 $('.everest-forms-panel-content')
5211 .find('.evf-panel-content-section')
5212 .first()
5213 .addClass('active');
5214 }
5215 }
5216
5217 history.replaceState(
5218 {},
5219 null,
5220 EVFPanelBuilder.updateQueryString('tab', panel),
5221 );
5222 EVFPanelBuilder.switchPanel(panel);
5223 },
5224 updateQueryString: function (key, value, url) {
5225 if (!url) url = window.location.href;
5226 var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi'),
5227 hash;
5228
5229 if (re.test(url)) {
5230 if (typeof value !== 'undefined' && value !== null)
5231 return url.replace(re, '$1' + key + '=' + value + '$2$3');
5232 else {
5233 hash = url.split('#');
5234 url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
5235 if (typeof hash[1] !== 'undefined' && hash[1] !== null)
5236 url += '#' + hash[1];
5237 return url;
5238 }
5239 } else {
5240 if (typeof value !== 'undefined' && value !== null) {
5241 var separator = url.indexOf('?') !== -1 ? '&' : '?';
5242 hash = url.split('#');
5243 url = hash[0] + separator + key + '=' + value;
5244 if (typeof hash[1] !== 'undefined' && hash[1] !== null)
5245 url += '#' + hash[1];
5246 return url;
5247 } else {
5248 return url;
5249 }
5250 }
5251 },
5252 switchPanel: function (panel) {
5253 if (panel === 'field-options') {
5254 EVFPanelBuilder.switchToFieldOptionPanel();
5255 }
5256 },
5257 switchToFieldOptionPanel: function (field_id) {
5258 $('.everest-forms-field-options').find('.no-fields').hide();
5259 $('.evf-admin-field-wrapper .everest-forms-field').removeClass('active');
5260 $('#everest-forms-panel-fields').addClass('active');
5261 $('.everest-forms-fields-tab').find('a').removeClass('active');
5262 $('.everest-forms-fields-tab').find('a').last().addClass('active');
5263 $('.everest-forms-add-fields').hide();
5264 $('.everest-forms-field-options').show();
5265 $('.everest-forms-field-options')
5266 .find('.everest-forms-field-option')
5267 .hide();
5268 $('.evf-tab-lists').find('li a').removeClass('active');
5269 $('.evf-tab-lists')
5270 .find('li.evf-panel-field-options-button a')
5271 .addClass('active');
5272
5273 $(document.body).trigger('evf-init-switch-field-options');
5274
5275 if (typeof field_id !== 'undefined') {
5276 var $fieldOptions = $('#everest-forms-field-option-' + field_id);
5277 if ($fieldOptions.length > 0) {
5278 var $basicGroup = $('#everest-forms-field-option-basic-' + field_id);
5279 $basicGroup
5280 .removeClass('closed')
5281 .addClass('open')
5282 .find('.everest-forms-field-option-group-inner')
5283 .show();
5284 const $tempLink = $('<a href="#field-options"></a>').appendTo(
5285 document.body,
5286 );
5287
5288 $tempLink[0].click();
5289
5290 setTimeout(() => {
5291 $tempLink.remove();
5292 }, 100);
5293 }
5294 $('#everest-forms-field-option-' + field_id).show();
5295
5296 /**
5297 * Close all field option groups except basic group
5298 * This is to ensure that only basic group is open when switching to field options.
5299 *
5300 * @since 3.2.4
5301 */
5302 $('#everest-forms-field-option-' + field_id)
5303 .find('.everest-forms-field-option-group')
5304 .each(function () {
5305 $field_options_element = $(this);
5306 if (
5307 !$field_options_element.hasClass(
5308 'everest-forms-field-option-group-basic',
5309 )
5310 ) {
5311 if ($field_options_element.hasClass('open')) {
5312 $field_options_element.removeClass('open').addClass('closed');
5313 $field_options_element
5314 .find('.everest-forms-field-option-group-inner')
5315 .hide();
5316 }
5317 }
5318 });
5319
5320 $('#everest-forms-field-' + field_id).addClass('active');
5321 } else {
5322 if ($('.evf-admin-field-wrapper .everest-forms-field').length > 0) {
5323 $('.evf-admin-field-wrapper .everest-forms-field')
5324 .eq(0)
5325 .addClass('active');
5326 $(
5327 '#everest-forms-field-option-' +
5328 $('.evf-admin-field-wrapper .everest-forms-field')
5329 .eq(0)
5330 .attr('data-field-id'),
5331 ).show();
5332 } else {
5333 $('.everest-forms-field-options').find('.no-fields').show();
5334 }
5335 }
5336 },
5337 bindFields: function () {
5338 $('.evf-admin-field-wrapper')
5339 .sortable({
5340 items: '.evf-admin-row',
5341 axis: 'y',
5342 cursor: 'move',
5343 opacity: 0.65,
5344 scrollSensitivity: 40,
5345 forcePlaceholderSize: true,
5346 placeholder: 'evf-sortable-placeholder',
5347 containment: '.everest-forms-panel-content',
5348 start: function (event, ui) {
5349 ui.item.css({
5350 backgroundColor: '#f7fafc',
5351 border: '1px dashed #5d96ee',
5352 });
5353 },
5354 stop: function (event, ui) {
5355 ui.item.removeAttr('style');
5356 },
5357 })
5358 .disableSelection();
5359
5360 $('.evf-admin-grid')
5361 .sortable({
5362 items: '> .everest-forms-field[data-field-type!="repeater-fields"]',
5363 delay: 100,
5364 opacity: 0.65,
5365 cursor: 'move',
5366 scrollSensitivity: 40,
5367 forcePlaceholderSize: true,
5368 connectWith: '.evf-admin-grid',
5369 appendTo: document.body,
5370 tolerance: 'pointer',
5371
5372 out: function (event) {
5373 $('.evf-admin-grid').removeClass('evf-hover');
5374 $(event.target).removeClass('evf-item-hover');
5375 $(event.target).closest('.evf-admin-row').removeClass('evf-hover');
5376 EVFPanelBuilder.checkEmptyGrid();
5377 },
5378 over: function (event, ui) {
5379 if (!ui.item.hasClass('required')) {
5380 ui.item.find('.required').remove();
5381 }
5382 $('.evf-admin-grid').addClass('evf-hover');
5383 $(event.target).addClass('evf-item-hover');
5384 $(event.target).closest('.evf-admin-row').addClass('evf-hover');
5385 EVFPanelBuilder.checkEmptyGrid();
5386 // Resize helper to fit the target column on entry
5387 if (ui.helper.data('origWidth') === undefined) {
5388 ui.helper.data('origWidth', ui.helper.width());
5389 }
5390 var newWidth = Math.min(ui.helper.data('origWidth'), $(this).width());
5391 ui.helper.css('width', newWidth + 'px');
5392 },
5393 sort: function (event, ui) {
5394 // sort() fires continuously on the SOURCE grid on every mousemove.
5395 // Use ui.placeholder to find the DESTINATION grid regardless of which
5396 // grid's sort handler is executing, then pin helper to that column.
5397 var dragInst = $.ui.ddmanager && $.ui.ddmanager.current;
5398 if (!dragInst || !dragInst.offset || !dragInst.offset.click) return;
5399 if (!ui.placeholder) return;
5400
5401 // Cache the destination grid and its offset to reduce DOM queries
5402 if (!dragInst._evf_destGrid || dragInst._evf_destGrid !== ui.placeholder[0].parentElement) {
5403 dragInst._evf_destGrid = ui.placeholder.closest('.evf-admin-grid')[0];
5404 if (!dragInst._evf_destGrid) return;
5405 dragInst._evf_destGridOffset = null; // Invalidate cached offset when grid changes
5406 }
5407
5408 var destGrid = dragInst._evf_destGrid;
5409 if (!dragInst._evf_destGridOffset) {
5410 dragInst._evf_destGridOffset = $(destGrid).offset().left;
5411 }
5412
5413 if (ui.helper.data('origWidth') === undefined) {
5414 ui.helper.data('origWidth', ui.helper.width());
5415 }
5416 dragInst.offset.click.left = Math.max(5, Math.min(event.pageX - dragInst._evf_destGridOffset, ui.helper.width() - 5));
5417 },
5418 receive: function (event, ui) {
5419 if (ui.sender.is('button')) {
5420 EVFPanelBuilder.fieldDrop(ui.helper);
5421 }
5422 },
5423 update: function (event, ui) {
5424 $(document).trigger('evf_sort_update_complete', {
5425 event: event,
5426 ui: ui,
5427 });
5428 },
5429 stop: function (event, ui) {
5430 if (!ui.item.hasClass('required')) {
5431 const labelTitle = ui.item.find('.label-title');
5432 if (labelTitle.length > 0) {
5433 labelTitle.append('<span class="required">*</span>');
5434 }
5435 }
5436 ui.item.removeAttr('style');
5437 EVFPanelBuilder.checkEmptyGrid();
5438 },
5439 })
5440 .disableSelection();
5441
5442 $(
5443 '.evf-registered-buttons button.evf-registered-item:not(.evf-layout-container-btn):not(.upgrade-modal):not(.evf-upgrade-addon):not(.enable-stripe-model):not(.enable-authorize-net-model):not(.enable-payment-subscription-plan):not(.everest-forms-pro-is_square_install):not(.enable-square-model):not(.evf-one-time-draggable-field):not(.recaptcha_empty_key_validate):not(.hcaptcha_empty_key_validate):not(.turnstile_empty_key_validate)',
5444 )
5445 .draggable({
5446 delay: 200,
5447 cancel: false,
5448 scroll: false,
5449 revert: 'invalid',
5450 scrollSensitivity: 40,
5451 forcePlaceholderSize: true,
5452 start: function () {
5453 $(this).addClass('field-dragged');
5454 },
5455 helper: function () {
5456 return $(this)
5457 .clone()
5458 .insertAfter(
5459 $(this)
5460 .closest('.everest-forms-tab-content')
5461 .siblings('.everest-forms-fields-tab'),
5462 );
5463 },
5464 stop: function () {
5465 $(this).removeClass('field-dragged');
5466 },
5467 opacity: 0.75,
5468 containment: '#everest-forms-builder',
5469 connectToSortable: '.evf-admin-grid',
5470 })
5471 .disableSelection();
5472
5473 // Layout presets (sidebar): draggable onto canvas only — always creates a new row (never a grid cell).
5474 $('.evf-layout-container-btn').each(function () {
5475 var $btn = $(this);
5476 if ($btn.data('ui-draggable')) {
5477 $btn.draggable('destroy');
5478 }
5479 var cursorLeft = Math.round($btn.outerWidth() / 2),
5480 cursorTop = Math.round($btn.outerHeight() / 2);
5481 $btn.draggable({
5482 delay: 0,
5483 distance: 2,
5484 cancel: false,
5485 scroll: false,
5486 revert: 'invalid',
5487 appendTo: 'body',
5488 zIndex: 100050,
5489 start: function (event, ui) {
5490 $(this).addClass('field-dragged');
5491 $('#everest-forms-builder').addClass(
5492 'evf-is-dragging-layout-container',
5493 );
5494 var cx = event.clientX - cursorLeft,
5495 cy = event.clientY - cursorTop;
5496 ui.helper.css({
5497 position: 'fixed',
5498 margin: 0,
5499 left: cx,
5500 top: cy,
5501 pointerEvents: 'none',
5502 boxSizing: 'border-box',
5503 });
5504 setTimeout(function () {
5505 ui.helper.css({ left: cx, top: cy });
5506 }, 0);
5507 },
5508 helper: function () {
5509 return $(this)
5510 .clone()
5511 .addClass('evf-layout-container-drag-helper')
5512 .css({
5513 width: $(this).outerWidth(),
5514 boxSizing: 'border-box',
5515 })
5516 .appendTo(document.body);
5517 },
5518 drag: function (event, ui) {
5519 ui.position.left = event.clientX - cursorLeft;
5520 ui.position.top = event.clientY - cursorTop;
5521 var $activeZone = $('#everest-forms-builder').data(
5522 'evf-layout-active-drop-zone',
5523 );
5524 if ($activeZone && $activeZone.length) {
5525 updateLayoutDropIndicator($activeZone, event.pageY);
5526 }
5527 },
5528 stop: function () {
5529 $(this).removeClass('field-dragged');
5530 $('#everest-forms-builder').removeClass(
5531 'evf-is-dragging-layout-container',
5532 );
5533 $('#everest-forms-builder').removeData(
5534 'evf-layout-active-drop-zone',
5535 );
5536 $('.evf-layout-drop-target-hover').removeClass(
5537 'evf-layout-drop-target-hover',
5538 );
5539 clearLayoutDropIndicators();
5540 },
5541 opacity: 0.92,
5542 });
5543 });
5544
5545 var layoutDropAccept = function (draggable) {
5546 return $(draggable).hasClass('evf-layout-container-btn');
5547 };
5548 var clearLayoutDropIndicators = function () {
5549 $('.evf-admin-row').removeClass(
5550 'evf-layout-insert-before evf-layout-insert-after',
5551 );
5552 $(
5553 '.evf-admin-field-wrapper, [id^="part_"], .evf-add-row:not(.repeater-row)',
5554 ).removeClass('evf-layout-insert-empty evf-layout-insert-after-all');
5555 };
5556 var updateLayoutDropIndicator = function ($zone, pageY) {
5557 var $rows = $zone.children('.evf-admin-row'),
5558 $beforeRow = null,
5559 $afterRow = null;
5560
5561 $rows.removeClass('evf-layout-insert-before evf-layout-insert-after');
5562 $zone.removeClass('evf-layout-insert-empty');
5563
5564 if (!$rows.length) {
5565 $zone.addClass('evf-layout-insert-empty');
5566 return;
5567 }
5568
5569 $rows.each(function () {
5570 var $r = $(this),
5571 top = $r.offset().top,
5572 mid = top + $r.outerHeight() / 2;
5573 if (pageY < mid) {
5574 $beforeRow = $r;
5575 return false;
5576 }
5577 $afterRow = $r;
5578 });
5579
5580 if ($beforeRow && $beforeRow.length) {
5581 $beforeRow.addClass('evf-layout-insert-before');
5582 } else if ($afterRow && $afterRow.length) {
5583 $afterRow.addClass('evf-layout-insert-after');
5584 }
5585 };
5586 var queueLayoutInsert = function (callback) {
5587 window.setTimeout(callback, 0);
5588 };
5589
5590 EVFPanelBuilder.getLayoutDropZones().each(function () {
5591 var $zone = $(this);
5592 if ($zone.data('ui-droppable')) {
5593 $zone.droppable('destroy');
5594 }
5595 $zone.droppable({
5596 accept: layoutDropAccept,
5597 tolerance: 'pointer',
5598 greedy: false,
5599 over: function (event) {
5600 var $zone = $(this);
5601 $zone.addClass('evf-layout-drop-target-hover');
5602 $('#everest-forms-builder').data(
5603 'evf-layout-active-drop-zone',
5604 $zone,
5605 );
5606 updateLayoutDropIndicator($zone, event.pageY);
5607 },
5608 out: function () {
5609 $(this).removeClass('evf-layout-drop-target-hover');
5610 $('#everest-forms-builder').removeData(
5611 'evf-layout-active-drop-zone',
5612 );
5613 clearLayoutDropIndicators();
5614 },
5615 drop: function (event, ui) {
5616 $(this).removeClass('evf-layout-drop-target-hover');
5617 $('#everest-forms-builder').removeData(
5618 'evf-layout-active-drop-zone',
5619 );
5620 clearLayoutDropIndicators();
5621 var columns = parseInt(ui.draggable.data('columns'), 10);
5622 if (!columns || columns < 1) {
5623 return;
5624 }
5625 var $z = $(this),
5626 y = event.pageY,
5627 $rows = $z.children('.evf-admin-row'),
5628 $beforeRow = null,
5629 $afterRow = null;
5630
5631 $rows.each(function () {
5632 var $r = $(this),
5633 top = $r.offset().top,
5634 mid = top + $r.outerHeight() / 2;
5635 if (y < mid) {
5636 $beforeRow = $r;
5637 return false;
5638 }
5639 $afterRow = $r;
5640 });
5641
5642 if ($beforeRow && $beforeRow.length) {
5643 queueLayoutInsert(function () {
5644 EVFPanelBuilder.addLayoutContainer(
5645 columns,
5646 null,
5647 $beforeRow,
5648 $z,
5649 );
5650 });
5651 } else if ($afterRow && $afterRow.length) {
5652 queueLayoutInsert(function () {
5653 EVFPanelBuilder.addLayoutContainer(
5654 columns,
5655 $afterRow,
5656 null,
5657 $z,
5658 );
5659 });
5660 } else {
5661 queueLayoutInsert(function () {
5662 EVFPanelBuilder.addLayoutContainer(
5663 columns,
5664 null,
5665 null,
5666 $z,
5667 );
5668 });
5669 }
5670 },
5671 });
5672 });
5673
5674 $('.evf-add-row:not(.repeater-row)').each(function () {
5675 var $addStrip = $(this);
5676 if ($addStrip.data('ui-droppable')) {
5677 $addStrip.droppable('destroy');
5678 }
5679 $addStrip.droppable({
5680 accept: layoutDropAccept,
5681 tolerance: 'pointer',
5682 over: function () {
5683 $(this).addClass('evf-layout-drop-target-hover');
5684 $(this).addClass('evf-layout-insert-after-all');
5685 },
5686 out: function () {
5687 $(this).removeClass('evf-layout-drop-target-hover');
5688 $(this).removeClass('evf-layout-insert-after-all');
5689 },
5690 drop: function (event, ui) {
5691 $(this).removeClass('evf-layout-drop-target-hover');
5692 $(this).removeClass('evf-layout-insert-after-all');
5693 clearLayoutDropIndicators();
5694 var columns = parseInt(ui.draggable.data('columns'), 10);
5695 if (!columns || columns < 1) {
5696 return;
5697 }
5698 var $ctx = $(this),
5699 wrapper = $('.evf-admin-field-wrapper'),
5700 current_part = $ctx
5701 .closest('.evf-admin-field-container')
5702 .attr('data-current-part');
5703
5704 if (current_part) {
5705 var $pw = wrapper.find('#part_' + current_part);
5706 if ($pw.length) {
5707 wrapper = $pw;
5708 }
5709 }
5710
5711 var $last = wrapper.children('.evf-admin-row').last();
5712 if ($last.length) {
5713 queueLayoutInsert(function () {
5714 EVFPanelBuilder.addLayoutContainer(
5715 columns,
5716 $last,
5717 null,
5718 $ctx,
5719 );
5720 });
5721 } else {
5722 queueLayoutInsert(function () {
5723 EVFPanelBuilder.addLayoutContainer(
5724 columns,
5725 null,
5726 null,
5727 $ctx,
5728 );
5729 });
5730 }
5731 },
5732 });
5733 });
5734
5735 // Repeatable grid connect to sortable setter.
5736 $('.evf-registered-item.evf-repeater-field').draggable(
5737 'option',
5738 'connectToSortable',
5739 '.evf-repeatable-grid',
5740 );
5741
5742 // Adapt hover behaviour on mouse event.
5743 $('.evf-admin-row').on('mouseenter mouseleave', function (event) {
5744 if (1 > event.buttons) {
5745 if ('mouseenter' === event.type) {
5746 $(this).addClass('evf-hover');
5747 } else {
5748 $('.evf-admin-row:not(.evf-popover-open)').removeClass('evf-hover');
5749 }
5750 }
5751 });
5752
5753 // Refresh the position of placeholders on drag scroll.
5754 $('.everest-forms-panel-content').on('scroll', function () {
5755 $('.evf-admin-grid').sortable('refreshPositions');
5756 $('.evf-admin-field-wrapper').sortable('refreshPositions');
5757 });
5758
5759 $('.evf-admin-field-wrapper .evf-admin-row').each(function () {
5760 if (!$(this).find('.evf-add-field-to-row').length) {
5761 $(this)
5762 .find('.evf-toggle-row')
5763 .prepend(
5764 '<div class="evf-add-field-to-row">' +
5765 '<span class="dashicons dashicons-plus" title="Add Field to Row"></span>' +
5766 '</div>',
5767 );
5768 }
5769 });
5770
5771 $('.evf-admin-field-wrapper .everest-forms-field').each(function () {
5772 if (!$(this).find('.evf-add-field-below').length) {
5773 $(this).append(
5774 '<div class="evf-add-field-below">' +
5775 '<span class="dashicons dashicons-plus" title="Add Field Below"></span>' +
5776 '</div>',
5777 );
5778 }
5779 });
5780 },
5781
5782 /**
5783 * Populate the row field popover with tabs and field items from the sidebar.
5784 */
5785 populateRowPopover: function () {
5786 var $tabs = $('#evf-row-field-popover .evf-popover-tabs').empty(),
5787 $fields = $('#evf-row-field-popover .evf-popover-fields').empty(),
5788 blocked = [
5789 'upgrade-modal',
5790 'evf-upgrade-addon',
5791 'enable-stripe-model',
5792 'enable-authorize-net-model',
5793 'enable-payment-subscription-plan',
5794 'everest-forms-pro-is_square_install',
5795 'enable-square-model',
5796 'evf-one-time-draggable-field',
5797 'recaptcha_empty_key_validate',
5798 'hcaptcha_empty_key_validate',
5799 'turnstile_empty_key_validate',
5800 ];
5801
5802 $tabs.append(
5803 '<button type="button" class="evf-popover-tab active" data-group="all">All</button>',
5804 );
5805
5806 $('.everest-forms-add-fields-group').each(function () {
5807 // Exclude the layout group from the field-picker popover entirely.
5808 if ($(this).hasClass('evf-layout-group')) {
5809 return;
5810 }
5811
5812 var $heading = $(this).find('.everest-forms-add-fields-heading'),
5813 groupKey = $heading.data('group'),
5814 groupLabel = $heading.clone().children().remove().end().text().trim();
5815
5816 if (groupKey) {
5817 $tabs.append(
5818 '<button type="button" class="evf-popover-tab" data-group="' +
5819 groupKey +
5820 '">' +
5821 groupLabel +
5822 '</button>',
5823 );
5824 }
5825
5826 $(this)
5827 .find('.evf-registered-item')
5828 .each(function () {
5829 var $btn = $(this),
5830 fieldType = $btn.data('field-type'),
5831 fieldLabel = $btn.text().trim(),
5832 iconHtml = $btn.find('i').length
5833 ? $btn.find('i').prop('outerHTML')
5834 : '',
5835 blockedClass = (function () {
5836 for (var i = 0; i < blocked.length; i++) {
5837 if ($btn.hasClass(blocked[i])) {
5838 return blocked[i];
5839 }
5840 }
5841 return '';
5842 }()),
5843 isBlocked = blockedClass !== '',
5844 isProLocked =
5845 $btn.hasClass('upgrade-modal') ||
5846 $btn.hasClass('evf-upgrade-addon');
5847
5848 // Skip items with no field type or no label — avoids blank popover entries.
5849 if (!fieldType || !fieldLabel) {
5850 return;
5851 }
5852
5853 $fields.append(
5854 $(
5855 '<div class="evf-popover-field-item' +
5856 (isBlocked ? ' evf-field-blocked' : '') +
5857 (isProLocked ? ' evf-field-upgrade' : '') +
5858 '"></div>',
5859 )
5860 .attr('data-field-type', fieldType)
5861 .attr('data-field-label', fieldLabel)
5862 .attr('data-field-group', groupKey || '')
5863 .attr('data-blocked-class', blockedClass || null)
5864 .append(
5865 '<span class="evf-popover-field-icon">' +
5866 iconHtml +
5867 '</span>',
5868 )
5869 .append(
5870 '<span class="evf-popover-field-label">' +
5871 fieldLabel +
5872 '</span>',
5873 ),
5874 );
5875 });
5876 });
5877 },
5878
5879 /**
5880 * Bind the row-level "+" button and its field-picker popover.
5881 */
5882 bindRowFieldPopover: function () {
5883 var proIconUrl = ( function () {
5884 var locked = document.querySelector(
5885 '.evf-registered-item.upgrade-modal',
5886 );
5887 if ( ! locked ) {
5888 return '';
5889 }
5890 return window
5891 .getComputedStyle( locked, '::before' )
5892 .backgroundImage.replace( /^url\(["']?/, '' )
5893 .replace( /["']?\)$/, '' );
5894 }() );
5895
5896 if (!$('#evf-row-popover-style').length) {
5897 $('head').append(
5898 '<style id="evf-row-popover-style">' +
5899 '.evf-add-field-to-row{cursor:pointer}' +
5900 '.evf-add-field-to-row span.dashicons{border-right:1px solid rgba(255,255,255,.2)}' +
5901 '.evf-add-field-to-row:hover span.dashicons{background:#0095ff!important;color:#fff!important}' +
5902 '.evf-admin-row.evf-popover-open .evf-toggle-row{opacity:1!important;visibility:visible!important}' +
5903 '.everest-forms-field.evf-field-popover-open .evf-field-action{opacity:1!important;visibility:visible!important}' +
5904 '.everest-forms-field{position:relative}' +
5905 '.evf-add-field-below{position:absolute;bottom:-15px;left:50%;transform:translateX(-50%);z-index:10;cursor:pointer;line-height:1;opacity:0;visibility:hidden;transition:opacity .15s,visibility .15s}' +
5906 '.everest-forms-field:hover>.evf-add-field-below,.everest-forms-field.evf-field-popover-open>.evf-add-field-below{opacity:1;visibility:visible}' +
5907 '.evf-add-field-below span.dashicons{background:#e9e9e9;color:#666;border-radius:50%;font-size:16px;width:28px;height:28px;display:flex;align-items:center;justify-content:center}' +
5908 '.evf-add-field-below:hover span.dashicons,.evf-add-field-below:focus span.dashicons{background:#7e3bd0;color:#fff}' +
5909 '.evf-row-field-popover{position:fixed;background:#fff;border:1px solid #edeff7;border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.08);width:480px;z-index:999999;display:none;overflow:visible}' +
5910 '.evf-popover-arrow{position:absolute;bottom:100%;width:14px;height:8px;pointer-events:none;margin-bottom:-1px}' +
5911 '.evf-popover-arrow::before,.evf-popover-arrow::after{content:"";position:absolute;left:0;border-left:7px solid transparent;border-right:7px solid transparent}' +
5912 '.evf-popover-arrow::before{border-bottom:8px solid #edeff7;top:0}' +
5913 '.evf-popover-arrow::after{border-bottom:8px solid #fff;top:1px}' +
5914 '.evf-row-field-popover.evf-popover-flipped .evf-popover-arrow{bottom:auto;top:100%;margin-bottom:0;margin-top:-1px}' +
5915 '.evf-row-field-popover.evf-popover-flipped .evf-popover-arrow::before{border-bottom:none;border-top:8px solid #edeff7;top:auto;bottom:0}' +
5916 '.evf-row-field-popover.evf-popover-flipped .evf-popover-arrow::after{border-bottom:none;border-top:8px solid #fff;top:auto;bottom:1px}' +
5917 '.evf-popover-search-wrap{padding:10px 12px;border-bottom:1px solid #f0f0f1;display:flex;align-items:center;gap:6px}' +
5918 '.evf-popover-search-wrap .dashicons{color:#c3c3c3;flex-shrink:0;font-size:16px}' +
5919 '#evf-popover-search{border:1px solid #e1e1e1;border-radius:4px;padding:5px 8px;width:100%;font-size:12px;outline:none;box-shadow:none;color:#383838}' +
5920 '#evf-popover-search:focus{border-color:#7e3bd0;box-shadow:0 0 0 2px rgba(126,59,208,.1)}' +
5921 '.evf-popover-tabs-nav{position:relative;border-bottom:1px solid #f0f0f1}' +
5922 '.evf-popover-tabs{display:flex;flex-wrap:nowrap;gap:3px;padding:8px 12px;overflow-x:auto;scrollbar-width:none;scroll-behavior:smooth}' +
5923 '.evf-popover-tabs::-webkit-scrollbar{display:none}' +
5924 '.evf-tabs-arrow{position:absolute;top:0;bottom:0;width:32px;display:none;align-items:center;justify-content:center;border:none;padding:0;cursor:pointer;z-index:2}' +
5925 '.evf-tabs-arrow.evf-tabs-arrow-visible{display:flex}' +
5926 '.evf-tabs-arrow-left{left:0;background:linear-gradient(to right,#fff 55%,transparent)}' +
5927 '.evf-tabs-arrow-right{right:0;background:linear-gradient(to left,#fff 55%,transparent)}' +
5928 '.evf-tabs-arrow .dashicons{font-size:14px;color:#888;pointer-events:none}' +
5929 '.evf-tabs-arrow:hover .dashicons{color:#7e3bd0}' +
5930 '.evf-popover-tab{background:transparent;border:none;border-radius:20px;padding:3px 10px;font-size:12px;cursor:pointer;white-space:nowrap;color:#666;transition:background .12s,color .12s}' +
5931 '.evf-popover-tab:hover{background:#f5f5f7;color:#383838}' +
5932 '.evf-popover-tab.active{background:rgba(126,59,208,.1);color:#7e3bd0;font-weight:600}' +
5933 '.evf-popover-fields-wrap{max-height:320px;overflow-y:auto;padding:10px 12px}' +
5934 '.evf-popover-fields-wrap::-webkit-scrollbar{width:4px}' +
5935 '.evf-popover-fields-wrap::-webkit-scrollbar-track{background:transparent}' +
5936 '.evf-popover-fields-wrap::-webkit-scrollbar-thumb{background:#e1e1e1;border-radius:4px}' +
5937 '.evf-popover-fields{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}' +
5938 '.evf-popover-field-item{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:10px 6px 8px;border:1px solid #edeff7;border-radius:4px;cursor:pointer;font-size:11px;text-align:center;gap:4px;background:#fbfbfd;color:#383838;transition:border-color .12s,color .12s,background .12s;line-height:1.4}' +
5939 '.evf-popover-field-item:hover{border-color:#8c64c6;color:#8c64c6;background:#fff}' +
5940 '.evf-popover-field-item .evf-popover-field-icon i{font-size:18px}' +
5941 '.evf-popover-field-item .evf-popover-field-icon svg{width:24px;height:24px;display:block}' +
5942 '.evf-popover-field-item.evf-field-blocked{opacity:.45;cursor:default;pointer-events:none}' +
5943 '.evf-popover-field-item.evf-field-upgrade{opacity:.55;cursor:pointer;pointer-events:auto;position:relative}' +
5944 '.evf-popover-field-item.evf-field-upgrade:hover{opacity:1;border-color:#e6a817;background:#fffdf5}' +
5945 ( proIconUrl ? '.evf-popover-field-item.evf-field-upgrade::before{content:"";background-image:url("' + proIconUrl + '");background-repeat:no-repeat;background-position:center;background-size:100%;position:absolute;width:14px;height:14px;top:4px;right:4px}' : '' ) +
5946 '.evf-popover-no-results{grid-column:1/-1;text-align:center;padding:20px 0;color:#999;font-size:12px}' +
5947 '.evf-field-loading-wrap{display:flex;align-items:center;justify-content:center;gap:8px;padding:12px}' +
5948 '.evf-field-loading-wrap .spinner{float:none;margin:0}' +
5949 '.evf-field-loading-label{font-size:12px;color:#666}' +
5950 '.evf-admin-grid.evf-empty-grid,.evf-admin-grid.evf-empty-grid::before{cursor:pointer!important}' +
5951 '.evf-admin-grid.evf-empty-grid::before{width:36px!important;height:36px!important;border-radius:50%!important;background:#e9e9e9!important;color:#666!important;font-size:20px!important;display:flex!important;align-items:center!important;justify-content:center!important;line-height:1!important}' +
5952 '.evf-admin-grid.evf-empty-grid:hover::before{background:rgba(126,59,208,.12)!important;color:#7e3bd0!important}' +
5953 '.evf-admin-row.evf-popover-open .evf-admin-grid.evf-empty-grid::before{background:rgba(126,59,208,.12)!important;color:#7e3bd0!important}' +
5954 '.evf-admin-grid.evf-empty-grid.evf-item-hover::before{display:none!important}' +
5955 '</style>',
5956 );
5957 }
5958
5959 if (!$('#evf-row-field-popover').length) {
5960 $('body').append(
5961 '<div id="evf-row-field-popover" class="evf-row-field-popover">' +
5962 '<div class="evf-popover-arrow"></div>' +
5963 '<div class="evf-popover-search-wrap">' +
5964 '<span class="dashicons dashicons-search"></span>' +
5965 '<input type="text" id="evf-popover-search" placeholder="Search for a field" autocomplete="off" />' +
5966 '</div>' +
5967 '<div class="evf-popover-tabs-nav">' +
5968 '<button type="button" class="evf-tabs-arrow evf-tabs-arrow-left" aria-label="Scroll left"><span class="dashicons dashicons-arrow-left-alt2"></span></button>' +
5969 '<div class="evf-popover-tabs"></div>' +
5970 '<button type="button" class="evf-tabs-arrow evf-tabs-arrow-right" aria-label="Scroll right"><span class="dashicons dashicons-arrow-right-alt2"></span></button>' +
5971 '</div>' +
5972 '<div class="evf-popover-fields-wrap"><div class="evf-popover-fields"></div></div>' +
5973 '</div>',
5974 );
5975 }
5976
5977 EVFPanelBuilder.populateRowPopover();
5978
5979 var positionPopover = function ($anchor, $pop, forceFlipped) {
5980 var offset = $anchor.offset(),
5981 scrollLeft = $(window).scrollLeft(),
5982 scrollTop = $(window).scrollTop(),
5983 vpW = window.innerWidth,
5984 vpH = window.innerHeight,
5985 popW = $pop.outerWidth(),
5986 $fieldsWrap = $pop.find('.evf-popover-fields-wrap'),
5987 defaultFieldsMaxHeight = 320,
5988 popH,
5989 margin = 8,
5990 anchorCX = offset.left - scrollLeft + $anchor.outerWidth() / 2,
5991 anchorTop = offset.top - scrollTop,
5992 belowTop = anchorTop + $anchor.outerHeight() + 6,
5993 aboveTop,
5994 top,
5995 left = anchorCX - popW / 2,
5996 flipped = false;
5997
5998 $fieldsWrap.css('max-height', defaultFieldsMaxHeight + 'px');
5999 popH = $pop.outerHeight();
6000 var maxPopoverHeight = vpH - margin * 2;
6001 if (popH > maxPopoverHeight) {
6002 var staticHeight = popH - $fieldsWrap.outerHeight();
6003 $fieldsWrap.css(
6004 'max-height',
6005 Math.max(140, maxPopoverHeight - staticHeight) + 'px',
6006 );
6007 popH = $pop.outerHeight();
6008 }
6009
6010 aboveTop = anchorTop - popH - 6;
6011 left = Math.min(Math.max(margin, left), vpW - popW - margin);
6012 var fitsBelow = belowTop + popH <= vpH - margin,
6013 fitsAbove = aboveTop >= margin;
6014 if (forceFlipped !== undefined) {
6015 flipped = forceFlipped;
6016 if (flipped && !fitsAbove && fitsBelow) {
6017 flipped = false;
6018 } else if (!flipped && !fitsBelow && fitsAbove) {
6019 flipped = true;
6020 }
6021 } else if (fitsBelow) {
6022 flipped = false;
6023 } else if (fitsAbove) {
6024 flipped = true;
6025 } else {
6026 var spaceBelow = vpH - margin - belowTop,
6027 spaceAbove = anchorTop - margin - 6;
6028 flipped = spaceAbove > spaceBelow;
6029 }
6030
6031 top = flipped ? aboveTop : belowTop;
6032 top = Math.max(margin, Math.min(top, vpH - popH - margin));
6033
6034 var arrowX = anchorCX - left - 7;
6035 arrowX = Math.min(Math.max(14, arrowX), popW - 28);
6036 $pop
6037 .toggleClass('evf-popover-flipped', flipped)
6038 .find('.evf-popover-arrow')
6039 .css('left', arrowX + 'px');
6040
6041 return { top: top, left: left };
6042 };
6043
6044 var updateTabArrows = function () {
6045 var tabs = document.querySelector(
6046 '#evf-row-field-popover .evf-popover-tabs',
6047 );
6048 if (!tabs) return;
6049 $('.evf-tabs-arrow-left').toggleClass(
6050 'evf-tabs-arrow-visible',
6051 tabs.scrollLeft > 1,
6052 );
6053 $('.evf-tabs-arrow-right').toggleClass(
6054 'evf-tabs-arrow-visible',
6055 Math.ceil(tabs.scrollLeft + tabs.clientWidth) < tabs.scrollWidth,
6056 );
6057 };
6058
6059 $(document.body).on(
6060 'click',
6061 '#evf-row-field-popover .evf-tabs-arrow',
6062 function (e) {
6063 e.stopPropagation();
6064 var tabs = document.querySelector(
6065 '#evf-row-field-popover .evf-popover-tabs',
6066 );
6067 if (!tabs) return;
6068 var step = 120;
6069 tabs.scrollLeft += $(this).hasClass('evf-tabs-arrow-left')
6070 ? -step
6071 : step;
6072 setTimeout(updateTabArrows, 200);
6073 },
6074 );
6075
6076 $(document.body).on(
6077 'scroll',
6078 '#evf-row-field-popover .evf-popover-tabs',
6079 updateTabArrows,
6080 );
6081
6082 $(document.body).on('click', '.evf-add-field-to-row', function (e) {
6083 e.stopPropagation();
6084 var $btn = $(this),
6085 $row = $btn.closest('.evf-admin-row'),
6086 $popover = $('#evf-row-field-popover');
6087
6088 if ($popover.is(':visible') && $row.hasClass('evf-popover-open')) {
6089 $popover.hide();
6090 $row.removeClass('evf-popover-open');
6091 $('.everest-forms-field.evf-field-popover-open').removeClass(
6092 'evf-field-popover-open',
6093 );
6094 return;
6095 }
6096
6097 EVFPanelBuilder.populateRowPopover();
6098
6099 $('.evf-admin-row.evf-popover-open').removeClass('evf-popover-open');
6100 $('.everest-forms-field.evf-field-popover-open').removeClass(
6101 'evf-field-popover-open',
6102 );
6103
6104 $row.addClass('evf-popover-open');
6105
6106 var pos = positionPopover($btn, $popover);
6107 $popover
6108 .data('target-row', $row)
6109 .data('insert-after-field', null)
6110 .data('anchor', $btn)
6111 .css(pos)
6112 .show();
6113
6114 updateTabArrows();
6115 $('#evf-popover-search').val('').trigger('input').focus();
6116 });
6117
6118 $(document.body).on('click', '.evf-add-field-below', function (e) {
6119 e.stopPropagation();
6120 var $btn = $(this),
6121 $field = $btn.closest('.everest-forms-field'),
6122 $row = $field.closest('.evf-admin-row'),
6123 $popover = $('#evf-row-field-popover');
6124
6125 var $prevField = $popover.data('insert-after-field');
6126 if (
6127 $popover.is(':visible') &&
6128 $row.hasClass('evf-popover-open') &&
6129 $prevField &&
6130 $prevField[0] === $field[0]
6131 ) {
6132 $popover.hide();
6133 $row.removeClass('evf-popover-open');
6134 $field.removeClass('evf-field-popover-open');
6135 return;
6136 }
6137
6138 EVFPanelBuilder.populateRowPopover();
6139
6140 $('.evf-admin-row.evf-popover-open').removeClass('evf-popover-open');
6141 $('.everest-forms-field.evf-field-popover-open').removeClass(
6142 'evf-field-popover-open',
6143 );
6144
6145 $row.addClass('evf-popover-open');
6146 $field.addClass('evf-field-popover-open');
6147
6148 var pos = positionPopover($btn, $popover);
6149 $popover
6150 .data('target-row', $row)
6151 .data('insert-after-field', $field)
6152 .data('anchor', $btn)
6153 .css(pos)
6154 .show();
6155
6156 updateTabArrows();
6157 $('#evf-popover-search').val('').trigger('input').focus();
6158 });
6159
6160 $(document.body).on(
6161 'click',
6162 '.evf-admin-grid.evf-empty-grid',
6163 function (e) {
6164 e.stopPropagation();
6165 var $grid = $(this),
6166 $row = $grid.closest('.evf-admin-row'),
6167 $popover = $('#evf-row-field-popover');
6168
6169 var $prevGrid = $popover.data('insert-into-grid');
6170 if (
6171 $popover.is(':visible') &&
6172 $row.hasClass('evf-popover-open') &&
6173 $prevGrid &&
6174 $prevGrid[0] === $grid[0]
6175 ) {
6176 $popover.hide().removeData('insert-into-grid');
6177 $row.removeClass('evf-popover-open');
6178 return;
6179 }
6180
6181 EVFPanelBuilder.populateRowPopover();
6182
6183 $('.evf-admin-row.evf-popover-open').removeClass('evf-popover-open');
6184 $('.everest-forms-field.evf-field-popover-open').removeClass(
6185 'evf-field-popover-open',
6186 );
6187
6188 $row.addClass('evf-popover-open');
6189
6190 var pos = positionPopover($grid, $popover);
6191 $popover
6192 .data('target-row', $row)
6193 .data('insert-after-field', null)
6194 .data('insert-into-grid', $grid)
6195 .data('anchor', $grid)
6196 .css(pos)
6197 .show();
6198
6199 updateTabArrows();
6200 $('#evf-popover-search').val('').trigger('input').focus();
6201 },
6202 );
6203
6204 $(document).on('click.evf-row-popover', function (e) {
6205 if (
6206 !$(e.target).closest(
6207 '#evf-row-field-popover, .evf-add-field-to-row, .evf-add-field-below, .evf-admin-grid.evf-empty-grid',
6208 ).length
6209 ) {
6210 $('#evf-row-field-popover').hide().removeData('insert-into-grid');
6211 $('.evf-admin-row.evf-popover-open').removeClass('evf-popover-open');
6212 $('.everest-forms-field.evf-field-popover-open').removeClass(
6213 'evf-field-popover-open',
6214 );
6215 }
6216 });
6217
6218 $(document.body).on('evf_after_field_append', function (e, fieldId) {
6219 var $field = $('#' + fieldId);
6220 if ($field.length && !$field.find('.evf-add-field-below').length) {
6221 $field.append(
6222 '<div class="evf-add-field-below">' +
6223 '<span class="dashicons dashicons-plus" title="Add Field Below"></span>' +
6224 '</div>',
6225 );
6226 }
6227 });
6228
6229 $(document.body).on('input', '#evf-popover-search', function () {
6230 var term = $(this).val().toLowerCase().trim();
6231 $('#evf-row-field-popover .evf-popover-field-item').each(function () {
6232 $(this).toggle(
6233 !term ||
6234 $(this).data('field-label').toLowerCase().indexOf(term) >= 0,
6235 );
6236 });
6237 $('.evf-popover-tab').removeClass('active');
6238 $('.evf-popover-tab[data-group="all"]').addClass('active');
6239 $('.evf-popover-no-results').remove();
6240 if (
6241 !$('#evf-row-field-popover .evf-popover-field-item:visible').length
6242 ) {
6243 $('#evf-row-field-popover .evf-popover-fields').append(
6244 '<div class="evf-popover-no-results">No fields found.</div>',
6245 );
6246 }
6247 });
6248
6249 $(document.body).on(
6250 'click',
6251 '#evf-row-field-popover .evf-popover-tab',
6252 function () {
6253 var group = $(this).data('group');
6254 $('.evf-popover-tab').removeClass('active');
6255 $(this).addClass('active');
6256 $('#evf-popover-search').val('');
6257 $('#evf-row-field-popover .evf-popover-field-item').each(function () {
6258 $(this).toggle(
6259 'all' === group || $(this).data('field-group') === group,
6260 );
6261 });
6262 $('.evf-popover-no-results').remove();
6263 var $pop = $('#evf-row-field-popover'),
6264 $storedAnchor = $pop.data('anchor');
6265 if ($storedAnchor && $storedAnchor.length) {
6266 $pop.css(
6267 positionPopover(
6268 $storedAnchor,
6269 $pop,
6270 $pop.hasClass('evf-popover-flipped'),
6271 ),
6272 );
6273 }
6274 this.scrollIntoView({
6275 behavior: 'smooth',
6276 block: 'nearest',
6277 inline: 'nearest',
6278 });
6279 setTimeout(updateTabArrows, 200);
6280 },
6281 );
6282
6283 $(document.body).on(
6284 'click',
6285 '#evf-row-field-popover .evf-popover-field-item:not(.evf-field-blocked)',
6286 function () {
6287 var $item = $(this),
6288 fieldType = $item.data('field-type'),
6289 fieldLabel = $item.data('field-label'),
6290 $popover = $('#evf-row-field-popover'),
6291 $insertAfterField = $popover.data('insert-after-field'),
6292 $insertIntoGrid = $popover.data('insert-into-grid'),
6293 $placeholder = $('<button class="evf-registered-item" />')
6294 .attr('data-field-type', fieldType)
6295 .attr('data-field-label', fieldLabel);
6296
6297 if ($insertAfterField && $insertAfterField.length) {
6298 $insertAfterField.after($placeholder);
6299 } else if ($insertIntoGrid && $insertIntoGrid.length) {
6300 $insertIntoGrid.append($placeholder);
6301 } else {
6302 $popover
6303 .data('target-row')
6304 .find('.evf-admin-grid')
6305 .last()
6306 .append($placeholder);
6307 }
6308
6309 EVFPanelBuilder.fieldDrop($placeholder);
6310 $popover.hide().removeData('insert-into-grid');
6311 $('.evf-admin-row.evf-popover-open').removeClass('evf-popover-open');
6312 $('.everest-forms-field.evf-field-popover-open').removeClass(
6313 'evf-field-popover-open',
6314 );
6315 },
6316 );
6317
6318 // Handle layout container items clicked inside the popover.
6319 $(document.body).on(
6320 'click',
6321 '#evf-row-field-popover .evf-layout-container-item',
6322 function () {
6323 var columns = parseInt($(this).data('columns'), 10),
6324 $popover = $('#evf-row-field-popover'),
6325 $targetRow = $popover.data('target-row');
6326
6327 $popover.hide().removeData('insert-into-grid');
6328 $('.evf-admin-row.evf-popover-open').removeClass('evf-popover-open');
6329 $('.everest-forms-field.evf-field-popover-open').removeClass(
6330 'evf-field-popover-open',
6331 );
6332
6333 EVFPanelBuilder.addLayoutContainer(
6334 columns,
6335 $targetRow,
6336 null,
6337 $targetRow,
6338 );
6339 },
6340 );
6341 },
6342
6343 /**
6344 * Toggle fields tabs (Add Fields, Field Options).
6345 */
6346 fieldTabChoice: function (id) {
6347 $('.everest-forms-tab-content').scrollTop(0);
6348 $('.everest-forms-fields-tab a').removeClass('active');
6349 $('.everest-forms-field, .everest-forms-title-desc').removeClass(
6350 'active',
6351 );
6352
6353 $('#' + id).addClass('active');
6354
6355 if ('add-fields' === id) {
6356 $('.everest-forms-add-fields').show();
6357 $('.everest-forms-field-options').hide();
6358 } else {
6359 if ('field-options' === id) {
6360 id = $('.everest-forms-field').first().data('field-id');
6361 $('.everest-forms-field-options').show();
6362 $('.everest-forms-field').first().addClass('active');
6363 } else {
6364 $('#everest-forms-field-' + id).addClass('active');
6365 }
6366 $('.everest-forms-field-option').hide();
6367 $('#everest-forms-field-option-' + id).show();
6368 $('.everest-forms-add-fields').hide();
6369 }
6370 },
6371 bindFormPreview: function () {},
6372 bindFormPreviewWithKeyEvent: function () {
6373 $('body').on('keydown', function (e) {
6374 if (e.ctrlKey || e.metaKey) {
6375 if (
6376 'p' === String.fromCharCode(e.which).toLowerCase() ||
6377 80 === e.which
6378 ) {
6379 e.preventDefault();
6380 window.open(evf_data.preview_url);
6381 }
6382 }
6383 });
6384 },
6385 bindFormEntriesWithKeyEvent: function () {
6386 $('body').on('keydown', function (e) {
6387 if (e.ctrlKey || e.metaKey) {
6388 if (
6389 'e' === String.fromCharCode(e.which).toLowerCase() ||
6390 69 === e.which
6391 ) {
6392 e.preventDefault();
6393 window.open(evf_data.entries_url);
6394 }
6395 }
6396 });
6397 },
6398 bindGridSwitcher: function () {
6399 $('body').on('click', '.evf-show-grid', function (e) {
6400 e.stopPropagation();
6401 EVFPanelBuilder.checkEmptyGrid();
6402 $(this)
6403 .closest('.evf-toggle-row')
6404 .find('.evf-toggle-row-content')
6405 .stop(true)
6406 .slideToggle(200);
6407 });
6408 $(document).on('click', function () {
6409 EVFPanelBuilder.checkEmptyGrid();
6410 $('.evf-show-grid')
6411 .closest('.evf-toggle-row')
6412 .find('.evf-toggle-row-content')
6413 .stop(true)
6414 .slideUp(200);
6415 });
6416 var max_number_of_grid = 4;
6417 $('body').on('click', '.evf-grid-selector', function () {
6418 var $this_single_row = $(this).closest('.evf-admin-row');
6419 if ($(this).hasClass('active')) {
6420 return;
6421 }
6422 var grid_id = parseInt($(this).attr('data-evf-grid'), 10);
6423 if (grid_id > max_number_of_grid) {
6424 return;
6425 }
6426
6427 var grid_node = $(
6428 '<div class="evf-admin-grid evf-grid-' +
6429 grid_id +
6430 ' ui-sortable evf-empty-grid" />',
6431 );
6432 var grids = $('<div/>');
6433
6434 $.each($this_single_row.find('.evf-admin-grid'), function () {
6435 $(this)
6436 .children('*')
6437 .each(function () {
6438 grids.append($(this).clone());
6439 });
6440 });
6441
6442 var $gridLists = $('<div class="evf-grid-lists"></div>');
6443
6444 for (var $grid_number = 1; $grid_number <= grid_id; $grid_number++) {
6445 grid_node.attr('data-grid-id', $grid_number);
6446 $gridLists.append(grid_node.clone());
6447 }
6448 $gridLists.append('<div class="clear evf-clear"></div>');
6449
6450 $this_single_row.find('.evf-grid-lists').remove();
6451 $this_single_row.find('.evf-admin-grid').remove();
6452 $this_single_row.find('.evf-clear').remove();
6453
6454 $this_single_row.append('<div class="clear evf-clear"></div>');
6455 $this_single_row.append($gridLists);
6456
6457 $this_single_row.find('.evf-admin-grid').eq(0).append(grids.html());
6458
6459 $this_single_row.find('.evf-grid-selector').removeClass('active');
6460 $(this).addClass('active');
6461 EVFPanelBuilder.bindFields();
6462 });
6463 },
6464 fieldDrop: function (field) {
6465 var field_type = field.attr('data-field-type');
6466
6467 // One-time-draggable fields (e.g. File Upload in the free version) are limited to a
6468 // single instance per form. Reject any extra drop of the same field type, including
6469 // rapid re-drops fired before the first field finishes loading (AJAX still in flight).
6470 var oneTimeDraggableFields = evf_data.form_one_time_draggable_fields || [];
6471 var isOneTimeDraggableField =
6472 $.inArray(field_type, oneTimeDraggableFields) >= 0;
6473 if (isOneTimeDraggableField) {
6474 if (
6475 $('#everest-forms-add-fields-' + field_type).hasClass(
6476 'evf-one-time-draggable-field',
6477 )
6478 ) {
6479 field.remove();
6480 EVFPanelBuilder.checkEmptyGrid();
6481 return false;
6482 }
6483 // Lock the sidebar field immediately so concurrent drops during the
6484 // loading state are blocked by the check above. The draggable itself is
6485 // torn down later in the AJAX success handler (oneTimeDraggableField),
6486 // once the drop event has fully settled.
6487 $('#everest-forms-add-fields-' + field_type).addClass(
6488 'evf-one-time-draggable-field',
6489 );
6490 }
6491
6492 var invalid_fields = ['payment-total'];
6493 if (
6494 invalid_fields.includes(field_type) &&
6495 field.closest('.evf-admin-row').hasClass('evf-repeater-fields')
6496 ) {
6497 $.confirm({
6498 title: false,
6499 content: 'This field cannot be added to Repeater Fields',
6500 type: 'red',
6501 closeIcon: false,
6502 backgroundDismiss: false,
6503 icon: 'dashicons dashicons-warning',
6504 buttons: {
6505 cancel: {
6506 text: evf_data.i18n_close,
6507 btnClass: 'btn-default',
6508 },
6509 },
6510 });
6511
6512 field.remove();
6513 return false;
6514 }
6515
6516 if (!$.contains(document.body, field[0])) {
6517 $('.evf-admin-grid').last().append(field);
6518 }
6519
6520 var fieldLoadingLabel = field.attr('data-field-label');
6521 field
6522 .css({
6523 left: '0',
6524 width: '100%',
6525 })
6526 .append(
6527 '<span class="evf-field-loading-wrap">' +
6528 '<i class="spinner is-active"></i>' +
6529 (fieldLoadingLabel
6530 ? '<span class="evf-field-loading-label">' +
6531 fieldLoadingLabel +
6532 '</span>'
6533 : '') +
6534 '</span>',
6535 );
6536
6537 $.ajax({
6538 url: evf_data.ajax_url,
6539 type: 'POST',
6540 data: {
6541 action: 'everest_forms_new_field_' + field_type,
6542 security: evf_data.evf_field_drop_nonce,
6543 field_type: field_type,
6544 form_id: evf_data.form_id,
6545 },
6546 beforeSend: function () {
6547 $(document.body).trigger('init_field_options_toggle');
6548 },
6549 error: function () {
6550 // Adding the field failed; remove the loading placeholder and unlock the
6551 // sidebar field so a one-time-draggable field can be dragged again.
6552 field.remove();
6553 if (isOneTimeDraggableField) {
6554 EVFPanelBuilder.oneTimeDraggableRemoveField(field_type);
6555 }
6556 EVFPanelBuilder.checkEmptyGrid();
6557 },
6558 success: function (response) {
6559 var field_preview = response.data.preview,
6560 field_options = response.data.options,
6561 form_field_id = response.data.form_field_id,
6562 field_type = response.data.field.type,
6563 dragged_el_id = $(field_preview).attr('id'),
6564 dragged_field_id = $(field_preview).attr('data-field-id');
6565
6566 $('#everest-forms-field-id').val(form_field_id);
6567 $('.everest-forms-field-options').find('.no-fields').hide();
6568 $('.everest-forms-field-options').append(field_options);
6569 $(
6570 '.everest-forms-field-option-row-icon_color input.colorpicker',
6571 ).wpColorPicker({
6572 change: function (event) {
6573 var $this = $(this),
6574 value = $this.val(),
6575 field_id = $this
6576 .closest('.everest-forms-field-option-row')
6577 .data('field-id');
6578
6579 $('#everest-forms-field-' + field_id + ' .rating-icon svg').css(
6580 'fill',
6581 value,
6582 );
6583 },
6584 });
6585
6586 if ( field_type === 'repeater-fields' ) {
6587 field.remove();
6588 $(document.body).trigger('init_tooltips');
6589 $(document.body).trigger('init_field_options_toggle');
6590 $(document.body).trigger('evf_after_field_append', [dragged_el_id]);
6591 EVFPanelBuilder.conditionalLogicAppendField(dragged_el_id);
6592 EVFPanelBuilder.conditionalLogicAppendFieldIntegration(dragged_el_id);
6593 EVFPanelBuilder.paymentFieldAppendToQuantity(dragged_el_id);
6594 EVFPanelBuilder.paymentFieldAppendToDropdown(dragged_field_id, field_type);
6595 EVFPanelBuilder.oneTimeDraggableField(dragged_field_id, field_type);
6596 EVFPanelBuilder.init_datepickers();
6597 EVFPanelBuilder.init_payment_subscription_plan_field();
6598 $(
6599 '#everest-forms-field-option-' +
6600 dragged_field_id +
6601 '-enable_min_max_time',
6602 ).hide();
6603 $(
6604 'label[for=everest-forms-field-option-' +
6605 dragged_field_id +
6606 '-enable_min_max_time]',
6607 ).hide();
6608 $(
6609 'label[for=everest-forms-field-option-' +
6610 dragged_field_id +
6611 '-select_min_time]',
6612 ).hide();
6613 $(
6614 'label[for=everest-forms-field-option-' +
6615 dragged_field_id +
6616 '-select_max_time]',
6617 ).hide();
6618 $(
6619 '#everest-forms-field-option-' +
6620 dragged_field_id +
6621 '-min_time_hour',
6622 )
6623 .parent()
6624 .hide();
6625 $(
6626 '#everest-forms-field-option-' +
6627 dragged_field_id +
6628 '-max_time_hour',
6629 )
6630 .parent()
6631 .hide();
6632 $(document.body).trigger('evf_field_drop_complete', [
6633 field_type,
6634 dragged_field_id,
6635 field_preview,
6636 field_options,
6637 ]);
6638 EVFPanelBuilder.checkEmptyGrid();
6639 return;
6640 }
6641
6642 if ($.contains(document.body, field[0])) {
6643 field.after(field_preview);
6644 } else {
6645 $('.evf-admin-grid').last().append(field_preview);
6646 }
6647
6648 if (
6649 null !== $('#everest-forms-panel-field-settings-enable_survey') &&
6650 $('#everest-forms-panel-field-settings-enable_survey').prop(
6651 'checked',
6652 )
6653 ) {
6654 $(
6655 '#everest-forms-field-option-' +
6656 dragged_field_id +
6657 '-survey_status',
6658 ).prop('checked', true);
6659 }
6660
6661 if (
6662 null !== $('#everest-forms-panel-field-settings-enable_quiz') &&
6663 $('#everest-forms-panel-field-settings-enable_quiz').prop('checked')
6664 ) {
6665 $(
6666 '#everest-forms-field-option-' +
6667 dragged_field_id +
6668 '-quiz_status',
6669 ).prop('checked', true);
6670 $(
6671 '#everest-forms-field-option-' +
6672 dragged_field_id +
6673 '-quiz_status',
6674 )
6675 .closest('.everest-forms-field-option-row-quiz_status')
6676 .siblings('.everst-forms-field-quiz-settings')
6677 .removeClass('everest-forms-hidden')
6678 .addClass('everest-forms-show');
6679 }
6680
6681 field.remove();
6682
6683 // Triggers.
6684 $(document.body).trigger('init_tooltips');
6685 $(document.body).trigger('init_field_options_toggle');
6686 $(document.body).trigger('evf_after_field_append', [dragged_el_id]);
6687 // Conditional logic append rules.
6688 EVFPanelBuilder.conditionalLogicAppendField(dragged_el_id);
6689 EVFPanelBuilder.conditionalLogicAppendFieldIntegration(dragged_el_id);
6690 EVFPanelBuilder.paymentFieldAppendToQuantity(dragged_el_id);
6691 EVFPanelBuilder.paymentFieldAppendToDropdown(
6692 dragged_field_id,
6693 field_type,
6694 );
6695
6696 //One Time draggable.
6697 EVFPanelBuilder.oneTimeDraggableField(dragged_field_id, field_type);
6698
6699 // Initialization Datepickers.
6700 EVFPanelBuilder.init_datepickers();
6701 EVFPanelBuilder.init_payment_subscription_plan_field();
6702
6703 // Hiding time min max options in setting for Datepickers.
6704 $(
6705 '#everest-forms-field-option-' +
6706 dragged_field_id +
6707 '-enable_min_max_time',
6708 ).hide();
6709 $(
6710 'label[for=everest-forms-field-option-' +
6711 dragged_field_id +
6712 '-enable_min_max_time]',
6713 ).hide();
6714 $(
6715 'label[for=everest-forms-field-option-' +
6716 dragged_field_id +
6717 '-select_min_time]',
6718 ).hide();
6719 $(
6720 'label[for=everest-forms-field-option-' +
6721 dragged_field_id +
6722 '-select_max_time]',
6723 ).hide();
6724 $(
6725 '#everest-forms-field-option-' +
6726 dragged_field_id +
6727 '-min_time_hour',
6728 )
6729 .parent()
6730 .hide();
6731 $(
6732 '#everest-forms-field-option-' +
6733 dragged_field_id +
6734 '-max_time_hour',
6735 )
6736 .parent()
6737 .hide();
6738
6739 // Trigger an event indicating completion of field_drop action.
6740 $(document.body).trigger('evf_field_drop_complete', [
6741 field_type,
6742 dragged_field_id,
6743 field_preview,
6744 field_options,
6745 ]);
6746 EVFPanelBuilder.checkEmptyGrid();
6747 },
6748 });
6749 },
6750
6751 conditionalLogicAppendField: function (id) {
6752 var dragged_el = $('#' + id);
6753 var dragged_index = dragged_el.index();
6754
6755 var fields = $('.evf-field-conditional-field-select');
6756
6757 var field_type = dragged_el.attr('data-field-type');
6758 var field_id = dragged_el.attr('data-field-id');
6759 var field_label = dragged_el.find('.label-title .text ').text();
6760
6761 $.fn.insertAt = function (elements, index, selected_id) {
6762 var array = $.makeArray(this.children().clone(true));
6763 array.splice(index, 0, elements);
6764 $.each(array, function (index, el) {
6765 if (selected_id === $(el)[0]['value']) {
6766 $(el)[0]['selected'] = true;
6767 array[index] = el;
6768 }
6769 });
6770 this.empty().append(array);
6771 };
6772 var dragged_field_id = field_id;
6773 fields.each(function (index, el) {
6774 var selected_id = $(el).val();
6775 var id_key = id.replace('everest-forms-field-', '');
6776 var name = $(el).attr('name');
6777 var name_key = name.substring(name.indexOf('[') + 1, name.indexOf(']'));
6778
6779 if (id_key === name_key) {
6780 $('.evf-admin-row .evf-admin-grid .everest-forms-field').each(
6781 function () {
6782 var form_field_type = $(this).data('field-type'),
6783 form_field_id = $(this).data('field-id'),
6784 form_field_label = $(this)
6785 .find('.label-title span')
6786 .first()
6787 .text();
6788 field_to_be_restricted = [];
6789 field_to_be_restricted = [
6790 'html',
6791 'title',
6792 'address',
6793 'image-upload',
6794 'file-upload',
6795 'date-time',
6796 'hidden',
6797 'scale-rating',
6798 'likert',
6799 'yes-no',
6800 ];
6801 if (
6802 $.inArray(form_field_type, field_to_be_restricted) === -1 &&
6803 dragged_field_id !== form_field_id
6804 ) {
6805 if (
6806 0 ===
6807 fields
6808 .eq(index)
6809 .find('option[data-field_id="' + form_field_id + '"]')
6810 .length
6811 ) {
6812 fields
6813 .eq(index)
6814 .append(
6815 '<option class="evf-conditional-fields" data-field_type="' +
6816 form_field_type +
6817 '" data-field_id="' +
6818 form_field_id +
6819 '" value="' +
6820 form_field_id +
6821 '">' +
6822 form_field_label +
6823 '</option>',
6824 );
6825 }
6826 }
6827 },
6828 );
6829 } else {
6830 var el_to_append =
6831 '<option class="evf-conditional-fields" data-field_type="' +
6832 field_type +
6833 '" data-field_id="' +
6834 field_id +
6835 '" value="' +
6836 field_id +
6837 '">' +
6838 field_label +
6839 '</option>';
6840 if (
6841 'html' !== field_type &&
6842 'title' !== field_type &&
6843 'address' !== field_type &&
6844 'image-upload' !== field_type &&
6845 'file-upload' !== field_type &&
6846 'hidden' !== field_type &&
6847 'likert' !== field_type &&
6848 'scale-rating' !== field_type &&
6849 'yes-no' !== field_type &&
6850 'divider' !== field_type
6851 ) {
6852 fields.eq(index).insertAt(el_to_append, 1, selected_id);
6853 }
6854 }
6855 if (
6856 fields.eq(index).find('option:not(.evf-conditional-fields)').length >
6857 1
6858 ) {
6859 fields
6860 .eq(index)
6861 .find('option:not(.evf-conditional-fields):gt(0)')
6862 .remove();
6863 }
6864 });
6865 },
6866 conditionalLogicAppendRow: function (id) {
6867 var new_row_option = $('#everest-forms-row-option-row_' + id);
6868
6869 var fields = $('.everest-forms-field');
6870
6871 fields.each(function () {
6872 var field = $(this),
6873 field_id = field.attr('data-field-id'),
6874 field_type = field.attr('data-field-type'),
6875 field_label = '';
6876
6877 field.find('.required').remove();
6878 field_label = field.find('.label-title').html();
6879
6880 var el_to_append =
6881 '<option class="evf-conditional-fields" data-field_type="' +
6882 field_type +
6883 '" data-field_id="' +
6884 field_id +
6885 '" value="' +
6886 field_id +
6887 '">' +
6888 field_label +
6889 '</option>';
6890
6891 if (
6892 0 ===
6893 $(document).find(
6894 '.evf-admin-row[data-row-id="' +
6895 id +
6896 '"] #everest-forms-field-' +
6897 field_id,
6898 ).length &&
6899 0 ===
6900 new_row_option.find(
6901 '.evf-field-conditional-field-select option[data-field_id="' +
6902 field_id +
6903 '"]',
6904 ).length &&
6905 'html' !== field_type &&
6906 'title' !== field_type &&
6907 'address' !== field_type &&
6908 'image-upload' !== field_type &&
6909 'file-upload' !== field_type &&
6910 'date-time' !== field_type &&
6911 'hidden' !== field_type &&
6912 'likert' !== field_type &&
6913 'scale-rating' !== field_type &&
6914 'divider' !== field_type
6915 ) {
6916 new_row_option
6917 .find('.evf-field-conditional-field-select')
6918 .append(el_to_append);
6919 }
6920 if (
6921 new_row_option.find(
6922 '.evf-field-conditional-field-select option:not(.evf-conditional-fields)',
6923 ).length > 1
6924 ) {
6925 new_row_option
6926 .find(
6927 '.evf-field-conditional-field-select option:not(.evf-conditional-fields):gt(0)',
6928 )
6929 .remove();
6930 }
6931 new_row_option.hide();
6932 });
6933 },
6934
6935 paymentFieldAppendToQuantity: function (id) {
6936 var dragged_el = $('#' + id);
6937
6938 var fields = $('.everest-forms-field-option-row-map_field select');
6939 var field_type = dragged_el.attr('data-field-type');
6940 var field_id = dragged_el.attr('data-field-id');
6941 var field_label = dragged_el.find('.label-title .text ').text();
6942
6943 var el_to_append =
6944 '<option value="' + field_id + '">' + field_label + '</option>';
6945 if (
6946 'payment-single' === field_type ||
6947 'payment-multiple' === field_type ||
6948 'payment-checkbox' === field_type
6949 ) {
6950 fields.append(el_to_append);
6951 }
6952 },
6953
6954 paymentFieldAppendToDropdown: function (dragged_field_id, field_type) {
6955 if (
6956 'payment-quantity' === field_type ||
6957 'payment-coupon' === field_type ||
6958 'payment-subtotal' === field_type
6959 ) {
6960 var match_fields = [
6961 'payment-checkbox',
6962 'payment-multiple',
6963 'payment-single',
6964 'range-slider',
6965 ],
6966 qty_dropdown = $(
6967 '#everest-forms-field-option-' + dragged_field_id + '-map_field',
6968 );
6969 match_fields.forEach(function (single_field) {
6970 $('.everest-forms-field-' + single_field).each(function () {
6971 if ('range-slider' === $(this).attr('data-field-type')) {
6972 if (
6973 'true' ===
6974 $(this)
6975 .find('.evf-range-slider-preview')
6976 .attr('data-enable-payment-slider')
6977 ) {
6978 var id = $(this).attr('data-field-id'),
6979 label = $(this).find('.label-title .text').text();
6980 var el_to_append =
6981 '<option value="' + id + '">' + label + '</option>';
6982 } else {
6983 return;
6984 }
6985 }
6986 var id = $(this).attr('data-field-id'),
6987 label = $(this).find('.label-title .text').text();
6988 var el_to_append =
6989 '<option value="' + id + '">' + label + '</option>';
6990 qty_dropdown.append(el_to_append);
6991 });
6992 });
6993 }
6994 },
6995
6996 oneTimeDraggableField: function (dragged_field_id, field_type) {
6997 var singleDraggableFields = evf_data.form_one_time_draggable_fields;
6998 var draggedFieldElement = $('#everest-forms-add-fields-' + field_type);
6999
7000 if (
7001 singleDraggableFields.length > 0 &&
7002 $.inArray(field_type, singleDraggableFields) >= 0 &&
7003 draggedFieldElement.length
7004 ) {
7005 draggedFieldElement.addClass('evf-one-time-draggable-field');
7006 // Destroy the jQuery UI draggable so the locked sidebar field can no longer
7007 // be dragged onto the canvas (mirrors oneTimeDraggableRemoveField).
7008 EVFPanelBuilder.refreshRegisteredSidebarFieldDraggable(
7009 draggedFieldElement,
7010 );
7011 }
7012 },
7013
7014 conditionalLogicAppendFieldIntegration: function (id) {
7015 var dragged_el = $('#' + id);
7016 var dragged_index = dragged_el.index();
7017
7018 var fields = $('.evf-provider-conditional').find(
7019 '.evf-conditional-field-select',
7020 );
7021
7022 var field_type = dragged_el.attr('data-field-type');
7023 var field_id = dragged_el.attr('data-field-id');
7024 var field_label = dragged_el.find('.label-title .text ').text();
7025
7026 $.fn.insertAt = function (elements, index) {
7027 var array = $.makeArray(this.children().clone(true));
7028 array.splice(index, 0, elements);
7029 this.empty().append(array);
7030 };
7031
7032 fields.each(function (index, el) {
7033 var id_key = id.replace('everest-forms-field-', '');
7034 var name = $(el).attr('name');
7035 var name_key = name.substring(name.indexOf('[') + 1, name.indexOf(']'));
7036
7037 if (id_key === name_key) {
7038 $('.evf-admin-row .evf-admin-grid .everest-forms-field').each(
7039 function () {
7040 var field_type = $(this).data('field-type'),
7041 field_id = $(this).data('field-id'),
7042 field_label = $(this).find('.label-title span').first().text();
7043 field_to_be_restricted = [];
7044 field_to_be_restricted = [
7045 'html',
7046 'title',
7047 'address',
7048 'image-upload',
7049 'file-upload',
7050 'signature',
7051 'divider',
7052 'date-time',
7053 'hidden',
7054 'scale-rating',
7055 'likert',
7056 'yes-no',
7057 dragged_el.attr('data-field-type'),
7058 ];
7059
7060 if ($.inArray(field_type, field_to_be_restricted) === -1) {
7061 fields
7062 .eq(index)
7063 .append(
7064 '<option class="evf-conditional-fields" data-field_type="' +
7065 field_type +
7066 '" data-field_id="' +
7067 field_id +
7068 '" value="' +
7069 field_id +
7070 '">' +
7071 field_label +
7072 '</option>',
7073 );
7074 }
7075 },
7076 );
7077 } else {
7078 var el_to_append =
7079 '<option class="evf-conditional-fields" data-field_type="' +
7080 field_type +
7081 '" data-field_id="' +
7082 field_id +
7083 '" value="' +
7084 field_id +
7085 '">' +
7086 field_label +
7087 '</option>';
7088 if (
7089 'html' !== field_type &&
7090 'title' !== field_type &&
7091 'address' !== field_type &&
7092 'image-upload' !== field_type &&
7093 'file-upload' !== field_type &&
7094 'date-time' !== field_type &&
7095 'hidden' !== field_type &&
7096 'likert' !== field_type &&
7097 'scale-rating' !== field_type &&
7098 'yes-no' !== field_type
7099 ) {
7100 fields.eq(index).insertAt(el_to_append, dragged_index);
7101 }
7102 }
7103 });
7104 },
7105
7106 conditionalLogicRemoveField: function (id) {
7107 $(
7108 '.evf-field-conditional-field-select option[value = ' + id + ' ]',
7109 ).remove();
7110 },
7111
7112 conditionalLogicRemoveFieldIntegration: function (id) {
7113 $(
7114 '.evf-provider-conditional .evf-conditional-field-select option[value = ' +
7115 id +
7116 ' ]',
7117 ).remove();
7118 },
7119
7120 paymentFieldRemoveFromQuantity: function (id) {
7121 $(
7122 '.everest-forms-field-option-row-map_field select option[value = ' +
7123 id +
7124 ' ]',
7125 ).remove();
7126 },
7127
7128 /**
7129 * Keep Payments / gateway panel field-map selects in sync when fields are added or removed
7130 * (e.g. phone appears for Stripe "customer_phone" mapping without reloading).
7131 *
7132 * @param {string} action 'add' or 'remove'.
7133 * @param {string} fieldRef For add: preview element id (e.g. everest-forms-field-12). For remove: data-field-id.
7134 */
7135 refreshFieldMapSelectsFromField: function (action, fieldRef) {
7136 var $form = $('form#everest-forms-builder-form');
7137 if (!$form.length) {
7138 return;
7139 }
7140
7141 if ('remove' === action) {
7142 var rid = String(fieldRef);
7143 $form
7144 .find('select.everest-forms-field-map-select')
7145 .each(function () {
7146 $(this).find('option[value="' + rid + '"]').remove();
7147 });
7148 return;
7149 }
7150
7151 var raw = String(fieldRef || '').replace(/^#/, '');
7152 var $field = $('#' + raw);
7153 if (!$field.length && /^\d+$/.test(raw)) {
7154 $field = $('#everest-forms-field-' + raw);
7155 }
7156 if (!$field.length) {
7157 return;
7158 }
7159
7160 var field_type = $field.attr('data-field-type');
7161 var element_id = $field.attr('data-field-id');
7162 if (!field_type || !element_id) {
7163 return;
7164 }
7165
7166 var label = $field.find('.label-title .text').first().text();
7167 if (!label) {
7168 label = '#' + element_id;
7169 }
7170
7171 $form.find('select.everest-forms-field-map-select').each(function () {
7172 var $select = $(this);
7173 var allowedAttr = $select.attr('data-field-map-allowed');
7174 if (!allowedAttr) {
7175 return;
7176 }
7177 var field_allowed = allowedAttr.split(/\s+/);
7178 if (
7179 field_allowed.indexOf(field_type) === -1 &&
7180 field_allowed.indexOf('all-fields') === -1
7181 ) {
7182 return;
7183 }
7184 if ($select.find('option[value="' + element_id + '"]').length) {
7185 return;
7186 }
7187 $select.append(
7188 $('<option></option>').attr('value', element_id).text(label),
7189 );
7190 });
7191 },
7192
7193 /**
7194 * Rebuild every field-map select inside a container from fields currently on the builder canvas.
7195 *
7196 * @param {string|jQuery} container Field option root, e.g. #everest-forms-field-option-{id}.
7197 * @param {string} excludeFieldId Optional data-field-id to omit (e.g. the gateway selector itself).
7198 */
7199 refreshFieldMapSelectsInContainer: function (container, excludeFieldId) {
7200 var $container =
7201 container instanceof jQuery ? container : $(container);
7202 if (!$container.length) {
7203 return;
7204 }
7205
7206 var exclude = excludeFieldId ? String(excludeFieldId) : '';
7207 var $canvasFields = $('#everest-forms-builder').find(
7208 '.evf-admin-field-wrapper .everest-forms-field',
7209 );
7210
7211 $container
7212 .find('select.everest-forms-field-map-select')
7213 .each(function () {
7214 var $select = $(this);
7215 var allowedAttr = $select.attr('data-field-map-allowed');
7216 if (!allowedAttr) {
7217 return;
7218 }
7219 var fieldAllowed = allowedAttr.split(/\s+/).filter(Boolean);
7220 var currentVal = $select.val();
7221 var placeholder = $select.attr('data-field-map-placeholder');
7222
7223 if ($select.hasClass('select2-hidden-accessible')) {
7224 try {
7225 $select.selectWoo('destroy');
7226 } catch (err) {
7227 // Ignore if selectWoo was not initialized.
7228 }
7229 $select.removeClass('enhanced');
7230 }
7231
7232 $select.empty();
7233 if (placeholder) {
7234 $select.append(
7235 $('<option></option>').attr('value', '').text(placeholder),
7236 );
7237 } else {
7238 $select.append($('<option></option>').attr('value', ''));
7239 }
7240
7241 $canvasFields.each(function () {
7242 var $f = $(this);
7243 var ft = $f.attr('data-field-type');
7244 var fid = String($f.attr('data-field-id') || '');
7245 if (!ft || !fid) {
7246 return;
7247 }
7248 if (exclude && fid === exclude) {
7249 return;
7250 }
7251 if (
7252 fieldAllowed.indexOf(ft) === -1 &&
7253 fieldAllowed.indexOf('all-fields') === -1
7254 ) {
7255 return;
7256 }
7257 var lbl = $f.find('.label-title .text').first().text();
7258 if (!lbl) {
7259 lbl = '#' + fid;
7260 }
7261 $select.append(
7262 $('<option></option>').attr('value', fid).text(lbl),
7263 );
7264 });
7265
7266 if (currentVal) {
7267 var match = false;
7268 $select.find('option').each(function () {
7269 if ($(this).val() === String(currentVal)) {
7270 match = true;
7271 return false;
7272 }
7273 });
7274 if (match) {
7275 $select.val(currentVal);
7276 }
7277 }
7278 });
7279
7280 $(document.body).trigger('evf-enhanced-select-init');
7281 },
7282
7283 oneTimeDraggableRemoveField: function (field_type) {
7284 var dragged_field_id = $('#everest-forms-add-fields-' + field_type);
7285 if (dragged_field_id.hasClass('evf-one-time-draggable-field')) {
7286 dragged_field_id.removeClass('upgrade-modal');
7287 dragged_field_id.removeClass('evf-one-time-draggable-field');
7288 EVFPanelBuilder.refreshRegisteredSidebarFieldDraggable(
7289 dragged_field_id,
7290 );
7291 }
7292 },
7293
7294 /**
7295 * Whether a sidebar field button should not be draggable (blocked state).
7296 *
7297 * @param {jQuery} $item Sidebar registered field button.
7298 * @return {boolean}
7299 */
7300 isRegisteredSidebarFieldBlocked: function ($item) {
7301 if (!$item || !$item.length) {
7302 return true;
7303 }
7304
7305 return $item.is(
7306 '.upgrade-modal, .evf-upgrade-addon, .enable-stripe-model, .enable-authorize-net-model, .enable-payment-subscription-plan, .everest-forms-pro-is_square_install, .enable-square-model, .evf-one-time-draggable-field, .recaptcha_empty_key_validate, .hcaptcha_empty_key_validate, .turnstile_empty_key_validate',
7307 );
7308 },
7309
7310 /**
7311 * Apply or remove jQuery UI draggable on sidebar field buttons after dynamic class changes.
7312 *
7313 * @param {jQuery} [$items] Optional buttons to refresh; defaults to all registered sidebar fields.
7314 */
7315 refreshRegisteredSidebarFieldDraggable: function ($items) {
7316 if (!$items || !$items.length) {
7317 $items = $(
7318 '.evf-registered-buttons button.evf-registered-item:not(.evf-layout-container-btn)',
7319 );
7320 }
7321
7322 $items.each(function () {
7323 var $btn = $(this);
7324
7325 if (EVFPanelBuilder.isRegisteredSidebarFieldBlocked($btn)) {
7326 if ($btn.data('ui-draggable')) {
7327 $btn.draggable('destroy');
7328 }
7329 return;
7330 }
7331
7332 if ($btn.data('ui-draggable')) {
7333 return;
7334 }
7335
7336 $btn
7337 .draggable({
7338 delay: 200,
7339 cancel: false,
7340 scroll: false,
7341 revert: 'invalid',
7342 scrollSensitivity: 40,
7343 forcePlaceholderSize: true,
7344 start: function () {
7345 $(this).addClass('field-dragged');
7346 },
7347 helper: function () {
7348 return $(this)
7349 .clone()
7350 .insertAfter(
7351 $(this)
7352 .closest('.everest-forms-tab-content')
7353 .siblings('.everest-forms-fields-tab'),
7354 );
7355 },
7356 stop: function () {
7357 $(this).removeClass('field-dragged');
7358 },
7359 opacity: 0.75,
7360 containment: '#everest-forms-builder',
7361 connectToSortable: '.evf-admin-grid',
7362 })
7363 .disableSelection();
7364 });
7365 },
7366
7367 syncPaymentMethodDependentFields: function () {
7368 var $builder = $('#everest-forms-builder');
7369 var hasPaymentMethodField =
7370 $builder.find('.everest-forms-field-payment-gateway-selector').length > 0;
7371 // Credit Card (Stripe) on the canvas blocks adding Payment Gateway; Payments tab
7372 // toggles can also block it. Legacy Credit Card / Authorize.Net / Square fields are
7373 // not mutually disabled with Payment Gateway for drag purposes beyond this.
7374 var $paymentGatewayAdd = $(
7375 '#everest-forms-add-fields-payment-gateway-selector',
7376 );
7377 if ($paymentGatewayAdd.length) {
7378 var hasEnabledPayments =
7379 EVFPanelBuilder.isAnyPaymentEnabled &&
7380 EVFPanelBuilder.isAnyPaymentEnabled();
7381
7382 // If any payment is enabled in Payments tab, force-disable Payment Gateway field.
7383 if (hasEnabledPayments) {
7384 $paymentGatewayAdd.addClass('evf-one-time-draggable-field');
7385 $paymentGatewayAdd.addClass('evf-payment-method-dependent-disabled');
7386 $paymentGatewayAdd.attr('data-evf-disabled-reason', 'enabled-payments');
7387 } else {
7388 var hasCreditCardField =
7389 $builder.find('.everest-forms-field-credit-card').length > 0;
7390
7391 if (hasCreditCardField) {
7392 $paymentGatewayAdd.addClass('evf-one-time-draggable-field');
7393 $paymentGatewayAdd.addClass('evf-payment-method-dependent-disabled');
7394 $paymentGatewayAdd.attr(
7395 'data-evf-disabled-reason',
7396 'credit-card-field',
7397 );
7398 } else {
7399 $paymentGatewayAdd.removeAttr('data-evf-disabled-reason');
7400 $paymentGatewayAdd.removeClass(
7401 'evf-payment-method-dependent-disabled',
7402 );
7403 if (!hasPaymentMethodField) {
7404 $paymentGatewayAdd.removeClass('evf-one-time-draggable-field');
7405 }
7406 }
7407 }
7408
7409 EVFPanelBuilder.refreshRegisteredSidebarFieldDraggable(
7410 $paymentGatewayAdd,
7411 );
7412 }
7413
7414 // If Payment Gateway field is used, block enabling payment gateways from Payments tab.
7415 if (EVFPanelBuilder.syncPaymentsTabEnableToggles) {
7416 EVFPanelBuilder.syncPaymentsTabEnableToggles(hasPaymentMethodField);
7417 }
7418
7419 // Payment Gateway selector replaces the legacy Credit Card field on the sidebar.
7420 var $creditCardAdd = $('#everest-forms-add-fields-credit-card');
7421 if ($creditCardAdd.length) {
7422 if (hasPaymentMethodField) {
7423 $creditCardAdd.addClass('enable-stripe-model');
7424 } else if (
7425 typeof EverestFormsProBuilder !== 'undefined' &&
7426 EverestFormsProBuilder.checkEnabledPayments
7427 ) {
7428 EverestFormsProBuilder.checkEnabledPayments();
7429 }
7430 EVFPanelBuilder.refreshRegisteredSidebarFieldDraggable($creditCardAdd);
7431 }
7432 },
7433
7434 /**
7435 * Whether any payment gateway is enabled in the Payments tab.
7436 *
7437 * This is used to restrict the Payment Gateway (selector) field: if a gateway is already enabled,
7438 * the selector field must stay off until those toggles are disabled.
7439 *
7440 * @return {boolean}
7441 */
7442 isAnyPaymentEnabled: function () {
7443 var selectors = [
7444 '#everest-forms-panel-field-paymentsstripe-enable_stripe',
7445 '#everest-forms-panel-field-paypal-enable_paypal',
7446 // Razorpay toggle id varies by version/addon; support both.
7447 '#everest-forms-panel-field-paymentsrazorpay-enable_razorpay',
7448 '#everest-forms-panel-field-razorpay-enable_razorpay',
7449 'input[name*="[razorpay]"][name*="enable_razorpay"]',
7450 '#everest-forms-panel-field-authorize_net-enable_authorize_net',
7451 '#everest-forms-panel-field-square-enable_square',
7452 '#everest-forms-panel-field-paymentsmollie-enable_mollie',
7453 ];
7454
7455 for (var i = 0; i < selectors.length; i++) {
7456 var $el = $(selectors[i]);
7457 if ($el.length && $el.is(':checked')) {
7458 return true;
7459 }
7460 }
7461 return false;
7462 },
7463
7464 bindFieldSettings: function () {
7465 $('body').on(
7466 'click',
7467 '.everest-forms-preview .everest-forms-field, .everest-forms-preview .everest-forms-field .everest-forms-field-setting',
7468 function (e) {
7469 e.preventDefault();
7470 var field_id = $(this)
7471 .closest('.everest-forms-field')
7472 .attr('data-field-id');
7473 $('.everest-forms-tab-content').scrollTop(0);
7474 EVFPanelBuilder.switchToFieldOptionPanel(field_id);
7475 },
7476 );
7477 },
7478
7479 toggleLabelEdit: function (label, input) {
7480 $(label).toggleClass('everest-forms-hidden');
7481 $(input).toggleClass('everest-forms-hidden');
7482
7483 if ($(input).is(':visible')) {
7484 $(input).focus();
7485 }
7486 },
7487
7488 bindToggleHandleActions: function () {
7489 $('body').on('click', '.toggle-handle', function (e) {
7490 var label = $(this).data('label'),
7491 input = $(this).data('input');
7492
7493 if (!$(input).is(':visible')) {
7494 EVFPanelBuilder.toggleLabelEdit(label, input);
7495 }
7496 });
7497 },
7498
7499 bindLabelEditInputActions: function () {
7500 $('body').on('focusout', '.label-edit-input', function (e) {
7501 var label = $(this).data('label'),
7502 input = this;
7503
7504 EVFPanelBuilder.toggleLabelEdit(label, input);
7505 });
7506 },
7507
7508 /**
7509 * Sync an input element with other elements like labels. An element with `sync-input` class will be synced to the elements
7510 * specified in `sync-targets` data.
7511 *
7512 * `Warning:` This is an one way sync, meaning only the text `sync-targets` will be updated when the source element's value changes
7513 * and the source element's value will not be updated if the value of `sync-targets` changes.
7514 */
7515 bindSyncedInputActions: function () {
7516 $('body').on('input', '.sync-input', function (e) {
7517 var changed_value = $(this).val(),
7518 sync_targets = $(this).data('sync-targets');
7519
7520 if (changed_value && sync_targets) {
7521 $(sync_targets).text(changed_value);
7522 }
7523 });
7524 },
7525 /**
7526 * Akismet anti-spam protection.
7527 *
7528 * @since 2.4.0
7529 */
7530 bindAkismetInit: function () {
7531 var akismetEnabler = $(document).find(
7532 '#everest-forms-panel-field-settings-akismet',
7533 );
7534 EVFPanelBuilder.akismetTogger(akismetEnabler);
7535 $(document).on(
7536 'change',
7537 '#everest-forms-panel-field-settings-akismet',
7538 function () {
7539 EVFPanelBuilder.akismetTogger($(this));
7540 },
7541 );
7542 },
7543 /**
7544 * Akismet Toggler.
7545 *
7546 * @param {object} akismetEnabler
7547 */
7548 akismetTogger: function (akismetEnabler) {
7549 if ($(akismetEnabler).is(':checked')) {
7550 $(document).find('.everest-forms-akismet-protection-type').show();
7551 } else {
7552 $(document).find('.everest-forms-akismet-protection-type').hide();
7553 }
7554 },
7555
7556 /**
7557 * Form Submission minimum waiting time.
7558 *
7559 * @since 3.0.2
7560 */
7561 bindFormSubmissionMinWaitingTime: function () {
7562 var submissionWaitingTimeEnabler = $(document).find(
7563 '#everest-forms-panel-field-settings-form_submission_min_waiting_time',
7564 );
7565 EVFPanelBuilder.formSubmissionMinTimeToggler(
7566 submissionWaitingTimeEnabler,
7567 );
7568 $(document).on(
7569 'change',
7570 '#everest-forms-panel-field-settings-form_submission_min_waiting_time',
7571 function () {
7572 EVFPanelBuilder.formSubmissionMinTimeToggler($(this));
7573 },
7574 );
7575 },
7576 /**
7577 * Form Submission waiting time Toggler.
7578 *
7579 * @param {object} submissionWaitingTimeEnabler
7580 */
7581 formSubmissionMinTimeToggler: function (submissionWaitingTimeEnabler) {
7582 if ($(submissionWaitingTimeEnabler).is(':checked')) {
7583 $(document)
7584 .find('.everest-forms-form-submission-minimum-waiting-time')
7585 .show();
7586 } else {
7587 $(document)
7588 .find('.everest-forms-form-submission-minimum-waiting-time')
7589 .hide();
7590 }
7591 },
7592 bindEditMetaKey: function (field_id = '') {
7593 $(document).on('click', '.evf-meta-key-copy-btn', function () {
7594 const $wrapper = $(this).closest('.evf-meta-key-input-wrapper');
7595 const $input = $wrapper.find('.evf-input-meta-key');
7596 const metaKey = $input.val();
7597
7598 $(this)
7599 .tooltipster('content', $(this).attr('data-copied'))
7600 .trigger('mouseenter')
7601 .on('mouseleave', function () {
7602 var $this = $(this);
7603
7604 setTimeout(function () {
7605 $this.tooltipster('content', $this.attr('data-tip'));
7606 }, 1000);
7607 });
7608
7609 navigator.clipboard.writeText(metaKey);
7610 });
7611
7612 if ('' === field_id) {
7613 $(document)
7614 .find('.evf-input-meta-key')
7615 .each(function () {
7616 var $this = $(this);
7617
7618 appendEditIcon($this);
7619 });
7620 } else {
7621 var $this = $('#everest-forms-field-option-' + field_id + '-meta-key');
7622 appendEditIcon($this);
7623 }
7624
7625 function appendEditIcon($this) {
7626 $this.wrap('<div class="evf-meta-key-input-wrapper"></div>');
7627
7628 $this.before(
7629 `<span class="evf-edit-meta-key-icon" data-meta_key="${$this.val()}">Edit</span>`,
7630 );
7631
7632 const $copyBtn = $(`
7633 <span class="evf-meta-key-copy-btn" data-copied="Copied!" data-tip="Copy to clipboard">
7634 <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
7635 <path d="M15.002 5.99902H7.50195C6.67353 5.99902 6.00195 6.6706 6.00195 7.49902V14.999C6.00195 15.8274 6.67353 16.499 7.50195 16.499H15.002C15.8304 16.499 16.502 15.8274 16.502 14.999V7.49902C16.502 6.6706 15.8304 5.99902 15.002 5.99902Z" stroke="#6B6B6B" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
7636 <path d="M3.00195 11.999C2.17695 11.999 1.50195 11.324 1.50195 10.499V2.99902C1.50195 2.17402 2.17695 1.49902 3.00195 1.49902H10.502C11.327 1.49902 12.002 2.17402 12.002 2.99902" stroke="#6B6B6B" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
7637 </svg>
7638 </span>
7639 `);
7640
7641 $this.after($copyBtn);
7642
7643 // Initialize Tooltipster
7644 $copyBtn.tooltipster({
7645 theme: 'tooltipster-default',
7646 delay: 100,
7647 side: 'top',
7648 updateAnimation: 'null',
7649 });
7650 }
7651 },
7652
7653 bindPrivacyPolicyActions: function () {
7654 // Consent message change handler.
7655 $(document.body).on(
7656 'input',
7657 '.everest-forms-field-option .evf-privacy-policy-consent-message',
7658 function (e) {
7659 var new_message = EVFPanelBuilder.processSyntaxes($(this).val());
7660
7661 // Update with the new processed consent message.
7662 $('.everest-forms-field.active')
7663 .find('.evf-privacy-policy-consent-message')
7664 .html(new_message);
7665 },
7666 );
7667
7668 // Local page add handler.
7669 $(document.body).on(
7670 'click',
7671 '.everest-forms-field-option .evf-add-local-privacy-policy-page',
7672 function (e) {
7673 var new_message = $(
7674 '.everest-forms-field-option:visible .evf-privacy-policy-consent-message',
7675 ).val(),
7676 selected_page_id = $(
7677 '.everest-forms-field-option:visible .evf-select-local-privacy-policy-page',
7678 ).val(),
7679 selected_page_title = $(
7680 '.everest-forms-field-option:visible .evf-select-local-privacy-policy-page option:selected',
7681 ).html();
7682
7683 // Append a hyperlink syntax containing the selected page to the consent message.
7684 if (selected_page_id) {
7685 new_message +=
7686 '[' +
7687 selected_page_title +
7688 '](?page_id=' +
7689 selected_page_id +
7690 ')';
7691
7692 // Update with the new consent message.
7693 $(
7694 '.everest-forms-field-option:visible .evf-privacy-policy-consent-message',
7695 ).val(new_message);
7696 new_message = EVFPanelBuilder.processSyntaxes(new_message);
7697 $('.everest-forms-field.active')
7698 .find('.evf-privacy-policy-consent-message')
7699 .html(new_message);
7700 }
7701 },
7702 );
7703
7704 // Custom page add handler.
7705 $(document.body).on(
7706 'click',
7707 '.everest-forms-field-option .evf-privacy-policy-add-custom-url',
7708 function (e) {
7709 var new_message = $(
7710 '.everest-forms-field-option:visible .evf-privacy-policy-consent-message',
7711 ).val(),
7712 label = $(
7713 '.everest-forms-field-option:visible .evf-privacy-policy-custom-link-label',
7714 )
7715 .val()
7716 .trim(),
7717 url = $(
7718 '.everest-forms-field-option:visible .evf-privacy-policy-custom-link-url',
7719 )
7720 .val()
7721 .trim();
7722
7723 // Prepend `http` protocol in the url.
7724 if (url.search('http') < 0) {
7725 url = 'http://' + url;
7726 }
7727
7728 // Append a hyperlink syntax containing the custom URL to the consent message.
7729 if ('' !== url) {
7730 new_message += '[' + label + '](' + url + ')';
7731
7732 // Update with the new consent message.
7733 $(
7734 '.everest-forms-field-option:visible .evf-privacy-policy-consent-message',
7735 ).val(new_message);
7736 new_message = EVFPanelBuilder.processSyntaxes(new_message);
7737 $('.everest-forms-field.active')
7738 .find('.evf-privacy-policy-consent-message')
7739 .html(new_message);
7740
7741 // Empty the input fields.
7742 $(
7743 '.everest-forms-field-option:visible .evf-privacy-policy-custom-link-label',
7744 ).val('');
7745 $(
7746 '.everest-forms-field-option:visible .evf-privacy-policy-custom-link-url',
7747 ).val('');
7748 }
7749 },
7750 );
7751 },
7752 /**
7753 * Process syntaxes in a text.
7754 *
7755 * @since 1.7.0
7756 *
7757 * @param {string} text Text to be processed.
7758 * @param {bool} escape_html Whether to escape all the htmls before processing or not.
7759 *
7760 * @return {string} Processed text.
7761 */
7762 processSyntaxes: function (text) {
7763 text = text.replace(/^\s+/g, '');
7764 text = EVFPanelBuilder.processHyperlinkSyntax(text);
7765 text = EVFPanelBuilder.process_italic_syntax(text);
7766 text = EVFPanelBuilder.process_bold_syntax(text);
7767 text = EVFPanelBuilder.process_underline_syntax(text);
7768 text = EVFPanelBuilder.process_new_lines(text);
7769 return text;
7770 },
7771
7772 /**
7773 * Process hyperlink syntaxes in a text.
7774 * The syntax used for hyperlink is: [Link Label](Link URL)
7775 * Example: [Google Search Page](https://google.com)
7776 *
7777 * @since 1.7.0
7778 *
7779 * @param {string} text Text to process.
7780 *
7781 * @return {string} Processed text.
7782 */
7783 processHyperlinkSyntax: function (text) {
7784 var regex = new RegExp(/(\[[^\[\]]*\])(\([^\(\)]*\))/g);
7785
7786 // Process all the hyperlink syntax.
7787 while ((matches = regex.exec(text))) {
7788 var matched_string = matches[0];
7789 var label = matches[1];
7790 var link = matches[2];
7791
7792 // Trim brackets.
7793 label = label.substring(1, label.length - 1);
7794 link = link.substring(1, link.length - 1);
7795
7796 // Proceed only if label or link is not empty.
7797 if ('' !== label || '' !== link) {
7798 // Use hash(#) if the link is empty.
7799 if ('' === link) {
7800 link = '#';
7801 }
7802
7803 // Use link as label if it's empty.
7804 if ('' === label) {
7805 label = link;
7806 }
7807
7808 // Insert hyperlink html.
7809 var html = '<a href="' + link + '">' + label + '</a>';
7810 text = text.replace(matched_string, html);
7811 } else {
7812 // If both label and link are empty then replace it with empty string.
7813 text = text.replace(matched_string, '');
7814 }
7815 }
7816 return text;
7817 },
7818
7819 /**
7820 * Process italic syntaxes in a text.
7821 * The syntax used for italic text is: `text`
7822 * Just wrap the text with back tick characters. To escape a backtick insert a backslash(\) before the character like "\`".
7823 *
7824 * @since 1.7.0
7825 *
7826 * @param {string} text Text to process.
7827 *
7828 * @return {string} Processed text.
7829 */
7830 process_italic_syntax: function (text) {
7831 var regex = new RegExp(/`[^`]+`/g);
7832 text = text.split('\\`').join('<&&&&&>'); // To preserve an escaped special character '`'.
7833
7834 while ((matches = regex.exec(text))) {
7835 var matched_string = matches[0];
7836 var label = matched_string
7837 .trim()
7838 .substring(1, matched_string.length - 1);
7839 var html = '<i>' + label + '</i>';
7840 text = text.replace(matched_string, html);
7841 }
7842 return text.split('<&&&&&>').join('`');
7843 },
7844
7845 /**
7846 * Process bold syntaxes in a text.
7847 * The syntax used for bold text is: *text*
7848 * Just wrap the text with asterisk characters. To escape an asterisk insert a backslash(\) before the character like "\*".
7849 *
7850 * @since 1.7.0
7851 *
7852 * @param {string} text Text to process.
7853 *
7854 * @return {string} Processed text.
7855 */
7856 process_bold_syntax: function (text) {
7857 var regex = new RegExp(/\*[^*]+\*/g);
7858 text = text.split('\\*').join('<&&&&&>'); // To preserve an escaped special character '*'.
7859
7860 while ((matches = regex.exec(text))) {
7861 var matched_string = matches[0];
7862 var label = matched_string
7863 .trim()
7864 .substring(1, matched_string.length - 1);
7865 var html = '<b>' + label + '</b>';
7866 text = text.replace(matched_string, html);
7867 }
7868 return text.split('<&&&&&>').join('*');
7869 },
7870
7871 /**
7872 * Process underline syntaxes in a text.
7873 * The syntax used for bold text is: __text__
7874 * Wrap the text with double underscore characters. To escape an underscore insert a backslash(\) before the character like "\_".
7875 *
7876 * @since 1.7.0
7877 *
7878 * @param {string} text Text to process.
7879 *
7880 * @return {string} Processed text.
7881 */
7882 process_underline_syntax: function (text) {
7883 var regex = new RegExp(/__[^_]+__/g);
7884 text = text.split('\\_').join('<&&&&&>'); // To preserve an escaped special character '_'.
7885
7886 while ((matches = regex.exec(text))) {
7887 var matched_string = matches[0];
7888 var label = matched_string
7889 .trim()
7890 .substring(2, matched_string.length - 2);
7891 var html = '<u>' + label + '</u>';
7892 text = text.replace(matched_string, html);
7893 }
7894 return text.split('<&&&&&>').join('_');
7895 },
7896
7897 /**
7898 * It replaces `\n` characters with `<br/>` tag because new line `\n` character is not supported in html.
7899 *
7900 * @since 1.7.0
7901 *
7902 * @param {string} text
7903 *
7904 * @return {string} Processed text.
7905 */
7906 process_new_lines: function (text) {
7907 //Ref: https://stackoverflow.com/questions/1144783/how-to-replace-all-occurrences-of-a-string
7908 return text.split('\n').join('<br/>');
7909 },
7910 livePreviewNumberOfRating: function (el) {
7911 var $this = $(el),
7912 value = $this.val();
7913 if (value.length == 0 || value <= 0) {
7914 value = 1;
7915 }
7916 var id = $this.parent().data('field-id'),
7917 icons = $('#everest-forms-field-' + id + ' .rating-icon').first();
7918 if (value <= 100) {
7919 $('#everest-forms-field-' + id + ' .rating-icon').remove();
7920 for (var $i = 1; $i <= value; $i++) {
7921 $('#everest-forms-field-' + id + '').append(icons.clone());
7922 }
7923 }
7924 },
7925 bindFormTags: function () {},
7926 };
7927
7928 /**
7929 * Re-render the builder's fields canvas + options panel in place (no full page
7930 * reload). Used by the in-builder AI chat after it edits the form via the AI
7931 * gateway. Because all field interactions are delegated on $builder (which is
7932 * NOT replaced), only sortables need re-initialising via bindFields().
7933 *
7934 * @param {number} formId Form ID to re-render.
7935 * @param {string} nonce evf_ai_nonce.
7936 * @param {function} done Callback(success:boolean).
7937 */
7938 window.evfReloadBuilderFields = function (formId, nonce, done) {
7939 $.post(
7940 window.ajaxurl,
7941 { action: 'evf_ai_render_fields', nonce: nonce, form_id: formId },
7942 function (res) {
7943 var ok = !!(res && res.success && res.data);
7944 if (ok) {
7945 $builder.find('.everest-forms-field-wrap').html(res.data.preview);
7946 $builder.find('.everest-forms-field-options').html(res.data.options);
7947 if (res.data.title) {
7948 $('#evf-edit-form-name').val(res.data.title);
7949 $('#everest-forms-panel-field-settings-form_title').val(res.data.title);
7950 }
7951 try {
7952 EVFPanelBuilder.bindFields();
7953 $(document.body).trigger('evf-enhanced-select-init');
7954
7955 // Select the first field by default so the field options
7956 // tab isn't left empty after the builder refreshes.
7957 var $firstField = $builder
7958 .find('.evf-admin-field-wrapper .everest-forms-field')
7959 .first();
7960 if ($firstField.length) {
7961 EVFPanelBuilder.switchToFieldOptionPanel(
7962 $firstField.attr('data-field-id'),
7963 );
7964 }
7965 } catch (e) {
7966 // Re-init is best-effort; the swapped DOM is still usable.
7967 }
7968 }
7969 if (typeof done === 'function') {
7970 done(ok);
7971 }
7972 }
7973 ).fail(function () {
7974 if (typeof done === 'function') {
7975 done(false);
7976 }
7977 });
7978 };
7979
7980 EVFPanelBuilder.init();
7981 })(jQuery, window.evf_data);
7982
7983 jQuery(function ($) {
7984 if (
7985 $(
7986 '#everest-forms-panel-field-settingsemail-evf_send_confirmation_email',
7987 ).attr('checked') != 'checked'
7988 ) {
7989 $(
7990 '#everest-forms-panel-field-settingsemail-evf_send_confirmation_email-wrap',
7991 )
7992 .nextAll()
7993 .hide();
7994 }
7995
7996 $('#everest-forms-panel-field-settingsemail-evf_send_confirmation_email').on(
7997 'change',
7998 function () {
7999 if ($(this).attr('checked') != 'checked') {
8000 $(
8001 '#everest-forms-panel-field-settingsemail-evf_send_confirmation_email-wrap',
8002 )
8003 .nextAll()
8004 .hide();
8005 } else {
8006 $(
8007 '#everest-forms-panel-field-settingsemail-evf_send_confirmation_email-wrap',
8008 )
8009 .nextAll()
8010 .show();
8011 }
8012 },
8013 );
8014
8015 window.pageType = function (el, redirectTo) {
8016 var outerWrapper = $(el).closest('.evf-confirmation-wrap');
8017
8018 // If the element isn't checked, return early.
8019 if (!el.is(':checked')) {
8020 return;
8021 }
8022
8023 // Show the appropriate settings based on redirect type.
8024 switch (redirectTo) {
8025 case 'same':
8026 $(outerWrapper).find('.same-page-setting').show();
8027 outerWrapper
8028 .find('.external-page-setting, .custom-page-setting')
8029 .hide();
8030 outerWrapper.find('.custom-and-external-page-setting').hide();
8031
8032 // Handle form state type changes.
8033 var el = outerWrapper.find('.form-state-type:checked');
8034 var initialValue = el.val();
8035
8036 toggleMessageLocations(el, initialValue);
8037 previewType(el, outerWrapper);
8038
8039 outerWrapper
8040 .off('change', '.form-state-type')
8041 .on('change', '.form-state-type', function () {
8042 toggleMessageLocations($(this), $(this).val());
8043 });
8044
8045 outerWrapper.on('change', '.everest-preview-confirmation', function () {
8046 var html = '';
8047 if ($(this).is(':checked')) {
8048 var options = [
8049 { value: 'top', label: 'Above Form Summary' },
8050 { value: 'bottom', label: 'Below Form Summary' },
8051 { value: 'popup', label: 'As Popup' },
8052 ];
8053 } else {
8054 var options = [
8055 { value: 'hide', label: 'Shown Message in Place of Form' },
8056 { value: 'popup', label: 'As Popup' },
8057 ];
8058 }
8059
8060 var select = outerWrapper.find('.form-state-hide select');
8061
8062 select.empty();
8063
8064 $.each(options, function (index, option) {
8065 html += `<option value="${option.value}">${option.label}</option>`;
8066 });
8067
8068 select.html(html);
8069 setTimeout(function () {
8070 select.trigger('change');
8071 }, 50);
8072 });
8073 break;
8074 case 'custom_page':
8075 outerWrapper.find('.custom-page-setting').show();
8076 outerWrapper.find('.custom-and-external-page-setting').show();
8077 outerWrapper.find('.same-page-setting, .external-page-setting').hide();
8078
8079 toggleAppendQueryString(outerWrapper);
8080 break;
8081 case 'external_url':
8082 outerWrapper.find('.external-page-setting').show();
8083 outerWrapper.find('.custom-and-external-page-setting').show();
8084 outerWrapper.find('.same-page-setting, .custom-page-setting').hide();
8085
8086 toggleAppendQueryString(outerWrapper);
8087 break;
8088 default:
8089 console.warn('Unknown redirect type:', redirectTo);
8090 break;
8091 }
8092 };
8093
8094 // Initialize on page load
8095 $(function ($) {
8096 // Get initial value and apply
8097 $('.confirmation-redirect-to').each(function () {
8098 var initialValue = $(this).val();
8099 window.pageType($(this), initialValue);
8100 });
8101
8102 // Handle changes
8103 $(document).on('change', '.confirmation-redirect-to', function () {
8104 window.pageType($(this), $(this).val());
8105 });
8106 });
8107
8108 // Function to toggle message locations based on form state
8109 function toggleMessageLocations(el, state) {
8110 var wrapper = $(el).closest('.everest-forms-border-container');
8111 wrapper.find('.form-state-hide, .form-state-reset').hide();
8112
8113 if (state === 'hide') {
8114 wrapper.find('.form-state-hide').show();
8115 wrapper.find('.preview-confirmation-toggle-wrapper').show();
8116 if (wrapper.find('.everest-preview-confirmation').is(':checked')) {
8117 wrapper.find('.preview-confirm-select-wrapper').show();
8118 } else {
8119 wrapper.find('.preview-confirm-select-wrapper').hide();
8120 }
8121 } else if (state === 'reset') {
8122 wrapper.find('.preview-confirmation-toggle-wrapper').hide();
8123 wrapper.find('.preview-confirm-select-wrapper').hide();
8124 wrapper.find('.form-state-reset').show();
8125 }
8126 }
8127
8128 // Handle query string toggle
8129 function toggleAppendQueryString(outerWrapper) {
8130 var queryStringWrap = outerWrapper.find('.query-string-wrap');
8131 var appendInput = outerWrapper.find('.append-query-string-input');
8132 queryStringWrap.toggle(appendInput.is(':checked'));
8133
8134 outerWrapper.on('change', '.append-query-string-input', function () {
8135 queryStringWrap.toggle($(this).is(':checked'));
8136 });
8137 }
8138
8139 function previewType(el, outerWrapper) {
8140 var queryStringWrap = outerWrapper.find('.preview-confirm-select-wrapper');
8141
8142 if (el.val() == 'reset') {
8143 queryStringWrap.toggle(false);
8144 return;
8145 }
8146
8147 var appendInput = outerWrapper.find('.everest-preview-confirmation');
8148 queryStringWrap.toggle(appendInput.is(':checked'));
8149
8150 outerWrapper.on('change', '.everest-preview-confirmation', function () {
8151 queryStringWrap.toggle($(this).is(':checked'));
8152 });
8153 }
8154
8155 $('.evf-panel-field-options-button.evf-disabled-tab').hide();
8156 });
8157
8158 jQuery(function ($) {
8159 // Add Fields - Open/close.
8160 $(document.body)
8161 .on('init_add_fields_toogle', function () {
8162 $('.everest-forms-add-fields').on(
8163 'click',
8164 '.everest-forms-add-fields-group > a',
8165 function (event) {
8166 event.preventDefault();
8167 $(this)
8168 .parent('.everest-forms-add-fields-group')
8169 .toggleClass('closed')
8170 .toggleClass('open');
8171 },
8172 );
8173 $('.everest-forms-add-fields').on(
8174 'click',
8175 '.everest-forms-add-fields-group a',
8176 function () {
8177 $(this).next('.evf-registered-buttons').stop().slideToggle();
8178 },
8179 );
8180 $('.everest-forms-add-fields-group.closed').each(function () {
8181 $(this).find('.evf-registered-buttons').hide();
8182 });
8183 })
8184 .trigger('init_add_fields_toogle');
8185
8186 // Fields Options - Open/close.
8187 $(document.body).on(
8188 'click',
8189 '.everest-forms-field-option .everest-forms-field-option-group > a',
8190 function (event) {
8191 event.preventDefault();
8192 var $fielOption = $(this)
8193 .closest('.everest-forms-field-option-group')
8194 .closest('.everest-forms-field-option');
8195 var currentElement = $(this),
8196 currentElementId = currentElement
8197 .parent('.everest-forms-field-option-group')
8198 .attr('id');
8199
8200 $fielOption.find('.everest-forms-field-option-group').each(function () {
8201 var selectedID = $(this).attr('id');
8202 if (currentElementId !== selectedID) {
8203 $(this).removeClass('open').addClass('closed');
8204 }
8205 });
8206
8207 var $currentGroup = $(this).parent('.everest-forms-field-option-group');
8208 if ($currentGroup.hasClass('closed')) {
8209 $currentGroup.removeClass('closed').addClass('open');
8210 } else {
8211 $currentGroup.removeClass('open').addClass('closed');
8212 }
8213 $('.everest-forms-field-option-group.closed').not($currentGroup).each(function () {
8214 $(this).find('.everest-forms-field-option-group-inner').hide();
8215 });
8216 },
8217 );
8218 $(document.body).on(
8219 'click',
8220 '.everest-forms-field-option .everest-forms-field-option-group a',
8221 function (event) {
8222 // If the user clicks on some form input inside, the box should not be toggled.
8223 if ($(event.target).filter(':input, option, .sort').length) {
8224 return;
8225 }
8226 $(this)
8227 .next('.everest-forms-field-option-group-inner')
8228 .stop()
8229 .slideToggle();
8230
8231 /**
8232 * If the field option group is not basic, then auto scroll to top.
8233 *
8234 * @since 3.3.0
8235 */
8236 var $el = $(this).closest('.everest-forms-field-option-group');
8237
8238 if (
8239 $el.length &&
8240 !$el.hasClass('everest-forms-field-option-group-basic')
8241 ) {
8242 var targetId = 'field-options';
8243 var dynamicLink = $('<a>', {
8244 id: 'evf-temp-link',
8245 href: '#' + targetId,
8246 });
8247
8248 dynamicLink.insertBefore($el);
8249
8250 dynamicLink[0].click();
8251
8252 setTimeout(function () {
8253 dynamicLink.remove();
8254 }, 100);
8255 }
8256 },
8257 );
8258 $(document.body)
8259 .on('init_field_options_toggle', function () {
8260 $('.everest-forms-field-option-group.closed').each(function () {
8261 $(this).find('.everest-forms-field-option-group-inner').hide();
8262 });
8263 })
8264 .trigger('init_field_options_toggle');
8265
8266 $(document).on('click', function () {
8267 $('.evf-smart-tag-lists').hide();
8268 });
8269
8270 $('.evf-smart-tag-lists').hide();
8271
8272 // Toggle Smart Tags.
8273 $(document.body).on('click', '.evf-toggle-smart-tag-display', function (e) {
8274 e.stopPropagation();
8275 $('.evf-smart-tag-lists').hide();
8276 $('.evf-smart-tag-lists ul').empty();
8277 $(this).parent().find('.evf-smart-tag-lists').toggle('show');
8278
8279 var type = $(this).data('type');
8280
8281 var allowed_field = $(this).data('fields');
8282 get_all_available_field(allowed_field, type, $(this));
8283 });
8284
8285 $(document.body).on('click', '.smart-tag-field', function (e) {
8286 var field_id = $(this).data('field_id'),
8287 field_label = $(this).text(),
8288 type = $(this).data('type'),
8289 $parent = $(this).parent().parent().parent(),
8290 $input = $parent.find('input[type=text]'),
8291 $textarea = $parent.find('textarea'),
8292 $calculationCodeMirror = $parent.find('.CodeMirror');
8293
8294 //Return when calculation smart tag is clicked because we use codeMirror
8295 if (0 != $calculationCodeMirror.length) {
8296 return;
8297 }
8298
8299 if (
8300 field_id !== 'fullname' &&
8301 field_id !== 'email' &&
8302 field_id !== 'subject' &&
8303 field_id !== 'message' &&
8304 'other' !== type
8305 ) {
8306 field_label = field_label.split(/[\s-_]/);
8307 for (var i = 0; i < field_label.length; i++) {
8308 if (i === 0) {
8309 field_label[i] =
8310 field_label[i].charAt(0).toLowerCase() + field_label[i].substr(1);
8311 } else {
8312 field_label[i] =
8313 field_label[i].charAt(0).toUpperCase() + field_label[i].substr(1);
8314 }
8315 }
8316 field_label = field_label.join('');
8317 field_id = field_label + '_' + field_id;
8318 } else {
8319 field_id = field_id;
8320 }
8321 if ('field' === type) {
8322 $input.val($input.val() + '{field_id="' + field_id + '"}');
8323 $textarea.val($textarea.val() + '{field_id="' + field_id + '"}');
8324 $textarea.trigger('change');
8325 } else if ('other' === type) {
8326 $input.val($input.val() + '{' + field_id + '}');
8327 $textarea.val($textarea.val() + '{' + field_id + '}');
8328 } else if ('regex' === type) {
8329 $input.val($input.val() + field_id.replace(field_label + '_', ''));
8330 $textarea.val($textarea.val() + field_id.replace(field_label + '_', ''));
8331 }
8332 });
8333
8334 // Toggle form status.
8335 $(document).on(
8336 'change',
8337 '.wp-list-table .everest-forms-toggle-form input',
8338 function (e) {
8339 e.stopPropagation();
8340 /**
8341 * Disable row when form is disabled.
8342 *
8343 * @since 3.2.0
8344 */
8345 if (!$(this).prop('checked')) {
8346 $(this)
8347 .closest('tr')
8348 .find('td')
8349 .not('.has-row-actions, .column-enabled')
8350 .addClass('evf-disable-row');
8351 var str = $(document)
8352 .find('.everest-forms-list-filters-row')
8353 .find('.inactive')
8354 .find('span.count')
8355 .text();
8356 var newStr = str.replace(/\((\d+)\)/, function (match, p1) {
8357 var number = parseInt(p1, 10);
8358 number += 1;
8359 return '(' + number + ')';
8360 });
8361 $(document)
8362 .find('.everest-forms-list-filters-row')
8363 .find('.inactive')
8364 .find('span.count')
8365 .text(newStr);
8366 } else {
8367 $(this)
8368 .closest('tr')
8369 .find('td')
8370 .not('.has-row-actions, .column-enabled')
8371 .removeClass('evf-disable-row');
8372 var str = $(document)
8373 .find('.everest-forms-list-filters-row')
8374 .find('.inactive')
8375 .find('span.count')
8376 .text();
8377 var newStr = str.replace(/\((\d+)\)/, function (match, p1) {
8378 var number = parseInt(p1, 10);
8379 number -= 1;
8380 return '(' + number + ')';
8381 });
8382 $(document)
8383 .find('.everest-forms-list-filters-row')
8384 .find('.inactive')
8385 .find('span.count')
8386 .text(newStr);
8387 }
8388
8389 $.post(evf_data.ajax_url, {
8390 action: 'everest_forms_enabled_form',
8391 security: evf_data.evf_enabled_form,
8392 form_id: $(this).data('form_id'),
8393 enabled: $(this).prop('checked') ? 1 : 0,
8394 });
8395 },
8396 );
8397
8398 $('.wp-list-table .everest-forms-toggle-form input').each(function () {
8399 if (!$(this).prop('checked')) {
8400 $(this)
8401 .closest('tr')
8402 .find('td')
8403 .not('.has-row-actions, .column-enabled')
8404 .addClass('evf-disable-row');
8405 } else {
8406 $(this)
8407 .closest('tr')
8408 .find('td')
8409 .not('.has-row-actions, .column-enabled')
8410 .removeClass('evf-disable-row');
8411 }
8412 });
8413
8414 // Toggle email notification.
8415 $(document).on(
8416 'change',
8417 '.evf-content-email-settings .evf-toggle-switch input',
8418 function (e) {
8419 var $this = $(this),
8420 value = $this.prop('checked'),
8421 connection_id = $this.data('connection-id');
8422 if (false === value) {
8423 $this.val('');
8424 $this
8425 .closest('.evf-content-email-settings')
8426 .find('.email-disable-message')
8427 .remove();
8428 $this
8429 .closest('.evf-content-section-title')
8430 .find('.evf-enable-email-toggle')
8431 .removeClass('everest-forms-hidden');
8432 $this
8433 .closest('.evf-content-section-title')
8434 .siblings('.evf-content-email-settings-inner')
8435 .addClass('everest-forms-hidden');
8436 $(
8437 '<p class="email-disable-message everest-forms-notice everest-forms-notice-info">' +
8438 evf_data.i18n_email_disable_message +
8439 '</p>',
8440 ).insertAfter($this.closest('.evf-content-section-title'));
8441 $('input[data-connection-id="' + connection_id + '"]').prop(
8442 'checked',
8443 false,
8444 );
8445 } else if (true === value) {
8446 $this.val('1');
8447 $this
8448 .closest('.evf-content-section-title')
8449 .siblings('.evf-content-email-settings-inner')
8450 .removeClass('everest-forms-hidden');
8451 $this
8452 .closest('.evf-content-email-settings')
8453 .find('.email-disable-message')
8454 .remove();
8455 $this
8456 .closest('.evf-content-section-title')
8457 .find('.evf-enable-email-toggle')
8458 .addClass('everest-forms-hidden');
8459 $('input[data-connection-id="' + connection_id + '"]').prop(
8460 'checked',
8461 true,
8462 );
8463 }
8464 },
8465 );
8466
8467 $(document).on('change', '.evf-email-toggle', function (e) {
8468 var $this = $(this),
8469 connection_id = $this.data('connection-id');
8470 if ($this.prop('checked')) {
8471 $this.val('1');
8472 $('.evf-content-email-settings')
8473 .find(
8474 'input[type="checkbox"][data-connection-id="' + connection_id + '"]',
8475 )
8476 .prop('checked', true)
8477 .trigger('change');
8478 } else {
8479 $this.val('');
8480 $('.evf-content-email-settings')
8481 .find(
8482 'input[type="checkbox"][data-connection-id="' + connection_id + '"]',
8483 )
8484 .prop('checked', false)
8485 .trigger('change');
8486 }
8487 });
8488
8489 $(document).on(
8490 'click',
8491 '.everest-forms-min-max-date-format input',
8492 function () {
8493 var minDate = $(this)
8494 .closest('.everest-forms-date')
8495 .find('.everest-forms-min-date')
8496 .val();
8497 var maxDate = $(this)
8498 .closest('.everest-forms-date')
8499 .find('.everest-forms-min-date')
8500 .val();
8501
8502 if ($(this).is(':checked')) {
8503 var setDateRange = $(this)
8504 .parent()
8505 .parent()
8506 .parent()
8507 .next('.everest-forms-min-max-date-range-format');
8508 if (setDateRange.find('input[type="checkbox"]').is(':checked')) {
8509 setDateRange
8510 .next('.everest-forms-min-max-date-option')
8511 .addClass('everest-forms-hidden');
8512 setDateRange
8513 .next()
8514 .next('.everest-forms-min-max-date-range-option')
8515 .removeClass('everest-forms-hidden');
8516 } else {
8517 setDateRange
8518 .next('.everest-forms-min-max-date-option')
8519 .removeClass('everest-forms-hidden');
8520 setDateRange
8521 .next()
8522 .next('.everest-forms-min-max-date-range-option')
8523 .addClass('everest-forms-hidden');
8524 }
8525
8526 $(this)
8527 .parent()
8528 .parent()
8529 .parent()
8530 .next('.everest-forms-min-max-date-range-format')
8531 .removeClass('everest-forms-hidden');
8532
8533 if ('' === minDate) {
8534 $('.everest-forms-min-date')
8535 .addClass('flatpickr-field')
8536 .flatpickr({
8537 disableMobile: true,
8538 onChange: function (selectedDates, dateStr, instance) {
8539 $('.everest-forms-min-date').val(dateStr);
8540 },
8541 onOpen: function (selectedDates, dateStr, instance) {
8542 instance.set('maxDate', $('.everest-forms-max-date').val());
8543 },
8544 });
8545 }
8546 if ('' === maxDate) {
8547 $('.everest-forms-max-date')
8548 .addClass('flatpickr-field')
8549 .flatpickr({
8550 disableMobile: true,
8551 onChange: function (selectedDates, dateStr, instance) {
8552 $('.everest-forms-max-date').val(dateStr);
8553 },
8554 onOpen: function (selectedDates, dateStr, instance) {
8555 instance.set('minDate', $('.everest-forms-min-date').val());
8556 },
8557 });
8558 }
8559 } else {
8560 $(this)
8561 .parent()
8562 .parent()
8563 .parent()
8564 .next()
8565 .next('.everest-forms-min-max-date-option')
8566 .addClass('everest-forms-hidden');
8567 $(this)
8568 .parent()
8569 .parent()
8570 .parent()
8571 .next()
8572 .next()
8573 .next('.everest-forms-min-max-date-range-option')
8574 .addClass('everest-forms-hidden');
8575 $(this)
8576 .parent()
8577 .parent()
8578 .parent()
8579 .next('.everest-forms-min-max-date-range-format')
8580 .addClass('everest-forms-hidden');
8581 }
8582 },
8583 );
8584
8585 $(document).on(
8586 'click',
8587 '.everest-forms-min-max-date-range-format input[type="checkbox"]',
8588 function () {
8589 if ($(this).is(':checked')) {
8590 $(this)
8591 .parent()
8592 .parent()
8593 .parent()
8594 .next('.everest-forms-min-max-date-option')
8595 .addClass('everest-forms-hidden');
8596 $(this)
8597 .parent()
8598 .parent()
8599 .parent()
8600 .next()
8601 .next('.everest-forms-min-max-date-range-option')
8602 .removeClass('everest-forms-hidden');
8603 } else {
8604 $(this)
8605 .parent()
8606 .parent()
8607 .parent()
8608 .next('.everest-forms-min-max-date-option')
8609 .removeClass('everest-forms-hidden');
8610 $(this)
8611 .parent()
8612 .parent()
8613 .parent()
8614 .next()
8615 .next('.everest-forms-min-max-date-range-option')
8616 .addClass('everest-forms-hidden');
8617 }
8618 },
8619 );
8620 /**
8621 * Real-time updates for Google Calendar.
8622 *
8623 * @since 2.0.6
8624 */
8625 $(document).on(
8626 'change',
8627 '.appt-sched-google-calendar-advanced',
8628 function (e) {
8629 var $this = $(this);
8630 if (!$this.is(':checked')) {
8631 $('.everest-form-appt-sched-google-event-section').addClass(
8632 'everest-forms-hidden',
8633 );
8634 } else {
8635 $('.everest-form-appt-sched-google-event-section').removeClass(
8636 'everest-forms-hidden',
8637 );
8638 }
8639 },
8640 );
8641 /**
8642 * Real-time updates the field for google calendar when we drag the new field on builder.
8643 *
8644 * @since 2.0.6
8645 */
8646 $(document).on(
8647 'focus',
8648 '.appt-sched-google-calendar-event-title-field',
8649 function (e) {
8650 var selectedItems = $('.evf-admin-field-wrapper').find(
8651 '.everest-forms-field',
8652 );
8653 appt_sched_event_title_field_list($(this), selectedItems);
8654 },
8655 );
8656 $(document).on(
8657 'focus',
8658 '.appt-sched-google-calendar-event-desc-field',
8659 function (e) {
8660 var selectedItems = $('.evf-admin-field-wrapper').find(
8661 '.everest-forms-field',
8662 );
8663 appt_sched_event_title_field_list($(this), selectedItems);
8664 },
8665 );
8666 /**
8667 * Function to updates google event title when we drag the new field on builder.
8668 *
8669 * @since 2.0.6
8670 */
8671 function appt_sched_event_title_field_list($this, selectedItems) {
8672 var html = '<option value=""> -- Select Field -- </option>';
8673 const allowedField = ['first-name', 'last-name', 'text', 'textarea'];
8674 $.each(selectedItems, function (index, element) {
8675 var fieldType = $(element).data('field-type');
8676 if (allowedField.includes(fieldType)) {
8677 var content = $(element).find('.label-title');
8678 var label = $(content).find('.text').text();
8679 var fieldName = $(element).data('field-id');
8680
8681 html += '<option value=' + fieldName + '>' + label + '</option>';
8682 }
8683 });
8684 $($this).html(html);
8685 }
8686
8687 function get_all_available_field(allowed_field, type, el) {
8688 var all_fields_without_email = [];
8689 var all_fields = [];
8690 var email_field = [];
8691 var phone_field = [];
8692 $('.evf-admin-row .evf-admin-grid .everest-forms-field').each(function () {
8693 var field_type = $(this).data('field-type');
8694 var field_id = $(this).data('field-id');
8695 if ('email' === field_type) {
8696 var e_field_label = $(this).find('.label-title span').first().text();
8697 var e_field_id = field_id;
8698 email_field[e_field_id] = e_field_label;
8699 } else if ('phone' === field_type) {
8700 var e_field_label = $(this).find('.label-title span').first().text();
8701 var e_field_id = field_id;
8702 phone_field[e_field_id] = e_field_label;
8703 } else {
8704 var field_label = $(this).find('.label-title span').first().text();
8705 all_fields_without_email[field_id] = field_label;
8706 }
8707 all_fields[field_id] = $(this).find('.label-title span').first().text();
8708 });
8709
8710 if ('other' === type || 'all' === type) {
8711 var other_smart_tags = evf_data.smart_tags_other;
8712 for (var key in other_smart_tags) {
8713 $(el)
8714 .parent()
8715 .find('.evf-smart-tag-lists .evf-others')
8716 .append(
8717 '<li class = "smart-tag-field" data-type="other" data-field_id="' +
8718 key +
8719 '">' +
8720 other_smart_tags[key] +
8721 '</li>',
8722 );
8723 }
8724 }
8725
8726 if ('regex' == type) {
8727 var regex_lists = evf_data.regex_expression_lists;
8728 regex_lists.forEach(function (key, value) {
8729 $(el)
8730 .parent()
8731 .find('.evf-smart-tag-lists .evf-regex')
8732 .append(
8733 '<li class = "smart-tag-field" data-type="regex" data-field_id="' +
8734 key.value +
8735 '">' +
8736 key.text +
8737 '</li>',
8738 );
8739 });
8740 }
8741
8742 if ('fields' === type || 'all' === type) {
8743 if (allowed_field === 'email') {
8744 if (Object.keys(email_field).length < 1) {
8745 $(el)
8746 .parent()
8747 .find(
8748 '.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")',
8749 )
8750 .addClass('everest-forms-hidden');
8751 } else {
8752 $(el)
8753 .parent()
8754 .find(
8755 '.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")',
8756 )
8757 .removeClass('everest-forms-hidden');
8758 }
8759 $(el).parent().find('.evf-smart-tag-lists .other-tag-title').remove();
8760 $(el).parent().find('.evf-smart-tag-lists .evf-others').remove();
8761 $(el)
8762 .parent()
8763 .find('.evf-smart-tag-lists')
8764 .append(
8765 '<div class="smart-tag-title other-tag-title">Others</div><ul class="evf-others"></ul>',
8766 );
8767 $(el)
8768 .parent()
8769 .find('.evf-smart-tag-lists .evf-others')
8770 .append(
8771 '<li class="smart-tag-field" data-type="other" data-field_id="admin_email">Site Admin Email</li><li class="smart-tag-field" data-type="other" data-field_id="user_email">User Email</li>',
8772 );
8773 for (var key in email_field) {
8774 $(el)
8775 .parent()
8776 .find('.evf-smart-tag-lists .evf-fields')
8777 .append(
8778 '<li class = "smart-tag-field" data-type="field" data-field_id="' +
8779 key +
8780 '">' +
8781 email_field[key] +
8782 '</li>',
8783 );
8784 }
8785 } else if (allowed_field === 'phone') {
8786 if (Object.keys(phone_field).length < 1) {
8787 $(el)
8788 .parent()
8789 .find(
8790 '.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")',
8791 )
8792 .addClass('everest-forms-hidden');
8793 } else {
8794 $(el)
8795 .parent()
8796 .find(
8797 '.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")',
8798 )
8799 .removeClass('everest-forms-hidden');
8800 }
8801 $(el).parent().find('.evf-smart-tag-lists .other-tag-title').remove();
8802 $(el).parent().find('.evf-smart-tag-lists .evf-others').remove();
8803 for (var key in phone_field) {
8804 $(el)
8805 .parent()
8806 .find('.evf-smart-tag-lists .evf-fields')
8807 .append(
8808 '<li class = "smart-tag-field" data-type="field" data-field_id="' +
8809 key +
8810 '">' +
8811 phone_field[key] +
8812 '</li>',
8813 );
8814 }
8815 } else {
8816 if (Object.keys(all_fields).length < 1) {
8817 $(el)
8818 .parent()
8819 .find(
8820 '.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")',
8821 )
8822 .addClass('everest-forms-hidden');
8823 } else {
8824 $(el)
8825 .parent()
8826 .find(
8827 '.evf-smart-tag-lists .smart-tag-title:not(".other-tag-title")',
8828 )
8829 .removeClass('everest-forms-hidden');
8830 }
8831 for (var meta in all_fields) {
8832 $(el)
8833 .parent()
8834 .find('.evf-smart-tag-lists .evf-fields')
8835 .append(
8836 '<li class = "smart-tag-field" data-type="field" data-field_id="' +
8837 meta +
8838 '">' +
8839 all_fields[meta] +
8840 '</li>',
8841 );
8842 }
8843 }
8844 }
8845
8846 if ('calculations' === type) {
8847 var calculations = [
8848 'number',
8849 'payment-single',
8850 'range-slider',
8851 'payment-checkbox',
8852 'payment-multiple',
8853 'select',
8854 'payment-total',
8855 'radio',
8856 'first-name',
8857 'text',
8858 'last-name',
8859 'email',
8860 'url',
8861 ];
8862 $(document)
8863 .find('.everest-forms-field')
8864 .each(function () {
8865 $fieldId = $(this).attr('data-field-id').split('-');
8866 if (
8867 calculations.includes($(this).attr('data-field-type')) &&
8868 $(el)
8869 .parents('.everest-forms-field-option-row-calculation_field')
8870 .attr('data-field-id') !== $(this).attr('data-field-id')
8871 ) {
8872 $(el)
8873 .parent()
8874 .find('.evf-smart-tag-lists .calculations')
8875 .append(
8876 '<li class = "smart-tag-field" data-type="field" data-field_id="' +
8877 $fieldId[1] +
8878 '">' +
8879 $(this).find('.label-title .text').text() +
8880 '</li>',
8881 );
8882 }
8883 });
8884 }
8885
8886 if ('ai-fields' === type) {
8887 var aiFields = ['text', 'select', 'radio'];
8888 $(document)
8889 .find('.everest-forms-field')
8890 .each(function () {
8891 if (
8892 aiFields.includes($(this).attr('data-field-type')) &&
8893 $(el)
8894 .parents('.everest-forms-field-option-row-ai_chatbot_input')
8895 .attr('data-field-id') !== $(this).attr('data-field-id')
8896 ) {
8897 $(el)
8898 .parent()
8899 .find('.evf-smart-tag-lists .evf-fields-ai')
8900 .append(
8901 '<li class = "smart-tag-field" data-type="field" data-field_id="' +
8902 $(this).attr('data-field-id') +
8903 '">' +
8904 $(this).find('.label-title .text').text() +
8905 '</li>',
8906 );
8907 }
8908 });
8909 }
8910 }
8911 });
8912
8913 jQuery(function ($) {
8914 $(document).ready(function () {
8915
8916 // Add "Add Field Below" button to repeater field.
8917 var observer = new MutationObserver(function (mutations) {
8918 mutations.forEach(function (mutation) {
8919 $(mutation.addedNodes).each(function () {
8920 if ($(this).hasClass('everest-forms-field')) {
8921 if (!$(this).find('.evf-add-field-below').length) {
8922 $(this).append(
8923 '<div class="evf-add-field-below">' +
8924 '<span class="dashicons dashicons-plus" title="Add Field Below"></span>' +
8925 '</div>'
8926 );
8927 }
8928 }
8929 });
8930 });
8931 });
8932
8933 observer.observe(document.body, {
8934 childList: true,
8935 subtree: true
8936 });
8937
8938 // Custom CSS
8939 const customCssElement = $(
8940 '#everest-forms-panel-field-settings-evf-custom-css',
8941 );
8942 if (customCssElement.length && typeof wp.CodeMirror !== 'undefined') {
8943 var cssEditor = wp.CodeMirror.fromTextArea(customCssElement[0], {
8944 indentUnit: 2,
8945 indentWithTabs: true,
8946 inputStyle: 'contenteditable',
8947 lineNumbers: true,
8948 lineWrapping: true,
8949 styleActiveLine: true,
8950 continueComments: true,
8951 extraKeys: {
8952 'Ctrl-Space': 'autocomplete',
8953 'Ctrl-/': 'toggleComment',
8954 'Cmd-/': 'toggleComment',
8955 'Alt-F': 'findPersistent',
8956 'Ctrl-F': 'findPersistent',
8957 'Cmd-F': 'findPersistent',
8958 },
8959 direction: 'ltr',
8960 gutters: [],
8961 mode: 'text/css',
8962 lint: false,
8963 autoCloseBrackets: true,
8964 autoCloseTags: true,
8965 autoRefresh: true,
8966 matchTags: {
8967 bothTags: true,
8968 },
8969 tabSize: 2,
8970 theme: 'default',
8971 });
8972
8973 cssEditor.on('change', function () {
8974 customCssElement.html(
8975 cssEditor
8976 .getValue()
8977 .replace(/<\s*script/gi, '')
8978 .replace(/\s+on\w+\s*=/gi, ' '),
8979 );
8980 });
8981 }
8982
8983 // Custom JS
8984 const customJsElement = $(
8985 '#everest-forms-panel-field-settings-evf-custom-js',
8986 );
8987 if (customJsElement.length && typeof wp.CodeMirror !== 'undefined') {
8988 var jsEditor = wp.CodeMirror.fromTextArea(customJsElement[0], {
8989 indentUnit: 2,
8990 indentWithTabs: true,
8991 inputStyle: 'contenteditable',
8992 lineNumbers: true,
8993 lineWrapping: true,
8994 styleActiveLine: true,
8995 continueComments: true,
8996 extraKeys: {
8997 'Ctrl-Space': 'autocomplete',
8998 'Ctrl-/': 'toggleComment',
8999 'Cmd-/': 'toggleComment',
9000 'Alt-F': 'findPersistent',
9001 'Ctrl-F': 'findPersistent',
9002 'Cmd-F': 'findPersistent',
9003 },
9004 direction: 'ltr',
9005 gutters: [],
9006 mode: 'javascript',
9007 lint: false,
9008 autoCloseBrackets: true,
9009 autoCloseTags: true,
9010 autoRefresh: true,
9011 matchTags: {
9012 bothTags: true,
9013 },
9014 tabSize: 2,
9015 });
9016
9017 jsEditor.on('change', function () {
9018 customJsElement.html(
9019 jsEditor
9020 .getValue()
9021 .replace(/<\s*script/gi, '')
9022 .replace(/\s+on\w+\s*=/gi, ' '),
9023 );
9024 });
9025 }
9026
9027 $(
9028 '#everest-forms-panel-field-settings-evf-enable-custom-css, #everest-forms-panel-field-settings-evf-enable-custom-js',
9029 ).on('change', (e) => {
9030 showHideEditors();
9031 });
9032
9033 showHideEditors();
9034
9035 // Show/Hide the custom CSS and JS input boxes based on the enabled/disabled state.
9036 function showHideEditors() {
9037 if (
9038 $('#everest-forms-panel-field-settings-evf-enable-custom-css').is(
9039 ':checked',
9040 )
9041 ) {
9042 $('#everest-forms-panel-field-settings-evf-custom-css-wrap').show(500);
9043 } else {
9044 $('#everest-forms-panel-field-settings-evf-custom-css-wrap').hide(500);
9045 }
9046
9047 if (
9048 $('#everest-forms-panel-field-settings-evf-enable-custom-js').is(
9049 ':checked',
9050 )
9051 ) {
9052 $('#everest-forms-panel-field-settings-evf-custom-js-wrap').show(500);
9053 } else {
9054 $('#everest-forms-panel-field-settings-evf-custom-js-wrap').hide(500);
9055 }
9056 }
9057 });
9058 });
9059