: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
/* global wpforms_builder_help, wpf */
* WPForms Builder Help screen module.
var WPForms = window.WPForms || {};
WPForms.Admin = WPForms.Admin || {};
WPForms.Admin.Builder = WPForms.Admin.Builder || {};
WPForms.Admin.Builder.Help = WPForms.Admin.Builder.Help || ( function( document, window, $ ) {
* Public functions and properties.
* Start the engine. DOM is not ready yet, use only to init something.
* Setup. Prepare some variables.
$builder: $( '#wpforms-builder' ),
$builderForm: $( '#wpforms-builder-form' ),
$helpBtn: $( '#wpforms-help' ),
$help: $( '#wpforms-builder-help' ),
$closeBtn: $( '#wpforms-builder-help-close' ),
$search: $( '#wpforms-builder-help-search' ),
$result: $( '#wpforms-builder-help-result' ),
$noResult: $( '#wpforms-builder-help-no-result' ),
$categories: $( '#wpforms-builder-help-categories' ),
$footer: $( '#wpforms-builder-help-footer' ),
// Open/close help modal.
el.$helpBtn.on( 'click', event.openHelp );
el.$closeBtn.on( 'click', event.closeHelp );
// Expand/collapse category.
el.$categories.on( 'click', '.wpforms-builder-help-category header', event.toggleCategory );
// View all Category Docs button click.
el.$categories.on( 'click', '.wpforms-builder-help-category button.viewall', event.viewAllCategoryDocs );
// Input into search field.
el.$search.on( 'keyup', 'input', _.debounce( event.inputSearch, 250 ) );
el.$search.on( 'click', '#wpforms-builder-help-search-clear', event.clearSearch );
* Init (generate) categories list.
initCategories: function() {
// Display error if docs data is not available.
if ( wpf.empty( wpforms_builder_help.docs ) ) {
el.$categories.html( wp.template( 'wpforms-builder-help-categories-error' ) );
var tmpl = wp.template( 'wpforms-builder-help-categories' ),
categories: wpforms_builder_help.categories,
docs: app.getDocsByCategories(),
el.$categories.html( tmpl( data ) );
* @returns {object} Docs arranged by category.
getDocsByCategories: function() {
var categories = wpforms_builder_help.categories,
docs = wpforms_builder_help.docs || [],
_.each( categories, function( categoryTitle, categorySlug ) {
_.each( docs, function( doc ) {
if ( doc.categories && doc.categories.indexOf( categorySlug ) > -1 ) {
docsByCategory.push( doc );
docsByCategories[ categorySlug ] = docsByCategory;
* Get docs recommended by search term.
* @param {string} term Search term.
* @returns {Array} Recommended docs.
getRecommendedDocs: function( term ) {
if ( wpf.empty( term ) ) {
term = term.toLowerCase();
var docs = wpforms_builder_help.docs,
if ( wpf.empty( wpforms_builder_help.context.docs[ term ] ) ) {
_.each( wpforms_builder_help.context.docs[ term ], function( docId ) {
if ( ! wpf.empty( docs[ docId ] ) ) {
recommendedDocs.push( docs[ docId ] );
* Get docs filtered by search term.
* @param {string} term Search term.
* @returns {Array} Filtered docs.
getFilteredDocs: function( term ) {
if ( wpf.empty( term ) ) {
var docs = wpforms_builder_help.docs,
term = term.toLowerCase();
_.each( docs, function( doc ) {
if ( doc.title && doc.title.toLowerCase().indexOf( term ) > -1 ) {
filteredDocs.push( doc );
* Get the current context (state) of the form builder.
* @returns {string} Builder context string. For example 'fields/add_field' or 'settings/notifications'.
getBuilderContext: function() {
if ( wpf.empty( el.$builderForm.data( 'id' ) ) ) {
// Determine builder panel and section.
var panel = el.$builder.find( '#wpforms-panels-toggle button.active' ).data( 'panel' ),
$panel = el.$builder.find( '#wpforms-panel-' + panel ),
section = $panel.find( '.wpforms-panel-sidebar .wpforms-tab a.active' ).parent().attr( 'id' );
section = $panel.find( '.wpforms-panel-sidebar a.active' ).data( 'section' );
section = ! wpf.empty( section ) ? section.replace( /-/g, '_' ) : '';
if ( section === 'field_options' ) {
subsection = $panel.find( '#wpforms-field-options .wpforms-field-option:visible .wpforms-field-option-hidden-type' ).val();
// Combine to context array.
context = [ panel, section, subsection ].filter( function( el ) {
return ! wpf.empty( el ) && el !== 'default';
// Return imploded string.
return context.join( '/' );
* Get the search term for the current builder context.
* @returns {string} Builder context term string.
getBuilderContextTerm: function() {
return wpforms_builder_help.context.terms[ app.getBuilderContext() ] || '';
speed: 300, // Fading/sliding duration in milliseconds.
* Display the element by fading them to opaque using CSS.
* @param {jQuery} $el Element object.
fadeIn: function( $el ) {
transition: `opacity ${ui.config.speed}ms ease-in 0s`,
$el.css( 'opacity', '1' );
* Hide the element by fading them to transparent using CSS.
* @param {jQuery} $el Element object.
fadeOut: function( $el ) {
transition: `opacity ${ui.config.speed}ms ease-in 0s`,
$el.css( 'display', 'none' );
* Collapse all categories.
collapseAllCategories: function() {
el.$categories.find( '.wpforms-builder-help-category' ).removeClass( 'opened' );
el.$categories.find( '.wpforms-builder-help-docs' ).slideUp();
* @param {object} e Event object.
openHelp: function( e ) {
var $firstCategory = el.$categories.find( '.wpforms-builder-help-category' ).first(),
builderContextTerm = app.getBuilderContextTerm();
if ( builderContextTerm === '' && ! $firstCategory.hasClass( 'opened' ) ) {
$firstCategory.find( 'header' ).first().trigger( 'click' );
ui.collapseAllCategories();
el.$search.find( 'input' ).val( builderContextTerm ).trigger( 'keyup' );
ui.fadeIn( el.$categories );
* @param {object} e Event object.
closeHelp: function( e ) {
ui.fadeOut( el.$result );
ui.fadeOut( el.$categories );
ui.fadeOut( el.$footer );
* @param {object} e Event object.
toggleCategory: function( e ) {
var $category = $( this ).parent(),
$categoryDocs = $category.find( '.wpforms-builder-help-docs' );
if ( ! $categoryDocs.is( ':visible' ) ) {
$category.addClass( 'opened' );
$category.removeClass( 'opened' );
$categoryDocs.stop().slideToggle( ui.config.speed );
* View All Category Docs button click.
* @param {object} e Event object.
viewAllCategoryDocs: function( e ) {
$btn.prev( 'div' ).stop().slideToggle( ui.config.speed, function() {
$btn.closest( '.wpforms-builder-help-category' ).addClass( 'viewall' );
* Input into search field.
* @param {object} e Event object.
inputSearch: function( e ) {
var tmpl = wp.template( 'wpforms-builder-help-docs' ),
recommendedDocs = app.getRecommendedDocs( term ),
filteredDocs = event.removeDuplicates( recommendedDocs, app.getFilteredDocs( term ) ),
el.$search.toggleClass( 'wpforms-empty', ! term );
if ( ! wpf.empty( recommendedDocs ) ) {
if ( ! wpf.empty( filteredDocs ) ) {
el.$noResult.toggle( resultHTML === '' && term !== '' );
el.$result.html( resultHTML );
el.$help[0].scrollTop = 0;