: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
/* global wpforms_admin, wpforms_forms_locator, wpforms_admin_forms_overview, Choices, wpf */
* WPForms Forms Overview.
var WPFormsForms = window.WPFormsForms || {};
WPFormsForms.Overview = WPFormsForms.Overview || ( function( document, window, $ ) {
* Public functions and properties.
app.adjustBulkEditTagsForm();
app.initEditTagsBulkActionItem();
el.$overview = $( '#wpforms-overview' );
el.$tagsFilterSelect = $( '.wpforms-tags-filter select' );
el.$tagsFilterButton = $( '.wpforms-tags-filter button' );
el.$listTableRows = $( '#wpforms-overview #the-list' );
el.$bulkEditTagsRows = $( '.wpforms-bulk-edit-tags' );
el.$bulkEditTagsForms = $( '.wpforms-bulk-edit-tags .wpforms-edit-forms select' );
el.$bulkEditTagsTags = $( '.wpforms-bulk-edit-tags .wpforms-edit-tags select' );
el.$bulkEditTagsMessage = $( '.wpforms-bulk-edit-tags .wpforms-message' );
const $table = el.$overview.find( '.wp-list-table' );
// Set the Name column as primary.
$table.find( '.column-primary' ).removeClass( 'column-primary' );
$table.find( '.column-name' ).addClass( 'column-primary' );
.on( 'click', '.wp-list-table .delete a, .wp-list-table .duplicate a', app.confirmSingleAction )
.on( 'click', '.button.delete-all', app.confirmSingleAction )
.on( 'click', '.bulkactions #doaction', app.confirmBulkAction )
.on( 'click', '#wpforms-reset-filter .reset', app.resetSearch )
.on( 'click', '.wp-list-table .wpforms-locations-count, .wp-list-table .row-actions .locations, .wp-list-table .wpforms-locations-close', app.formsLocator )
.on( 'click', '#the-list .wpforms-column-tags-edit', app.editTagsClick )
.on( 'click', '#the-list .wpforms-column-tags-edit-cancel', app.cancelEditTagsClick )
.on( 'click', '#the-list .wpforms-column-tags-edit-save', app.saveEditTagsClick )
.on( 'click', '#the-list .wpforms-bulk-edit-tags-cancel', app.cancelBulkEditTagsClick )
.on( 'click', '#the-list .wpforms-bulk-edit-tags-save', app.saveBulkEditTagsClick )
.on( 'click', '.wpforms-tags-filter .button', app.tagsFilterClick )
.on( 'click', '.wpforms-manage-tags', app.manageTagsClick )
.on( 'keydown', '.wpforms-column-tags-form input, .wpforms-bulk-edit-tags input', app.addCustomItemInput )
.on( 'removeItem', '.choices select', app.editTagsRemoveItem );
.on( 'removeItem', app.bulkEditTagsFormRemoveItem );
.on( 'change', 'input.hide-column-tog', app.adjustBulkEditTagsForm )
.on( 'change', '#tags-hide', app.toggleTagsColumn );
.on( 'resize', _.debounce( app.adjustBulkEditTagsForm, 200 ) );
.on( 'change', '.wpforms-manage-tags-items input', app.manageTagsItemChange );
* Confirm forms deletion and duplications.
* @param {object} event Event object.
confirmSingleAction: function( event ) {
url = $link.attr( 'href' ),
msg = $link.hasClass( 'delete-all' ) ? wpforms_admin.form_delete_all_confirm : '',
type = $link.data( 'type' ) ?? '';
let duplicateMsg = wpforms_admin.form_duplicate_confirm;
if ( type === 'template' ) {
duplicateMsg = wpforms_admin.template_duplicate_confirm;
msg = $link.parent().hasClass( 'delete' ) ? wpforms_admin.form_delete_confirm : duplicateMsg;
app.confirmModal( msg, { url } );
* Confirm forms bulk deletion.
* @param {object} event Event object.
confirmBulkAction: function( event ) {
$form = $button.closest( 'form' ),
action = $form.find( '#bulk-action-selector-top' ).val();
if ( action === 'edit_tags' ) {
if ( action !== 'delete' ) {
app.confirmModal( wpforms_admin.form_delete_n_confirm, { 'bulk': true, 'form': $form } );
* Open confirmation modal.
* @param {string} msg Confirmation modal content.
* @param {object} args Additional arguments.
confirmModal: function( msg, args ) {
title: wpforms_admin.heads_up,
icon: 'fa fa-exclamation-circle',
window.location = args.url;
args.form.trigger( 'submit' );
text: wpforms_admin.cancel,
* @param {string} msg Alert modal content.
* @param {object} args Additional arguments.
alertModal: function( msg, args ) {
var error = wpforms_admin_forms_overview.strings.error;
title: args.title || wpforms_admin.oops || false,
content: msg ? error + '<br>' + msg : error,
icon: 'fa fa-exclamation-circle',
type: args.type || 'orange',
* @param {object} event Event object.
resetSearch: function( event ) {
$( '#wpforms-overview-search-term' ).val( '' );
$( this ).closest( 'form' ).trigger( 'submit' );
* Show form locations. Take them from Locations column and show in the pane under the form row.
* @param {object} event Event object.
* @returns {false} Event processing status.
formsLocator: function( event ) {
let $pane = $( '#wpforms-overview-table .wpforms-locations-pane' );
const $currentRow = $( event.target.closest( 'tr' ) ),
$paneRow = $pane.prev().prev(),
$rowActions = $paneRow.find( '.row-actions' );
if ( $pane.length > 0 ) {
$rowActions.removeClass( 'visible' );
if ( $paneRow.is( $currentRow ) ) {
const $locationsList = $currentRow.find( '.locations-list' );
if ( $locationsList.length === 0 ) {
const tdNum = $currentRow.find( 'td:not(.hidden)' ).length;
const locationsHtml = $locationsList.html();
const html = `<th></th><td colSpan="${tdNum}" class="colspanchange">
<span class="wpforms-locations-pane-title">${wpforms_forms_locator.paneTitle}</span>
<button type="button" class="button wpforms-locations-close alignleft">${wpforms_forms_locator.close}</button>
$pane = $( '<tr class="wpforms-locations-pane"></tr>' ).html( html );
$currentRow.after( $pane );
$currentRow.after( $( '<tr class="hidden"></tr>' ) );
$rowActions.addClass( 'visible' );
* Click on the Edit link in the "Tags" column.
* @param {object} event Event object.
editTagsClick: function( event ) {
$td = $link.closest( 'td' ),
$tbody = $td.closest( 'tbody' ),
$columnLinks = $td.find( '.wpforms-column-tags-links' ),
$columnForm = $td.find( '.wpforms-column-tags-form' ),
$select = $columnForm.find( 'select' );
if ( ! $select.length ) {
$td.append( wpforms_admin_forms_overview.edit_tags_form );
$columnForm = $td.find( '.wpforms-column-tags-form' );
$select = $columnForm.find( 'select' );
// Hide opened tags edit form.
$tbody.find( '.wpforms-column-tags-links.wpforms-hidden' ).removeClass( 'wpforms-hidden' );
$tbody.find( '.wpforms-column-tags-form:not(.wpforms-hidden)' ).addClass( 'wpforms-hidden' );
// Show tags edit form instead of tags links.
$columnLinks.addClass( 'wpforms-hidden' );
$columnForm.removeClass( 'wpforms-hidden' );
// Store current opened Choice.js object and its value.
vars.currentEditTagsChoicesObj = app.initChoicesJS( $select );
vars.currentEditTagsValueBackup = vars.currentEditTagsChoicesObj.getValue( true );
* Click on the Cancel button (icon) in Edit Tags form in the "Tags" column.
* @param {object} event Event object.
cancelEditTagsClick: function( event ) {
$td = $btn.closest( 'td' ),
$columnLinks = $td.find( '.wpforms-column-tags-links' ),
$columnForm = $td.find( '.wpforms-column-tags-form' );
// Restore saved value from the backup.
vars.currentEditTagsChoicesObj
.setChoiceByValue( vars.currentEditTagsValueBackup );
$columnLinks.removeClass( 'wpforms-hidden' );
$columnForm.addClass( 'wpforms-hidden' );
* @param {object} choicesObj Choices.js instance.
* @returns {Array} Tags value data.
getTagsValue: function( choicesObj ) {
if ( ! choicesObj || typeof choicesObj.getValue !== 'function' ) {
var tagsValue = choicesObj.getValue(),
for ( var i = 0; i < tagsValue.length; i++ ) {
value: tagsValue[ i ].value,
label: tagsValue[ i ].label,
* Click on the Save button (icon) in Edit Tags form in the "Tags" column.
* @param {object} event Event object.
saveEditTagsClick: function( event ) {
$td = $btn.closest( 'td' ),
$columnLinks = $td.find( '.wpforms-column-tags-links' ),
$columnForm = $td.find( '.wpforms-column-tags-form' ),
$spinner = $btn.siblings( '.wpforms-spinner' ),
$select = $columnForm.find( 'select' ),
choicesObj = $select.data( 'choicesjs' );
$btn.addClass( 'wpforms-hidden' );
$spinner.removeClass( 'wpforms-hidden' );
forms: [ $columnLinks.data( 'form-id' ) ],
tags: app.getTagsValue( vars.currentEditTagsChoicesObj ),
// Update tags links in the column.
$columnLinks.find( '.wpforms-column-tags-links-list' ).html( res.data.tags_links );
$columnLinks.data( 'tags', res.data.tags_ids );
wpforms_admin_forms_overview.all_tags_choices,
.setChoiceByValue( res.data.tags_ids.split( ',' ) );
$btn.removeClass( 'wpforms-hidden' );
$spinner.addClass( 'wpforms-hidden' );
// Hide form, show tags links.
$columnLinks.removeClass( 'wpforms-hidden' );
$columnForm.addClass( 'wpforms-hidden' );
* Save tags AJAX call routine.
* @param {object} data Post data.
* @param {Function} done Callback on success.
* @param {Function} always Always callback.
saveTagsAjax: function( data, done, always ) {
action: 'wpforms_admin_forms_overview_save_tags',
nonce: wpforms_admin_forms_overview.strings.nonce,
).done( function( res ) {
if ( ! res.success || ! res.data ) {
app.alertModal( res.data || '', {} );
app.updateAllTagsChoices( res.data.all_tags_choices );
if ( typeof done === 'function' ) {