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
← All changes | includes/page-availability-general/_src/availability_general_page.js +370 -82 11.1 → 11.9 View file →
@@ -1,4 +1,4 @@
1 1 /**
2 2 * General Availability UI.
3 3 */
4 4 ( function ( $, w ) {
@@ -67,35 +67,72 @@
67 67 }
68 68
69 69 function scroll_to_group( group_name ) {
70 70 var $group = $( '.wpbc_ui__collapsible_group[data-group="' + group_name + '"]' );
71 - var $scroll_parent;
71 + var $scroll_parent = $();
72 + var scroll_parent_el;
73 + var group_el;
72 74 var scroll_top;
75 + var parent_rect;
76 + var group_rect;
73 77
74 78 if ( ! $group.length ) {
75 79 return;
76 80 }
77 81
78 - $scroll_parent = $group.closest( '.wpbc_ui_el__vert_right_bar__content, .wpbc_rightbar_palette, .wpbc_ag_rightbar_panels' ).first();
82 + $group.parents().each( function () {
83 + var $candidate = $( this );
84 + var overflow_y = $candidate.css( 'overflow-y' );
79 85
86 + if (
87 + $candidate.hasClass( 'simplebar-content-wrapper' )
88 + || (
89 + /(auto|scroll)/.test( overflow_y )
90 + && this.scrollHeight > this.clientHeight
91 + )
92 + ) {
93 + $scroll_parent = $candidate;
94 + return false;
95 + }
96 + } );
97 +
80 98 if ( ! $scroll_parent.length ) {
81 - $group.get( 0 ).scrollIntoView( { block: 'start' } );
99 + $scroll_parent = $group.closest( '.wpbc_ui_el__vert_right_bar__content' ).find( '.simplebar-content-wrapper' ).first();
100 + }
101 +
102 + if ( ! $scroll_parent.length ) {
103 + $group.get( 0 ).scrollIntoView( { block: 'nearest' } );
82 104 return;
83 105 }
84 106
85 - scroll_top = $scroll_parent.scrollTop() + $group.position().top - 10;
107 + scroll_parent_el = $scroll_parent.get( 0 );
108 + group_el = $group.get( 0 );
109 + parent_rect = scroll_parent_el.getBoundingClientRect();
110 + group_rect = group_el.getBoundingClientRect();
111 + scroll_top = $scroll_parent.scrollTop() + group_rect.top - parent_rect.top - 10;
112 +
86 113 $scroll_parent.stop().animate( { scrollTop: Math.max( 0, scroll_top ) }, 180 );
87 114 }
88 115
89 116 function apply_open_section_from_url() {
90 - if ( 'working_time' !== cfg.open_section ) {
117 + var section_groups = {
118 + weekdays: 'general-availability-weekdays',
119 + from_today: 'general-availability-from-today',
120 + buffer: 'general-availability-buffer',
121 + working_time: 'general-availability-working-time'
122 + };
123 + var group_name = section_groups[ cfg.open_section ] || '';
124 +
125 + if ( '' === group_name ) {
91 126 return;
92 127 }
93 128
94 - open_group( 'general-availability-working-time', true );
95 - setTimeout( function () {
96 - scroll_to_group( 'general-availability-working-time' );
97 - }, 120 );
129 + open_group( group_name, true );
130 + $.each( [ 120, 650 ], function ( index, delay ) {
131 + setTimeout( function () {
132 + scroll_to_group( group_name );
133 + }, delay );
134 + } );
98 135 }
99 136
100 137 function refresh_buffer_fields() {
101 138 var value = $( 'input[name="booking_unavailable_extra_in_out"]:checked' ).val() || '';
@@ -349,9 +386,9 @@
349 386
350 387 return Math.min( 86400, ( hours * 3600 ) + ( mins * 60 ) );
351 388 }
352 389
353 - function seconds_to_time( seconds ) {
390 + function seconds_to_time( seconds ) {
354 391 var hours;
355 392 var mins;
356 393
357 394 seconds = Math.max( 0, Math.min( 86400, parseInt( seconds, 10 ) || 0 ) );
@@ -357,61 +394,280 @@
357 394 seconds = Math.max( 0, Math.min( 86400, parseInt( seconds, 10 ) || 0 ) );
358 395 hours = Math.floor( seconds / 3600 );
359 396 mins = Math.floor( ( seconds % 3600 ) / 60 );
360 397
361 - return ( hours < 10 ? '0' : '' ) + hours + ':' + ( mins < 10 ? '0' : '' ) + mins;
362 - }
398 + return ( hours < 10 ? '0' : '' ) + hours + ':' + ( mins < 10 ? '0' : '' ) + mins;
399 + }
400 +
401 + /**
402 + * Return the bounded interval limit for one Working Time editor.
403 + *
404 + * @param {jQuery} $weekdays Working Time weekday wrapper.
405 + * @return {number} Maximum intervals per weekday.
406 + */
407 + function get_max_working_time_intervals( $weekdays ) {
408 + var configured_limit = parseInt( $weekdays.attr( 'data-max-intervals' ), 10 );
409 + var localized_limit = parseInt( cfg.max_working_time_intervals, 10 );
410 +
411 + return Math.max( 1, Math.min( 48, configured_limit || localized_limit || 8 ) );
412 + }
413 +
414 + /**
415 + * Read all visible interval controls for one weekday.
416 + *
417 + * @param {jQuery} $day_row Weekday row.
418 + * @return {Object[]} Canonical interval records.
419 + */
420 + function collect_working_time_day_intervals( $day_row ) {
421 + var intervals = [];
422 +
423 + $day_row.find( '[data-wpbc-working-time-interval="1"]' ).each( function () {
424 + var $interval = $( this );
425 +
426 + intervals.push( {
427 + start_second: time_to_seconds( $interval.find( '.wpbc_ag_working_time_start' ).val() ),
428 + end_second: time_to_seconds( $interval.find( '.wpbc_ag_working_time_end' ).val() )
429 + } );
430 + } );
431 +
432 + return intervals;
433 + }
434 +
435 + /**
436 + * Rebuild dynamic names, IDs, and label associations after a row mutation.
437 + *
438 + * @param {jQuery} $day_row Weekday row.
439 + * @return {void}
440 + */
441 + function reindex_working_time_day( $day_row ) {
442 + var $weekdays = $day_row.closest( '[data-wpbc-working-time-weekdays]' );
443 + var prefix = String( $weekdays.attr( 'data-wpbc-working-time-weekdays' ) || '' );
444 + var day = parseInt( $day_row.attr( 'data-wpbc-working-time-day' ), 10 );
445 +
446 + $day_row.find( '[data-wpbc-working-time-interval="1"]' ).each( function ( interval_index ) {
447 + var $interval = $( this );
448 + var start_id = prefix + '_start_' + day + '_' + interval_index;
449 + var end_id = prefix + '_end_' + day + '_' + interval_index;
450 + var $labels = $interval.find( 'label' );
451 +
452 + $interval.attr( 'data-interval-index', interval_index );
453 + $interval.find( '.wpbc_ag_working_time_start' )
454 + .attr( 'id', start_id )
455 + .attr( 'name', prefix + '_start[' + day + '][]' );
456 + $interval.find( '.wpbc_ag_working_time_end' )
457 + .attr( 'id', end_id )
458 + .attr( 'name', prefix + '_end[' + day + '][]' );
459 + $labels.eq( 0 ).attr( 'for', start_id );
460 + $labels.eq( 1 ).attr( 'for', end_id );
461 + } );
462 + }
463 +
464 + /**
465 + * Refresh one weekday's enabled controls and interval-limit state.
466 + *
467 + * @param {jQuery} $day_row Weekday row.
468 + * @return {void}
469 + */
470 + function refresh_working_time_day( $day_row ) {
471 + var $weekdays = $day_row.closest( '[data-wpbc-working-time-weekdays]' );
472 + var $toggle = $day_row.find( '[data-wpbc-working-time-day-toggle="1"]' ).first();
473 + var $resource_custom = $day_row.closest( '[data-wpbc-working-time-resource-custom="1"]' );
474 + var is_block_disabled = $day_row.closest( '.wpbc_ag_working_time_block' ).hasClass( 'is-disabled' )
475 + || ( $resource_custom.length && ! $resource_custom.hasClass( 'is-visible' ) );
476 + var is_day_enabled = ! is_block_disabled && $toggle.prop( 'checked' );
477 + var interval_count = $day_row.find( '[data-wpbc-working-time-interval="1"]' ).length;
478 + var max_intervals = get_max_working_time_intervals( $weekdays );
479 +
480 + $day_row.toggleClass( 'is-enabled', $toggle.prop( 'checked' ) );
481 + $toggle.prop( 'disabled', is_block_disabled );
482 + $day_row.find( '.wpbc_ag_working_time_start, .wpbc_ag_working_time_end, [data-wpbc-remove-working-time-interval]' ).prop( 'disabled', ! is_day_enabled );
483 + $day_row.find( '[data-wpbc-add-working-time-interval]' ).prop( 'disabled', ! is_day_enabled || interval_count >= max_intervals );
484 + }
485 +
486 + /**
487 + * Find a non-overlapping one-hour interval proposal.
488 + *
489 + * @param {Object[]} intervals Current weekday intervals.
490 + * @return {Object|null} Proposed interval, or null when the day has no gap.
491 + */
492 + function find_working_time_interval_proposal( intervals ) {
493 + var sorted_intervals = intervals.slice().sort( function ( first_interval, second_interval ) {
494 + return first_interval.start_second - second_interval.start_second;
495 + } );
496 + var preferred_start = sorted_intervals.length ? sorted_intervals[ sorted_intervals.length - 1 ].end_second : 9 * 3600;
497 + var candidates = [];
498 + var candidate_start;
499 +
500 + for ( candidate_start = 0; candidate_start <= 23 * 3600; candidate_start += 1800 ) {
501 + if ( candidate_start >= preferred_start ) {
502 + candidates.push( candidate_start );
503 + }
504 + }
505 + for ( candidate_start = 0; candidate_start < preferred_start && candidate_start <= 23 * 3600; candidate_start += 1800 ) {
506 + candidates.push( candidate_start );
507 + }
508 +
509 + candidate_start = null;
510 + candidates.some( function ( proposed_start ) {
511 + var proposed_end = proposed_start + 3600;
512 + var overlaps = sorted_intervals.some( function ( interval ) {
513 + return proposed_start < interval.end_second && proposed_end > interval.start_second;
514 + } );
515 +
516 + if ( proposed_end <= 86400 && ! overlaps ) {
517 + candidate_start = proposed_start;
518 + return true;
519 + }
520 + return false;
521 + } );
522 +
523 + return null === candidate_start ? null : {
524 + start_second: candidate_start,
525 + end_second: candidate_start + 3600
526 + };
527 + }
528 +
529 + /**
530 + * Append an interval by cloning the server-rendered allow-listed controls.
531 + *
532 + * @param {jQuery} $day_row Weekday row.
533 + * @param {Object} interval Canonical interval record.
534 + * @return {jQuery} Appended interval node.
535 + */
536 + function append_working_time_interval( $day_row, interval ) {
537 + var $container = $day_row.find( '[data-wpbc-working-time-intervals="1"]' ).first();
538 + var $prototype = $container.find( '[data-wpbc-working-time-interval="1"]' ).first();
539 + var $interval = $prototype.clone( false, false );
540 +
541 + $interval.find( '.wpbc_ag_working_time_start' ).val( seconds_to_time( interval.start_second ) );
542 + $interval.find( '.wpbc_ag_working_time_end' ).val( seconds_to_time( interval.end_second ) );
543 + $container.append( $interval );
544 + reindex_working_time_day( $day_row );
545 +
546 + return $interval;
547 + }
548 +
549 + /**
550 + * Add the next available one-hour interval to a weekday.
551 + *
552 + * @param {HTMLElement} button Add-interval button.
553 + * @return {void}
554 + */
555 + function add_working_time_interval( button ) {
556 + var $day_row = $( button ).closest( '[data-wpbc-working-time-day]' );
557 + var $weekdays = $day_row.closest( '[data-wpbc-working-time-weekdays]' );
558 + var intervals = collect_working_time_day_intervals( $day_row );
559 + var max_intervals = get_max_working_time_intervals( $weekdays );
560 + var proposal;
561 + var $interval;
562 +
563 + if ( intervals.length >= max_intervals ) {
564 + show_message( ( cfg.i18n && cfg.i18n.interval_limit ) || 'No additional one-hour interval is available for this weekday.', 'error', 6000 );
565 + return;
566 + }
567 +
568 + proposal = find_working_time_interval_proposal( intervals );
569 + if ( ! proposal ) {
570 + show_message( ( cfg.i18n && cfg.i18n.interval_limit ) || 'No additional one-hour interval is available for this weekday.', 'error', 6000 );
571 + return;
572 + }
573 +
574 + $interval = append_working_time_interval( $day_row, proposal );
575 + $day_row.find( '[data-wpbc-working-time-day-toggle="1"]' ).prop( 'checked', true );
576 + refresh_working_time_day( $day_row );
577 + $interval.find( '.wpbc_ag_working_time_start' ).trigger( 'focus' );
578 + schedule_preview_refresh();
579 + }
580 +
581 + /**
582 + * Remove one weekday interval, closing the weekday when it is the last one.
583 + *
584 + * Keeping one disabled interval in the DOM preserves an allow-listed control
585 + * prototype for reopening the day or adding a later interval.
586 + *
587 + * @param {HTMLElement} button Remove-interval button.
588 + * @return {void}
589 + */
590 + function remove_working_time_interval( button ) {
591 + var $button = $( button );
592 + var $day_row = $button.closest( '[data-wpbc-working-time-day]' );
593 + var $intervals = $day_row.find( '[data-wpbc-working-time-interval="1"]' );
594 + var $focus_target;
595 +
596 + if ( $intervals.length > 1 ) {
597 + $button.closest( '[data-wpbc-working-time-interval="1"]' ).remove();
598 + $focus_target = $day_row.find( '[data-wpbc-add-working-time-interval="1"]' ).first();
599 + } else {
600 + $day_row.find( '[data-wpbc-working-time-day-toggle="1"]' ).prop( 'checked', false );
601 + $focus_target = $day_row.find( '[data-wpbc-working-time-day-toggle="1"]' ).first();
602 + }
603 +
604 + reindex_working_time_day( $day_row );
605 + refresh_working_time_day( $day_row );
606 + $focus_target.trigger( 'focus' );
607 + schedule_preview_refresh();
608 + }
363 609
364 - function collect_working_time_weekdays( prefix ) {
365 - var $form = get_form();
366 - var weekdays = {};
610 + function collect_working_time_weekdays( prefix ) {
611 + var $form = get_form();
612 + var weekdays = {};
613 +
614 + $form.find( '[data-wpbc-working-time-weekdays="' + prefix + '"] .wpbc_ag_working_time_row' ).each( function () {
615 + var $row = $( this );
616 + var day = parseInt( $row.attr( 'data-wpbc-working-time-day' ), 10 );
617 +
618 + weekdays[ day ] = [];
619 + if ( ! $row.find( '[data-wpbc-working-time-day-toggle="1"]' ).prop( 'checked' ) ) {
620 + return;
621 + }
622 +
623 + weekdays[ day ] = collect_working_time_day_intervals( $row );
624 + } );
367 625
368 - $form.find( '[data-wpbc-working-time-weekdays="' + prefix + '"] .wpbc_ag_working_time_row' ).each( function () {
369 - var $row = $( this );
370 - var day = parseInt( $row.find( 'input[type="checkbox"]' ).val(), 10 );
371 -
372 - weekdays[ day ] = [];
373 - if ( ! $row.find( 'input[type="checkbox"]' ).prop( 'checked' ) ) {
374 - return;
375 - }
376 -
377 - weekdays[ day ].push( {
378 - start_second: time_to_seconds( $row.find( '.wpbc_ag_working_time_start' ).val() ),
379 - end_second: time_to_seconds( $row.find( '.wpbc_ag_working_time_end' ).val() )
380 - } );
381 - } );
382 -
383 626 return weekdays;
384 627 }
385 628
386 - function set_working_time_weekdays( prefix, weekdays ) {
387 - var $wrap = get_form().find( '[data-wpbc-working-time-weekdays="' + prefix + '"]' );
629 + function set_working_time_weekdays( prefix, weekdays ) {
630 + var $wrap = get_form().find( '[data-wpbc-working-time-weekdays="' + prefix + '"]' );
631 +
632 + $wrap.find( '.wpbc_ag_working_time_row' ).each( function () {
633 + var $row = $( this );
634 + var day = parseInt( $row.attr( 'data-wpbc-working-time-day' ), 10 );
635 + var intervals = weekdays && $.isArray( weekdays[ day ] ) ? weekdays[ day ] : [];
636 + var display_intervals = intervals.length ? intervals : [ { start_second: 32400, end_second: 64800 } ];
637 + var $container = $row.find( '[data-wpbc-working-time-intervals="1"]' ).first();
638 + var $prototype = $container.find( '[data-wpbc-working-time-interval="1"]' ).first().clone( false, false );
639 +
640 + $container.empty().append( $prototype );
641 + $prototype.find( '.wpbc_ag_working_time_start' ).val( seconds_to_time( display_intervals[0].start_second ) );
642 + $prototype.find( '.wpbc_ag_working_time_end' ).val( seconds_to_time( display_intervals[0].end_second ) );
643 + display_intervals.slice( 1 ).forEach( function ( interval ) {
644 + append_working_time_interval( $row, interval );
645 + } );
646 + $row.find( '[data-wpbc-working-time-day-toggle="1"]' ).prop( 'checked', intervals.length > 0 );
647 + reindex_working_time_day( $row );
648 + } );
649 + }
388 650
389 - $wrap.find( '.wpbc_ag_working_time_row' ).each( function () {
390 - var $row = $( this );
391 - var day = parseInt( $row.find( 'input[type="checkbox"]' ).val(), 10 );
392 - var intervals = weekdays && weekdays[ day ] ? weekdays[ day ] : [];
393 - var interval = intervals.length ? intervals[0] : { start_second: 32400, end_second: 64800 };
651 + function refresh_working_time_panels() {
652 + var is_enabled = get_form().find( 'input[name="booking_working_time_enabled"]' ).prop( 'checked' );
653 + var mode = get_form().find( 'input[name="booking_working_time_resource_mode"]:checked' ).val() || 'inherit';
654 + var $resource_custom = get_form().find( '[data-wpbc-working-time-resource-custom]' );
655 +
656 + $resource_custom.toggleClass( 'is-visible', mode === 'custom' );
657 +
658 + get_form()
659 + .find( '.wpbc_ag_working_time_block' )
660 + .toggleClass( 'is-disabled', ! is_enabled );
661 +
662 + get_form().find( '.wpbc_ag_working_time_block' ).each( function () {
663 + $( this ).find( 'input, select, button' ).prop( 'disabled', ! is_enabled );
664 + } );
665 + get_form().find( '[data-wpbc-working-time-day]' ).each( function () {
666 + refresh_working_time_day( $( this ) );
667 + } );
668 + }
394 669
395 - $row.find( 'input[type="checkbox"]' ).prop( 'checked', intervals.length > 0 );
396 - $row.find( '.wpbc_ag_working_time_start' ).val( seconds_to_time( interval.start_second ) );
397 - $row.find( '.wpbc_ag_working_time_end' ).val( seconds_to_time( interval.end_second ) );
398 - } );
399 - }
400 -
401 - function refresh_working_time_panels() {
402 - var is_enabled = get_form().find( 'input[name="booking_working_time_enabled"]' ).prop( 'checked' );
403 - var mode = get_form().find( 'input[name="booking_working_time_resource_mode"]:checked' ).val() || 'inherit';
404 -
405 - get_form()
406 - .find( '.wpbc_ag_working_time_block' )
407 - .toggleClass( 'is-disabled', ! is_enabled )
408 - .find( 'input, select, button' )
409 - .prop( 'disabled', ! is_enabled );
410 -
411 - get_form().find( '[data-wpbc-working-time-resource-custom]' ).toggleClass( 'is-visible', mode === 'custom' );
412 - }
413 -
414 670 function get_working_time_settings_from_form() {
415 671 var $form = get_form();
416 672 var resourceId = parseInt( $form.find( '[data-wpbc-working-time-resource-id]' ).val(), 10 ) || parseInt( $( '#wpbc_ag_resource_id' ).val(), 10 ) || 0;
417 673 var workingTime = $.extend( true, {}, cfg.settings && cfg.settings.working_time ? cfg.settings.working_time : ( cfg.default_settings && cfg.default_settings.working_time ? cfg.default_settings.working_time : {} ) );
@@ -453,9 +709,9 @@
453 709 set_working_time_weekdays( 'booking_working_time_resource', resourceSettings.weekdays || ( workingTime.default ? workingTime.default.weekdays : {} ) );
454 710 refresh_working_time_panels();
455 711 }
456 712
457 - function append_working_time_payload( payload ) {
713 + function append_working_time_payload( payload ) {
458 714 var $form = get_form();
459 715 var defaultDays = [];
460 716 var resourceDays = [];
461 717 var defaultStart = {};
@@ -462,30 +718,38 @@
462 718 var defaultEnd = {};
463 719 var resourceStart = {};
464 720 var resourceEnd = {};
465 721
466 - $form.find( '[data-wpbc-working-time-weekdays="booking_working_time_default"] .wpbc_ag_working_time_row' ).each( function () {
467 - var $row = $( this );
468 - var day = parseInt( $row.find( 'input[type="checkbox"]' ).val(), 10 );
722 + $form.find( '[data-wpbc-working-time-weekdays="booking_working_time_default"] .wpbc_ag_working_time_row' ).each( function () {
723 + var $row = $( this );
724 + var day = parseInt( $row.attr( 'data-wpbc-working-time-day' ), 10 );
725 +
726 + defaultStart[ day ] = [];
727 + defaultEnd[ day ] = [];
728 + $row.find( '[data-wpbc-working-time-interval="1"]' ).each( function () {
729 + defaultStart[ day ].push( $( this ).find( '.wpbc_ag_working_time_start' ).val() || '09:00' );
730 + defaultEnd[ day ].push( $( this ).find( '.wpbc_ag_working_time_end' ).val() || '18:00' );
731 + } );
732 + if ( $row.find( '[data-wpbc-working-time-day-toggle="1"]' ).prop( 'checked' ) ) {
733 + defaultDays.push( day );
734 + }
735 + } );
469 736
470 - defaultStart[ day ] = $row.find( '.wpbc_ag_working_time_start' ).val() || '09:00';
471 - defaultEnd[ day ] = $row.find( '.wpbc_ag_working_time_end' ).val() || '18:00';
472 - if ( $row.find( 'input[type="checkbox"]' ).prop( 'checked' ) ) {
473 - defaultDays.push( day );
737 + $form.find( '[data-wpbc-working-time-weekdays="booking_working_time_resource"] .wpbc_ag_working_time_row' ).each( function () {
738 + var $row = $( this );
739 + var day = parseInt( $row.attr( 'data-wpbc-working-time-day' ), 10 );
740 +
741 + resourceStart[ day ] = [];
742 + resourceEnd[ day ] = [];
743 + $row.find( '[data-wpbc-working-time-interval="1"]' ).each( function () {
744 + resourceStart[ day ].push( $( this ).find( '.wpbc_ag_working_time_start' ).val() || '09:00' );
745 + resourceEnd[ day ].push( $( this ).find( '.wpbc_ag_working_time_end' ).val() || '18:00' );
746 + } );
747 + if ( $row.find( '[data-wpbc-working-time-day-toggle="1"]' ).prop( 'checked' ) ) {
748 + resourceDays.push( day );
474 749 }
475 750 } );
476 751
477 - $form.find( '[data-wpbc-working-time-weekdays="booking_working_time_resource"] .wpbc_ag_working_time_row' ).each( function () {
478 - var $row = $( this );
479 - var day = parseInt( $row.find( 'input[type="checkbox"]' ).val(), 10 );
480 -
481 - resourceStart[ day ] = $row.find( '.wpbc_ag_working_time_start' ).val() || '09:00';
482 - resourceEnd[ day ] = $row.find( '.wpbc_ag_working_time_end' ).val() || '18:00';
483 - if ( $row.find( 'input[type="checkbox"]' ).prop( 'checked' ) ) {
484 - resourceDays.push( day );
485 - }
486 - } );
487 -
488 752 payload.booking_working_time_enabled = $form.find( 'input[name="booking_working_time_enabled"]' ).prop( 'checked' ) ? 'On' : '';
489 753 payload.booking_working_time_resource_id = $form.find( '[data-wpbc-working-time-resource-id]' ).val() || $( '#wpbc_ag_resource_id' ).val() || '';
490 754 payload.booking_working_time_resource_mode = $form.find( 'input[name="booking_working_time_resource_mode"]:checked' ).val() || 'inherit';
491 755 payload.booking_working_time_default_days = defaultDays;
@@ -916,17 +1180,29 @@
916 1180
917 1181 if ( response.data && response.data.settings && response.data.settings.hints ) {
918 1182 update_hints( response.data.settings.hints );
919 1183 }
920 - if ( response.data && response.data.settings ) {
921 - cfg.settings = response.data.settings;
922 - }
1184 + if ( response.data && response.data.settings ) {
1185 + cfg.settings = response.data.settings;
1186 + if ( response.data.settings.working_time ) {
1187 + apply_working_time_settings_to_form( response.data.settings.working_time, $( '#wpbc_ag_resource_id' ).val() );
1188 + }
1189 + }
923 1190
924 1191 load_calendar_preview();
1192 + document.dispatchEvent( new CustomEvent( 'wpbc:availability-general:settings-saved', {
1193 + detail: {
1194 + settings: response.data && response.data.settings ? response.data.settings : {}
1195 + }
1196 + } ) );
925 1197 show_message( ( response.data && response.data.message ) || ( cfg.i18n && cfg.i18n.saved ) || 'General availability settings updated.', 'success', 2000 );
926 - } ).fail( function () {
927 - show_message( ( cfg.i18n && cfg.i18n.save_failed ) || 'Unable to save general availability settings.', 'error', 10000 );
928 - } ).always( function () {
1198 + } ).fail( function ( jq_xhr ) {
1199 + var response_message = jq_xhr && jq_xhr.responseJSON && jq_xhr.responseJSON.data && jq_xhr.responseJSON.data.message
1200 + ? jq_xhr.responseJSON.data.message
1201 + : '';
1202 +
1203 + show_message( response_message || ( cfg.i18n && cfg.i18n.save_failed ) || 'Unable to save general availability settings.', 'error', 10000 );
1204 + } ).always( function () {
929 1205 set_busy( $button, false );
930 1206 } );
931 1207 }
932 1208
@@ -1011,9 +1287,21 @@
1011 1287 } );
1012 1288
1013 1289 $( document ).on( 'change', 'input[name="booking_working_time_enabled"]', refresh_working_time_panels );
1014 1290
1015 - $( document ).on( 'change', 'input[name="booking_working_time_resource_mode"]', refresh_working_time_panels );
1291 + $( document ).on( 'change', 'input[name="booking_working_time_resource_mode"]', refresh_working_time_panels );
1292 +
1293 + $( document ).on( 'change', '[data-wpbc-working-time-day-toggle="1"]', function () {
1294 + refresh_working_time_day( $( this ).closest( '[data-wpbc-working-time-day]' ) );
1295 + } );
1296 +
1297 + $( document ).on( 'click', '[data-wpbc-add-working-time-interval="1"]', function () {
1298 + add_working_time_interval( this );
1299 + } );
1300 +
1301 + $( document ).on( 'click', '[data-wpbc-remove-working-time-interval="1"]', function () {
1302 + remove_working_time_interval( this );
1303 + } );
1016 1304
1017 1305 $( document ).on( 'change', '[data-wpbc-ag-settings-form="1"] input, [data-wpbc-ag-settings-form="1"] select', schedule_preview_refresh );
1018 1306
1019 1307 $( document ).on( 'submit', '[data-wpbc-ag-settings-form="1"]', function ( event ) {