PluginProbe
Booking Calendar / 11.7
Booking Calendar v11.7
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 / __js / client / front_end_messages / wpbc_fe_messages.js

wpbc_fe_messages.js in Booking Calendar 11.7, at includes/__js/client/front_end_messages/wpbc_fe_messages.js

460 lines 17.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * =====================================================================================================================
3 * includes/__js/front_end_messages/wpbc_fe_messages.js
4 * =====================================================================================================================
5 */
6
7 // ---------------------------------------------------------------------------------------------------------------------
8 // Show Messages at Front-Edn side
9 // ---------------------------------------------------------------------------------------------------------------------
10
11 /**
12 * Log an unexpected AJAX response for browser-console diagnostics.
13 *
14 * The response is intentionally kept out of frontend notices because it can contain a complete HTML error or login page.
15 * Logging it here preserves the server payload and request context for support troubleshooting.
16 *
17 * @param {string} ajax_action WordPress AJAX action that produced the unexpected response.
18 * @param {*} response_data Raw response payload returned by the server.
19 * @param {jqXHR|null} jq_xhr jQuery XHR object, when available.
20 * @param {string} text_status jQuery request status or success state.
21 * @param {string|Error} error_thrown Error description or exception reported by jQuery.
22 * @return {void}
23 */
24 function wpbc_front_end__log_unexpected_ajax_response( ajax_action, response_data, jq_xhr, text_status, error_thrown ) {
25 if ( ! window.console || 'function' !== typeof window.console.error ) {
26 return;
27 }
28
29 try {
30 var content_type = '';
31 if ( jq_xhr && 'function' === typeof jq_xhr.getResponseHeader ) {
32 content_type = jq_xhr.getResponseHeader( 'content-type' ) || '';
33 }
34
35 window.console.error( '[WPBC][AJAX-UNEXPECTED-RESPONSE] ' + ajax_action, {
36 'action' : ajax_action,
37 'http_status' : jq_xhr && jq_xhr.status ? parseInt( jq_xhr.status, 10 ) : 0,
38 'http_status_text': jq_xhr && jq_xhr.statusText ? jq_xhr.statusText : '',
39 'text_status' : text_status || '',
40 'error' : error_thrown || '',
41 'content_type' : content_type,
42 'response' : response_data
43 } );
44 } catch ( logging_error ) {
45 // Console diagnostics must never interrupt frontend error recovery.
46 }
47 }
48
49 /**
50 * Show message in content
51 *
52 * @param message Message HTML
53 * @param params = {
54 * 'type' : 'warning', // 'error' | 'warning' | 'info' | 'success'
55 * 'show_here' : {
56 * 'jq_node' : '', // any jQuery node definition
57 * 'where' : 'inside' // 'inside' | 'before' | 'after' | 'right' | 'left'
58 * },
59 * 'is_append': true, // Apply only if 'where' : 'inside'
60 * 'style' : 'text-align:left;', // styles, if needed
61 * 'css_class': '', // For example can be: 'wpbc_fe_message_alt'
62 * 'delay' : 0, // how many microsecond to show, if 0 then show forever
63 * 'if_visible_not_show': false // if true, then do not show message, if previos message was not hided (not apply if 'where' : 'inside' )
64 * };
65 * Examples:
66 * var html_id = wpbc_front_end__show_message( 'You can test days selection in calendar', {} );
67 *
68 * var notice_message_id = wpbc_front_end__show_message( _wpbc.get_message( 'message_check_required' ), { 'type': 'warning', 'delay': 10000, 'if_visible_not_show': true,
69 * 'show_here': {'where': 'right', 'jq_node': el,} } );
70 *
71 * wpbc_front_end__show_message( response_data[ 'ajx_data' ][ 'ajx_after_action_message' ].replace( /\n/g, "<br />" ),
72 * { 'type' : ( 'undefined' !== typeof( response_data[ 'ajx_data' ][ 'ajx_after_action_message_status' ] ) )
73 * ? response_data[ 'ajx_data' ][ 'ajx_after_action_message_status' ] : 'info',
74 * 'show_here': {'jq_node': jq_node, 'where': 'after'},
75 * 'css_class':'wpbc_fe_message_alt',
76 * 'delay' : 10000
77 * } );
78 *
79 *
80 * @returns string - HTML ID or 0 if not showing during this time.
81 */
82 function wpbc_front_end__show_message( message, params = {} ){
83
84 var params_default = {
85 'type' : 'warning', // 'error' | 'warning' | 'info' | 'success'
86 'show_here' : {
87 'jq_node' : '', // any jQuery node definition
88 'where' : 'inside' // 'inside' | 'before' | 'after' | 'right' | 'left'
89 },
90 'is_append': true, // Apply only if 'where' : 'inside'
91 'style' : 'text-align:left;', // styles, if needed
92 'css_class': '', // For example can be: 'wpbc_fe_message_alt'
93 'delay' : 0, // how many microsecond to show, if 0 then show forever
94 'if_visible_not_show': false, // if true, then do not show message, if previos message was not hided (not apply if 'where' : 'inside' )
95 'is_scroll': true, // is scroll to this element
96 'content_mode': 'html' // 'html' for trusted legacy content | 'text' for editable/user content
97 };
98 for ( var p_key in params ){
99 params_default[ p_key ] = params[ p_key ];
100 }
101 params = params_default;
102
103 if ( 'text' === params[ 'content_mode' ] ) {
104 message = jQuery( '<div>' ).text( null === message || 'undefined' === typeof message ? '' : String( message ) ).html().replace( /\n/g, '<br />' );
105 }
106
107 var unique_div_id = new Date();
108 unique_div_id = 'wpbc_notice_' + unique_div_id.getTime();
109
110 params['css_class'] += ' wpbc_fe_message';
111 if ( params['type'] == 'error' ){
112 params['css_class'] += ' wpbc_fe_message_error';
113 message = '<i class="menu_icon icon-1x wpbc_icn_report_gmailerrorred"></i>' + message;
114 }
115 if ( params['type'] == 'warning' ){
116 params['css_class'] += ' wpbc_fe_message_warning';
117 message = '<i class="menu_icon icon-1x wpbc_icn_warning"></i>' + message;
118 }
119 if ( params['type'] == 'info' ){
120 params['css_class'] += ' wpbc_fe_message_info';
121 }
122 if ( params['type'] == 'success' ){
123 params['css_class'] += ' wpbc_fe_message_success';
124 message = '<i class="menu_icon icon-1x wpbc_icn_done_outline"></i>' + message;
125 }
126
127 var scroll_to_element = '<div id="' + unique_div_id + '_scroll" style="display:none;"></div>';
128 message = '<div id="' + unique_div_id + '" class="wpbc_front_end__message ' + params['css_class'] + '" style="' + params[ 'style' ] + '">' + message + '</div>';
129
130
131 var jq_el_message = false;
132 var is_show_message = true;
133
134 if ( 'inside' === params[ 'show_here' ][ 'where' ] ){
135
136 if ( params[ 'is_append' ] ){
137 jQuery( params[ 'show_here' ][ 'jq_node' ] ).append( scroll_to_element );
138 jQuery( params[ 'show_here' ][ 'jq_node' ] ).append( message );
139 } else {
140 jQuery( params[ 'show_here' ][ 'jq_node' ] ).html( scroll_to_element + message );
141 }
142
143 } else if ( 'before' === params[ 'show_here' ][ 'where' ] ){
144
145 jq_el_message = jQuery( params[ 'show_here' ][ 'jq_node' ] ).siblings( '[id^="wpbc_notice_"]' );
146 if ( (params[ 'if_visible_not_show' ]) && (jq_el_message.is( ':visible' )) ){
147 is_show_message = false;
148 unique_div_id = jQuery( jq_el_message.get( 0 ) ).attr( 'id' );
149 }
150 if ( is_show_message ){
151 jQuery( params[ 'show_here' ][ 'jq_node' ] ).before( scroll_to_element );
152 jQuery( params[ 'show_here' ][ 'jq_node' ] ).before( message );
153 }
154
155 } else if ( 'after' === params[ 'show_here' ][ 'where' ] ){
156
157 jq_el_message = jQuery( params[ 'show_here' ][ 'jq_node' ] ).nextAll( '[id^="wpbc_notice_"]' );
158 if ( (params[ 'if_visible_not_show' ]) && (jq_el_message.is( ':visible' )) ){
159 is_show_message = false;
160 unique_div_id = jQuery( jq_el_message.get( 0 ) ).attr( 'id' );
161 }
162 if ( is_show_message ){
163 jQuery( params[ 'show_here' ][ 'jq_node' ] ).before( scroll_to_element ); // We need to set here before(for handy scroll)
164 jQuery( params[ 'show_here' ][ 'jq_node' ] ).after( message );
165 }
166
167 } else if ( 'right' === params[ 'show_here' ][ 'where' ] ){
168
169 jq_el_message = jQuery( params[ 'show_here' ][ 'jq_node' ] ).nextAll( '.wpbc_front_end__message_container_right' ).find( '[id^="wpbc_notice_"]' );
170 if ( (params[ 'if_visible_not_show' ]) && (jq_el_message.is( ':visible' )) ){
171 is_show_message = false;
172 unique_div_id = jQuery( jq_el_message.get( 0 ) ).attr( 'id' );
173 }
174 if ( is_show_message ){
175 jQuery( params[ 'show_here' ][ 'jq_node' ] ).before( scroll_to_element ); // We need to set here before(for handy scroll)
176 jQuery( params[ 'show_here' ][ 'jq_node' ] ).after( '<div class="wpbc_front_end__message_container_right">' + message + '</div>' );
177 }
178 } else if ( 'left' === params[ 'show_here' ][ 'where' ] ){
179
180 jq_el_message = jQuery( params[ 'show_here' ][ 'jq_node' ] ).siblings( '.wpbc_front_end__message_container_left' ).find( '[id^="wpbc_notice_"]' );
181 if ( (params[ 'if_visible_not_show' ]) && (jq_el_message.is( ':visible' )) ){
182 is_show_message = false;
183 unique_div_id = jQuery( jq_el_message.get( 0 ) ).attr( 'id' );
184 }
185 if ( is_show_message ){
186 jQuery( params[ 'show_here' ][ 'jq_node' ] ).before( scroll_to_element ); // We need to set here before(for handy scroll)
187 jQuery( params[ 'show_here' ][ 'jq_node' ] ).before( '<div class="wpbc_front_end__message_container_left">' + message + '</div>' );
188 }
189 }
190
191 if ( ( is_show_message ) && ( parseInt( params[ 'delay' ] ) > 0 ) ){
192 var closed_timer = setTimeout( function (){
193 jQuery( '#' + unique_div_id ).fadeOut( 1500 );
194 } , parseInt( params[ 'delay' ] ) );
195
196 var closed_timer2 = setTimeout( function (){
197 jQuery( '#' + unique_div_id ).trigger( 'hide' );
198 }, ( parseInt( params[ 'delay' ] ) + 1501 ) );
199 }
200
201 // Check if showed message in some hidden parent section and show it. But it must be lower than '.wpbc_container'
202 var parent_els = jQuery( '#' + unique_div_id ).parents().map( function (){
203 if ( (!jQuery( this ).is( 'visible' )) && (jQuery( '.wpbc_container' ).has( this )) ){
204 jQuery( this ).show();
205 }
206 } );
207
208 if ( params[ 'is_scroll' ] ){
209 wpbc_do_scroll( '#' + unique_div_id + '_scroll' );
210 }
211
212 return unique_div_id;
213 }
214
215
216 /**
217 * Error message. Preset of parameters for real message function.
218 *
219 * @param el - any jQuery node definition
220 * @param message - Message HTML
221 * @returns string - HTML ID or 0 if not showing during this time.
222 */
223 function wpbc_front_end__show_message__error( jq_node, message, content_mode ){
224
225 content_mode = ( 'undefined' === typeof content_mode ) ? 'html' : content_mode;
226
227 var notice_message_id = wpbc_front_end__show_message(
228 message,
229 {
230 'type' : 'error',
231 'delay' : 10000,
232 'if_visible_not_show': true,
233 'content_mode' : content_mode,
234 'show_here' : {
235 'where' : 'right',
236 'jq_node': jq_node
237 }
238 }
239 );
240 return notice_message_id;
241 }
242
243
244 /**
245 * Error message UNDER element. Preset of parameters for real message function.
246 *
247 * @param el - any jQuery node definition
248 * @param message - Message HTML
249 * @returns string - HTML ID or 0 if not showing during this time.
250 */
251 function wpbc_front_end__show_message__error_under_element( jq_node, message, message_delay, content_mode ){
252
253 if ( 'undefined' === typeof (message_delay) ){
254 message_delay = 0
255 }
256 content_mode = ( 'undefined' === typeof content_mode ) ? 'html' : content_mode;
257
258 var notice_message_id = wpbc_front_end__show_message(
259 message,
260 {
261 'type' : 'error',
262 'delay' : message_delay,
263 'if_visible_not_show': true,
264 'content_mode' : content_mode,
265 'show_here' : {
266 'where' : 'after',
267 'jq_node': jq_node
268 }
269 }
270 );
271 return notice_message_id;
272 }
273
274
275 /**
276 * Error message UNDER element. Preset of parameters for real message function.
277 *
278 * @param el - any jQuery node definition
279 * @param message - Message HTML
280 * @returns string - HTML ID or 0 if not showing during this time.
281 */
282 function wpbc_front_end__show_message__error_above_element( jq_node, message, message_delay, content_mode ){
283
284 if ( 'undefined' === typeof (message_delay) ){
285 message_delay = 10000
286 }
287 content_mode = ( 'undefined' === typeof content_mode ) ? 'html' : content_mode;
288
289 var notice_message_id = wpbc_front_end__show_message(
290 message,
291 {
292 'type' : 'error',
293 'delay' : message_delay,
294 'if_visible_not_show': true,
295 'content_mode' : content_mode,
296 'show_here' : {
297 'where' : 'before',
298 'jq_node': jq_node
299 }
300 }
301 );
302 return notice_message_id;
303 }
304
305
306 /**
307 * Warning message. Preset of parameters for real message function.
308 *
309 * @param el - any jQuery node definition
310 * @param message - Message HTML
311 * @returns string - HTML ID or 0 if not showing during this time.
312 */
313 function wpbc_front_end__show_message__warning( jq_node, message, content_mode ){
314
315 content_mode = ( 'undefined' === typeof content_mode ) ? 'html' : content_mode;
316
317 var notice_message_id = wpbc_front_end__show_message(
318 message,
319 {
320 'type' : 'warning',
321 'delay' : 10000,
322 'if_visible_not_show': true,
323 'content_mode' : content_mode,
324 'show_here' : {
325 'where' : 'right',
326 'jq_node': jq_node
327 }
328 }
329 );
330 wpbc_highlight_error_on_form_field( jq_node );
331 return notice_message_id;
332 }
333
334
335 /**
336 * Warning message UNDER element. Preset of parameters for real message function.
337 *
338 * @param el - any jQuery node definition
339 * @param message - Message HTML
340 * @returns string - HTML ID or 0 if not showing during this time.
341 */
342 function wpbc_front_end__show_message__warning_under_element( jq_node, message, content_mode ){
343
344 content_mode = ( 'undefined' === typeof content_mode ) ? 'html' : content_mode;
345
346 var notice_message_id = wpbc_front_end__show_message(
347 message,
348 {
349 'type' : 'warning',
350 'delay' : 10000,
351 'if_visible_not_show': true,
352 'content_mode' : content_mode,
353 'show_here' : {
354 'where' : 'after',
355 'jq_node': jq_node
356 }
357 }
358 );
359 return notice_message_id;
360 }
361
362
363 /**
364 * Warning message ABOVE element. Preset of parameters for real message function.
365 *
366 * @param el - any jQuery node definition
367 * @param message - Message HTML
368 * @returns string - HTML ID or 0 if not showing during this time.
369 */
370 function wpbc_front_end__show_message__warning_above_element( jq_node, message, content_mode ){
371
372 content_mode = ( 'undefined' === typeof content_mode ) ? 'html' : content_mode;
373
374 var notice_message_id = wpbc_front_end__show_message(
375 message,
376 {
377 'type' : 'warning',
378 'delay' : 10000,
379 'if_visible_not_show': true,
380 'content_mode' : content_mode,
381 'show_here' : {
382 'where' : 'before',
383 'jq_node': jq_node
384 }
385 }
386 );
387 return notice_message_id;
388 }
389
390 /**
391 * Highlight Error in specific field
392 *
393 * @param jq_node string or jQuery element, where scroll to
394 */
395 function wpbc_highlight_error_on_form_field( jq_node ){
396
397 if ( !jQuery( jq_node ).length ){
398 return;
399 }
400 if ( ! jQuery( jq_node ).is( ':input' ) ){
401 // Situation with checkboxes or radio buttons
402 var jq_node_arr = jQuery( jq_node ).find( ':input' );
403 if ( !jq_node_arr.length ){
404 return
405 }
406 jq_node = jq_node_arr.get( 0 );
407 }
408 var params = {};
409 params[ 'delay' ] = 10000;
410
411 if ( !jQuery( jq_node ).hasClass( 'wpbc_form_field_error' ) ){
412
413 jQuery( jq_node ).addClass( 'wpbc_form_field_error' )
414
415 if ( parseInt( params[ 'delay' ] ) > 0 ){
416 var closed_timer = setTimeout( function (){
417 jQuery( jq_node ).removeClass( 'wpbc_form_field_error' );
418 }
419 , parseInt( params[ 'delay' ] )
420 );
421
422 }
423 }
424 }
425
426 /**
427 * Scroll to specific element
428 *
429 * @param jq_node string or jQuery element, where scroll to
430 * @param extra_shift_offset int shift offset from jq_node
431 */
432 function wpbc_do_scroll( jq_node , extra_shift_offset = 0 ){
433
434 if ( !jQuery( jq_node ).length ){
435 return;
436 }
437 var targetOffset = jQuery( jq_node ).offset().top;
438
439 if ( targetOffset <= 0 ){
440 if ( 0 != jQuery( jq_node ).nextAll( ':visible' ).length ){
441 targetOffset = jQuery( jq_node ).nextAll( ':visible' ).first().offset().top;
442 } else if ( 0 != jQuery( jq_node ).parent().nextAll( ':visible' ).length ){
443 targetOffset = jQuery( jq_node ).parent().nextAll( ':visible' ).first().offset().top;
444 }
445 }
446
447 if ( jQuery( '#wpadminbar' ).length > 0 ){
448 targetOffset = targetOffset - 50 - 50;
449 } else {
450 targetOffset = targetOffset - 20 - 50;
451 }
452 targetOffset += extra_shift_offset;
453
454 // Scroll only if we did not scroll before
455 if ( ! jQuery( 'html,body' ).is( ':animated' ) ){
456 jQuery( 'html,body' ).animate( {scrollTop: targetOffset}, 500 );
457 }
458 }
459
460