Commit realizado el 12:13:52 08-04-2024

This commit is contained in:
Pagina Web Monito
2024-04-08 12:13:55 -04:00
commit 0c33094de9
7815 changed files with 1365694 additions and 0 deletions

View File

@@ -0,0 +1,477 @@
/* global elementor, elementorCommon, wpformsElementorVars, elementorFrontend, Choices */
'use strict';
/**
* WPForms integration with Elementor (modern widget).
*
* @since 1.8.3
*/
var WPFormsElementorModern = window.WPFormsElementorModern || ( function( document, window, $ ) {
/**
* Public functions and properties.
*
* @since 1.8.3
*
* @type {object}
*/
var app = {
/**
* Start the engine.
*
* @since 1.8.3
*/
init: function() {
app.events();
},
/**
* Register JS events.
*
* @since 1.8.3
*/
events: function() {
// Widget events.
$( window )
.on( 'elementor/frontend/init', function( event, id, instance ) {
elementor.channels.editor.on( 'elementorWPFormsResetStyleSettings', app.confirmResetStyleSettings );
elementor.channels.editor.on( 'section:activated', app.checkForLeadForms );
elementor.hooks.addAction( 'panel/open_editor/widget/wpforms', app.widgetPanelOpen );
elementorFrontend.hooks.addAction( 'frontend/element_ready/wpforms.default', app.widgetReady );
} );
},
/**
* On section change event handler.
*
* @since 1.8.3
*
* @param {string} sectionName The current section name.
* @param {object} editor Editor instance.
*
*/
checkForLeadForms( sectionName, editor ) {
if ( sectionName !== 'field_styles' || editor.model.attributes.widgetType !== 'wpforms' ) {
return;
}
let $panelContent = editor.$childViewContainer[0];
let widgetView = editor.options.editedElementView.$el[0];
let formId = editor.model.attributes.settings.attributes.form_id;
let $form = $( widgetView ).find( `#wpforms-${formId}` );
if ( $form.length === 0 ) {
return;
}
if ( $form.hasClass( 'wpforms-lead-forms-container' ) ) {
$( $panelContent ).addClass( 'wpforms-elementor-disabled' );
$( $panelContent ).find( '.wpforms-elementor-lead-forms-notice' ).css( 'display', 'block' );
}
},
/**
* Initialize widget controls when widget is activated.
*
* @since 1.8.3
*
* @param {object} panel Panel object.
* @param {object} model Model object.
* @param {object} view View object.
*/
widgetPanelOpen: function( panel, model, view ) {
const settingsModel = model.get( 'settings' );
// Apply settings from the textarea.
settingsModel.on( 'change:copyPasteJsonValue', ( changedModel ) => {
app.pasteSettings( changedModel );
} );
// Change style settings.
settingsModel.on( 'change', ( changedModel ) => {
app.changeStyleSettings( changedModel, view );
if ( ! changedModel.changed.copyPasteJsonValue && ! changedModel.changed.form_id ) {
app.updateCopyPasteContent( changedModel );
}
} );
},
/**
* Widget ready events.
*
* @since 1.8.3
*
* @param {jQuery} $scope The current element wrapped with jQuery.
*/
widgetReady: function( $scope ) {
let formId = $scope.find( '.wpforms-form' ).data( 'formid' );
app.updateAccentColors( $scope, formId );
app.loadChoicesJS( $scope, formId );
app.initRichTextField( formId );
},
/**
* Show the reset style settings confirm popup.
*
* @since 1.8.3
*
* @param {object} event Event object.
*/
confirmResetStyleSettings: function( event ) {
elementorCommon.dialogsManager.createWidget( 'confirm', {
message: wpformsElementorVars.strings.reset_settings_confirm_text,
headerMessage: wpformsElementorVars.strings.reset_style_settings,
strings: {
confirm: wpformsElementorVars.strings.continue,
cancel: wpformsElementorVars.strings.cancel,
},
defaultOption: 'cancel',
onConfirm: function onConfirm() {
app.resetStyleSettings( event );
},
} ).show();
},
/**
* Reset style settings button handler.
*
* @since 1.8.3
*
* @param {object} event Event object.
*/
resetStyleSettings: function( event ) {
let model = event.options.elementSettingsModel;
let container = event.options.container;
let widgetContainer = container.view.$el[0];
let defaults = model.defaults;
let styleSettings = app.getStyleAttributesKeys();
let globals = model.get( '__globals__' );
let defaultValues = {};
let $widgetStyles = $( widgetContainer ).find( '#wpforms-css-vars-root' ).next( 'style' );
// Prepare default style settings values.
styleSettings.forEach( function( element ) {
defaultValues[ element ] = defaults[element];
} );
// Reset global style settings.
if ( globals ) {
elementorCommon.api.run( 'document/globals/settings', {
container: container,
settings: {},
options: {
external: true,
render: false,
},
} );
}
// Reset widget settings to default.
elementorCommon.api.run( 'document/elements/settings', {
container,
options: {
external: true,
},
settings: defaultValues,
} );
// Reset CSS vars for widget container and form specific <style> tag.
widgetContainer.style = '';
$widgetStyles.text( '' );
},
/**
* Change style setting handler.
*
* @since 1.8.3
*
* @param {object} changedModel Changed model.
* @param {object} view View.
*/
// eslint-disable-next-line complexity
changeStyleSettings: function( changedModel, view ) {
let widgetContainer = view.$el[0];
let parsedAtts = changedModel.parseGlobalSettings( changedModel );
for ( let element in changedModel.changed ) {
if ( ! app.getStyleAttributesKeys().includes( element ) ) {
view.allowRender = element !== 'copyPasteJsonValue';
continue;
}
view.allowRender = false;
let attrValue = app.getParsedValue( element, parsedAtts );
let property = element.replace( /[A-Z]/g, letter => `-${letter.toLowerCase()}` );
let borderRadiusItems = [ 'fieldBorderRadius', 'buttonBorderRadius' ];
if ( borderRadiusItems.includes( element ) ) {
attrValue = attrValue + 'px';
}
switch ( property ) {
case 'field-size':
case 'label-size':
case 'button-size':
for ( const key in wpformsElementorVars.sizes[ property ][ attrValue ] ) {
widgetContainer.style.setProperty(
`--wpforms-${property}-${key}`,
wpformsElementorVars.sizes[ property ][ attrValue ][ key ],
);
}
break;
default:
widgetContainer.style.setProperty( `--wpforms-${property}`, attrValue );
}
}
},
/**
* Copy/paste widget settings.
*
* @since 1.8.3
*
* @param {object} model Settings model.
*/
updateCopyPasteContent: function( model ) {
let styleSettings = app.getStyleAttributesKeys();
let content = {};
let atts = model.parseGlobalSettings( model );
styleSettings.forEach( function( element ) {
content[element] = app.getParsedValue( element, atts );
} );
model.setExternalChange( 'copyPasteJsonValue', JSON.stringify( content ) );
},
/**
* Paste settings.
*
* @since 1.8.3
*
* @param {object} model Settings model.
*/
pasteSettings: function( model ) {
let copyPasteJsonValue = model.changed.copyPasteJsonValue;
let pasteAttributes = app.parseValidateJson( copyPasteJsonValue );
if ( ! pasteAttributes ) {
elementorCommon.dialogsManager.createWidget( 'alert', {
message: wpformsElementorVars.strings.copy_paste_error,
headerMessage: wpformsElementorVars.strings.heads_up,
} ).show();
this.updateCopyPasteContent( model );
return;
}
model.set( pasteAttributes );
},
/**
* Parse and validate JSON string.
*
* @since 1.8.3
*
* @param {string} value JSON string.
*
* @returns {boolean|object} Parsed JSON object OR false on error.
*/
parseValidateJson: function( value ) {
if ( typeof value !== 'string' ) {
return false;
}
let atts;
try {
atts = JSON.parse( value );
} catch ( error ) {
atts = false;
}
return atts;
},
/**
* Get list of the style attributes keys.
*
* @since 1.8.3
*
* @returns {Array} Style attributes keys.
*/
getStyleAttributesKeys: function() {
return [
'fieldSize',
'fieldBorderRadius',
'fieldBackgroundColor',
'fieldBorderColor',
'fieldTextColor',
'labelSize',
'labelColor',
'labelSublabelColor',
'labelErrorColor',
'buttonSize',
'buttonBorderRadius',
'buttonBackgroundColor',
'buttonTextColor',
];
},
/**
* Get parsed attribute value.
*
* @since 1.8.3
*
* @param {string} attrName Attribute name.
* @param {object} parsedAtts Parsed attributes.
*
* @returns {string} Attribute value.
*/
getParsedValue: function( attrName, parsedAtts ) {
let rawValue = parsedAtts[ attrName ];
let value;
if ( typeof rawValue === 'undefined' ) {
value = false;
} else if ( typeof rawValue === 'object' && Object.prototype.hasOwnProperty.call( rawValue, 'value' ) ) {
value = rawValue.value;
} else {
value = rawValue;
}
return value;
},
/**
* Initialize RichText field.
*
* @since 1.8.3
*
* @param {int} formId Form ID.
*/
initRichTextField: function( formId ) {
// Set default tab to `Visual`.
$( `#wpforms-${formId} .wp-editor-wrap` ).removeClass( 'html-active' ).addClass( 'tmce-active' );
},
/**
* Update accent colors of some fields in Elementor widget.
*
* @since 1.8.3
*
* @param {jQuery} widgetContainer Widget container.
* @param {integer} formId Event details object.
*/
updateAccentColors: function( widgetContainer, formId ) {
const $form = widgetContainer.find( `#wpforms-${formId}` ),
FrontendModern = window.WPForms.FrontendModern;
FrontendModern.updateGBBlockPageIndicatorColor( $form );
FrontendModern.updateGBBlockIconChoicesColor( $form );
FrontendModern.updateGBBlockRatingColor( $form );
},
/**
* Init Modern style Dropdown fields (<select>).
*
* @since 1.8.3
*
* @param {jQuery} widgetContainer Widget container.
* @param {integer} formId Form id.
*/
loadChoicesJS: function( widgetContainer, formId ) {
if ( typeof window.Choices !== 'function' ) {
return;
}
const $form = widgetContainer.find( `#wpforms-${formId}` );
$form.find( '.choicesjs-select' ).each( function( idx, el ) {
const $el = $( el );
if ( $el.data( 'choice' ) === 'active' ) {
return;
}
var args = window.wpforms_choicesjs_config || {},
searchEnabled = $el.data( 'search-enabled' ),
$field = $el.closest( '.wpforms-field' );
args.searchEnabled = 'undefined' !== typeof searchEnabled ? searchEnabled : true;
args.callbackOnInit = function() {
var self = this,
$element = $( self.passedElement.element ),
$input = $( self.input.element ),
sizeClass = $element.data( 'size-class' );
// Add CSS-class for size.
if ( sizeClass ) {
$( self.containerOuter.element ).addClass( sizeClass );
}
/**
* If a multiple select has selected choices - hide a placeholder text.
* In case if select is empty - we return placeholder text back.
*/
if ( $element.prop( 'multiple' ) ) {
// On init event.
$input.data( 'placeholder', $input.attr( 'placeholder' ) );
if ( self.getValue( true ).length ) {
$input.removeAttr( 'placeholder' );
}
}
this.disable();
$field.find( '.is-disabled' ).removeClass( 'is-disabled' );
};
try {
const choicesInstance = new Choices( el, args );
// Save Choices.js instance for future access.
$el.data( 'choicesjs', choicesInstance );
} catch ( e ) {} // eslint-disable-line no-empty
} );
},
};
return app;
}( document, window, jQuery ) );
// Initialize.
WPFormsElementorModern.init();

View File

@@ -0,0 +1 @@
"use strict";var WPFormsElementorModern=window.WPFormsElementorModern||function(i,l){var d={init:function(){d.events()},events:function(){l(i).on("elementor/frontend/init",function(e,t,o){elementor.channels.editor.on("elementorWPFormsResetStyleSettings",d.confirmResetStyleSettings),elementor.channels.editor.on("section:activated",d.checkForLeadForms),elementor.hooks.addAction("panel/open_editor/widget/wpforms",d.widgetPanelOpen),elementorFrontend.hooks.addAction("frontend/element_ready/wpforms.default",d.widgetReady)})},checkForLeadForms(e,t){var o;"field_styles"===e&&"wpforms"===t.model.attributes.widgetType&&(e=t.$childViewContainer[0],o=t.options.editedElementView.$el[0],t=t.model.attributes.settings.attributes.form_id,0!==(o=l(o).find("#wpforms-"+t)).length)&&o.hasClass("wpforms-lead-forms-container")&&(l(e).addClass("wpforms-elementor-disabled"),l(e).find(".wpforms-elementor-lead-forms-notice").css("display","block"))},widgetPanelOpen:function(e,t,o){t=t.get("settings");t.on("change:copyPasteJsonValue",e=>{d.pasteSettings(e)}),t.on("change",e=>{d.changeStyleSettings(e,o),e.changed.copyPasteJsonValue||e.changed.form_id||d.updateCopyPasteContent(e)})},widgetReady:function(e){var t=e.find(".wpforms-form").data("formid");d.updateAccentColors(e,t),d.loadChoicesJS(e,t),d.initRichTextField(t)},confirmResetStyleSettings:function(e){elementorCommon.dialogsManager.createWidget("confirm",{message:wpformsElementorVars.strings.reset_settings_confirm_text,headerMessage:wpformsElementorVars.strings.reset_style_settings,strings:{confirm:wpformsElementorVars.strings.continue,cancel:wpformsElementorVars.strings.cancel},defaultOption:"cancel",onConfirm:function(){d.resetStyleSettings(e)}}).show()},resetStyleSettings:function(e){var t=e.options.elementSettingsModel,e=e.options.container,o=e.view.$el[0];let n=t.defaults;var s=d.getStyleAttributesKeys(),t=t.get("__globals__");let r={};var a=l(o).find("#wpforms-css-vars-root").next("style");s.forEach(function(e){r[e]=n[e]}),t&&elementorCommon.api.run("document/globals/settings",{container:e,settings:{},options:{external:!0,render:!1}}),elementorCommon.api.run("document/elements/settings",{container:e,options:{external:!0},settings:r}),o.style="",a.text("")},changeStyleSettings:function(e,t){var o,n=t.$el[0],s=e.parseGlobalSettings(e);for(o in e.changed)if(d.getStyleAttributesKeys().includes(o)){t.allowRender=!1;let e=d.getParsedValue(o,s);var r=o.replace(/[A-Z]/g,e=>"-"+e.toLowerCase());switch(["fieldBorderRadius","buttonBorderRadius"].includes(o)&&(e+="px"),r){case"field-size":case"label-size":case"button-size":for(const a in wpformsElementorVars.sizes[r][e])n.style.setProperty(`--wpforms-${r}-`+a,wpformsElementorVars.sizes[r][e][a]);break;default:n.style.setProperty("--wpforms-"+r,e)}}else t.allowRender="copyPasteJsonValue"!==o},updateCopyPasteContent:function(e){var t=d.getStyleAttributesKeys();let o={},n=e.parseGlobalSettings(e);t.forEach(function(e){o[e]=d.getParsedValue(e,n)}),e.setExternalChange("copyPasteJsonValue",JSON.stringify(o))},pasteSettings:function(e){var t=e.changed.copyPasteJsonValue,t=d.parseValidateJson(t);t?e.set(t):(elementorCommon.dialogsManager.createWidget("alert",{message:wpformsElementorVars.strings.copy_paste_error,headerMessage:wpformsElementorVars.strings.heads_up}).show(),this.updateCopyPasteContent(e))},parseValidateJson:function(e){if("string"!=typeof e)return!1;let t;try{t=JSON.parse(e)}catch(e){t=!1}return t},getStyleAttributesKeys:function(){return["fieldSize","fieldBorderRadius","fieldBackgroundColor","fieldBorderColor","fieldTextColor","labelSize","labelColor","labelSublabelColor","labelErrorColor","buttonSize","buttonBorderRadius","buttonBackgroundColor","buttonTextColor"]},getParsedValue:function(e,t){t=t[e];let o;return o=void 0!==t&&("object"==typeof t&&Object.prototype.hasOwnProperty.call(t,"value")?t.value:t)},initRichTextField:function(e){l(`#wpforms-${e} .wp-editor-wrap`).removeClass("html-active").addClass("tmce-active")},updateAccentColors:function(e,t){e=e.find("#wpforms-"+t),t=i.WPForms.FrontendModern;t.updateGBBlockPageIndicatorColor(e),t.updateGBBlockIconChoicesColor(e),t.updateGBBlockRatingColor(e)},loadChoicesJS:function(e,t){"function"==typeof i.Choices&&e.find("#wpforms-"+t).find(".choicesjs-select").each(function(e,t){var o=l(t);if("active"!==o.data("choice")){var n=i.wpforms_choicesjs_config||{},s=o.data("search-enabled"),r=o.closest(".wpforms-field");n.searchEnabled=void 0===s||s,n.callbackOnInit=function(){var e=l(this.passedElement.element),t=l(this.input.element),o=e.data("size-class");o&&l(this.containerOuter.element).addClass(o),e.prop("multiple")&&(t.data("placeholder",t.attr("placeholder")),this.getValue(!0).length)&&t.removeAttr("placeholder"),this.disable(),r.find(".is-disabled").removeClass("is-disabled")};try{var a=new Choices(t,n);o.data("choicesjs",a)}catch(e){}}})}};return d}((document,window),jQuery);WPFormsElementorModern.init();

View File

@@ -0,0 +1,560 @@
/* global wpformsElementorVars, elementor, elementorFrontend */
'use strict';
/**
* WPForms integration with Elementor in the editor.
*
* @since 1.6.0
* @since 1.6.2 Moved frontend integration to `wpforms-elementor-frontend.js`
*/
var WPFormsElementor = window.WPFormsElementor || ( function( document, window, $ ) {
/**
* Runtime variables.
*
* @since 1.6.2
*
* @type {object}
*/
var vars = {};
/**
* Public functions and properties.
*
* @since 1.6.0
*
* @type {object}
*/
var app = {
/**
* Start the engine.
*
* @since 1.6.0
*/
init: function() {
app.events();
},
/**
* Register JS events.
*
* @since 1.6.0
*/
events: function() {
// Widget events.
$( window ).on( 'elementor/frontend/init', function( event, id, instance ) {
// Widget buttons click.
elementor.channels.editor.on( 'elementorWPFormsAddFormBtnClick', app.addFormBtnClick );
// Widget frontend events.
elementorFrontend.hooks.addAction( 'frontend/element_ready/wpforms.default', app.widgetPreviewEvents );
// Initialize widget controls.
elementor.hooks.addAction( 'panel/open_editor/widget/wpforms', app.widgetPanelOpen );
} );
},
/**
* Widget events.
*
* @since 1.6.2
*
* @param {jQuery} $scope The current element wrapped with jQuery.
*/
widgetPreviewEvents: function( $scope ) {
$scope
.on( 'click', '.wpforms-btn', app.addFormBtnClick )
.on( 'click', '.wpforms-admin-no-forms-container a', app.clickLinkInPreview )
.on( 'change', '.wpforms-elementor-form-selector select', app.selectFormInPreview )
.on( 'click mousedown focus keydown submit', '.wpforms-container *', app.disableEvents )
.on( 'click', '.wpforms-comprehensive-link', app.openComprehensiveLink );
app.updateSameForms( $scope );
},
/**
* Update all the same forms on the preview.
*
* @since 1.6.3
*
* @param {jQuery} $scope The current element wrapped with jQuery.
*/
updateSameForms: function( $scope ) {
var elementId = $scope.data( 'id' ),
$formContainer = $scope.find( '.wpforms-container' ),
formContainerHtml = $formContainer.html(),
formContainerId = $formContainer.attr( 'id' );
$scope
.closest( '.elementor-inner' )
.find( '.elementor-widget-wpforms:not(.elementor-element-' + elementId + ')' )
.each( function() {
var $anotherFormContainer = $( this ).find( '.wpforms-container' );
if ( $anotherFormContainer.attr( 'id' ) === formContainerId ) {
$anotherFormContainer.html( formContainerHtml );
}
} );
},
/**
* Initialize widget controls when widget is activated.
*
* @since 1.6.2
*
* @param {object} panel Panel object.
* @param {object} model Model object.
*/
widgetPanelOpen: function( panel, model ) {
vars.widgetId = model.attributes.id;
vars.formId = model.attributes.settings.attributes.form_id;
app.widgetPanelInit( panel );
app.widgetPanelObserver.init( panel );
},
/**
* Initialize widget controls when widget is activated.
*
* @since 1.6.2
*
* @param {object} panel Panel object.
*/
widgetPanelInit: function( panel ) {
var $formSelectControl = panel.$el.find( '.elementor-control.elementor-control-form_id' ),
$formSelect = $formSelectControl.find( 'select' ),
$addFormNoticeControl = panel.$el.find( '.elementor-control.elementor-control-add_form_notice' ),
$testFormNoticeControl = panel.$el.find( '.elementor-control.elementor-control-test_form_notice' );
// Update form select options if it is available after adding the form.
if ( vars.formSelectOptions ) {
$formSelect.html( vars.formSelectOptions );
}
// Update form select value.
if ( vars.formId && vars.formId !== '' ) {
$formSelect.val( vars.formId );
}
// Hide not needed controls.
if ( $formSelect.find( 'option' ).length > 0 ) {
$addFormNoticeControl.hide();
} else {
$formSelectControl.hide();
$testFormNoticeControl.hide();
}
// Show needed controls.
if ( parseInt( $formSelect.val(), 10 ) > 0 ) {
$testFormNoticeControl.show();
}
// Select form.
panel.$el.find( '.elementor-control.elementor-control-form_id' ).on( 'change', 'select', function() {
// Update `vars.formId` to be able to restore selected value after options update.
vars.formId = $( this ).val();
} );
// Click on the `Edit the selected form` link.
panel.$el.find( '.elementor-control.elementor-control-edit_form' ).on( 'click', 'a', app.editFormLinkClick );
},
/**
* The observer needed to re-init controls when the widget panel section and tabs switches.
*
* @since 1.6.3
*
* @member {object}
*/
widgetPanelObserver: {
/**
* Initialize observer.
*
* @since 1.6.3
*
* @param {object} panel Panel object.
*/
init: function( panel ) {
// Skip if observer for current widget already initialized.
if ( vars.observerWidgetId === vars.widgetId ) {
return;
}
// Disconnect previous widget observer.
if ( typeof vars.observer !== 'undefined' && typeof vars.observer.disconnect === 'function' ) {
vars.observer.disconnect();
}
var obs = {
targetNode : panel.$el.find( '#elementor-panel-content-wrapper' )[0],
config : {
childList: true,
subtree: true,
attributes: true,
},
};
app.widgetPanelObserver.panel = panel;
obs.observer = new MutationObserver( app.widgetPanelObserver.callback );
obs.observer.observe( obs.targetNode, obs.config );
vars.observerWidgetId = vars.widgetId;
vars.observer = obs.observer;
},
/**
* Observer callback.
*
* @since 1.6.3
*
* @param {Array} mutationsList Mutation list.
*/
callback: function( mutationsList ) {
var mutation,
quit = false;
for ( var i in mutationsList ) {
mutation = mutationsList[ i ];
if ( mutation.type === 'childList' && mutation.addedNodes.length > 0 ) {
quit = app.widgetPanelObserver.callbackMutationChildList( mutation );
}
if ( mutation.type === 'attributes' ) {
quit = app.widgetPanelObserver.callbackMutationAttributes( mutation );
}
if ( quit ) {
return;
}
}
},
/**
* Process 'childList' mutation.
*
* @since 1.6.3
*
* @param {MutationRecord} mutation Mutation record.
*
* @returns {boolean} True if detect needed node.
*/
callbackMutationChildList: function( mutation ) {
var addedNodes = mutation.addedNodes || [],
node;
for ( var n in addedNodes ) {
node = addedNodes[ n ];
if ( node && node.classList && node.classList.contains( 'elementor-control-section_form' ) ) {
app.widgetPanelInit( app.widgetPanelObserver.panel );
return true;
}
}
return false;
},
/**
* Process 'attributes' mutation.
*
* @since 1.6.3
*
* @param {MutationRecord} mutation Mutation record.
*
* @returns {boolean} True if detect needed target.
*/
callbackMutationAttributes: function( mutation ) {
if (
mutation.target &&
mutation.target.classList &&
mutation.target.classList.contains( 'elementor-tab-control-content' )
) {
app.widgetPanelInit( app.widgetPanelObserver.panel );
return true;
}
return false;
},
},
/**
* Edit selected form button click event handler.
*
* @since 1.6.2
*
* @param {object} event Event object.
*/
editFormLinkClick: function( event ) {
app.findFormSelector( event );
app.openBuilderPopup( vars.$select.val() );
},
/**
* Add a new form button click event handler.
*
* @since 1.6.2
*
* @param {object} event Event object.
*/
addFormBtnClick: function( event ) {
app.findFormSelector( event );
app.openBuilderPopup( 0 );
},
/**
* Find and store the form selector control wrapped in jQuery object.
*
* @since 1.6.2
*
* @param {object} event Event object.
*/
findFormSelector: function( event ) {
let view = elementor.getPanelView().getCurrentPageView();
// We need to be sure that we are on the widget Content section.
if ( view.activeSection && view.activeSection !== 'section_form' ) {
$( view.ui.tabs[0] ).trigger( 'click' );
}
vars.$select = event && event.$el ?
event.$el.closest( '#elementor-controls' ).find( 'select[data-setting="form_id"]' ) :
window.parent.jQuery( '#elementor-controls select[data-setting="form_id"]' );
},
/**
* Preview: Form selector event handler.
*
* @since 1.6.2
*/
selectFormInPreview: function() {
vars.formId = $( this ).val();
app.findFormSelector();
// To be sure, that both form selector selects are in sync.
app.refreshFormsList( null, vars.formId );
},
/**
* Preview: Click on the link event handler.
*
* @since 1.6.2
*
* @param {object} event Event object.
*/
clickLinkInPreview: function( event ) {
if ( event.target && event.target.href ) {
window.open( event.target.href, '_blank', 'noopener,noreferrer' );
}
},
/**
* Disable events.
*
* @since 1.6.2
*
* @param {object} event Event object.
*
* @returns {boolean} Always false.
*/
disableEvents: function( event ) {
event.preventDefault();
event.stopImmediatePropagation();
return false;
},
/**
* Open the compreshenvie guide link,
* as elementor disables all links in the preview.
*
* @since 1.8.3
*
* @param {object} event Event object.
*/
openComprehensiveLink: function( event ) {
const url = $( this ).attr( 'href' );
// Open the url in a new tab with JS bc elementor doesn't allow links in the preview.
window.open( url, '_blank' ).focus();
},
/**
* Open builder popup.
*
* @since 1.6.2
*
* @param {number} formId Form id. 0 for create new form.
*/
openBuilderPopup: function( formId ) {
formId = parseInt( formId || '0', 10 );
if ( ! vars.$popup ) {
// We need to add popup markup to the editor top document.
var $elementor = window.parent.jQuery( '#elementor-editor-wrapper' ),
popupTpl = wp.template( 'wpforms-builder-elementor-popup' );
$elementor.after( popupTpl() );
vars.$popup = $elementor.siblings( '#wpforms-builder-elementor-popup' );
}
var url = formId > 0 ? wpformsElementorVars.edit_form_url + formId : wpformsElementorVars.add_form_url,
$iframe = vars.$popup.find( 'iframe' );
app.builderCloseButtonEvent();
$iframe.attr( 'src', url );
vars.$popup.fadeIn();
},
/**
* Close button (inside the form builder) click event.
*
* @since 1.6.2
*/
builderCloseButtonEvent: function() {
vars.$popup
.off( 'wpformsBuilderInPopupClose' )
.on( 'wpformsBuilderInPopupClose', function( e, action, formId ) {
if ( action !== 'saved' || ! formId ) {
return;
}
app.refreshFormsList( null, formId );
} );
},
/**
* Refresh forms list event handler.
*
* @since 1.6.2
*
* @param {object} event Event object.
* @param {number} setFormId Set selected form to.
*/
refreshFormsList: function( event, setFormId ) {
if ( event ) {
event.preventDefault();
}
app.findFormSelector();
var data = {
action: 'wpforms_admin_get_form_selector_options',
nonce : wpformsElementorVars.nonce,
};
vars.$select.prop( 'disabled', true );
$.post( wpformsElementorVars.ajax_url, data )
.done( function( response ) {
if ( ! response.success ) {
app.debug( response );
return;
}
vars.formSelectOptions = response.data;
vars.$select.html( response.data );
if ( setFormId ) {
vars.formId = setFormId;
}
if ( vars.formId && vars.formId !== '' ) {
vars.$select.val( vars.formId ).trigger( 'change' );
}
} )
.fail( function( xhr, textStatus ) {
app.debug( {
xhr: xhr,
textStatus: textStatus,
} );
} )
.always( function() {
if ( ! vars.$select || vars.$select.length < 1 ) {
return;
}
vars.$select.prop( 'disabled', false );
var $formSelectOptions = vars.$select.find( 'option' ),
$formSelectControl = vars.$select.closest( '.elementor-control' );
if ( $formSelectOptions.length > 0 ) {
$formSelectControl.show();
$formSelectControl.siblings( '.elementor-control-add_form_notice' ).hide();
}
if ( parseInt( vars.$select.val(), 10 ) > 0 ) {
$formSelectControl.siblings( '.elementor-control-test_form_notice' ).show();
}
} );
},
/**
* Debug output helper.
*
* @since 1.6.2
*
* @param {mixed} msg Debug message.
*/
debug: function( msg ) {
if ( app.isDebug() ) {
console.log( 'WPForms Debug:', msg );
}
},
/**
* Is debug mode.
*
* @since 1.6.2
*
* @returns {boolean} True if the debug enabled.
*/
isDebug: function() {
return ( ( window.top.location.hash && '#wpformsdebug' === window.top.location.hash ) || wpformsElementorVars.debug );
},
};
return app;
}( document, window, jQuery ) );
// Initialize.
WPFormsElementor.init();

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,89 @@
/* global wpforms, wpformsElementorVars, wpformsModernFileUpload, wpformsRecaptchaLoad, grecaptcha */
'use strict';
/**
* WPForms integration with Elementor on the frontend.
*
* @since 1.6.2 Moved from `wpforms-elementor.js`
*/
var WPFormsElementorFrontend = window.WPFormsElementorFrontend || ( function( document, window, $ ) {
/**
* Public functions and properties.
*
* @since 1.6.2
*
* @type {object}
*/
var app = {
/**
* Start the engine.
*
* @since 1.6.2
*/
init: function() {
app.events();
},
/**
* Register JS events.
*
* @since 1.6.2
*/
events: function() {
window.addEventListener( 'elementor/popup/show', function( event ) {
let $modal = $( '#elementor-popup-modal-' + event.detail.id ),
$form = $modal.find( '.wpforms-form' );
if ( ! $form.length ) {
return;
}
app.initFields( $form );
} );
},
/**
* Init all things for WPForms.
*
* @since 1.6.2
*
* @param {object} $form jQuery selector.
*/
initFields: function( $form ) {
// Init WPForms things.
wpforms.ready();
// Init `Modern File Upload` field.
if ( 'undefined' !== typeof wpformsModernFileUpload ) {
wpformsModernFileUpload.init();
}
// Init CAPTCHA.
if ( 'undefined' !== typeof wpformsRecaptchaLoad ) {
if ( 'recaptcha' === wpformsElementorVars.captcha_provider && 'v3' === wpformsElementorVars.recaptcha_type ) {
if ( 'undefined' !== typeof grecaptcha ) {
grecaptcha.ready( wpformsRecaptchaLoad );
}
} else {
wpformsRecaptchaLoad();
}
}
// Register a custom event.
$( document ).trigger( 'wpforms_elementor_form_fields_initialized', [ $form ] );
},
};
return app;
}( document, window, jQuery ) );
// Initialize.
WPFormsElementorFrontend.init();

View File

@@ -0,0 +1 @@
"use strict";var WPFormsElementorFrontend=window.WPFormsElementorFrontend||function(o,e,n){var r={init:function(){r.events()},events:function(){e.addEventListener("elementor/popup/show",function(e){e=n("#elementor-popup-modal-"+e.detail.id).find(".wpforms-form");e.length&&r.initFields(e)})},initFields:function(e){wpforms.ready(),"undefined"!=typeof wpformsModernFileUpload&&wpformsModernFileUpload.init(),"undefined"!=typeof wpformsRecaptchaLoad&&("recaptcha"===wpformsElementorVars.captcha_provider&&"v3"===wpformsElementorVars.recaptcha_type?"undefined"!=typeof grecaptcha&&grecaptcha.ready(wpformsRecaptchaLoad):wpformsRecaptchaLoad()),n(o).trigger("wpforms_elementor_form_fields_initialized",[e])}};return r}(document,window,jQuery);WPFormsElementorFrontend.init();