: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
if ( ! wpforms_form_templates.can_install_addons ) {
app.userCannotInstallAddonsModal( prompt );
app.userCanInstallAddonsModal( formName, template, addons, prompt, callback );
* Open the template addon alert for admins.
* @param {string} formName Name of the form.
* @param {string} template Template slug.
* @param {Array} addons Array of addon slugs.
* @param {string} prompt Modal content.
* @param {Function} callback The function to set the template.
userCanInstallAddonsModal( formName, template, addons, prompt, callback ) {
const spinner = '<i class="wpforms-loading-spinner wpforms-loading-white wpforms-loading-inline"></i>';
title: wpforms_form_templates.heads_up,
icon: 'fa fa-exclamation-circle',
text: wpforms_form_templates.install_confirm,
.prop( 'disabled', true )
.html( spinner + wpforms_form_templates.activating );
.prop( 'disabled', true );
app.installActivateAddons( addons, this, formName, template, callback );
text: wpforms_form_templates.cancel,
WPFormsFormTemplates.selectTemplateCancel();
* Open the template addon alert for non-admins.
* @param {string} prompt Modal content.
userCannotInstallAddonsModal( prompt ) {
title: wpforms_form_templates.heads_up,
icon: 'fa fa-exclamation-circle',
text: wpforms_form_templates.ok,
WPFormsFormTemplates.selectTemplateCancel();
* Install & Activate addons via AJAX.
* @param {Array} addons Addons slugs.
* @param {Object} previousModal Previous modal instance.
* @param {string} formName Name of the form.
* @param {string} template Template slug.
* @param {Function} callback The function to set the template.
installActivateAddons( addons, previousModal, formName, template, callback ) {
let promiseChain = false;
// Put each of the ajax call promise to the chain.
addons.forEach( function( addon ) {
if ( typeof promiseChain.done !== 'function' ) {
promiseChain = app.installActivateAddonAjax( addon );
promiseChain = promiseChain
.done( function( value ) {
ajaxResults.push( value );
return app.installActivateAddonAjax( addon );
.fail( function( error ) {
ajaxErrors.push( error );
// Latest promise result and error.
.done( function( value ) {
ajaxResults.push( value );
.fail( function( error ) {
ajaxErrors.push( error );
// Finally, resolve all the promises.
ajaxResults.length > 0 &&
wpf.listPluck( ajaxResults, 'success' ).every( Boolean ) && // Check if every `success` is true.
callback( formName, template );
app.installActivateAddonsError( formName, template, callback );
* Install & Activate addons error modal.
* @param {string} formName Name of the form.
* @param {string} template Template slug.
* @param {Function} callback The function to set the template.
installActivateAddonsError( formName, template, callback ) {
title: wpforms_form_templates.heads_up,
content: wpforms_form_templates.template_addons_error,
icon: 'fa fa-exclamation-circle',
text: wpforms_form_templates.use_template,
callback( formName, template );
text: wpforms_form_templates.cancel,
app.selectTemplateCancel();
* Install & Activate single addon via AJAX.
* @param {string} addon Addon slug.
* @return {Promise} jQuery ajax call promise.
installActivateAddonAjax( addon ) {
const addonData = wpforms_addons[ addon ];
const deferred = new $.Deferred();
[ 'activate', 'install' ].indexOf( addonData.action ) < 0
deferred.resolve( false );
return deferred.promise();
wpforms_form_templates.ajaxurl,
action: 'wpforms_' + addonData.action + '_addon',
nonce: wpforms_form_templates.admin_nonce,
plugin: addonData.action === 'activate' ? addon + '/' + addon + '.php' : addonData.url,
// Provide access to public functions/properties.
}( document, window, jQuery ) );
WPFormsFormTemplates.init();