/* 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, view ); } ); // Change style settings. settingsModel.on( 'change', ( changedModel ) => { app.changeStyleSettings( changedModel, view ); if ( ! changedModel.changed.copyPasteJsonValue && ! changedModel.changed.form_id ) { app.updateCopyPasteContent( changedModel ); } } ); // Update copy/paste content when form_id is changed and copyPasteJsonValue is not set. settingsModel.on( 'change:form_id', ( changedModel ) => { if ( ! changedModel.attributes.copyPasteJsonValue ) { setTimeout( function() { app.updateCopyPasteContent( changedModel ); }, 0 ); } } ); }, /** * 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 ); app.initRepeaterField( 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( event ) { const model = event.options.elementSettingsModel; const container = event.options.container; const widgetContainer = container.view.$el[ 0 ]; const defaults = model.defaults; const styleSettings = app.getStyleAttributesKeys(); const defaultValues = {}; const $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. app.resetGlobalStyleSettings( model, container ); // 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