// File: /includes/page-form-builder/field-packs/submit/_out/submit.js
(function ( w ) {
'use strict';
var Core = w.WPBC_BFB_Core || {};
var registry = Core.WPBC_BFB_Field_Renderer_Registry;
var Base = Core.WPBC_BFB_Field_Base;
if ( ! registry || typeof registry.register !== 'function' || ! Base ) {
_wpbc?.dev?.error?.( 'WPBC_BFB_Field_Submit', 'Core registry/base missing' );
return;
}
/**
* WPBC BFB: Field Renderer for "submit" (Schema-driven, template-literal render)
* - Inspector is rendered by Factory (from PHP schema).
* - No wp.template usage for preview.
*/
class WPBC_BFB_Field_Submit extends Base {
/**
* Return default props for "submit" field.
* Must stay in sync with PHP schema defaults.
*
* @returns {Object}
*/
static get_defaults() {
return {
type : 'submit',
label : 'Send',
name : '',
html_id : '',
cssclass : 'wpbc_bfb__btn wpbc_bfb__btn--primary',
help : '',
usage_key : 'submit'
};
}
/**
* Render the preview markup into the field element.
*
* @param {HTMLElement} el Field root element inside the canvas.
* @param {Object} data Field props (already normalized by schema).
* @param {Object} ctx Context: { builder, sanit, ... }
* @returns {void}
*/
static render( el, data, ctx ) {
if ( ! el ) {
return;
}
// Normalize against defaults first.
const d = this.normalize_data( data );
// ----- Core sanitize helpers (static) -----
const eh = ( v ) => Core.WPBC_BFB_Sanitize.escape_html( v );
const sid = ( v ) => Core.WPBC_BFB_Sanitize.sanitize_html_id( v );
const sname = ( v ) => Core.WPBC_BFB_Sanitize.sanitize_html_name( v );
const sclass = ( v ) => Core.WPBC_BFB_Sanitize.sanitize_css_classlist( v );
const truthy = ( v ) => Core.WPBC_BFB_Sanitize.is_truthy( v );
const one_of = ( v, list, def ) => ( list.indexOf( v ) !== -1 ? v : def );
// Public attributes.
const html_id = d.html_id ? sid( String( d.html_id ) ) : '';
const name_val = d.name ? sname( String( d.name ) ) : '';
const css_next = sclass( String( d.cssclass || '' ) );
// Persist core-related props on dataset (do not mutate wrapper classes directly).
if ( 'cssclass' in d && el.dataset.cssclass !== css_next ) {
el.dataset.cssclass = css_next;
}
if ( 'html_id' in d && el.dataset.html_id !== html_id ) {
el.dataset.html_id = html_id;
}
// Attribute fragments.
const id_attr = html_id ? ` id="${eh( html_id )}"` : '';
const name_attr = name_val ? ` name="${eh( name_val )}"` : '';
const cls_attr = ` class="wpbc_button_light ${css_next ? eh( css_next ) : ''}"`;
// Optional help text below the button.
const help_html = d.help ? `
${eh( d.help )}
` : '';
// Render preview HTML (no actions; prevent real submit via type="button").
el.innerHTML = `
${help_html}
`;
// Overlay (handles/toolbars).
Core.UI?.WPBC_BFB_Overlay?.ensure?.( ctx?.builder, el );
}
/**
* Optional hook executed after field is dropped from the palette.
*
* @param {Object} data
* @param {HTMLElement} el
* @param {Object} ctx
* @returns {void}
*/
static on_field_drop( data, el, ctx ) {
// Keep base behavior (auto-name from label, etc.).
super.on_field_drop?.( data, el, ctx );
}
}
try {
registry.register( 'submit', WPBC_BFB_Field_Submit );
} catch ( e ) { _wpbc?.dev?.error?.( 'WPBC_BFB_Field_Submit.register', e ); }
// -----------------------------------------------------------------------------------------------------------------
// Export for "Booking Form" (Advanced Form shortcode)
// -----------------------------------------------------------------------------------------------------------------
/**
* Register Booking Form exporter callback (Advanced Form) for "submit".
*
* This exporter:
* - Emits the shortcode:
* [submit "Label"]
* where "Label" defaults to "Send" when empty.
* - Behavior is compatible with the previous centralized exporter:
* • uses Core.WPBC_BFB_Sanitize.escape_for_shortcode() when available,
* • does not wrap the shortcode in extra HTML,
* • leaves help text handling to WPBC_BFB_Exporter.render_field_node().
*/
function register_submit_booking_form_exporter() {
var Exp = w.WPBC_BFB_Exporter;
if ( ! Exp || typeof Exp.register !== 'function' ) { return; }
if ( typeof Exp.has_exporter === 'function' && Exp.has_exporter( 'submit' ) ) { return; }
var S = Core.WPBC_BFB_Sanitize || {};
var esc_html = S.escape_html || function( v ){ return String( v ); };
var sid = S.sanitize_html_id || function( v ){ return String( v ).trim(); };
var scls = S.sanitize_css_classlist || function( v ){ return String( v ).trim(); };
var esc_sc = S.escape_for_shortcode || function( v ){ return String( v ); };
/**
* @type {WPBC_BFB_ExporterCallback}
* @param {Object} field
* @param {function(string):void} emit
* @param {Object} [extras]
*/
var exporter_callback = function( field, emit, extras ) {
extras = extras || {};
// Merge with defaults to ensure all props (label, html_id, cssclass, …) are present.
var defs = WPBC_BFB_Field_Submit.get_defaults();
var d = Object.assign( {}, defs, field || {} );
// Label (shortcode argument).
var raw_label = ( d && typeof d.label === 'string' && d.label.length ) ? d.label : 'Send';
var label = '"' + esc_sc( String( raw_label ) ) + '"';
// ID / class wrapper around the shortcode (layout-only, no behavior).
var html_id = d.html_id ? sid( String( d.html_id ) ) : '';
var cls_raw = String( d.cssclass_extra || d.cssclass || d.class || '' );
var cls_val = scls( cls_raw );
// Ensure unique id across the export tree (shared Set from the export context).
var used_ids = extras && extras.ctx && extras.ctx.usedIds;
if ( html_id && used_ids instanceof Set ) {
var unique = html_id, i = 2;
while ( used_ids.has( unique ) ) {
unique = html_id + '_' + ( i++ );
}
used_ids.add( unique );
html_id = unique;
}
var id_attr = html_id ? ' id="' + esc_html( html_id ) + '"' : '';
var cls_attr = cls_val ? ' class="' + esc_html( cls_val ) + '"' : '';
// Only wrap in if id or class exists (matches other packs).
var has_wrapper = !! ( id_attr || cls_attr );
var open = has_wrapper ? ( '' ) : '';
var close = has_wrapper ? '' : '';
// Shortcode itself remains legacy-compatible: - [submit "Send"] //.
emit( open + '[submit ' + label + ']' + close );
};
Exp.register( 'submit', exporter_callback );
}
if ( w.WPBC_BFB_Exporter && typeof w.WPBC_BFB_Exporter.register === 'function' ) {
register_submit_booking_form_exporter();
} else if ( typeof document !== 'undefined' ) {
document.addEventListener( 'wpbc:bfb:exporter-ready', register_submit_booking_form_exporter, { once: true } );
}
// -----------------------------------------------------------------------------------------------------------------
// Export for "Booking Data" (Content of booking fields data)
// -----------------------------------------------------------------------------------------------------------------
/**
* Register Booking Data exporter callback ("Content of booking fields data") for "submit".
*
* Submit is a control element and does not carry user-entered values,
* so it is intentionally omitted from the "Content of booking fields data" output.
*/
function register_submit_booking_data_exporter() {
var C = w.WPBC_BFB_ContentExporter;
if ( ! C || typeof C.register !== 'function' ) { return; }
if ( typeof C.has_exporter === 'function' && C.has_exporter( 'submit' ) ) { return; }
/**
* @param {Object} field
* @param {function(string):void} emit
* @param {Object} [extras]
* @returns {void}
*/
var exporter_callback = function( field, emit, extras ) {
// Intentionally empty: submit has no data token/value.
return;
};
C.register( 'submit', exporter_callback );
}
if ( w.WPBC_BFB_ContentExporter && typeof w.WPBC_BFB_ContentExporter.register === 'function' ) {
register_submit_booking_data_exporter();
} else if ( typeof document !== 'undefined' ) {
document.addEventListener( 'wpbc:bfb:content-exporter-ready', register_submit_booking_data_exporter, { once: true } );
}
})( window );