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