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 / form-details / _src / current-form-details-ui.js

current-form-details-ui.js in Booking Calendar 11.9, at includes/page-form-builder/form-details/_src/current-form-details-ui.js

242 lines 7.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* globals window, document */
2 (function (w, d) {
3 'use strict';
4
5 var api = w.WPBC_BFB_Form_Details = w.WPBC_BFB_Form_Details || {};
6
7 var is_ready = false;
8
9 function get_input_el(setting_key) {
10 var id = 'wpbc_bfb_setting__' + setting_key;
11 return d.getElementById(id);
12 }
13
14 function get_picture_url_el() {
15 return get_input_el('bfb_form_details__picture_url');
16 }
17
18 function get_preview_img_el() {
19 var root = d.querySelector('[data-wpbc-bfb-form-details-media="1"]');
20 return root ? root.querySelector('.wpbc_bfb__form_details_media__img') : null;
21 }
22
23 function get_preview_placeholder_el() {
24 var root = d.querySelector('[data-wpbc-bfb-form-details-media="1"]');
25 return root ? root.querySelector('.wpbc_bfb__form_details_media__placeholder') : null;
26 }
27
28 function get_preview_img_el__at_top_toolbar() {
29 var el = d.querySelector( '.wpbc_bfb__hint__top_bar .wpbc_bfb__form_details_media__img' );
30 return el ? el : null;
31 }
32
33 function get_preview_placeholder_el__at_top_toolbar() {
34 var el = d.querySelector( '.wpbc_bfb__hint__top_bar .wpbc_bfb__form_details_media__placeholder' );
35 return el ? el : null;
36 }
37
38 function show_hide_preview_image(url, img, ph) {
39
40 if ( ! img || ! ph ) {
41 return;
42 }
43
44 if ( typeof url === 'string' && url.trim() ) {
45 img.src = url;
46 img.style.display = 'block';
47 ph.style.display = 'none';
48 } else {
49 img.src = '';
50 img.style.display = 'none';
51 ph.style.display = 'block';
52 }
53 }
54
55 function set_preview_image(url) {
56
57 var img = get_preview_img_el();
58 var ph = get_preview_placeholder_el();
59 show_hide_preview_image( url, img, ph );
60
61 img = get_preview_img_el__at_top_toolbar();
62 ph = get_preview_placeholder_el__at_top_toolbar();
63 show_hide_preview_image( url, img, ph );
64 }
65
66 function sanitize_form_name(raw_value) {
67 var val = (typeof raw_value === 'string') ? raw_value : '';
68 val = val.trim();
69
70 // Prefer core sanitize if available.
71 if ( w.WPBC_BFB_Core && w.WPBC_BFB_Core.Sanitize && typeof w.WPBC_BFB_Core.Sanitize.to_token === 'function' ) {
72 return w.WPBC_BFB_Core.Sanitize.to_token(val);
73 }
74
75 // Fallback: allow a-z 0-9 _ only.
76 val = val.toLowerCase();
77 val = val.replace(/[^a-z0-9_]+/g, '_');
78 val = val.replace(/^_+|_+$/g, '');
79 return val;
80 }
81
82 function apply_loaded_data(detail) {
83 if ( ! w.jQuery ) {
84 return;
85 }
86
87 var loaded = (detail && typeof detail.loaded_data === 'object' && detail.loaded_data) ? detail.loaded_data : {};
88
89 var form_name_el = get_input_el('bfb_form_details__form_name');
90 var title_el = get_input_el('bfb_form_details__title');
91 var picture_url_el = get_picture_url_el();
92 var desc_el = get_input_el('bfb_form_details__description');
93
94 var form_name = loaded.form_name || detail.form_name || 'standard';
95 var title = (typeof loaded.title === 'string' && loaded.title.trim()) ? loaded.title.trim() : form_name;
96 var picture_url = (typeof loaded.picture_url === 'string' && loaded.picture_url.trim()) ? loaded.picture_url.trim() : '';
97 var description = (typeof loaded.description === 'string' && loaded.description.trim()) ? loaded.description.trim() : '';
98
99 if ( form_name_el ) { form_name_el.value = form_name; }
100 if ( title_el ) { title_el.value = title; }
101 if ( picture_url_el ) { picture_url_el.value = picture_url; }
102 if ( desc_el ) { desc_el.value = description; }
103
104 set_preview_image(picture_url);
105
106 // Optional: update the existing hint title, if present.
107 var $hint_title = w.jQuery('.wpbc_bfb__hint__form_name .wpbc_bfb__hint__form_name__title a.value');
108 var $hint_pic = w.jQuery('.wpbc_bfb__hint__form_name .wpbc_bfb__form_details_media__img');
109 var $hint_slug = w.jQuery('.wpbc_bfb__hint__form_name .wpbc_bfb__hint__form_name__slug span.value');
110 var $hint_title_i = w.jQuery('.wpbc_bfb__hint__form_name .wpbc_bfb__hint__form_name__title i');
111 if ( $hint_title.length ) { $hint_title.text(title); }
112 if ( $hint_title.length ) { $hint_title.attr("title", description); }
113 if ( $hint_pic.length ) { $hint_pic.attr("src", picture_url); }
114 if ( $hint_slug.length ) { $hint_slug.text( form_name ); }
115 w.jQuery( '.wpbc_bfb__hint__form_name__label' ).css( 'display', 'flex' );
116 if (picture_url){
117 w.jQuery( '.wpbc_bfb__hint__top_bar.wpbc_bfb__hint__form_name .wpbc_bfb__form_details_media__preview img' ).css( 'display', 'block' );
118 w.jQuery( '.wpbc_bfb__hint__top_bar.wpbc_bfb__hint__form_name .wpbc_bfb__form_details_media__preview .wpbc_bfb__form_details_media__placeholder' ).css( 'display', 'none' );
119 }
120 }
121
122
123 /**
124 * Sync UI after picture URL change.
125 *
126 * @return void
127 */
128 function on_picture_url_changed() {
129
130 var picture_url_el = get_picture_url_el();
131 var url = ( picture_url_el && typeof picture_url_el.value === 'string' ) ? picture_url_el.value : '';
132
133 set_preview_image( url );
134
135 // Keep existing hint image in sync (if present).
136 if ( w.jQuery ) {
137 var $hint_pic = w.jQuery( '.wpbc_bfb__hint__form_name .wpbc_bfb__form_details_media__img' );
138 if ( $hint_pic.length ) {
139 $hint_pic.attr( 'src', url );
140 }
141 }
142 }
143
144 function remove_selected_image() {
145
146 var picture_url_el = get_picture_url_el();
147
148 if ( picture_url_el ) {
149 picture_url_el.value = '';
150 }
151
152 on_picture_url_changed();
153 }
154
155 function bind_ui() {
156
157 if ( is_ready ) {
158 return;
159 }
160 is_ready = true;
161
162 // Load values when current form is loaded/saved via AJAX.
163 d.addEventListener( 'wpbc:bfb:form:ajax_loaded', function ( e ) {
164 apply_loaded_data( e && e.detail ? e.detail : null );
165 }, { passive: true } );
166
167 d.addEventListener( 'wpbc:bfb:form:ajax_saved', function ( e ) {
168 apply_loaded_data( e && e.detail ? e.detail : null );
169 }, { passive: true } );
170
171 // React to URL changes (manual edits + programmatic set from uploader).
172 var picture_url_el = get_picture_url_el();
173 if ( picture_url_el ) {
174
175 picture_url_el.addEventListener( 'input', on_picture_url_changed, { passive: true } );
176 picture_url_el.addEventListener( 'change', on_picture_url_changed, { passive: true } );
177
178 // Your custom uploader hook (jQuery event).
179 if ( w.jQuery ) {
180 w.jQuery( picture_url_el ).on( 'wpbc_media_upload_url_set', function () {
181 on_picture_url_changed();
182 } );
183 }
184 }
185
186 // Remove button stays native.
187 var btn_remove = d.getElementById( 'wpbc_bfb__form_details_remove_image' );
188 if ( btn_remove ) {
189 btn_remove.addEventListener( 'click', function ( evt ) {
190 evt.preventDefault();
191 remove_selected_image();
192 } );
193 }
194
195 // Optional: keyboard support for clickable preview (if it’s a DIV).
196 var btn_img = d.querySelector( '.wpbc_bfb__form_details_media__preview' );
197 if ( btn_img ) {
198 btn_img.addEventListener( 'keydown', function ( evt ) {
199 if ( 'Enter' === evt.key || ' ' === evt.key ) {
200 evt.preventDefault();
201 btn_img.click();
202 }
203 } );
204 }
205
206 // Sanitize slug on blur (keep your existing code).
207 var form_name_el = get_input_el( 'bfb_form_details__form_name' );
208 if ( form_name_el ) {
209 form_name_el.addEventListener( 'blur', function () {
210 form_name_el.value = sanitize_form_name( form_name_el.value );
211 } );
212 }
213 }
214
215 function boot() {
216 bind_ui();
217 bind_events();
218 }
219
220 if ( d.readyState === 'loading' ) {
221 d.addEventListener('DOMContentLoaded', boot, { once: true });
222 } else {
223 boot();
224 }
225
226 // Public helpers.
227 api.apply_loaded_data = apply_loaded_data;
228
229 // == Top Toolbar Form Name and Picture tumb ======================================================================
230 function bind_events() {
231 // On click on Booking form Title in top toolbar.
232 d.addEventListener( 'click', function (ev) {
233 var btn = ev.target && ev.target.closest( '.wpbc_bfb__hint__top_bar .wpbc_bfb__hint__form_name__title .value' );
234 if ( ! btn ) { return; }
235 ev.preventDefault();
236 // Open "From Details" inspector sidebar.
237 d.querySelector( '[role="tab"][aria-controls="wpbc_bfb__inspector_form_details"]' ).click();
238 } );
239 }
240
241 })(window, document);
242