: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
$( document ).on( 'click', '#wpforms-setting-license-key-verify', function( event ) {
WPFormsAdmin.licenseVerify( $( this ) );
// Show message for license field.
$( document ).on( 'click', '.wpforms-setting-license-wrapper', function( event ) {
var $keyField = $( '#wpforms-setting-license-key' );
if ( ! $keyField.length ) {
if ( ! $keyField.prop( 'disabled' ) ) {
WPFormsAdmin.licenseEditMessage();
// Deactivate license key.
$( document ).on( 'click', '#wpforms-setting-license-key-deactivate', function( event ) {
WPFormsAdmin.licenseDeactivate( $( this ) );
$( document ).on( 'click', '#wpforms-setting-license-key-refresh', function( event ) {
WPFormsAdmin.licenseRefresh( $( this ) );
* @todo Refactor providers settings tab. Code below is legacy.
$( document ).on( 'click', '.wpforms-settings-provider-connect', function( event ) {
WPFormsAdmin.integrationConnect( button );
// Integration account disconnect.
$( document ).on( 'click', '.wpforms-settings-provider-accounts-list .remove a', function( event ) {
WPFormsAdmin.integrationDisconnect( $( this ) );
// Integration individual display toggling.
$( document ).on( 'click', '.wpforms-settings-provider:not(.focus-out) .wpforms-settings-provider-header', function( event ) {
.find( '.wpforms-settings-provider-accounts' )
.slideToggle( '', function() {
$this.parent().find( '.wpforms-settings-provider-logo i' ).toggleClass( 'fa-chevron-right fa-chevron-down' );
// Integration accounts display toggling.
$( document ).on( 'click', '.wpforms-settings-provider-accounts-toggle a', function( event ) {
var $connectFields = $( this ).parent().next( '.wpforms-settings-provider-accounts-connect' );
$connectFields.find( 'input[type=text], input[type=password]' ).val( '' );
$connectFields.stop().slideToggle();
// CAPTCHA settings page: type toggling.
$( document ).on( 'change', '#wpforms-setting-row-captcha-provider input', function() {
var $preview = $( '#wpforms-setting-row-captcha-preview' );
if ( this.value === 'hcaptcha' || this.value === 'turnstile' ) {
$preview.removeClass( 'wpforms-hidden' );
} else if ( this.value === 'none' ) {
$preview.addClass( 'wpforms-hidden' );
$( '#wpforms-setting-row-recaptcha-type input:checked' ).trigger( 'change' );
if ( $preview.find( '.wpforms-captcha-preview' ).length ) {
$preview.find( '.wpforms-captcha-preview' ).empty();
$preview.find( '.wpforms-captcha-placeholder' ).removeClass( 'wpforms-hidden' );
// CAPTCHA settings page: reCAPTCHA type toggling.
$( document ).on( 'change', '#wpforms-setting-row-recaptcha-type input', function() {
$( '#wpforms-setting-row-captcha-preview' ).toggleClass( 'wpforms-hidden', 'v2' !== this.value );
$( '#wpforms-setting-row-recaptcha-v3-threshold' ).toggleClass( 'wpforms-hidden', 'v3' !== this.value );
// Toggle control switch description.
$( document ).on( 'change', '.wpforms-toggle-control input', function() {
const $input = $( this ),
checked = $input.is( ':checked' ),
state = checked ? 'on' : 'off',
$field = $input.closest( '.wpforms-setting-field' ),
$control = $input.closest( '.wpforms-toggle-control' ),
$status = $control.find( '.wpforms-toggle-control-status' ),
$descOn = $field.find( '.wpforms-toggle-desc.desc-on' ),
$descOff = $field.find( '.wpforms-toggle-desc.desc-off' ),
isDoubleDesc = $descOn.length > 0 && $descOff.length > 0;
$descOn.toggleClass( 'wpforms-hidden', ! checked && isDoubleDesc );
$descOff.toggleClass( 'wpforms-hidden', checked && isDoubleDesc );
$status.html( $status.data( state ) );
* Render engine setting change event handler.
* @param {object} e Event object.
settingsRenderEngineChange: function( e ) {
// noinspection JSUnusedLocalSymbols
// eslint-disable-next-line
const renderEngine = $( this ).val();
// TODO: Add corresponding code that need to be executed on change render engine setting.
* Alert users if they change form styles to something that may give
settingsFormStylesAlert: function( value ) {
var msg = wpforms_admin.settings_form_style_base;
} else if ( '3' === value ) {
var msg = wpforms_admin.settings_form_style_none;
title: wpforms_admin.heads_up,
icon: 'fa fa-exclamation-circle',
* Image upload modal window.
* @param {jQuery} $el Image upload button element.
imageUploadModal( $el ) {
// To prevent caching of the media frame object and
// avoid confusion between multiple instances,
// this method no longer relies on the shared s.mediaFrame object.
// Instead, it creates a new mediaFrame object for each instance.
const $setting = $el.closest( '.wpforms-setting-field' );
s.mediaFrame = wpf.initMediaLibrary( {
title: wpforms_admin.upload_image_title,
extensions: wpforms_admin.upload_image_extensions,
extensionsError: wpforms_admin.upload_image_extensions_error,
buttonText: wpforms_admin.upload_image_button,
s.mediaFrame.on( 'select', function() {
// Grab our attachment selection and construct a JSON representation of the model.
const mediaAttachment = s.mediaFrame.state().get( 'selection' ).first().toJSON();
const $input = $setting.find( 'input[type=text]' );
// Send the attachment URL to our custom input field via jQuery.
$input.val( mediaAttachment.url );
$setting.find( 'img' ).remove();
$setting.prepend( '<img src="' + mediaAttachment.url + '">' );
$input.trigger( 'change' );
} ).on( 'close', function() {
s.mediaFrame.off( 'library:selection:add' );
// Now that everything has been set, let's open up the frame.
* @param {jQuery} $el Verify button element.
licenseVerify: function( $el ) {
var $row = $el.closest( '.wpforms-setting-row' ),
$keyField = $( '#wpforms-setting-license-key' ),
buttonWidth = $el.outerWidth(),
buttonLabel = $el.text(),
action: 'wpforms_verify_license',
nonce: wpforms_admin.nonce,
license: $keyField.val(),
$el.html( s.iconSpinner ).css( 'width', buttonWidth ).prop( 'disabled', true );
$.post( wpforms_admin.ajax_url, data, function( res ) {
var icon = 'fa fa-check-circle',
$row.find( '#wpforms-setting-license-key-info-message' ).empty().hide();
$row.find( '.type, .desc, #wpforms-setting-license-key-deactivate' ).show();
$row.find( '.type strong' ).text( res.data.type );
$( '.wpforms-license-notice' ).remove();
.prop( 'disabled', true )
.addClass( 'wpforms-setting-license-is-valid' )
.attr( 'value', $keyField.val() );
icon = 'fa fa-exclamation-circle';
$row.find( '.type, .desc, #wpforms-setting-license-key-deactivate' ).hide();
$keyField.prop( 'disabled', false );
title: msg.header ?? false,
$el.html( buttonLabel ).css( 'width', 'auto' ).prop( 'disabled', false );
} ).fail( function( xhr ) {
$keyField.prop( 'disabled', false );
console.log( xhr.responseText );
* Show message that license key editing is disabled.
licenseEditMessage: function() {
title: wpforms_admin.heads_up,
content: wpforms_admin.edit_license,
icon: 'fa fa-exclamation-circle',
* Deactivate a license key.
* @param {Element} el Button element.
licenseDeactivate: function( el ) {
const $row = $this.closest( '.wpforms-setting-row' );
const buttonWidth = $this.outerWidth();
const buttonLabel = $this.text();
action: 'wpforms_deactivate_license',
nonce: wpforms_admin.nonce,
$this.html( s.iconSpinner ).css( 'width', buttonWidth ).prop( 'disabled', true );
$.post( wpforms_admin.ajax_url, data, function( res ) {
let icon = 'fa fa-info-circle';
let title = wpforms_admin.success;
const msg = ! data.msg || typeof data.msg !== 'string' ? wpforms_admin.something_went_wrong : data.msg;
$row.find( '#wpforms-setting-license-key' )
.prop( { readonly: false, disabled: false } )
$row.find( '.wpforms-license-key-deactivate-remove' ).remove();
$row.find( '#wpforms-setting-license-key-info-message' ).html( data.info ).show();
$row.find( '#wpforms-setting-license-key-verify' ).prop( 'disabled', false ).show();
$row.find( '.type, .desc, #wpforms-setting-license-key-deactivate' ).hide();
icon = 'fa fa-exclamation-circle';
title = wpforms_admin.oops;
$this.html( buttonLabel ).css( 'width', 'auto' ).prop( 'disabled', false );
} ).fail( function( xhr ) {
console.log( xhr.responseText );
licenseRefresh: function( el ) {
$row = $this.closest( '.wpforms-setting-row' ),
$input = $( '#wpforms-setting-license-key' ),
action: 'wpforms_refresh_license',
nonce: wpforms_admin.nonce,
$.post( wpforms_admin.ajax_url, data, function( res ) {
var icon = 'fa fa-check-circle',
$row.find( '.type strong' ).text( res.data.type );
icon = 'fa fa-exclamation-circle';
$row.find( '.type, .desc' ).hide();
$input.removeClass( 'wpforms-setting-license-is-valid' ).addClass( 'wpforms-setting-license-is-invalid' );
title: msg.header ?? false,
} ).fail( function( xhr ) {
console.log( xhr.responseText );
* Connect integration provider account.
* @param $btn Button (.wpforms-settings-provider-connect) that was clicked to establish connection.
integrationConnect: function( $btn ) {
var buttonWidth = $btn.outerWidth(),
buttonLabel = $btn.text(),
$provider = $btn.closest( '.wpforms-settings-provider' ),
action : 'wpforms_settings_provider_add_' + $btn.data( 'provider' ),
data : $btn.closest( 'form' ).serialize(),
provider: $btn.data( 'provider' ),
nonce : wpforms_admin.nonce,
errorMessage = wpforms_admin.provider_auth_error;
$btn.html( wpforms_admin.connecting ).css( 'width', buttonWidth ).prop( 'disabled', true );
$.post( wpforms_admin.ajax_url, data, function( response ) {
if ( response.success ) {
$provider.find( '.wpforms-settings-provider-accounts-list ul' ).append( response.data.html );
$provider.addClass( 'connected' );
$btn.closest( '.wpforms-settings-provider-accounts-connect' ).stop().slideToggle();
Object.prototype.hasOwnProperty.call( response, 'data' ) &&
Object.prototype.hasOwnProperty.call( response.data, 'error_msg' )
errorMessage += '<br>' + response.data.error_msg;
WPFormsAdmin.integrationError( errorMessage );
WPFormsAdmin.integrationError( errorMessage );
$btn.html( buttonLabel ).css( 'width', 'auto' ).prop( 'disabled', false );
* Remove integration provider account.
* @param {object} el Disconnect link that was clicked to establish removing account.
integrationDisconnect: function( el ) {
$provider = $this.parents( '.wpforms-settings-provider' ),
action : 'wpforms_settings_provider_disconnect_' + $this.data( 'provider' ),
provider: $this.data( 'provider' ),
key : $this.data( 'key' ),
nonce : wpforms_admin.nonce,
errorMessage = wpforms_admin.provider_delete_error;