first commit

This commit is contained in:
2023-09-12 21:41:04 +02:00
commit 3361a7f053
13284 changed files with 2116755 additions and 0 deletions

View File

@@ -0,0 +1,176 @@
/* global wpforms_divi_builder */
import React, { Component } from 'react';
import PropTypes from 'prop-types';
/**
* WPFormsSelector component.
*
* @since 1.6.3
*/
class WPFormsSelector extends Component {
/**
* Module slug.
*
* @since 1.6.3
*
* @type {string}
*/
static slug = 'wpforms_selector';
/**
* Constructor.
*
* @since 1.6.3
*
* @param {string} props List of properties.
*/
constructor( props ) {
super( props );
this.state = {
error: null,
isLoading: true,
form: null,
};
}
/**
* Set types for properties.
*
* @since 1.6.3
*
* @returns {object} Properties type.
*/
static get propTypes() {
return {
form_id: PropTypes.number, // eslint-disable-line camelcase
show_title: PropTypes.string, // eslint-disable-line camelcase
show_desc: PropTypes.string, // eslint-disable-line camelcase
};
}
/**
* Check if form settings was updated.
*
* @since 1.6.3
*
* @param {object} prevProps List of previous properties.
*/
componentDidUpdate( prevProps ) {
if ( prevProps.form_id !== this.props.form_id || prevProps.show_title !== this.props.show_title || prevProps.show_desc !== this.props.show_desc ) {
this.componentDidMount();
}
}
/**
* Ajax request for form HTML.
*
* @since 1.6.3
*/
componentDidMount() {
var formData = new FormData();
formData.append( 'nonce', wpforms_divi_builder.nonce );
formData.append( 'action', 'wpforms_divi_preview' );
formData.append( 'form_id', this.props.form_id );
formData.append( 'show_title', this.props.show_title );
formData.append( 'show_desc', this.props.show_desc );
fetch(
wpforms_divi_builder.ajax_url,
{
method: 'POST',
cache: 'no-cache',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Cache-Control': 'no-cache',
},
body: new URLSearchParams( formData ),
},
)
.then( res => res.json() )
.then(
( result ) => {
this.setState( {
isLoading: false,
form: result.data,
} );
},
( error ) => {
this.setState( {
isLoading: false,
error,
} );
},
);
}
/**
* Render module view.
*
* @since 1.6.3
*
* @returns {JSX.Element} View for module.
*/
render() {
var { error, isLoaded, form } = this.state,
wrapperClasses = isLoaded ? 'wpforms-divi-form-preview loading' : 'wpforms-divi-form-preview';
if ( error || ! form ) {
return (
<div className="wpforms-divi-form-placeholder">
<img src={wpforms_divi_builder.placeholder}/>
<h3>{wpforms_divi_builder.placeholder_title}</h3>
</div>
);
}
return (
<div className={wrapperClasses}>
{<div dangerouslySetInnerHTML={{ __html: form }}/>}
</div>
);
}
}
jQuery( window )
// Register custom modules.
.on( 'et_builder_api_ready', ( event, API ) => {
API.registerModules( [ WPFormsSelector ] );
} )
// Re-initialize WPForms frontend.
.on( 'wpformsDiviModuleDisplay', ( event ) => {
window.wpforms.init();
} );
// Make all the modern dropdowns disabled.
jQuery( document )
.on( 'wpformsReady', ( event ) => {
var $ = jQuery;
$( '.choicesjs-select' ).each( function() {
var $instance = $( this ).data( 'choicesjs' );
if ( ! $instance || typeof $instance.disable !== 'function' ) {
return;
}
$instance.disable();
} );
} );

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,534 @@
/* 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 );
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 ) {
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();
vars.$select.val( vars.formId ).trigger( 'change' );
},
/**
* 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 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() {
$( document ).on( 'elementor/popup/show', function( event, id, instance ) {
var $modal = $( '#elementor-popup-modal-' + 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,r){var t={init:function(){t.events()},events:function(){r(o).on("elementor/popup/show",function(e,o,n){o=r("#elementor-popup-modal-"+o).find(".wpforms-form");o.length&&t.initFields(o)})},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()),r(o).trigger("wpforms_elementor_form_fields_initialized",[e])}};return t}(document,(window,jQuery));WPFormsElementorFrontend.init();