/home/techb158/primomovers.ca/wp-content/plugins/everest-forms/assets/js/admin
NameSizeModeActions
admin.js351150644editdlrm
admin.min.js226300644editdlrm
chart.js5400060644editdlrm
chart.min.js2078330644editdlrm
customize-controls.js391640644editdlrm
customize-controls.min.js238580644editdlrm
customize-preview.js780250644editdlrm
customize-preview.min.js418930644editdlrm
deactivation-feedback.js24690644editdlrm
deactivation-feedback.min.js15250644editdlrm
editor.js14330644editdlrm
editor.min.js9560644editdlrm
everest-forms-survey-polls-quiz-builder.js481840644editdlrm
everest-forms-survey-polls-quiz-builder.min.js311480644editdlrm
evf-admin-email.js499010644editdlrm
evf-admin-email.min.js376360644editdlrm
evf-clipboard.js8630644editdlrm
evf-clipboard.min.js3300644editdlrm
evf-enhanced-select.js66140644editdlrm
evf-enhanced-select.min.js34810644editdlrm
evf-file-uploader.js35780644editdlrm
evf-file-uploader.min.js24100644editdlrm
evf-setup.js146760644editdlrm
evf-setup.min.js86740644editdlrm
extensions.js98850644editdlrm
extensions.min.js46890644editdlrm
form-builder.js2767720644editdlrm
form-builder.min.js1622890644editdlrm
form-template-controller.js7800644editdlrm
form-template-controller.min.js4860644editdlrm
printThis.min.js39630644editdlrm
progressbar.js744880644editdlrm
progressbar.min.js218610644editdlrm
randomColor.js123140644editdlrm
randomColor.min.js46660644editdlrm
settings.js133560644editdlrm
settings.min.js77700644editdlrm
shortcode-form-embed.js19370644editdlrm
shortcode-form-embed.min.js11010644editdlrm
tool-import-entries.js64450644editdlrm
tool-import-entries.min.js35590644editdlrm
tools.js98820644editdlrm
tools.min.js60160644editdlrm
upgrade.js290760644editdlrm
upgrade.min.js211540644editdlrm
Edit: /home/techb158/primomovers.ca/wp-content/plugins/everest-forms/assets/js/admin/form-builder.js (276772B)
/* global evf_data, jconfirm, PerfectScrollbar, evfSetClipboard, evfClearClipboard */ (function ($, evf_data) { var $builder; var evfStyleTabBaseline = null; var EVFPanelBuilder = { /** * Start the panel builder. */ init: function () { $(document).ready(function ($) { if (!$('evf-panel-integrations-button a').hasClass('active')) { $('#everest-forms-panel-integrations') .find('.everest-forms-panel-sidebar a') .first() .addClass('active'); if ( $('#everest-forms-panel-integrations') .find('.everest-forms-panel-sidebar a') .hasClass('active') ) { $('#everest-forms-panel-integrations') .find('.everest-forms-panel-sidebar a') .next('.everest-forms-active-connections') .first() .addClass('active'); } $('.everest-forms-panel-content') .find('.evf-panel-content-section') .first() .addClass('active'); } //To remove script tag. $(document).on( 'input change', '.everest-forms-field-option-row-choices input[name$="[label]"]', function (e) { var $value = $(this).val(); $(this).val( $value.replace(/<\s*script/gi, '').replace(/\s+on\w+\s*=/gi, ' '), ); }, ); $(document).on( 'input change', 'input[name$="[required-field-message]"]', function (e) { var $value = $(this).val(); const htmlTagPattern = /<[^>]*>/; const htmlEntityPattern = /&[a-zA-Z0-9#]+;/; if (htmlTagPattern.test($value) || htmlEntityPattern.test($value)) { $(this).val(''); } else { $(this).val( $value .replace(/<\s*script/gi, '') .replace(/\s+on\w+\s*=/gi, ' '), ); } }, ); $(document).on( 'click', '.back-button, [href*="evf-builder"]:not([href*="form_id"])', function (e) { if (!window.location.search.includes('form_id')) { return; } e.preventDefault(); window.location.href = window.location.origin + window.location.pathname + '?page=evf-builder'; }, ); /** * Disable row when form is disabled. * * @since 3.2.0 */ $('.wp-list-table .everest-forms-toggle-form input').each(function () { if (!$(this).prop('checked')) { $(this) .closest('tr') .find('td') .not('.has-row-actions, .column-enabled') .addClass('evf-disable-row'); } else { $(this) .closest('tr') .find('td') .not('.has-row-actions, .column-enabled') .removeClass('evf-disable-row'); } }); }); $(document).ready(function ($) { if ('1' === $('.everest-forms-min-max-date-format input').val()) { $('.everest-forms-min-date') .addClass('flatpickr-field') .flatpickr({ disableMobile: true, onChange: function (selectedDates, dateStr, instance) { $('.everest-forms-min-date').val(dateStr); }, onOpen: function (selectedDates, dateStr, instance) { instance.set('maxDate', $('.everest-forms-max-date').val()); }, }); $('.everest-forms-max-date') .addClass('flatpickr-field') .flatpickr({ disableMobile: true, onChange: function (selectedDates, dateStr, instance) { $('.everest-forms-max-date').val(dateStr); }, onOpen: function (selectedDates, dateStr, instance) { instance.set('minDate', $('.everest-forms-min-date').val()); }, }); } $('.everest-forms-min-max-date-format').each(function () { if ($(this).find('input[type="checkbox"]').is(':checked')) { $(this) .next('.everest-forms-min-max-date-range-format') .removeClass('everest-forms-hidden'); $(this) .next() .next('.everest-forms-min-max-date-option') .removeClass('everest-forms-hidden'); if ( $(this) .next('.everest-forms-min-max-date-range-format') .find('input[type="checkbox"]') .is(':checked') ) { $(this) .next() .next() .next('.everest-forms-min-max-date-range-option') .removeClass('everest-forms-hidden'); $(this) .next() .next('.everest-forms-min-max-date-option') .addClass('everest-forms-hidden'); } } else { $(this) .next() .next() .next('.everest-forms-min-max-date-range-option') .addClass('everest-forms-hidden'); $(this) .next('.everest-forms-min-max-date-range-format') .addClass('everest-forms-hidden'); $(this) .next() .next('.everest-forms-min-max-date-option') .addClass('everest-forms-hidden'); } }); $('.everest-forms-row-option select.evf-field-show-hide').each( function () { $(this).find('[selected="selected"]').prop('selected', true); }, ); }); if ( $('#everest-forms-builder').find('.everest-forms-field-file-upload') .length > 0 ) { if (!evf_data.is_pro) { $('#everest-forms-add-fields-file-upload').addClass( 'evf-one-time-draggable-field', ); } } if ( $('#everest-forms-builder').find( '.everest-forms-field-payment-gateway-selector', ).length > 0 ) { $('#everest-forms-add-fields-payment-gateway-selector').addClass( 'evf-one-time-draggable-field', ); } EVFPanelBuilder.syncPaymentMethodDependentFields(); // Keep Payment Gateway field availability in sync with Payments tab toggles. $(document).on( 'change click', [ '#everest-forms-panel-field-paymentsstripe-enable_stripe', '#everest-forms-panel-field-paypal-enable_paypal', // Razorpay toggle id varies by version/addon; support both. '#everest-forms-panel-field-paymentsrazorpay-enable_razorpay', '#everest-forms-panel-field-razorpay-enable_razorpay', 'input[name*="[razorpay]"][name*="enable_razorpay"]', '#everest-forms-panel-field-authorize_net-enable_authorize_net', '#everest-forms-panel-field-square-enable_square', '#everest-forms-panel-field-paymentsmollie-enable_mollie', ].join(','), function () { EVFPanelBuilder.syncPaymentMethodDependentFields(); }, ); // Hard-block enabling any payment gateway when Payment Gateway field is present. // Some addons use custom toggle wrappers that can still flip even if the underlying checkbox is disabled, // so we intercept the interaction and immediately revert. (function () { var blockedSelectors = [ '#everest-forms-panel-field-paymentsstripe-enable_stripe', '#everest-forms-panel-field-paypal-enable_paypal', // Razorpay toggle id varies by version/addon; support both. '#everest-forms-panel-field-paymentsrazorpay-enable_razorpay', '#everest-forms-panel-field-razorpay-enable_razorpay', 'input[name*="[razorpay]"][name*="enable_razorpay"]', '#everest-forms-panel-field-authorize_net-enable_authorize_net', '#everest-forms-panel-field-square-enable_square', '#everest-forms-panel-field-paymentsmollie-enable_mollie', ]; // Capture-phase blocker: prevents addon handlers from running at all, // avoiding a brief UI flash (settings rows showing) before our popup appears. // We also guard "change" to catch programmatic enables. if (!window.__evfPgwPaymentsToggleCaptureBound) { window.__evfPgwPaymentsToggleCaptureBound = true; function evfPgwFieldPresent() { return ( $('#everest-forms-builder') .find('.everest-forms-field-payment-gateway-selector') .length > 0 ); } function evfFindBlockedRootFromEvent(evt) { if (!evt || !evt.target || !evt.target.closest) { return null; } return evt.target.closest(blockedSelectors.join(',')); } function evfFindCheckbox($root) { if (!$root || !$root.length) { return $(); } if ($root.is('input[type="checkbox"]')) { return $root; } var $in = $root.find('input[type="checkbox"]').first(); if ($in.length) { return $in; } return $root.closest('li').find('input[type="checkbox"]').first(); } function evfShowPopup() { var title = 'Field Unavailable'; var closeText = (evf_data && evf_data.i18n_close) || 'Close'; var content = 'Payment Gateway is currently in use. Remove Payment Gateway to enable this field.'; if (typeof $.confirm === 'function') { $.confirm({ title: title, content: content, buttons: { close: { text: closeText, }, }, }); } else { window.alert(content); } } function evfBlockEnable(evt) { if (!evfPgwFieldPresent()) { return; } var root = evfFindBlockedRootFromEvent(evt); if (!root) { return; } var $checkbox = evfFindCheckbox($(root)); // Only show notice when enabling (unchecked -> checked). // If already checked, user is disabling; allow silently. if ($checkbox.length && $checkbox.is(':checked')) { return; } evt.preventDefault(); evt.stopPropagation(); if ($checkbox.length) { $checkbox.prop('checked', false); } evfShowPopup(); } ['pointerdown', 'mousedown', 'click'].forEach(function (type) { document.addEventListener(type, evfBlockEnable, true); }); // Catch programmatic enables (change fires after state flips). document.addEventListener( 'change', function (evt) { if (!evfPgwFieldPresent()) { return; } var root = evfFindBlockedRootFromEvent(evt); if (!root) { return; } var $checkbox = evfFindCheckbox($(root)); if ($checkbox.length && $checkbox.is(':checked')) { evt.preventDefault(); evt.stopPropagation(); $checkbox.prop('checked', false); evfShowPopup(); } }, true, ); } // Note: we intentionally rely on the capture-phase blocker above. // A bubble-phase handler can run after the checkbox state flips, which would show the // notice when DISABLING. Capture-phase guarantees we only block ENABLE attempts. })(); if (!$('evf-panel-payments-button a').hasClass('active')) { $('#everest-forms-panel-payments') .find('.everest-forms-panel-sidebar a') .first() .addClass('active'); $('.everest-forms-panel-content') .find('.evf-payment-setting-content') .first() .addClass('active'); } // Copy shortcode from the builder. $(document.body) .find('#copy-shortcode') .on('click', this.copyShortcode) .on('aftercopy', this.copySuccess) .on('aftercopyfailure', this.copyFail); // Copy shortcode from form list table. $(document.body) .find('.evf-copy-shortcode') .each(function () { $(this) .on('click', EVFPanelBuilder.copyShortcode) .on('aftercopy', EVFPanelBuilder.copySuccess) .on('aftercopyfailure', EVFPanelBuilder.copyFail); }); // Document ready. $(document).ready(EVFPanelBuilder.ready); // Page load. $(window).on('load', EVFPanelBuilder.load); // Initialize builder UI fields. $(document.body) .on('evf-init-builder-fields', function () { EVFPanelBuilder.bindFields(); }) .trigger('evf-init-builder-fields'); // Adjust builder width. $(document.body) .on('adjust_builder_width', function () { var adminMenuWidth = $('#adminmenuwrap').width(); $('#everest-forms-builder-form').css({ width: 'calc(100% - ' + adminMenuWidth + 'px)', }); }) .trigger('adjust_builder_width'); $(document.body).on('click', '#collapse-button', function () { $('#everest-forms-builder-form').width(''); $(document.body).trigger('adjust_builder_width'); }); $(window) .on('resize orientationchange', function () { var resizeTimer; clearTimeout(resizeTimer); resizeTimer = setTimeout(function () { $('#everest-forms-builder').width(''); $(document.body).trigger('adjust_builder_width'); }, 250); }) .trigger('resize'); EVFPanelBuilder.bindPrivacyPolicyActions(); $(document.body).on( 'evf_field_drop_complete', function (e, field_type, dragged_field_id) { EVFPanelBuilder.bindEditMetaKey(dragged_field_id); // Keep Payment Gateway ↔ Payments tab constraints in sync after any field drop. if (EVFPanelBuilder.syncPaymentMethodDependentFields) { EVFPanelBuilder.syncPaymentMethodDependentFields(); } // Set defaults in privacy policy field. if ('privacy-policy' === field_type) { var consent_message = evf_data.i18n_privacy_policy_consent_message; $('#everest-forms-field-' + dragged_field_id) .find('.evf-privacy-policy-consent-message') .html(consent_message); $('#everest-forms-field-option-' + dragged_field_id) .find('.evf-privacy-policy-consent-message') .val(consent_message); $( '.everest-forms-field-options #everest-forms-field-option-row-' + dragged_field_id + '-required', ) .find('input') .click(); } if ('country' === field_type) { $( '#everest-forms-field-option-row-' + dragged_field_id + '-default', ) .find('select.evf-select2-multiple > option') .prop('selected', true); } // Payment Gateway field: server-rendered field-map options use saved form data; // repopulate from the builder canvas so existing fields appear without reload. if ('payment-gateway-selector' === field_type) { EVFPanelBuilder.refreshFieldMapSelectsInContainer( '#everest-forms-field-option-' + dragged_field_id, dragged_field_id, ); } }, ); // Rating point validation error tips. $(document.body) .on('blur', '.evf-number-of-stars[type=number]', function () { $('.evf_error_tip').fadeOut('100', function () { $(this).remove(); }); }) .on('change click', '.evf-number-of-stars[type=number]', function (e) { var number_of_stars = parseInt($(this).val(), 10); if (number_of_stars > 100) { $(this).val('100'); EVFPanelBuilder.livePreviewNumberOfRating($(this)); } }) .on('keyup click', '.evf-number-of-stars[type=number]', function () { var number_of_stars = parseInt($(this).val(), 10); if (number_of_stars > 100) { $(document.body).triggerHandler('evf_add_error_tip', [ $(this), 'i18n_field_rating_greater_than_max_value_error', evf_data, ]); } else { $(document.body).triggerHandler('evf_remove_error_tip', [ $(this), 'i18n_field_rating_greater_than_max_value_error', ]); } }); // Live effect for Rating field Number of Stars option. $(document).on( 'keyup mouseup', '.everest-forms-field-option-row-number_of_stars input', function () { EVFPanelBuilder.livePreviewNumberOfRating(this); }, ); // Live effect for Rating field icon option. $(document).on( 'change', '.everest-forms-field-option-row-rating-icon input[type=radio]', function () { var $this = $(this), value = $this.val(), id = $this.parent().data('field-id'), icon_color = $('#everest-forms-field-' + id + ' .rating-icon') .find('svg') .first() .css('fill'); ($icons = $('#everest-forms-field-' + id + ' .rating-icon')), (iconClass = ''); if ('heart' === value) { iconClass = ''; } else if ('thumb' === value) { iconClass = ''; } else if ('smiley' === value) { iconClass = ''; } else if ('bulb' === value) { iconClass = ''; } $icons.html(iconClass); }, ); // Live effect for Rating field icon color option. $(document).ready(function ($) { $( '.everest-forms-field-option-row-icon_color input.colorpicker', ).wpColorPicker({ change: function (event) { var $this = $(this), value = $this.val(), id = $this .closest('.everest-forms-field-option-row') .data('field-id'), $icons = $('#everest-forms-field-' + id + ' .rating-icon svg'); $icons.css('fill', value); }, }); }); $(document).on('click', '.evf-edit-meta-key-icon', function () { var $wrapper = $(this).closest('.evf-meta-key-input-wrapper'), $input = $wrapper.find('.evf-input-meta-key'), $original_value = $(this).data('meta_key'); $input.prop('readonly', false).focus(); $(document).find('.evf-meta-key-copy-btn').hide(); $(this).hide(); if ($wrapper.find('.evf-meta-key-actions').length === 0) { $wrapper.append(` `); } if ($wrapper.find('.evf-meta-key-warning').length === 0) { $wrapper.after(`
Caution: We don't recommend changing this unless necessary, as it affects data retrieval.
`); } $(document).on('click', '.evf-cancel-meta-key-icon', function () { var $wrapper = $(this).closest('.evf-meta-key-input-wrapper'), $input = $wrapper.find('.evf-input-meta-key'), originalValue = $(this).data('original_value'); $(document).find('.evf-meta-key-copy-btn').show(); $input.val(originalValue); $input.prop('readonly', true); $wrapper.find('.evf-meta-key-actions').remove(); $wrapper.find('.evf-edit-meta-key-icon').show(); $wrapper.next('.evf-meta-key-warning').remove(); }); $(document).on('click', '.evf-save-meta-key-icon', function () { var $wrapper = $(this).closest('.evf-meta-key-input-wrapper'), $input = $wrapper.find('.evf-input-meta-key'); $(document).find('.evf-meta-key-copy-btn').show(); $input.prop('readonly', true); $wrapper.find('.evf-meta-key-actions').remove(); $wrapper.find('.evf-edit-meta-key-icon').show(); $wrapper.next('.evf-meta-key-warning').remove(); }); }); }, /** * Copy shortcode. * * @param {Object} evt Copy event. */ copyShortcode: function (evt) { evfClearClipboard(); evfSetClipboard( $(this).closest('.evf-shortcode-field').find('input').val(), $(this), ); evt.preventDefault(); }, /** * Display a "Copied!" tip when success copying. */ copySuccess: function () { $(this) .tooltipster('content', $(this).attr('data-copied')) .trigger('mouseenter') .on('mouseleave', function () { var $this = $(this); setTimeout(function () { $this.tooltipster('content', $this.attr('data-tip')); }, 1000); }); }, /** * Displays the copy error message when failure copying. */ copyFail: function () { $(this).closest('.evf-shortcode-field').find('input').focus().select(); }, /** * Page load. * * @since 1.0.0 */ load: function () { $('.everest-forms-overlay').fadeOut(); }, /** * Document ready. * * @since 1.0.0 */ ready: function () { // Cache builder element. $builder = $('#everest-forms-builder'); // Bind all actions. EVFPanelBuilder.bindUIActions(); // Bind edit form actions. EVFPanelBuilder.bindEditActions(); // Snapshot the just-loaded (saved) form state, to detect unsaved changes later. EVFPanelBuilder.captureStyleTabBaseline(); // jquery-confirm defaults. jconfirm.defaults = { closeIcon: true, backgroundDismiss: true, escapeKey: true, animationBounce: 1, useBootstrap: false, theme: 'modern', boxWidth: '400px', columnClass: 'evf-responsive-class', }; // Enable Perfect Scrollbar. if ('undefined' !== typeof PerfectScrollbar) { var tab_content = $('.everest-forms-tab-content'), evf_panel = $('.everest-forms-panel'); if (tab_content.length >= 1) { window.evf_tab_scroller = new PerfectScrollbar( '.everest-forms-tab-content', { suppressScrollX: true, }, ); } evf_panel.each(function () { var section_panel = $(this); var panel_id = section_panel.attr('id'); if (section_panel.find('.everest-forms-panel-sidebar').length >= 1) { window.evf_setting_scroller = new PerfectScrollbar( '#' + panel_id + ' .everest-forms-panel-sidebar', ); } }); } // Enable Limit length. $builder.on( 'change', '.everest-forms-field-option-row-limit_enabled input', function (event) { EVFPanelBuilder.updateTextFieldsLimitControls( $(event.target) .parents('.everest-forms-field-option-row-limit_enabled') .data().fieldId, event.target.checked, ); }, ); $builder.on( 'change', '.everest-forms-field-option-row-min_length_enabled input', function (event) { EVFPanelBuilder.updateTextFieldsMinLengthControls( $(event.target) .parents('.everest-forms-field-option-row-min_length_enabled') .data().fieldId, event.target.checked, ); }, ); // Enable enhanced select. $builder.on( 'change', '.everest-forms-field-option-select .everest-forms-field-option-row-enhanced_select input', function (event) { EVFPanelBuilder.enhancedSelectFieldStyle( $(event.target) .parents('.everest-forms-field-option-row-enhanced_select') .data().fieldId, event.target.checked, ); }, ); // Enable Multiple options. $builder.on( 'click', '.everest-forms-field-option-row-choices .everest-forms-btn-group span', function (event) { if ( $(this).hasClass('upgrade-modal') && 'checkbox' === $(this).data('type') ) { $(this).parent().find('span').addClass('is-active'); $(this).removeClass('is-active'); EVFPanelBuilder.updateEnhandedSelectField( $(event.target) .parents('.everest-forms-field-option-row-choices') .data().fieldId, false, ); } else { $(this).parent().find('span').removeClass('is-active'); $(this).addClass('is-active'); EVFPanelBuilder.updateEnhandedSelectField( $(event.target) .parents('.everest-forms-field-option-row-choices') .data().fieldId, 'multiple' === $(this).data('selection'), ); } // Show 'Select All' Checkbox for Dropdown field only if multiple selection is active if ( 'multiple' === $(this).data('selection') && 'checkbox' === $(this).data('type') && $(this).hasClass('is-active') ) { var $field_id = $(this).parent().parent().data('field-id'); $( '#everest-forms-field-option-row-' + $field_id + '-select_all', ).show(); } else { var $field_id = $(this).parent().parent().data('field-id'); $( '#everest-forms-field-option-row-' + $field_id + '-select_all', ).hide(); } }, ); // By default hide the 'Select All' checkbox for Dropdown field $(document.body).on( 'click', '.everest-forms-field, .everest-forms-field-select[data-field-type="select"]', function () { $builder .find( '.everest-forms-field-option-row-choices .everest-forms-btn-group span', ) .each(function () { var $field_id = $(this).parent().parent().data('field-id'); if ( 'multiple' === $(this).data('selection') && 'checkbox' === $(this).data('type') && $(this).hasClass('is-active') ) { $('#everest-forms-field-option-' + $field_id + '-select_all') .parent() .parent() .parent() .show(); } else { $('#everest-forms-field-option-' + $field_id + '-select_all') .parent() .parent() .parent() .hide(); } }); }, ); // Search fields input. $builder.on('keyup', '.everest-forms-search-fields', function () { var searchTerm = $(this).val().toLowerCase(); // Show/hide fields. $('.evf-registered-item').each(function () { var $this = $(this); (field_type = $this.data('field-type')), (field_label = $this.text().toLowerCase()); if ( field_type.search(searchTerm) > -1 || field_label.search(searchTerm) > -1 ) { $this.addClass('evf-searched-item'); $this.show(); } else { $this.removeClass('evf-searched-item'); $this.hide(); } }); // Show/hide field group. $('.everest-forms-add-fields-group').each(function () { var count = $(this).find( '.evf-registered-item.evf-searched-item', ).length; if (0 >= count) { $(this).hide(); } else { $(this).show(); } }); // Show/hide fields not found indicator. if ($('.evf-registered-item.evf-searched-item').length) { $('.everest-forms-fields-not-found').addClass('hidden'); } else { $('.everest-forms-fields-not-found').removeClass('hidden'); } }); // Collapse the form builder $builder.on('click', '#evf-collapse', function (event) { event.preventDefault(); var $this = $(this); if ($this.hasClass('open')) { $this.removeClass('open').addClass('close'); $this .closest('.everest-forms-panel-sidebar-content') .removeClass('collapsed'); } else { $this.removeClass('close').addClass('open'); $this .closest('.everest-forms-panel-sidebar-content') .addClass('collapsed'); } }); // Action available for each binding. $(document).trigger('everest_forms_ready'); }, /** * Update text fields limit controls. * * @since 1.5.10 * * @param {number} fieldId Field ID. * @param {bool} checked Whether an option is checked or not. */ updateTextFieldsLimitControls: function (fieldId, checked) { if (!checked) { $( '#everest-forms-field-option-row-' + fieldId + '-limit_controls', ).addClass('everest-forms-hidden'); } else { $( '#everest-forms-field-option-row-' + fieldId + '-limit_controls', ).removeClass('everest-forms-hidden'); } }, /** * Update text fields min length controls. * * @since 1.5.10 * * @param {number} fieldId Field ID. * @param {bool} checked Whether an option is checked or not. */ updateTextFieldsMinLengthControls: function (fieldId, checked) { if (!checked) { $( '#everest-forms-field-option-row-' + fieldId + '-min_length_controls', ).addClass('everest-forms-hidden'); } else { $( '#everest-forms-field-option-row-' + fieldId + '-min_length_controls', ).removeClass('everest-forms-hidden'); } }, /** * Enhanced select fields style. * * @since 1.7.1 * * @param {number} fieldId Field ID. * @param {bool} checked Whether an option is checked or not. */ enhancedSelectFieldStyle: function (fieldId, checked) { var $primary = $('#everest-forms-field-' + fieldId + ' .primary-input'), isEnhanced = $( '#everest-forms-field-option-' + fieldId + '-enhanced_select', ).is(':checked'); if (checked && isEnhanced && $primary.prop('multiple')) { $primary.addClass('evf-enhanced-select'); $(document.body).trigger('evf-enhanced-select-init'); } else { $primary.removeClass('evf-enhanced-select enhanced'); $primary.filter('.select2-hidden-accessible').selectWoo('destroy'); } }, /** * Update enhanced select field component. * * @since 1.7.1 * * @param {number} fieldId Field ID. * @param {bool} isMultiple Whether an option is multiple or not. */ updateEnhandedSelectField: function (fieldId, isMultiple) { var $primary = $('#everest-forms-field-' + fieldId + ' .primary-input'), $placeholder = $primary.find('.placeholder'), $hiddenField = $( '#everest-forms-field-option-' + fieldId + '-multiple_choices', ), $optionChoicesItems = $( '#everest-forms-field-option-row-' + fieldId + '-choices input.default', ), selectedChoices = $optionChoicesItems.filter(':checked'); // Update hidden field value. $hiddenField.val(isMultiple ? 1 : 0); // Add/remove a `multiple` attribute. $primary.prop('multiple', isMultiple); // Change a `Choices` fields type: // radio - needed for single selection // checkbox - needed for multiple selection $optionChoicesItems.prop('type', isMultiple ? 'checkbox' : 'radio'); // For single selection we can choose only one. if (!isMultiple && selectedChoices.length) { $optionChoicesItems.prop('checked', false); $(selectedChoices.get(0)).prop('checked', true); } // Toggle selection for a placeholder. if ($placeholder.length && isMultiple) { $placeholder.prop('selected', !isMultiple); } // Update a primary field. EVFPanelBuilder.enhancedSelectFieldStyle(fieldId, isMultiple); }, /** * Element bindings. * * @since 1.0.0 */ bindUIActions: function () { EVFPanelBuilder.bindDefaultTabs(); EVFPanelBuilder.checkEmptyGrid(); EVFPanelBuilder.bindFields(); EVFPanelBuilder.bindFormPreview(); EVFPanelBuilder.bindFormPreviewWithKeyEvent(); EVFPanelBuilder.bindFormEntriesWithKeyEvent(); EVFPanelBuilder.bindGridSwitcher(); EVFPanelBuilder.bindFieldSettings(); EVFPanelBuilder.bindFieldDelete(); EVFPanelBuilder.bindFieldDeleteWithKeyEvent(); EVFPanelBuilder.bindFieldMultiSelect(); EVFPanelBuilder.bindCloneField(); EVFPanelBuilder.bindSaveOption(); EVFPanelBuilder.bindEmbedOption(); EVFPanelBuilder.bindSaveOptionWithKeyEvent(); EVFPanelBuilder.bindOpenShortcutKeysModalWithKeyEvent(); EVFPanelBuilder.bindLayoutContainers(); EVFPanelBuilder.bindAddRowColumnPicker(); EVFPanelBuilder.bindAddNewRow(); EVFPanelBuilder.bindRemoveRow(); EVFPanelBuilder.bindFormSettings(); EVFPanelBuilder.bindFormEmail(); EVFPanelBuilder.bindFormSmsNotifications(); EVFPanelBuilder.bindFormConversational(); EVFPanelBuilder.bindFormIntegrations(); EVFPanelBuilder.bindFormPayment(); EVFPanelBuilder.choicesInit(); EVFPanelBuilder.bindToggleHandleActions(); EVFPanelBuilder.bindLabelEditInputActions(); EVFPanelBuilder.bindSyncedInputActions(); EVFPanelBuilder.init_datepickers(); EVFPanelBuilder.init_payment_subscription_plan_field(); EVFPanelBuilder.bindBulkOptionActions(); EVFPanelBuilder.bindAkismetInit(); EVFPanelBuilder.bindFormSubmissionMinWaitingTime(); EVFPanelBuilder.bindEditMetaKey(); // Fields Panel. EVFPanelBuilder.bindUIActionsFields(); if (evf_data.tab === 'field-options') { $('.evf-panel-field-options-button').trigger('click'); } $(document.body).on( 'everest-forms-field-drop', '.evf-registered-buttons .evf-registered-item', function () { EVFPanelBuilder.fieldDrop($(this).clone()); }, ); $(document.body).on( 'click', '.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)', function () { EVFPanelBuilder.fieldDrop($(this).clone()); }, ); EVFPanelBuilder.bindRowFieldPopover(); }, /** * Bind user action handlers for the Add Bulk Options feature. */ bindBulkOptionActions: function () { // Toggle `Bulk Add` option. $(document.body).on('click', '.evf-toggle-bulk-options', function (e) { e.preventDefault(); var $panel = $(this) .closest('.everest-forms-field-option') .find('.everest-forms-field-option-row-add_bulk_options'); if ($panel.hasClass('everest-forms-hidden')) { $panel.stop(true, true).removeClass('everest-forms-hidden').hide().slideDown(); } else { $panel.stop(true, true).slideUp(function () { $(this).addClass('everest-forms-hidden').css('display', ''); }); } }); // Toggle presets list. $(document.body).on('click', '.evf-toggle-presets-list', function (e) { e.preventDefault(); $(this) .closest('.everest-forms-field-option') .find('.everest-forms-field-option-row .evf-options-presets') .removeAttr('hidden') .slideToggle(); }); // Add custom list of options. $(document.body).on('click', '.evf-add-bulk-options', function (e) { var $option_row = $(this).closest('.everest-forms-field-option-row'); var field_id = $option_row.data('field-id'); if ($option_row.length) { var $choices = $option_row .closest('.everest-forms-field-option') .find('.everest-forms-field-option-row-choices .evf-choices-list'); var $bulk_options_container = $option_row.find( 'textarea#everest-forms-field-option-' + field_id + '-add_bulk_options', ); var options_texts = $bulk_options_container .val() .replace(/<\s*script/gi, '') .replace(/\s+on\w+\s*=/gi, ' ') .split('\n'); EVFPanelBuilder.addBulkOptions(options_texts, $choices); $bulk_options_container.val(''); } }); // Add presets of options. $(document.body).on('click', '.evf-options-preset-label', function (e) { var $option_row = $(this).closest('.everest-forms-field-option-row'); var field_id = $option_row.data('field-id'); if ($option_row.length) { var options_texts = $(this) .closest('.evf-options-preset') .find('.evf-options-preset-value') .val(); $option_row .find( 'textarea#everest-forms-field-option-' + field_id + '-add_bulk_options', ) .val(options_texts); $(this).closest('.evf-options-presets').slideUp(); } }); //Add toggle option for password validation and strength meter. $(document.body).on( 'click', '.everest-forms-field-option-row-password_strength', function () { if ($(this).find('[type="checkbox"]:first').prop('checked')) { $(this) .next() .find('[type="checkbox"]:first') .prop('checked', false); // $(this).prev().find('.everest-forms-inner-options').hide(); } }, ); $(document.body).on( 'click', '.everest-forms-field-option-row-password_validation', function () { if ($(this).find('[type="checkbox"]:first').prop('checked')) { $(this) .prev() .find('[type="checkbox"]:first') .prop('checked', false); $(this) .prev() .find('.everest-forms-inner-options') .addClass('everest-forms-hidden'); } }, ); }, /** * Add a list of options at once. * * @param {Array} options_texts List of options to add. * @param {object} $choices_container Options container where the options should be added. */ addBulkOptions: function (options_texts, $choices_container) { options_texts.forEach(function (option_text) { if ('' !== option_text) { var $add_button = $choices_container.find('li').last().find('a.add'); EVFPanelBuilder.choiceAdd(null, $add_button, option_text.trim()); } }); }, /** * Initialize date pickers like min/max date, disable dates etc. * * @since 1.6.6 */ init_datepickers: function () { var date_format = $('.everest-forms-disable-dates').data('date-format'), selection_mode = 'multiple'; // Initialize "Disable dates" option's date pickers that hasn't been initialized. $('.everest-forms-disable-dates').each(function () { if (!$(this).get(0)._flatpickr) { $(this).flatpickr({ dateFormat: date_format, mode: selection_mode, }); } }); // Reformat the selected dates input value for `Disable dates` option when the date format changes. $(document.body).on('change', '.evf-date-format', function (e) { var $disable_dates = $( '.everest-forms-field-option:visible .everest-forms-disable-dates', ), flatpicker = $disable_dates.get(0)._flatpickr, selectedDates = flatpicker.selectedDates, date_format = $(this).val(), formatedDates = []; selectedDates.forEach(function (date) { formatedDates.push(flatpickr.formatDate(date, date_format)); }); flatpicker.set('dateFormat', date_format); $disable_dates.val(formatedDates.join(', ')); }); // Clear disabled dates. $(document.body).on('click', '.evf-clear-disabled-dates', function () { $('.everest-forms-field-option:visible .everest-forms-disable-dates') .get(0) ._flatpickr.clear(); }); // Triggring Setting Toggler. $('.everest-forms-field-date-time').each(function () { var id = $(this).attr('data-field-id'); EVFPanelBuilder.dateSettingToggler( id, $('#everest-forms-field-option-' + id + '-datetime_style').val(), ); }); if ($('.everest-forms-slot-booking input').is(':checked')) { //checked and hide past dates. disable_past_date = $(document).find( '.everest-forms-past-date-disable-format input', ); required = $(document).find( '.everest-forms-field-option-row-required input', ); disable_past_date.attr('checked', true); required.prop('checked', true); disable_past_date.parent().parent().parent().hide(); } }, /** * Normalize a date to local midnight for day comparisons. * * @param {Date} date Input date. * @return {Date} */ normalize_subscription_expiry_day: function (date) { var normalized = new Date(date.getTime()); normalized.setHours(0, 0, 0, 0); return normalized; }, /** * Whether a calendar day falls inside the active trial window (not past dates). * * @param {jQuery} $li Plan choice row. * @param {Date} dayDate Calendar day. * @return {boolean} */ is_subscription_expiry_trial_day: function ($li, dayDate) { if ( !dayDate || !$li || !$li.length || !$li.find('.evf-enable-trial-period').is(':checked') ) { return false; } var today = new Date(); today.setHours(0, 0, 0, 0); var trialMin = EVFPanelBuilder.get_subscription_expiry_min_date($li); var day = EVFPanelBuilder.normalize_subscription_expiry_day(dayDate); return ( day.getTime() >= today.getTime() && day.getTime() < trialMin.getTime() ); }, /** * First allowed expiry date for a plan choice (matches SubscriptionSchedule billing_start_date). * * @param {jQuery} $li Plan choice row. * @return {Date} Midnight local date. */ get_subscription_expiry_min_date: function ($li) { var min = new Date(); min.setHours(0, 0, 0, 0); if (!$li || !$li.length) { return min; } if (!$li.find('.evf-enable-trial-period').is(':checked')) { return min; } var count = parseInt( $li.find('.evf-spt-panel--trial input[type="number"]').val(), 10, ); if (isNaN(count) || count < 1) { count = 1; } var period = $li.find('.evf-spt-panel--trial select').val() || 'day'; switch (period) { case 'week': min.setDate(min.getDate() + count * 7); break; case 'month': min.setMonth(min.getMonth() + count); break; case 'year': min.setFullYear(min.getFullYear() + count); break; case 'day': default: min.setDate(min.getDate() + count); break; } return min; }, /** * Show or hide expiry hint when trial blocks early dates. * * @param {jQuery} $li Plan choice row. * @param {Date} minDate First selectable expiry date. */ sync_subscription_expiry_trial_hint: function ($li, minDate) { var $detail = $li.find('.evf-spt-panel--expiry .evf-spt-panel-detail'); var $hint = $detail.find('.evf-expiry-trial-hint'); if (!$hint.length) { $hint = $( '

', ); $detail.append($hint); } if (!$li.find('.evf-enable-trial-period').is(':checked')) { $hint.hide().text(''); return; } var label = typeof flatpickr !== 'undefined' ? flatpickr.formatDate(minDate, 'Y-m-d') : minDate.toISOString().slice(0, 10); var template = (evf_data && evf_data.i18n_expiry_trial_min_date) || 'Expiry must be on or after the trial ends (%s).'; $hint.text(template.replace('%s', label)).show(); }, /** * Anchor element for positioning the expiry calendar under the date input. * * @param {jQuery} $input Expiry date input. * @return {HTMLElement} */ get_subscription_expiry_picker_anchor: function ($input) { var $anchor = $input.closest('.evf-spt-panel-detail'); if (!$anchor.length) { $anchor = $input.closest('.evf-general-setting-field'); } if (!$anchor.length) { $anchor = $input.parent(); } return $anchor[0]; }, /** * Close open subscription expiry flatpickr calendars. * * @param {HTMLElement|null} exceptInput Optional input to keep open. */ close_subscription_expiry_pickers: function (exceptInput) { $('.evf-radio-subscription-expiry-input').each(function () { if (exceptInput && this === exceptInput) { return; } if (this._flatpickr && this._flatpickr.isOpen) { this._flatpickr.close(); } $(this).removeClass('active'); }); }, /** * Clear subscription plan expiry date input and flatpickr state. * * @param {jQuery} $li Plan choice row. */ clear_subscription_plan_expiry_date: function ($li) { var $expiryInput = $li.find('.evf-radio-subscription-expiry-input'); $expiryInput.val(''); if ($expiryInput.length && $expiryInput[0]._flatpickr) { $expiryInput[0]._flatpickr.clear(); } }, /** * Toggle flatpickr when the expiry input is clicked. * * @param {object} instance Flatpickr instance. */ bind_subscription_expiry_picker_toggle: function (instance) { var $input = $(instance.input); $input.off('click.evfExpiryPicker').on('click.evfExpiryPicker', function (e) { e.preventDefault(); e.stopPropagation(); if (instance.isOpen) { instance.close(); return; } EVFPanelBuilder.close_subscription_expiry_pickers(instance.input); instance.open(); }); }, /** * Update minDate on open expiry pickers after trial settings change. * * @param {jQuery} $scope Optional plan choice row. */ update_subscription_expiry_min_dates: function ($scope) { var $inputs = $scope && $scope.length ? $scope.find('.evf-radio-subscription-expiry-input') : $( '.everest-forms-field-option-payment-subscription-plan .evf-radio-subscription-expiry-input', ); $inputs.each(function () { var el = this; var $li = $(el).closest('li'); if (!el._flatpickr) { return; } var minDate = EVFPanelBuilder.get_subscription_expiry_min_date($li); el._flatpickr.set('minDate', minDate); EVFPanelBuilder.sync_subscription_expiry_trial_hint( $li, minDate, ); if ( el._flatpickr.selectedDates[0] && el._flatpickr.selectedDates[0] < minDate ) { el._flatpickr.clear(); } el._flatpickr.redraw(); }); }, /** * Flatpickr for subscription plan expiry date (builder only). * * @param {jQuery} $scope Optional container (plan choice row). */ init_subscription_expiry_date_pickers: function ($scope) { var $inputs = $scope && $scope.length ? $scope.find('.evf-radio-subscription-expiry-input') : $( '.everest-forms-field-option-payment-subscription-plan:visible .evf-radio-subscription-expiry-input', ); var blockedTitle = (evf_data && evf_data.i18n_expiry_trial_blocked_day) || 'This date is within the trial period and cannot be used as the expiry date.'; $inputs.each(function () { var $input = $(this); var el = this; var $li = $input.closest('li'); var savedDate = $.trim($input.val()); var dateFormat = $input.data('date-format') || 'Y-m-d'; if (el._flatpickr && !el._flatpickr.config.static) { el._flatpickr.destroy(); } if (el._flatpickr) { var minDate = EVFPanelBuilder.get_subscription_expiry_min_date($li); el._flatpickr.set('minDate', minDate); if (savedDate) { el._flatpickr.setDate(savedDate, false); if (el._flatpickr.selectedDates[0]) { $input.val( el._flatpickr.formatDate( el._flatpickr.selectedDates[0], dateFormat, ), ); } else { $input.val(savedDate); } } EVFPanelBuilder.sync_subscription_expiry_trial_hint( $li, minDate, ); el._flatpickr.redraw(); EVFPanelBuilder.bind_subscription_expiry_picker_toggle( el._flatpickr, ); return; } var $anchor = $(EVFPanelBuilder.get_subscription_expiry_picker_anchor($input)); $anchor.addClass('evf-subscription-expiry-picker-anchor'); $input.flatpickr({ dateFormat: dateFormat, defaultDate: savedDate || null, disableMobile: true, allowInput: false, clickOpens: false, closeOnSelect: true, static: true, position: 'below', animate: true, minDate: EVFPanelBuilder.get_subscription_expiry_min_date($li), monthSelectorType: 'dropdown', onOpen: function (selectedDates, dateStr, instance) { $(instance.input).addClass('active'); }, onClose: function (selectedDates, dateStr, instance) { $(instance.input).removeClass('active'); }, onDayCreate: function (dObj, dStr, fp, dayElem) { var $choiceLi = $(fp.input).closest('li'); var dayDate = dayElem.dateObj; dayElem.classList.remove('evf-expiry-trial-blocked'); dayElem.removeAttribute('title'); if ( EVFPanelBuilder.is_subscription_expiry_trial_day( $choiceLi, dayDate, ) ) { dayElem.classList.add('evf-expiry-trial-blocked'); dayElem.setAttribute('title', blockedTitle); } }, onChange: function (selectedDates, dateStr, instance) { var trialMin = EVFPanelBuilder.get_subscription_expiry_min_date( $(instance.input).closest('li'), ); if ( selectedDates[0] && selectedDates[0] < trialMin ) { instance.clear(); $(instance.input).val(''); return; } $(instance.input).val(dateStr).trigger('change'); }, onReady: function (selectedDates, dateStr, instance) { var $choiceLi = $(instance.input).closest('li'); var trialMin = EVFPanelBuilder.get_subscription_expiry_min_date( $choiceLi, ); var storedDate = $.trim($(instance.input).val()); if (instance.calendarContainer) { instance.calendarContainer.classList.add( 'evf-subscription-expiry-calendar', ); } EVFPanelBuilder.bind_subscription_expiry_picker_toggle( instance, ); EVFPanelBuilder.sync_subscription_expiry_trial_hint( $choiceLi, trialMin, ); if (storedDate) { instance.setDate(storedDate, false); $(instance.input).val( instance.formatDate( instance.selectedDates[0], instance.config.dateFormat, ), ); } if ( instance.selectedDates[0] && instance.selectedDates[0] < trialMin ) { instance.clear(); $(instance.input).val(''); } }, }); }); }, /** * For the subscription plan field. * * @since 3.0.9 */ init_payment_subscription_plan_field: function () { EVFPanelBuilder.init_subscription_expiry_date_pickers(); $('.everest-forms-field-payment-subscription-plan').each(function () { var fieldId = $(this).data('field-id'); if (fieldId) { EVFPanelBuilder.subscriptionPlanChoiceUpdate(fieldId); } }); // Tab switching — delegated so it works for dynamically added choices. $(document.body).on( 'click', '.evf-spt-tab', function () { EVFPanelBuilder.close_subscription_expiry_pickers(); var $tab = $(this); var $planTabs = $tab.closest('.evf-subscription-plan-tabs'); var targetTab = $tab.data('tab'); $tab.closest('.evf-spt-strip') .find('.evf-spt-tab') .removeClass('evf-spt-tab--active'); $tab.addClass('evf-spt-tab--active'); $planTabs.find('.evf-spt-panel').hide(); $planTabs.find('.evf-spt-panel--' + targetTab).show(); if ('expiry' === targetTab) { EVFPanelBuilder.init_subscription_expiry_date_pickers( $tab.closest('li'), ); } }, ); // Trial toggle — dim inputs and update dot indicator. $(document.body).on( 'change', '.evf-enable-trial-period', function () { var $li = $(this).closest('li'); var isChecked = $(this).is(':checked'); $li.find('.evf-spt-panel--trial .evf-spt-panel-detail').toggle(isChecked); $li.find('.evf-spt-tab--trial .evf-spt-dot').toggle(isChecked); EVFPanelBuilder.update_subscription_expiry_min_dates($li); }, ); // Trial length/period — block expiry dates that fall inside the trial window. $(document.body).on( 'change input', '.evf-spt-panel--trial input[type="number"], .evf-spt-panel--trial select', function () { EVFPanelBuilder.update_subscription_expiry_min_dates( $(this).closest('li'), ); }, ); // Expiry toggle — dim inputs, close calendar, update dot indicator. $(document.body).on( 'change', '.evf-enable-expiry-date', function () { var $li = $(this).closest('li'); var isChecked = $(this).is(':checked'); $li.find('.evf-spt-panel--expiry .evf-spt-panel-detail').toggle(isChecked); $li.find('.evf-spt-tab--expiry .evf-spt-dot').toggle(isChecked); if (isChecked) { EVFPanelBuilder.init_subscription_expiry_date_pickers($li); } else { EVFPanelBuilder.clear_subscription_plan_expiry_date($li); EVFPanelBuilder.close_subscription_expiry_pickers(); } }, ); // Update builder preview when recurring interval or period changes. $(document.body).on( 'change input', '.evf-spt-panel--recurring input[type="number"], .evf-spt-panel--recurring select', function () { var fieldId = $(this).closest('.evf-choices-list').data('field-id'); if (fieldId) { EVFPanelBuilder.subscriptionPlanChoiceUpdate(fieldId); } }, ); // Update builder preview when trial toggle, count, or period changes. $(document.body).on( 'change input', '.evf-enable-trial-period, .evf-spt-panel--trial input[type="number"], .evf-spt-panel--trial select', function () { var fieldId = $(this).closest('.evf-choices-list').data('field-id'); if (fieldId) { EVFPanelBuilder.subscriptionPlanChoiceUpdate(fieldId); } }, ); // Update builder preview when expiry toggle or date changes. $(document.body).on( 'change', '.evf-enable-expiry-date, .evf-radio-subscription-expiry-input', function () { var fieldId = $(this).closest('.evf-choices-list').data('field-id'); if (fieldId) { EVFPanelBuilder.subscriptionPlanChoiceUpdate(fieldId); } }, ); $(document.body).on('evf_after_field_append', function (e, element_id) { var $field = $('#' + element_id); var field_type = $field.attr('data-field-type'); if ('payment-subscription-plan' === field_type) { var isRecurringEnable = $( '#everest-forms-panel-field-paypal-recurring', ); $('#everest-forms-panel-field-paypal-interval_count-wrap').hide(); $('#everest-forms-panel-field-paypal-period-wrap').hide(); $('#everest-forms-panel-field-stripe-plan_name-wrap').hide(); $('#everest-forms-panel-field-stripe-interval_count-wrap').hide(); $('#everest-forms-panel-field-stripe-period-wrap').hide(); $('#everest-forms-panel-field-mollie-subscription_description-wrap').hide(); $('#everest-forms-panel-field-mollie-interval_count-wrap').hide(); $('#everest-forms-panel-field-mollie-interval-wrap').hide(); } EVFPanelBuilder.syncPaymentMethodDependentFields(); EVFPanelBuilder.refreshFieldMapSelectsFromField('add', element_id); }); $(document.body).on('evf_before_field_deleted', function (e, element_id) { EVFPanelBuilder.refreshFieldMapSelectsFromField( 'remove', element_id, ); var $field = $('#everest-forms-field-' + element_id); var field_type = $field.attr('data-field-type'); if ('payment-subscription-plan' === field_type) { $('#everest-forms-panel-field-paypal-interval_count-wrap').show(); $('#everest-forms-panel-field-paypal-period-wrap').show(); $('#everest-forms-panel-field-stripe-plan_name-wrap').hide(); $('#everest-forms-panel-field-stripe-interval_count-wrap').hide(); $('#everest-forms-panel-field-stripe-period-wrap').hide(); $('#everest-forms-panel-field-mollie-subscription_description-wrap').show(); $('#everest-forms-panel-field-mollie-interval_count-wrap').show(); $('#everest-forms-panel-field-mollie-interval-wrap').show(); } // Run after DOM removal to accurately detect selector presence. setTimeout(function () { EVFPanelBuilder.syncPaymentMethodDependentFields(); }, 0); }); var isRecurringEnable = $('#everest-forms-panel-field-paypal-recurring'); var wrapper = $('.everest-forms-field-wrap'); if ( $(wrapper).find('.everest-forms-field-payment-subscription-plan') .length > 0 ) { if ($(isRecurringEnable).is(':checked')) { $('#everest-forms-panel-field-paypal-interval_count-wrap').hide(); $('#everest-forms-panel-field-paypal-period-wrap').hide(); $('#everest-forms-panel-field-stripe-plan_name-wrap').hide(); $('#everest-forms-panel-field-stripe-interval_count-wrap').hide(); $('#everest-forms-panel-field-stripe-period-wrap').hide(); } $(isRecurringEnable).on('click', function (e) { $('#everest-forms-panel-field-paypal-interval_count-wrap').hide(); $('#everest-forms-panel-field-paypal-period-wrap').hide(); $('#everest-forms-panel-field-stripe-plan_name-wrap').hide(); $('#everest-forms-panel-field-stripe-interval_count-wrap').hide(); $('#everest-forms-panel-field-stripe-period-wrap').hide(); }); } var isStripeRecurringEnable = $( '#everest-forms-panel-field-stripe-recurring', ); var wrapper = $('.everest-forms-field-wrap'); if ( $(wrapper).find('.everest-forms-field-payment-subscription-plan') .length > 0 ) { if ($(isStripeRecurringEnable).is(':checked')) { $('#everest-forms-panel-field-stripe-plan_name-wrap').hide(); $('#everest-forms-panel-field-stripe-interval_count-wrap').hide(); $('#everest-forms-panel-field-stripe-period-wrap').hide(); } $('#everest-forms-panel-field-mollie-subscription_description-wrap').hide(); $('#everest-forms-panel-field-mollie-interval_count-wrap').hide(); $('#everest-forms-panel-field-mollie-interval-wrap').hide(); } $(isStripeRecurringEnable).on('click', function (e) { if ( $(this).is(':checked') && $(wrapper).find('.everest-forms-field-payment-subscription-plan') .length > 0 ) { $('#everest-forms-panel-field-stripe-plan_name-wrap').hide(); $('#everest-forms-panel-field-stripe-interval_count-wrap').hide(); $('#everest-forms-panel-field-stripe-period-wrap').hide(); } }); }, /** * Form edit title actions. * * @since 1.6.0 */ bindEditActions: function () { // Delegates event to toggleEditTitle() on clicking. $('#edit-form-name').on('click', function (e) { e.stopPropagation(); if ('' !== $('#evf-edit-form-name').val().trim()) { EVFPanelBuilder.toggleEditTitle(e); } }); // Apply the title change to form name field. $('#evf-edit-form-name') .on('change keypress', function (e) { var $this = $(this); e.stopPropagation(); if (13 === e.which && '' !== $(this).val().trim()) { EVFPanelBuilder.toggleEditTitle(e); } if ('' !== $this.val().trim()) { $('#everest-forms-panel-field-settings-form_title').val( $this.val().trim(), ); } }) .on('click', function (e) { e.stopPropagation(); }); // In case the user goes out of focus from title edit state. $(document) .not($('.everest-forms-title-desc')) .on('click', function (e) { var field = $('#evf-edit-form-name'); e.stopPropagation(); // Only allow flipping state if currently editing. if ( !field.prop('disabled') && field.val() && '' !== field.val().trim() ) { EVFPanelBuilder.toggleEditTitle(e); } }); }, // Toggles edit state. toggleEditTitle: function (event) { var $el = $('#edit-form-name'), $input_title = $el.siblings('#evf-edit-form-name'); event.preventDefault(); // Toggle disabled property. $input_title.prop('disabled', function (_, val) { return !val; }); if (!$input_title.hasClass('everst-forms-name-editing')) { $input_title.focus(); } $input_title.toggleClass('everst-forms-name-editing'); }, //--------------------------------------------------------------------// // Fields Panel //--------------------------------------------------------------------// /** * Creates a object from form elements. * * @since 1.6.0 */ formObject: function (el) { var form = jQuery(el), fields = form.find('[name]'), json = {}, arraynames = {}; for (var v = 0; v < fields.length; v++) { var field = jQuery(fields[v]), name = field.prop('name').replace(/\]/gi, '').split('['), value = field.val(), lineconf = {}; if ( (field.is(':radio') || field.is(':checkbox')) && !field.is(':checked') ) { continue; } for (var i = name.length - 1; i >= 0; i--) { var nestname = name[i]; if (typeof nestname === 'undefined') { nestname = ''; } if (nestname.length === 0) { lineconf = []; if (typeof arraynames[name[i - 1]] === 'undefined') { arraynames[name[i - 1]] = 0; } else { arraynames[name[i - 1]] += 1; } nestname = arraynames[name[i - 1]]; } if (i === name.length - 1) { if (value) { if (value === 'true') { value = true; } else if (value === 'false') { value = false; } else if ( !isNaN(parseFloat(value)) && parseFloat(value).toString() === value ) { value = parseFloat(value); } else if ( typeof value === 'string' && (value.substr(0, 1) === '{' || value.substr(0, 1) === '[') ) { try { value = JSON.parse(value); } catch (e) {} } else if ( typeof value === 'object' && value.length && field.is('select') ) { var new_val = {}; for (var i = 0; i < value.length; i++) { new_val['n' + i] = value[i]; } value = new_val; } } lineconf[nestname] = value; } else { var newobj = lineconf; lineconf = {}; lineconf[nestname] = newobj; } } $.extend(true, json, lineconf); } return json; }, /** * Element bindings for Fields panel. * * @since 1.2.0 */ bindUIActionsFields: function () { // Add new field choice. $builder.on( 'click', '.everest-forms-field-option-row-choices .add', function (event) { EVFPanelBuilder.choiceAdd(event, $(this)); }, ); // Delete field choice. $builder.on( 'click', '.everest-forms-field-option-row-choices .remove', function (event) { EVFPanelBuilder.choiceDelete(event, $(this)); }, ); // Field choices defaults - (before change). $builder.on( 'mousedown', '.everest-forms-field-option-row-choices input[type=radio]', function () { var $this = $(this); if ($this.is(':checked')) { $this.attr('data-checked', '1'); } else { $this.attr('data-checked', '0'); } }, ); // Field choices defaults. $builder.on( 'click', '.everest-forms-field-option-row-choices input[type=radio]', function () { var $this = $(this), list = $this.parent().parent(); $this .parent() .parent() .find('input[type=radio]') .not(this) .prop('checked', false); if ($this.attr('data-checked') === '1') { $this.prop('checked', false); $this.attr('data-checked', '0'); } EVFPanelBuilder.choiceUpdate( list.data('field-type'), list.data('field-id'), ); }, ); // Field choices update preview area. $builder.on( 'change', '.everest-forms-field-option-row-choices input[type=checkbox]', function (e) { var list = $(this).parent().parent(); EVFPanelBuilder.choiceUpdate( list.data('field-type'), list.data('field-id'), ); }, ); // Updates field choices text in almost real time. $builder.on( 'keyup paste focusout', '.everest-forms-field-option-row-choices input.label, .everest-forms-field-option-row-choices input.value', function (e) { var list = $(this).parent().parent().parent(); EVFPanelBuilder.choiceUpdate( list.data('field-type'), list.data('field-id'), ); }, ); // Field choices display value toggle. $builder.on( 'change', '.everest-forms-field-option-row-show_values input', function (e) { $(this) .closest('.everest-forms-field-option') .find('.everest-forms-field-option-row-choices ul') .toggleClass('show-values'); }, ); // Field image choices toggle. $builder.on( 'change', '.everest-forms-field-option-row-choices_images input', function () { var $this = $(this), field_id = $this.parent().parent().parent().data('field-id'), $fieldOptions = $('#everest-forms-field-option-' + field_id), $columnOptions = $( '#everest-forms-field-option-' + field_id + '-input_columns', ), type = $('#everest-forms-field-option-' + field_id) .find('.everest-forms-field-option-hidden-type') .val(); $this.parent().find('.notice').toggleClass('hidden'); $fieldOptions .find('.everest-forms-field-option-row-choices ul') .toggleClass('show-images'); // Trigger columns changes. if ($this.is(':checked')) { $columnOptions.val('inline').trigger('change'); } else { $columnOptions.val('').trigger('change'); } EVFPanelBuilder.choiceUpdate(type, field_id); }, ); // Upload or add an image. $builder.on( 'click', '.everest-forms-attachment-media-view .upload-button', function (event) { var $el = $(this), $wrapper, file_frame; event.preventDefault(); // If the media frame already exists, reopen it. if (file_frame) { file_frame.open(); return; } // Create the media frame. file_frame = wp.media.frames.everestforms_media_frame = wp.media({ title: evf_data.i18n_upload_image_title, className: 'media-frame everest-forms-media-frame', frame: 'select', multiple: false, library: { type: 'image', }, button: { text: evf_data.i18n_upload_image_button, }, }); // When an image is selected, run a callback. file_frame.on('select', function () { var attachment = file_frame .state() .get('selection') .first() .toJSON(); if ($el.hasClass('button-add-media')) { $el.hide(); $wrapper = $el.parent(); } else { $wrapper = $el.parent().parent().parent(); } $wrapper.find('.source').val(attachment.url); $wrapper.find('.attachment-thumb').remove(); $wrapper .find('.thumbnail-image') .prepend( '', ); $wrapper.find('.actions').show(); $builder.trigger('everestFormsImageUploadAdd', [$el, $wrapper]); }); // Finally, open the modal. file_frame.open(); }, ); // Remove and uploaded image. $builder.on( 'click', '.everest-forms-attachment-media-view .remove-button', function (event) { event.preventDefault(); var $container = $(this).parent().parent(); $container.find('.attachment-thumb').remove(); $container.parent().find('.source').val(''); $container.parent().find('.button-add-media').show(); $builder.trigger('everestFormsImageUploadRemove', [ $(this), $container, ]); }, ); // Field choices image upload add/remove image. $builder.on( 'everestFormsImageUploadAdd everestFormsImageUploadRemove', function (event, $this, $container) { var $el = $container.closest('.evf-choices-list'), type = $el.data('field-type'), field_id = $el.data('field-id'); EVFPanelBuilder.choiceUpdate(type, field_id); }, ); // Toggle Layout advanced field option. $builder.on( 'change', '.everest-forms-field-option-row-input_columns select', function () { var $this = $(this), value = $this.val(), field_id = $this.parent().data('field-id'), css_class = ''; if ('inline' === value) { css_class = 'everest-forms-list-inline'; } else if ('' !== value) { css_class = 'everest-forms-list-' + value + '-columns'; } $('#everest-forms-field-' + field_id) .removeClass( 'everest-forms-list-inline everest-forms-list-2-columns everest-forms-list-3-columns', ) .addClass(css_class); }, ); // Field sidebar tab toggle. $builder.on('click', '.everest-forms-fields-tab a', function (e) { e.preventDefault(); EVFPanelBuilder.fieldTabChoice($(this).attr('id')); }); // Dragged field and hover over tab buttons - multipart. $(document).on( 'mouseenter', '.everest-forms-tabs li[class*="part_"]', function () { if ( false === $(this).hasClass('active') && ($(document) .find('.everest-forms-field') .hasClass('ui-sortable-helper') || $(document) .find('.evf-registered-buttons button.evf-registered-item') .hasClass('field-dragged')) ) { $(this).find('a').trigger('click'); } }, ); // Display toggle for "Address" field hidden option. $builder.on( 'change', '.everest-forms-field-option-address input.hide', function () { var $this = $(this), id = $this.parent().parent().data('field-id'), subfield = $this.parent().parent().data('subfield'); $('#everest-forms-field-' + id) .find('.everest-forms-' + subfield) .toggleClass('hidden'); }, ); // Real-time updates for "Show Label" field option. $builder.on( 'input', '.everest-forms-field-option-row-label input', function () { var $this = $(this), value = $this .val() .replace(/<\s*script/gi, '') .replace(/\s+on\w+\s*=/gi, ' '), id = $this.parent().data('field-id'), $label = $('#everest-forms-field-' + id).find('.label-title .text'); if ($label.hasClass('nl2br')) { $label.html(value.replace(/\n/g, '
')); } else if ('private-note' === $label.prevObject.data('field-type')) { value = value + ' (Admin Only)'; $label.html(value); } else { $label.html(value); } }, ); $builder.on( 'change', '.everest-forms-field-option-row-enable_prepopulate input', function (event) { var id = $(this).parent().parent().parent().data('field-id'); $('#everest-forms-field-' + id).toggleClass('parameter_name'); // Toggle "Parameter Name" option. if ($(event.target).is(':checked')) { $( '#everest-forms-field-option-row-' + id + '-parameter_name', ).show(); } else { $( '#everest-forms-field-option-row-' + id + '-parameter_name', ).hide(); } }, ); $builder.on( 'change', '.everest-forms-field-option-row-enable_regex_validation input', function (event) { var id = $(this).parent().parent().parent().data('field-id'); $('#everest-forms-field-' + id).toggleClass('regex_value'); // Toggle "Parameter Name" option. if ($(event.target).is(':checked')) { $('#everest-forms-field-option-row-' + id + '-regex_value').show(); $( '#everest-forms-field-option-row-' + id + '-regex_message', ).show(); } else { $('#everest-forms-field-option-row-' + id + '-regex_value').hide(); $( '#everest-forms-field-option-row-' + id + '-regex_message', ).hide(); } }, ); // Real-time updates for "Description" field option. $builder.on( 'input', '.everest-forms-field-option-row-description textarea', function () { var $this = $(this); var id = $this.parent().data('field-id'); var $desc = $('#everest-forms-field-' + id).find('.description'); var value = $this.val(); // Sanitize the user input to prevent script injection, iframe injection, and remove event handlers value = value .replace(/<\s*script/gi, '') .replace(/<\s*iframe/gi, '') .replace(/\s+on\w+\s*=/gi, ' '); if ($desc.hasClass('nl2br')) { $desc.html(value.replace(/\n/g, '
')); } else { $desc.html(value); } }, ); // Real-time updates for "Required" field option. $builder.on( 'change', '.everest-forms-field-option-row-required input', function (event) { var id = $(this).parent().parent().parent().data('field-id'); $('#everest-forms-field-' + id).toggleClass('required'); // Toggle "Required Field Message Setting" option. if ($(event.target).is(':checked')) { $( '#everest-forms-field-option-row-' + id + '-required_field_message_setting', ).show(); if ( $( '#everest-forms-field-option-' + id + '-required_field_message_setting-individual', ).is(':checked') ) { $( '#everest-forms-field-option-row-' + id + '-required-field-message', ).show(); } } else { $( '#everest-forms-field-option-row-' + id + '-required_field_message_setting', ).hide(); $( '#everest-forms-field-option-row-' + id + '-required-field-message', ).hide(); //unchecked the slot booking if date is not required. slot_booking = $(document).find( '.everest-forms-slot-booking input', ); slot_booking.prop('checked', false); //show pass date input if hidden. $(document) .find('.everest-forms-past-date-disable-format input') .parent() .parent() .parent() .show(); } }, ); $builder.on( 'change', '.everest-forms-field-option-row-required_field_message_setting input', function (event) { var id = $(this).parent().parent().parent().parent().data('field-id'); $('#everest-forms-field-' + id).toggleClass( 'required_field_message_setting', ); // Toggle "Required Field Message" option. if ('individual' === $(this).val()) { $( '#everest-forms-field-option-row-' + id + '-required-field-message', ).show(); } else { $( '#everest-forms-field-option-row-' + id + '-required-field-message', ).hide(); } }, ); // Real-time updates for "Confirmation" field option. $builder.on( 'change', '.everest-forms-field-option-row-confirmation input', function (event) { var id = $(this).parent().parent().parent().data('field-id'); // Toggle "Confirmation" field option. if ($(event.target).is(':checked')) { $('#everest-forms-field-' + id) .find('.everest-forms-confirm') .removeClass('everest-forms-confirm-disabled') .addClass('everest-forms-confirm-enabled'); $('#everest-forms-field-option-' + id) .removeClass('everest-forms-confirm-disabled') .addClass('everest-forms-confirm-enabled'); } else { $('#everest-forms-field-' + id) .find('.everest-forms-confirm') .removeClass('everest-forms-confirm-enabled') .addClass('everest-forms-confirm-disabled'); $('#everest-forms-field-option-' + id) .removeClass('everest-forms-confirm-enabled') .addClass('everest-forms-confirm-disabled'); } }, ); // Real-time updates for slot booking $builder.on( 'change', '.everest-forms-slot-booking input', function (event) { if ($(this).is(':checked')) { disable_past_date = $(document).find( '.everest-forms-past-date-disable-format input', ); required = $(document).find( '.everest-forms-field-option-row-required input', ); //checked the required if it is not checked. if (required.is(':not(:checked)')) { required.prop('checked', true); } if (disable_past_date.is(':not(:checked)')) { disable_past_date.prop('checked', true); } disable_past_date.parent().parent().parent().hide(); } else { disable_past_date.parent().parent().parent().show(); } }, ); // Real-time updates for "Placeholder" field option. $builder.on( 'input', '.everest-forms-field-option-row-placeholder input', function (e) { var $this = $(this), value = $this.val(), id = $this.parent().data('field-id'), $primary = $('#everest-forms-field-' + id).find( '.widefat:not(.secondary-input)', ); if ($primary.is('select')) { if (!value.length) { $primary.find('.placeholder').remove(); } else { if ($primary.find('.placeholder').length) { $primary.find('.placeholder').text(value); } else { $primary.prepend( '', ); } $primary.data('placeholder', value); if ($primary.hasClass('enhanced')) { $primary .parent() .find('.select2-search__field') .prop('placeholder', value); } } } else { $primary.attr('placeholder', value); } }, ); // Real-time updates for "Address Placeholder" field options. $builder.on( 'input', '.everest-forms-field-option-address input.placeholder', function (e) { var $this = $(this), value = $this.val(), id = $this.parent().parent().data('field-id'), subfield = $this.parent().parent().data('subfield'); $('#everest-forms-field-' + id) .find('.everest-forms-' + subfield + ' input') .attr('placeholder', value); }, ); // Real-time updates for "Confirmation Placeholder" field option. $builder.on( 'input', '.everest-forms-field-option-row-confirmation_placeholder input', function () { var $this = $(this), value = $this.val(), id = $this.parent().data('field-id'); $('#everest-forms-field-' + id) .find('.secondary-input') .attr('placeholder', value); }, ); // Real-time updates for "Authorize.Net Card Number Placeholder" field option. $builder.on( 'input', '.everest-forms-field-option-row-card_number_placeholder input', function () { var $this = $(this), value = $this.val(), id = $this.parent().data('field-id'); $('#everest-forms-field-' + id) .find('.everest-forms-authorize-net-card-number input') .attr('placeholder', value); }, ); // Real-time updates for "Authorize.Net CVC Placeholder" field option. $builder.on( 'input', '.everest-forms-field-option-row-cvc_placeholder input', function () { var $this = $(this), value = $this.val(), id = $this.parent().data('field-id'); $('#everest-forms-field-' + id) .find('.everest-forms-authorize-net-cvc input') .attr('placeholder', value); }, ); // Real-time updates for "Hide Label" field option. $builder.on( 'change', '.everest-forms-field-option-row-label_hide input', function () { var id = $(this).parent().parent().parent().data('field-id'); $('#everest-forms-field-' + id).toggleClass('label_hide'); }, ); // Real-time updates for Sub Label visbility field option. $builder.on( 'change', '.everest-forms-field-option-row-sublabel_hide input', function () { var id = $(this).parent().parent().parent().data('field-id'); $('#everest-forms-field-' + id).toggleClass('sublabel_hide'); }, ); // Real-time updates for Date/Time and Name "Format" option. $builder.on( 'change', '.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', function (e) { var $this = $(this), value = $this.val(), id = $this.parent().data('field-id'); $('#everest-forms-field-' + id) .find('.format-selected') .removeClass() .addClass('format-selected format-selected-' + value); $('#everest-forms-field-option-' + id) .find('.format-selected') .removeClass() .addClass('format-selected format-selected-' + value); }, ); // Setting options toggler. $builder.on( 'change', '.everest-forms-field-option-row-datetime_style select', function () { EVFPanelBuilder.dateSettingToggler( $(this).parent().attr('data-field-id'), $(this).val(), ); }, ); // Enable Min Max Toggler. $( '.everest-forms-field-option-row-time_interval_format [id*=enable_min_max_time]', ).each(function () { if ($(this).prop('checked')) { $(this) .parent() .parent() .find('.input-group-col-2') .has(' [id*=min_time_hour]') .show(); $(this) .parent() .parent() .find('.input-group-col-2') .has(' [id*=max_time_hour]') .show(); $(this) .parent() .parent() .find('.input-group-col-2') .has(' [for*=select_min_time]') .show(); $(this) .parent() .parent() .find('.input-group-col-2') .has('[for*=select_max_time]') .show(); } else { $(this) .parent() .parent() .find('.input-group-col-2') .has('[id*=min_time_hour]') .hide(); $(this) .parent() .parent() .find('.input-group-col-2') .has('[id*=max_time_hour]') .hide(); $(this).parent().parent().find('[for*=select_min_time]').hide(); $(this).parent().parent().find('[for*=select_max_time]').hide(); } }); $builder.on( 'click', '.everest-forms-field-option-row-time_interval_format [id*=enable_min_max_time]', function () { if ($(this).prop('checked')) { $(this) .parent() .parent() .find('.input-group-col-2') .has(' [id*=min_time_hour]') .show(); $(this) .parent() .parent() .find('.input-group-col-2') .has(' [id*=max_time_hour]') .show(); $(this).parent().parent().find('[for*=select_min_time]').show(); $(this).parent().parent().find('[for*=select_max_time]').show(); } else { $(this) .parent() .parent() .find('.input-group-col-2') .has('[id*=min_time_hour]') .hide(); $(this) .parent() .parent() .find('.input-group-col-2') .has('[id*=max_time_hour]') .hide(); $(this).parent().parent().find('[for*=select_min_time]').hide(); $(this).parent().parent().find('[for*=select_max_time]').hide(); } }, ); // Time interval changes. $builder.on( 'change', '.everest-forms-field-option-row-time_interval_format select[id*=time_format]', function () { min_hour = $(this) .parent() .siblings('.input-group-col-2') .find('[id*=min_time_hour]'); max_hour = $(this) .parent() .siblings('.input-group-col-2') .find('[id*=max_time_hour]'); var selected_min = min_hour.find('option:selected').val(); var selected_max = max_hour.find('option:selected').val(); var options = '', a, h; for (i = 0; i <= 23; i++) { if ($(this).val() === 'H:i') { options += ''; } else { a = ' PM'; if (i < 12) { a = ' AM'; h = i; } else { h = i - 12; } if (h == 0) { h = 12; } options += ''; } } min_hour.html(options); max_hour.html(options); min_hour .find('option[value=' + selected_min + ']') .prop('selected', true); max_hour .find('option[value=' + selected_max + ']') .prop('selected', true); }, ); }, /** * Setting options for Date Picker and Dropdown Toggler. */ dateSettingToggler: function (id, type) { if (type == 'picker') { // Picker Date Setting Control $('#everest-forms-field-option-row-' + id + '-placeholder').show(); $('#everest-forms-field-option-' + id + '-disable_dates').show(); $( 'label[for=everest-forms-field-option-' + id + '-disable_dates]', ).show(); $('#everest-forms-field-option-' + id + '-date_mode-range') .parents() .find('everest-forms-checklist') .show(); $('.everest-forms-field-option-row-date_format .time_interval').show(); $('#everest-forms-field-option-' + id + '-date_localization').show(); $( 'label[for=everest-forms-field-option-' + id + '-date_localization]', ).show(); $('#everest-forms-field-option-' + id + '-date_default') .parent() .parent() .parent() .show(); $('#everest-forms-field-option-' + id + '-past_date_disable') .parent() .parent() .parent() .show(); $('#everest-forms-field-option-' + id + '-enable_min_max') .parent() .parent() .parent() .show(); //Check if min max date enabled. if ( $('#everest-forms-field-option-' + id + '-enable_min_max').prop( 'checked', ) ) { $('#everest-forms-field-option-' + id + '-set_date_range') .parent() .show(); if ( $('#everest-forms-field-option-' + id + '-set_date_range').prop( 'checked', ) ) { $( '#everest-forms-field-option-row-' + id + '-date_format .everest-forms-min-max-date-range-option', ).removeClass('everest-forms-hidden'); } else { $( '#everest-forms-field-option-row-' + id + '-date_format .everest-forms-min-max-date-option', ).removeClass('everest-forms-hidden'); } } $('#everest-forms-field-option-' + id + '-time_interval').show(); $('#everest-forms-field-option-' + id + '-enable_min_max_time') .parent() .parent() .parent() .hide(); $( 'label[for=everest-forms-field-option-' + id + '-enable_min_max_time]', ).hide(); $( 'label[for=everest-forms-field-option-' + id + '-select_min_time]', ).hide(); $( 'label[for=everest-forms-field-option-' + id + '-select_max_time]', ).hide(); $('#everest-forms-field-option-' + id + '-min_time_hour') .parent() .hide(); $('#everest-forms-field-option-' + id + '-max_time_hour') .parent() .hide(); } else { // Dropdown Date Setting Control $('#everest-forms-field-option-' + id + '-date_mode-range') .parents() .find('everest-forms-checklist') .hide(); $('#everest-forms-field-option-' + id + '-date_default') .parent() .parent() .parent() .hide(); $('#everest-forms-field-option-' + id + '-past_date_disable') .parent() .parent() .parent() .hide(); $('#everest-forms-field-option-row-' + id + '-placeholder').hide(); $('#everest-forms-field-option-' + id + '-enable_min_max') .parent() .parent() .parent() .hide(); $( '#everest-forms-field-option-row-' + id + '-date_format .everest-forms-min-max-date-option', ).addClass('everest-forms-hidden'); $('#everest-forms-field-option-' + id + '-set_date_range') .parent() .parent() .parent() .hide(); $( '#everest-forms-field-option-row-' + id + '-date_format .everest-forms-min-max-date-range-option', ).addClass('everest-forms-hidden'); $('#everest-forms-field-option-' + id + '-disable_dates').hide(); $( 'label[for=everest-forms-field-option-' + id + '-disable_dates]', ).hide(); $( '.everest-forms-field-option-row-date_format .everest-forms-checklist', ).hide(); $('.everest-forms-field-option-row-date_format .time_interval').hide(); $('#everest-forms-field-option-' + id + '-date_localization').hide(); $( 'label[for=everest-forms-field-option-' + id + '-date_localization]', ).hide(); $('#everest-forms-field-option-' + id + '-time_interval').hide(); $('#everest-forms-field-option-' + id + '-enable_min_max_time') .parent() .parent() .parent() .show(); $( 'label[for=everest-forms-field-option-' + id + '-enable_min_max_time]', ).show(); //Check if min max time enabled. if ( $('#everest-forms-field-option-' + id + '-enable_min_max_time').prop( 'checked', ) ) { $( 'label[for=everest-forms-field-option-' + id + '-select_min_time]', ).show(); $( 'label[for=everest-forms-field-option-' + id + '-select_max_time]', ).show(); $('#everest-forms-field-option-' + id + '-min_time_hour') .parent() .show(); $('#everest-forms-field-option-' + id + '-max_time_hour') .parent() .show(); } } }, /** * Make field choices sortable. * * @since 1.0.0 * * @param {string} selector Selector. */ choicesInit: function (selector) { selector = selector || '.everest-forms-field-option-row-choices ul'; $(selector).sortable({ items: 'li', axis: 'y', handle: '.sort', scrollSensitivity: 40, stop: function (event) { var field_id = $(event.target).attr('data-field-id'), type = $('#everest-forms-field-option-' + field_id) .find('.everest-forms-field-option-hidden-type') .val(); EVFPanelBuilder.choiceUpdate(type, field_id); }, }); }, /** * Add new field choice. * * @since 1.6.0 */ choiceAdd: function (event, el, value) { if (event && event.preventDefault) { event.preventDefault(); } var $this = $(el), $parent = $this.parent(), checked = $parent.find('input.default').is(':checked'), fieldID = $this .closest('.everest-forms-field-option-row-choices') .data('field-id'), nextID = $parent.parent().attr('data-next-id'), type = $parent.parent().data('field-type'), $choice = $parent.clone().insertAfter($parent); $choice.attr('data-key', nextID); $choice .find('input.label') .val(value) .attr( 'name', 'form_fields[' + fieldID + '][choices][' + nextID + '][label]', ); $choice .find('input.value') .val(value) .attr( 'name', 'form_fields[' + fieldID + '][choices][' + nextID + '][value]', ); $choice .find('input.source') .val('') .attr( 'name', 'form_fields[' + fieldID + '][choices][' + nextID + '][image]', ); $choice .find('input.default') .attr( 'name', 'form_fields[' + fieldID + '][choices][' + nextID + '][default]', ) .prop('checked', false); $choice.find('.attachment-thumb').remove(); $choice.find('.button-add-media').show(); if ( 'payment-subscription-plan' === type ) { var oldChoiceKey = $parent.data( 'key' ); $choice.find( 'input, select' ).each( function () { var name = $( this ).attr( 'name' ); if ( name && name.indexOf( '[choices][' + oldChoiceKey + '][' ) !== -1 ) { $( this ).attr( 'name', name.replace( '[choices][' + oldChoiceKey + '][', '[choices][' + nextID + '][' ) ); } } ); $choice.find( '.evf-enable-trial-period' ).prop( 'checked', false ); $choice.find( '.evf-enable-expiry-date' ).prop( 'checked', false ); $choice.find( '[name*="[subscription_expiry_date]"]' ).val( '' ); $choice.find( '.evf-spt-panel-detail' ).hide(); $choice.find( '.evf-spt-dot' ).hide(); } if (checked === true) { $parent.find('input.default').prop('checked', true); } nextID++; $parent.parent().attr('data-next-id', nextID); $builder.trigger('everestFormsChoiceAdd'); EVFPanelBuilder.choiceUpdate(type, fieldID); }, /** * Delete field choice. * * @since 1.6.0 */ choiceDelete: function (event, el) { event.preventDefault(); var $this = $(el), $list = $this.parent().parent(), total = $list.find('li').length; if (total < 2) { $.alert({ title: false, content: evf_data.i18n_field_error_choice, icon: 'dashicons dashicons-info', type: 'blue', buttons: { ok: { text: evf_data.i18n_ok, btnClass: 'btn-confirm', keys: ['enter'], }, }, }); } else { $this.parent().remove(); EVFPanelBuilder.choiceUpdate( $list.data('field-type'), $list.data('field-id'), ); $builder.trigger('everestFormsChoiceDelete'); } }, /** * Update field choices in preview area, for the Fields panel. * * @since 1.6.0 */ choiceUpdate: function (type, id) { var $fieldOptions = $('#everest-forms-field-option-' + id); $primary = $('#everest-forms-field-' + id + ' .primary-input'); // Radio and Checkbox use _ template. if ( 'radio' === type || 'checkbox' === type || 'payment-multiple' === type || 'payment-checkbox' === type ) { var choices = [], formData = EVFPanelBuilder.formObject($fieldOptions), settings = formData.form_fields[id]; // Order of choices for a specific field. $('#everest-forms-field-option-' + id) .find('.evf-choices-list li') .each(function () { choices.push($(this).data('key')); }); var tmpl = wp.template('everest-forms-field-preview-choices'), type = 'checkbox' === type || 'payment-checkbox' === type ? 'checkbox' : 'radio'; data = { type: type, order: choices, settings: settings, amountFilter: EVFPanelBuilder.amountFilter, }; $('#everest-forms-field-' + id) .find('ul.primary-input') .replaceWith(tmpl(data)); return; } if ('payment-subscription-plan' === type) { EVFPanelBuilder.subscriptionPlanChoiceUpdate(id); return; } var new_choice; if ('select' === type) { new_choice = ''; $primary.find('option').not('.placeholder').remove(); } $( '#everest-forms-field-option-row-' + id + '-choices .evf-choices-list li', ).each(function (index) { var $this = $(this), label = $this .find('input.label') .val() .replace(/<\s*script/gi, '') .replace(/\s+on\w+\s*=/gi, ' '), selected = $this.find('input.default').is(':checked'), choice = $(new_choice.replace('{label}', label)); $('#everest-forms-field-' + id + ' .primary-input').append(choice); if (!label) { return; } if (true === selected) { switch (type) { case 'select': choice.prop('selected', true); break; case 'radio': case 'checkbox': choice.find('input').prop('checked', true); break; } } }); }, amountFilter: function (data, amount) { if ('right' === data.currency_symbol_pos) { return amount + ' ' + data.currency_symbol; } else { return data.currency_symbol + ' ' + amount; } }, /** * Re-render the builder canvas preview for a subscription plan field. * * @param {string|number} fieldId The field ID. */ subscriptionPlanChoiceUpdate: function (fieldId) { var $optionsList = $('#everest-forms-field-option-row-' + fieldId + '-choices .evf-choices-list'); var $preview = $('#everest-forms-field-' + fieldId + ' .primary-input'); if (!$preview.length) { return; } var periodSingular = { day: 'day', week: 'week', month: 'month', year: 'year' }; var periodPlural = { day: 'days', week: 'weeks', month: 'months', year: 'years' }; var html = ''; $optionsList.find('li').each(function () { var $li = $(this); var label = $li.find('input.label').val() || ''; var rawAmount = $li.find('input.value').val() || '0'; var iCount = parseInt($li.find('input[name*="[interval_count]"]').val(), 10) || 1; var rPeriod = $li.find('select[name*="[recurring_period]"]').val() || 'month'; var trialOn = $li.find('.evf-enable-trial-period').is(':checked'); var tCount = parseInt($li.find('input[name*="[trail_interval_count]"]').val(), 10) || 1; var tPeriod = $li.find('select[name*="[trail_recurring_period]"]').val() || 'week'; var isDefault = $li.find('input.default').is(':checked'); var pStr = iCount > 1 ? (iCount + ' ' + (periodPlural[rPeriod] || rPeriod)) : (periodSingular[rPeriod] || rPeriod); var periodSuffix = '/' + pStr; var amountStr = EVFPanelBuilder.amountFilter(evf_data, rawAmount); var mainHtml = '' + '' + $('').text(label).html() + '' + '' + $('').text(amountStr + periodSuffix).html() + '' + ''; var metaParts = []; if (trialOn) { var tStr = tCount + ' ' + (tCount > 1 ? (periodPlural[tPeriod] || tPeriod) : (periodSingular[tPeriod] || tPeriod)); metaParts.push($('').text(tStr + ' free trial').html()); } var metaHtml = metaParts.length ? '' + metaParts.join(' · ') + '' : ''; var liHtml = ''; var itemClass = isDefault ? 'everest-forms-selected' : ''; html += '
  • ' + liHtml + '
  • '; }); $preview.html(html); }, bindFormSettings: function () { $('body').on('click', '.evf-setting-panel', function (e) { if ($(this).hasClass('upgrade-addons-settings')) { return; } var data_setting_section = $(this).attr('data-section'); $('.evf-setting-panel').removeClass('active'); $('.everest-forms-active-email').removeClass('active'); $('.everest-forms-active-sms-notifications').removeClass('active'); $('.everest-forms-active-conversational-forms').removeClass('active'); $('.evf-content-section').removeClass('active'); $(this).addClass('active'); $('.evf-content-' + data_setting_section + '-settings').addClass( 'active', ); e.preventDefault(); }); $('.evf-setting-panel').eq(0).trigger('click'); }, bindFormEmail: function () { $('body').on( 'click', '.everest-forms-panel-sidebar-section-email', function (e) { $(this).siblings('.everest-forms-active-email').removeClass('active'); $(this).next('.everest-forms-active-email').addClass('active'); var container = $(this) .siblings('.everest-forms-active-email.active') .find('.everest-forms-active-email-connections-list li'); if (container.length) { container.children('.user-nickname').first().trigger('click'); } e.preventDefault(); }, ); }, bindFormSmsNotifications: function () { $('body').on( 'click', '.everest-forms-panel-sidebar-section-sms-notifications', function (e) { $(this) .siblings('.everest-forms-active-sms-notifications') .removeClass('active'); $(this) .next('.everest-forms-active-sms-notifications') .addClass('active'); var container = $(this) .siblings('.everest-forms-active-sms-notifications.active') .find( '.everest-forms-active-sms-notifications-connections-list li', ); if (container.length) { container.children('.user-nickname').first().trigger('click'); } e.preventDefault(); }, ); }, bindFormConversational: function () { $('body').on( 'click', '.everest-forms-panel-sidebar-section-conversational-forms ', function (e) { var $this = $(this); $(this) .siblings('.everest-forms-active-conversational-forms') .removeClass('active'); $(this) .next('.everest-forms-active-conversational-forms') .addClass('active'); var container = $(this).siblings( '.everest-forms-active-conversational-forms.active', ); if (container.length) { container.children('.evf-content-tab ').trigger('click'); } e.preventDefault(); }, ); }, bindFormIntegrations: function () { $('body').on('click', '.evf-integrations-panel', function (e) { if ($(this).hasClass('upgrade-addons-settings')) { e.preventDefault(); return; } if ($(this).hasClass('evf-addon-install-trigger')) { e.preventDefault(); return; } var data_setting_section = $(this).attr('data-section'); $('.evf-integrations-panel').removeClass('active'); $('#everest-forms-panel-integrations') .find('.evf-panel-content-section') .removeClass('active'); $(this).addClass('active'); $(this) .parent() .find('.everest-forms-active-connections') .removeClass('active'); $(this).next('.everest-forms-active-connections').addClass('active'); var container = $(this) .siblings('.everest-forms-active-connections.active') .find('.everest-forms-active-connections-list li'); if (container.length) { container.children('.user-nickname').first().trigger('click'); } $('.evf-panel-content-section-' + data_setting_section).addClass( 'active', ); e.preventDefault(); }); $('.evf-setting-panel').eq(0).trigger('click'); }, bindFormPayment: function () { $('body').on('click', '.evf-payments-panel', function (e) { if ($(this).hasClass('upgrade-addons-settings')) { e.preventDefault(); return; } var data_setting_section = $(this).attr('data-section'); $('.evf-payments-panel').removeClass('active'); $(this).siblings().removeClass('icon active'); $(this).addClass('active'); $(this) .parents('#everest-forms-panel-payments') .find('.evf-payment-setting-content') .removeClass('active') .hide(); $('.evf-content-' + data_setting_section + '-settings') .addClass('active') .show(); e.preventDefault(); }); $('.evf-setting-panel').eq(0).trigger('click'); }, removeRow: function (row) { $.each(row.find('.everest-forms-field'), function () { var field_id = $(this).attr('data-field-id'), field_type = $(this).attr('data-field-type'), field_options = $('#everest-forms-field-option-' + field_id); // Trigger before-delete event so addons can react. $(document.body).trigger('evf_before_field_deleted', [field_id]); // Remove conditional logic references for this field. EVFPanelBuilder.conditionalLogicRemoveField(field_id); EVFPanelBuilder.conditionalLogicRemoveFieldIntegration(field_id); EVFPanelBuilder.paymentFieldRemoveFromQuantity(field_id); EVFPanelBuilder.oneTimeDraggableRemoveField(field_type); $(this).remove(); field_options.remove(); }); row.remove(); }, bindRemoveRow: function () { $('body').on('click', '.evf-delete-row', function () { var $this = $(this), total_rows = $('.evf-admin-row').length, current_row = $this.closest('.evf-admin-row'), row_id = current_row.attr('data-row-id'), current_part = $this .parents('.evf-admin-field-container') .attr('data-current-part'), multipart_active = $('#everest-forms-builder').hasClass( 'multi-part-activated', ); if (current_part && multipart_active) { total_rows = $('#part_' + current_part).find('.evf-admin-row').length; } if (total_rows < 2) { $.alert({ title: evf_data.i18n_row_locked, content: evf_data.i18n_single_row_locked_msg, icon: 'dashicons dashicons-info', type: 'blue', buttons: { confirm: { text: evf_data.i18n_close, btnClass: 'btn-confirm', keys: ['enter'], }, }, }); } else { $.confirm({ title: false, content: evf_data.i18n_delete_row_confirm, type: 'red', closeIcon: false, backgroundDismiss: false, icon: 'dashicons dashicons-warning', buttons: { confirm: { text: evf_data.i18n_ok, btnClass: 'btn-confirm', keys: ['enter'], action: function () { EVFPanelBuilder.removeRow(current_row); $('.everest-forms-fields-tab') .find('a') .removeClass('active'); $('.everest-forms-fields-tab') .find('a') .first() .addClass('active'); $('.everest-forms-add-fields').show(); $('#everest-forms-row-option-row_' + row_id).remove(); }, }, cancel: { text: evf_data.i18n_cancel, }, }, }); } }); }, /** * Row/canvas zones where layout presets can be dropped (main wrapper or multi-part #part_*). * * @return {jQuery} */ getLayoutDropZones: function () { var $collection = $(); $('.evf-admin-field-wrapper').each(function () { var $w = $(this); var $parts = $w.children('[id^="part_"]'); if ($parts.length) { $collection = $collection.add($parts); } else { $collection = $collection.add($w); } }); return $collection; }, /** * Add a new row with a specific column layout. * * @param {number} columns Number of columns (1–4). * @param {jQuery|null} $afterRow Insert after this row. * @param {jQuery|null} $beforeRow Insert before this row (takes precedence over $afterRow). * @param {jQuery|null} $dropContext Element inside the builder (e.g. drop zone) to resolve multi-part wrapper. */ addLayoutContainer: function (columns, $afterRow, $beforeRow, $dropContext) { var wrapper = $('.evf-admin-field-wrapper'); if ($dropContext && $dropContext.length) { var current_part = $dropContext .closest('.evf-admin-field-container') .attr('data-current-part'); if (current_part) { var $partWrap = wrapper.find('#part_' + current_part); if ($partWrap.length) { wrapper = $partWrap; } } } var row_ids = $('.evf-admin-row') .map(function () { return $(this).data('row-id'); }) .get(), max_row_id = row_ids.length ? Math.max.apply(Math, row_ids) : 0, row_clone = $('.evf-admin-row').eq(0).clone(), total_rows = parseInt($('.evf-add-row').first().attr('data-total-rows'), 10) || 0; var current_part = $('.evf-admin-field-container').attr('data-current-part'); if (current_part) { wrapper = $('.evf-admin-field-wrapper').find('#part_' + current_part); } max_row_id++; total_rows++; row_clone.find('.evf-admin-grid').html(''); row_clone.attr('data-row-id', max_row_id); $('.evf-add-row').attr('data-total-rows', total_rows); $('.evf-add-row').attr('data-next-row-id', max_row_id); if ($beforeRow && $beforeRow.length) { $beforeRow.before(row_clone); } else if ($afterRow && $afterRow.length) { $afterRow.after(row_clone); } else { wrapper.append(row_clone); } row_clone .find('.evf-grid-selector[data-evf-grid="' + columns + '"]') .trigger('click'); EVFPanelBuilder.bindFields(); EVFPanelBuilder.checkEmptyGrid(); if ($('.everest-forms-row-options').length) { var _row_id = max_row_id, _evf_data = window.evf_data; $.ajax({ url: _evf_data.ajax_url, type: 'POST', data: { action: 'everest_forms_new_row', security: _evf_data.evf_add_row_nonce, form_id: _evf_data.form_id, row_id: _row_id, }, success: function (xhr) { if (true === xhr.success && 'undefined' !== typeof xhr.data.html) { $(document) .find('.everest-forms-row-option-group') .append(xhr.data.html); EVFPanelBuilder.conditionalLogicAppendRow(_row_id); $( '#everest-forms-panel-field-form_rows-connection_row_' + _row_id + '-conditional_logic_status', ).prop('checked', false); } }, }); } $('html, body').animate({ scrollTop: row_clone.offset().top - 100 }, 400); }, bindLayoutContainers: function () { $('body').on('click', '.evf-layout-container-btn', function () { var columns = parseInt($(this).data('columns'), 10), $fieldContainer = $('.evf-admin-field-container:visible').first(); if (!$fieldContainer.length) { $fieldContainer = $('.evf-admin-field-container').first(); } var wrapper = $('.evf-admin-field-wrapper'), current_part = $fieldContainer.attr('data-current-part'); if (current_part) { var $partWrap = wrapper.find('#part_' + current_part); if ($partWrap.length) { wrapper = $partWrap; } } var $lastRow = wrapper.children('.evf-admin-row').last(); if ($lastRow.length) { EVFPanelBuilder.addLayoutContainer( columns, $lastRow, null, $fieldContainer, ); } else { EVFPanelBuilder.addLayoutContainer( columns, null, null, $fieldContainer, ); } }); }, bindAddRowColumnPicker: function () { if (!$('#evf-add-row-picker').length) { var $pickerGrid = $('
    ').css({ display: 'grid', 'grid-template-columns': 'repeat(4, 1fr)', gap: '6px', }); $('.evf-layout-container-btn').each(function () { var $btn = $(this), cols = parseInt($btn.data('columns'), 10), label = $btn.text().trim(), svgHtml = $btn.find('svg').prop('outerHTML') || ''; var $pickerBtn = $('') .attr('data-columns', cols) .css({ display: 'flex', 'flex-direction': 'column', 'align-items': 'center', 'justify-content': 'center', padding: '10px 8px', border: '1px solid #edeff7', 'border-radius': '4px', cursor: 'pointer', 'font-size': '11px', 'text-align': 'center', background: '#fbfbfd', color: '#383838', gap: '4px', 'min-width': '80px', transition: 'border-color .12s,color .12s,background .12s', }) .append( $('') .css({ display: 'block', 'line-height': '1' }) .html(svgHtml), ) .append($('').text(label)); $pickerGrid.append($pickerBtn); }); $('body').append( $('
    ') .css({ display: 'none', position: 'fixed', background: '#fff', border: '1px solid #edeff7', 'border-radius': '8px', 'box-shadow': '0 8px 24px rgba(0,0,0,.08)', 'z-index': '999999', padding: '10px', overflow: 'visible', }) .append( '
    ', ) .append($pickerGrid), ); $('head').append( '', ); $('#evf-add-row-picker svg').css({ width: '24px', height: '24px', display: 'block', }); } // Intercept Add Row click (non-repeater) before bindAddNewRow fires. $('body').on( 'click', '.evf-add-row:not(.repeater-row) span', function (e) { e.stopImmediatePropagation(); var $span = $(this), $picker = $('#evf-add-row-picker'), $arrow = $('#evf-add-row-picker-arrow'); if ($picker.is(':visible')) { $picker.hide(); return; } var offset = $span.offset(), scrollLeft = $(window).scrollLeft(), scrollTop = $(window).scrollTop(), spanCX = offset.left - scrollLeft + $span.outerWidth() / 2, margin = 8; $picker.show(); var pickerH = $picker.outerHeight(), pickerW = $picker.outerWidth(), top = offset.top - scrollTop - pickerH - 8, flipped = false; if (top < margin) { top = offset.top - scrollTop + $span.outerHeight() + 8; flipped = true; } var left = spanCX - pickerW / 2; left = Math.min( Math.max(margin, left), window.innerWidth - pickerW - margin, ); // Arrow: points toward the button var arrowX = spanCX - left - 7; arrowX = Math.min(Math.max(14, arrowX), pickerW - 28); if (flipped) { // Picker is below button — arrow at top pointing up toward button $arrow .addClass('evf-arrow-down') .css({ top: '-8px', bottom: 'auto', left: arrowX + 'px' }); } else { // Picker is above button — arrow at bottom pointing down toward button $arrow .removeClass('evf-arrow-down') .css({ bottom: '-8px', top: 'auto', left: arrowX + 'px' }); } $picker.css({ top: top, left: left }); }, ); $(document.body).on( 'click', '#evf-add-row-picker button[data-columns]', function () { var cols = parseInt($(this).data('columns'), 10); $('#evf-add-row-picker').hide(); var $fieldContainer = $('.evf-admin-field-container:visible').first(); if (!$fieldContainer.length) { $fieldContainer = $('.evf-admin-field-container').first(); } var wrapper = $('.evf-admin-field-wrapper'), current_part = $fieldContainer.attr('data-current-part'); if (current_part) { var $partWrap = wrapper.find('#part_' + current_part); if ($partWrap.length) { wrapper = $partWrap; } } var $lastRow = wrapper.children('.evf-admin-row').last(); if ($lastRow.length) { EVFPanelBuilder.addLayoutContainer( cols, $lastRow, null, $fieldContainer, ); } else { EVFPanelBuilder.addLayoutContainer( cols, null, null, $fieldContainer, ); } }, ); $(document.body) .on( 'mouseenter', '#evf-add-row-picker button[data-columns]', function () { $(this).css({ 'border-color': '#8c64c6', color: '#8c64c6', background: '#fff', }); }, ) .on( 'mouseleave', '#evf-add-row-picker button[data-columns]', function () { $(this).css({ 'border-color': '#edeff7', color: '#383838', background: '#fbfbfd', }); }, ); $(document).on('click.evf-add-row-picker', function (e) { if (!$(e.target).closest('#evf-add-row-picker, .evf-add-row').length) { $('#evf-add-row-picker').hide(); } }); }, bindAddNewRow: function () { $('body').on('click', '.evf-add-row span', function () { $('#add-fields').trigger('click'); var $this = $(this), wrapper = $('.evf-admin-field-wrapper'), row_ids = $('.evf-admin-row') .map(function () { return $(this).data('row-id'); }) .get(), max_row_id = Math.max.apply(Math, row_ids), row_clone = $('.evf-admin-row').eq(0).clone(), total_rows = $this.parent().attr('data-total-rows'), current_part = $this .parents('.evf-admin-field-container') .attr('data-current-part'); max_row_id++; total_rows++; if (current_part) { wrapper = $('.evf-admin-field-wrapper').find('#part_' + current_part); } // Row clone. row_clone.find('.evf-admin-grid').html(''); row_clone.attr('data-row-id', max_row_id); // Row infos. $this.parent().attr('data-total-rows', total_rows); $this.parent().attr('data-next-row-id', max_row_id); if ( 0 < $('.everest-forms-row-options').length && false === $this.closest('.evf-add-row').hasClass('repeater-row') ) { row_clone.find('div').hide(); row_clone .css({ padding: '40px', }) .append( '', ); // Row append. wrapper.append(row_clone); // Initialize fields UI. EVFPanelBuilder.bindFields(); EVFPanelBuilder.checkEmptyGrid(); var row_id = row_clone.attr('data-row-id'), evf_data = window.evf_data; $.ajax({ url: evf_data.ajax_url, type: 'POST', data: { action: 'everest_forms_new_row', security: evf_data.evf_add_row_nonce, form_id: evf_data.form_id, row_id: row_id, }, success: function (xhr) { if (true === xhr.success) { if ('undefined' !== typeof xhr.data.html) { $(document) .find('.everest-forms-row-option-group') .append(xhr.data.html); EVFPanelBuilder.conditionalLogicAppendRow(row_id); // Disable conditional logic by default. $( '#everest-forms-panel-field-form_rows-connection_row_' + row_id + '-conditional_logic_status', ).prop('checked', false); } } }, }).always(function () { row_clone.css({ padding: 0 }); row_clone.find('div').show(); row_clone.find('.evf-toggle-row-content').css('display', 'none'); row_clone.find('i').remove(); // Trigger event after row add. $this.trigger('everest-forms-after-add-row', row_clone); }); } else { // Row append. wrapper.append(row_clone); // Initialize fields UI. EVFPanelBuilder.bindFields(); EVFPanelBuilder.checkEmptyGrid(); // Trigger event after row add. $this.trigger('everest-forms-after-add-row', row_clone); } }); }, bindCloneField: function () { $('body').on( 'click', '.everest-forms-preview .everest-forms-field .everest-forms-field-duplicate', function () { var $field = $(this).closest('.everest-forms-field'); if ($field.hasClass('no-duplicate')) { $.alert({ title: evf_data.i18n_field_locked, content: evf_data.i18n_field_locked_msg, icon: 'dashicons dashicons-info', type: 'blue', buttons: { confirm: { text: evf_data.i18n_close, btnClass: 'btn-confirm', keys: ['enter'], }, }, }); } else { $.confirm({ title: false, content: evf_data.i18n_duplicate_field_confirm, type: 'orange', closeIcon: false, backgroundDismiss: false, icon: 'dashicons dashicons-warning', buttons: { confirm: { text: evf_data.i18n_ok, btnClass: 'btn-confirm', keys: ['enter'], action: function () { EVFPanelBuilder.cloneFieldAction($field); }, }, cancel: { text: evf_data.i18n_cancel, }, }, }); } }, ); $('body').on('click', '.evf-admin-row .evf-duplicate-row', function () { var $row = $(this).closest('.evf-admin-row'); if ($row.find('.everest-forms-field').hasClass('no-duplicate')) { $.alert({ title: evf_data.i18n_field_locked, content: evf_data.i18n_row_locked_msg, icon: 'dashicons dashicons-info', type: 'blue', buttons: { confirm: { text: evf_data.i18n_close, btnClass: 'btn-confirm', keys: ['enter'], }, }, }); } else { $.confirm({ title: false, content: evf_data.i18n_duplicate_row_confirm, type: 'orange', closeIcon: false, backgroundDismiss: false, icon: 'dashicons dashicons-warning', buttons: { confirm: { text: evf_data.i18n_ok, btnClass: 'btn-confirm', keys: ['enter'], action: function () { EVFPanelBuilder.cloneRowAction($row); }, }, cancel: { text: evf_data.i18n_cancel, }, }, }); } }); }, cloneRowAction: function (row) { (row_ids = $('.evf-admin-row') .map(function () { return $(this).data('row-id'); }) .get()), (max_row_id = Math.max.apply(Math, row_ids)), (row_clone = row.clone()), (total_rows = $('.evf-add-row').attr('data-total-rows')); max_row_id++; total_rows++; // New row ID. row_clone.attr('data-row-id', max_row_id); // Initialize fields UI. $('.evf-add-row').attr('data-total-rows', total_rows); $('.evf-add-row').attr('data-next-row-id', max_row_id); var data = { action: 'everest_forms_get_next_id', security: evf_data.evf_get_next_id, form_id: evf_data.form_id, fields: row_clone.find('.everest-forms-field').length, }; $.ajax({ url: evf_data.ajax_url, data: data, type: 'POST', beforeSend: function () { $(document.body).trigger('init_field_options_toggle'); }, success: function (response) { if ( typeof response.success === 'boolean' && response.success === true ) { // Row append. row.after(row_clone); // Duplicating Fields $.each(response.data, function (index, data) { var field_id = data.field_id; var field_key = data.field_key; $('#everest-forms-field-id').val(field_id); field = row_clone.find('.everest-forms-field').eq(index); var element_field_id = field.attr('data-field-id'); EVFPanelBuilder.render_node(field, element_field_id, field_key); field.remove(); $(document.body).trigger('init_field_options_toggle'); }); // Binding fields. EVFPanelBuilder.bindFields(); } }, }); }, cloneFieldAction: function (field) { var element_field_id = field.attr('data-field-id'); var form_id = evf_data.form_id; var data = { action: 'everest_forms_get_next_id', security: evf_data.evf_get_next_id, form_id: form_id, }; $.ajax({ url: evf_data.ajax_url, data: data, type: 'POST', beforeSend: function () { $(document.body).trigger('init_field_options_toggle'); }, success: function (response) { if ( typeof response.success === 'boolean' && response.success === true ) { var field_id = response.data.field_id; var field_key = response.data.field_key; $('#everest-forms-field-id').val(field_id); EVFPanelBuilder.render_node(field, element_field_id, field_key); $(document.body).trigger('init_field_options_toggle'); } }, }); }, render_node: function (field, old_key, new_key) { var option = $( '.everest-forms-field-options #everest-forms-field-option-' + old_key, ); var old_field_label = $( '#everest-forms-field-option-' + old_key + '-label', ).val(); var old_field_meta_key = $( '#everest-forms-field-option-' + old_key + '-meta-key', ).length ? $('#everest-forms-field-option-' + old_key + '-meta-key').val() : ''; var field_type = field.attr('data-field-type'), newOptionHtml = option.html(), new_field_label = old_field_label + ' ' + evf_data.i18n_copy, new_meta_key = 'html' !== field_type ? old_field_meta_key .replace(/\(|\)/g, '') .toLowerCase() .substring(0, old_field_meta_key.lastIndexOf('_')) + '_' + Math.floor(1000 + Math.random() * 9000) : '', newFieldCloned = field.clone(); var regex = new RegExp(old_key, 'g'); newOptionHtml = newOptionHtml.replace(regex, new_key); var newOption = $( '
    ', ); newOption.append(newOptionHtml); $.each(option.find(':input'), function () { var type = $(this).attr('type'); var name = $(this).attr('name') ? $(this).attr('name') : ''; var new_name = name.replace(regex, new_key); var value = ''; if (type === 'text' || type === 'hidden') { value = $(this).val(); newOption.find('input[name="' + new_name + '"]').val(value); newOption.find('input[value="' + old_key + '"]').val(new_key); } else if (type === 'checkbox' || type === 'radio') { if ($(this).is(':checked')) { newOption .find('input[name="' + new_name + '"]') .prop('checked', true) .attr('checked', 'checked'); } else { newOption .find('[name="' + new_name + '"]') .prop('checked', false) .attr('checked', false); } } else if ($(this).is('select')) { if ($(this).find('option:selected').length) { var option_value = $(this).find('option:selected').val(); newOption .find('[name="' + new_name + '"]') .find('[value="' + option_value + '"]') .prop('selected', true); } } else { if ($(this).val() !== '') { newOption.find('[name="' + new_name + '"]').val($(this).val()); } } }); $('.everest-forms-field-options').append(newOption); $('#everest-forms-field-option-' + new_key + '-label').val( new_field_label, ); $('#everest-forms-field-option-' + new_key + '-meta-key').val( new_meta_key, ); // Field Clone newFieldCloned.attr('class', field.attr('class')); newFieldCloned.attr('id', 'everest-forms-field-' + new_key); newFieldCloned.attr('data-field-id', new_key); newFieldCloned.attr('data-field-type', field_type); newFieldCloned.find('.label-title .text').text(new_field_label); field .closest('.evf-admin-grid') .find('[data-field-id="' + old_key + '"]') .after(newFieldCloned); $(document).trigger('everest-form-cloned', [new_key, field_type]); EVFPanelBuilder.switchToFieldOptionPanel(new_key); //switch to cloned field options // Trigger an event indicating completion of render_node action for cloning. $(document.body).trigger('evf_render_node_complete', [ field_type, new_key, newFieldCloned, newOption, ]); EVFPanelBuilder.updateBulkActionBar(); }, bindFieldDelete: function () { $('body').on( 'click', '.everest-forms-preview .everest-forms-field .everest-forms-field-delete', function () { var $field = $(this).closest('.everest-forms-field'); var field_id = $field.attr('data-field-id'); var option_field = $('#everest-forms-field-option-' + field_id); var grid = $(this).closest('.evf-admin-grid'); if ($field.hasClass('no-delete')) { $.alert({ title: evf_data.i18n_field_locked, content: evf_data.i18n_field_locked_msg, icon: 'dashicons dashicons-info', type: 'blue', buttons: { confirm: { text: evf_data.i18n_close, btnClass: 'btn-confirm', keys: ['enter'], }, }, }); } else { $.confirm({ title: false, content: evf_data.i18n_delete_field_confirm, type: 'red', closeIcon: false, backgroundDismiss: false, icon: 'dashicons dashicons-warning', buttons: { confirm: { text: evf_data.i18n_ok, btnClass: 'btn-confirm', keys: ['enter'], action: function () { $('.evf-panel-fields-button').trigger('click'); $field.fadeOut('slow', function () { var removed_el_id = $field.attr('data-field-id'); var field_type = $field.attr('data-field-type'); $(document.body).trigger('evf_before_field_deleted', [ removed_el_id, ]); $field.remove(); option_field.remove(); EVFPanelBuilder.checkEmptyGrid(); $('.everest-forms-fields-tab') .find('a') .removeClass('active'); $('.everest-forms-fields-tab') .find('a') .first() .addClass('active'); $('.everest-forms-add-fields').show(); EVFPanelBuilder.conditionalLogicRemoveField( removed_el_id, ); EVFPanelBuilder.conditionalLogicRemoveFieldIntegration( removed_el_id, ); EVFPanelBuilder.paymentFieldRemoveFromQuantity( removed_el_id, ); EVFPanelBuilder.oneTimeDraggableRemoveField(field_type); }); }, }, cancel: { text: evf_data.i18n_cancel, }, }, }); } }, ); }, bindFieldMultiSelect: function () { if (!$('#evf-multi-select-style').length) { $('head').append( '', ); } if (!$('#evf-bulk-action-bar').length) { $('body').append( '', ); } $(document.body).on( 'click', '.everest-forms-preview .everest-forms-field', function (e) { if (!e.shiftKey) return; e.preventDefault(); e.stopPropagation(); $(this).toggleClass('evf-field-selected'); EVFPanelBuilder.updateBulkActionBar(); }, ); $(document.body).on( 'click', '#evf-bulk-action-bar .evf-bulk-deselect', function () { $('.evf-field-selected').removeClass('evf-field-selected'); EVFPanelBuilder.updateBulkActionBar(); }, ); $(document.body).on( 'click', '#evf-bulk-action-bar .evf-bulk-move-up', function () { var moved = false; $('.everest-forms-preview .evf-field-selected').each(function () { var $prev = $(this) .prevAll('.everest-forms-field:not(.evf-field-selected)') .first(); if ($prev.length) { $prev.before($(this)); moved = true; } }); if (moved) { $(document).trigger('evf_sort_update_complete', { event: null, ui: null, }); } else { $.alert({ title: false, content: 'The selected ' + ($('.everest-forms-preview .evf-field-selected').length > 1 ? 'fields are' : 'field is') + ' already at the top.', icon: 'dashicons dashicons-info', type: 'blue', buttons: { ok: { text: 'OK', btnClass: 'btn-confirm', keys: ['enter'] }, }, }); } }, ); $(document.body).on( 'click', '#evf-bulk-action-bar .evf-bulk-move-down', function () { var moved = false; $( $('.everest-forms-preview .evf-field-selected').toArray().reverse(), ).each(function () { var $next = $(this) .nextAll('.everest-forms-field:not(.evf-field-selected)') .first(); if ($next.length) { $next.after($(this)); moved = true; } }); if (moved) { $(document).trigger('evf_sort_update_complete', { event: null, ui: null, }); } else { $.alert({ title: false, content: 'The selected ' + ($('.everest-forms-preview .evf-field-selected').length > 1 ? 'fields are' : 'field is') + ' already at the bottom.', icon: 'dashicons dashicons-info', type: 'blue', buttons: { ok: { text: 'OK', btnClass: 'btn-confirm', keys: ['enter'] }, }, }); } }, ); $(document.body).on( 'click', '#evf-bulk-action-bar .evf-bulk-delete', function () { var $selected = $('.everest-forms-preview .evf-field-selected'), count = $selected.length; $.confirm({ title: false, content: 'Delete ' + count + ' selected field' + (count > 1 ? 's' : '') + '?', type: 'red', closeIcon: false, backgroundDismiss: false, icon: 'dashicons dashicons-warning', buttons: { confirm: { text: 'Delete', btnClass: 'btn-danger', action: function () { var pending = $selected.length; $('.evf-panel-fields-button').trigger('click'); $selected.each(function () { var $field = $(this), fieldId = $field.attr('data-field-id'), field_type = $field.attr('data-field-type'); $field.fadeOut(200, function () { $(document.body).trigger('evf_before_field_deleted', [ fieldId, ]); $field.remove(); $('#everest-forms-field-option-' + fieldId).remove(); EVFPanelBuilder.conditionalLogicRemoveField(fieldId); EVFPanelBuilder.conditionalLogicRemoveFieldIntegration( fieldId, ); EVFPanelBuilder.paymentFieldRemoveFromQuantity(fieldId); EVFPanelBuilder.oneTimeDraggableRemoveField(field_type); pending--; if (0 === pending) { EVFPanelBuilder.checkEmptyGrid(); $('.everest-forms-fields-tab') .find('a') .removeClass('active'); $('.everest-forms-fields-tab') .find('a') .first() .addClass('active'); $('.everest-forms-add-fields').show(); $('#evf-bulk-action-bar').hide(); } }); }); }, }, cancel: { text: evf_data.i18n_close, btnClass: 'btn-default', }, }, }); }, ); $(document).on('keydown.evf-multi-select', function (e) { if (27 === e.keyCode && $('.evf-field-selected').length) { $('.evf-field-selected').removeClass('evf-field-selected'); EVFPanelBuilder.updateBulkActionBar(); } }); }, updateBulkActionBar: function () { var $bar = $('#evf-bulk-action-bar'), count = $('.evf-field-selected').length; if (count > 0) { $bar .find('.evf-bulk-count') .text(count + ' field' + (count > 1 ? 's' : '') + ' selected'); $bar.css('display', 'flex'); } else { $bar.hide(); } }, bindFieldDeleteWithKeyEvent: function () { $('body').on('keyup', function (e) { var $field = $('.everest-forms-preview .everest-forms-field.active'); if ( 46 === e.which && true === $field.hasClass('active') && false === $field.hasClass('evf-delete-event-active') ) { if (false == $('.evf-admin-row').hasClass('evf-hover')) { return; } $field.addClass('evf-delete-event-active'); var field_id = $field.attr('data-field-id'); var option_field = $('#everest-forms-field-option-' + field_id); if ($field.hasClass('no-delete')) { $.alert({ title: evf_data.i18n_field_locked, content: evf_data.i18n_field_locked_msg, icon: 'dashicons dashicons-info', type: 'blue', buttons: { confirm: { text: evf_data.i18n_close, btnClass: 'btn-confirm', keys: ['enter'], action: function () { $field.removeClass('evf-delete-event-active'); }, }, }, }); } else { $.confirm({ title: false, content: evf_data.i18n_delete_field_confirm, type: 'red', closeIcon: false, backgroundDismiss: false, icon: 'dashicons dashicons-warning', buttons: { confirm: { text: evf_data.i18n_ok, btnClass: 'btn-confirm', keys: ['enter'], action: function () { $('.evf-panel-fields-button').trigger('click'); $field.fadeOut('slow', function () { var removed_el_id = $field.attr('data-field-id'); $(document.body).trigger('evf_before_field_deleted', [ removed_el_id, ]); $field.remove(); option_field.remove(); EVFPanelBuilder.checkEmptyGrid(); $('.everest-forms-fields-tab') .find('a') .removeClass('active'); $('.everest-forms-fields-tab') .find('a') .first() .addClass('active'); $('.everest-forms-add-fields').show(); EVFPanelBuilder.conditionalLogicRemoveField( removed_el_id, ); EVFPanelBuilder.conditionalLogicRemoveFieldIntegration( removed_el_id, ); EVFPanelBuilder.paymentFieldRemoveFromQuantity( removed_el_id, ); }); $field.removeClass('evf-delete-event-active'); }, }, cancel: { text: evf_data.i18n_cancel, action: function () { $field.removeClass('evf-delete-event-active'); }, }, }, }); } } }); }, syncSubscriptionPlanChoiceFieldsBeforeSave: function () { $( '.everest-forms-field-option-payment-subscription-plan .evf-choices-list > li', ).each(function () { var $li = $(this); var $trialEnable = $li.find('.evf-enable-trial-period'); var $expiryEnable = $li.find('.evf-enable-expiry-date'); var trialOn = $trialEnable.length && $trialEnable.is(':checked'); var expiryOn = $expiryEnable.length && $expiryEnable.is(':checked'); var $expiryInput = $li.find('.evf-radio-subscription-expiry-input'); // Exclude stale trial length fields when trial is off (prevents false trial in gateways). $li.find('.evf-spt-panel--trial input, .evf-spt-panel--trial select').prop( 'disabled', !trialOn, ); // Exclude stale expiry date when expiry is off (do not infer enable from date alone). $expiryInput.prop('disabled', !expiryOn); if (!expiryOn) { EVFPanelBuilder.clear_subscription_plan_expiry_date($li); } else if ($expiryInput.length && $expiryInput[0]._flatpickr) { var fp = $expiryInput[0]._flatpickr; if (fp.selectedDates && fp.selectedDates[0]) { $expiryInput.val( fp.formatDate( fp.selectedDates[0], $expiryInput.data('date-format') || 'Y-m-d', ), ); } } if ($trialEnable.length) { $trialEnable.prop('checked', !!trialOn); } }); }, bindSaveOption: function () { $('body').on('click', '.everest-forms-save-button', function () { var $this = $(this); var $form = $('form#everest-forms-builder-form'); var structure = EVFPanelBuilder.getStructure(); EVFPanelBuilder.syncSubscriptionPlanChoiceFieldsBeforeSave(); var form_data = $form.serializeArray(); // Re-enable trial/expiry inputs so the builder UI stays interactive after save. $( '.everest-forms-field-option-payment-subscription-plan .evf-spt-panel--trial input, .everest-forms-field-option-payment-subscription-plan .evf-spt-panel--trial select', ).prop('disabled', false); $( '.everest-forms-field-option-payment-subscription-plan .evf-radio-subscription-expiry-input', ).prop('disabled', false); var form_title = $('#evf-edit-form-name').val().trim(); // Save form args. $(document).trigger('everest_forms_save_args', [form_data]); if ('' === form_title) { $.alert({ title: evf_data.i18n_field_title_empty, content: evf_data.i18n_field_title_payload, icon: 'dashicons dashicons-warning', type: 'red', buttons: { ok: { text: evf_data.i18n_ok, btnClass: 'btn-confirm', keys: ['enter'], }, }, }); return; } // Trigger a handler to let addon manipulate the form data if needed. if ( $form.triggerHandler('everest_forms_process_ajax_data', [ $this, form_data, ]) ) { form_data = $form.triggerHandler('everest_forms_process_ajax_data', [ $this, form_data, ]); } $('.everest-forms-panel-content-wrap').block({ message: null, overlayCSS: { background: '#fff', opacity: 0.6, }, }); /* DB unwanted data erase start */ var rfields_ids = []; $('.everest-forms-field[data-field-id]').each(function () { rfields_ids.push($(this).attr('data-field-id')); }); var form_data_length = form_data.length; while (form_data_length--) { if (form_data[form_data_length].name.startsWith('form_fields')) { var idflag = false; rfields_ids.forEach(function (element) { if ( form_data[form_data_length].name.startsWith( 'form_fields[' + element + ']', ) ) { idflag = true; } }); if (form_data_length > -1 && idflag === false) { form_data.splice(form_data_length, 1); } } } /* DB fix end */ var new_form_data = form_data.concat(structure); var data = { action: 'everest_forms_save_form', security: evf_data.evf_save_form, form_data: JSON.stringify(new_form_data), }; $.ajax({ url: evf_data.ajax_url, data: data, type: 'POST', beforeSend: function () { $this.addClass('processing'); $this.find('.loading-dot').remove(); $this.append(''); }, success: function (response) { $this.removeClass('processing'); $this.find('.loading-dot').remove(); //Response data of ajax. $(document).trigger('everest_forms_save_data', response.data); if (!response.success) { $.alert({ title: response.data.errorTitle, content: response.data.errorMessage, icon: 'dashicons dashicons-warning', type: 'red', buttons: { ok: { text: evf_data.i18n_ok, btnClass: 'btn-confirm', keys: ['enter'], }, }, }); } else { EVFPanelBuilder.captureStyleTabBaseline(); $(document).trigger('everest_forms_form_saved'); EVFPanelBuilder.toggleUnsavedStyleNotice(); } $('.everest-forms-panel-content-wrap').unblock(); }, }); }); }, bindEmbedOption: function () { $('body').on('click', '.everest-forms-embed-button', function () { var data = { action: 'everest_forms_embed_form', security: evf_data.evf_embed_form, }; var $this = $(this); $.ajax({ url: evf_data.ajax_url, data: data, type: 'POST', beforeSend: function () { $this.addClass('processing'); $this.find('.loading-dot').remove(); $this.append(''); }, success: function (response) { $this.removeClass('processing'); $this.find('.loading-dot').remove(); var $title = '

    Embed in Page

    '; var modelContent = ''; var $message = '

    We can help embed your form with just a few clicks!

    '; var $selectExistingPage = ''; var $createNewPage = '
    '; modelContent = $message + $selectExistingPage + $createNewPage; $.alert({ title: $title, content: modelContent, type: 'blue', draggable:false, onContentReady: function () { var $formId = $('.everest-forms-embed-button').attr( 'data-form_id', ); $('.jconfirm-buttons').hide(); //when clicked on 'Select Existing Page' button $('.everest-forms-select-existing-page').click(function () { $('.everest_forms_hide_container').hide(); var $selectStart = '

    Select the page you would like to embed your form in.

    '; var $backBtn = '
    Go Back
    '; modelContent = $selectStart + $option + $selectEnd + $backBtn; $('.everest-forms-show-exist-page').append(modelContent); $('.everest-forms-show-container').click(function () { $('.everest_forms_hide_container').show(); $('.everest-forms-select-existing-post-container').remove(); }); //When page is selected $('.everest-forms-select-existing-post-container').change( function () { var $pageId = $(this).find(':selected').val(); $('.everest-forms-lets-go-btn').click(function () { var data = { action: 'everest_forms_goto_edit_page', security: evf_data.evf_goto_edit_page, page_id: $pageId, form_id: $formId, }; $.ajax({ url: evf_data.ajax_url, type: 'POST', data: data, success: function (response) { if (response.success) { window.location = response.data; } }, }); }); }, ); }); //when click on 'Create New Page' button $('.everest-forms-create-new-page').click(function () { $('.everest_forms_hide_container').hide(); var $title = '

    What would you like to call the new page?

    '; var $pageName = '
    '; var $goBtn = '
    '; var $backBtn = '
    Go Back
    '; modelContent = $title + $pageName + $goBtn + $backBtn; $(' .everest-forms-show-exist-page').append(modelContent); $('.everest-forms-show-container').click(function () { $('.everest_forms_hide_container').show(); $('.everest-forms-select-existing-post-container').remove(); }); $('.everest-forms-lets-go-btn').click(function () { var $pageTitle = $("[name='page_title']").val(); var data = { action: 'everest_forms_goto_edit_page', security: evf_data.evf_goto_edit_page, page_title: $pageTitle, form_id: $formId, }; $.ajax({ url: evf_data.ajax_url, type: 'POST', data: data, success: function (response) { if (response.success) { window.location = response.data; } }, }); }); }); }, }); }, }); }); }, bindPreviewConfirmation: function () { $('.everest-preview-confirmation').each(function () { const $checkbox = $(this); const $target = $checkbox .closest('.everest-forms-panel-field-toggle') .next('.preview-confirm-select-wrapper'); if ($checkbox.is(':checked')) { $target.show(); } else { $target.hide(); } $checkbox.on('change', function () { if ($(this).is(':checked')) { $target.show(); } else { $target.hide(); } }); }); }, bindSaveOptionWithKeyEvent: function () { $('body').on('keydown', function (e) { if (e.ctrlKey || e.metaKey) { if ( 's' === String.fromCharCode(e.which).toLowerCase() || 83 === e.which ) { e.preventDefault(); $('.everest-forms-save-button').trigger('click'); } } }); }, bindOpenShortcutKeysModalWithKeyEvent: function () { $('body').on('keydown', function (e) { if (e.ctrlKey || e.metaKey) { if ( 'h' === String.fromCharCode(e.which).toLowerCase() || 72 === e.which ) { e.preventDefault(); var shortcut_keys_html = ''; $.each(evf_data.i18n_shortcut_keys, function (key, value) { shortcut_keys_html += `
    • ${value}
      ${key.split('+')[0]} ${key.split('+')[1]}
    `; }); $.alert({ title: evf_data.i18n_shortcut_key_title, content: shortcut_keys_html, icon: 'dashicons dashicons-info', type: 'blue', boxWidth: '550px', buttons: { confirm: { text: evf_data.i18n_close, btnClass: 'btn-confirm', keys: ['enter'], }, }, onContentReady: function () { $('body').on('keydown', function (e) { if ( e.ctrlKey || (e.metaKey && 'h' === String.fromCharCode(e.which).toLowerCase()) || 72 === e.which ) { $('.btn-confirm').trigger('click'); } }); }, }); } } }); }, getStructure: function () { var wrapper = $('.evf-admin-field-wrapper'); var structure = []; $.each(wrapper.find('.evf-admin-row'), function () { var $row = $(this), row_id = $row.attr('data-row-id'); $.each($row.find('.evf-admin-grid'), function () { var $grid = $(this), grid_id = $grid.attr('data-grid-id'); var array_index = 0; $.each($grid.find('.everest-forms-field'), function () { var structure_object = { name: '', value: '' }; var field_id = $(this).attr('data-field-id'); structure_object.name = 'structure[row_' + row_id + '][grid_' + grid_id + '][' + array_index + ']'; array_index++; structure_object.value = field_id; structure.push(structure_object); }); if ($grid.find('.everest-forms-field').length < 1) { structure.push({ name: 'structure[row_' + row_id + '][grid_' + grid_id + ']', value: '', }); } }); }); return structure; }, getFieldArray: function (grid) { var fields = []; $.each(grid.find('.everest-forms-field'), function () { var field_id = $(this).attr('data-field-id'); fields.push(field_id); }); return fields; }, checkEmptyGrid: function ($force) { $.each($('.evf-admin-grid'), function () { var $fields = $(this).find( '.everest-forms-field, .evf-registered-item:not(.ui-draggable-dragging)', ); if ($fields.not('.ui-sortable-helper').length < 1) { $(this).addClass('evf-empty-grid'); } else { $(this).removeClass('evf-empty-grid'); } }); EVFPanelBuilder.choicesInit(); }, captureStyleTabBaseline: function () { var $form = $('form#everest-forms-builder-form'); if ($form.length) { evfStyleTabBaseline = $form.serialize(); } }, hasUnsavedFieldChanges: function () { var $form = $('form#everest-forms-builder-form'); if (null === evfStyleTabBaseline || !$form.length) { return false; } return $form.serialize() !== evfStyleTabBaseline; }, bindDefaultTabs: function () { $(document).on('click', '.evf-nav-tab-wrapper a', function (e) { e.preventDefault(); EVFPanelBuilder.switchTab($(this).data('panel')); }); }, toggleUnsavedStyleNotice: function () { if ('function' === typeof window.evfScv2SetFormDirty) { window.evfScv2SetFormDirty(EVFPanelBuilder.hasUnsavedFieldChanges()); } }, switchTab: function (panel) { var $panel = $('#everest-forms-panel-' + panel), $panelBtn = $('.evf-panel-' + panel + '-button'); // Guard against silently losing unsaved Style Customizer changes when switching // away via this in-app tab click — the existing `beforeunload` handler only // catches a real page close/reload, not this SPA-style panel switch. var currentPanel = $('.evf-nav-tab-wrapper').find('a.nav-tab-active').data('panel'); if ( 'style' === currentPanel && panel !== currentPanel && 'function' === typeof window.evfScv2IsDirty && window.evfScv2IsDirty() ) { if (!window.confirm(evf_data.i18n_unsaved_style_changes)) { return; } } $('.evf-nav-tab-wrapper').find('a').removeClass('nav-tab-active'); $panelBtn.addClass('nav-tab-active'); $panel .closest('.evf-tab-content') .find('.everest-forms-panel') .removeClass('active'); $panel.addClass('active'); if ('integrations' === panel) { var $firstConnected = $panel .find('.everest-forms-panel-sidebar a') .not('.evf-addon-install-trigger') .not('.upgrade-addons-settings') .first(); if ($firstConnected.length) { $firstConnected.trigger('click'); } else { $panel .find('.everest-forms-panel-sidebar a') .first() .addClass('active'); } } else if ('payments' === panel) { if (!$panel.find('.everest-forms-panel-sidebar a').hasClass('active')) { $panel .find('.everest-forms-panel-sidebar a') .first() .addClass('active'); } if ( !$('.everest-forms-panel-content') .find('.evf-panel-content-section') .hasClass('active') ) { $('.everest-forms-panel-content') .find('.evf-panel-content-section') .first() .addClass('active'); } } history.replaceState( {}, null, EVFPanelBuilder.updateQueryString('tab', panel), ); EVFPanelBuilder.switchPanel(panel); EVFPanelBuilder.toggleUnsavedStyleNotice(); }, updateQueryString: function (key, value, url) { if (!url) url = window.location.href; var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi'), hash; if (re.test(url)) { if (typeof value !== 'undefined' && value !== null) return url.replace(re, '$1' + key + '=' + value + '$2$3'); else { hash = url.split('#'); url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, ''); if (typeof hash[1] !== 'undefined' && hash[1] !== null) url += '#' + hash[1]; return url; } } else { if (typeof value !== 'undefined' && value !== null) { var separator = url.indexOf('?') !== -1 ? '&' : '?'; hash = url.split('#'); url = hash[0] + separator + key + '=' + value; if (typeof hash[1] !== 'undefined' && hash[1] !== null) url += '#' + hash[1]; return url; } else { return url; } } }, switchPanel: function (panel) { if (panel === 'field-options') { EVFPanelBuilder.switchToFieldOptionPanel(); } }, switchToFieldOptionPanel: function (field_id) { $('.everest-forms-field-options').find('.no-fields').hide(); $('.evf-admin-field-wrapper .everest-forms-field').removeClass('active'); $('#everest-forms-panel-fields').addClass('active'); $('.everest-forms-fields-tab').find('a').removeClass('active'); $('.everest-forms-fields-tab').find('a').last().addClass('active'); $('.everest-forms-add-fields').hide(); $('.everest-forms-field-options').show(); $('.everest-forms-field-options') .find('.everest-forms-field-option') .hide(); $('.evf-tab-lists').find('li a').removeClass('active'); $('.evf-tab-lists') .find('li.evf-panel-field-options-button a') .addClass('active'); $(document.body).trigger('evf-init-switch-field-options'); if (typeof field_id !== 'undefined') { var $fieldOptions = $('#everest-forms-field-option-' + field_id); if ($fieldOptions.length > 0) { var $basicGroup = $('#everest-forms-field-option-basic-' + field_id); $basicGroup .removeClass('closed') .addClass('open') .find('.everest-forms-field-option-group-inner') .show(); const $tempLink = $('').appendTo( document.body, ); $tempLink[0].click(); setTimeout(() => { $tempLink.remove(); }, 100); } $('#everest-forms-field-option-' + field_id).show(); /** * Close all field option groups except basic group * This is to ensure that only basic group is open when switching to field options. * * @since 3.2.4 */ $('#everest-forms-field-option-' + field_id) .find('.everest-forms-field-option-group') .each(function () { $field_options_element = $(this); if ( !$field_options_element.hasClass( 'everest-forms-field-option-group-basic', ) ) { if ($field_options_element.hasClass('open')) { $field_options_element.removeClass('open').addClass('closed'); $field_options_element .find('.everest-forms-field-option-group-inner') .hide(); } } }); $('#everest-forms-field-' + field_id).addClass('active'); } else { if ($('.evf-admin-field-wrapper .everest-forms-field').length > 0) { $('.evf-admin-field-wrapper .everest-forms-field') .eq(0) .addClass('active'); $( '#everest-forms-field-option-' + $('.evf-admin-field-wrapper .everest-forms-field') .eq(0) .attr('data-field-id'), ).show(); } else { $('.everest-forms-field-options').find('.no-fields').show(); } } }, bindFields: function () { $('.evf-admin-field-wrapper') .sortable({ items: '.evf-admin-row', axis: 'y', cursor: 'move', opacity: 0.65, scrollSensitivity: 40, forcePlaceholderSize: true, placeholder: 'evf-sortable-placeholder', containment: '.everest-forms-panel-content', start: function (event, ui) { ui.item.css({ backgroundColor: '#f7fafc', border: '1px dashed #5d96ee', }); }, stop: function (event, ui) { ui.item.removeAttr('style'); }, }) .disableSelection(); $('.evf-admin-grid') .sortable({ items: '> .everest-forms-field[data-field-type!="repeater-fields"]', delay: 100, opacity: 0.65, cursor: 'move', scrollSensitivity: 40, forcePlaceholderSize: true, connectWith: '.evf-admin-grid', appendTo: document.body, tolerance: 'pointer', out: function (event) { $('.evf-admin-grid').removeClass('evf-hover'); $(event.target).removeClass('evf-item-hover'); $(event.target).closest('.evf-admin-row').removeClass('evf-hover'); EVFPanelBuilder.checkEmptyGrid(); }, over: function (event, ui) { if (!ui.item.hasClass('required')) { ui.item.find('.required').remove(); } $('.evf-admin-grid').addClass('evf-hover'); $(event.target).addClass('evf-item-hover'); $(event.target).closest('.evf-admin-row').addClass('evf-hover'); EVFPanelBuilder.checkEmptyGrid(); // Resize helper to fit the target column on entry if (ui.helper.data('origWidth') === undefined) { ui.helper.data('origWidth', ui.helper.width()); } var newWidth = Math.min(ui.helper.data('origWidth'), $(this).width()); ui.helper.css('width', newWidth + 'px'); }, sort: function (event, ui) { // sort() fires continuously on the SOURCE grid on every mousemove. // Use ui.placeholder to find the DESTINATION grid regardless of which // grid's sort handler is executing, then pin helper to that column. var dragInst = $.ui.ddmanager && $.ui.ddmanager.current; if (!dragInst || !dragInst.offset || !dragInst.offset.click) return; if (!ui.placeholder) return; // Cache the destination grid and its offset to reduce DOM queries if (!dragInst._evf_destGrid || dragInst._evf_destGrid !== ui.placeholder[0].parentElement) { dragInst._evf_destGrid = ui.placeholder.closest('.evf-admin-grid')[0]; if (!dragInst._evf_destGrid) return; dragInst._evf_destGridOffset = null; // Invalidate cached offset when grid changes } var destGrid = dragInst._evf_destGrid; if (!dragInst._evf_destGridOffset) { dragInst._evf_destGridOffset = $(destGrid).offset().left; } if (ui.helper.data('origWidth') === undefined) { ui.helper.data('origWidth', ui.helper.width()); } dragInst.offset.click.left = Math.max(5, Math.min(event.pageX - dragInst._evf_destGridOffset, ui.helper.width() - 5)); }, receive: function (event, ui) { if (ui.sender.is('button')) { EVFPanelBuilder.fieldDrop(ui.helper); } }, update: function (event, ui) { $(document).trigger('evf_sort_update_complete', { event: event, ui: ui, }); }, stop: function (event, ui) { if (!ui.item.hasClass('required')) { const labelTitle = ui.item.find('.label-title'); if (labelTitle.length > 0) { labelTitle.append('*'); } } ui.item.removeAttr('style'); EVFPanelBuilder.checkEmptyGrid(); }, }) .disableSelection(); $( '.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)', ) .draggable({ delay: 200, cancel: false, scroll: false, revert: 'invalid', scrollSensitivity: 40, forcePlaceholderSize: true, start: function () { $(this).addClass('field-dragged'); }, helper: function () { return $(this) .clone() .insertAfter( $(this) .closest('.everest-forms-tab-content') .siblings('.everest-forms-fields-tab'), ); }, stop: function () { $(this).removeClass('field-dragged'); }, opacity: 0.75, containment: '#everest-forms-builder', connectToSortable: '.evf-admin-grid', }) .disableSelection(); // Layout presets (sidebar): draggable onto canvas only — always creates a new row (never a grid cell). $('.evf-layout-container-btn').each(function () { var $btn = $(this); if ($btn.data('ui-draggable')) { $btn.draggable('destroy'); } var cursorLeft = Math.round($btn.outerWidth() / 2), cursorTop = Math.round($btn.outerHeight() / 2); $btn.draggable({ delay: 0, distance: 2, cancel: false, scroll: false, revert: 'invalid', appendTo: 'body', zIndex: 100050, start: function (event, ui) { $(this).addClass('field-dragged'); $('#everest-forms-builder').addClass( 'evf-is-dragging-layout-container', ); var cx = event.clientX - cursorLeft, cy = event.clientY - cursorTop; ui.helper.css({ position: 'fixed', margin: 0, left: cx, top: cy, pointerEvents: 'none', boxSizing: 'border-box', }); setTimeout(function () { ui.helper.css({ left: cx, top: cy }); }, 0); }, helper: function () { return $(this) .clone() .addClass('evf-layout-container-drag-helper') .css({ width: $(this).outerWidth(), boxSizing: 'border-box', }) .appendTo(document.body); }, drag: function (event, ui) { ui.position.left = event.clientX - cursorLeft; ui.position.top = event.clientY - cursorTop; var $activeZone = $('#everest-forms-builder').data( 'evf-layout-active-drop-zone', ); if ($activeZone && $activeZone.length) { updateLayoutDropIndicator($activeZone, event.pageY); } }, stop: function () { $(this).removeClass('field-dragged'); $('#everest-forms-builder').removeClass( 'evf-is-dragging-layout-container', ); $('#everest-forms-builder').removeData( 'evf-layout-active-drop-zone', ); $('.evf-layout-drop-target-hover').removeClass( 'evf-layout-drop-target-hover', ); clearLayoutDropIndicators(); }, opacity: 0.92, }); }); var layoutDropAccept = function (draggable) { return $(draggable).hasClass('evf-layout-container-btn'); }; var clearLayoutDropIndicators = function () { $('.evf-admin-row').removeClass( 'evf-layout-insert-before evf-layout-insert-after', ); $( '.evf-admin-field-wrapper, [id^="part_"], .evf-add-row:not(.repeater-row)', ).removeClass('evf-layout-insert-empty evf-layout-insert-after-all'); }; var updateLayoutDropIndicator = function ($zone, pageY) { var $rows = $zone.children('.evf-admin-row'), $beforeRow = null, $afterRow = null; $rows.removeClass('evf-layout-insert-before evf-layout-insert-after'); $zone.removeClass('evf-layout-insert-empty'); if (!$rows.length) { $zone.addClass('evf-layout-insert-empty'); return; } $rows.each(function () { var $r = $(this), top = $r.offset().top, mid = top + $r.outerHeight() / 2; if (pageY < mid) { $beforeRow = $r; return false; } $afterRow = $r; }); if ($beforeRow && $beforeRow.length) { $beforeRow.addClass('evf-layout-insert-before'); } else if ($afterRow && $afterRow.length) { $afterRow.addClass('evf-layout-insert-after'); } }; var queueLayoutInsert = function (callback) { window.setTimeout(callback, 0); }; EVFPanelBuilder.getLayoutDropZones().each(function () { var $zone = $(this); if ($zone.data('ui-droppable')) { $zone.droppable('destroy'); } $zone.droppable({ accept: layoutDropAccept, tolerance: 'pointer', greedy: false, over: function (event) { var $zone = $(this); $zone.addClass('evf-layout-drop-target-hover'); $('#everest-forms-builder').data( 'evf-layout-active-drop-zone', $zone, ); updateLayoutDropIndicator($zone, event.pageY); }, out: function () { $(this).removeClass('evf-layout-drop-target-hover'); $('#everest-forms-builder').removeData( 'evf-layout-active-drop-zone', ); clearLayoutDropIndicators(); }, drop: function (event, ui) { $(this).removeClass('evf-layout-drop-target-hover'); $('#everest-forms-builder').removeData( 'evf-layout-active-drop-zone', ); clearLayoutDropIndicators(); var columns = parseInt(ui.draggable.data('columns'), 10); if (!columns || columns < 1) { return; } var $z = $(this), y = event.pageY, $rows = $z.children('.evf-admin-row'), $beforeRow = null, $afterRow = null; $rows.each(function () { var $r = $(this), top = $r.offset().top, mid = top + $r.outerHeight() / 2; if (y < mid) { $beforeRow = $r; return false; } $afterRow = $r; }); if ($beforeRow && $beforeRow.length) { queueLayoutInsert(function () { EVFPanelBuilder.addLayoutContainer( columns, null, $beforeRow, $z, ); }); } else if ($afterRow && $afterRow.length) { queueLayoutInsert(function () { EVFPanelBuilder.addLayoutContainer( columns, $afterRow, null, $z, ); }); } else { queueLayoutInsert(function () { EVFPanelBuilder.addLayoutContainer( columns, null, null, $z, ); }); } }, }); }); $('.evf-add-row:not(.repeater-row)').each(function () { var $addStrip = $(this); if ($addStrip.data('ui-droppable')) { $addStrip.droppable('destroy'); } $addStrip.droppable({ accept: layoutDropAccept, tolerance: 'pointer', over: function () { $(this).addClass('evf-layout-drop-target-hover'); $(this).addClass('evf-layout-insert-after-all'); }, out: function () { $(this).removeClass('evf-layout-drop-target-hover'); $(this).removeClass('evf-layout-insert-after-all'); }, drop: function (event, ui) { $(this).removeClass('evf-layout-drop-target-hover'); $(this).removeClass('evf-layout-insert-after-all'); clearLayoutDropIndicators(); var columns = parseInt(ui.draggable.data('columns'), 10); if (!columns || columns < 1) { return; } var $ctx = $(this), wrapper = $('.evf-admin-field-wrapper'), current_part = $ctx .closest('.evf-admin-field-container') .attr('data-current-part'); if (current_part) { var $pw = wrapper.find('#part_' + current_part); if ($pw.length) { wrapper = $pw; } } var $last = wrapper.children('.evf-admin-row').last(); if ($last.length) { queueLayoutInsert(function () { EVFPanelBuilder.addLayoutContainer( columns, $last, null, $ctx, ); }); } else { queueLayoutInsert(function () { EVFPanelBuilder.addLayoutContainer( columns, null, null, $ctx, ); }); } }, }); }); // Repeatable grid connect to sortable setter. $('.evf-registered-item.evf-repeater-field').draggable( 'option', 'connectToSortable', '.evf-repeatable-grid', ); // Adapt hover behaviour on mouse event. $('.evf-admin-row').on('mouseenter mouseleave', function (event) { if (1 > event.buttons) { if ('mouseenter' === event.type) { $(this).addClass('evf-hover'); } else { $('.evf-admin-row:not(.evf-popover-open)').removeClass('evf-hover'); } } }); // Refresh the position of placeholders on drag scroll. $('.everest-forms-panel-content').on('scroll', function () { $('.evf-admin-grid').sortable('refreshPositions'); $('.evf-admin-field-wrapper').sortable('refreshPositions'); }); $('.evf-admin-field-wrapper .evf-admin-row').each(function () { if (!$(this).find('.evf-add-field-to-row').length) { $(this) .find('.evf-toggle-row') .prepend( '
    ' + '' + '
    ', ); } }); $('.evf-admin-field-wrapper .everest-forms-field').each(function () { if (!$(this).find('.evf-add-field-below').length) { $(this).append( '
    ' + '' + '
    ', ); } }); }, /** * Populate the row field popover with tabs and field items from the sidebar. */ populateRowPopover: function () { var $tabs = $('#evf-row-field-popover .evf-popover-tabs').empty(), $fields = $('#evf-row-field-popover .evf-popover-fields').empty(), blocked = [ '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', ]; $tabs.append( '', ); $('.everest-forms-add-fields-group').each(function () { // Exclude the layout group from the field-picker popover entirely. if ($(this).hasClass('evf-layout-group')) { return; } var $heading = $(this).find('.everest-forms-add-fields-heading'), groupKey = $heading.data('group'), groupLabel = $heading.clone().children().remove().end().text().trim(); if (groupKey) { $tabs.append( '', ); } $(this) .find('.evf-registered-item') .each(function () { var $btn = $(this), fieldType = $btn.data('field-type'), fieldLabel = $btn.text().trim(), iconHtml = $btn.find('i').length ? $btn.find('i').prop('outerHTML') : '', blockedClass = (function () { for (var i = 0; i < blocked.length; i++) { if ($btn.hasClass(blocked[i])) { return blocked[i]; } } return ''; }()), isBlocked = blockedClass !== '', isProLocked = $btn.hasClass('upgrade-modal') || $btn.hasClass('evf-upgrade-addon'); // Skip items with no field type or no label — avoids blank popover entries. if (!fieldType || !fieldLabel) { return; } $fields.append( $( '
    ', ) .attr('data-field-type', fieldType) .attr('data-field-label', fieldLabel) .attr('data-field-group', groupKey || '') .attr('data-blocked-class', blockedClass || null) .append( '' + iconHtml + '', ) .append( '' + fieldLabel + '', ), ); }); }); }, /** * Bind the row-level "+" button and its field-picker popover. */ bindRowFieldPopover: function () { var proIconUrl = ( function () { var locked = document.querySelector( '.evf-registered-item.upgrade-modal', ); if ( ! locked ) { return ''; } return window .getComputedStyle( locked, '::before' ) .backgroundImage.replace( /^url\(["']?/, '' ) .replace( /["']?\)$/, '' ); }() ); if (!$('#evf-row-popover-style').length) { $('head').append( '', ); } if (!$('#evf-row-field-popover').length) { $('body').append( '
    ' + '
    ' + '
    ' + '' + '' + '
    ' + '
    ' + '' + '
    ' + '' + '
    ' + '
    ' + '
    ', ); } EVFPanelBuilder.populateRowPopover(); var positionPopover = function ($anchor, $pop, forceFlipped) { var offset = $anchor.offset(), scrollLeft = $(window).scrollLeft(), scrollTop = $(window).scrollTop(), vpW = window.innerWidth, vpH = window.innerHeight, popW = $pop.outerWidth(), $fieldsWrap = $pop.find('.evf-popover-fields-wrap'), defaultFieldsMaxHeight = 320, popH, margin = 8, anchorCX = offset.left - scrollLeft + $anchor.outerWidth() / 2, anchorTop = offset.top - scrollTop, belowTop = anchorTop + $anchor.outerHeight() + 6, aboveTop, top, left = anchorCX - popW / 2, flipped = false; $fieldsWrap.css('max-height', defaultFieldsMaxHeight + 'px'); popH = $pop.outerHeight(); var maxPopoverHeight = vpH - margin * 2; if (popH > maxPopoverHeight) { var staticHeight = popH - $fieldsWrap.outerHeight(); $fieldsWrap.css( 'max-height', Math.max(140, maxPopoverHeight - staticHeight) + 'px', ); popH = $pop.outerHeight(); } aboveTop = anchorTop - popH - 6; left = Math.min(Math.max(margin, left), vpW - popW - margin); var fitsBelow = belowTop + popH <= vpH - margin, fitsAbove = aboveTop >= margin; if (forceFlipped !== undefined) { flipped = forceFlipped; if (flipped && !fitsAbove && fitsBelow) { flipped = false; } else if (!flipped && !fitsBelow && fitsAbove) { flipped = true; } } else if (fitsBelow) { flipped = false; } else if (fitsAbove) { flipped = true; } else { var spaceBelow = vpH - margin - belowTop, spaceAbove = anchorTop - margin - 6; flipped = spaceAbove > spaceBelow; } top = flipped ? aboveTop : belowTop; top = Math.max(margin, Math.min(top, vpH - popH - margin)); var arrowX = anchorCX - left - 7; arrowX = Math.min(Math.max(14, arrowX), popW - 28); $pop .toggleClass('evf-popover-flipped', flipped) .find('.evf-popover-arrow') .css('left', arrowX + 'px'); return { top: top, left: left }; }; var updateTabArrows = function () { var tabs = document.querySelector( '#evf-row-field-popover .evf-popover-tabs', ); if (!tabs) return; $('.evf-tabs-arrow-left').toggleClass( 'evf-tabs-arrow-visible', tabs.scrollLeft > 1, ); $('.evf-tabs-arrow-right').toggleClass( 'evf-tabs-arrow-visible', Math.ceil(tabs.scrollLeft + tabs.clientWidth) < tabs.scrollWidth, ); }; $(document.body).on( 'click', '#evf-row-field-popover .evf-tabs-arrow', function (e) { e.stopPropagation(); var tabs = document.querySelector( '#evf-row-field-popover .evf-popover-tabs', ); if (!tabs) return; var step = 120; tabs.scrollLeft += $(this).hasClass('evf-tabs-arrow-left') ? -step : step; setTimeout(updateTabArrows, 200); }, ); $(document.body).on( 'scroll', '#evf-row-field-popover .evf-popover-tabs', updateTabArrows, ); $(document.body).on('click', '.evf-add-field-to-row', function (e) { e.stopPropagation(); var $btn = $(this), $row = $btn.closest('.evf-admin-row'), $popover = $('#evf-row-field-popover'); if ($popover.is(':visible') && $row.hasClass('evf-popover-open')) { $popover.hide(); $row.removeClass('evf-popover-open'); $('.everest-forms-field.evf-field-popover-open').removeClass( 'evf-field-popover-open', ); return; } EVFPanelBuilder.populateRowPopover(); $('.evf-admin-row.evf-popover-open').removeClass('evf-popover-open'); $('.everest-forms-field.evf-field-popover-open').removeClass( 'evf-field-popover-open', ); $row.addClass('evf-popover-open'); var pos = positionPopover($btn, $popover); $popover .data('target-row', $row) .data('insert-after-field', null) .data('anchor', $btn) .css(pos) .show(); updateTabArrows(); $('#evf-popover-search').val('').trigger('input').focus(); }); $(document.body).on('click', '.evf-add-field-below', function (e) { e.stopPropagation(); var $btn = $(this), $field = $btn.closest('.everest-forms-field'), $row = $field.closest('.evf-admin-row'), $popover = $('#evf-row-field-popover'); var $prevField = $popover.data('insert-after-field'); if ( $popover.is(':visible') && $row.hasClass('evf-popover-open') && $prevField && $prevField[0] === $field[0] ) { $popover.hide(); $row.removeClass('evf-popover-open'); $field.removeClass('evf-field-popover-open'); return; } EVFPanelBuilder.populateRowPopover(); $('.evf-admin-row.evf-popover-open').removeClass('evf-popover-open'); $('.everest-forms-field.evf-field-popover-open').removeClass( 'evf-field-popover-open', ); $row.addClass('evf-popover-open'); $field.addClass('evf-field-popover-open'); var pos = positionPopover($btn, $popover); $popover .data('target-row', $row) .data('insert-after-field', $field) .data('anchor', $btn) .css(pos) .show(); updateTabArrows(); $('#evf-popover-search').val('').trigger('input').focus(); }); $(document.body).on( 'click', '.evf-admin-grid.evf-empty-grid', function (e) { e.stopPropagation(); var $grid = $(this), $row = $grid.closest('.evf-admin-row'), $popover = $('#evf-row-field-popover'); var $prevGrid = $popover.data('insert-into-grid'); if ( $popover.is(':visible') && $row.hasClass('evf-popover-open') && $prevGrid && $prevGrid[0] === $grid[0] ) { $popover.hide().removeData('insert-into-grid'); $row.removeClass('evf-popover-open'); return; } EVFPanelBuilder.populateRowPopover(); $('.evf-admin-row.evf-popover-open').removeClass('evf-popover-open'); $('.everest-forms-field.evf-field-popover-open').removeClass( 'evf-field-popover-open', ); $row.addClass('evf-popover-open'); var pos = positionPopover($grid, $popover); $popover .data('target-row', $row) .data('insert-after-field', null) .data('insert-into-grid', $grid) .data('anchor', $grid) .css(pos) .show(); updateTabArrows(); $('#evf-popover-search').val('').trigger('input').focus(); }, ); $(document).on('click.evf-row-popover', function (e) { if ( !$(e.target).closest( '#evf-row-field-popover, .evf-add-field-to-row, .evf-add-field-below, .evf-admin-grid.evf-empty-grid', ).length ) { $('#evf-row-field-popover').hide().removeData('insert-into-grid'); $('.evf-admin-row.evf-popover-open').removeClass('evf-popover-open'); $('.everest-forms-field.evf-field-popover-open').removeClass( 'evf-field-popover-open', ); } }); $(document.body).on('evf_after_field_append', function (e, fieldId) { var $field = $('#' + fieldId); if ($field.length && !$field.find('.evf-add-field-below').length) { $field.append( '
    ' + '' + '
    ', ); } }); $(document.body).on('input', '#evf-popover-search', function () { var term = $(this).val().toLowerCase().trim(); $('#evf-row-field-popover .evf-popover-field-item').each(function () { $(this).toggle( !term || $(this).data('field-label').toLowerCase().indexOf(term) >= 0, ); }); $('.evf-popover-tab').removeClass('active'); $('.evf-popover-tab[data-group="all"]').addClass('active'); $('.evf-popover-no-results').remove(); if ( !$('#evf-row-field-popover .evf-popover-field-item:visible').length ) { $('#evf-row-field-popover .evf-popover-fields').append( '
    No fields found.
    ', ); } }); $(document.body).on( 'click', '#evf-row-field-popover .evf-popover-tab', function () { var group = $(this).data('group'); $('.evf-popover-tab').removeClass('active'); $(this).addClass('active'); $('#evf-popover-search').val(''); $('#evf-row-field-popover .evf-popover-field-item').each(function () { $(this).toggle( 'all' === group || $(this).data('field-group') === group, ); }); $('.evf-popover-no-results').remove(); var $pop = $('#evf-row-field-popover'), $storedAnchor = $pop.data('anchor'); if ($storedAnchor && $storedAnchor.length) { $pop.css( positionPopover( $storedAnchor, $pop, $pop.hasClass('evf-popover-flipped'), ), ); } this.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest', }); setTimeout(updateTabArrows, 200); }, ); $(document.body).on( 'click', '#evf-row-field-popover .evf-popover-field-item:not(.evf-field-blocked)', function () { var $item = $(this), fieldType = $item.data('field-type'), fieldLabel = $item.data('field-label'), $popover = $('#evf-row-field-popover'), $insertAfterField = $popover.data('insert-after-field'), $insertIntoGrid = $popover.data('insert-into-grid'), $placeholder = $('