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 +319 -73 11.6.1 → 11.9 View file →
@@ -1,4 +1,4 @@
1 1 /**
2 2 * General Availability UI.
3 3 */
4 4 ( function ( $, w ) {
@@ -386,9 +386,9 @@
386 386
387 387 return Math.min( 86400, ( hours * 3600 ) + ( mins * 60 ) );
388 388 }
389 389
390 - function seconds_to_time( seconds ) {
390 + function seconds_to_time( seconds ) {
391 391 var hours;
392 392 var mins;
393 393
394 394 seconds = Math.max( 0, Math.min( 86400, parseInt( seconds, 10 ) || 0 ) );
@@ -394,61 +394,280 @@
394 394 seconds = Math.max( 0, Math.min( 86400, parseInt( seconds, 10 ) || 0 ) );
395 395 hours = Math.floor( seconds / 3600 );
396 396 mins = Math.floor( ( seconds % 3600 ) / 60 );
397 397
398 - return ( hours < 10 ? '0' : '' ) + hours + ':' + ( mins < 10 ? '0' : '' ) + mins;
399 - }
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 + }
400 609
401 - function collect_working_time_weekdays( prefix ) {
402 - var $form = get_form();
403 - 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 + } );
404 625
405 - $form.find( '[data-wpbc-working-time-weekdays="' + prefix + '"] .wpbc_ag_working_time_row' ).each( function () {
406 - var $row = $( this );
407 - var day = parseInt( $row.find( 'input[type="checkbox"]' ).val(), 10 );
408 -
409 - weekdays[ day ] = [];
410 - if ( ! $row.find( 'input[type="checkbox"]' ).prop( 'checked' ) ) {
411 - return;
412 - }
413 -
414 - weekdays[ day ].push( {
415 - start_second: time_to_seconds( $row.find( '.wpbc_ag_working_time_start' ).val() ),
416 - end_second: time_to_seconds( $row.find( '.wpbc_ag_working_time_end' ).val() )
417 - } );
418 - } );
419 -
420 626 return weekdays;
421 627 }
422 628
423 - function set_working_time_weekdays( prefix, weekdays ) {
424 - 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 + }
425 650
426 - $wrap.find( '.wpbc_ag_working_time_row' ).each( function () {
427 - var $row = $( this );
428 - var day = parseInt( $row.find( 'input[type="checkbox"]' ).val(), 10 );
429 - var intervals = weekdays && weekdays[ day ] ? weekdays[ day ] : [];
430 - 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 + }
431 669
432 - $row.find( 'input[type="checkbox"]' ).prop( 'checked', intervals.length > 0 );
433 - $row.find( '.wpbc_ag_working_time_start' ).val( seconds_to_time( interval.start_second ) );
434 - $row.find( '.wpbc_ag_working_time_end' ).val( seconds_to_time( interval.end_second ) );
435 - } );
436 - }
437 -
438 - function refresh_working_time_panels() {
439 - var is_enabled = get_form().find( 'input[name="booking_working_time_enabled"]' ).prop( 'checked' );
440 - var mode = get_form().find( 'input[name="booking_working_time_resource_mode"]:checked' ).val() || 'inherit';
441 -
442 - get_form()
443 - .find( '.wpbc_ag_working_time_block' )
444 - .toggleClass( 'is-disabled', ! is_enabled )
445 - .find( 'input, select, button' )
446 - .prop( 'disabled', ! is_enabled );
447 -
448 - get_form().find( '[data-wpbc-working-time-resource-custom]' ).toggleClass( 'is-visible', mode === 'custom' );
449 - }
450 -
451 670 function get_working_time_settings_from_form() {
452 671 var $form = get_form();
453 672 var resourceId = parseInt( $form.find( '[data-wpbc-working-time-resource-id]' ).val(), 10 ) || parseInt( $( '#wpbc_ag_resource_id' ).val(), 10 ) || 0;
454 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 : {} ) );
@@ -490,9 +709,9 @@
490 709 set_working_time_weekdays( 'booking_working_time_resource', resourceSettings.weekdays || ( workingTime.default ? workingTime.default.weekdays : {} ) );
491 710 refresh_working_time_panels();
492 711 }
493 712
494 - function append_working_time_payload( payload ) {
713 + function append_working_time_payload( payload ) {
495 714 var $form = get_form();
496 715 var defaultDays = [];
497 716 var resourceDays = [];
498 717 var defaultStart = {};
@@ -499,30 +718,38 @@
499 718 var defaultEnd = {};
500 719 var resourceStart = {};
501 720 var resourceEnd = {};
502 721
503 - $form.find( '[data-wpbc-working-time-weekdays="booking_working_time_default"] .wpbc_ag_working_time_row' ).each( function () {
504 - var $row = $( this );
505 - 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 + } );
506 736
507 - defaultStart[ day ] = $row.find( '.wpbc_ag_working_time_start' ).val() || '09:00';
508 - defaultEnd[ day ] = $row.find( '.wpbc_ag_working_time_end' ).val() || '18:00';
509 - if ( $row.find( 'input[type="checkbox"]' ).prop( 'checked' ) ) {
510 - 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 );
511 749 }
512 750 } );
513 751
514 - $form.find( '[data-wpbc-working-time-weekdays="booking_working_time_resource"] .wpbc_ag_working_time_row' ).each( function () {
515 - var $row = $( this );
516 - var day = parseInt( $row.find( 'input[type="checkbox"]' ).val(), 10 );
517 -
518 - resourceStart[ day ] = $row.find( '.wpbc_ag_working_time_start' ).val() || '09:00';
519 - resourceEnd[ day ] = $row.find( '.wpbc_ag_working_time_end' ).val() || '18:00';
520 - if ( $row.find( 'input[type="checkbox"]' ).prop( 'checked' ) ) {
521 - resourceDays.push( day );
522 - }
523 - } );
524 -
525 752 payload.booking_working_time_enabled = $form.find( 'input[name="booking_working_time_enabled"]' ).prop( 'checked' ) ? 'On' : '';
526 753 payload.booking_working_time_resource_id = $form.find( '[data-wpbc-working-time-resource-id]' ).val() || $( '#wpbc_ag_resource_id' ).val() || '';
527 754 payload.booking_working_time_resource_mode = $form.find( 'input[name="booking_working_time_resource_mode"]:checked' ).val() || 'inherit';
528 755 payload.booking_working_time_default_days = defaultDays;
@@ -953,11 +1180,14 @@
953 1180
954 1181 if ( response.data && response.data.settings && response.data.settings.hints ) {
955 1182 update_hints( response.data.settings.hints );
956 1183 }
957 - if ( response.data && response.data.settings ) {
958 - cfg.settings = response.data.settings;
959 - }
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 + }
960 1190
961 1191 load_calendar_preview();
962 1192 document.dispatchEvent( new CustomEvent( 'wpbc:availability-general:settings-saved', {
963 1193 detail: {
@@ -964,11 +1194,15 @@
964 1194 settings: response.data && response.data.settings ? response.data.settings : {}
965 1195 }
966 1196 } ) );
967 1197 show_message( ( response.data && response.data.message ) || ( cfg.i18n && cfg.i18n.saved ) || 'General availability settings updated.', 'success', 2000 );
968 - } ).fail( function () {
969 - show_message( ( cfg.i18n && cfg.i18n.save_failed ) || 'Unable to save general availability settings.', 'error', 10000 );
970 - } ).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 () {
971 1205 set_busy( $button, false );
972 1206 } );
973 1207 }
974 1208
@@ -1053,9 +1287,21 @@
1053 1287 } );
1054 1288
1055 1289 $( document ).on( 'change', 'input[name="booking_working_time_enabled"]', refresh_working_time_panels );
1056 1290
1057 - $( 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 + } );
1058 1304
1059 1305 $( document ).on( 'change', '[data-wpbc-ag-settings-form="1"] input, [data-wpbc-ag-settings-form="1"] select', schedule_preview_refresh );
1060 1306
1061 1307 $( document ).on( 'submit', '[data-wpbc-ag-settings-form="1"]', function ( event ) {