/*! * WPMU DEV Forminator UI * Copyright 2019 Incsub (https://incsub.com) * Licensed under GPL v3 (http://www.gnu.org/licenses/gpl-3.0.html) */ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } (function ($) { // Enable strict mode. 'use strict'; // Define global SUI object if it doesn't exist. if ('object' !== _typeof(window.FUI)) { window.FUI = {}; } FUI.inputStates = function (el) { var input = $(el); var form = input.closest('form'); if (!input.is('input') && (!form.is('.forminator-poll') || !form.is('.forminator-ui') && !form.is('.forminator-custom-form'))) { return; } function hover(element) { var getInput = $(element); var getField = getInput.closest('.forminator-field'); getField.off('mouseenter.forminatorHoverState mouseleave.forminatorHoverState').on('mouseenter.forminatorHoverState', function (e) { getField.addClass('forminator-is_hover'); e.stopPropagation(); }).on('mouseleave.forminatorHoverState', function (e) { getField.removeClass('forminator-is_hover'); e.stopPropagation(); }); } function focused(element) { var getInput = $(element); var getField = getInput.closest('.forminator-field'); getInput.focus(function (e) { getField.addClass('forminator-is_active'); e.stopPropagation(); }).blur(function (e) { getField.removeClass('forminator-is_active'); e.stopPropagation(); }); } function filled(element) { var getInput = $(element); var getField = getInput.closest('.forminator-field'); // On input load if ('' !== getInput.val().trim()) { getField.addClass('forminator-is_filled'); } // On input changes getInput.on('change', function () { if ('' !== getInput.val().trim()) { getField.addClass('forminator-is_filled'); } else { getField.removeClass('forminator-is_filled'); } }); } function init() { input.each(function () { hover(this); focused(this); filled(this); }); } init(); return this; }; })(jQuery); (function ($) { // Enable strict mode. 'use strict'; // Define global SUI object if it doesn't exist. if ('object' !== _typeof(window.FUI)) { window.FUI = {}; } FUI.inputMaterial = function (el) { var input = $(el); var field = input.closest('.forminator-field'); var label = field.find('.forminator-label'); var form = input.closest('form'); if (!input.is('input') && (!form.is('.forminator-poll') || !form.is('.forminator-ui') && !form.is('.forminator-custom-form'))) { return; } function init() { // Wrap Element if (!input.parent().hasClass('forminator-input--wrap')) { input.wrap('
'); } // Wrap Label if (label.length) { // Add floating class label.addClass('forminator-floating--input'); // If input has description adjancent to label then calculate it';s height and set --forminator-floating-label-translate css variable var description = field.find('.forminator-label + .forminator-description'); if (description.length) { var descriptionHeight = description.outerHeight(); var labelHeight = label.outerHeight(); var translateY = descriptionHeight + labelHeight + 16; // 16px margin label.css('--forminator-floating-label-translate', translateY + 'px'); } // Add icon class (if applies) if (field.find('.forminator-input-with-icon').length) { label.addClass('forminator-has_icon'); } // Add phone class (if applies) if (field.find('.forminator-input-with-phone').length) { label.addClass('forminator-has_phone'); if (field.find('.intl-tel-input').hasClass('allow-dropdown')) { label.addClass('allow-dropdown'); } } } } init(); return this; }; })(jQuery); (function ($) { // Enable strict mode. 'use strict'; // Define global SUI object if it doesn't exist. if ('object' !== _typeof(window.FUI)) { window.FUI = {}; } FUI.textareaStates = function (el) { var textarea = $(el); var form = textarea.closest('form'); if (!textarea.is('textarea') && !form.is('.forminator-ui') && !form.is('.forminator-custom-form')) { return; } function hover(element) { var getTextarea = $(element); var getField = getTextarea.closest('.forminator-field'); getField.off('mouseenter.forminatorHoverState mouseleave.forminatorHoverState').on('mouseenter.forminatorHoverState', function (e) { getField.addClass('forminator-is_hover'); e.stopPropagation(); }).on('mouseleave.forminatorHoverState', function (e) { getField.removeClass('forminator-is_hover'); e.stopPropagation(); }); } function focused(element) { var getTextarea = $(element); var getField = getTextarea.closest('.forminator-field'); getTextarea.focus(function (e) { getField.addClass('forminator-is_active'); e.stopPropagation(); }).blur(function (e) { getField.removeClass('forminator-is_active'); e.stopPropagation(); }); } function filled(element) { var getTextarea = $(element); var getField = getTextarea.closest('.forminator-field'); // On textarea load getTextarea.on('load', function () { if ('' !== getTextarea.val().trim()) { getField.addClass('forminator-is_filled'); } }); // On textarea changes getTextarea.on('change', function () { if ('' !== getTextarea.val().trim()) { getField.addClass('forminator-is_filled'); } else { getField.removeClass('forminator-is_filled'); } }); } function init() { textarea.each(function () { hover(this); focused(this); filled(this); }); } init(); return this; }; })(jQuery); (function ($) { // Enable strict mode. 'use strict'; // Define global SUI object if it doesn't exist. if ('object' !== _typeof(window.FUI)) { window.FUI = {}; } FUI.textareaMaterial = function (el) { var textarea = $(el); var field = textarea.closest('.forminator-field'); var label = field.find('.forminator-label'); var form = textarea.closest('form'); if (!textarea.is('textarea') && !form.is('.forminator-ui') && !form.is('.forminator-custom-form')) { return; } if (textarea.hasClass('wp-editor-area')) { return; } function init() { // Wrap Element if (!textarea.parent().hasClass('forminator-textarea--wrap')) { textarea.wrap(''); } // Wrap Label if (label.length) { // Add floating class label.addClass('forminator-floating--textarea'); // If input has description adjancent to label then calculate it';s height and set --forminator-floating-label-translate css variable var description = field.find('.forminator-label + .forminator-description'); if (description.length) { var descriptionHeight = description.outerHeight(); var translateY = descriptionHeight; label.css('--forminator-floating-label-translate', translateY + 'px'); } // Align textarea field.css({ 'position': 'relative' }); if (textarea.val()) { field.addClass('forminator-is_filled'); } } } init(); return this; }; })(jQuery); (function ($) { // Enable strict mode. 'use strict'; // Define global FUI object if it doesn't exist. if ('object' !== _typeof(window.FUI)) { window.FUI = {}; } FUI.radioStates = function (el) { var label = $(el); var input = label.find('input'); if (!label.is('label') || 'radio' !== input.prop('type')) { return; } function init() { input.each(function () { $(this).on('click', function () { var radioInput = $(this); var radioLabel = radioInput.parent(); var radioField = radioLabel.closest('.forminator-field'); var radioOptions = radioField.find('.forminator-radio'); // Remove checked attribute radioOptions.find('input').prop('checked', false); // Remove checked class radioOptions.removeClass('forminator-is_checked'); // Assign checked attribute radioInput.prop('checked', 'checked'); // Assign checked class radioLabel.addClass('forminator-is_checked'); }); }); } init(); return this; }; })(jQuery); (function ($) { // Enable strict mode. 'use strict'; // Define global FUI object if it doesn't exist. if ('object' !== _typeof(window.FUI)) { window.FUI = {}; } FUI.checkboxStates = function (el) { var label = $(el); var input = label.find('input'); if (!label.is('label') || 'checkbox' !== input.prop('type')) { return; } function init() { input.each(function () { $(this).on('click', function () { var checkInput = $(this); var checkLabel = checkInput.parent(); if (checkLabel.is('.forminator-is_checked')) { checkLabel.removeClass('forminator-is_checked'); } else { checkLabel.addClass('forminator-is_checked'); } }); }); } init(); return this; }; })(jQuery); (function ($) { // Enable strict mode. 'use strict'; // Define global FUI object if it doesn't exist. if ('object' !== _typeof(window.FUI)) { window.FUI = {}; } FUI.multiSelectStates = function (el) { var container = $(el); var option = container.find('.forminator-option'); var input = option.find('input'); if (!container.is('.forminator-multiselect') || 0 === option.length) { return; } function init() { input.each(function () { $(this).on('click', function () { var checkInput = $(this); var checkLabel = checkInput.parent(); if (checkLabel.is('.forminator-is_checked')) { checkLabel.removeClass('forminator-is_checked'); } else { checkLabel.addClass('forminator-is_checked'); } }); }); } init(); return this; }; })(jQuery); (function ($) { // Enable strict mode 'use strict'; // Define global FUI object if it doesn't exist. if ('object' !== _typeof(window.FUI)) { window.FUI = {}; } FUI.select = {}; FUI.select.dropdownParentSelectors = ['.sui-dialog-content', '.pum-container', '.elementor-popup-modal', '.popup', '[role="dialog"]', '[role="alertdialog"]']; FUI.select.getDropdownParent = function ($select) { var $customSelectors = $select.data('dropdown-parent-selector'), $selectors = FUI.select.dropdownParentSelectors.join(', '), $popupSelectors = FUI.select.dropdownParentSelectors.join(', '), $parent = $select.closest($selectors), $formParent = $(); if ('string' === typeof $customSelectors && $customSelectors.trim().length) { $selectors = $customSelectors; $parent = $select.closest($selectors); } if ($parent.length && $parent.is($popupSelectors)) { $formParent = $select.closest('.forminator-custom-form'); if (!$formParent.length) { $formParent = $select.closest('form'); } if ($formParent.length) { $parent = $formParent; } } return $parent.length ? $parent : $(document.body); }; FUI.select.formatCheckbox = function (data, container) { var label = data.text; var selected = data.selected; var id = data.id || label.toLowerCase().replace(/\s+/g, '-'); var wrapper = document.createElement('label'); wrapper.setAttribute('for', id); wrapper.className = 'forminator-checkbox'; var input = document.createElement('input'); input.type = 'checkbox'; input.value = label; input.id = id; if (selected) { input.checked = true; } var box = document.createElement('span'); box.className = 'forminator-checkbox-box'; box.setAttribute('aria-hidden', 'true'); var text = document.createElement('span'); text.className = 'forminator-select-label'; text.textContent = label; wrapper.appendChild(input); wrapper.appendChild(box); wrapper.appendChild(text); return wrapper; }; FUI.select2 = function () { $('.forminator-custom-form').each(function () { var $element = $(this), $formid = $element.data('form-id'), $select = $element.find('.forminator-select2'); var $themes = ['bold', 'flat', 'default', 'basic', 'material', 'none']; $.each($themes, function (index, $theme) { var $dir, $language = 'en', $placeholder = 'Select', $hasSearch = -1, $hasCheckbox = false; if ($element.hasClass('forminator-design--' + $theme) && $select.length) { $select.each(function () { var $select = $(this), $parent = FUI.select.getDropdownParent($select), $dropdownClass = 'forminator-custom-form-' + $formid + ' forminator-dropdown--' + $theme; if (true === $select.data('rtl-support') || 'rtl' === $select.closest('html').attr('dir')) { $dir = 'rtl'; } else { $dir = 'ltr'; } if ($select.data('placeholder')) { $placeholder = $select.data('placeholder'); } else { $placeholder = 'Select'; } if ($select.data('language')) { $language = $select.data('language'); } else { $language = 'en'; } if (true === $select.data('search')) { $hasSearch = 0; } else { $hasSearch = -1; } if (true === $select.data('checkbox')) { $hasCheckbox = true; $dropdownClass += ' forminator-dropdown--checkbox'; } else { $hasCheckbox = false; } if ($select.prop('multiple')) { $dropdownClass += ' forminator-dropdown--multiple'; } $select.FUIselect2(_objectSpread({ dir: $dir, language: $language, placeholder: $placeholder, dropdownCssClass: $dropdownClass, minimumResultsForSearch: $hasSearch, dropdownParent: $parent }, $hasCheckbox && { closeOnSelect: false, templateResult: FUI.select.formatCheckbox, escapeMarkup: function escapeMarkup(markup) { return markup; } })).on('select2:opening', function () { if ($select.data('search-placeholder')) { $select.data('select2').$dropdown.find(':input.select2-search__field').prop('placeholder', $select.data('search-placeholder')); } else { $select.data('select2').$dropdown.find(':input.select2-search__field').prop('placeholder', $select.data('placeholder') ? $select.data('placeholder') : 'Search'); } if ($select.closest('.hustle-popup').length || $select.closest('.hustle-slidein')) { $(document.body).addClass('forminator-hustle-dropdown-fix'); } }).on('select2:closing', function () { $(document.body).removeClass('forminator-hustle-dropdown-fix'); }); }); } }); }); }; })(jQuery); (function () { // Enable strict mode. 'use strict'; // Define global FUI object if it doesn't exist. if ('object' !== _typeof(window.FUI)) { window.FUI = {}; } /** * @namespace aria */ var aria = aria || {}; // REF: Key codes. aria.KeyCode = { BACKSPACE: 8, TAB: 9, RETURN: 13, ESC: 27, SPACE: 32, PAGE_UP: 33, PAGE_DOWN: 34, END: 35, HOME: 36, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46 }; aria.Utils = aria.Utils || {}; // UTILS: Remove function. aria.Utils.remove = function (item) { if (item.remove && 'function' === typeof item.remove) { return item.remove(); } if (item.parentNode && item.parentNode.removeChild && 'function' === typeof item.parentNode.removeChild) { return item.parentNode.removeChild(item); } return false; }; // UTILS: Verify if element can be focused. aria.Utils.isFocusable = function (element) { if (0 < element.tabIndex || 0 === element.tabIndex && null !== element.getAttribute('tabIndex')) { return true; } if (element.disabled) { return false; } switch (element.nodeName) { case 'A': return !!element.href && 'ignore' != element.rel; case 'INPUT': return 'hidden' != element.type && 'file' != element.type; case 'BUTTON': case 'SELECT': case 'TEXTAREA': return true; default: return false; } }; /** * Simulate a click event. * @public * @param {Element} element the element to simulate a click on */ aria.Utils.simulateClick = function (element) { // Create our event (with options) var evt = new MouseEvent('click', { bubbles: true, cancelable: true, view: window }); // If cancelled, don't dispatch our event var canceled = !element.dispatchEvent(evt); }; // When util functions move focus around, set this true so // the focus listener can ignore the events. aria.Utils.IgnoreUtilFocusChanges = false; aria.Utils.dialogOpenClass = 'forminator-authentication-enabled'; /** * @desc Set focus on descendant nodes until the first * focusable element is found. * * @param element * DOM node for which to find the first focusable descendant. * * @returns * true if a focusable element is found and focus is set. */ aria.Utils.focusFirstDescendant = function (element) { for (var i = 0; i < element.childNodes.length; i++) { var child = element.childNodes[i]; if (aria.Utils.attemptFocus(child) || aria.Utils.focusFirstDescendant(child)) { return true; } } return false; }; // end focusFirstDescendant. /** * @desc Find the last descendant node that is focusable. * * @param element * DOM node for which to find the last focusable descendant. * * @returns * true if a focusable element is found and focus is set. */ aria.Utils.focusLastDescendant = function (element) { for (var i = element.childNodes.length - 1; 0 <= i; i--) { var child = element.childNodes[i]; if (aria.Utils.attemptFocus(child) || aria.Utils.focusLastDescendant(child)) { return true; } } return false; }; // end focusLastDescendant /** * @desc Set Attempt to set focus on the current node. * * @param element * The node to attempt to focus on. * * @returns * true if element is focused. */ aria.Utils.attemptFocus = function (element) { if (!aria.Utils.isFocusable(element)) { return false; } aria.Utils.IgnoreUtilFocusChanges = true; try { element.focus(); } catch (e) {} aria.Utils.IgnoreUtilFocusChanges = false; return document.activeElement === element; }; // end attemptFocus // Modals can open modals. Keep track of them with this array. aria.OpenDialogList = aria.OpenDialogList || new Array(0); /** * @returns the last opened dialog (the current dialog) */ aria.getCurrentDialog = function () { if (aria.OpenDialogList && aria.OpenDialogList.length) { return aria.OpenDialogList[aria.OpenDialogList.length - 1]; } }; aria.closeCurrentDialog = function () { var currentDialog = aria.getCurrentDialog(); if (currentDialog) { currentDialog.close(); return true; } return false; }; aria.handleEscape = function (event) { var key = event.which || event.keyCode; if (key === aria.Utils.ESC && aria.closeCurrentDialog()) { event.stopPropagation(); } }; document.addEventListener('keyup', aria.handleEscape); /** * @constructor * @desc Dialog object providing modal focus management. * * Assumptions: The element serving as the dialog container is present in the * DOM and hidden. The dialog container has role='dialog'. * * @param dialogId * The ID of the element serving as the dialog container. * * @param focusAfterClosed * Either the DOM node or the ID of the DOM node to focus when the * dialog closes. * * @param focusFirst * Optional parameter containing either the DOM node or the ID of the * DOM node to focus when the dialog opens. If not specified, the * first focusable element in the dialog will receive focus. */ aria.Authentication = function (dialogId, focusAfterClosed, focusFirst) { this.dialogNode = document.getElementById(dialogId); if (null === this.dialogNode) { throw new Error('No element found with id="' + dialogId + '".'); } var validRoles = ['dialog', 'alertdialog']; var isDialog = (this.dialogNode.getAttribute('role') || '').trim().split(/\s+/g).some(function (token) { return validRoles.some(function (role) { return token === role; }); }); if (!isDialog) { throw new Error('Dialog() requires a DOM element with ARIA role of dialog or alertdialog.'); } // Wrap in an individual backdrop element if one doesn't exist // Native