# booking/11.8.4/includes/page-setup/_src/setup_first_run_popup.js

Booking Calendar, version 11.8.4. 317 lines.

- Page: https://pluginprobe.com/plugins/booking/11.8.4/code/includes/page-setup/_src/setup_first_run_popup.js
- Raw: https://pluginprobe.com/plugins/booking/11.8.4/raw/includes/page-setup/_src/setup_first_run_popup.js
- Modified: 2026-09-12T17:01:30+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/booking/11.8.4/code/includes/page-setup/_src/setup_first_run_popup.js#L10-L20`.

```javascript
/**
 * First-install Setup Wizard and starter-pages prompt adapter.
 *
 * @package Booking Calendar
 * @since   11.8.1
 */
( function( window, document, $ ) {
	'use strict';

	var config = window.wpbc_setup_wizard_first_run_popup_vars || {};
	var setup_prompt = config.setup_prompt || {};
	var booking_pages_prompt = config.booking_pages_prompt || {};
	var setup_request = null;
	var booking_pages_request = null;
	var booking_pages_dialog_started = false;
	var redirect_started = false;
	var previous_focus = null;

	/**
	 * Persist the one-time Setup prompt choice without delaying dismissal.
	 *
	 * @param {string} choice Choice identifier: start or dismiss.
	 * @return {jqXHR|null} Active persistence request, or null when unavailable.
	 */
	function persist_setup_choice( choice ) {
		if ( setup_request ) {
			return setup_request;
		}

		if ( ! config.ajax_url || ! setup_prompt.action || ! setup_prompt.nonce ) {
			return null;
		}

		setup_request = $.post( config.ajax_url, {
			action: setup_prompt.action,
			nonce: setup_prompt.nonce,
			choice: choice
		} );

		return setup_request;
	}

	/**
	 * Persist permanent dismissal of the starter booking-pages prompt.
	 *
	 * @return {jqXHR|null} Active persistence request, or null when unavailable.
	 */
	function persist_booking_pages_dismissal() {
		if ( booking_pages_request ) {
			return booking_pages_request;
		}

		if ( ! config.ajax_url || ! booking_pages_prompt.action || ! booking_pages_prompt.nonce ) {
			return null;
		}

		booking_pages_request = $.post( config.ajax_url, {
			action: booking_pages_prompt.action,
			nonce: booking_pages_prompt.nonce
		} );

		return booking_pages_request;
	}

	/**
	 * Restore useful page focus after the automatic dialog closes.
	 *
	 * @return {void}
	 */
	function restore_focus() {
		var fallback_focus;

		if ( previous_focus && document.body !== previous_focus && document.contains( previous_focus ) ) {
			previous_focus.focus();
			return;
		}

		fallback_focus = document.querySelector( '#wpbc_booking_listing_add_booking_button, .wpbc_ui_el__top_nav a, #wpbody-content h1' );
		if ( fallback_focus && 'function' === typeof fallback_focus.focus ) {
			fallback_focus.focus();
		}
	}

	/**
	 * Confirm that an AJAX response represents a saved WordPress choice.
	 *
	 * @param {Object} response WordPress AJAX response.
	 * @return {boolean} True when the server saved the requested state.
	 */
	function is_success_response( response ) {
		return !! ( response && true === response.success );
	}

	/**
	 * Check whether the starter-pages dialog has usable preloaded data.
	 *
	 * @return {boolean} True when the dialog can be presented.
	 */
	function can_show_booking_pages_dialog() {
		return !! (
			! booking_pages_dialog_started &&
			booking_pages_prompt.available &&
			Array.isArray( booking_pages_prompt.booking_pages ) &&
			booking_pages_prompt.booking_pages.length &&
			document.getElementById( 'tmpl-wpbc-setup-wizard-booking-pages-popup' )
		);
	}

	/**
	 * Create and show the WordPress-templated starter booking-pages dialog.
	 *
	 * @param {boolean} should_consume_prompt Whether closing consumes automatic display.
	 * @return {void}
	 */
	function show_booking_pages_dialog( should_consume_prompt ) {
		var template;
		var $modal;
		var dismissal_started = false;

		if (
			! can_show_booking_pages_dialog() ||
			! window.wp || 'function' !== typeof window.wp.template ||
			'function' !== typeof $.fn.wpbc_my_modal
		) {
			restore_focus();
			return;
		}

		booking_pages_dialog_started = true;
		template = window.wp.template( 'wpbc-setup-wizard-booking-pages-popup' );
		$( document.body ).append( template( { booking_pages: booking_pages_prompt.booking_pages } ) );
		$modal = $( '#wpbc_setup_wizard_booking_pages_popup' );
		$modal.find( '.wpbc_setup_wizard_booking_pages_popup__image img' ).on( 'error.wpbcSetupBookingPages', function() {
			$( this ).closest( '.wpbc_setup_wizard_booking_pages_popup__image' ).remove();
		} );

		$modal.on( 'shown.wpbc.modal.wpbcSetupBookingPages', function() {
			$modal.attr( 'aria-hidden', 'false' );
			$( '.modal-backdrop' ).last().addClass( 'wpbc_setup_wizard_first_run_popup__backdrop' );
			$modal.find( '[data-wpbc-booking-pages-open]' ).first().trigger( 'focus' );
		} );

		$modal.on( 'hide.wpbc.modal.wpbcSetupBookingPages', function() {
			if ( should_consume_prompt && ! dismissal_started ) {
				dismissal_started = true;
				persist_booking_pages_dismissal();
			}
		} );

		$modal.on( 'hidden.wpbc.modal.wpbcSetupBookingPages', function() {
			$modal.attr( 'aria-hidden', 'true' ).remove();
			booking_pages_dialog_started = false;
			restore_focus();
		} );

		$modal.on( 'click.wpbcSetupBookingPages', '[data-wpbc-booking-pages-dismiss]', function( event ) {
			event.preventDefault();
			$modal.wpbc_my_modal( 'hide' );
		} );

		$modal.wpbc_my_modal( {
			backdrop: 'static',
			keyboard: true,
			show: true
		} );
	}

	/**
	 * Create and show the WordPress-templated first-run Setup dialog.
	 *
	 * @return {void}
	 */
	function show_setup_dialog() {
		var template;
		var $modal;
		var choice_started = false;
		var selected_choice = '';
		var dismissal_request_finished = false;
		var dismissal_saved = false;
		var setup_dialog_hidden = false;

		/**
		 * Continue only after both AJAX persistence and modal removal finish.
		 *
		 * @return {void}
		 */
		function finish_setup_dismissal() {
			if ( ! dismissal_request_finished || ! setup_dialog_hidden ) {
				return;
			}

			if ( dismissal_saved && can_show_booking_pages_dialog() ) {
				show_booking_pages_dialog( true );
				return;
			}

			restore_focus();
		}

		if (
			! config.ajax_url || ! setup_prompt.action || ! setup_prompt.nonce || ! setup_prompt.setup_url ||
			! window.wp || 'function' !== typeof window.wp.template || 'function' !== typeof $.fn.wpbc_my_modal ||
			! document.getElementById( 'tmpl-wpbc-setup-wizard-first-run-popup' )
		) {
			return;
		}

		template = window.wp.template( 'wpbc-setup-wizard-first-run-popup' );
		$( document.body ).append( template( {} ) );
		$modal = $( '#wpbc_setup_wizard_first_run_popup' );

		$modal.on( 'shown.wpbc.modal.wpbcSetupFirstRun', function() {
			$modal.attr( 'aria-hidden', 'false' );
			$( '.modal-backdrop' ).last().addClass( 'wpbc_setup_wizard_first_run_popup__backdrop' );
			$modal.find( '[data-wpbc-setup-first-run-start]' ).trigger( 'focus' );
		} );

		$modal.on( 'hide.wpbc.modal.wpbcSetupFirstRun', function() {
			var request;

			if ( ! choice_started ) {
				choice_started = true;
				selected_choice = 'dismiss';
				request = persist_setup_choice( 'dismiss' );
				if ( request ) {
					request.done( function( response ) {
						dismissal_saved = is_success_response( response );
					} );
					request.always( function() {
						dismissal_request_finished = true;
						finish_setup_dismissal();
					} );
				} else {
					dismissal_request_finished = true;
				}
			}
		} );

		$modal.on( 'hidden.wpbc.modal.wpbcSetupFirstRun', function() {
			$modal.attr( 'aria-hidden', 'true' ).remove();
			setup_dialog_hidden = true;
			restore_focus();
			if ( 'dismiss' === selected_choice ) {
				finish_setup_dismissal();
			}
		} );

		$modal.on( 'click.wpbcSetupFirstRun', '[data-wpbc-setup-first-run-dismiss]', function( event ) {
			event.preventDefault();
			$modal.wpbc_my_modal( 'hide' );
		} );

		$modal.on( 'click.wpbcSetupFirstRun', '[data-wpbc-setup-first-run-start]', function( event ) {
			var request;

			event.preventDefault();
			choice_started = true;
			selected_choice = 'start';
			request = persist_setup_choice( 'start' );
			if ( request ) {
				request.always( function() {
					if ( ! redirect_started ) {
						redirect_started = true;
						window.location.assign( setup_prompt.setup_url );
					}
				} );
			} else if ( ! redirect_started ) {
				redirect_started = true;
				window.location.assign( setup_prompt.setup_url );
			}
			$modal.wpbc_my_modal( 'hide' );
		} );

		$modal.wpbc_my_modal( {
			backdrop: 'static',
			keyboard: true,
			show: true
		} );
	}

	/**
	 * Start the first eligible dialog without allowing both to overlap.
	 *
	 * @return {void}
	 */
	function initialize_prompts() {
		previous_focus = document.activeElement;

		if ( setup_prompt.show ) {
			show_setup_dialog();
			return;
		}

		if ( booking_pages_prompt.show ) {
			show_booking_pages_dialog( true );
		}
	}

	/**
	 * Reopen the starter-pages dialog from an explicit Booking Listing control.
	 *
	 * Manual opening never re-enables or consumes automatic first-run display.
	 * Focus returns to the invoking button after the dialog closes.
	 *
	 * @param {Event} event Browser click event.
	 * @return {void}
	 */
	function open_booking_pages_dialog_manually( event ) {
		event.preventDefault();
		previous_focus = event.currentTarget;
		show_booking_pages_dialog( false );
	}

	$( document ).on( 'click.wpbcSetupBookingPagesLauncher', '[data-wpbc-booking-pages-open-dialog]', open_booking_pages_dialog_manually );
	$( initialize_prompts );
}( window, document, window.jQuery ) );

```
