PluginProbe
Booking Calendar / 11.3
Booking Calendar v11.3
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-settings-calendar / _src / settings_calendar_page.js

settings_calendar_page.js in Booking Calendar 11.3, at includes/page-settings-calendar/_src/settings_calendar_page.js

834 lines 33.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * Calendar settings page UI.
3 */
4 ( function ( $, w ) {
5 'use strict';
6
7 var cfg = w.wpbc_settings_calendar_page || {};
8 var preview_ajax = null;
9 var preview_timer = 0;
10 var notice_timer = 0;
11 var calendar_load_patch_timer = 0;
12 var last_preview_signature = '';
13
14 function trim_text( value ) {
15 return String( value || '' ).trim();
16 }
17
18 function show_message( message, type, delay ) {
19 if ( typeof w.wpbc_admin_show_message === 'function' ) {
20 w.wpbc_admin_show_message( message, type || 'info', delay || 4000, false );
21 }
22 }
23
24 function pulse_element( $element, duration ) {
25 if ( ! $element || ! $element.length ) {
26 return;
27 }
28
29 $element
30 .removeClass( 'wpbc_calendar_attention_pulse' )
31 .each( function () {
32 void this.offsetWidth;
33 } )
34 .addClass( 'wpbc_calendar_attention_pulse' );
35
36 setTimeout( function () {
37 $element.removeClass( 'wpbc_calendar_attention_pulse' );
38 }, duration || 2100 );
39 }
40
41 function pulse_latest_warning_notice() {
42 clearTimeout( notice_timer );
43 notice_timer = setTimeout( function () {
44 pulse_element( $( '#ajax_working .wpbc_inner_message.notice-warning' ).last() );
45 }, 50 );
46 }
47
48 function show_premium_notice( $control ) {
49 var is_range_info = $control && $control.is( '[data-wpbc-calendar-premium-range-info="1"]' );
50 var is_changeover_info = $control && $control.is( '[data-wpbc-calendar-premium-changeover-info="1"]' );
51 var message = cfg.i18n && cfg.i18n.premium_option_notice ? cfg.i18n.premium_option_notice : 'This option is available in Booking Calendar Business Small or higher.';
52 var $note;
53
54 if ( is_range_info ) {
55 message = cfg.i18n && cfg.i18n.premium_notice ? cfg.i18n.premium_notice : 'Range days selection is available in Booking Calendar Business Small or higher. Open the live demo to test the real behavior.';
56 } else if ( is_changeover_info ) {
57 message = cfg.i18n && cfg.i18n.premium_changeover_notice ? cfg.i18n.premium_changeover_notice : 'Changeover days are available in Booking Calendar Business Small or higher. Open the live demo to test the real behavior.';
58 }
59
60 pulse_element( $control.closest( '.wpbc_calendar_field_row, label, .wpbc_calendar_radio_stack' ) );
61 if ( is_range_info ) {
62 $note = $control.closest( '.wpbc_ui__collapsible_group' ).find( '[data-wpbc-calendar-range-upgrade-note="1"]' ).first();
63 $note.addClass( 'is-visible' );
64 pulse_element( $note );
65 } else if ( is_changeover_info ) {
66 $note = $control.closest( '.wpbc_ui__collapsible_group' ).find( '[data-wpbc-calendar-changeover-upgrade-note="1"]' ).first();
67 $note.addClass( 'is-visible' );
68 pulse_element( $note );
69 }
70 show_message( message, 'warning', 9000 );
71 pulse_latest_warning_notice();
72 }
73
74 function is_range_supported() {
75 return cfg.is_range_supported === 1 || cfg.is_range_supported === '1' || cfg.is_range_supported === true;
76 }
77
78 function is_locked_range_control( field ) {
79 return ! is_range_supported() && $( field ).is( '[name="booking_type_of_day_selections"][value="range"]' );
80 }
81
82 function is_locked_changeover_control( field ) {
83 return ! is_range_supported() && $( field ).is( '[name="booking_range_selection_time_is_active"]' );
84 }
85
86 function get_saved_available_day_mode() {
87 var mode = cfg.settings && cfg.settings.booking_type_of_day_selections ? String( cfg.settings.booking_type_of_day_selections ) : '';
88
89 return ( 'single' === mode || 'multiple' === mode ) ? mode : 'multiple';
90 }
91
92 function remember_available_day_selection() {
93 var $form = get_form();
94 var mode = $form.find( '[name="booking_type_of_day_selections"]:checked' ).val() || '';
95
96 if ( 'single' === mode || 'multiple' === mode ) {
97 $form.data( 'wpbc-calendar-available-day-mode', mode );
98 }
99 }
100
101 function restore_available_day_selection() {
102 var $form = get_form();
103 var mode = $form.data( 'wpbc-calendar-available-day-mode' ) || get_saved_available_day_mode();
104
105 if ( 'single' !== mode && 'multiple' !== mode ) {
106 mode = 'multiple';
107 }
108
109 $form.find( '[name="booking_type_of_day_selections"][value="' + mode + '"]' ).prop( 'checked', true );
110 }
111
112 function switch_panel( $tab ) {
113 var panel_id = $tab.attr( 'aria-controls' );
114 var $tabs = $tab.closest( '.wpbc_calendar_rightbar_tabs' ).find( '[role="tab"]' );
115 var $panels = $( '.wpbc_calendar_rightbar_panels [role="tabpanel"]' );
116
117 $tabs.attr( 'aria-selected', 'false' );
118 $tab.attr( 'aria-selected', 'true' );
119
120 $panels.attr( 'hidden', 'hidden' ).attr( 'aria-hidden', 'true' );
121 $( '#' + panel_id ).removeAttr( 'hidden' ).attr( 'aria-hidden', 'false' );
122 }
123
124 function toggle_group( $button ) {
125 var $group = $button.closest( '.wpbc_ui__collapsible_group' );
126 var $fields = $group.find( '> .group__fields' );
127 var is_open = $group.hasClass( 'is-open' );
128
129 $group.toggleClass( 'is-open', ! is_open );
130 $button.attr( 'aria-expanded', is_open ? 'false' : 'true' );
131 $fields.prop( 'hidden', is_open ).attr( 'aria-hidden', is_open ? 'true' : 'false' );
132 }
133
134 function close_group( $group ) {
135 var $button = $group.find( '> .group__header' );
136 var $fields = $group.find( '> .group__fields' );
137
138 $group.removeClass( 'is-open' );
139 $button.attr( 'aria-expanded', 'false' );
140 $fields.prop( 'hidden', true ).attr( 'aria-hidden', 'true' );
141 }
142
143 function open_group( group_name, is_exclusive ) {
144 var $group = $( '.wpbc_calendar_rightbar_panels .wpbc_ui__collapsible_group[data-group="' + group_name + '"]' );
145 var $button = $group.find( '> .group__header' );
146 var $fields = $group.find( '> .group__fields' );
147
148 if ( ! $group.length ) {
149 return $();
150 }
151
152 if ( is_exclusive ) {
153 $group.siblings( '.wpbc_ui__collapsible_group' ).each( function () {
154 close_group( $( this ) );
155 } );
156 }
157
158 $group.addClass( 'is-open' );
159 $button.attr( 'aria-expanded', 'true' );
160 $fields.prop( 'hidden', false ).attr( 'aria-hidden', 'false' );
161
162 return $group;
163 }
164
165 function scroll_to_group( group_name ) {
166 var $group = $( '.wpbc_calendar_rightbar_panels .wpbc_ui__collapsible_group[data-group="' + group_name + '"]' );
167 var $scroll_parent = $();
168 var scroll_parent_el;
169 var group_el;
170 var scroll_top;
171 var parent_rect;
172 var group_rect;
173
174 if ( ! $group.length ) {
175 return;
176 }
177
178 $group.parents().each( function () {
179 var $candidate = $( this );
180 var overflow_y = $candidate.css( 'overflow-y' );
181
182 if (
183 $candidate.hasClass( 'simplebar-content-wrapper' )
184 || (
185 /(auto|scroll)/.test( overflow_y )
186 && this.scrollHeight > this.clientHeight
187 )
188 ) {
189 $scroll_parent = $candidate;
190 return false;
191 }
192 } );
193
194 if ( ! $scroll_parent.length ) {
195 $scroll_parent = $group.closest( '.wpbc_ui_el__vert_right_bar__content' ).find( '.simplebar-content-wrapper' ).first();
196 }
197
198 if ( ! $scroll_parent.length ) {
199 $group.get( 0 ).scrollIntoView( { block: 'nearest' } );
200 return;
201 }
202
203 scroll_parent_el = $scroll_parent.get( 0 );
204 group_el = $group.get( 0 );
205 parent_rect = scroll_parent_el.getBoundingClientRect();
206 group_rect = group_el.getBoundingClientRect();
207 scroll_top = $scroll_parent.scrollTop() + group_rect.top - parent_rect.top - 10;
208
209 $scroll_parent.stop().animate( { scrollTop: Math.max( 0, scroll_top ) }, 180 );
210 }
211
212 function apply_open_section_from_url() {
213 var section_groups = cfg.section_groups || {};
214 var group_name = section_groups[ cfg.open_section ] || '';
215 var $group;
216
217 if ( '' === group_name ) {
218 return;
219 }
220
221 $group = open_group( group_name, true );
222 $.each( [ 120, 650 ], function ( index, delay ) {
223 setTimeout( function () {
224 scroll_to_group( group_name );
225 pulse_element( $group );
226 }, delay );
227 } );
228 }
229
230 function sync_left_navigation_active_section() {
231 var section_menus = cfg.section_menus || {};
232 var menu_slug = section_menus[ cfg.open_section ] || '';
233 var $menu_item;
234
235 if ( '' === menu_slug ) {
236 return;
237 }
238
239 $menu_item = $( '.wpbc_ui_el__vert_nav_item__' + menu_slug );
240 if ( ! $menu_item.length ) {
241 return;
242 }
243
244 $menu_item
245 .closest( '.wpbc_ui_el__level__folder' )
246 .find( '.wpbc_ui_el__vert_nav_item_sub' )
247 .removeClass( 'active' );
248 $menu_item.addClass( 'active' );
249 }
250
251 function get_form() {
252 return $( '[data-wpbc-calendar-settings-form="1"]' ).first();
253 }
254
255 function collect_payload() {
256 var $form = get_form();
257 var data = {};
258 var name;
259 var checkboxes = [
260 'booking_calendar_allow_several_months_on_mobile',
261 'booking_recurrent_time',
262 'booking_last_checkout_day_available',
263 'booking_range_selection_time_is_active',
264 'booking_change_over_days_triangles',
265 'booking_change_over__is_excerpt_on_pages',
266 'booking_is_show_legend',
267 'booking_legend_is_show_numbers',
268 'booking_legend_is_vertical',
269 'booking_show_timeslots_in_tooltip',
270 'booking_is_show_availability_in_tooltips',
271 'booking_is_show_availability_in_date_cell',
272 'booking_is_show_cost_in_tooltips',
273 'booking_is_show_cost_in_date_cell',
274 'booking_is_show_booked_data_in_tooltips'
275 ];
276
277 $.each( $form.serializeArray(), function ( index, item ) {
278 name = String( item.name || '' ).replace( /\[\]$/, '' );
279 if ( data[ name ] ) {
280 if ( ! Array.isArray( data[ name ] ) ) {
281 data[ name ] = [ data[ name ] ];
282 }
283 data[ name ].push( item.value );
284 } else {
285 data[ name ] = item.value;
286 }
287 } );
288
289 $.each( checkboxes, function ( index, name ) {
290 data[ name ] = $form.find( '[name="' + name + '"]' ).prop( 'checked' ) ? 'On' : 'Off';
291 } );
292
293 $form.find( 'input[type="checkbox"][name]' ).each( function () {
294 var raw_name = String( this.name || '' );
295 var is_array_name = /\[\]$/.test( raw_name );
296
297 name = raw_name.replace( /\[\]$/, '' );
298 if ( is_array_name ) {
299 if ( 'undefined' === typeof data[ name ] ) {
300 data[ name ] = [];
301 }
302 return;
303 }
304 if ( $.inArray( name, checkboxes ) !== -1 ) {
305 return;
306 }
307 data[ name ] = $( this ).prop( 'checked' ) ? ( $( this ).val() || 'On' ) : 'Off';
308 } );
309
310 data.booking_disable_timeslots_in_tooltip = data.booking_show_timeslots_in_tooltip === 'On' ? 'Off' : 'On';
311
312 data.resource_id = $( '#wpbc_calendar_resource_id' ).val() || '';
313 data.months_count = $( '#wpbc_calendar_months_count' ).val() || '';
314
315 return data;
316 }
317
318 function get_resource_id() {
319 var $preview = $( '[data-wpbc-calendar-preview="1"]' ).first();
320
321 return parseInt( $preview.attr( 'data-resource-id' ) || $( '#wpbc_calendar_resource_id' ).val() || 0, 10 );
322 }
323
324 function get_months_count() {
325 return parseInt( $( '#wpbc_calendar_months_count' ).val() || 3, 10 );
326 }
327
328 function parse_number_list( value ) {
329 if ( Array.isArray( value ) ) {
330 return $.map( value, function ( item ) {
331 var parsed = parseInt( item, 10 );
332 return isNaN( parsed ) ? null : parsed;
333 } );
334 }
335
336 return $.map( String( value || '' ).split( /\s*,\s*/ ), function ( item ) {
337 var parsed = parseInt( item, 10 );
338 return ( '' === item || isNaN( parsed ) ) ? null : parsed;
339 } );
340 }
341
342 function set_calendar_param( resource_id, key, value ) {
343 if ( w._wpbc && typeof w._wpbc.calendar__set_param_value === 'function' ) {
344 w._wpbc.calendar__set_param_value( resource_id, key, value );
345 }
346 }
347
348 function patch_calendar_data_loader() {
349 if ( typeof w.wpbc_calendar__load_data__ajx !== 'function' ) {
350 clearTimeout( calendar_load_patch_timer );
351 calendar_load_patch_timer = setTimeout( patch_calendar_data_loader, 120 );
352 return;
353 }
354
355 if ( w.wpbc_calendar__load_data__ajx.wpbc_settings_calendar_preview_patched ) {
356 return;
357 }
358
359 var original_loader = w.wpbc_calendar__load_data__ajx;
360
361 w.wpbc_calendar__load_data__ajx = function ( params ) {
362 var payload;
363
364 if ( $( '[data-wpbc-calendar-page="1"]' ).length && params && typeof params === 'object' ) {
365 payload = collect_payload();
366 params.wpbc_settings_calendar_preview = 1;
367 params.wpbc_settings_calendar_preview_changeover = payload.booking_range_selection_time_is_active === 'On' ? 'On' : 'Off';
368 params.wpbc_settings_calendar_preview_triangles = payload.booking_change_over_days_triangles === 'Off' ? 'Off' : 'On';
369 params.wpbc_settings_calendar_preview_recurrent_time = payload.booking_recurrent_time === 'On' ? 'On' : 'Off';
370 params.wpbc_settings_calendar_preview_last_checkout = payload.booking_last_checkout_day_available === 'On' ? 'On' : 'Off';
371 params.wpbc_settings_calendar_preview_excerpt_on_pages = payload.booking_change_over__is_excerpt_on_pages === 'On' ? 'On' : 'Off';
372 params.wpbc_settings_calendar_preview_excerpt_pages = payload.booking_change_over__excerpt_on_pages || '';
373 params.wpbc_settings_calendar_preview_excerpt_resources = payload.booking_change_over__excerpt_bk_resources || '';
374 params.wpbc_settings_calendar_preview_show_legend = payload.booking_is_show_legend === 'On' ? 'On' : 'Off';
375 params.wpbc_settings_calendar_preview_legend_show_numbers = payload.booking_legend_is_show_numbers === 'On' ? 'On' : 'Off';
376 params.wpbc_settings_calendar_preview_legend_vertical = payload.booking_legend_is_vertical === 'On' ? 'On' : 'Off';
377 $.each( [ 'available', 'pending', 'approved', 'partially', 'unavailable' ], function ( index, legend_item ) {
378 params[ 'wpbc_settings_calendar_preview_legend_show_' + legend_item ] = payload[ 'booking_legend_is_show_item_' + legend_item ] === 'On' ? 'On' : 'Off';
379 params[ 'wpbc_settings_calendar_preview_legend_text_' + legend_item ] = payload[ 'booking_legend_text_for_item_' + legend_item ] || '';
380 } );
381 params.wpbc_settings_calendar_preview_disable_timeslots_tooltip = payload.booking_disable_timeslots_in_tooltip === 'On' ? 'On' : 'Off';
382 params.wpbc_settings_calendar_preview_timeslot_word = payload.booking_highlight_timeslot_word || '';
383 params.wpbc_settings_calendar_preview_show_availability_tooltip = payload.booking_is_show_availability_in_tooltips === 'On' ? 'On' : 'Off';
384 params.wpbc_settings_calendar_preview_availability_word = payload.booking_highlight_availability_word || '';
385 params.wpbc_settings_calendar_preview_show_availability_cell = payload.booking_is_show_availability_in_date_cell === 'On' ? 'On' : 'Off';
386 params.wpbc_settings_calendar_preview_availability_cell_word = payload.booking_highlight_availability_word_in_date_cell || '';
387 params.wpbc_settings_calendar_preview_show_cost_tooltip = payload.booking_is_show_cost_in_tooltips === 'On' ? 'On' : 'Off';
388 params.wpbc_settings_calendar_preview_cost_word = payload.booking_highlight_cost_word || '';
389 params.wpbc_settings_calendar_preview_show_cost_cell = payload.booking_is_show_cost_in_date_cell === 'On' ? 'On' : 'Off';
390 params.wpbc_settings_calendar_preview_cost_currency = payload.booking_cost_in_date_cell_currency || '';
391 params.wpbc_settings_calendar_preview_show_booked_details = payload.booking_is_show_booked_data_in_tooltips === 'On' ? 'On' : 'Off';
392 params.wpbc_settings_calendar_preview_booked_details = payload.booking_booked_data_in_tooltips || '';
393 }
394
395 return original_loader.apply( this, arguments );
396 };
397 w.wpbc_calendar__load_data__ajx.wpbc_settings_calendar_preview_patched = true;
398 }
399
400 function sync_changeover_preview_class( payload ) {
401 var data = payload || collect_payload();
402 var is_enabled = data.booking_range_selection_time_is_active === 'On' && data.booking_change_over_days_triangles !== 'Off';
403
404 $( '[data-wpbc-calendar-preview="1"], [data-wpbc-calendar-preview="1"] .wpbc_calendar_wraper' )
405 .toggleClass( 'wpbc_change_over_triangle', is_enabled );
406 $( '[data-wpbc-calendar-preview="1"] .wpbc_calendar_legend_table_width_height' ).parent( 'span' )
407 .toggleClass( 'wpbc_change_over_triangle', is_enabled );
408 }
409
410 function sync_mobile_months_preview( resource_id, payload ) {
411 var data = payload || collect_payload();
412 var allow_mobile_months = data.booking_calendar_allow_several_months_on_mobile === 'On';
413 var months_count = get_months_count() || 3;
414
415 if ( ! resource_id ) {
416 return;
417 }
418
419 if ( w._wpbc && typeof w._wpbc.set_other_param === 'function' ) {
420 w._wpbc.set_other_param( 'is_allow_several_months_on_mobile', allow_mobile_months );
421 }
422
423 if ( allow_mobile_months && typeof w.wpbc_calendar__update_months_number === 'function' ) {
424 w.wpbc_calendar__update_months_number( resource_id, months_count );
425 return;
426 }
427
428 if ( typeof w.wpbc_calendar__auto_update_months_number__on_resize === 'function' ) {
429 w.wpbc_calendar__auto_update_months_number__on_resize( resource_id );
430 } else if ( typeof w.wpbc_calendar__update_months_number === 'function' ) {
431 w.wpbc_calendar__update_months_number( resource_id, $( w ).width() <= 782 ? 1 : months_count );
432 }
433 }
434
435 function apply_standard_days_selection( resource_id, days_selection ) {
436 var ds = days_selection || {};
437 var mode = String( ds.days_select_mode || 'multiple' );
438 var fixed_week_days = parse_number_list( ds.fixed__week_days__start );
439 var dynamic_specific = parse_number_list( ds.dynamic__days_specific );
440 var dynamic_week_days = parse_number_list( ds.dynamic__week_days__start );
441
442 fixed_week_days = fixed_week_days.length ? fixed_week_days : [ -1 ];
443 dynamic_week_days = dynamic_week_days.length ? dynamic_week_days : [ -1 ];
444
445 if ( 'single' === mode && typeof w.wpbc_cal_days_select__single === 'function' ) {
446 w.wpbc_cal_days_select__single( resource_id );
447 return true;
448 }
449
450 if ( 'multiple' === mode && typeof w.wpbc_cal_days_select__multiple === 'function' ) {
451 w.wpbc_cal_days_select__multiple( resource_id );
452 return true;
453 }
454
455 if ( 'fixed' === mode && typeof w.wpbc_cal_days_select__fixed === 'function' ) {
456 w.wpbc_cal_days_select__fixed(
457 resource_id,
458 parseInt( ds.fixed__days_num || 1, 10 ),
459 fixed_week_days
460 );
461 return true;
462 }
463
464 if ( 'dynamic' === mode && typeof w.wpbc_cal_days_select__range === 'function' ) {
465 w.wpbc_cal_days_select__range(
466 resource_id,
467 parseInt( ds.dynamic__days_min || 1, 10 ),
468 parseInt( ds.dynamic__days_max || 1, 10 ),
469 dynamic_specific,
470 dynamic_week_days
471 );
472 return true;
473 }
474
475 return false;
476 }
477
478 function apply_calendar_settings_to_calendar( days_selection, should_reinit ) {
479 var resource_id = get_resource_id();
480 var ds = days_selection || {};
481 var payload = collect_payload();
482 var fixed_week_days;
483 var dynamic_specific;
484 var dynamic_week_days;
485 var $calendar;
486
487 if ( ! resource_id || ! w._wpbc || typeof w._wpbc.calendar__set_param_value !== 'function' ) {
488 return;
489 }
490
491 fixed_week_days = parse_number_list( ds.fixed__week_days__start );
492 dynamic_specific = parse_number_list( ds.dynamic__days_specific );
493 dynamic_week_days = parse_number_list( ds.dynamic__week_days__start );
494
495 set_calendar_param( resource_id, 'booking_max_monthes_in_calendar', String( payload.booking_max_monthes_in_calendar || '1y' ) );
496 set_calendar_param( resource_id, 'booking_start_day_weeek', String( payload.booking_start_day_weeek || '0' ) );
497 set_calendar_param( resource_id, 'calendar_number_of_months', String( get_months_count() || 3 ) );
498 set_calendar_param( resource_id, 'calendar_scroll_to', false );
499 set_calendar_param( resource_id, 'is_enabled_change_over', payload.booking_range_selection_time_is_active === 'On' );
500 set_calendar_param( resource_id, 'days_select_mode', String( ds.days_select_mode || 'multiple' ) );
501 set_calendar_param( resource_id, 'fixed__days_num', parseInt( ds.fixed__days_num || 1, 10 ) );
502 set_calendar_param( resource_id, 'fixed__week_days__start', fixed_week_days.length ? fixed_week_days : [ -1 ] );
503 set_calendar_param( resource_id, 'dynamic__days_min', parseInt( ds.dynamic__days_min || 1, 10 ) );
504 set_calendar_param( resource_id, 'dynamic__days_max', parseInt( ds.dynamic__days_max || 1, 10 ) );
505 set_calendar_param( resource_id, 'dynamic__days_specific', dynamic_specific );
506 set_calendar_param( resource_id, 'dynamic__week_days__start', dynamic_week_days.length ? dynamic_week_days : [ -1 ] );
507 set_calendar_param( resource_id, 'booking_recurrent_time', get_form().find( '[name="booking_recurrent_time"]' ).prop( 'checked' ) ? 'On' : 'Off' );
508
509 if ( w._wpbc && typeof w._wpbc.set_other_param === 'function' ) {
510 w._wpbc.set_other_param( 'is_enabled_change_over', payload.booking_range_selection_time_is_active === 'On' );
511 w._wpbc.set_other_param( 'is_allow_several_months_on_mobile', payload.booking_calendar_allow_several_months_on_mobile === 'On' );
512 }
513
514 sync_changeover_preview_class( payload );
515 sync_mobile_months_preview( resource_id, payload );
516
517 if ( typeof w.wpbc__conditions__SAVE_INITIAL__days_selection_params__bm === 'function' ) {
518 w.wpbc__conditions__SAVE_INITIAL__days_selection_params__bm( resource_id );
519 }
520
521 $calendar = $( '#calendar_booking' + resource_id );
522 if ( should_reinit && $calendar.length && apply_standard_days_selection( resource_id, ds ) ) {
523 return;
524 }
525
526 if ( should_reinit && $calendar.length && typeof w.wpbc_cal__re_init === 'function' ) {
527 w.wpbc_cal__re_init( resource_id );
528 }
529 }
530
531 function schedule_calendar_settings_apply( days_selection ) {
532 $.each( [ 0, 120, 420, 900, 1400 ], function ( index, delay ) {
533 setTimeout( function () {
534 apply_calendar_settings_to_calendar( days_selection || get_days_selection_from_form(), true );
535 }, delay );
536 } );
537 }
538
539 function get_days_selection_from_form() {
540 var data = collect_payload();
541 var mode = data.booking_type_of_day_selections === 'range' ? data.booking_range_selection_type : data.booking_type_of_day_selections;
542 var fixed_days = data.booking_range_start_day_mode === '-1' ? '-1' : ( data.booking_range_start_day_weekdays || '-1' );
543 var dynamic_days = data.booking_range_start_day_dynamic_mode === '-1' ? '-1' : ( data.booking_range_start_day_dynamic_weekdays || '-1' );
544
545 if ( Array.isArray( fixed_days ) ) {
546 fixed_days = fixed_days.join( ',' );
547 }
548 if ( Array.isArray( dynamic_days ) ) {
549 dynamic_days = dynamic_days.join( ',' );
550 }
551
552 return {
553 days_select_mode: mode || 'multiple',
554 fixed__days_num: parseInt( data.booking_range_selection_days_count || 1, 10 ),
555 fixed__week_days__start: fixed_days || '-1',
556 dynamic__days_min: parseInt( data.booking_range_selection_days_count_dynamic || 1, 10 ),
557 dynamic__days_max: parseInt( data.booking_range_selection_days_max_count_dynamic || 1, 10 ),
558 dynamic__days_specific: data.booking_range_selection_days_specific_num_dynamic || '',
559 dynamic__week_days__start: dynamic_days || '-1'
560 };
561 }
562
563 function refresh_conditional_controls() {
564 var $form = get_form();
565 var day_mode = $form.find( '[name="booking_type_of_day_selections"]:checked' ).val() || 'multiple';
566 var range_type = $form.find( '[name="booking_range_selection_type"]:checked' ).val() || 'dynamic';
567 var fixed_start = $form.find( '[name="booking_range_start_day_mode"]:checked' ).val() || '-1';
568 var dynamic_start = $form.find( '[name="booking_range_start_day_dynamic_mode"]:checked' ).val() || '-1';
569 var is_changeover = $form.find( '[name="booking_range_selection_time_is_active"]' ).prop( 'checked' );
570 var is_legend = $form.find( '[name="booking_is_show_legend"]' ).prop( 'checked' );
571 var is_timeslot_tooltip = $form.find( '[name="booking_show_timeslots_in_tooltip"]' ).prop( 'checked' );
572 var is_availability_tooltip = $form.find( '[name="booking_is_show_availability_in_tooltips"]' ).prop( 'checked' );
573 var is_availability_cell = $form.find( '[name="booking_is_show_availability_in_date_cell"]' ).prop( 'checked' );
574 var is_cost_tooltip = $form.find( '[name="booking_is_show_cost_in_tooltips"]' ).prop( 'checked' );
575 var is_cost_cell = $form.find( '[name="booking_is_show_cost_in_date_cell"]' ).prop( 'checked' );
576 var is_booked_tooltip = $form.find( '[name="booking_is_show_booked_data_in_tooltips"]' ).prop( 'checked' );
577
578 $( '[data-wpbc-calendar-range-settings="1"]' ).toggleClass( 'is-visible', day_mode === 'range' );
579 $( '[data-wpbc-calendar-range-type]' ).removeClass( 'is-visible' );
580 $( '[data-wpbc-calendar-range-type="' + range_type + '"]' ).addClass( 'is-visible' );
581 $( '[data-wpbc-calendar-weekday-checks="booking_range_start_day_weekdays"]' ).toggleClass( 'is-visible', fixed_start !== '-1' );
582 $( '[data-wpbc-calendar-weekday-checks="booking_range_start_day_dynamic_weekdays"]' ).toggleClass( 'is-visible', dynamic_start !== '-1' );
583 $( '[data-wpbc-calendar-changeover-settings="1"]' ).toggleClass( 'is-visible', !! is_changeover );
584 $( '[data-wpbc-calendar-legend-settings="1"]' ).toggleClass( 'is-visible', !! is_legend );
585 $( '[data-wpbc-calendar-timeslot-tooltip-settings="1"]' ).toggleClass( 'is-visible', !! is_timeslot_tooltip );
586 $( '[data-wpbc-calendar-availability-tooltip-settings="1"]' ).toggleClass( 'is-visible', !! is_availability_tooltip );
587 $( '[data-wpbc-calendar-availability-cell-settings="1"]' ).toggleClass( 'is-visible', !! is_availability_cell );
588 $( '[data-wpbc-calendar-cost-tooltip-settings="1"]' ).toggleClass( 'is-visible', !! is_cost_tooltip );
589 $( '[data-wpbc-calendar-cost-cell-settings="1"]' ).toggleClass( 'is-visible', !! is_cost_cell );
590 $( '[data-wpbc-calendar-booked-tooltip-settings="1"]' ).toggleClass( 'is-visible', !! is_booked_tooltip );
591
592 if ( is_changeover ) {
593 $form.find( '[name="booking_recurrent_time"], [name="booking_last_checkout_day_available"]' ).prop( 'checked', false );
594 }
595 if ( $form.find( '[name="booking_recurrent_time"]' ).prop( 'checked' ) ) {
596 $form.find( '[name="booking_range_selection_time_is_active"]' ).prop( 'checked', false );
597 $( '[data-wpbc-calendar-changeover-settings="1"]' ).removeClass( 'is-visible' );
598 }
599 }
600
601 function set_calendar_loading( is_loading ) {
602 var $panel = $( '[data-wpbc-calendar-panel="1"]' );
603
604 $panel.toggleClass( 'is-loading', !! is_loading );
605 $panel.find( '.wpbc_calendar_settings_loading' ).remove();
606
607 if ( is_loading ) {
608 $panel.append(
609 '<div class="wpbc_calendar_loading wpbc_calendar_settings_loading">' +
610 '<span class="wpbc_icn_autorenew wpbc_animation_spin"></span>&nbsp;' +
611 trim_text( cfg.i18n && cfg.i18n.loading ? cfg.i18n.loading : 'Loading' ) +
612 '</div>'
613 );
614 }
615 }
616
617 function refresh_preview() {
618 var data = collect_payload();
619 var signature;
620
621 data.action = cfg.preview_action;
622 data.nonce = cfg.nonce;
623 signature = JSON.stringify( data );
624 if ( signature === last_preview_signature ) {
625 return;
626 }
627
628 if ( preview_ajax && preview_ajax.readyState !== 4 ) {
629 preview_ajax.abort();
630 }
631 last_preview_signature = signature;
632
633 set_calendar_loading( true );
634 preview_ajax = $.post( cfg.ajax_url, data )
635 .done( function ( response ) {
636 if ( response && response.success && response.data && response.data.html ) {
637 $( '[data-wpbc-calendar-preview="1"]' ).replaceWith( response.data.html );
638 cfg.days_selection = response.data.days_selection || get_days_selection_from_form();
639 schedule_calendar_settings_apply( cfg.days_selection );
640 return;
641 }
642
643 show_message(
644 response && response.data && response.data.message ? response.data.message : ( cfg.i18n && cfg.i18n.preview_failed ? cfg.i18n.preview_failed : 'Unable to refresh calendar preview.' ),
645 'error',
646 10000
647 );
648 } )
649 .fail( function ( xhr, text_status ) {
650 if ( 'abort' === text_status ) {
651 return;
652 }
653 last_preview_signature = '';
654 show_message( cfg.i18n && cfg.i18n.preview_failed ? cfg.i18n.preview_failed : 'Unable to refresh calendar preview.', 'error', 10000 );
655 } )
656 .always( function () {
657 set_calendar_loading( false );
658 } );
659 }
660
661 function schedule_preview_refresh( delay ) {
662 clearTimeout( preview_timer );
663 preview_timer = setTimeout( refresh_preview, typeof delay === 'number' ? delay : 180 );
664 }
665
666 function is_text_typing_field( field ) {
667 var tag_name = String( field && field.tagName ? field.tagName : '' ).toLowerCase();
668 var input_type = String( field && field.type ? field.type : '' ).toLowerCase();
669
670 return (
671 'textarea' === tag_name ||
672 ( 'input' === tag_name && -1 !== $.inArray( input_type, [ 'text', 'number', 'search', 'email', 'url', 'tel' ] ) )
673 );
674 }
675
676 function is_full_preview_only_field( field_name ) {
677 field_name = String( field_name || '' ).replace( /\[\]$/, '' );
678
679 return (
680 'booking_is_show_legend' === field_name ||
681 0 === field_name.indexOf( 'booking_legend_' ) ||
682 'booking_show_timeslots_in_tooltip' === field_name ||
683 'booking_disable_timeslots_in_tooltip' === field_name ||
684 0 === field_name.indexOf( 'booking_highlight_' ) ||
685 'booking_is_show_availability_in_tooltips' === field_name ||
686 'booking_is_show_availability_in_date_cell' === field_name ||
687 'booking_is_show_cost_in_tooltips' === field_name ||
688 'booking_is_show_cost_in_date_cell' === field_name ||
689 'booking_cost_in_date_cell_currency' === field_name ||
690 'booking_is_show_booked_data_in_tooltips' === field_name ||
691 'booking_booked_data_in_tooltips' === field_name
692 );
693 }
694
695 function apply_calendar_settings_safely( days_selection ) {
696 try {
697 apply_calendar_settings_to_calendar( days_selection, true );
698 } catch ( error ) {
699 if ( w.console && typeof w.console.warn === 'function' ) {
700 w.console.warn( '[WPBC] Calendar Settings preview apply failed; full preview refresh will continue.', error );
701 }
702 }
703 }
704
705 function save_settings() {
706 var $button = $( '[data-wpbc-calendar-save="1"]' );
707 var original_text = $button.data( 'wpbc-original-text' );
708 var data = collect_payload();
709
710 if ( ! original_text ) {
711 original_text = $button.html();
712 $button.data( 'wpbc-original-text', original_text );
713 }
714
715 data.action = cfg.action;
716 data.nonce = cfg.nonce;
717
718 $button.addClass( 'disabled' ).attr( 'aria-disabled', 'true' );
719 $button.find( '.in-button-text' ).html( '&nbsp;&nbsp;' + trim_text( cfg.i18n && cfg.i18n.saving ? cfg.i18n.saving : 'Saving' ) + '...' );
720
721 $.post( cfg.ajax_url, data )
722 .done( function ( response ) {
723 if ( response && response.success ) {
724 show_message( response.data && response.data.message ? response.data.message : ( cfg.i18n && cfg.i18n.saved ? cfg.i18n.saved : 'Saved' ), 'success', 3000 );
725 cfg.settings = response.data && response.data.settings ? response.data.settings : cfg.settings;
726 $( document ).trigger( 'wpbc:setup-wizard:step-saved', [ 'date_selection' ] );
727 return;
728 }
729
730 show_message(
731 response && response.data && response.data.message ? response.data.message : ( cfg.i18n && cfg.i18n.save_failed ? cfg.i18n.save_failed : 'Unable to save calendar settings.' ),
732 'error',
733 10000
734 );
735 } )
736 .fail( function () {
737 show_message( cfg.i18n && cfg.i18n.save_failed ? cfg.i18n.save_failed : 'Unable to save calendar settings.', 'error', 10000 );
738 } )
739 .always( function () {
740 $button.removeClass( 'disabled' ).removeAttr( 'aria-disabled' ).html( original_text );
741 } );
742 }
743
744 function bind_events() {
745 $( document ).on( 'click', '.wpbc_calendar_rightbar_tabs [role="tab"]', function ( event ) {
746 event.preventDefault();
747 switch_panel( $( this ) );
748 } );
749
750 $( document ).on( 'click', '.wpbc_calendar_premium_dismiss a', function ( event ) {
751 event.stopPropagation();
752 } );
753
754 $( document ).on( 'click', '.wpbc_calendar_rightbar_panels .wpbc_ui__collapsible_group > .group__header', function ( event ) {
755 event.preventDefault();
756 toggle_group( $( this ) );
757 } );
758
759 $( document ).on( 'click', '[data-wpbc-calendar-save="1"]', function ( event ) {
760 event.preventDefault();
761 if ( ! $( this ).hasClass( 'disabled' ) ) {
762 save_settings();
763 }
764 } );
765
766 $( document ).on( 'click', '[data-wpbc-calendar-premium-range-info="1"], [data-wpbc-calendar-premium-changeover-info="1"]', function ( event ) {
767 event.preventDefault();
768 event.stopImmediatePropagation();
769 if ( $( this ).is( '[data-wpbc-calendar-premium-range-info="1"]' ) ) {
770 restore_available_day_selection();
771 }
772 if ( $( this ).is( '[data-wpbc-calendar-premium-changeover-info="1"]' ) ) {
773 $( this ).prop( 'checked', false );
774 }
775 refresh_conditional_controls();
776 show_premium_notice( $( this ) );
777 } );
778
779 $( document ).on( 'change input', '[data-wpbc-calendar-settings-form="1"] input, [data-wpbc-calendar-settings-form="1"] select, [data-wpbc-calendar-settings-form="1"] textarea', function ( event ) {
780 var field_name = this.name || '';
781 var preview_delay = ( 'input' === event.type && is_text_typing_field( this ) ) ? 850 : 180;
782
783 if ( is_locked_range_control( this ) ) {
784 restore_available_day_selection();
785 refresh_conditional_controls();
786 show_premium_notice( $( this ) );
787 return;
788 }
789 if ( is_locked_changeover_control( this ) ) {
790 $( this ).prop( 'checked', false );
791 refresh_conditional_controls();
792 show_premium_notice( $( this ) );
793 return;
794 }
795
796 refresh_conditional_controls();
797 if ( 'booking_type_of_day_selections' === field_name ) {
798 remember_available_day_selection();
799 }
800 schedule_preview_refresh( preview_delay );
801
802 if ( is_full_preview_only_field( field_name ) ) {
803 return;
804 }
805
806 apply_calendar_settings_safely( get_days_selection_from_form() );
807 } );
808
809 $( document ).on( 'change', '[data-wpbc-calendar-premium="1"]', function () {
810 show_premium_notice( $( this ) );
811 } );
812
813 $( document ).on( 'change', '#wpbc_calendar_resource_id, #wpbc_calendar_months_count', function () {
814 schedule_preview_refresh();
815 } );
816 }
817
818 patch_calendar_data_loader();
819
820 $( function () {
821 if ( ! $( '[data-wpbc-calendar-page="1"]' ).length ) {
822 return;
823 }
824
825 bind_events();
826 patch_calendar_data_loader();
827 remember_available_day_selection();
828 refresh_conditional_controls();
829 sync_left_navigation_active_section();
830 apply_open_section_from_url();
831 schedule_calendar_settings_apply( cfg.days_selection || get_days_selection_from_form() );
832 } );
833 }( jQuery, window ) );
834