Snapshot: MLS sync fixes, image refresh, plugin/theme updates
MLS plugin fixes from this session: - Fix silent insert failures: location column NOT NULL was rejecting wpdb->insert calls, causing ~18k new properties since Dec 2025 to be lost. Inserts now build raw SQL with ST_PointFromText so the spatial column is populated atomically. - Auto-refresh expired media URLs in MLS_Media_Handler::fetch_and_cache(), guarded by a property-level GET_LOCK so concurrent fetches share one API refresh. - Normalize WP_Error to null in mls_get_property_image() so callers can rely on the documented string|null contract. - Support comma-separated property_type filters in MLS_Query and MLS_Cluster so the homepage "View All Commercial" link (?property_type=Commercial+Sale,Land,Farm) actually filters correctly. - Incremental sync now looks back 10 minutes past the latest modification timestamp as a safety margin against missed records. - Smart sync exits silently (info-level, not warning) when a full sync is in progress. Operational: - New cron: weekly full sync Sundays at 3 AM (/usr/local/bin/mls-full-sync). - New cron: hourly 2GB cap on mls-thumbnails/ and cache/transformed-images/ (/usr/local/bin/mls-image-cache-cap). - Logrotate config for wp-content/debug.log (2-day retention, daily rotation, delaycompress). Repo policy: - CLAUDE.md updated with explicit "commit everything except build artifacts" policy. - .gitignore: untrack runtime image caches and debug.log rotations. Other modifications in this snapshot are pre-existing in-flight theme/plugin/db_content_updates work. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,176 @@
|
||||
/* global wpforms_builder, wpforms_education */
|
||||
|
||||
/**
|
||||
* WPForms Education core for Lite.
|
||||
*
|
||||
* @since 1.6.6
|
||||
*/
|
||||
|
||||
// noinspection ES6ConvertVarToLetConst
|
||||
/**
|
||||
* @param wpforms_education.upgrade
|
||||
* @param wpforms_education.upgrade.button
|
||||
* @param wpforms_education.upgrade.doc
|
||||
* @param wpforms_education.upgrade.message
|
||||
* @param wpforms_education.upgrade.title
|
||||
* @param wpforms_education.upgrade.title_plural
|
||||
* @param wpforms_education.upgrade_bonus
|
||||
*/
|
||||
|
||||
var WPFormsEducation = window.WPFormsEducation || {}; // eslint-disable-line no-var
|
||||
|
||||
WPFormsEducation.liteCore = window.WPFormsEducation.liteCore || ( function( document, window, $ ) {
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.6.6
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
const app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.6.6
|
||||
*/
|
||||
init() {
|
||||
$( app.ready );
|
||||
},
|
||||
|
||||
/**
|
||||
* Document ready.
|
||||
*
|
||||
* @since 1.6.6
|
||||
*/
|
||||
ready() {
|
||||
app.events();
|
||||
},
|
||||
|
||||
/**
|
||||
* Register JS events.
|
||||
*
|
||||
* @since 1.6.6
|
||||
*/
|
||||
events() {
|
||||
app.openModalButtonClick();
|
||||
},
|
||||
|
||||
/**
|
||||
* Registers click events that should open upgrade modal.
|
||||
*
|
||||
* @since 1.6.6
|
||||
*/
|
||||
openModalButtonClick() {
|
||||
$( document )
|
||||
.on( 'click', '.education-modal:not(.wpforms-add-fields-button)', app.openModalButtonHandler )
|
||||
.on( 'mousedown', '.education-modal.wpforms-add-fields-button', app.openModalButtonHandler );
|
||||
},
|
||||
|
||||
/**
|
||||
* Open education modal handler.
|
||||
*
|
||||
* @since 1.8.0
|
||||
*
|
||||
* @param {Event} event Event.
|
||||
*/
|
||||
openModalButtonHandler( event ) {
|
||||
const $this = $( this );
|
||||
|
||||
if ( $this.data( 'action' ) && [ 'activate', 'install' ].includes( $this.data( 'action' ) ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
|
||||
let name = $this.data( 'name' );
|
||||
|
||||
if ( $this.hasClass( 'wpforms-add-fields-button' ) ) {
|
||||
name = $this.text();
|
||||
name += name.indexOf( wpforms_builder.field ) < 0 ? ' ' + wpforms_builder.field : '';
|
||||
}
|
||||
|
||||
const utmContent = WPFormsEducation.core.getUTMContentValue( $this );
|
||||
|
||||
app.upgradeModal( name, utmContent, $this.data( 'license' ), $this.data( 'video' ), $this.data( 'plural' ) );
|
||||
},
|
||||
|
||||
/**
|
||||
* Upgrade modal.
|
||||
*
|
||||
* @since 1.6.6
|
||||
*
|
||||
* @param {string} feature Feature name.
|
||||
* @param {string} utmContent UTM content.
|
||||
* @param {string} type Feature license type: pro or elite.
|
||||
* @param {string} video Feature video URL.
|
||||
* @param {boolean} isPlural Is feature name plural.
|
||||
*/
|
||||
upgradeModal( feature, utmContent, type, video, isPlural ) {
|
||||
// Provide a default value.
|
||||
if ( typeof type === 'undefined' || type.length === 0 ) {
|
||||
type = 'pro';
|
||||
}
|
||||
|
||||
// Make sure we received only a supported type.
|
||||
if ( $.inArray( type, [ 'pro', 'elite' ] ) < 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const message = wpforms_education.upgrade[ type ].message.replace( /%name%/g, feature );
|
||||
const isVideoModal = Boolean( video );
|
||||
const titleMessage = isPlural ? wpforms_education.upgrade[ type ].title_plural : wpforms_education.upgrade[ type ].title;
|
||||
|
||||
let modalWidth = WPFormsEducation.core.getUpgradeModalWidth( isVideoModal );
|
||||
|
||||
const modal = $.alert( {
|
||||
backgroundDismiss: true,
|
||||
title: feature + ' ' + titleMessage,
|
||||
icon: 'fa fa-lock',
|
||||
content: message,
|
||||
boxWidth: modalWidth,
|
||||
theme: 'modern,wpforms-education',
|
||||
closeIcon: true,
|
||||
onOpenBefore() {
|
||||
if ( isVideoModal ) {
|
||||
this.$el.addClass( 'has-video' );
|
||||
}
|
||||
|
||||
const videoHtml = isVideoModal ? '<iframe src="' + video + '" class="feature-video" allowfullscreen="" width="475" height="267"></iframe>' : '';
|
||||
|
||||
this.$btnc.after( '<div class="discount-note">' + wpforms_education.upgrade_bonus + '</div>' );
|
||||
this.$btnc.after( wpforms_education.upgrade[ type ].doc.replace( /%25name%25/g, feature ) );
|
||||
this.$btnc.after( videoHtml );
|
||||
|
||||
this.$body.find( '.jconfirm-content' ).addClass( 'lite-upgrade' );
|
||||
},
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: wpforms_education.upgrade[ type ].button,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action: () => {
|
||||
window.open( WPFormsEducation.core.getUpgradeURL( utmContent, type ), '_blank' );
|
||||
WPFormsEducation.core.upgradeModalThankYou( type );
|
||||
},
|
||||
},
|
||||
},
|
||||
} );
|
||||
|
||||
$( window ).on( 'resize', function() {
|
||||
modalWidth = WPFormsEducation.core.getUpgradeModalWidth( isVideoModal );
|
||||
|
||||
if ( modal.isOpen() ) {
|
||||
modal.setBoxWidth( modalWidth );
|
||||
}
|
||||
} );
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsEducation.liteCore.init();
|
||||
+1
@@ -0,0 +1 @@
|
||||
var WPFormsEducation=window.WPFormsEducation||{};WPFormsEducation.liteCore=window.WPFormsEducation.liteCore||((e,l,c)=>{let a={init(){c(a.ready)},ready(){a.events()},events(){a.openModalButtonClick()},openModalButtonClick(){c(e).on("click",".education-modal:not(.wpforms-add-fields-button)",a.openModalButtonHandler).on("mousedown",".education-modal.wpforms-add-fields-button",a.openModalButtonHandler)},openModalButtonHandler(o){var t=c(this);if(!t.data("action")||!["activate","install"].includes(t.data("action"))){o.preventDefault(),o.stopImmediatePropagation();let e=t.data("name");t.hasClass("wpforms-add-fields-button")&&(e=t.text(),e+=e.indexOf(wpforms_builder.field)<0?" "+wpforms_builder.field:"");o=WPFormsEducation.core.getUTMContentValue(t);a.upgradeModal(e,o,t.data("license"),t.data("video"),t.data("plural"))}},upgradeModal(a,n,d,i,r){if(void 0!==d&&0!==d.length||(d="pro"),!(c.inArray(d,["pro","elite"])<0)){var s=wpforms_education.upgrade[d].message.replace(/%name%/g,a);let o=Boolean(i);r=r?wpforms_education.upgrade[d].title_plural:wpforms_education.upgrade[d].title;let e=WPFormsEducation.core.getUpgradeModalWidth(o),t=c.alert({backgroundDismiss:!0,title:a+" "+r,icon:"fa fa-lock",content:s,boxWidth:e,theme:"modern,wpforms-education",closeIcon:!0,onOpenBefore(){o&&this.$el.addClass("has-video");var e=o?'<iframe src="'+i+'" class="feature-video" allowfullscreen="" width="475" height="267"></iframe>':"";this.$btnc.after('<div class="discount-note">'+wpforms_education.upgrade_bonus+"</div>"),this.$btnc.after(wpforms_education.upgrade[d].doc.replace(/%25name%25/g,a)),this.$btnc.after(e),this.$body.find(".jconfirm-content").addClass("lite-upgrade")},buttons:{confirm:{text:wpforms_education.upgrade[d].button,btnClass:"btn-confirm",keys:["enter"],action:()=>{l.open(WPFormsEducation.core.getUpgradeURL(n,d),"_blank"),WPFormsEducation.core.upgradeModalThankYou(d)}}}});c(l).on("resize",function(){e=WPFormsEducation.core.getUpgradeModalWidth(o),t.isOpen()&&t.setBoxWidth(e)})}}};return a})(document,window,jQuery),WPFormsEducation.liteCore.init();
|
||||
+565
@@ -0,0 +1,565 @@
|
||||
/* global wpforms_education_lite_connect, WPFormsChallenge */
|
||||
/**
|
||||
* WPForms Education for Lite.
|
||||
*
|
||||
* Lite Connect feature.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*/
|
||||
|
||||
// eslint-disable-next-line no-var
|
||||
var WPFormsEducation = window.WPFormsEducation || {};
|
||||
|
||||
WPFormsEducation.liteConnect = window.WPFormsEducation.liteConnect || ( function( document, window, $ ) {
|
||||
/**
|
||||
* Public functions and properties.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*
|
||||
* @type {Object}
|
||||
*/
|
||||
const app = {
|
||||
|
||||
/**
|
||||
* Start the engine.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*/
|
||||
init() {
|
||||
$( app.ready );
|
||||
|
||||
// Page load.
|
||||
$( window ).on( 'load', function() {
|
||||
// In the case of jQuery 3.+, we need to wait for a ready event first.
|
||||
if ( typeof $.ready.then === 'function' ) {
|
||||
$.ready.then( app.load );
|
||||
} else {
|
||||
app.load();
|
||||
}
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Document ready.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*/
|
||||
ready() {
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* Page load.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*/
|
||||
load() {
|
||||
app.events();
|
||||
app.initLiteConnectToggle();
|
||||
app.maybeRevealBuilderTopBar();
|
||||
},
|
||||
|
||||
/**
|
||||
* Register JS events.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*/
|
||||
events() {
|
||||
app.enableLiteConnectToggleClick();
|
||||
app.enableLiteConnectButtonClick();
|
||||
app.dismissBuilderTopBarClick();
|
||||
app.autoSaveToggleChange();
|
||||
app.enableLiteConnectAIButtonClick();
|
||||
},
|
||||
|
||||
/**
|
||||
* Init Lite Connect toggle.
|
||||
*
|
||||
* @since 1.7.5
|
||||
*/
|
||||
initLiteConnectToggle() {
|
||||
$( '.wpforms-toggle-control.wpforms-setting-lite-connect-auto-save-toggle input' ).prop( 'disabled', false );
|
||||
},
|
||||
|
||||
/**
|
||||
* Enable Lite Connect toggle mousedown handler.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*/
|
||||
enableLiteConnectToggleClick() {
|
||||
$( document ).on(
|
||||
'mousedown touchstart',
|
||||
'#wpforms-setting-row-lite-connect-enabled label, .wpforms-setting-lite-connect-auto-save-toggle label',
|
||||
function( event ) {
|
||||
const isTouchDevice = 'ontouchstart' in document.documentElement;
|
||||
|
||||
if ( ! isTouchDevice ) {
|
||||
event.preventDefault();
|
||||
}
|
||||
|
||||
const wrapper = $( this ).closest( '#wpforms-setting-row-lite-connect-enabled, .wpforms-setting-lite-connect-auto-save-toggle' );
|
||||
|
||||
const $input = wrapper.find( '#wpforms-setting-lite-connect-enabled' );
|
||||
|
||||
if ( $input.prop( 'disabled' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
const isEnabled = $input.is( ':checked' );
|
||||
|
||||
app.openSettingsLiteConnectModal( isEnabled, function() {
|
||||
$input
|
||||
.trigger( 'click' )
|
||||
.prop( 'disabled', true );
|
||||
} );
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Enable Lite Connect button click handler.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*/
|
||||
enableLiteConnectButtonClick() {
|
||||
$( document ).on(
|
||||
'click',
|
||||
'.wpforms-dyk-lite-connect .button-primary',
|
||||
function( event ) {
|
||||
event.preventDefault();
|
||||
|
||||
const $button = $( this );
|
||||
|
||||
if ( $button.hasClass( 'wpforms-is-enabled' ) ) {
|
||||
window.open( $button.attr( 'href' ) );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
app.openSettingsLiteConnectModal(
|
||||
false,
|
||||
app.enableLiteConnectButtonModalConfirm
|
||||
);
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Enable Lite Connect button click handler.
|
||||
*
|
||||
* @since 1.9.1
|
||||
*/
|
||||
enableLiteConnectAIButtonClick() {
|
||||
$( document ).on(
|
||||
'click',
|
||||
'.enable-lite-connect-modal',
|
||||
app.handleLiteConnectModalClick,
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Finalize the Lite Connect keys setup.
|
||||
*
|
||||
* @since 1.9.1
|
||||
*
|
||||
* @return {jQuery} AJAX request deferred object.
|
||||
*/
|
||||
finalizeLiteConnectSetup() {
|
||||
return $.get( wpforms_education_lite_connect.ajax_url, {
|
||||
action: 'wpforms_lite_connect_finalize',
|
||||
nonce: wpforms_education_lite_connect.nonce,
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle Lite Connect modal click.
|
||||
*
|
||||
* @since 1.9.1
|
||||
*
|
||||
* @param {Event} event Event object.
|
||||
*/
|
||||
handleLiteConnectModalClick( event ) {
|
||||
event.preventDefault();
|
||||
|
||||
app.openAILiteConnectEnableModal(
|
||||
function() {
|
||||
app.saveSettingAjaxPost( true, $(), function() {
|
||||
app.switchSettingView( true, $( '#wpforms-builder-lite-connect-top-bar .wpforms-toggle-control' ) );
|
||||
|
||||
// Finalize the Lite Connect keys setup.
|
||||
app.finalizeLiteConnectSetup()
|
||||
.done( () => {
|
||||
app.removeLiteConnectModalOnAIButtons();
|
||||
} );
|
||||
} );
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Remove Lite Connect modal on AI buttons.
|
||||
*
|
||||
* @since 1.9.1
|
||||
*/
|
||||
removeLiteConnectModalOnAIButtons() {
|
||||
$( '.enable-lite-connect-modal.wpforms-prevent-default' ).each( function() {
|
||||
const $button = $( this );
|
||||
|
||||
// Update button class.
|
||||
$button.removeClass( 'enable-lite-connect-modal wpforms-prevent-default' );
|
||||
|
||||
// Open AI Form Generator.
|
||||
if ( $button.hasClass( 'wpforms-template-generate' ) ) {
|
||||
$button.trigger( 'click' );
|
||||
}
|
||||
|
||||
// Close the top bar in the form builder.
|
||||
if ( $( '#wpforms-builder-lite-connect-top-bar' ).length ) {
|
||||
app.toggleBuilderTopBar( false );
|
||||
}
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Enable Lite Connect button modal confirm Callback.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*/
|
||||
enableLiteConnectButtonModalConfirm() {
|
||||
const $toggle = $( '.wpforms-dyk-lite-connect .button-primary' );
|
||||
|
||||
app.saveSettingAjaxPost( true, $toggle, function() {
|
||||
app.switchSettingView( true, $toggle );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Form Entry Backups information modal.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*
|
||||
* @param {boolean} isEnabled Current setting state.
|
||||
* @param {Function} confirmCallback Confirm button action.
|
||||
*/
|
||||
openSettingsLiteConnectModal( isEnabled, confirmCallback ) {
|
||||
if ( isEnabled ) {
|
||||
app.openSettingsLiteConnectDisableModal( confirmCallback );
|
||||
} else {
|
||||
app.openSettingsLiteConnectEnableModal( confirmCallback );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Form Entry Backups enable information modal.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*
|
||||
* @param {Function} confirmCallback Confirm button action.
|
||||
*/
|
||||
openSettingsLiteConnectEnableModal( confirmCallback ) {
|
||||
const $args = {
|
||||
content: wp.template( 'wpforms-settings-lite-connect-modal-content' )(),
|
||||
confirm: {
|
||||
text: wpforms_education_lite_connect.enable_modal.confirm,
|
||||
callback: confirmCallback,
|
||||
},
|
||||
};
|
||||
|
||||
app.enableModal( $args );
|
||||
},
|
||||
|
||||
/**
|
||||
* AI features enable information modal.
|
||||
*
|
||||
* @since 1.9.1
|
||||
*
|
||||
* @param {Function} confirmCallback Confirm button action.
|
||||
*/
|
||||
openAILiteConnectEnableModal( confirmCallback ) {
|
||||
const $args = {
|
||||
content: wp.template( 'wpforms-builder-ai-lite-connect-modal-content' )(),
|
||||
confirm: {
|
||||
text: wpforms_education_lite_connect.enable_ai.confirm,
|
||||
callback: confirmCallback,
|
||||
},
|
||||
theme: 'modern, ai-modal',
|
||||
};
|
||||
|
||||
// eslint-disable-next-line camelcase
|
||||
wpforms_education_lite_connect.update_result.enabled_title = wpforms_education_lite_connect.enable_ai.enabled_title;
|
||||
|
||||
app.enableModal( $args );
|
||||
},
|
||||
|
||||
/**
|
||||
* Render Enable modal.
|
||||
*
|
||||
* @param {Object} $args Modal arguments.
|
||||
*/
|
||||
enableModal( $args ) {
|
||||
$.alert( {
|
||||
title: false,
|
||||
content: $args.content,
|
||||
icon: false,
|
||||
type: 'orange',
|
||||
boxWidth: 550,
|
||||
theme: $args.theme || 'modern',
|
||||
useBootstrap: false,
|
||||
scrollToPreviousElement: false,
|
||||
buttons: {
|
||||
confirm: {
|
||||
text: $args.confirm.text,
|
||||
btnClass: 'btn-confirm',
|
||||
keys: [ 'enter' ],
|
||||
action() {
|
||||
if ( typeof $args.confirm.callback === 'function' ) {
|
||||
$args.confirm.callback();
|
||||
}
|
||||
|
||||
// Maybe close Challenge popup.
|
||||
if ( window.WPFormsChallenge ) {
|
||||
// eslint-disable-next-line no-var
|
||||
var completeChallenge = WPFormsChallenge.embed && WPFormsChallenge.embed.completeChallenge;
|
||||
}
|
||||
|
||||
if ( typeof completeChallenge === 'function' ) {
|
||||
completeChallenge();
|
||||
}
|
||||
},
|
||||
},
|
||||
cancel: {
|
||||
text: wpforms_education_lite_connect.enable_modal.cancel,
|
||||
action() {
|
||||
$( '.wpforms-challenge-popup-container' ).removeClass( 'wpforms-invisible' );
|
||||
},
|
||||
},
|
||||
},
|
||||
onOpenBefore() {
|
||||
$( 'body' ).addClass( 'wpforms-setting-lite-connect-modal' );
|
||||
$( '.wpforms-challenge-popup-container' ).addClass( 'wpforms-invisible' );
|
||||
},
|
||||
onDestroy() {
|
||||
$( 'body' ).removeClass( 'wpforms-setting-lite-connect-modal' );
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Form Entry Backups disable information modal.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*
|
||||
* @param {Function} confirmCallback Confirm button action.
|
||||
*/
|
||||
openSettingsLiteConnectDisableModal( confirmCallback ) {
|
||||
$.alert( {
|
||||
title: wpforms_education_lite_connect.disable_modal.title,
|
||||
content: wpforms_education_lite_connect.disable_modal.content,
|
||||
icon: 'fa fa-exclamation-circle',
|
||||
type: 'red',
|
||||
boxWidth: '400px',
|
||||
theme: 'modern',
|
||||
useBootstrap: false,
|
||||
animateFromElement: false,
|
||||
scrollToPreviousElement: false,
|
||||
buttons: {
|
||||
cancel: {
|
||||
text: wpforms_education_lite_connect.disable_modal.cancel,
|
||||
keys: [ 'enter' ],
|
||||
btnClass: 'btn-confirm',
|
||||
},
|
||||
confirm: {
|
||||
text: wpforms_education_lite_connect.disable_modal.confirm,
|
||||
action() {
|
||||
if ( typeof confirmCallback === 'function' ) {
|
||||
confirmCallback();
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Save Lite Connect Enabled setting AJAX post call.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*
|
||||
* @param {boolean} isEnabled Lite Connect setting flag.
|
||||
* @param {jQuery|undefined} $toggle Toggle control outer element.
|
||||
* @param {Function} successCallback Success result callback.
|
||||
*/
|
||||
saveSettingAjaxPost( isEnabled, $toggle, successCallback ) {
|
||||
$toggle = $toggle || $();
|
||||
|
||||
const $input = $toggle.find( 'input' );
|
||||
|
||||
// Perform AJAX request.
|
||||
$.post(
|
||||
wpforms_education_lite_connect.ajax_url,
|
||||
{
|
||||
action: 'wpforms_update_lite_connect_enabled_setting',
|
||||
value: isEnabled ? 1 : 0,
|
||||
nonce: wpforms_education_lite_connect.nonce,
|
||||
}
|
||||
).done( function( res ) {
|
||||
if ( ! res.success ) {
|
||||
$input.prop( 'checked', ! isEnabled );
|
||||
app.updateResultModal( 'error' );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
app.updateResultModal( isEnabled ? 'enabled' : 'disabled' );
|
||||
|
||||
if ( typeof successCallback === 'function' ) {
|
||||
successCallback();
|
||||
}
|
||||
} ).fail( function() {
|
||||
$input.prop( 'checked', ! isEnabled );
|
||||
app.updateResultModal( 'error' );
|
||||
} ).always( function() {
|
||||
$input.prop( 'disabled', false );
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Lite Connect toggle `change` event handler with "auto save" feature.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*/
|
||||
autoSaveToggleChange() {
|
||||
$( document ).on(
|
||||
'change',
|
||||
'.wpforms-toggle-control.wpforms-setting-lite-connect-auto-save-toggle input',
|
||||
function() {
|
||||
const $input = $( this ),
|
||||
$toggle = $input.closest( '.wpforms-toggle-control' ),
|
||||
isEnabled = $input.is( ':checked' );
|
||||
|
||||
app.saveSettingAjaxPost( isEnabled, $toggle, function() {
|
||||
app.switchSettingView( isEnabled, $toggle );
|
||||
app.removeLiteConnectModalOnAIButtons();
|
||||
|
||||
// Finalize the Lite Connect keys setup.
|
||||
app.finalizeLiteConnectSetup();
|
||||
} );
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* After updating setting via AJAX we should hide toggle container and show info container.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*
|
||||
* @param {boolean} isEnabled Toggle state.
|
||||
* @param {jQuery} $toggle Toggle control.
|
||||
*/
|
||||
switchSettingView( isEnabled, $toggle ) {
|
||||
const $wrapper = $toggle.closest( '.wpforms-education-lite-connect-wrapper' ),
|
||||
$setting = $wrapper.find( '.wpforms-education-lite-connect-setting' ),
|
||||
$enabledInfo = $wrapper.find( '.wpforms-education-lite-connect-enabled-info' );
|
||||
|
||||
$setting.toggleClass( 'wpforms-hidden', isEnabled );
|
||||
$enabledInfo.toggleClass( 'wpforms-hidden', ! isEnabled );
|
||||
},
|
||||
|
||||
/**
|
||||
* Update result message modal.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*
|
||||
* @param {string} msg Message slug.
|
||||
*/
|
||||
updateResultModal( msg ) {
|
||||
if ( ! wpforms_education_lite_connect.update_result[ msg ] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$.alert( {
|
||||
title: wpforms_education_lite_connect.update_result[ msg + '_title' ],
|
||||
content: wpforms_education_lite_connect.update_result[ msg ],
|
||||
icon: 'fa fa-check-circle',
|
||||
type: msg === 'error' ? 'red' : 'green',
|
||||
theme: 'modern',
|
||||
boxWidth: '400px',
|
||||
useBootstrap: false,
|
||||
animation: 'scale',
|
||||
closeAnimation: 'scale',
|
||||
animateFromElement: false,
|
||||
scrollToPreviousElement: false,
|
||||
buttons: {
|
||||
confirm: {
|
||||
text : wpforms_education_lite_connect.update_result.close,
|
||||
btnClass: 'btn-confirm',
|
||||
keys : [ 'enter' ],
|
||||
},
|
||||
},
|
||||
} );
|
||||
},
|
||||
|
||||
/**
|
||||
* Reveal top bar in the Form Builder.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*/
|
||||
maybeRevealBuilderTopBar() {
|
||||
// Skip it is not Form Builder or Entry Backups is already enabled or top bar is dismissed.
|
||||
if (
|
||||
! window.wpforms_builder ||
|
||||
wpforms_education_lite_connect.is_enabled === '1' ||
|
||||
$( '#wpforms-builder-lite-connect-top-bar' ).length === 0
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
setTimeout( function() {
|
||||
app.toggleBuilderTopBar( true );
|
||||
}, 3000 );
|
||||
},
|
||||
|
||||
/**
|
||||
* Toggle top bar in the Form Builder.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*
|
||||
* @param {boolean} open True for open, false for close.
|
||||
*/
|
||||
toggleBuilderTopBar( open ) {
|
||||
const cssVar = '--wpforms-admin-bar-height';
|
||||
const root = document.documentElement;
|
||||
const topBarHeight = 45;
|
||||
|
||||
let adminBarHeight = parseInt( getComputedStyle( root ).getPropertyValue( cssVar ), 10 );
|
||||
|
||||
adminBarHeight += open ? topBarHeight : -topBarHeight;
|
||||
|
||||
root.setAttribute(
|
||||
'style',
|
||||
cssVar + ': ' + ( adminBarHeight ) + 'px!important;'
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Dismiss top bar in the Form Builder.
|
||||
*
|
||||
* @since 1.7.4
|
||||
*/
|
||||
dismissBuilderTopBarClick() {
|
||||
$( document ).on(
|
||||
'click',
|
||||
'#wpforms-builder-lite-connect-top-bar .wpforms-dismiss-button',
|
||||
function() {
|
||||
app.toggleBuilderTopBar( false );
|
||||
}
|
||||
);
|
||||
},
|
||||
};
|
||||
|
||||
// Provide access to public functions/properties.
|
||||
return app;
|
||||
}( document, window, jQuery ) );
|
||||
|
||||
// Initialize.
|
||||
WPFormsEducation.liteConnect.init();
|
||||
Vendored
Executable
+1
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user