PluginProbe
Booking Calendar / 11.9
Booking Calendar v11.9
11.9 11.8.4 11.8.3 11.8.2 11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 All 205 releases
booking / includes / page-form-builder / field-packs / static-text / _src / static-text.js

static-text.js in Booking Calendar 11.9, at includes/page-form-builder/field-packs/static-text/_src/static-text.js

330 lines 12.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 // =================================================================================================
2 // == Pack: Static Text (WP-template-less; schema-driven)
3 // == File: /includes/page-form-builder/field-packs/static-text/_out/static-text.js
4 // == Depends: WPBC_BFB_Field_Base, Field_Renderer_Registry, Core.Sanitize, Exporter API
5 // == Version: 1.1.0 (25.09.2026) — add sanitized link tokens to preview & export
6 // =================================================================================================
7 (function (w, d) {
8 'use strict';
9
10 var Core = w.WPBC_BFB_Core || {};
11 var registry = Core.WPBC_BFB_Field_Renderer_Registry;
12 var Base = Core.WPBC_BFB_Field_Base;
13
14 if ( ! registry || typeof registry.register !== 'function' || ! Base ) {
15 _wpbc?.dev?.error?.( 'wpbc_bfb_field_static_text', 'Core registry/base missing' );
16 return;
17 }
18
19 /**
20 * Field Renderer: static_text
21 * - Renders a single text element with configurable tag, align, bold, italic.
22 * - Supports pass-through HTML (preview only) if html_allowed=1; otherwise escapes + optional nl2br.
23 *
24 * @class wpbc_bfb_field_static_text
25 * @extends Core.WPBC_BFB_Field_Base
26 */
27 class wpbc_bfb_field_static_text extends Base {
28
29 /**
30 * Defaults (must mirror PHP schema).
31 * @returns {{type:string,text:string,links:Array,tag:string,align:string,bold:number,italic:number,html_allowed:number,nl2br:number,cssclass_extra:string,name:string,html_id:string,help:string,usage_key:string}}
32 */
33 static get_defaults() {
34 return {
35 type : 'static_text',
36 text : 'Add your message here…',
37 links : [],
38 tag : 'p',
39 align : 'left',
40 bold : 0,
41 italic : 0,
42 html_allowed : 0,
43 nl2br : 1,
44 cssclass_extra : '',
45 name : '',
46 html_id : '',
47 help : '',
48 usage_key : 'static_text'
49 };
50 }
51
52 /**
53 * Whitelist tag.
54 * @param {string} v
55 * @returns {string}
56 */
57 static allow_tag( v ) {
58 var t = String( v || 'p' ).toLowerCase();
59 var ok = { p:1,label:1,span:1,small:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1 };
60 return ok[t] ? t : 'p';
61 }
62
63 /**
64 * Whitelist align.
65 * @param {string} v
66 * @returns {string}
67 */
68 static allow_align( v ) {
69 var a = String( v || 'left' ).toLowerCase();
70 var ok = { left:1, center:1, right:1 };
71 return ok[a] ? a : 'left';
72 }
73
74 /**
75 * Escape + optional nl2br for preview/export when HTML is not allowed.
76 * @param {string} raw
77 * @param {boolean} do_nl2br
78 * @returns {string}
79 */
80 static escape_text( raw, do_nl2br ) {
81 var esc = Core.WPBC_BFB_Sanitize.escape_html( String( raw || '' ) );
82 if ( do_nl2br && ! /<br\s*\/?>/i.test( esc ) ) {
83 esc = esc.replace(/\n/g, '<br>');
84 }
85 return esc;
86 }
87
88 /**
89 * Main render entry (called by Builder).
90 * Adds the base class "wpbc_static_text" to the text element for styling parity with export.
91 *
92 * @param {HTMLElement} el
93 * @param {Object} data
94 * @param {{builder?:any}} ctx
95 * @returns {void}
96 */
97 static render( el, data, ctx ) {
98 if ( ! el ) { return; }
99
100 var sanit = Core.WPBC_BFB_Sanitize || {};
101 var esc_html = sanit.escape_html || (v => String(v).replace(/[<>&"]/g, ''));
102 var sanitize_id = sanit.sanitize_html_id || (v => String(v).trim());
103 var sanitize_name = sanit.sanitize_html_name || (v => String(v).trim());
104 var sanitize_cls = sanit.sanitize_css_classlist || (v => String(v).trim());
105
106 var d_norm = Object.assign( {}, this.get_defaults(), data || {} );
107 var tag = this.allow_tag( d_norm.tag );
108 var align = this.allow_align( d_norm.align );
109
110 var html_id = d_norm.html_id ? sanitize_id( String( d_norm.html_id ) ) : '';
111 var name_val = d_norm.name ? sanitize_name( String( d_norm.name ) ) : '';
112 var cls_extra_raw = String( d_norm.cssclass_extra || '' );
113 var cls_extra = sanitize_cls( cls_extra_raw );
114
115 // Persist sanitized dataset (helps Inspector & snapshots)
116 if ( el.dataset.html_id !== html_id ) { el.dataset.html_id = html_id; }
117 if ( el.dataset.name !== name_val ) { el.dataset.name = name_val; }
118 if ( el.dataset.cssclass_extra !== cls_extra ) { el.dataset.cssclass_extra = cls_extra; }
119 if ( el.dataset.tag !== tag ) { el.dataset.tag = tag; }
120 if ( el.dataset.align !== align ) { el.dataset.align = align; }
121
122 var id_attr = html_id ? ' id="' + esc_html( html_id ) + '"' : '';
123 var name_attr = name_val ? ' name="' + esc_html( name_val ) + '"' : '';
124
125 // --- NEW: base class on the TEXT element ---
126 var base_cls = 'wpbc_static_text';
127 var tag_cls_full = base_cls + ( cls_extra ? ( ' ' + cls_extra ) : '' );
128 var cls_attr = ' class="' + esc_html( tag_cls_full ) + '"';
129
130 var style_bits = [];
131 if ( align ) { style_bits.push( 'text-align:' + align ); }
132 if ( d_norm.bold ) { style_bits.push( 'font-weight:bold' ); }
133 if ( d_norm.italic ) { style_bits.push( 'font-style:italic' ); }
134 var style_attr = style_bits.length ? ( ' style="' + style_bits.join(';') + '"' ) : '';
135
136 // Content
137 var content = '';
138 if ( w.WPBC_BFB_Static_Text_Links && 'function' === typeof w.WPBC_BFB_Static_Text_Links.build_content_html ) {
139 content = w.WPBC_BFB_Static_Text_Links.build_content_html(
140 d_norm.text,
141 d_norm.links,
142 {
143 allow_html : !! d_norm.html_allowed,
144 nl2br : !! d_norm.nl2br,
145 preview_only: true
146 }
147 );
148 } else if ( d_norm.html_allowed ) {
149 content = String( d_norm.text || '' );
150 } else {
151 content = this.escape_text( d_norm.text, !! d_norm.nl2br );
152 }
153
154 var help_html = d_norm.help ? '<div class="wpbc_bfb__help">' + esc_html( String( d_norm.help ) ) + '</div>' : '';
155
156 el.innerHTML =
157 '<span class="wpbc_bfb__no-drag-zone" inert="">' +
158 '<' + tag + id_attr + name_attr + cls_attr + style_attr + '>' + content + '</' + tag + '>' +
159 help_html +
160 '</span>';
161
162 Core.UI?.WPBC_BFB_Overlay?.ensure?.( ctx?.builder, el );
163 }
164
165 /**
166 * Optional hook after drop (keep base behavior).
167 * @param {Object} data
168 * @param {HTMLElement} el
169 * @param {{palette_item?:HTMLElement}} ctx
170 * @returns {void}
171 */
172 static on_field_drop( data, el, ctx ) {
173 try { super.on_field_drop?.( data, el, ctx ); } catch (e) {}
174 }
175 }
176
177 // Register renderer
178 try {
179 registry.register( 'static_text', wpbc_bfb_field_static_text );
180 } catch (e) {
181 _wpbc?.dev?.error?.( 'wpbc_bfb_field_static_text.register', e );
182 }
183
184
185 // -----------------------------------------------------------------------------------------------------------------
186 // Export for "Booking Form" (Advanced Form shortcode)
187 // -----------------------------------------------------------------------------------------------------------------
188 /**
189 * Register Booking Form exporter callback (Advanced Form) for "static_text".
190 *
191 * This exporter:
192 * - Emits plain HTML using the same tag/align/bold/italic rules as the Builder preview.
193 * - Adds the base class "wpbc_static_text" plus any extra CSS classes.
194 * - Respects:
195 * • html_allowed = 1 → pass-through HTML (no escaping).
196 * • html_allowed = 0 → escape + optional nl2br (via wpbc_bfb_field_static_text.escape_text()).
197 * • html_id / name → rendered as id="…" / name="…".
198 * - Help text is appended centrally by WPBC_BFB_Exporter.render_field_node(), same as other packs.
199 */
200 function register_static_text_booking_form_exporter() {
201
202 var Exp = w.WPBC_BFB_Exporter;
203 if ( ! Exp || typeof Exp.register !== 'function' ) { return; }
204 if ( typeof Exp.has_exporter === 'function' && Exp.has_exporter( 'static_text' ) ) { return; }
205
206 var S = Core.WPBC_BFB_Sanitize || {};
207 var esc_html = S.escape_html || function( v ){ return String( v ); };
208 var sanitizeId = S.sanitize_html_id || function( v ){ return String( v ).trim(); };
209 var sanitizeNm = S.sanitize_html_name || function( v ){ return String( v ).trim(); };
210 var sanitizeCl = S.sanitize_css_classlist|| function( v ){ return String( v ).trim(); };
211
212 /**
213 * @type {WPBC_BFB_ExporterCallback}
214 * @param {Object} field
215 * @param {function(string):void} emit
216 * @param {Object} [extras]
217 */
218 var exporter_callback = function( field, emit, extras ) {
219 extras = extras || {};
220
221 // Merge with defaults so all props are present (mirrors preview).
222 var defs = wpbc_bfb_field_static_text.get_defaults();
223 var d = Object.assign( {}, defs, field || {} );
224
225 var tag = wpbc_bfb_field_static_text.allow_tag( d.tag );
226 var align = wpbc_bfb_field_static_text.allow_align( d.align );
227
228 var html_id = d.html_id ? sanitizeId( String( d.html_id ) ) : '';
229 var name_val = d.name ? sanitizeNm( String( d.name ) ) : '';
230
231 // Extra CSS classes from Inspector / schema.
232 var cls_extra_raw = String( d.cssclass_extra || d.cssclass || d.class || '' );
233 var cls_extra = sanitizeCl( cls_extra_raw );
234
235 // Base class for styling parity between Builder preview and exported form.
236 var base_cls = 'wpbc_static_text';
237 var cls_full = base_cls + ( cls_extra ? ( ' ' + cls_extra ) : '' );
238
239 var id_attr = html_id ? ' id="' + esc_html( html_id ) + '"' : '';
240 var name_attr = name_val ? ' name="' + esc_html( name_val ) + '"' : '';
241 var cls_attr = ' class="' + esc_html( cls_full ) + '"';
242
243 // Inline styles: text-align + bold/italic flags.
244 var style_bits = [];
245 if ( align ) { style_bits.push( 'text-align:' + align ); }
246 if ( d.bold ) { style_bits.push( 'font-weight:bold' ); }
247 if ( d.italic ) { style_bits.push( 'font-style:italic' ); }
248 var style_attr = style_bits.length
249 ? ' style="' + esc_html( style_bits.join( ';' ) ) + '"'
250 : '';
251
252 // Content: escape + nl2br when HTML is NOT allowed; raw when allowed.
253 var content;
254 if ( w.WPBC_BFB_Static_Text_Links && 'function' === typeof w.WPBC_BFB_Static_Text_Links.build_content_html ) {
255 content = w.WPBC_BFB_Static_Text_Links.build_content_html(
256 d.text,
257 d.links,
258 {
259 allow_html : !! d.html_allowed,
260 nl2br : !! d.nl2br,
261 preview_only: false
262 }
263 );
264 } else if ( d.html_allowed ) {
265 content = String( d.text || '' );
266 } else {
267 content = wpbc_bfb_field_static_text.escape_text( d.text, !! d.nl2br );
268 }
269
270 emit(
271 '<' + tag + id_attr + name_attr + cls_attr + style_attr + '>' +
272 content +
273 '</' + tag + '>'
274 );
275 // NOTE:
276 // - Help text (field.help) is output by WPBC_BFB_Exporter.render_field_node()
277 // beneath this block, keeping behavior consistent with other field packs.
278 };
279
280 Exp.register( 'static_text', exporter_callback );
281 }
282
283 // Try immediate registration; if core isn’t ready yet, wait for the event.
284 if ( w.WPBC_BFB_Exporter && typeof w.WPBC_BFB_Exporter.register === 'function' ) {
285 register_static_text_booking_form_exporter();
286 } else {
287 d.addEventListener(
288 'wpbc:bfb:exporter-ready',
289 register_static_text_booking_form_exporter,
290 { once: true }
291 );
292 }
293
294
295 // -----------------------------------------------------------------------------------------------------------------
296 // Export for "Booking Data" (Content of booking fields data)
297 // -----------------------------------------------------------------------------------------------------------------
298 /**
299 * Register Booking Data exporter callback ("Content of booking fields data") for "static_text".
300 *
301 * Static Text is purely presentational and does not carry user-entered values,
302 * so it is intentionally omitted from the "Content of booking fields data" output.
303 * This exporter therefore does nothing (emits no line).
304 */
305 function register_static_text_booking_data_exporter() {
306
307 var C = w.WPBC_BFB_ContentExporter;
308 if ( ! C || typeof C.register !== 'function' ) { return; }
309 if ( typeof C.has_exporter === 'function' && C.has_exporter( 'static_text' ) ) { return; }
310
311 var exporter_callback = function( field, emit, extras ) {
312 // Intentionally empty: static_text has no dynamic token/value to show in booking data.
313 return;
314 };
315
316 C.register( 'static_text', exporter_callback );
317 }
318
319 if ( w.WPBC_BFB_ContentExporter && typeof w.WPBC_BFB_ContentExporter.register === 'function' ) {
320 register_static_text_booking_data_exporter();
321 } else {
322 d.addEventListener(
323 'wpbc:bfb:content-exporter-ready',
324 register_static_text_booking_data_exporter,
325 { once: true }
326 );
327 }
328
329 })( window, document );
330