: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
active: 'wpforms-addons-list-item-footer-active',
activating: 'wpforms-addons-list-item-footer-activating',
installed: 'wpforms-addons-list-item-footer-installed',
missing: 'wpforms-addons-list-item-footer-missing',
goToUrl: 'wpforms-addons-list-item-footer-go-to-url',
withError: 'wpforms-addons-list-item-footer-with-error',
if ( $footer.hasClass( classes.goToUrl ) ) {
window.open( $btn.attr( 'data-plugin' ), '_blank' );
$btn.prop( 'disabled', true );
let checked = $btn.is( ':checked' );
const plugin = $footer.attr( 'data-plugin' );
const pluginType = $footer.attr( 'data-type' );
const $addon = $btn.parents( '.wpforms-addons-list-item' );
const state = WPFormsAdmin.getAddonState( $footer, classes, $btn );
* @param {Object} res Response object.
function handleError( res ) {
$footer.addClass( classes.withError );
if ( typeof res.data === 'object' ) {
$footer.append( `<div class="wpforms-addons-list-item-footer-error"><p>${ pluginType === 'addon' ? wpforms_admin.addon_error : wpforms_admin.plugin_error }</p></div>` );
$footer.append( `<div class="wpforms-addons-list-item-footer-error"><p>${ res.data }</p></div>` );
if ( state === 'install' ) {
WPFormsAdmin.removeSpinnerFromButton( $btn );
} else if ( state === 'deactivate' ) {
} else if ( state === 'activate' ) {
* @param {Object} res Response object.
function handleSuccess( res ) {
if ( state === 'install' ) {
cssClass = classes.active;
$footer.attr( 'data-plugin', res.data.basename );
if ( ! res.data.is_activated ) {
cssClass = classes.installed;
$btn = $btn.closest( '.wpforms-addons-list-item' ).find( '.wpforms-toggle-control input' );
} else if ( state === 'activate' ) {
$footer.find( '.wpforms-addons-list-item-footer-settings-link' ).fadeIn( 150 );
cssClass = classes.active;
} else if ( state === 'deactivate' ) {
$footer.find( '.wpforms-addons-list-item-footer-settings-link' ).fadeOut( 150 );
cssClass = classes.installed;
$footer.removeClass( classes.active + ' ' + classes.installed + ' ' + classes.missing ).addClass( cssClass );
WPFormsAdmin.setAddonState( plugin, state, pluginType, function( res ) {
WPFormsAdmin.updateAddonButtonPropertiesAndUI( $btn, $addon, $footer, classes, checked );
data: wpforms_admin.server_error,
WPFormsAdmin.updateAddonButtonPropertiesAndUI( $btn, $addon, $footer, classes, checked );
* @param {Object} $button Button element.
addSpinnerToButton( $button ) {
const spinnerBlue = '<i class="wpforms-loading-spinner wpforms-loading-blue wpforms-loading-inline"></i>';
const originalWidth = $button.width();
$button.data( 'original-text', $button.html() );
$button.width( originalWidth ).html( spinnerBlue );
* Remove spinner from button.
* @param {Object} $button Button element.
removeSpinnerFromButton( $button ) {
$button.html( $button.data( 'original-text' ) );
* @param {Object} $footer Footer element.
* @param {Object} classes Classes object.
* @param {Object} $button Button element.
* @return {string} State.
getAddonState( $footer, classes, $button ) {
if ( $footer.hasClass( classes.active ) ) {
} else if ( $footer.hasClass( classes.installed ) ) {
} else if ( $footer.hasClass( classes.missing ) ) {
WPFormsAdmin.addSpinnerToButton( $button );
* Update button properties and UI.
* @param {Object} $btn Button element.
* @param {Object} $addon Addon element.
* @param {Object} $footer Footer element.
* @param {Object} classes Classes object.
* @param {boolean} checked Checked state.
updateAddonButtonPropertiesAndUI( $btn, $addon, $footer, classes, checked ) {
$btn.prop( 'checked', checked );
$btn.prop( 'disabled', false );
$btn.siblings( '.wpforms-toggle-control-status' ).html( $btn.siblings( '.wpforms-toggle-control-status' ).data( checked ? 'on' : 'off' ) );
if ( $addon.find( '.wpforms-addons-list-item-footer-error' ).length > 0 ) {
$footer.removeClass( classes.withError );
$addon.find( '.wpforms-addons-list-item-footer-error' ).remove();
const currentURL = window.location.href;
// eslint-disable-next-line compat/compat
const urlObject = new URL( currentURL );
const searchParams = urlObject.searchParams;
const addon = searchParams.get( 'addon' );
const $elementToScrollTo = $( '.wpforms-settings-provider[id*="' + addon + '"]' );
if ( $elementToScrollTo.length ) {
$( window ).scrollTop( $elementToScrollTo.offset().top );
searchParams.delete( 'addon' );
window.history.pushState( {}, document.title, urlObject.toString() );
* @param {Object} $btn Button element.
// eslint-disable-next-line max-lines-per-function,complexity
if ( $btn.hasClass( 'status-go-to-url' ) ) {
window.open( $btn.attr( 'data-plugin' ), '_blank' );
$btn.prop( 'disabled', true ).addClass( 'loading' );
$btn.html( s.iconSpinner );
const pluginType = $btn.attr( 'data-type' );
if ( $btn.hasClass( 'status-active' ) ) {
cssClass = 'status-installed';
if ( pluginType === 'plugin' ) {
cssClass += ' button button-secondary';
stateText = wpforms_admin.addon_inactive;
buttonText = wpforms_admin.addon_activate;
errorText = wpforms_admin.addon_deactivate;
if ( pluginType === 'addon' ) {
buttonText = s.iconActivate + buttonText;
errorText = s.iconDeactivate + errorText;
} else if ( $btn.hasClass( 'status-installed' ) ) {
cssClass = 'status-active';
if ( pluginType === 'plugin' ) {
cssClass += ' button button-secondary disabled';
stateText = wpforms_admin.addon_active;
buttonText = wpforms_admin.addon_deactivate;
if ( pluginType === 'addon' ) {
buttonText = s.iconDeactivate + buttonText;
errorText = s.iconActivate + wpforms_admin.addon_activate;
} else if ( pluginType === 'plugin' ) {
buttonText = wpforms_admin.addon_activated;
errorText = wpforms_admin.addon_activate;
} else if ( $btn.hasClass( 'status-missing' ) ) {
cssClass = 'status-active';
if ( pluginType === 'plugin' ) {
cssClass += ' button disabled';
stateText = wpforms_admin.addon_active;
buttonText = wpforms_admin.addon_activated;
errorText = s.iconInstall;
if ( pluginType === 'addon' ) {
buttonText = s.iconActivate + wpforms_admin.addon_deactivate;
errorText += wpforms_admin.addon_install;
const plugin = $btn.attr( 'data-plugin' );
// eslint-disable-next-line complexity
WPFormsAdmin.setAddonState( plugin, state, pluginType, function( res ) {
const $addon = $btn.closest( '.addon-item' );
if ( 'install' === state ) {
$btn.attr( 'data-plugin', res.data.basename );
successText = res.data.msg;
if ( ! res.data.is_activated ) {
stateText = wpforms_admin.addon_inactive;
buttonText = 'plugin' === pluginType ? wpforms_admin.addon_activate : s.iconActivate + wpforms_admin.addon_activate;
cssClass = 'plugin' === pluginType ? 'status-installed button button-secondary' : 'status-installed';
$addon.find( '.actions' ).append( '<div class="msg success">' + successText + '</div>' );
$addon.find( 'span.status-label' )
.removeClass( 'status-active status-installed status-missing' )
.removeClass( 'button button-primary button-secondary disabled' )
.removeClass( 'status-active status-installed status-missing' )
.removeClass( 'button button-primary button-secondary disabled' )
.addClass( cssClass ).html( buttonText );
if ( 'object' === typeof res.data ) {
if ( pluginType === 'addon' ) {
$addon.find( '.actions' ).append( '<div class="msg error"><p>' + wpforms_admin.addon_error + '</p></div>' );
$addon.find( '.actions' ).append( '<div class="msg error"><p>' + wpforms_admin.plugin_error + '</p></div>' );
$addon.find( '.actions' ).append( '<div class="msg error"><p>' + res.data + '</p></div>' );
if ( 'install' === state && 'plugin' === pluginType ) {
$btn.addClass( 'status-go-to-url' ).removeClass( 'status-missing' );
$btn.prop( 'disabled', false ).removeClass( 'loading' );
if ( ! $addon.find( '.actions' ).find( '.msg.error' ).length ) {
$( '.addon-item .msg' ).remove();
// eslint-disable-next-line no-console
console.log( error.responseText );
//--------------------------------------------------------------------//
//--------------------------------------------------------------------//
* Element bindings for Settings page.
initSettings: function() {
$( document ).on( 'wpformsReady', function() {
// Only proceed if we're on the settings page.
if ( ! $( '#wpforms-settings' ).length ) {
// Watch for hashes and scroll to if found.
// Display all addon boxes as the same height.
var integrationFocus = WPFormsAdmin.getQueryString( 'wpforms-integration' ),
jumpTo = WPFormsAdmin.getQueryString( 'jump' );
if ( integrationFocus ) {
{ scrollTop: $( '#wpforms-integration-' + integrationFocus ).offset().top },
{ scrollTop: $( '#' + jumpTo ).offset().top },
// Settings conditional logic.
$( '.wpforms-admin-settings-form' ).conditions( [
// Misc > Disable User Cookies visibility.
element: '#wpforms-setting-gdpr',
element: '#wpforms-setting-row-gdpr-disable-uuid,#wpforms-setting-row-gdpr-disable-details',
element: '#wpforms-setting-row-gdpr-disable-uuid,#wpforms-setting-row-gdpr-disable-details',
element: 'input[name=captcha-provider]:checked',
element: '.wpforms-setting-row',
element: '.wpforms-setting-recaptcha, #wpforms-setting-row-recaptcha-site-key, #wpforms-setting-row-recaptcha-secret-key, #wpforms-setting-row-recaptcha-fail-msg, .wpforms-setting-turnstile, #wpforms-setting-row-turnstile-heading, #wpforms-setting-row-turnstile-site-key, #wpforms-setting-row-turnstile-secret-key, #wpforms-setting-row-turnstile-theme, #wpforms-setting-row-turnstile-fail-msg',
element: 'input[name=captcha-provider]:checked',
element: '.wpforms-setting-row',
element: '#wpforms-setting-row-hcaptcha-heading, #wpforms-setting-row-hcaptcha-site-key, #wpforms-setting-row-hcaptcha-secret-key, #wpforms-setting-row-hcaptcha-fail-msg, #wpforms-setting-row-turnstile-heading, #wpforms-setting-row-turnstile-site-key, #wpforms-setting-row-turnstile-secret-key, #wpforms-setting-row-turnstile-theme, #wpforms-setting-row-turnstile-fail-msg',
element: 'input[name=captcha-provider]:checked',
element: '.wpforms-setting-row',
element: '#wpforms-setting-row-hcaptcha-heading, #wpforms-setting-row-hcaptcha-site-key, #wpforms-setting-row-hcaptcha-secret-key, #wpforms-setting-row-hcaptcha-fail-msg, .wpforms-setting-recaptcha, #wpforms-setting-row-recaptcha-site-key, #wpforms-setting-row-recaptcha-secret-key, #wpforms-setting-row-recaptcha-fail-msg',
element: 'input[name=captcha-provider]:checked',
element: '.wpforms-setting-row',
element: '.wpforms-setting-captcha-heading, #wpforms-setting-row-captcha-provider',
// Render engine setting.
$( document ).on( 'change', '#wpforms-setting-row-render-engine input', WPFormsAdmin.settingsRenderEngineChange );
// Form styles plugin setting.
$( document ).on( 'change', '#wpforms-setting-disable-css', function() {
WPFormsAdmin.settingsFormStylesAlert( $( this ).val() );
$( document ).on( 'click', '.wpforms-setting-row-image button', function( event ) {
// If the remove button was clicked, clear the value and remove the image.
if ( $( this ).hasClass( 'wpforms-setting-remove-image' ) ) {
const $wrapper = $( this ).closest( '.wpforms-setting-row-image' );
$wrapper.find( 'input' ).val( '' ).attr( 'value', '' ).trigger( 'change' ).end().find( 'img' ).remove();
WPFormsAdmin.imageUploadModal( $( this ) );