/**
* Booking Calendar — Load Form modal helper (BFB Admin)
*
* UI.Modal_Load_Form.open(on_confirm, on_open)
*
* on_confirm(payload):
* payload = { form_slug: string, form: Object|null }
*
* Depends on:
* - UI.Templates.ensure_dom_ref_from_wp_template
* - UI.Modals.show/hide
* - wpbc_bfb__ajax_list_user_forms()
*
* @file: ../includes/page-form-builder/admin-page-tpl/_out/modal__form_open.js
*/
(function (w, d) {
'use strict';
const Core = (w.WPBC_BFB_Core = w.WPBC_BFB_Core || {});
const UI = (Core.UI = Core.UI || {});
UI.Modal_Load_Form = UI.Modal_Load_Form || {};
// Idempotency guard.
if ( UI.Modal_Load_Form.__bound ) {
return;
}
UI.Modal_Load_Form.__bound = true;
const MODAL_DOM_ID = 'wpbc_bfb_modal__load_form';
const TPL_MODAL_ID = 'wpbc-bfb-tpl-modal-load_form';
const ID_SEARCH = 'wpbc_bfb_popup_modal__load_form__search';
const SEL_CONFIRM = '#' + MODAL_DOM_ID + ' [data-wpbc-bfb-confirm="1"]';
const SEL_CANCEL = '#' + MODAL_DOM_ID + ' [data-wpbc-bfb-cancel="1"]';
const SEL_ERROR = '#' + MODAL_DOM_ID + ' [data-wpbc-bfb-error="1"]';
function has_text(v) {
return !! (v && String( v ).trim());
}
function get_el(id) {
return d.getElementById( id );
}
function get_modal_el() {
return d.getElementById( MODAL_DOM_ID );
}
function set_error(msg) {
const modal_el = get_modal_el();
const el = modal_el ? modal_el.querySelector( '[data-wpbc-bfb-error="1"]' ) : null;
if ( ! el ) {
return;
}
if ( has_text( msg ) ) {
el.innerHTML = String( msg );
el.style.display = '';
} else {
el.innerHTML = '';
el.style.display = 'none';
}
}
function set_confirm_enabled(is_enabled) {
const modal_el = get_modal_el();
const btn = modal_el ? modal_el.querySelector( '[data-wpbc-bfb-confirm="1"]' ) : null;
if ( ! btn ) {
return;
}
if ( is_enabled ) {
btn.classList.remove( 'disabled' );
btn.setAttribute( 'aria-disabled', 'false' );
} else {
btn.classList.add( 'disabled' );
btn.setAttribute( 'aria-disabled', 'true' );
}
}
function escape_html(s) {
return String( s == null ? '' : s )
.replace( /&/g, '&' )
.replace( //g, '>' )
.replace( /"/g, '"' )
.replace( /'/g, ''' );
}
function render_list(modal_el, forms) {
const root = modal_el ? modal_el.querySelector( '[data-wpbc-bfb-forms-list="1"]' ) : null;
if ( ! root ) {
return;
}
let html = '';
let any = false;
for ( let i = 0; i < (forms || []).length; i++ ) {
const item = forms[i] || {};
const slug = String( item.form_slug || '' );
const title = String( item.title || slug || '' );
const desc = String( item.description || '' );
const pic = String( item.picture_url || item.image_url || '' );
if ( ! slug ) {
continue;
}
any = true;
const thumb = pic
? '
'
: '
No image
';
const meta = '' + escape_html( slug ) + '
';
const line2 = desc ? '' + escape_html( desc ) + '
' : '';
html += ''
+ '';
}
if ( ! any ) {
html = 'No forms found.
';
}
root.innerHTML = html;
// Re-apply selection highlight if still present on this page.
const sel = modal_el.__wpbc_bfb_selected_form_slug || '';
if ( sel ) {
let found = null;
try {
found = root.querySelector( '[data-form-slug="' + CSS.escape( sel ) + '"]' );
} catch ( _e ) {
found = null;
}
if ( found ) {
// found.style.background = '#f6f7f7';
found.classList.add( 'wpbc_bfb__load_form_item_selected' );
set_confirm_enabled( true );
} else {
// Selection not on this page anymore -> reset.
root.querySelectorAll( '.wpbc_bfb__load_form_item' ).forEach( (el) => {
el.classList.remove( 'wpbc_bfb__load_form_item_selected' );
} );
modal_el.__wpbc_bfb_selected_form_slug = '';
set_confirm_enabled( false );
}
}
}
function set_pager(modal_el, page, has_more) {
const pager = modal_el ? modal_el.querySelector( '[data-wpbc-bfb-forms-pager="1"]' ) : null;
if ( ! pager ) {
return;
}
const prev = pager.querySelector( '[data-wpbc-bfb-page-prev="1"]' );
const next = pager.querySelector( '[data-wpbc-bfb-page-next="1"]' );
const lab = pager.querySelector( '[data-wpbc-bfb-page-label="1"]' );
page = parseInt( page || 1, 10 );
if ( ! page || page < 1 ) {
page = 1;
}
if ( lab ) {
lab.textContent = 'Page ' + page;
}
const prev_enabled = (page > 1);
const next_enabled = !! has_more;
function set_btn(btn, enabled) {
if ( ! btn ) {
return;
}
if ( enabled ) {
btn.classList.remove( 'disabled' );
btn.setAttribute( 'aria-disabled', 'false' );
} else {
btn.classList.add( 'disabled' );
btn.setAttribute( 'aria-disabled', 'true' );
}
}
set_btn( prev, prev_enabled );
set_btn( next, next_enabled );
}
function set_loading(modal_el, is_loading) {
const root = modal_el ? modal_el.querySelector( '[data-wpbc-bfb-forms-list="1"]' ) : null;
if ( ! root ) {
return;
}
if ( is_loading ) {
const mainNav = document.querySelector( '.wpbc_bfb_popup_modal__forms_loading_spin_container' ).outerHTML;
root.innerHTML = mainNav;
// root.innerHTML = ''; //.
}
}
function bind_handlers(modal_el) {
if ( ! modal_el || modal_el.__wpbc_bfb_handlers_bound ) {
return;
}
modal_el.__wpbc_bfb_handlers_bound = true;
// Click select item (delegated inside list).
modal_el.addEventListener( 'click', function (e) {
if ( ! e || ! e.target || ! e.target.closest ) {
return;
}
const item = e.target.closest( '[data-wpbc-bfb-form-item="1"]' );
if ( ! item ) {
return;
}
const slug = item.getAttribute( 'data-form-slug' ) || '';
modal_el.__wpbc_bfb_selected_form_slug = slug;
// Visual highlight
const root = modal_el.querySelector( '[data-wpbc-bfb-forms-list="1"]' );
if ( root ) {
const all = root.querySelectorAll( '[data-wpbc-bfb-form-item="1"]' );
for ( let i = 0; i < all.length; i++ ) {
all[i].style.background = '';
}
}
// item.style.background = '#f6f7f7';
root.querySelectorAll( '.wpbc_bfb__load_form_item' ).forEach( (el) => {
el.classList.remove( 'wpbc_bfb__load_form_item_selected' );
} );
item.classList.add( 'wpbc_bfb__load_form_item_selected' );
set_confirm_enabled( !! slug );
}, true );
// Search filter. (server-side, debounced).
const search_el = get_el( ID_SEARCH );
if ( search_el ) {
if ( ! modal_el.__wpbc_bfb_search_timer ) {
modal_el.__wpbc_bfb_search_timer = 0;
}
search_el.addEventListener( 'input', function () {
const v = String( search_el.value || '' );
if ( modal_el.__wpbc_bfb_search_timer ) {
clearTimeout( modal_el.__wpbc_bfb_search_timer );
}
modal_el.__wpbc_bfb_search_timer = setTimeout( function () {
load_forms( modal_el, 1, v );
}, 300 );
}, true );
}
// Pager click.
modal_el.addEventListener( 'click', function (e) {
if ( ! e || ! e.target || ! e.target.closest ) {
return;
}
const prev = e.target.closest( '[data-wpbc-bfb-page-prev="1"]' );
const next = e.target.closest( '[data-wpbc-bfb-page-next="1"]' );
if ( ! prev && ! next ) {
return;
}
e.preventDefault();
if ( (prev && (prev.classList.contains( 'disabled' ) || prev.getAttribute( 'aria-disabled' ) === 'true')) ||
(next && (next.classList.contains( 'disabled' ) || next.getAttribute( 'aria-disabled' ) === 'true')) ) {
return;
}
const page = parseInt( modal_el.__wpbc_bfb_page || 1, 10 ) || 1;
const search = String( modal_el.__wpbc_bfb_search || '' );
if ( prev ) {
load_forms( modal_el, Math.max( 1, page - 1 ), search );
}
if ( next ) {
load_forms( modal_el, page + 1, search );
}
}, true );
}
function load_forms(modal_el, page, search, done) {
if ( typeof w.wpbc_bfb__ajax_list_user_forms !== 'function' ) {
set_error( 'WPBC BFB: list forms helper missing.' );
set_loading( modal_el, false );
if ( typeof done === 'function' ) {
done( false, null );
}
return;
}
page = parseInt( page || 1, 10 );
search = String( search || '' );
if ( ! page || page < 1 ) {
page = 1;
}
set_error( '' );
set_confirm_enabled( false );
modal_el.__wpbc_bfb_selected_form_slug = '';
set_loading( modal_el, true );
w.wpbc_bfb__ajax_list_user_forms(
null,
{
include_global: 0,
page : page,
limit : 20,
search : search
},
function (ok, data) {
if ( ! ok || ! data || ! data.forms ) {
set_loading( modal_el, false );
set_error( 'Failed to load forms list.' );
set_pager( modal_el, 1, false );
if ( typeof done === 'function' ) {
done( false, null );
}
return;
}
modal_el.__wpbc_bfb_forms_cache = data.forms || [];
modal_el.__wpbc_bfb_page = data.page || page;
modal_el.__wpbc_bfb_has_more = !! data.has_more;
modal_el.__wpbc_bfb_search = search;
render_list( modal_el, modal_el.__wpbc_bfb_forms_cache );
set_pager( modal_el, modal_el.__wpbc_bfb_page, modal_el.__wpbc_bfb_has_more );
set_error( '' );
if ( typeof done === 'function' ) {
done( true, data );
}
}
);
}
UI.Modal_Load_Form.open = function (on_confirm, on_open) {
const ref = UI.Templates.ensure_dom_ref_from_wp_template( TPL_MODAL_ID, MODAL_DOM_ID );
if ( ! ref || ! ref.el ) {
return;
}
let modal_el = ref.el;
if ( modal_el && modal_el.id !== MODAL_DOM_ID ) {
const inside = modal_el.querySelector ? modal_el.querySelector( '#' + MODAL_DOM_ID ) : null;
if ( inside ) {
modal_el = inside;
}
}
if ( ! modal_el ) {
return;
}
modal_el.__wpbc_bfb_load_form_cb = (typeof on_confirm === 'function') ? on_confirm : null;
bind_handlers( modal_el );
// Reset basic UI.
const search_el = get_el( ID_SEARCH );
if ( search_el ) {
search_el.value = '';
}
modal_el.__wpbc_bfb_forms_cache = [];
modal_el.__wpbc_bfb_selected_form_slug = '';
set_error( '' );
set_confirm_enabled( false );
set_loading( modal_el, true );
UI.Modals.show( modal_el );
// Load list via ajax.
modal_el.__wpbc_bfb_page = 1;
modal_el.__wpbc_bfb_has_more = false;
modal_el.__wpbc_bfb_search = '';
load_forms( modal_el, 1, '' );
set_pager( modal_el, 1, false );
// Focus search.
w.setTimeout( function () {
const s = get_el( ID_SEARCH );
if ( s && s.focus ) {
try { s.focus(); } catch ( _e ) {}
}
}, 0 );
if ( on_open ) {
try { on_open( modal_el ); } catch ( _e2 ) {}
}
};
// Confirm / Cancel (delegated).
d.addEventListener( 'click', function (e) {
const modal_el = get_modal_el();
if ( ! modal_el || ! e || ! e.target || ! e.target.closest ) {
return;
}
const is_confirm = e.target.closest( SEL_CONFIRM );
if ( is_confirm ) {
e.preventDefault();
if ( is_confirm.classList.contains( 'disabled' ) || is_confirm.getAttribute( 'aria-disabled' ) === 'true' ) {
return;
}
const slug = modal_el.__wpbc_bfb_selected_form_slug || '';
if ( ! slug ) {
return;
}
const cb = modal_el.__wpbc_bfb_load_form_cb || null;
modal_el.__wpbc_bfb_load_form_cb = null;
UI.Modals.hide( modal_el );
if ( cb ) {
// Try to find selected full object:
let full = null;
const list = modal_el.__wpbc_bfb_forms_cache || [];
for ( let i = 0; i < list.length; i++ ) {
if ( String( list[i].form_slug || '' ) === String( slug ) ) {
full = list[i];
break;
}
}
try { cb( { form_slug: slug, form: full } ); } catch ( _e3 ) {}
}
return;
}
const is_cancel = e.target.closest( SEL_CANCEL );
if ( is_cancel ) {
e.preventDefault();
modal_el.__wpbc_bfb_load_form_cb = null;
UI.Modals.hide( modal_el );
}
}, true );
})( window, document );
function wpbc_bfb__menu_forms__load(menu_option_this) {
WPBC_BFB_Core.UI.Modal_Load_Form.open( function (payload) {
if ( ! payload || ! payload.form_slug ) {
return;
}
// Load selected form into builder.
if ( typeof window.wpbc_bfb__ajax_load_form_by_slug !== 'function' ) {
wpbc_admin_show_message( 'WPBC BFB: load-by-slug helper missing.', 'error', 10000 );
return;
}
window.wpbc_bfb__ajax_load_form_by_slug( payload.form_slug, menu_option_this, function (ok, data) {
if ( ok ) {
wpbc_admin_show_message( 'Form loaded', 'success', 1500, false );
}
} );
} );
}