function latepoint_is_timeframe_in_periods(timeframe_start, timeframe_end, periods_arr) { var is_inside = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; for (var i = 0; i < periods_arr.length; i++) { var period_start = 0; var period_end = 0; var buffer_before = 0; var buffer_after = 0; var period_info = periods_arr[i].split(':'); if (period_info.length == 2) { period_start = period_info[0]; period_end = period_info[1]; } else { buffer_before = period_info[2]; buffer_after = period_info[3]; period_start = parseFloat(period_info[0]) - parseFloat(buffer_before); period_end = parseFloat(period_info[1]) + parseFloat(buffer_after); } if (is_inside) { if (latepoint_is_period_inside_another(timeframe_start, timeframe_end, period_start, period_end)) { return true; } } else { if (latepoint_is_period_overlapping(timeframe_start, timeframe_end, period_start, period_end)) { return true; } } } return false; } function latepoint_is_period_overlapping(period_one_start, period_one_end, period_two_start, period_two_end) { // https://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap/ return period_one_start < period_two_end && period_two_start < period_one_end; } function latepoint_is_period_inside_another(period_one_start, period_one_end, period_two_start, period_two_end) { return period_one_start >= period_two_start && period_one_end <= period_two_end; } // Converts time in minutes to hours if possible, if minutes also exists - shows minutes too function latepoint_minutes_to_hours_preferably(time) { var army_clock = latepoint_is_army_clock(); var hours = Math.floor(time / 60); if (!army_clock && hours > 12) hours = hours - 12; var minutes = time % 60; if (minutes > 0) hours = hours + ':' + minutes; return hours; } function latepoint_minutes_to_hours(time) { var army_clock = latepoint_is_army_clock(); var hours = Math.floor(time / 60); if (!army_clock && hours > 12) hours = hours - 12; return hours; } function latepoint_am_or_pm(minutes) { if (latepoint_is_army_clock()) return ''; return (minutes < 720 || minutes == 1440) ? 'am' : 'pm'; } function latepoint_hours_and_minutes_to_minutes(hours_and_minutes, ampm) { var hours_and_minutes_arr = hours_and_minutes.split(':'); var hours = hours_and_minutes_arr[0]; var minutes = hours_and_minutes_arr[1]; if (ampm == "pm" && hours < 12) hours = parseInt(hours) + 12; if (ampm == "am" && hours == 12) hours = 0; minutes = parseInt(minutes) + (hours * 60); return minutes; } function latepoint_get_time_system() { return latepoint_helper.time_system; } function latepoint_is_army_clock() { return (latepoint_get_time_system() == '24'); } function latepoint_minutes_to_hours_and_minutes(minutes) { var army_clock = latepoint_is_army_clock(); var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '%02d:%02d'; var hours = Math.floor(minutes / 60); if (!army_clock && (hours > 12)) hours = hours - 12; if (!army_clock && hours == 0) hours = 12; minutes = minutes % 60; // Check if sprintf is available (either native or from a library) if (typeof sprintf === 'function') { return sprintf(format, hours, minutes); } else { return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`; } } (function($) { jQuery.fn.lateSelect = function() { function os_build_selected_item($option){ var quantity_html = ''; if($option.data('quantity')) quantity_html = '<span class="os-late-quantity-selector-w"><span class="os-late-quantity-selector minus" data-sign="minus"></span><input class="os-late-quantity-selector-input" type="text" data-max-quantity="'+ $option.data('max-quantity') +'" value="' + $option.data('quantity') + '"/><span class="os-late-quantity-selector plus" data-sign="plus"></span></span>'; return '<div class="ls-item" data-value="' + $option.val() + '"><span class="latepoint-icon latepoint-icon-cross ls-item-remover"></span><span>' + $option.text() + '</span>' + quantity_html + '</div>' } this.each( function() { var lateselect_html = ''; var all_items = ''; var selected_items = ''; var is_selected = ''; if(jQuery(this).hasClass('os-late-select-active')) return; jQuery(this).hide().addClass('os-late-select-active'); jQuery(this).find('option').each(function(){ if(jQuery(this).is(':selected')) selected_items+= os_build_selected_item(jQuery(this)); is_selected = jQuery(this).is(':selected') ? 'selected' : ''; all_items+= '<div class="ls-item '+ is_selected +'" data-value="' + jQuery(this).val() + '">' + jQuery(this).text() + '</div>'; }); var placeholder = '<div class="ls-placeholder">' + jQuery(this).data('placeholder') + '</div>'; lateselect_html = jQuery('<div class="lateselect-w"></div>'); jQuery(this).wrap(lateselect_html); var $lateselect_wrapper = jQuery(this).closest('.lateselect-w'); $lateselect_wrapper.append('<div class="ls-selected-items-w">' + placeholder + selected_items + '</div>'); $lateselect_wrapper.append('<div class="ls-all-items-w">' + all_items + '</div>'); // ADD ITEM $lateselect_wrapper.on('click', '.ls-all-items-w .ls-item:not(.selected)', function(){ var selected_value = jQuery(this).data('value'); $lateselect_wrapper.find('.ls-selected-items-w').append(os_build_selected_item($lateselect_wrapper.find('select option[value="'+ selected_value +'"]'))); jQuery(this).addClass('selected'); $lateselect_wrapper.removeClass('ls-selecting'); $lateselect_wrapper.find('select option[value="'+ selected_value +'"]').prop('selected', true); $lateselect_wrapper.find('select').trigger('change'); return false; }); // REMOVE ITEM $lateselect_wrapper.on('click', '.ls-selected-items-w .ls-item-remover', function(){ var selected_value = jQuery(this).closest('.ls-item').data('value'); jQuery(this).closest('.ls-item').remove(); $lateselect_wrapper.find('.ls-all-items-w .ls-item.selected[data-value="' + selected_value + '"]').removeClass('selected'); $lateselect_wrapper.find('select option[value="'+ selected_value +'"]').prop('selected', false); $lateselect_wrapper.find('select').trigger('change'); return false; }); $lateselect_wrapper.on('click', '.ls-selected-items-w', function(){ $lateselect_wrapper.toggleClass('ls-selecting'); return false; }); $lateselect_wrapper.on('click', '.os-late-quantity-selector', function(){ var $input = jQuery(this).closest('.ls-item').find('input.os-late-quantity-selector-input'); var current_value = parseInt($input.val()); var new_quantity = (jQuery(this).data('sign') == 'minus') ? current_value - 1 : current_value + 1; var max_quantity = $input.data('max-quantity'); if(new_quantity <= 0) new_quantity = 1; if(max_quantity && (new_quantity > max_quantity)) new_quantity = max_quantity; var selected_value = jQuery(this).closest('.ls-item').data('value'); $lateselect_wrapper.find('select option[value="'+ selected_value +'"]').data('quantity', new_quantity); $input.val(new_quantity); $lateselect_wrapper.find('select').trigger('change'); return false; }); jQuery(this).on('change', function(){ var $hidden_connection = false; if(jQuery(this).data('hidden-connection')){ $hidden_connection = jQuery(jQuery(this).data('hidden-connection')); }else{ $hidden_connection = jQuery(this).closest('.lateselect-w').next('input[type="hidden"]'); } var formatted_ids = ''; if(jQuery(this).find('option:selected').length){ jQuery(this).find('option:selected').each(function(){ if(jQuery(this).data('quantity')){ var quantity = jQuery(this).data('quantity') ? jQuery(this).data('quantity') : 1; formatted_ids+= jQuery(this).val() + ':' + quantity + ','; }else{ formatted_ids+= jQuery(this).val() + ','; } }); }else{ formatted_ids = ''; } if(formatted_ids != '') formatted_ids = formatted_ids.slice(0, -1); $hidden_connection.val(formatted_ids); }); }); } }(jQuery)); /* * Copyright (c) 2023 LatePoint LLC. All rights reserved. */ (function($) { jQuery.fn.lateCheckbox = function() { function applyChanges(id){ let $wrapper = jQuery('.latecheckbox-w[data-latecheckbox-id="' + id + '"]'); $wrapper.find('.latecheckbox-options-w').html(jQuery('.latecheckbox-options-w[data-latecheckbox-id="' + id + '"]').html()); let $options = $wrapper.find('.latecheckbox-options'); let total_checked = $options.find('.latecheckbox-option input[type="checkbox"]:checked').length; let total_available = $options.find('.latecheckbox-option input[type="checkbox"]').length; if(total_checked < total_available){ $wrapper.find('.latecheckbox .filter-value').text(total_checked); }else{ $wrapper.find('.latecheckbox .filter-value').text('All'); } // set indeterminate, since it can only be set via JS $wrapper.find('input[type="checkbox"][indeterminate="indeterminate"]').prop('indeterminate', true).removeAttr('indeterminate'); $wrapper.find('.latecheckbox').trigger('change'); } this.each( function() { var $latecheckbox_wrapper = jQuery(this).closest('.latecheckbox-w'); $latecheckbox_wrapper.attr('data-latecheckbox-id', 'latecheckbox-' + latepoint_random_generator()); $latecheckbox_wrapper.on('click', '.latecheckbox', function(){ let $latecheckbox = jQuery(this); jQuery('body > .latecheckbox-options-w').remove(); if(jQuery(this).hasClass('is-active')){ jQuery(this).removeClass('is-active'); }else{ jQuery('.latecheckbox.is-active').removeClass('is-active'); jQuery(this).addClass('is-active'); let position = jQuery(this).position(); let left = position.left; let $options_wrapper = $latecheckbox_wrapper.find('.latecheckbox-options-w'); let $options_wrapper_clone = $options_wrapper.clone(); $options_wrapper_clone.attr('data-latecheckbox-id', jQuery(this).closest('.latecheckbox-w').attr('data-latecheckbox-id')).appendTo('body'); if(true){ // todo add ability to change position left = left + jQuery(this).outerWidth() - $options_wrapper_clone.outerWidth(); } $options_wrapper_clone.css({"top": position.top + jQuery(this).outerHeight() +5 , "left": left}); if($options_wrapper_clone.find('.latecheckbox-filter-input').length) $options_wrapper_clone.find('.latecheckbox-filter-input').trigger('focus'); $options_wrapper_clone.on('change', '.latecheckbox-all-check', function(){ if(jQuery(this).is(':checked')){ jQuery(this).attr('checked', 'checked').removeAttr('indeterminate'); jQuery(this).closest('.latecheckbox-options-w').find('.latecheckbox-options input[type="checkbox"]').prop('checked', true).prop('indeterminate', false).attr('checked', 'checked'); }else{ jQuery(this).removeAttr('checked').removeAttr('indeterminate'); jQuery(this).closest('.latecheckbox-options-w').find('.latecheckbox-options input[type="checkbox"]').prop('checked', false).prop('indeterminate', false).removeAttr('checked'); } applyChanges(jQuery(this).closest('.latecheckbox-options-w').attr('data-latecheckbox-id')); }); $options_wrapper_clone.on('change', '.latecheckbox-group-check', function(){ if(jQuery(this).is(':checked')){ jQuery(this).attr('checked', 'checked').removeAttr('indeterminate'); jQuery(this).closest('.latecheckbox-group').find('.latecheckbox-group-options input[type="checkbox"]').prop('checked', true).attr('checked', 'checked'); }else{ jQuery(this).removeAttr('checked').removeAttr('indeterminate'); jQuery(this).closest('.latecheckbox-group').find('.latecheckbox-group-options input[type="checkbox"]').prop('checked', false).removeAttr('checked'); } applyChanges(jQuery(this).closest('.latecheckbox-options-w').attr('data-latecheckbox-id')); }); $options_wrapper_clone.on('keyup', '.latecheckbox-filter-input', function(){ let q = jQuery(this).val().toLowerCase(); if(q == ''){ jQuery(this).closest('.latecheckbox-options-w').find('.latecheckbox-option.hidden').removeClass('hidden'); }else{ jQuery(this).closest('.latecheckbox-options-w').find('.latecheckbox-option').each(function(){ let text = jQuery(this).text().toLowerCase(); (text.indexOf(q) >= 0) ? jQuery(this).removeClass('hidden') : jQuery(this).addClass('hidden'); }); } }); $options_wrapper_clone.on('change', '.latecheckbox-option input[type="checkbox"]', function(){ if(jQuery(this).is(':checked')){ jQuery(this).attr('checked', 'checked'); }else{ jQuery(this).removeAttr('checked'); } // group checkbox if(jQuery(this).closest('.latecheckbox-group-options').length){ let $group = jQuery(this).closest('.latecheckbox-group'); let checked_count = $group.find('.latecheckbox-option input:checked').length; let unchecked_count = $group.find('.latecheckbox-option input:not(:checked)').length; if(checked_count && unchecked_count){ $group.find('.latecheckbox-group-check').prop('indeterminate', true).attr('indeterminate', 'indeterminate'); $group.find('.latecheckbox-group-check').prop('checked', false).removeAttr('checked'); }else{ $group.find('.latecheckbox-group-check').prop('indeterminate', false).removeAttr('indeterminate'); if(!checked_count){ $group.find('.latecheckbox-group-check').prop('checked', false).removeAttr('checked'); } if(!unchecked_count){ $group.find('.latecheckbox-group-check').prop('checked', true).attr('checked', 'checked'); } } } let checked_count = $options_wrapper_clone.find('.latecheckbox-option input:checked').length; let unchecked_count = $options_wrapper_clone.find('.latecheckbox-option input:not(:checked)').length; if(checked_count && unchecked_count){ $options_wrapper_clone.find('.latecheckbox-all-check').prop('indeterminate', true).attr('indeterminate', 'indeterminate'); $options_wrapper_clone.find('.latecheckbox-all-check').prop('checked', false).removeAttr('checked'); }else{ $options_wrapper_clone.find('.latecheckbox-all-check').prop('indeterminate', false).removeAttr('indeterminate'); if(!checked_count){ $options_wrapper_clone.find('.latecheckbox-all-check').prop('checked', false).removeAttr('checked'); } if(!unchecked_count){ $options_wrapper_clone.find('.latecheckbox-all-check').prop('checked', true).attr('checked', 'checked'); } } applyChanges(jQuery(this).closest('.latecheckbox-options-w').attr('data-latecheckbox-id')); }); } return false; }); }); } }(jQuery)); function latepoint_generate_form_message_html(messages, status){ var message_html = '<div class="os-form-message-w status-' + status + '"><ul>'; if(Array.isArray(messages)){ messages.forEach(function(message){ message_html+= '<li>' + message + '</li>'; }); }else{ message_html+= '<li>' + messages + '</li>'; } message_html+= '</ul></div>'; return message_html; } function latepoint_display_in_side_sub_panel(html){ if(!jQuery('.latepoint-side-panel-w').length) latepoint_show_data_in_side_panel(''); jQuery('.latepoint-side-panel-w .latepoint-side-panels .side-sub-panel-wrapper').remove(); jQuery('.latepoint-side-panel-w .latepoint-side-panels').append(html); } function latepoint_clear_form_messages($form){ $form.find('.os-form-message-w').remove(); } function latepoint_show_data_in_side_panel(message, extra_classes = '', close_btn = true){ jQuery('.latepoint-side-panel-w').remove(); jQuery('body').append('<div class="latepoint-side-panel-w ' + extra_classes + ' os-loading"><div class="latepoint-side-panel-shadow"></div><div class="latepoint-side-panels"><div class="latepoint-side-panel-i"></div></div></div>'); jQuery('.latepoint-side-panel-i').html(message); if(close_btn){ jQuery('.latepoint-side-panel-i').find('.os-form-header .latepoint-side-panel-close').remove(); jQuery('.latepoint-side-panel-i').find('.os-form-header').append('<a href="#" class="latepoint-side-panel-close latepoint-side-panel-close-trigger"><i class="latepoint-icon latepoint-icon-x"></i></a>'); } setTimeout(function(){ jQuery('.latepoint-side-panel-w').removeClass('os-loading'); }, 100); } function latepoint_show_data_in_lightbox(message, extra_classes = '', close_btn = true, tag = 'div', inner_extra_classes = '', inner_tag = 'div'){ jQuery('.latepoint-lightbox-w').remove(); let lightbox_css_classes = 'latepoint-lightbox-w latepoint-w latepoint-border-radius-' + latepoint_helper.style_border_radius+ ' '; if(extra_classes) lightbox_css_classes+= extra_classes; let lightbox_css_inner_classes = 'latepoint-lightbox-i '; if(inner_extra_classes) lightbox_css_inner_classes += inner_extra_classes; let close_btn_html = close_btn ? '<a href="#" class="latepoint-lightbox-close" tabindex="0"><i class="latepoint-icon latepoint-icon-x"></i></a>' : ''; jQuery('body').append('<'+tag+' class="'+ lightbox_css_classes +'"><'+inner_tag+' class="'+ lightbox_css_inner_classes +'">' + message + close_btn_html + '</'+inner_tag+'><div class="latepoint-lightbox-shadow"></div></'+tag+'>'); jQuery('body').addClass('latepoint-lightbox-active'); } // DOCUMENT READY jQuery(function( $ ) { if($('.latepoint').find('[data-os-action-onload]').length){ $('.latepoint').find('[data-os-action-onload]').each(function(){ var $this = jQuery(this); $this.addClass('os-loading'); var params = $this.data('os-params'); var return_format = $this.data('os-return-format') ? $this.data('os-return-format') : 'json' var data = { action: 'latepoint_route_call', route_name: $this.data('os-action-onload'), params: params, return_format: return_format } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response) { $this.removeClass('os-loading'); if (response.status === "success") { if($this.data('os-output-target') == 'self'){ $this.html(response.message); } } } }); }); } jQuery('body.latepoint').on('change', 'select[data-os-on-change]', function(e){ let $this = jQuery(this); let func_name = $this.data('os-on-change'); if(func_name.includes('.')){ let func_arr = func_name.split('.'); if(typeof window[func_arr[0]][func_arr[1]] !== 'function'){ console.log(func_name + ' is undefined'); }else{ window[func_arr[0]][func_arr[1]]($this); } }else{ if(typeof window[func_name] !== 'function'){ console.log(func_name + ' is undefined'); }else{ window[func_name]($this); } } }); /* Ajax buttons action */ $('.latepoint').on('click', 'button[data-os-action], a[data-os-action], div[data-os-action], span[data-os-action], tr[data-os-action]', function(e){ var $this = jQuery(this); if($this.data('os-prompt') && !confirm($this.data('os-prompt'))) return false; var params = $this.data('os-params'); if($this.data('os-source-of-params')){ var form_data = latepoint_create_form_data_from_non_form_element($($this.data('os-source-of-params'))); params = latepoint_formdata_to_url_encoded_string(form_data); } var return_format = $this.data('os-return-format') ? $this.data('os-return-format') : 'json' var data = { action: 'latepoint_route_call', route_name: $this.data('os-action'), params: params, return_format: return_format } $this.addClass('os-loading'); if($this.data('os-output-target') == 'side-panel'){ $('.latepoint-side-panel-w').remove(); let css_classes = $this.data('os-lightbox-classes') ? $this.data('os-lightbox-classes') : ''; $('body').append('<div class="latepoint-side-panel-w ' + css_classes + ' os-loading"><div class="latepoint-side-panel-shadow"></div><div class="latepoint-side-panels"><div class="latepoint-side-panel-i"></div></div></div>'); }else if($this.data('os-output-target') == 'full-panel'){ $('.latepoint-full-panel-w').remove(); $('body').append('<div class="latepoint-full-panel-w os-loading"></div>'); } $.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ if(response.status === "success"){ if($this.data('os-output-target') == 'lightbox'){ latepoint_show_data_in_lightbox(response.message, $this.data('os-lightbox-classes'), ($this.data('os-lightbox-no-close-button') !== 'yes'), $this.data('os-lightbox-tag'), $this.data('os-lightbox-inner-classes'), $this.data('os-lightbox-inner-tag')); }else if($this.data('os-output-target') == 'side-panel'){ $('.latepoint-side-panel-i').html(response.message); jQuery('.latepoint-side-panel-i').find('.os-form-header .latepoint-side-panel-close').remove(); jQuery('.latepoint-side-panel-i').find('.os-form-header').append('<a href="#" class="latepoint-side-panel-close latepoint-side-panel-close-trigger"><i class="latepoint-icon latepoint-icon-x"></i></a>'); setTimeout(function(){ $('.latepoint-side-panel-w').removeClass('os-loading'); }, 100); }else if($this.data('os-output-target') == 'full-panel'){ $('.latepoint-full-panel-w').html(response.message); setTimeout(function(){ $('.latepoint-full-panel-w').removeClass('os-loading'); }, 100); }else if($this.data('os-success-action') == 'reload'){ latepoint_add_notification(response.message); location.reload(); return; }else if($this.data('os-success-action') == 'redirect'){ if($this.data('os-redirect-to')){ latepoint_add_notification(response.message); window.location.replace($this.data('os-redirect-to')); }else{ window.location.replace(response.message); } return; }else if($this.data('os-output-target') && $($this.data('os-output-target')).length){ if($this.data('os-output-target-do') == 'append') { $($this.data('os-output-target')).append(response.message); }else if($this.data('os-output-target-do') == 'prepend'){ $($this.data('os-output-target')).prepend(response.message); }else{ $($this.data('os-output-target')).html(response.message); } }else{ switch($this.data('os-before-after')){ case 'before': $this.before(response.message); break; case 'after': $this.after(response.message); break; case 'replace': $this.replaceWith(response.message); break; case 'none': break; default: latepoint_add_notification(response.message); } } if($this.data('os-after-call')){ var func_name = $this.data('os-after-call'); var callback = false; if(func_name.includes('.')){ var func_arr = func_name.split('.'); if(typeof window[func_arr[0]][func_arr[1]] !== 'function'){ console.log(func_name + ' is undefined'); } if($this.data('os-pass-this') && $this.data('os-pass-response')){ window[func_arr[0]][func_arr[1]]($this, response); }else if($this.data('os-pass-this')){ window[func_arr[0]][func_arr[1]]($this); }else if($this.data('os-pass-response')){ window[func_arr[0]][func_arr[1]](response); }else{ window[func_arr[0]][func_arr[1]](); } }else{ if(typeof window[func_name] !== 'function'){ console.log(func_name + ' is undefined'); } if($this.data('os-pass-this') && $this.data('os-pass-response')){ window[func_name]($this, response); }else if($this.data('os-pass-this')){ window[func_name]($this); }else if($this.data('os-pass-response')){ window[func_name](response); }else{ window[func_name](); } } } $this.removeClass('os-loading'); }else{ $this.removeClass('os-loading'); if($this.data('os-output-target') && $($this.data('os-output-target')).length){ $($this.data('os-output-target')).prepend(latepoint_generate_form_message_html(response.message, 'error')); }else{ alert(response.message); } if($this.data('os-after-call-error')){ var func_name = $this.data('os-after-call-error'); var callback = false; if(func_name.includes('.')){ var func_arr = func_name.split('.'); if(typeof window[func_arr[0]][func_arr[1]] !== 'function'){ console.log(func_name + ' is undefined'); } if($this.data('os-pass-this') && $this.data('os-pass-response')){ window[func_arr[0]][func_arr[1]]($this, response); }else if($this.data('os-pass-this')){ window[func_arr[0]][func_arr[1]]($this); }else if($this.data('os-pass-response')){ window[func_arr[0]][func_arr[1]](response); }else{ window[func_arr[0]][func_arr[1]](); } }else{ if(typeof window[func_name] !== 'function'){ console.log(func_name + ' is undefined'); } if($this.data('os-pass-this') && $this.data('os-pass-response')){ window[func_name]($this, response); }else if($this.data('os-pass-this')){ window[func_name]($this); }else if($this.data('os-pass-response')){ window[func_name](response); }else{ window[func_name](); } } } } } }); return false; }); $('.latepoint').on('click', 'form[data-os-action] button[type="submit"]', function(e){ $(this).addClass('os-loading'); }); /* Form ajax submit action */ $('.latepoint').on('submit', 'form[data-os-action]', function(e){ e.preventDefault(); // prevent native submit var $form = $(this); var form_data = new FormData($form[0]); if (('lp_intlTelInputGlobals' in window) && ('lp_intlTelInputUtils' in window)) { // Get e164 formatted number from phone fields when form is submitted $form.find('input.os-mask-phone').each(function () { let telInstance = window.lp_intlTelInputGlobals.getInstance(this); if(telInstance){ const phoneInputName = this.getAttribute('name'); const phoneInputValue = window.lp_intlTelInputGlobals.getInstance(this).getNumber(window.lp_intlTelInputUtils.numberFormat.E164); form_data.set(phoneInputName, phoneInputValue); } }); } let data = latepoint_create_form_data($form, $(this).data('os-action')); // var data = { action: 'latepoint_route_call', route_name: $(this).data('os-action'), params: latepoint_formdata_to_url_encoded_string(form_data), return_format: 'json' } $form.find('button[type="submit"]').addClass('os-loading'); $.ajax({ type : "post", dataType : "json", processData: false, contentType: false, url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $form.find('button[type="submit"].os-loading').removeClass('os-loading'); latepoint_clear_form_messages($form); if(response.status === "success"){ if($form.data('os-success-action') == 'reload'){ latepoint_add_notification(response.message); location.reload(); return; }else if($form.data('os-success-action') == 'redirect'){ if($form.data('os-redirect-to')){ latepoint_add_notification(response.message); window.location.replace($form.data('os-redirect-to')); }else{ window.location.replace(response.message); } return; }else if($form.data('os-output-target') && $($form.data('os-output-target')).length){ $($form.data('os-output-target')).html(response.message); }else{ if(response.message == 'redirect'){ window.location.replace(response.url); }else{ latepoint_add_notification(response.message); } } if($form.data('os-record-id-holder') && response.record_id){ $form.find('[name="' + $form.data('os-record-id-holder') + '"]').val(response.record_id) } if($form.data('os-after-call')){ var func_name = $form.data('os-after-call'); var callback = false; if(func_name.includes('.')){ var func_arr = func_name.split('.'); if(typeof window[func_arr[0]][func_arr[1]] !== 'function'){ console.log(func_name + ' is undefined'); } if($form.data('os-pass-this') && $form.data('os-pass-response')){ window[func_arr[0]][func_arr[1]]($form, response); }else if($form.data('os-pass-this')){ window[func_arr[0]][func_arr[1]]($form); }else if($form.data('os-pass-response')){ window[func_arr[0]][func_arr[1]](response); }else{ window[func_arr[0]][func_arr[1]](); } }else{ if(typeof window[func_name] !== 'function'){ console.log(func_name + ' is undefined'); } if($form.data('os-pass-this') && $form.data('os-pass-response')){ window[func_name]($form, response); }else if($form.data('os-pass-this')){ window[func_name]($form); }else if($form.data('os-pass-response')){ window[func_name](response); }else{ window[func_name](); } } } $('button.os-loading').removeClass('os-loading'); }else{ $('button.os-loading').removeClass('os-loading'); if($form.data('os-show-errors-as-notification')){ latepoint_add_notification(response.message, 'error'); }else{ latepoint_add_notification(response.message, 'error'); $([document.documentElement, document.body]).animate({ scrollTop: ($form.find(".os-form-message-w").offset().top - 30) }, 200); } } if(response.form_values_to_update){ $.each(response.form_values_to_update, function(name, value){ $form.find('[name="'+ name +'"]').val(value); }); } } }); return false; }); }); function latepoint_add_notification(message, message_type = 'success'){ var wrapper = jQuery('body').find('.os-notifications'); if(!wrapper.length){ jQuery('body').append('<div class="os-notifications"></div>'); wrapper = jQuery('body').find('.os-notifications'); } if(wrapper.find('.item').length > 0) wrapper.find('.item:first-child').remove(); wrapper.append('<div class="item item-type-'+ message_type +'">' + message + '<span class="os-notification-close"><i class="latepoint-icon latepoint-icon-x"></i></span></div>'); } function latepoint_add_lightbox_notification(message, message_type = 'success'){ var wrapper = jQuery('.latepoint-lightbox-content').find('.os-notifications'); if(!wrapper.length){ jQuery('.latepoint-lightbox-content').prepend('<div class="os-notifications"></div>'); wrapper = jQuery('.latepoint-lightbox-content').find('.os-notifications'); } if(wrapper.find('.item').length > 0) wrapper.find('.item:first-child').remove(); wrapper.append('<div class="item item-type-'+ message_type +'">' + message + '<span class="os-notification-close"><i class="latepoint-icon latepoint-icon-x"></i></span></div>'); } function latepoint_timestamped_ajaxurl(){ let url = latepoint_helper.ajaxurl; let timestamp = Date.now(); // Check if the URL already has GET parameters if (url.includes('?')) { return `${url}&t=${timestamp}`; } else { return `${url}?t=${timestamp}`; } } function latepoint_random_generator() { var S4 = function () { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); }; return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4()); } function latepoint_validate_form($form) { let errors = []; $form.find('select[data-os-validate], input[data-os-validate], textarea[data-os-validate]').each(function () { let validations = jQuery(this).data('os-validate').split(' '); let $input = jQuery(this); let label = $input.closest('.os-form-group').find('label').text(); let field_has_errors = false; if (validations) { for (let i = 0; i < validations.length; i++) { switch (validations[i]) { case 'presence': if($input.is(':checkbox')){ if (!$input.is(':checked')) { errors.push({message: label + ' ' + latepoint_helper.msg_validation_presence_checkbox}); field_has_errors = true; } }else{ if (!$input.val()) { errors.push({message: label + ' ' + latepoint_helper.msg_validation_presence}); field_has_errors = true; } } break; case 'phone': if (!window.lp_intlTelInputGlobals.getInstance($input[0]).isValidNumber()) { errors.push({message: label + ' ' + latepoint_helper.msg_validation_invalid}); field_has_errors = true; } break; } } } if (field_has_errors) { $input.closest('.os-form-group').addClass('os-invalid'); } else { $input.closest('.os-form-group').removeClass('os-invalid'); } }); return errors; } function latepoint_create_form_data_from_non_form_element($elem) { let formData = new FormData(); // create objecte from all input fields that are inside of the element let fields = $elem.find('select, input, textarea').serializeArray(); if (fields) { fields.forEach(field => formData.append(field.name, field.value)); } return formData; } function latepoint_create_form_data($form, route_name = false, extra_params = false) { let form_data = new FormData(); let params = new FormData($form[0]); if (extra_params) { Object.keys(extra_params).forEach(key => { params.set(key, extra_params[key]); }); } // get values from phone number fields if (('lp_intlTelInputGlobals' in window) && ('lp_intlTelInputUtils' in window)) { $form.find('input.os-mask-phone').each(function () { const phoneInputName = this.getAttribute('name'); const phoneInputValue = window.lp_intlTelInputGlobals.getInstance(this).getNumber(window.lp_intlTelInputUtils.numberFormat.E164); // override value generated automatically by formdata with a formatted value of a phone field with country code params.set(phoneInputName, phoneInputValue); }); } form_data.append('params', latepoint_formdata_to_url_encoded_string(params)); form_data.append('action', latepoint_helper.route_action); form_data.append('route_name', route_name ? route_name : $form.data('route-name')); form_data.append('layout', 'none'); form_data.append('return_format', 'json'); let file_data; // put file data into main form_data object, since we can't send them in "params" string $form.find('input[type="file"]').each(function () { file_data = this.files; // get multiple files from input file let file_name = this.getAttribute("name"); for (let i = 0; i < file_data.length; i++) { form_data.append(file_name + '[]', file_data[i]); } }); return form_data; } function latepoint_mask_timefield($elem) { if (jQuery().inputmask) { $elem.inputmask({ 'mask': '99:99', 'placeholder': 'HH:MM' }); } } function latepoint_formdata_to_url_encoded_string(form_data) { let filtered_form_data = new FormData(); // remove file fields from params, so we can serialize it into string, // !important, this will not include file fields into the form_data, so you have to include them manually, see latepoint_create_form_data() that does it // note: we don't use form_data.remove(key) on original object because we might want to preserve it for (const [key, value] of form_data) { if (value instanceof File) continue; if (key.slice(-2) === '[]') { // expecting array, append filtered_form_data.append(key, value); } else { filtered_form_data.set(key, value); } } return new URLSearchParams(filtered_form_data).toString(); } function latepoint_mask_percent($elem) { if (jQuery().inputmask) { $elem.inputmask({ 'alias': 'decimal', 'radixPoint': latepoint_helper.decimal_separator, 'digits': 4, 'digitsOptional': false, 'suffix': '%', 'placeholder': '0', 'rightAlign': false }); } } function latepoint_mask_minutes($elem) { if (jQuery().inputmask) { $elem.inputmask({ 'removeMaskOnSubmit': true, 'alias': 'numeric', 'digits': 0, 'suffix': latepoint_helper.msg_minutes_suffix, 'placeholder': '0', 'rightAlign': false }); } } function latepoint_mask_money($elem) { if (jQuery().inputmask) { $elem.inputmask({ 'alias': 'currency', 'groupSeparator': latepoint_helper.thousand_separator, 'radixPoint': latepoint_helper.decimal_separator, 'digits': latepoint_helper.number_of_decimals, 'digitsOptional': false, 'prefix': latepoint_helper.currency_symbol_before ? latepoint_helper.currency_symbol_before + ' ' : '', 'suffix': latepoint_helper.currency_symbol_after ? ' ' + latepoint_helper.currency_symbol_after : '', 'placeholder': '0', 'rightAlign': false }); } } function latepoint_mask_date($elem) { if (jQuery().inputmask) { $elem.inputmask({ 'alias': 'datetime', 'inputFormat': latepoint_helper.date_format_for_js }); } } function latepoint_init_phone_masking_from_placeholder($input) { if (!latepoint_helper.mask_phone_number_fields) return; let format = $input.attr('placeholder'); if (format && jQuery().inputmask) { $input.inputmask(format.replace(/[0-9]/g, 9)); } } function latepoint_mask_phone($elem) { let jsElem = $elem[0]; // First priority is to prevent duplicates (common in non-document.body contexts) if (jsElem && !window.lp_intlTelInputGlobals.getInstance(jsElem)) { let dropdownContainer = document.body; let onlyCountries = JSON.parse(latepoint_helper.included_phone_countries); // Remedy a quirk with json_encode(EMPTY_ARRAY) if (onlyCountries.length === 1 && onlyCountries[0] === "") { onlyCountries = []; } const preferredCountries = onlyCountries.length ? [] : window.lp_intlTelInputGlobals.defaults.preferredCountries; // remove country name in english and only use names in country language var countryData = window.lp_intlTelInputGlobals.getCountryData(); for (var i = 0; i < countryData.length; i++) { var country = countryData[i]; country.name = country.name.replace(/ *\([^)]*\) */g, ""); } let defaultCountryCode = latepoint_helper.default_phone_country; if (onlyCountries.length && !onlyCountries.includes(defaultCountryCode)) { defaultCountryCode = onlyCountries[0]; } let iti = window.lp_intlTelInput(jsElem, { dropdownContainer: dropdownContainer, formatOnDisplay: true, nationalMode: true, autoPlaceholder: 'aggressive', initialCountry: defaultCountryCode, geoIpLookup: function (callback) { const cookieName = 'latepoint_phone_country'; if (latepoint_has_cookie(cookieName)) { callback(latepoint_get_cookie(cookieName)); } else { jQuery.get('https://ipinfo.io', function () { }, 'jsonp').always(function (response) { // Sensible default let countryCode = defaultCountryCode; if (response && response.country) { countryCode = response.country.toLowerCase(); latepoint_set_cookie(cookieName, countryCode); } callback(countryCode); }) } }, allowDropdown: onlyCountries.length != 1, onlyCountries: onlyCountries, preferredCountries: preferredCountries, separateDialCode: latepoint_helper.is_enabled_show_dial_code_with_flag }); iti.promise.then(function () { latepoint_init_phone_masking_from_placeholder($elem); }); $elem.on("countrychange", function (event) { latepoint_init_phone_masking_from_placeholder(jQuery(this)); }); } } function latepoint_show_booking_end_time() { return (latepoint_helper.show_booking_end_time == 'yes'); } function latepoint_set_cookie(name, value, days) { let date = new Date; date.setTime(date.getTime() + 24 * 60 * 60 * 1000 * days); document.cookie = name + "=" + value + ";path=/;expires=" + date.toGMTString(); } function latepoint_get_cookie(name) { let cookie = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); return cookie ? cookie[2] : null; } function latepoint_has_cookie(name) { return latepoint_get_cookie(name) !== null; } function latepoint_delete_cookie(name) { latepoint_set_cookie(name, '', -1); } function latepoint_load_addons_info(){ var $addons_info_wrapper = jQuery('.addons-info-holder'); $addons_info_wrapper.addClass('os-loading'); var route = $addons_info_wrapper.data('route'); var data = { action: 'latepoint_route_call', route_name: route, params: '', return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $addons_info_wrapper.removeClass('os-loading'); if(response.status === "success"){ if(response.message){ $addons_info_wrapper.html(response.message); }else{ $addons_info_wrapper.html('Something is wrong. Try refreshing the page.') } }else{ alert(response.message, 'error'); } } }); } function latepoint_dismiss_message($elem){ $elem.closest('.addon-message').slideUp(300); return false; } function latepoint_check_for_updates(){ if(jQuery('.version-log-w').length){ var $log_wrapper = jQuery('.version-log-w'); $log_wrapper.addClass('os-loading'); var route = $log_wrapper.data('route'); var data = { action: 'latepoint_route_call', route_name: route, params: '', return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $log_wrapper.removeClass('os-loading'); if(response.status === "success"){ $log_wrapper.html(response.message); }else{ alert(response.message, 'error'); } } }); } if(jQuery('.version-status-info').length){ var $version_info_wrapper = jQuery('.version-status-info'); $version_info_wrapper.addClass('os-loading'); var route = $version_info_wrapper.data('route'); var data = { action: 'latepoint_route_call', route_name: route, params: '', return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $version_info_wrapper.removeClass('os-loading'); if(response.status === "success"){ $version_info_wrapper.html(response.message); }else{ alert(response.message, 'error'); } } }); } if(jQuery('.addons-info-holder').length){ latepoint_load_addons_info(); } } // DOCUMENT READY jQuery(document).ready(function( $ ) { latepoint_check_for_updates(); jQuery('body').on('click', '.addon-category-filter-trigger', function(){ jQuery('.addons-categories-wrapper .addon-category-filter-trigger.is-selected').removeClass('is-selected'); if(jQuery(this).data('category')){ let category = jQuery(this).data('category').toString(); jQuery('.addon-box').addClass('hidden'); jQuery('.addon-box').each(function(){ if(jQuery(this).data('category').toString().split(',').includes(category)) jQuery(this).removeClass('hidden'); }) }else{ jQuery('.addon-box').removeClass('hidden'); } jQuery(this).addClass('is-selected'); return false; }) // Install addon button click jQuery('.addons-info-holder').on('click', '.os-addon-action-btn', function(){ var $install_btn = jQuery(this); $install_btn.addClass('os-loading'); var data = { action: 'latepoint_route_call', route_name: $install_btn.data('route-name'), params: { addon_name: $install_btn.data('addon-name'), addon_path: $install_btn.data('addon-path') }, layout: 'none', return_format: 'json'}; jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $install_btn.removeClass('os-loading'); if(response.status === "success"){ latepoint_add_notification(response.message); latepoint_load_addons_info(); }else{ if(response.code == '404'){ latepoint_show_data_in_lightbox(response.message); }else{ alert(response.message); } } } }); return false; }); }); /* * Copyright (c) 2022 LatePoint LLC. All rights reserved. */ function latepoint_init_version5_intro(){ if(jQuery('.improvement-install-pro').length){ let $install_btn = jQuery('.improvement-install-pro'); var data = { action: latepoint_helper.route_action, route_name: $install_btn.data('route-name'), params: {}, return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $install_btn.removeClass('os-loading'); if(response.status == 'success'){ $install_btn.addClass('is-installed').find('span').html(response.message); }else{ $install_btn.addClass('is-not-installed').find('span').html(response.message); } } }); } } function latepoint_settings_customer_authentication_method_changed($select){ if($select.val() === 'password_or_otp'){ jQuery('#authDefaultMethod').show(); }else{ jQuery('#authDefaultMethod').hide(); } } function latepoint_settings_customer_authentication_field_type_changed($select){ if($select.val() === 'disabled'){ jQuery('#passwordFields, #customerStepSettings').hide(); }else{ jQuery('#passwordFields, #customerStepSettings').show(); } if($select.val() === 'email_or_phone'){ jQuery('#authDefaultContactType').show(); }else{ jQuery('#authDefaultContactType').hide(); } } function latepoint_init_sticky_side_nav(){ jQuery('.latepoint-page-side-nav a').on('click', function(e) { e.preventDefault(); let target = jQuery(this).attr('href'); let targetOffset = jQuery(target).offset().top - 20; jQuery('html, body').animate({ scrollTop: targetOffset }, 400, 'swing'); }); if(jQuery('.latepoint-page-side-nav').length){ jQuery(window).on('scroll', function() { let scrollPos = jQuery(window).scrollTop() + 100; // 100px offset for better UX jQuery('.section-anchor').each(function() { let sectionTop = jQuery(this).offset().top; let sectionBottom = sectionTop + jQuery(this).outerHeight(); let sectionId = jQuery(this).attr('id'); // Check if current scroll position is within this section if (scrollPos >= sectionTop && scrollPos < sectionBottom) { // Remove active class from all menu items jQuery('.latepoint-page-side-nav a').removeClass('is-active'); // Add active class to current section's menu item jQuery('.latepoint-page-side-nav a[href="#' + sectionId + '"]').addClass('is-active'); } }); }); } } function latepoint_init_instant_booking_settings(){ jQuery('.instant-copy-url').on('click', function(e){ e.preventDefault(); let $this = jQuery(this); jQuery('body').find('.os-click-to-copy-prompt').hide(); let text_to_copy = jQuery('.instant-visit-url').prop('href'); navigator.clipboard.writeText(text_to_copy); let position_info = $this.offset(); let position_left = position_info.left; let position_top = position_info.top; let $done_prompt = jQuery('<div class="os-click-to-copy-done color-dark" style="top: '+position_top+'px; left: '+position_left+'px;">' + latepoint_helper.click_to_copy_done + '</div>'); $done_prompt.appendTo(jQuery('body')).animate({ opacity: 0, left: (position_left + 20), }, 600); setTimeout(function(){ jQuery('body').find('.os-click-to-copy-done').remove(); jQuery('body').find('.os-click-to-copy-prompt').show(); }, 800); }); jQuery('.instant-booking-preview-settings-content').find('select, input').on('change', function(){ latepoint_build_url_for_instant_booking_page(); }) jQuery('.preview-background-option').on('click', function(e){ jQuery('.preview-background-option').removeClass('selected'); jQuery(this).addClass('selected'); jQuery('input[name="instant_booking[background_pattern]"]').val(jQuery(this).data('pattern-key')).trigger('change'); }); jQuery('.latepoint-instant-preview-close-trigger').on('click', function(e){ jQuery('.latepoint-full-panel-w').remove(); return false; }); } async function latepoint_build_url_for_instant_booking_page(){ let data = { action: 'latepoint_route_call', route_name: jQuery('.instant-booking-preview-settings-content').data('route-name'), params: jQuery('.instant-booking-preview-settings-content').find('select, input').serialize(), layout: 'none', return_format: 'json' } try { let response = await jQuery.ajax({ type: "post", dataType: "json", url: latepoint_timestamped_ajaxurl(), data: data }); if (response.status == 'success') { jQuery('.instant-booking-settings-iframe-wrapper').html('<iframe class="instant-preview-iframe" src="' + response.message + '"/>'); jQuery('.instant-visit-url').attr('href', response.message); } else { throw new Error('Error: ' + response.message); } } catch (e) { throw e; } } function latepoint_build_and_save_step_order(){ var $steps_wrapper = jQuery('.os-ordered-steps'); let steps_in_order = []; $steps_wrapper.find('.os-ordered-step').each(function(index){ if(jQuery(this).find('.os-ordered-step-children').length){ jQuery(this).find('.os-ordered-step-child').each(function(){ steps_in_order.push(jQuery(this).data('step-code')); }); }else{ steps_in_order.push(jQuery(this).data('step-code')); } }); var data = { action: latepoint_helper.route_action, route_name: $steps_wrapper.data('route-name'), params: {steps_order: steps_in_order.join(',')}, return_format: 'json' } jQuery('.latepoint-lightbox-heading').addClass('os-loading'); jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ jQuery('.latepoint-lightbox-heading').removeClass('os-loading'); latepoint_add_lightbox_notification(response.message, response.status); } }); } function latepoint_init_step_reordering(){ jQuery('.os-ordered-step-expand').on('click', function(){ jQuery(this).closest('.os-ordered-step').toggleClass('is-expanded'); return false; }); // Steps Order Dragging dragula([jQuery('.os-ordered-steps')[0]], { moves: function (el, container, handle) { return handle.classList.contains('os-ordered-step-drag-handle'); }, }).on('drop', function(el){ latepoint_build_and_save_step_order(); }); jQuery('.os-ordered-step-children').each(function(){ let step_holder = jQuery(this) // Child steps Order Dragging dragula([step_holder[0]], { moves: function (el, container, handle) { return handle.classList.contains('os-ordered-step-child-drag-handle'); }, }).on('drop', function(el){ latepoint_build_and_save_step_order(); }); }); } function latepoint_init_json_view($pre_element = false){ if(!$pre_element){ // if pre is not provided -search for all unitialised ones $pre_element = jQuery('pre.format-json:not(.json-document)'); } if($pre_element.length){ $pre_element.each(function(){ let json_data = JSON.parse(jQuery(this).html()); jQuery(this).jsonViewer(json_data); }); } } function latepoint_init_accordions(){ jQuery('.latepoint-admin').on('click', '.os-accordion-title', function(){ jQuery(this).closest('.os-accordion-wrapper').toggleClass('is-open'); return false; }); } function latepoint_init_sticky_side_menu(){ jQuery('.os-sticky-side-menu a').on('click', function(){ jQuery('.os-sticky-side-menu li.os-active').removeClass('os-active'); jQuery(this).closest('li').addClass('os-active'); let section_anchor = jQuery(this).data('section-anchor'); let position = jQuery('.section-anchor#'+section_anchor).offset(); jQuery('html').animate({ scrollTop: position.top }, 300); return false; }); } function latepoint_init_template_library(){ jQuery('.os-templates-wrapper .template-type-selector').on('click', function(){ jQuery(this).toggleClass('is-selected'); let user_type = jQuery(this).data('user-type'); jQuery('.os-template-items[data-user-type="'+user_type+'"]').toggleClass('hidden'); return false; }); jQuery('.os-templates-wrapper .os-template-item').on('click', function(){ let $this = jQuery(this); $this.closest('.os-templates-list').find('.os-template-item.selected').removeClass('selected'); $this.addClass('selected'); let templateId = $this.data('id'); jQuery('.os-template-preview').hide(); jQuery('.os-template-preview[data-id="'+ templateId+'"]').show(); jQuery('.os-no-template-selected-message').hide(); jQuery('.os-template-use-button-wrapper').removeClass('hidden'); return false; }); jQuery('.latepoint-select-template-btn').on('click', function(){ let $btn = jQuery(this); let route_name = $btn.data('route'); let action_id = $btn.data('action-id'); let process_id = $btn.data('process-id'); let action_type = $btn.data('action-type'); $btn.addClass('os-loading'); let data = { action: latepoint_helper.route_action, route_name: route_name, params: { template_id: jQuery('.os-template-item.selected').data('id'), action_id: action_id, process_id: process_id, action_type: action_type }, return_format: 'json' } jQuery.ajax({ type: 'post', dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: (response) => { $btn.removeClass('os-loading'); if(response.status === latepoint_helper.response_status.success){ let $action_form = jQuery('.process-action-form[data-id="'+action_id+'"]'); $action_form.find('.process-action-settings').html(response.message); latepoint_init_process_action_form($action_form); latepoint_close_side_panel(); }else{ alert("Error!"); } } }); return false; }); } function latepoint_init_default_form_fields_settings(){ if(jQuery('.os-default-fields').length){ jQuery('.os-default-field input[type="checkbox"], .os-default-field select').on('change', (event) => { latepoint_update_default_form_fields_settings(); }); jQuery('.os-default-field .os-toggler').on('ostoggler:toggle', (event) => { if(jQuery(event.currentTarget).hasClass('off')){ jQuery(event.currentTarget).closest('.os-default-field').addClass('is-disabled'); }else{ jQuery(event.currentTarget).closest('.os-default-field').removeClass('is-disabled'); } latepoint_update_default_form_fields_settings(); }); } } function latepoint_update_default_form_fields_settings(){ var $wrapper = jQuery('.os-default-fields'); var form_data = new FormData($wrapper.find('form')[0]); var data = { action: latepoint_helper.route_action, route_name: $wrapper.data('route'), params: latepoint_formdata_to_url_encoded_string(form_data), return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: (response) => { latepoint_add_notification(response.message); } }); } function latepoint_init_side_menu(){ jQuery('.menu-toggler').on('click', function(){ var layout_style = 'full'; if(jQuery('.latepoint-side-menu-w').hasClass('side-menu-full')){ layout_style = 'compact'; jQuery('.latepoint-side-menu-w').addClass('side-menu-compact').removeClass('side-menu-full'); }else{ jQuery('.latepoint-side-menu-w').addClass('side-menu-full').removeClass('side-menu-compact'); } var route_name = jQuery(this).data('route'); var data = { action: latepoint_helper.route_action, route_name: route_name, params: { menu_layout_style: layout_style }, layout: 'none', return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(data){ } }); return false; }); } function latepoint_init_grouped_bookings_form(){ } function latepoint_quick_order_customer_cleared(){ latepoint_init_input_masks(jQuery('.quick-order-form-w .customer-quick-edit-form-w')); } function latepoint_quick_order_customer_selected(){ latepoint_init_input_masks(jQuery('.quick-order-form-w .customer-quick-edit-form-w')); jQuery('.customer-info-w').removeClass('selecting').addClass('selected'); } function latepoint_custom_day_removed($elem){ $elem.closest('.custom-day-work-period').fadeOut(300, function(){ jQuery(this).remove()}); } function latepoint_count_active_connections($connection_wrapper){ var connected_services_count = $connection_wrapper.find('.connection-children-list li.active').length; var all_services_count = $connection_wrapper.find('.connection-children-list li').length; if(connected_services_count == all_services_count){ connected_services_count = jQuery('.selected-connections').data('all-text'); jQuery('.selected-connections').removeClass('not-all-selected'); }else{ connected_services_count = connected_services_count + '/' + all_services_count; jQuery('.selected-connections').addClass('not-all-selected'); $connection_wrapper.closest('.white-box').find('.os-select-all-toggler').prop('checked', false); } $connection_wrapper.find('.selected-connections strong').text(connected_services_count); } function latepoint_custom_field_removed($elem){ $elem.closest('.os-form-block').remove(); } function latepoint_coupon_removed($elem){ $elem.closest('.os-coupon-form').remove(); } function latepoint_reminder_removed($elem){ $elem.closest('.os-reminder-form').remove(); } function latepoint_init_form_blocks(){ jQuery('.latepoint-content-w').on('click', '.os-form-block-header', function(){ jQuery(this).closest('.os-form-block').toggleClass('os-is-editing'); return false; }); jQuery('.latepoint-content-w').on('keyup', '.os-form-block-name-input', function(){ jQuery(this).closest('.os-form-block').find('.os-form-block-name').text(jQuery(this).val()); }); } function latepoint_init_coupons_form(){ jQuery('.latepoint-content-w').on('click', '.os-coupon-form-info', function(){ jQuery(this).closest('.os-coupon-form').toggleClass('os-is-editing'); return false; }); jQuery('.latepoint-content-w').on('change', 'select.os-coupon-medium-select', function(){ if(jQuery(this).val() == 'email'){ jQuery(this).closest('.os-coupon-form').find('.os-coupon-email-subject').show(); }else{ jQuery(this).closest('.os-coupon-form').find('.os-coupon-email-subject').hide(); } }); jQuery('.latepoint-content-w').on('keyup', '.os-coupon-name-input', function(){ jQuery(this).closest('.os-coupon-form').find('.os-coupon-name').text(jQuery(this).val()); }); jQuery('.latepoint-content-w').on('keyup', '.os-coupon-code-input', function(){ jQuery(this).closest('.os-coupon-form').find('.os-coupon-code').text(jQuery(this).val()); }); } function latepoint_init_reminders_form(){ jQuery('.latepoint-content-w').on('click', '.os-reminder-form-info', function(){ jQuery(this).closest('.os-reminder-form').toggleClass('os-is-editing'); return false; }); jQuery('.latepoint-content-w').on('change', 'select.os-reminder-medium-select', function(){ if(jQuery(this).val() == 'email'){ jQuery(this).closest('.os-reminder-form').find('.os-reminder-email-subject').show(); }else{ jQuery(this).closest('.os-reminder-form').find('.os-reminder-email-subject').hide(); } }); jQuery('.latepoint-content-w').on('keyup', '.os-reminder-name-input', function(){ jQuery(this).closest('.os-reminder-form').find('.os-reminder-name').text(jQuery(this).val()); }); } function latepoint_custom_field_saved($elem){ } function latepoint_init_custom_day_schedule(){ latepoint_init_input_masks(jQuery('.latepoint-lightbox-w .custom-day-schedule-w')); jQuery('.period-type-selector').on('change', function(){ jQuery(this).closest('.custom-day-calendar').attr('data-period-type', jQuery(this).val()); jQuery('.custom-day-calendar').attr('data-picking', 'start').data('picking', 'start'); if(jQuery(this).val() == 'range'){ jQuery('.custom-day-calendar-head .calendar-heading').text(jQuery('.custom-day-calendar-head .calendar-heading').data('label-start')); jQuery('.custom-day-calendar #start_custom_date').trigger('focus'); }else{ jQuery('.custom-day-calendar .os-day.selected').removeClass('selected'); jQuery('.latepoint-lightbox-footer').hide(); jQuery('.custom-day-calendar-head .calendar-heading').text(jQuery('.custom-day-calendar-head .calendar-heading').data('label-single')); } }); jQuery('#custom_day_calendar_month, #custom_day_calendar_year').on('change', function(){ var $calendar = jQuery('.custom-day-calendar-month'); var route_name = $calendar.data('route'); $calendar.addClass('os-loading'); var target_date_string = jQuery('#custom_day_calendar_year').val() + '-' + jQuery('#custom_day_calendar_month').val() + '-01'; var data = { action: latepoint_helper.route_action, route_name: route_name, params: { target_date_string: target_date_string }, layout: 'none', return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(data){ $calendar.removeClass('os-loading'); if(data.status === "success"){ $calendar.html(data.message); }else{ // console.log(data.message); } } }); }); jQuery('.custom-day-calendar').on('focus', '#start_custom_date', function(){ jQuery('.custom-day-calendar-head .calendar-heading').text(jQuery('.custom-day-calendar-head .calendar-heading').data('label-start')); jQuery('.custom-day-calendar').attr('data-picking', 'start').data('picking', 'start'); }); jQuery('.custom-day-calendar').on('focus', '#end_custom_date', function(){ jQuery('.custom-day-calendar-head .calendar-heading').text(jQuery('.custom-day-calendar-head .calendar-heading').data('label-end')); jQuery('.custom-day-calendar').attr('data-picking', 'end').data('picking', 'end'); }); jQuery('.custom-day-calendar').on('click', '.os-day', function(){ var $this = jQuery(this); $this.closest('.custom-day-calendar').find('.os-day.selected').removeClass('selected'); $this.addClass('selected'); if(jQuery('.custom-day-calendar').data('picking') == 'start'){ jQuery('.custom-day-settings-w #start_custom_date').val($this.data('date')).trigger('keyup'); if(jQuery('.period-type-selector').val() == 'range'){ jQuery('.custom-day-calendar #end_custom_date').trigger('focus'); if(!jQuery('.custom-day-calendar #end_custom_date').val()) return false; } }else{ jQuery('.custom-day-settings-w #end_custom_date').val($this.data('date')).trigger('keyup'); } jQuery('.latepoint-lightbox-footer').slideDown(200); if(jQuery('.custom-day-calendar').data('show-schedule') == 'yes') jQuery('.latepoint-lightbox-w').removeClass('hide-schedule'); return false; }); } function latepoint_init_updates_page(){ } function latepoint_calendar_set_month_label(){ jQuery('.os-current-month-label .current-month').text(jQuery('.os-monthly-calendar-days-w.active').data('calendar-month-label')); jQuery('.os-current-month-label .current-year').text(jQuery('.os-monthly-calendar-days-w.active').data('calendar-year')); } function latepoint_init_element_togglers(){ jQuery('[data-toggle-element]').on('click', function(){ var $this = jQuery(this); $this.closest('.os-form-checkbox-group').toggleClass('is-checked'); jQuery($this.data('toggle-element')).toggle(); }); } function latepoint_init_color_picker(){ if(jQuery('.latepoint-color-picker').length){ jQuery('.latepoint-color-picker').each(function(){ var color = jQuery(this).data('color'); var picker = jQuery(this)[0]; var $picker_wrapper = jQuery(this).closest('.latepoint-color-picker-w'); Pickr.create({ el: picker, default: color, comparison: false, useAsButton: true, components: { // Main components preview: false, opacity: false, hue: true, // Input / output Options interaction: { input: false, clear: false, save: true } }, onChange(hsva, instance) { $picker_wrapper.find('.os-form-control').val(hsva.toHEX().toString()); }, }); }); } } function latepoint_lightbox_close(){ jQuery('body').removeClass('latepoint-lightbox-active'); jQuery('.latepoint-lightbox-w').remove(); } function latepoint_reload_select_service_categories(){ jQuery('.service-selector-adder-field-w').each(function(){ var $trigger_elem = jQuery(this); var route = jQuery('.service-selector-adder-field-w').find('select').data('select-source'); var data = { action: latepoint_helper.route_action, route_name: route, params: '', return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $trigger_elem.removeClass('os-loading'); if(response.status === "success"){ latepoint_lightbox_close(); $trigger_elem.find('select').html(response.message); $trigger_elem.find('select option:last').attr('selected', 'selected'); }else{ alert(response.message, 'error'); } } }); }); } function latepoint_wizard_item_editing_cancelled(response){ jQuery('.os-wizard-setup-w').removeClass('is-sub-editing'); jQuery('.os-wizard-footer').show(); jQuery('.os-wizard-footer .os-wizard-next-btn').show(); if(response.show_prev_btn){ jQuery('.os-wizard-footer .os-wizard-prev-btn').show(); } } function latepoint_reload_week_view_calendar(start_date = false){ var service_id = (jQuery('.cc-availability-toggler #overlay_service_availability').val() == 'on') ? jQuery('.calendar-service-selector').val() : false; var agent_id = jQuery('.calendar-agent-selector').val(); var location_id = jQuery('.calendar-location-selector').val(); var calendar_start_date = (start_date) ? start_date : jQuery('.calendar-start-date').val(); latepoint_load_calendar(calendar_start_date, agent_id, location_id, service_id); } function latepoint_init_work_period_form(){ latepoint_mask_timefield(jQuery('.os-time-input-w .os-mask-time')); } function latepoint_close_side_panel(){ latepoint_close_quick_availability_form(); jQuery('.latepoint-side-panel-w').remove(); } function reload_process_jobs_table(){ if(jQuery('table.os-reload-on-booking-update').length) latepoint_filter_table(jQuery('table.os-reload-on-booking-update'), jQuery('table.os-reload-on-booking-update')); } function latepoint_transaction_removed($trigger){ $trigger.closest('.quick-add-transaction-box-w').remove(); latepoint_reload_balance_and_payments(); } function latepoint_reload_widget($widget_elem){ var form_data = $widget_elem.find('select, input').serialize(); var data = { action: latepoint_helper.route_action, route_name: $widget_elem.data('os-reload-action'), params: form_data, return_format: 'json' } $widget_elem.addClass('os-loading'); jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $widget_elem.removeClass('os-loading'); if(response.status === "success"){ var $updated_widget_elem = jQuery(response.message); $updated_widget_elem.removeClass('os-widget-animated'); $widget_elem = $widget_elem.replaceWith($updated_widget_elem); latepoint_init_daterangepicker($updated_widget_elem.find('.os-date-range-picker')); if($widget_elem.hasClass('os-widget-top-agents')) latepoint_init_circles_charts(); if($widget_elem.hasClass('os-widget-daily-bookings')){ latepoint_init_daily_bookings_chart(); latepoint_init_donut_charts(); } }else{ alert(response.message); } } }); } function latepoint_load_calendar(target_date, agent_id, location_id = false, service_id = false){ var route_name = jQuery('.calendar-week-agent-w').data('calendar-action'); jQuery('.calendar-week-agent-w').addClass('os-loading'); var params_arr = {target_date: target_date, agent_id: agent_id}; if(location_id) params_arr.location_id = location_id; if(service_id) params_arr.service_id = service_id; var data = { action: latepoint_helper.route_action, route_name: route_name, params: jQuery.param(params_arr), return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ if(response.status === "success"){ jQuery('.calendar-week-agent-w').html(response.message).removeClass('os-loading'); jQuery('.calendar-load-target-date.os-loading').removeClass('os-loading'); }else{ alert(response.message); } } }); } function latepoint_init_quick_transaction_form(){ latepoint_mask_money(jQuery('.quick-add-transaction-box-w .os-mask-money')); } function latepoint_reload_price_breakdown(){ var $trigger = jQuery('.reload-price-breakdown'); $trigger.addClass('os-loading'); var $quick_edit_form = $trigger.closest('form.order-quick-edit-form'); var form_data = new FormData($quick_edit_form[0]); var route = $trigger.data('route'); var data = { action: latepoint_helper.route_action, route_name: route, params: latepoint_formdata_to_url_encoded_string(form_data), return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $trigger.removeClass('os-loading'); if(response.status === "success"){ jQuery('.price-breakdown-wrapper').html(response.message); latepoint_mask_money(jQuery('.price-breakdown-wrapper .os-mask-money')); latepoint_reload_balance_and_payments(); }else{ alert(response.message); } } }); } function latepoint_complex_selector_select($connection_wrappers, qty = 1){ $connection_wrappers.each(function(){ jQuery(this).addClass('active'); jQuery(this).find('.connection-children-list li').addClass('active'); jQuery(this).find('.connection-child-is-connected').val('yes'); jQuery(this).find('.item-quantity-selector-input').val(qty); latepoint_count_active_connections(jQuery(this)); }); } function latepoint_complex_selector_deselect($connection_wrappers){ $connection_wrappers.each(function(){ jQuery(this).removeClass('active'); jQuery(this).removeClass('show-customize-box'); jQuery(this).find('.connection-children-list li.active').removeClass('active'); jQuery(this).find('.connection-child-is-connected').val('no'); jQuery(this).find('.item-quantity-selector-input').val(0); latepoint_count_active_connections(jQuery(this)); }); } function latepoint_is_next_day($form){ let field_base_name = 'order_items[' + $form.data('order-item-id') +'][bookings][' + $form.data('booking-id') +']'; var start_time = $form.find('input[name="' + field_base_name + '[start_time][formatted_value]"]').val(); var start_time_ampm = $form.find('input[name="' + field_base_name + '[start_time][ampm]"]').val(); var start_time_minutes = latepoint_hours_and_minutes_to_minutes(start_time, start_time_ampm); var end_time = $form.find('input[name="' + field_base_name + '[end_time][formatted_value]"]').val(); var end_time_ampm = $form.find('input[name="' + field_base_name + '[end_time][ampm]"]').val(); var end_time_minutes = latepoint_hours_and_minutes_to_minutes(end_time, end_time_ampm); if(end_time_minutes && (end_time_minutes <= start_time_minutes)){ $form.find('.quick-end-time-w').addClass('ending-next-day'); }else{ $form.find('.quick-end-time-w').removeClass('ending-next-day'); } } function latepoint_set_booking_end_time($booking_data_form){ var booking_duration = 0; var service_duration = Number($booking_data_form.find('.os-service-durations select').val()); let field_base_name = 'order_items[' + $booking_data_form.data('order-item-id') +'][bookings][' + $booking_data_form.data('booking-id') +']'; booking_duration = booking_duration + service_duration; if($booking_data_form.find('select[name="temp_service_extras_ids"] option:selected').length){ $booking_data_form.find('select[name="temp_service_extras_ids"] option:selected').each(function(){ var extra_duration = Number(jQuery(this).data('duration')); var $extra_quantity_input = jQuery(this).closest('.lateselect-w').find('.ls-item[data-value="' + jQuery(this).val() + '"]').find('.os-late-quantity-selector-input'); if($extra_quantity_input.length) extra_duration = Number(extra_duration) * Number($extra_quantity_input.val()); booking_duration = Number(booking_duration) + Number(extra_duration); }); } var start_time = $booking_data_form.find('input[name="'+field_base_name+'[start_time][formatted_value]"]').val(); if(start_time){ var start_time_ampm = $booking_data_form.find('input[name="'+field_base_name+'[start_time][ampm]"]').val(); var start_time_minutes = latepoint_hours_and_minutes_to_minutes(start_time, start_time_ampm); var end_time_minutes = parseInt(start_time_minutes) + parseInt(booking_duration); if(end_time_minutes >= (24 * 60)) end_time_minutes = (end_time_minutes - 24 * 60); var end_time_ampm = (end_time_minutes >= 720 && end_time_minutes < (24 * 60)) ? 'pm' : 'am'; var end_hours_and_minutes = latepoint_minutes_to_hours_and_minutes(end_time_minutes); $booking_data_form.find('input[name="'+field_base_name+'[end_time][formatted_value]"]').val(end_hours_and_minutes); $booking_data_form.find('.quick-end-time-w .time-ampm-select.time-' + end_time_ampm).trigger('click'); $booking_data_form.find('input[name="'+field_base_name+'[end_time][formatted_value]"]').closest('.os-form-group').addClass('has-value'); } latepoint_is_next_day($booking_data_form); } function latepoint_init_sortable_columns(){ jQuery('.os-sortable-column').on('click', function(){ let current_direction = jQuery(this).hasClass('ordered-desc') ? 'desc' : 'asc'; let new_direction = (current_direction == 'desc') ? 'asc' : 'desc'; jQuery(this).closest('table').find('.os-sortable-column').removeClass('ordered-desc').removeClass('ordered-asc'); jQuery(this).addClass('ordered-' + new_direction); jQuery(this).closest('table').find('.records-ordered-by-key').val(jQuery(this).data('order-key')); jQuery(this).closest('table').find('.records-ordered-by-direction').val(new_direction); latepoint_filter_table(jQuery(this).closest('table'), jQuery(this).closest('.os-form-group')); return false; }); } function latepoint_random_text(length){ var result = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var charactersLength = characters.length; for ( var i = 0; i < length; i++ ) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } function latepoint_get_order_for_service_categories(){ } function latepoint_init_daterangepicker($elem){ $elem.each(function(){ // DATERANGEPICKER var picker_start_time = jQuery(this).find('input[name="date_from"], .os-datepicker-date-from').val(); var picker_end_time = jQuery(this).find('input[name="date_to"], .os-datepicker-date-to').val(); var locale = {}; if(jQuery(this).data('can-be-cleared')) locale = { cancelLabel: jQuery(this).data('clear-btn-label')}; moment.locale(latepoint_helper.wp_locale); jQuery(this).daterangepicker({ opens: 'center', singleDatePicker: (jQuery(this).data('single-date') == 'yes'), startDate: (picker_start_time) ? moment(picker_start_time) : moment(), endDate: (picker_end_time) ? moment(picker_end_time) : moment(), locale: locale }); }); $elem.on('cancel.daterangepicker', function(ev, picker) { if(picker.element.data('can-be-cleared')){ picker.element.find('input[name="date_from"], .os-datepicker-date-from').val(''); picker.element.find('input[name="date_to"], .os-datepicker-date-to').val(''); picker.element.find('span.range-picker-value').text(picker.element.data('no-value-label')); if(picker.element.hasClass('os-table-filter-datepicker')){ latepoint_filter_table(picker.element.closest('table'), picker.element.closest('.os-form-group')); } } }); $elem.on('apply.daterangepicker', function(ev, picker) { if(picker.element.data('single-date') == 'yes'){ picker.element.find('.range-picker-value').text(picker.startDate.format('ll')); }else{ picker.element.find('.range-picker-value').text(picker.startDate.format('ll') + ' - ' + picker.endDate.format('ll')); } picker.element.find('input[name="date_from"], .os-datepicker-date-from').attr('value', picker.startDate.format('YYYY-MM-DD')); picker.element.find('input[name="date_to"], .os-datepicker-date-to').attr('value', picker.endDate.format('YYYY-MM-DD')); if(picker.element.closest('.os-widget').length){ latepoint_reload_widget(picker.element.closest('.os-widget')); } if(picker.element.hasClass('os-table-filter-datepicker')){ latepoint_filter_table(picker.element.closest('table'), picker.element.closest('.os-form-group')); } }); } function latepoint_recalculate_items_count_in_category(){ jQuery('.os-category-items-count').each(function(){ var number_of_items = jQuery(this).closest('.os-category-parent-w').find('.item-in-category-w').length; jQuery(this).find('span').text(number_of_items); }); } function latepoint_remove_agent_box($remove_btn){ var $agent_box = $remove_btn.closest('.agent-box-w'); $agent_box.fadeOut(300, function(){ jQuery(this).remove(); }); } function latepoint_remove_service_box($remove_btn){ var $service_box = $remove_btn.closest('.service-box-w'); $service_box.fadeOut(300, function(){ jQuery(this).remove(); }); } function latepoint_init_monthly_view(){ if(!jQuery('.calendar-month-agents-w').length) return; jQuery('.monthly-calendar-headers select').on('change', function(){ var $calendar = jQuery('.calendar-month-agents-w'); var route_name = $calendar.data('route'); $calendar.addClass('os-loading'); var params = { month: jQuery('#monthly_calendar_month_select').val(), year: jQuery('#monthly_calendar_year_select').val() }; if(jQuery('#monthly_calendar_location_select').length && jQuery('#monthly_calendar_location_select').val()) params.location_id = jQuery('#monthly_calendar_location_select').val(); if(jQuery('#monthly_calendar_service_select').length && jQuery('#monthly_calendar_service_select').val()) params.service_id = jQuery('#monthly_calendar_service_select').val(); var data = { action: latepoint_helper.route_action, route_name: route_name, params: params, layout: 'none', return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(data){ $calendar.removeClass('os-loading'); if(data.status === "success"){ $calendar.html(data.message); }else{ // console.log(data.message); } } }); }); } function latepoint_init_copy_on_click_elements(){ jQuery('.os-click-to-copy').on('mouseenter', function() { var $this = jQuery(this); var position_info = $this.offset(); var width = jQuery(this).outerWidth(); var position_left = position_info.left; var position_top = position_info.top - 20 - jQuery(window).scrollTop(); let color = ($this.data('copy-tooltip-color') == 'dark') ? 'dark' : 'light'; if($this.data('copy-tooltip-position') == 'left'){ position_left = position_left - width - 5; position_top = position_top + $this.outerHeight() - jQuery(window).scrollTop(); } jQuery('body').append('<div class="os-click-to-copy-prompt color-'+color+'" style="top: '+position_top+'px; left: '+position_left+'px;">' + latepoint_helper.click_to_copy_prompt + '</div>'); }).on('mouseleave', function() { jQuery('body').find('.os-click-to-copy-prompt').remove(); }); jQuery('.os-click-to-copy').on('click', function(){ var $this = jQuery(this); let color = ($this.data('copy-tooltip-color') == 'dark') ? 'dark' : 'light'; jQuery('body').find('.os-click-to-copy-prompt').hide(); var text_to_copy = $this.is('input') ? $this.val() : $this.text(); navigator.clipboard.writeText(text_to_copy); var position_info = $this.offset(); var width = $this.outerWidth(); var position_left = position_info.left; var position_top = position_info.top - 20 - jQuery(window).scrollTop(); if($this.data('copy-tooltip-position') == 'left'){ position_left = position_left - width - 5; position_top = position_top + $this.outerHeight() - jQuery(window).scrollTop(); } var $done_prompt = jQuery('<div class="os-click-to-copy-done color-'+color+'" style="top: '+position_top+'px; left: '+position_left+'px;">' + latepoint_helper.click_to_copy_done + '</div>'); $done_prompt.appendTo(jQuery('body')).animate({ opacity: 0, left: (position_left + 20), }, 600); setTimeout(function(){ jQuery('body').find('.os-click-to-copy-done').remove(); jQuery('body').find('.os-click-to-copy-prompt').show(); }, 800); }); } function latepoint_remove_floating_popup(){ jQuery('.os-showing-popup').removeClass('os-showing-popup'); jQuery('.os-floating-popup').remove(); } function latepoint_init_clickable_cells(){ jQuery('.os-clickable-popup-trigger').on('click', function(){ var $this = jQuery(this); var position = $this.offset(); var width = $this.outerWidth(); var $popup = jQuery('<div class="os-floating-popup os-loading"></div>'); if($this.hasClass('os-showing-popup')){ latepoint_remove_floating_popup(); }else{ latepoint_remove_floating_popup(); $popup.offset({top: position.top, left: (position.left + width/2)}); jQuery('body').append($popup); $this.addClass('os-showing-popup'); var route = $this.data('route'); var params = $this.data('os-params'); var data = { action: latepoint_helper.route_action, route_name: route, params: params, layout: 'none', return_format: 'json' }; jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ if(response.status === latepoint_helper.response_status.success){ jQuery('body').find('.os-floating-popup').html(response.message).removeClass('os-loading'); latepoint_init_customer_donut_chart(); jQuery('.os-floating-popup .os-floating-popup-close').on('click', function(){ latepoint_remove_floating_popup(); return false; }); }else{ } } }); } return false; }); } function latepoint_init_tiny_mce(element_id){ // TODO CHECK IF wp.editor is defined if(typeof wp !== 'undefined' && typeof wp.editor !== 'undefined' && jQuery('#'+ element_id).length){ wp.editor.remove(element_id); wp.editor.initialize(element_id, { tinymce: { wpautop: false, toolbar1: 'formatselect alignjustify forecolor | bold italic underline strikethrough | bullist numlist | blockquote hr | alignleft aligncenter alignright | link unlink | pastetext removeformat | outdent indent | undo redo', height : "480", }, quicktags: true, mediaButtons: true, } ); } } function latepoint_init_reminder_form(){ latepoint_init_tiny_mce(jQuery('.os-reminder-form:last-child textarea').attr('id')); } function latepoint_filter_table($table, $filter_elem, reset_page = true){ $filter_elem.addClass('os-loading'); var filter_params = $table.find('.os-table-filter').serialize(); var $table_w = $table.closest('.table-with-pagination-w'); if(reset_page){ $table_w.find('select.pagination-page-select').val(1); }else{ filter_params+= '&page_number='+$table_w.find('select.pagination-page-select').val(); } var route = $table.data('route'); var data = { action: latepoint_helper.route_action, route_name: route, params: filter_params, layout: 'none', return_format: 'json' }; jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(data){ $filter_elem.removeClass('os-loading'); if(data.status === "success"){ $table.find('tbody').html(data.message); if(data.total_pages && reset_page){ var options = ''; for(var i = 1; i <= data.total_pages; i++){ options+= '<option>'+ i +'</option>'; } $table_w.find('select.pagination-page-select').html(options); } $table_w.find('.os-pagination-from').text(data.showing_from); $table_w.find('.os-pagination-to').text(data.showing_to); $table_w.find('.os-pagination-total').text(data.total_records); latepoint_init_clickable_cells(); }else{ // console.log(data.message); } } }); } function latepoint_init_service_duration_box($duration_box){ latepoint_init_input_masks(jQuery('.service-duration-box:last-child')); } function latepoint_init_wizard_content(){ latepoint_init_input_masks(jQuery('.os-wizard-step-content')); } function latepoint_init_input_masks($scoped_element = false){ let $wrapper = $scoped_element ? $scoped_element : jQuery('body'); latepoint_mask_timefield($wrapper.find('.os-mask-time')); $wrapper.find('.os-mask-phone').each(function(){ latepoint_mask_phone(jQuery(this)); }); latepoint_mask_money($wrapper.find('.os-mask-money')); latepoint_mask_date($wrapper.find('.os-mask-date')); latepoint_mask_minutes($wrapper.find('.os-mask-minutes')); $wrapper.trigger('latepoint:initInputMasks'); } function latepoint_init_quick_agent_form(){ let $agent_form_wrapper = jQuery('.quick-agent-form-w'); latepoint_init_input_masks($agent_form_wrapper); $agent_form_wrapper.find('.agent-quick-edit-form').on('submit', function(e){ if(jQuery(this).find('button[type="submit"]').hasClass('os-loading')) return false; e.preventDefault(); latepoint_submit_quick_agent_form(); }); $agent_form_wrapper.find('.quick-agent-form-view-log-btn').on('click', function(){ let $trigger_elem = jQuery(this); $trigger_elem.addClass('os-loading'); let route = $trigger_elem.data('route'); let data = { action: 'latepoint_route_call', route_name: route, params: {agent_id: $trigger_elem.data('agent-id')}, return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $trigger_elem.removeClass('os-loading'); if(response.status === "success"){ latepoint_display_in_side_sub_panel(response.message); jQuery('body').addClass('has-side-sub-panel'); }else{ alert(response.message, 'error'); } } }); return false; }); } /* * Copyright (c) 2024 LatePoint LLC. All rights reserved. */ function latepoint_init_quick_customer_form(){ let $customer_form_wrapper = jQuery('.quick-customer-form-w'); latepoint_init_input_masks($customer_form_wrapper); $customer_form_wrapper.find('.customer-quick-edit-form').on('submit', function(e){ if(jQuery(this).find('button[type="submit"]').hasClass('os-loading')) return false; e.preventDefault(); latepoint_submit_quick_customer_form(); }); $customer_form_wrapper.find('.quick-customer-form-view-log-btn').on('click', function(){ var $trigger_elem = jQuery(this); $trigger_elem.addClass('os-loading'); var route = $trigger_elem.data('route'); var data = { action: 'latepoint_route_call', route_name: route, params: {customer_id: $trigger_elem.data('customer-id')}, return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $trigger_elem.removeClass('os-loading'); if(response.status === "success"){ latepoint_display_in_side_sub_panel(response.message); jQuery('body').addClass('has-side-sub-panel'); }else{ alert(response.message, 'error'); } } }); return false; }); } function latepoint_submit_quick_customer_form(){ let $quick_edit_form = jQuery('form.customer-quick-edit-form'); let errors = latepoint_validate_form($quick_edit_form); if(errors.length){ let error_messages = errors.map(error => error.message ).join(', '); latepoint_add_notification(error_messages, 'error'); return false; } $quick_edit_form.find('button[type="submit"]').addClass('os-loading'); jQuery.ajax({ type: "post", dataType: "json", processData: false, contentType: false, url: latepoint_timestamped_ajaxurl(), data: latepoint_create_form_data($quick_edit_form), success: function (response) { $quick_edit_form.find('button[type="submit"]').removeClass('os-loading'); if(response.form_values_to_update){ jQuery.each(response.form_values_to_update, function(name, value){ $quick_edit_form.find('[name="'+ name +'"]').val(value); }); } if (response.status === "success") { latepoint_add_notification(response.message); latepoint_reload_after_customer_save(); }else{ latepoint_add_notification(response.message, 'error'); } } }); } function latepoint_reload_after_customer_save(){ latepoint_reload_calendar_view(); jQuery('.os-widget').each(function(){ latepoint_reload_widget(jQuery(this)); }); if(jQuery('table.os-reload-on-booking-update').length) latepoint_filter_table(jQuery('table.os-reload-on-booking-update'), jQuery('table.os-reload-on-booking-update')); latepoint_close_side_panel(); } function latepoint_init_customers_import() { jQuery('body.latepoint').on('submit', '.import-customers-form', async function (e) { e.preventDefault(); let $form = jQuery(this); if($form.hasClass('os-loading')) return false; $form.addClass('os-loading'); $form.find('button[type="submit"]').addClass('os-loading'); try { let response = await jQuery.ajax({ type: "post", dataType: "json", processData: false, contentType: false, url: latepoint_timestamped_ajaxurl(), data: latepoint_create_form_data($form) }); $form.removeClass('os-loading').find('.os-loading').removeClass('os-loading'); if (response.status === 'success') { $form.find('.latepoint-lightbox-content').html(response.message); latepoint_import_customers_set_next_btn($form); latepoint_import_customers_set_step($form); } else { latepoint_add_notification(response.message || 'Error', 'error'); return false; } } catch (e) { $form.removeClass('os-loading').find('.os-loading').removeClass('os-loading'); console.log(e); } }); } function latepoint_import_customers_set_next_btn($form) { let step_form = $form.find('.customer-csv-step'); if (step_form.data('hide-next-btn')) { $form.find('.latepoint-lightbox-footer').hide(); } else { let btn_label = step_form.data('customer-csv-next-btn'); if (btn_label) { $form.find('.latepoint-csv-next-btn').text(btn_label); } } } function latepoint_import_customers_set_step($form) { let step = $form.find('.customer-csv-step').data('customer-csv-step'); if (step) { $form.find('input[name="step"]').val(step); } } /* * Copyright (c) 2023 LatePoint LLC. All rights reserved. */ function latepoint_init_daily_bookings_chart() { if (typeof Chart === 'undefined' || !jQuery('#chartDailyBookings').length) return let $dailyBookingsChart = jQuery('#chartDailyBookings'); let dailyBookingsLabels = $dailyBookingsChart.data('chart-labels').toString().split(','); let dailyBookingsValues = $dailyBookingsChart.data('chart-values').toString().split(',').map(Number); let dailyBookingsChartMax = Math.max.apply(Math, dailyBookingsValues); // calculate max Y to have space for a tooltip let canvasHeight = 200 let spaceForTooltip = 160 let maxValue = dailyBookingsChartMax + spaceForTooltip * dailyBookingsChartMax / canvasHeight + 1 var fontFamily = latepoint_helper.body_font_family; Chart.Tooltip.positioners.top = function (items) { const pos = Chart.Tooltip.positioners.average(items); // Happens when nothing is found if (pos === false) { return false; } const chart = this.chart; return { x: pos.x, y: chart.chartArea.top, xAlign: 'center', yAlign: 'bottom', }; }; Chart.defaults.defaultFontFamily = fontFamily; Chart.defaults.defaultFontSize = 18; Chart.defaults.defaultFontStyle = '400'; Chart.defaults.plugins.tooltip.titleFont = { family: fontFamily, size: 14, color: 'rgba(255,255,255,0.6)', style: 'normal', weight: 400 } Chart.defaults.plugins.tooltip.titleFont = {family: fontFamily, size: 14, weight: 400}; Chart.defaults.plugins.tooltip.titleColor = 'rgba(255,255,255,0.6)'; Chart.defaults.plugins.tooltip.backgroundColor = '#000'; Chart.defaults.plugins.tooltip.titleMarginBottom = 5; Chart.defaults.plugins.tooltip.bodyFont = {family: fontFamily, size: 24, weight: 700, lineHeight: 0.8}; Chart.defaults.plugins.tooltip.displayColors = false; Chart.defaults.plugins.tooltip.padding = 10; Chart.defaults.plugins.tooltip.yAlign = 'bottom'; Chart.defaults.plugins.tooltip.xAlign = 'center'; Chart.defaults.plugins.tooltip.cornerRadius = 14; Chart.defaults.plugins.tooltip.caretSize = 5; Chart.defaults.plugins.tooltip.position = 'top'; var ctx = $dailyBookingsChart[0].getContext("2d"); var gradientStroke = ctx.createLinearGradient(500, 0, 100, 0); gradientStroke.addColorStop(0, '#219ff8'); gradientStroke.addColorStop(1, '#219ff8'); let gradientFill = ctx.createLinearGradient(0, 0, 0, 140); gradientFill.addColorStop(0, 'rgba(195, 229, 253, 0.9)'); gradientFill.addColorStop(1, 'rgba(195, 229, 253, 0.1)'); // line chart data var chartDailyBookingsData = { labels: dailyBookingsLabels, datasets: [{ backgroundColor: gradientFill, borderColor: gradientStroke, label: "", fill: true, lineTension: 0.3, borderWidth: 2, borderCapStyle: 'butt', borderDash: [], borderDashOffset: 0.0, borderJoinStyle: 'miter', pointBorderColor: "#fff", pointBackgroundColor: "#219ff8", pointRadius: 3, pointBorderWidth: 2, pointHoverRadius: 6, pointHoverBorderWidth: 4, pointHoverBackgroundColor: "#219ff8", pointHoverBorderColor: "#fff", pointHitRadius: 20, spanGaps: false, data: dailyBookingsValues, }] }; let options = { animation: false, layout: { padding: { top: 0 } }, interaction: { mode: 'index', intersect: false, }, maintainAspectRatio: false, plugins: { verticalLiner: {}, legend: { display: false }, }, scales: { x: { display: true, ticks: { fontFamily: fontFamily, maxRotation: 0, color: '#788291', font: { size: 10, family: fontFamily }, callback: function (value, index, ticks) { if(ticks.length){ return ((index + 2) % Math.round(ticks.length/8)) ? '' : this.getLabelForValue(value) }else{ return this.getLabelForValue(value) } } }, grid: { borderDash: [1, 5], color: 'rgba(0,0,0,0.35)', zeroLineColor: 'rgba(0,0,0,0.15)', }, }, y: { max: maxValue, grid: { color: 'rgba(0,0,0,0.05)', zeroLineColor: 'rgba(0,0,0,0.05)', }, display: false, ticks: { beginAtZero: true, fontSize: '10', fontColor: '#000' } } } } const plugin = { id: 'verticalLiner', afterInit: (chart, args, opts) => { chart.verticalLiner = {} }, afterEvent: (chart, args, options) => { const {inChartArea} = args chart.verticalLiner = {draw: inChartArea} }, beforeTooltipDraw: (chart, args, options) => { const {draw} = chart.verticalLiner if (!draw) return const {ctx} = chart const {top, bottom} = chart.chartArea const {tooltip} = args const x = tooltip.caretX if (!x) return ctx.save() ctx.beginPath() ctx.moveTo(x, top) ctx.lineTo(x, bottom) ctx.stroke() ctx.restore() } } // line chart init let chartDailyBookings = new Chart($dailyBookingsChart, { type: 'line', data: chartDailyBookingsData, options: options, plugins: [plugin], }); } function latepoint_init_customer_donut_chart() { if (typeof Chart !== 'undefined' && jQuery('.os-customer-donut-chart').length) { var fontFamily = latepoint_helper.body_font_family; // set defaults Chart.defaults.defaultFontFamily = fontFamily; Chart.defaults.defaultFontSize = 16; Chart.defaults.defaultFontStyle = '400'; Chart.defaults.plugins.tooltip.titleFont = {family: fontFamily, size: 14, weight: 400}; Chart.defaults.plugins.tooltip.titleColor = 'rgba(255,255,255,0.6)'; Chart.defaults.plugins.tooltip.backgroundColor = '#000'; Chart.defaults.plugins.tooltip.titleMarginBottom = 1; Chart.defaults.plugins.tooltip.bodyFont = {family: fontFamily, size: 18, weight: 500}; Chart.defaults.plugins.tooltip.displayColors = false; Chart.defaults.plugins.tooltip.padding = 5; Chart.defaults.plugins.tooltip.yAlign = 'bottom'; Chart.defaults.plugins.tooltip.xAlign = 'center'; Chart.defaults.plugins.tooltip.cornerRadius = 4; Chart.defaults.plugins.tooltip.intersect = false; jQuery('.os-customer-donut-chart').each(function (index) { var chart_colors = jQuery(this).data('chart-colors').toString().split(','); var chart_labels = jQuery(this).data('chart-labels').toString().split(','); var chart_values = jQuery(this).data('chart-values').toString().split(',').map(Number); var $chart_canvas = jQuery(this); var chartDonut = new Chart($chart_canvas, { type: 'doughnut', data: { labels: chart_labels, datasets: [{ data: chart_values, backgroundColor: chart_colors, hoverBackgroundColor: chart_colors, borderWidth: 0, hoverBorderColor: 'transparent' }] }, options: { layout: { padding: { top: 10, bottom: 10, left: 10, right: 10 } }, plugins: { legend: { display: false }, tooltip: { callbacks: { title: function (tooltipItem) { return tooltipItem[0].label; }, label: function (tooltipItem) { return tooltipItem.parsed; }, } }, }, animation: { animateRotate: false }, cutout: "90%", responsive: false, maintainAspectRatio: true, } }); }); } } function latepoint_init_donut_charts() { if (typeof Chart !== 'undefined' && jQuery('.os-donut-chart').length) { var fontFamily = latepoint_helper.body_font_family; // set defaults Chart.defaults.defaultFontFamily = fontFamily; Chart.defaults.defaultFontSize = 18; Chart.defaults.defaultFontStyle = '400'; Chart.defaults.plugins.tooltip.titleFont.family = fontFamily; Chart.defaults.plugins.tooltip.titleFont.size = 14; Chart.defaults.plugins.tooltip.titleColor = 'rgba(255,255,255,0.6)'; Chart.defaults.plugins.tooltip.backgroundColor = '#000'; Chart.defaults.plugins.tooltip.titleFont.style = '400'; Chart.defaults.plugins.tooltip.titleMarginBottom = 1; Chart.defaults.plugins.tooltip.bodyFont.family = fontFamily; Chart.defaults.plugins.tooltip.bodyFont.size = 24; Chart.defaults.plugins.tooltip.bodyFont.style = '500'; Chart.defaults.plugins.tooltip.displayColors = false; Chart.defaults.plugins.tooltip.padding.x = 10; Chart.defaults.plugins.tooltip.padding.y = 8; Chart.defaults.plugins.tooltip.yAlign = 'bottom'; Chart.defaults.plugins.tooltip.xAlign = 'center'; Chart.defaults.plugins.tooltip.cornerRadius = 8; Chart.defaults.plugins.tooltip.intersect = false; jQuery('.os-donut-chart').each(function (index) { var chart_colors = jQuery(this).data('chart-colors').toString().split(','); var chart_labels = jQuery(this).data('chart-labels').toString().split(','); var chart_values = jQuery(this).data('chart-values').toString().split(',').map(Number); var $chart_canvas = jQuery(this); var chartDonut = new Chart($chart_canvas, { type: 'doughnut', data: { labels: chart_labels, datasets: [{ data: chart_values, backgroundColor: chart_colors, hoverBackgroundColor: chart_colors, borderWidth: 0, hoverBorderColor: 'transparent' }] }, options: { layout: { padding: { top: 40 } }, plugins: { legend: { display: false }, tooltip: { callbacks: { title: function (tooltipItem, data) { return data['labels'][tooltipItem[0]['index']]; }, label: function (tooltipItem, data) { return data['datasets'][0]['data'][tooltipItem['index']]; } } } }, animation: { animateScale: true }, cutoutPercentage: 96, responsive: false, maintainAspectRatio: true, } }); }); } } function latepoint_init_circles_charts() { jQuery('.circle-chart').each(function (index) { var chart_elem_id = jQuery(this).prop('id'); var max_value = jQuery(this).data('max-value'); var chart_value = jQuery(this).data('chart-value'); var chart_color = jQuery(this).data('chart-color'); var chart_color_fade = jQuery(this).data('chart-color-fade'); var myCircle = Circles.create({ id: chart_elem_id, radius: 25, value: chart_value, maxValue: max_value, width: 2, text: function (value) { return Math.round(value); }, colors: [chart_color, chart_color_fade], duration: 200, wrpClass: 'circles-wrp', textClass: 'circles-text', valueStrokeClass: 'circles-valueStroke', maxValueStrokeClass: 'circles-maxValueStroke', styleWrapper: true, styleText: true }); }); } /* * Copyright (c) 2023 LatePoint LLC. All rights reserved. */ function latepoint_check_horizontal_calendar_scroll(){ if(jQuery('.daily-availability-calendar.horizontal-calendar').length){ if(jQuery('.daily-availability-calendar.horizontal-calendar').width() < 700){ jQuery('.daily-availability-calendar.horizontal-calendar').scrollLeft(jQuery('.os-day.selected').index() * jQuery('.os-day.selected').width()); } } } function latepoint_calendar_custom_period_created(){ latepoint_reload_calendar_view(); latepoint_lightbox_close(); } function latepoint_init_calendar_quick_actions(){ latepoint_init_input_masks(jQuery('.quick-calendar-action-settings')); jQuery('.quick-calendar-action-day-off').on('click', function(){ jQuery('.quick-calendar-actions-wrapper').addClass('showing-settings'); jQuery('.quick-calendar-actions').hide(); jQuery('.quick-calendar-action-settings').removeClass('setting-slot-off').addClass('setting-day-off'); jQuery('.quick-calendar-action-settings input[name="blocked_period_settings[full_day_off]"]').val('yes'); jQuery('.quick-calendar-action-toggle.selected').removeClass('selected'); jQuery('.quick-calendar-action-toggle[data-period-type="full"]').addClass('selected'); return false; }); jQuery('.quick-calendar-action-slot-off').on('click', function(){ jQuery('.quick-calendar-actions-wrapper').addClass('showing-settings'); jQuery('.quick-calendar-actions').hide(); jQuery('.quick-calendar-action-settings').removeClass('setting-day-off').addClass('setting-slot-off'); jQuery('.quick-calendar-action-settings input[name="blocked_period_settings[full_day_off]"]').val('no'); jQuery('.quick-calendar-action-toggle.selected').removeClass('selected'); jQuery('.quick-calendar-action-toggle[data-period-type="partial"]').addClass('selected'); return false; }); jQuery('.quick-calendar-action-toggle').on('click', function(){ if(jQuery(this).data('period-type') === 'full'){ jQuery('.quick-calendar-action-day-off').trigger('click'); }else{ jQuery('.quick-calendar-action-slot-off').trigger('click'); } return false; }); } function latepoint_init_calendars(){ latepoint_check_horizontal_calendar_scroll(); jQuery('.os-calendar-settings-extra .latecheckbox').lateCheckbox(); jQuery('.os-calendar-view-toggle').on('click', '.os-calendar-view-option', function(){ jQuery(this).closest('.os-calendar-view-toggle').find('.os-calendar-view-option.os-selected').removeClass('os-selected') jQuery(this).addClass('os-selected'); jQuery('input[name="' + jQuery(this).closest('.os-calendar-view-toggle').data('update-element-by-name') + '"]').val(jQuery(this).data('value')).trigger('change'); return false; }); jQuery('.calendar-settings-toggler').on('click', function(){ jQuery('.os-calendar-settings-form').toggleClass('show-extra-settings'); return false; }); jQuery('.os-calendar-settings-form').on('change', 'input[name="calendar_settings[view]"]', function(){ jQuery(this).closest('.calendar-wrapper').attr('data-view', jQuery(this).val()); }); jQuery('.os-calendar-settings-form').on('change', 'select, input, .latecheckbox ', function(){ latepoint_reload_calendar_view(); }); jQuery('.calendar-view-wrapper').on('click', '.weekly-calendar-agent-selector', function(){ jQuery('.weekly-calendar-agent-selector.selected').removeClass('selected'); jQuery(this).addClass('selected'); jQuery('.os-calendar-settings-form input[name="calendar_settings[selected_agent_id]"]').val(jQuery(this).data('agent-id')); jQuery('.agent-weekly-calendar.selected').removeClass('selected'); jQuery('.agent-weekly-calendar[data-agent-id="'+jQuery(this).data('agent-id')+'"]').addClass('selected'); return false; }); jQuery('.calendar-view-wrapper').on('click', '.daily-calendar-action-navigation-btn', function(){ jQuery(this).addClass('os-loading'); jQuery('input[name="calendar_settings[target_date_string]"]').val(jQuery(this).data('target-date')).trigger('change'); return false; }); jQuery('.calendar-view-wrapper').on('click', '.daily-availability-calendar .os-day', function(){ jQuery('.os-monthly-calendar-days-w .os-day.selected').removeClass('selected'); jQuery(this).addClass('selected'); jQuery('input[name="calendar_settings[target_date_string]"]').val(jQuery(this).data('date')).trigger('change'); return false; }); jQuery('.os-calendar-today-btn').on('click', function(){ jQuery(this).addClass('os-loading'); jQuery('input[name="calendar_settings[target_date_string]"]').val(jQuery(this).data('target-date')).trigger('change'); return false; }); jQuery('.os-calendar-prev-btn').on('click', function(){ jQuery(this).addClass('os-loading'); jQuery('input[name="calendar_settings[target_date_string]"]').val(jQuery('input[name="prev_target_date"]').val()).trigger('change'); return false; }); jQuery('.os-calendar-next-btn').on('click', function(){ jQuery(this).addClass('os-loading'); jQuery('input[name="calendar_settings[target_date_string]"]').val(jQuery('input[name="next_target_date"]').val()).trigger('change'); return false; }); } function latepoint_reload_calendar_view(){ let $calendar_wrapper = jQuery('.calendar-view-wrapper'); if(!$calendar_wrapper.length) return; $calendar_wrapper.addClass('os-loading'); let calendar_settings = new FormData(jQuery('form.os-calendar-settings-form')[0]); let data = new FormData(); data.append('params', latepoint_formdata_to_url_encoded_string(calendar_settings)); data.append('action', latepoint_helper.route_action); data.append('route_name', $calendar_wrapper.data('route')); data.append('return_format', 'json'); jQuery.ajax({ type: "post", dataType: "json", processData: false, contentType: false, url: latepoint_timestamped_ajaxurl(), data: data, success: function (response) { if (response.status === "success") { $calendar_wrapper.html(response.message).removeClass('os-loading'); jQuery('.os-calendar-today-btn, .os-calendar-prev-btn, .os-calendar-next-btn').removeClass('os-loading'); jQuery('.os-current-month-label .current-month').text(response.top_date_label); jQuery('.os-current-month-label .current-year').text(response.top_date_year); latepoint_check_horizontal_calendar_scroll(); } } }); } /* * Copyright (c) 2022 LatePoint LLC. All rights reserved. */ function latepoint_process_updated() { location.reload(); } function latepoint_process_action_removed($elem) { $elem.closest('.os-form-block').remove(); } function latepoint_replace_process_condition_element($trigger, params, $target, callback = null) { $trigger.closest('.sub-section-content').addClass('os-loading'); let route_name = $trigger.data('route'); let data = {action: latepoint_helper.route_action, route_name: route_name, params: params, return_format: 'json'} jQuery.ajax({ type: 'post', dataType: "json", url: latepoint_timestamped_ajaxurl(), data: data, success: (response) => { if (response.status === latepoint_helper.response_status.success) { $target.html(response.message); latepoint_init_process_conditions_form(); $trigger.closest('.sub-section-content').removeClass('os-loading'); if (typeof callback === 'function') { callback(); } } else { alert("Error!"); } } }); } function latepoint_init_process_forms() { latepoint_init_process_conditions_form(); jQuery('.os-processes-w').on('latepoint:initProcessActionForm latepoint:initProcessActionTypeSettings', '.process-action-form', async function () { if (jQuery(this).find('.latepoint-whatsapp-templates-loader').length) { let $loader = jQuery(this).find('.latepoint-whatsapp-templates-loader'); let $settings = jQuery(this).find('.process-action-settings'); let $holder = jQuery(this).find('.latepoint-whatsapp-templates-holder'); $settings.addClass('os-loading'); let data = { action: latepoint_helper.route_action, route_name: $loader.data('route'), params: { template_id: $loader.data('selected-template-id'), action_id: $loader.data('process-action-id'), process_id: $loader.data('process-id') }, layout: 'none', return_format: 'json' } try { let response = await jQuery.ajax({ type: "post", dataType: "json", url: latepoint_timestamped_ajaxurl(), data: data }); $settings.removeClass('os-loading'); if (response.status === 'success') { $loader.remove(); $holder.html(response.message); } else { throw new Error(response.message); } } catch (e) { $settings.removeClass('os-loading'); console.log(e); alert(e); } } }); jQuery('.os-processes-w').on('click', '.os-run-process', function () { let $btn = jQuery(this); $btn.addClass('os-loading'); let $process_form = $btn.closest('.os-process-form'); // remove previously assigned class on other forms jQuery('.os-process-form.prepared-to-run').removeClass('prepared-to-run'); // add class so we know which form is about to be processed $process_form.addClass('prepared-to-run'); let form_data = new FormData($process_form[0]); form_data.set('process_event_type', $process_form.closest('.os-process-form').find('.process-event-type-selector').val()); let data = new FormData(); data.append('params', latepoint_formdata_to_url_encoded_string(form_data)); data.append('action', latepoint_helper.route_action); data.append('route_name', $btn.data('route')); data.append('return_format', 'json'); jQuery.ajax({ type: "post", dataType: "json", processData: false, contentType: false, url: latepoint_timestamped_ajaxurl(), data: data, success: function (data) { latepoint_show_data_in_side_panel(data.message, 'width-600'); latepoint_init_process_test_form(); $btn.removeClass('os-loading'); } }); return false; }); jQuery('.os-processes-w').find('.process-action-form').each(function (index) { latepoint_init_process_action_form(jQuery(this)); }); jQuery('.os-processes-w').on('click', '.pe-remove-condition', (event) => { if (jQuery(event.currentTarget).closest('.pe-conditions').find('.pe-condition').length > 1) { jQuery(event.currentTarget).closest('.pe-condition').remove(); } else { alert('You need to have at least one condition if your custom field is set to be conditional.') } return false; }); jQuery('.os-processes-w').on('change', 'select.process-condition-operator-selector', (event) => { let $select = jQuery(event.currentTarget); if ($select.val() == 'changed' || $select.val() == 'not_changed') { $select.closest('.pe-condition').find('.process-condition-values-w').hide(); } else { $select.closest('.pe-condition').find('.process-condition-values-w').show(); } }); jQuery('.os-processes-w').on('change', 'select.process-event-type-selector', (event) => { let $select = jQuery(event.currentTarget); latepoint_replace_process_condition_element($select, {event_type: $select.val()}, $select.closest('.os-form-block').find('.process-event-condition-wrapper')); }); jQuery('.os-processes-w').on('change', 'select.process-condition-object-selector', (event) => { let $select = jQuery(event.currentTarget); let $property_selector = $select.closest('.pe-condition').find('.process-condition-properties-w select'); latepoint_replace_process_condition_element($select, {object_code: $select.val()}, $property_selector, () => { $property_selector.trigger('change'); }); }); jQuery('.os-processes-w').on('change', 'select.process-condition-property-selector', (event) => { let $select = jQuery(event.currentTarget); let $operator_selector = $select.closest('.pe-condition').find('.process-condition-operators-w select'); latepoint_replace_process_condition_element($select, {property: $select.val()}, $operator_selector, () => { $operator_selector.trigger('change'); }); }); jQuery('.os-processes-w').on('change', 'select.process-condition-operator-selector', (event) => { let $select = jQuery(event.currentTarget); latepoint_replace_process_condition_element($select, { property: $select.closest('.pe-condition').find('select.process-condition-property-selector').val(), trigger_condition_id: $select.closest('.pe-condition').data('condition-id'), operator: $select.val() }, $select.closest('.pe-condition').find('.process-condition-values-w')); }); } function latepoint_init_process_conditions_form() { jQuery('.os-late-select').lateSelect(); } function latepoint_add_process_condition($btn, response) { $btn.closest('.pe-condition').after(response.message); latepoint_init_process_conditions_form(); } function latepoint_init_added_process_action_form($trigger) { let $action_form = $trigger.prev('.process-action-form'); $action_form.addClass('is-editing').trigger('latepoint:initProcessActionForm'); latepoint_init_process_action_form($action_form); } function latepoint_init_process_test_form() { jQuery('.latepoint-run-process-btn').on('click', function () { let $btn = jQuery(this); if ($btn.hasClass('os-loading')) return false; $btn.addClass('os-loading'); let $test_action_form = jQuery('.latepoint-side-panel-w .action-settings-wrapper'); let form_data = new FormData(jQuery('.os-process-form.prepared-to-run')[0]); // set data sources jQuery('.process-test-data-source-selector').each(function () { form_data.set(jQuery(this).prop('name'), jQuery(this).val()); }); // set selected actions jQuery('.process-test-data-source-selector').each(function () { form_data.set(jQuery(this).prop('name'), jQuery(this).val()); }); let action_ids_to_run = []; jQuery('.action-to-run input[type="hidden"]').each(function () { if (jQuery(this).val() == 'on') action_ids_to_run.push(jQuery(this).closest('.action-to-run').data('id')); }); form_data.set('action_ids', action_ids_to_run.join(',')); let data = new FormData(); data.append('params', latepoint_formdata_to_url_encoded_string(form_data)); data.append('action', latepoint_helper.route_action); data.append('route_name', $btn.data('route')); data.append('return_format', 'json'); jQuery.ajax({ type: "post", dataType: "json", processData: false, contentType: false, url: latepoint_timestamped_ajaxurl(), data: data, success: function (data) { $btn.removeClass('os-loading'); if (data.status == 'success') { latepoint_add_notification(data.message); } else { latepoint_add_notification(data.message, 'error'); } } }); }); jQuery('.process-action-test-data-source-selector').on('change', function () { // TODO add call to server to check if selected data sources matches conditions of this process }); } function latepoint_init_process_action_test_form() { latepoint_init_json_view(jQuery('.action-preview-wrapper.type-trigger_webhook pre')); jQuery('.latepoint-run-action-btn').on('click', function () { let $btn = jQuery(this); if ($btn.hasClass('os-loading')) return false; $btn.addClass('os-loading'); let $test_action_form = jQuery('.latepoint-side-panel-w .action-settings-wrapper'); let action_data = new FormData(); action_data.append('params', $test_action_form.find('select, textarea, input').serialize()); action_data.append('action', latepoint_helper.route_action); action_data.append('route_name', $btn.data('route')); action_data.append('return_format', 'json'); jQuery.ajax({ type: "post", dataType: "json", processData: false, contentType: false, url: latepoint_timestamped_ajaxurl(), data: action_data, success: function (data) { $btn.removeClass('os-loading'); if (data.status == 'success') { latepoint_add_notification(data.message); } else { latepoint_add_notification(data.message, 'error'); } } }); }); jQuery('.process-action-test-data-source-selector').on('change', function () { let $select = jQuery(this); jQuery('.action-preview-wrapper').addClass('os-loading'); let $test_action_form = $select.closest('.action-settings-wrapper'); let action_data = new FormData(); action_data.append('params', $test_action_form.find('select, textarea, input').serialize()); action_data.append('action', latepoint_helper.route_action); action_data.append('route_name', $select.data('route')); action_data.append('return_format', 'json'); jQuery.ajax({ type: "post", dataType: "json", processData: false, contentType: false, url: latepoint_timestamped_ajaxurl(), data: action_data, success: function (data) { jQuery('.action-preview-wrapper').html(data.message).removeClass('os-loading'); latepoint_init_json_view(jQuery('.action-preview-wrapper.type-trigger_webhook pre')); } }); }); } function latepoint_init_process_action_form($action_form) { $action_form.on('click', '.os-run-process-action', function () { let $btn = jQuery(this); $btn.addClass('os-loading'); let $action_form = $btn.closest('.process-action-form'); if (window.tinyMCE !== undefined) window.tinyMCE.triggerSave(); let action_data = new FormData(); let params = latepoint_create_form_data_from_non_form_element($action_form); params.set('process_event_type', $action_form.closest('.os-process-form').find('.process-event-type-selector').val()); action_data.append('params', latepoint_formdata_to_url_encoded_string(params)); action_data.append('action', latepoint_helper.route_action); action_data.append('route_name', $btn.data('route')); action_data.append('return_format', 'json'); jQuery.ajax({ type: "post", dataType: "json", processData: false, contentType: false, url: latepoint_timestamped_ajaxurl(), data: action_data, success: function (data) { latepoint_show_data_in_side_panel(data.message, 'width-800'); latepoint_init_process_action_test_form(); $btn.removeClass('os-loading'); } }); return false; }); $action_form.on('click', '.process-action-heading', function () { let $action_form = jQuery(this).closest('.process-action-form'); if (!$action_form.hasClass('is-editing')) $action_form.trigger('latepoint:initProcessActionForm') $action_form.toggleClass('is-editing'); return false; }); $action_form.find('textarea.os-wp-editor-textarea').each(function (index) { latepoint_init_tiny_mce(jQuery(this).attr('id')); }); $action_form.on('click', '.os-remove-process-action', function () { if (confirm(jQuery(this).data('os-prompt'))) { jQuery(this).closest('.process-action-form').remove(); } return false; }); $action_form.on('change', '.process-action-type-whatsapp-template-selector', async function () { let $select = jQuery(this); let $preview_holder = $select.closest('.process-action-settings').find('.latepoint-whatsapp-template-preview-holder'); $preview_holder.addClass('os-loading'); let data = { action: latepoint_helper.route_action, route_name: $select.data('route'), params: { template_id: $select.val(), action_id: $select.data('action-id') }, layout: 'none', return_format: 'json' } try { let response = await jQuery.ajax({ type: "post", dataType: "json", url: latepoint_timestamped_ajaxurl(), data: data }); $preview_holder.removeClass('os-loading'); if (response.status === 'success') { $preview_holder.html(response.message); } else { throw new Error(response.message); } } catch (e) { $preview_holder.removeClass('os-loading'); console.log(e); alert(e); } return false; }); $action_form.on('change', '.process-action-type', function () { let $select = jQuery(this); jQuery(this).closest('.process-action-form').find('.process-action-name').text($select.find('option:selected').text()); let action_type = $select.val(); let action_id = $select.data('action-id'); let route_name = $select.data('route'); let $action_settings = $select.closest('.process-action-content').find('.process-action-settings'); $action_settings.addClass('os-loading'); let data = { action: latepoint_helper.route_action, route_name: route_name, params: { action_type: action_type, action_id: action_id }, layout: 'none', return_format: 'json' } jQuery.ajax({ type: "post", dataType: "json", url: latepoint_timestamped_ajaxurl(), data: data, success: function (data) { $action_settings.html(data.message).removeClass('os-loading'); let $action_form = $select.closest('.process-action-form'); latepoint_init_input_masks($action_form); $action_form.trigger('latepoint:initProcessActionTypeSettings'); } }); return false; }); } /* * Copyright (c) 2024 LatePoint LLC. All rights reserved. */ function latepoint_preview_init_step_category_items(step_code){ jQuery('.booking-form-preview .os-item-category-info').on('click', function(){ var $booking_form_element = jQuery(this).closest('.booking-form-preview'); jQuery(this).closest('.latepoint-step-content').addClass('selecting-item-category'); var $category_wrapper = jQuery(this).closest('.os-item-category-w'); var $main_parent = jQuery(this).closest('.os-item-categories-main-parent'); if($category_wrapper.hasClass('selected')){ $category_wrapper.removeClass('selected'); if($category_wrapper.parent().closest('.os-item-category-w').length){ $category_wrapper.parent().closest('.os-item-category-w').addClass('selected'); }else{ $main_parent.removeClass('show-selected-only'); } }else{ $main_parent.find('.os-item-category-w.selected').removeClass('selected'); $main_parent.addClass('show-selected-only'); $category_wrapper.addClass('selected'); } return false; }); } function latepoint_booking_form_discard_changes(){ let form_data = new FormData(jQuery('.booking-form-preview-settings')[0]); var data = { action: latepoint_helper.route_action, route_name: jQuery('.booking-form-preview-settings').data('route-name'), params: latepoint_formdata_to_url_encoded_string(form_data), layout: 'none', return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(data){ if(data.status === "success"){ jQuery('.booking-form-preview-inner').html(data.booking_form_html); latepoint_init_booking_form_preview(); }else{ latepoint_add_notification(data.message, 'error'); } } }); } function latepoint_booking_form_save_changes(){ let form_data = new FormData(jQuery('.booking-form-preview-settings')[0]); jQuery('.editable-setting').each(function(){ form_data.set('steps_settings' + jQuery(this).data('setting-key'), jQuery(this).html()); }); form_data.set('steps_settings' + jQuery('.bf-side-media-picker-trigger').find('.os-image-id-holder').prop('name'), jQuery('.bf-side-media-picker-trigger').find('.os-image-id-holder').val()); var data = { action: latepoint_helper.route_action, route_name: jQuery('.booking-form-preview-settings').data('route-name'), params: latepoint_formdata_to_url_encoded_string(form_data), layout: 'none', return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(data){ jQuery('.booking-form-preview-settings').removeClass('os-loading'); if(data.status === "success"){ jQuery('.bf-preview-step-settings').html(data.step_settings_html); jQuery('.booking-form-preview-inner').html(data.booking_form_html); jQuery('#latepoint-main-admin-inline-css').html(data.css_variables); latepoint_init_booking_form_preview(); }else{ latepoint_add_notification(data.message, 'error'); } } }); } function latepoint_init_booking_form_preview(){ latepoint_preview_init_step_category_items(); latepoint_booking_form_preview_init_datepicker(); jQuery('.booking-form-preview-wrapper').on('click', '.os-step-tab', function(){ let $booking_form_element = jQuery(this).closest('.latepoint-booking-form-element'); jQuery(this).closest('.os-step-tabs').find('.os-step-tab').removeClass('active'); jQuery(this).addClass('active'); var target = jQuery(this).data('target'); jQuery(this).closest('.os-step-tabs-w').find('.os-step-tab-content').hide(); jQuery(target).show(); if(jQuery(this).data('auth-action')){ $booking_form_element.find('input[name="auth[action]"]').val(jQuery(this).data('auth-action')); } }); jQuery('.bf-save-btn').on('click', function(){ jQuery(this).addClass('os-loading'); latepoint_booking_form_save_changes(); return false; }); jQuery('.bf-cancel-save-btn').on('click', function(){ jQuery(this).addClass('os-loading'); latepoint_booking_form_discard_changes(); return false; }); jQuery('.booking-form-preview .bf-next-btn').on('click', function(){ jQuery(this).addClass('os-loading'); jQuery("#selected_step_code > option:selected") .prop("selected", false) .next() .prop("selected", true).trigger('change'); }); jQuery('.booking-form-preview .bf-prev-btn').on('click', function(){ jQuery(this).addClass('os-loading'); jQuery("#selected_step_code > option:selected") .prop("selected", false) .prev() .prop("selected", true).trigger('change'); }); jQuery('.booking-form-preview .os-image-selector-trigger').on('click', function(){ jQuery('.booking-form-preview').addClass('has-changes'); }); jQuery('.booking-form-preview .editable-setting').on('focus', function(){ jQuery('.booking-form-preview').addClass('has-changes'); }); let editor = new MediumEditor('.booking-form-preview .os-editable', {toolbar: { buttons: [ { name: 'bold', classList: ['latepoint-icon', 'latepoint-icon-format_bold'], }, { name: 'anchor', classList: ['latepoint-icon', 'latepoint-icon-format_link'], }, { name: 'h3', classList: ['latepoint-icon', 'latepoint-icon-format_h3'], }, { name: 'h4', classList: ['latepoint-icon', 'latepoint-icon-format_h4'], }, { name: 'h5', classList: ['latepoint-icon', 'latepoint-icon-format_h5'], }, ] } }); let editor_basic = new MediumEditor('.booking-form-preview .os-editable-basic', {toolbar: { buttons: [ { name: 'bold', classList: ['latepoint-icon', 'latepoint-icon-format_bold'], }, { name: 'italic', classList: ['latepoint-icon', 'latepoint-icon-format_italic'], }, { name: 'underline', classList: ['latepoint-icon', 'latepoint-icon-format_underlined'], }, { name: 'anchor', classList: ['latepoint-icon', 'latepoint-icon-format_link'], }, ] } }); } function latepoint_reload_booking_form_preview(){ latepoint_booking_form_save_changes(); } function latepoint_init_steps_settings(){ jQuery('.booking-form-preview-settings').on('change', ' select, input[type="hidden"]', function(){ jQuery('.booking-form-preview-settings').addClass('os-loading'); latepoint_reload_booking_form_preview(); }); jQuery('.trigger-custom-color-save').on('click', function(){ jQuery('.booking-form-preview-settings').addClass('os-loading'); latepoint_booking_form_save_changes(); return false; }); jQuery('.bf-color-scheme-color-trigger').on('click', function(){ jQuery('.bf-color-scheme-color-trigger.is-selected').removeClass('is-selected'); jQuery(this).addClass('is-selected'); let color_scheme = jQuery(this).data('color-code'); jQuery('.os-color-scheme-selector-wrapper select').val(color_scheme).trigger('change'); if(color_scheme == 'custom'){ jQuery('.os-custom-color-selector-wrapper').removeClass('is-hidden'); }else{ jQuery('.os-custom-color-selector-wrapper').addClass('is-hidden'); } return false; }); jQuery('.os-section-collapsible-trigger').on('click', function(){ jQuery(this).closest('.os-section-collapsible-wrapper').toggleClass('is-open'); return false; }) } function latepoint_booking_form_preview_init_timeslots($booking_form_element = false){ if(!$booking_form_element) return; $booking_form_element.on('click', '.dp-timepicker-trigger', function(){ if(jQuery(this).hasClass('is-booked') || jQuery(this).hasClass('is-off')){ // Show error message that you cant select a booked period }else{ if(jQuery(this).hasClass('selected')){ jQuery(this).removeClass('selected'); jQuery(this).find('.dp-success-label').remove(); }else{ $booking_form_element.find('.dp-timepicker-trigger.selected').removeClass('selected').find('.dp-success-label').remove(); var selected_timeslot_time = jQuery(this).find('.dp-label-time').html(); jQuery(this).addClass('selected').find('.dp-label').prepend('<span class="dp-success-label">' + latepoint_helper.datepicker_timeslot_selected_label + '</span>'); var minutes = parseInt(jQuery(this).data('minutes')); var start_date = new Date($booking_form_element.find('.os-day.selected').data('date')); $booking_form_element.find('.latepoint_start_date').val(start_date.toISOString().split('T')[0]) latepoint_trigger_next_btn($booking_form_element); } } return false; }); } function latepoint_booking_form_preview_day_timeslots($day){ let $wrapper_element = jQuery('.booking-form-preview'); $day.addClass('selected'); var service_duration = $day.data('service-duration'); var interval = $day.data('interval'); var work_start_minutes = $day.data('work-start-time'); var work_end_minutes = $day.data('work-end-time'); var total_work_minutes = $day.data('total-work-minutes'); var bookable_minutes = []; var available_capacities_of_bookable_minute = []; if($day.attr('data-bookable-minutes')){ if($day.data('bookable-minutes').toString().indexOf(':') > -1){ // has capacity information embedded into bookable minutes string let bookable_minutes_with_capacity = $day.data('bookable-minutes').toString().split(','); for(let i = 0; i < bookable_minutes_with_capacity.length; i++){ bookable_minutes.push(parseInt(bookable_minutes_with_capacity[i].split(':')[0])); available_capacities_of_bookable_minute.push(parseInt(bookable_minutes_with_capacity[i].split(':')[1])); } }else{ bookable_minutes = $day.data('bookable-minutes').toString().split(',').map(Number); } } var work_minutes = $day.data('work-minutes').toString().split(',').map(Number); var $timeslots = $wrapper_element.find('.timeslots'); $timeslots.html(''); if(total_work_minutes > 0 && bookable_minutes.length && work_minutes.length){ var prev_minutes = false; work_minutes.forEach(function(current_minutes){ var ampm = latepoint_am_or_pm(current_minutes); var timeslot_class = 'dp-timepicker-trigger'; var timeslot_available_capacity = 0; if($wrapper_element.find('.os-dates-w').data('time-pick-style') == 'timeline'){ timeslot_class+= ' dp-timeslot'; }else{ timeslot_class+= ' dp-timebox'; } if(prev_minutes !== false && ((current_minutes - prev_minutes) > service_duration)){ // show interval that is off between two work periods var off_label = latepoint_minutes_to_hours_and_minutes(prev_minutes + service_duration)+' '+ latepoint_am_or_pm(prev_minutes + service_duration) + ' - ' + latepoint_minutes_to_hours_and_minutes(current_minutes)+' '+latepoint_am_or_pm(current_minutes); var off_width = (((current_minutes - prev_minutes - service_duration) / total_work_minutes) * 100); $timeslots.append('<div class="'+ timeslot_class +' is-off" style="max-width:'+ off_width +'%; width:'+ off_width +'%"><span class="dp-label">' + off_label + '</span></div>'); } if(!bookable_minutes.includes(current_minutes)){ timeslot_class+= ' is-booked'; }else{ if(available_capacities_of_bookable_minute.length) timeslot_available_capacity = available_capacities_of_bookable_minute[bookable_minutes.indexOf(current_minutes)]; } var tick_html = ''; var capacity_label = ''; var capacity_label_html = ''; var capacity_internal_label_html = ''; if(((current_minutes % 60) == 0) || (interval >= 60)){ timeslot_class+= ' with-tick'; tick_html = '<span class="dp-tick"><strong>'+latepoint_minutes_to_hours_preferably(current_minutes)+'</strong>'+' '+ampm+'</span>'; } var timeslot_label = latepoint_minutes_to_hours_and_minutes(current_minutes)+' '+ampm; if(latepoint_show_booking_end_time()){ var end_minutes = current_minutes + service_duration; if(end_minutes > 1440) end_minutes = end_minutes - 1440; var end_minutes_ampm = latepoint_am_or_pm(end_minutes); timeslot_label+= ' - <span class="dp-label-end-time">' + latepoint_minutes_to_hours_and_minutes(end_minutes)+' '+end_minutes_ampm + '</span>'; } if(timeslot_available_capacity){ var spaces_message = timeslot_available_capacity > 1 ? latepoint_helper.many_spaces_message : latepoint_helper.single_space_message; capacity_label = timeslot_available_capacity + ' ' + spaces_message; capacity_label_html = '<span class="dp-capacity">' + capacity_label + '</span>'; capacity_internal_label_html = '<span class="dp-label-capacity">' + capacity_label + '</span>'; } timeslot_label = timeslot_label.trim(); $timeslots.removeClass('slots-not-available').append('<div class="'+timeslot_class+'" data-minutes="' + current_minutes + '"><span class="dp-label">' + capacity_internal_label_html + '<span class="dp-label-time">' + timeslot_label + '</span>' +'</span>'+tick_html+ capacity_label_html + '</div>'); prev_minutes = current_minutes; }); }else{ // No working hours this day $timeslots.addClass('slots-not-available').append('<div class="not-working-message">' + latepoint_helper.msg_not_available + "</div>"); } jQuery('.times-header-label span').text($day.data('nice-date')); $wrapper_element.find('.time-selector-w').slideDown(200); } function latepoint_booking_form_preview_init_monthly_calendar_navigation($booking_form_element){ if(!$booking_form_element) return; $booking_form_element.on('click', '.os-month-next-btn', function(){ var $booking_form_element = jQuery(this).closest('.latepoint-booking-form-element'); var next_month_route_name = jQuery(this).data('route'); if($booking_form_element.find('.os-monthly-calendar-days-w.active + .os-monthly-calendar-days-w').length){ $booking_form_element.find('.os-monthly-calendar-days-w.active').removeClass('active').next('.os-monthly-calendar-days-w').addClass('active'); latepoint_booking_form_preview_calendar_set_month_label($booking_form_element); }else{ alert('Disabled in preview'); } latepoint_calendar_show_or_hide_prev_next_buttons($booking_form_element); return false; }); $booking_form_element.on('click', '.os-month-prev-btn', function(){ var $booking_form_element = jQuery(this).closest('.latepoint-booking-form-element'); if($booking_form_element.find('.os-monthly-calendar-days-w.active').prev('.os-monthly-calendar-days-w').length){ $booking_form_element.find('.os-monthly-calendar-days-w.active').removeClass('active').prev('.os-monthly-calendar-days-w').addClass('active'); latepoint_booking_form_preview_calendar_set_month_label($booking_form_element); } return false; }); } function latepoint_booking_form_preview_calendar_set_month_label(){ jQuery('.os-current-month-label .current-month').text(jQuery('.os-monthly-calendar-days-w.active').data('calendar-month-label')); jQuery('.os-current-month-label .current-year').text(jQuery('.os-monthly-calendar-days-w.active').data('calendar-year')); } function latepoint_booking_form_preview_init_datepicker(){ let $booking_form_element = jQuery('.latepoint-booking-form-element'); latepoint_booking_form_preview_init_timeslots($booking_form_element); latepoint_booking_form_preview_init_monthly_calendar_navigation($booking_form_element); $booking_form_element.on('click', '.os-months .os-day', function(){ if(jQuery(this).hasClass('os-day-passed')) return false; if(jQuery(this).hasClass('os-not-in-allowed-period')) return false; if(jQuery(this).hasClass('os-month-prev')) return false; if(jQuery(this).hasClass('os-month-next')) return false; if(jQuery(this).closest('.os-monthly-calendar-days-w').hasClass('hide-if-single-slot')){ // HIDE TIMESLOT IF ONLY ONE TIMEPOINT if(jQuery(this).hasClass('os-not-available')){ // clicked on a day that has no available timeslots // do nothing }else{ $booking_form_element.find('.os-day.selected').removeClass('selected'); jQuery(this).addClass('selected'); // set date $booking_form_element.find('.latepoint_start_date').val(jQuery(this).data('date')); if(jQuery(this).hasClass('os-one-slot-only')){ // clicked on a day that has only one slot available var bookable_minutes = jQuery(this).data('bookable-minutes').toString().split(':')[0]; var selected_timeslot_time = latepoint_format_minutes_to_time(Number(bookable_minutes), Number(jQuery(this).data('service-duration'))); $booking_form_element.find('.time-selector-w').slideUp(200); }else{ // regular day with more than 1 timeslots available // build timeslots latepoint_booking_form_preview_day_timeslots(jQuery(this)); // clear time and hide next btn } } }else{ // SHOW TIMESLOTS EVEN IF ONLY ONE TIMEPOINT $booking_form_element.find('.latepoint_start_date').val(jQuery(this).data('date')); $booking_form_element.find('.os-day.selected').removeClass('selected'); jQuery(this).addClass('selected'); // build timeslots latepoint_booking_form_preview_day_timeslots(jQuery(this)); // clear time and hide next btn } return false; }); } /* * Copyright (c) 2024 LatePoint LLC. All rights reserved. */ function latepoint_submit_quick_order_form(){ let $quick_edit_form = jQuery('form.order-quick-edit-form'); let errors = latepoint_validate_form($quick_edit_form); if(errors.length){ let error_messages = errors.map(error => error.message ).join(', '); latepoint_add_notification(error_messages, 'error'); return false; } $quick_edit_form.find('button[type="submit"]').addClass('os-loading'); jQuery.ajax({ type: "post", dataType: "json", processData: false, contentType: false, url: latepoint_timestamped_ajaxurl(), data: latepoint_create_form_data($quick_edit_form), success: function (response) { if(response.fields_to_update){ for (const [key, value] of Object.entries(response.fields_to_update)) { $quick_edit_form.find('input[name="' + key + '"]').val(value) } } $quick_edit_form.find('button[type="submit"]').removeClass('os-loading'); if(response.form_values_to_update){ jQuery.each(response.form_values_to_update, function(name, value){ $quick_edit_form.find('[name="'+ name +'"]').val(value); }); } if (response.status === "success") { latepoint_add_notification(response.message); latepoint_reload_after_order_save(); }else{ latepoint_add_notification(response.message, 'error'); } } }); } function latepoint_apply_agent_selector_change(){ if(jQuery('.quick-availability-per-day-w').length){ let booking_form_id = jQuery('.quick-availability-per-day-w').data('trigger-form-booking-id'); let $trigger_btn = jQuery('.order-item-booking-data-form-wrapper[data-booking-id="' + booking_form_id + '"]').find('.trigger-quick-availability'); latepoint_load_quick_availability($trigger_btn); } } function latepoint_apply_service_selector_change($form){ let field_base_name = 'order_items[' + $form.data('order-item-id') +'][bookings][' + $form.data('booking-id') +']'; var $selected_service = $form.find('.os-services-select-field-w .service-option-selected'); var service_id = $selected_service.data('id'); var buffer_before = $selected_service.data('buffer-before'); var buffer_after = $selected_service.data('buffer-after'); var default_duration = $selected_service.data('duration'); var default_duration_name = $selected_service.data('duration-name'); var min_capacity = $selected_service.data('capacity-min'); var max_capacity = $selected_service.data('capacity-max'); var extra_durations = $selected_service.data('extra-durations'); $form.find('input[name="'+field_base_name+'[buffer_before]"]').val(buffer_before).trigger('change').closest('.os-form-group').addClass('has-value'); $form.find('input[name="'+field_base_name+'[buffer_after]"]').val(buffer_after).trigger('change').closest('.os-form-group').addClass('has-value'); $form.find('input[name="'+field_base_name+'[service_id]"]').val(service_id).trigger('change').closest('.os-form-group').addClass('has-value'); var duration_name = default_duration_name ? default_duration_name : (default_duration + ' ' + latepoint_helper.string_minutes); var options = '<option value="'+ default_duration +'">' + duration_name + '</option>'; if(extra_durations.length){ jQuery.each(extra_durations, function(index, value){ var duration_name = value.name ? value.name : value.duration + ' ' + latepoint_helper.string_minutes; options+= '<option value="'+ value.duration +'">' + duration_name + '</option>'; }); $form.find('.os-service-durations').show(); }else{ $form.find('.os-service-durations').hide(); } $form.find('.booking-total-attendees-selector-w .capacity-info strong').text(max_capacity); var attendees_options_html = ''; for(var i=1;i<=max_capacity;i++){ attendees_options_html+= '<option value="' + i + '">' + i + '</option>'; } var selected_attendees = Math.min(jQuery('.booking-total-attendees-selector-w select').val(), max_capacity); $form.find('.booking-total-attendees-selector-w select').html(attendees_options_html).val(selected_attendees); if(max_capacity > 1){ $form.find('.booking-total-attendees-selector-w').show(); }else{ $form.find('.booking-total-attendees-selector-w').hide(); } $form.find('.os-service-durations select').html(options); latepoint_set_booking_end_time($form); if(jQuery('.quick-availability-per-day-w').length){ latepoint_load_quick_availability($form.find('.trigger-quick-availability')); } latepoint_init_input_masks($form); } function latepoint_reload_balance_and_payments(){ let $wrapper = jQuery('.balance-payment-info'); $wrapper.closest('.balance-payment-wrapper').addClass('os-loading'); let route_name = $wrapper.data('route'); let $quick_edit_form = $wrapper.closest('form.order-quick-edit-form'); let form_data = new FormData($quick_edit_form[0]); let data = { action: latepoint_helper.route_action, route_name: route_name, params: latepoint_formdata_to_url_encoded_string(form_data), return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $wrapper.closest('.balance-payment-wrapper').removeClass('os-loading'); if(response.status === "success"){ jQuery('.balance-payment-wrapper').html(response.message); latepoint_init_input_masks(jQuery('.balance-payment-wrapper')); latepoint_init_daterangepicker(jQuery('.balance-payment-wrapper .os-date-range-picker')); latepoint_init_payment_request_form(jQuery('.quick-order-form-w')); }else{ alert(response.message); } } }); } function latepoint_cancel_adding_new_order_item_to_quick_edit_form(){ jQuery('.order-items-list').removeClass('is-blurred'); jQuery('.new-order-item-list-bundles-wrapper').removeClass('is-open'); jQuery('.new-order-item-variant-selector-wrapper').removeClass('is-open'); jQuery('.order-form-add-item-btn').removeClass('is-cancelling').find('span').text(jQuery('.order-form-add-item-btn').data('add-label')); } function latepoint_build_new_booking_order_item(){ jQuery('.order-form-add-item-btn').addClass('os-loading'); latepoint_cancel_adding_new_order_item_to_quick_edit_form(); let params = {} var data = { action: 'latepoint_route_call', route_name: jQuery('.order-form-add-item-btn').data('booking-form-route-name'), params: params, return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ if(response.status === "success"){ let $form = jQuery(response.message); jQuery('.order-items-list').prepend($form); jQuery('.order-form-add-item-btn').removeClass('os-loading'); latepoint_init_booking_data_form(jQuery('.order-item-booking-data-form-wrapper[data-order-item-id="' + $form.data('order-item-id') + '"]')); // new item added, trigger change event latepoint_quick_order_items_changed(); }else{ alert(response.message, 'error'); } } }); } function latepoint_build_booking_data_form_for_bundle($slot_for_booking){ $slot_for_booking.addClass('os-loading'); latepoint_cancel_adding_new_order_item_to_quick_edit_form(); let params = {} let is_booked = $slot_for_booking.hasClass('is-booked'); var data = { action: 'latepoint_route_call', route_name: jQuery('.order-form-add-item-btn').data('booking-form-route-name'), params: { order_item_id: $slot_for_booking.data('order-item-id'), order_item_variant: $slot_for_booking.data('order-item-variant'), booking_id: $slot_for_booking.data('booking-id'), booking_item_data: is_booked ? $slot_for_booking.find('.booking_item_data').val() : $slot_for_booking.find('.unscheduled_booking_item_data').val() }, return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ if(response.status === "success"){ let $form = jQuery(response.message); $slot_for_booking.removeClass('os-loading'); if($slot_for_booking){ $slot_for_booking.find('.scheduled-bundle-booking').html($form).closest('.order-item-variant-bundle-booking ').addClass('is-booked'); }else{ jQuery('.order-items-list').prepend($form); } latepoint_init_booking_data_form(jQuery('.order-item-booking-data-form-wrapper[data-order-item-id="' + $form.data('order-item-id') + '"][data-booking-id="' + $form.data('booking-id') + '"]')); // new item added, trigger change event if(!$slot_for_booking) latepoint_quick_order_items_changed(); }else{ alert(response.message, 'error'); } } }); } function latepoint_bundle_added_to_quick_order(){ latepoint_quick_order_items_changed(); latepoint_cancel_adding_new_order_item_to_quick_edit_form(); } function latepoint_quick_order_items_changed(){ latepoint_reload_price_breakdown(); } function latepoint_fold_booking_data_form_in_order_quick_edit($booking_data_form){ if(!$booking_data_form.length) return false; latepoint_close_quick_availability_form(); latepoint_show_all_order_items(); let order_item_id = $booking_data_form.data('order-item-id'); let booking_id = $booking_data_form.data('booking-id'); let order_item_variant = $booking_data_form.data('order-item-variant'); $booking_data_form.addClass('is-loading'); let form_data = new FormData(jQuery('.order-quick-edit-form')[0]); form_data.set('order_item_id', order_item_id); form_data.set('booking_id', booking_id); var data = { action: 'latepoint_route_call', route_name: jQuery('.order-form-add-item-btn').data('fold-booking-data-route-name'), params: latepoint_formdata_to_url_encoded_string(form_data), return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ if(response.status === "success"){ $booking_data_form.removeClass('is-loading').removeClass('is-unfolded').addClass('is-folded'); if(order_item_variant == latepoint_helper.order_item_variant_bundle){ $booking_data_form.closest('.order-item-variant-bundle-booking').addClass('is-booked'); $booking_data_form.find('.bundle-booking-item-pill').replaceWith(response.message); }else{ $booking_data_form.find('.order-item-pill').replaceWith(response.message); } }else{ alert(response.message, 'error'); } } }); } function latepoint_init_booking_data_form($booking_data_form){ latepoint_init_input_masks($booking_data_form); $booking_data_form.find('.fold-order-item-booking-data-form-btn').on('click', function(){ latepoint_fold_booking_data_form_in_order_quick_edit($booking_data_form); return false; }); $booking_data_form.find('.quick-booking-form-view-log-btn').on('click', function(){ var $trigger_elem = jQuery(this); $trigger_elem.addClass('os-loading'); var route = $trigger_elem.data('route'); var data = { action: 'latepoint_route_call', route_name: route, params: {booking_id: $trigger_elem.data('booking-id')}, return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $trigger_elem.removeClass('os-loading'); if(response.status === "success"){ latepoint_display_in_side_sub_panel(response.message); jQuery('body').addClass('has-side-sub-panel'); }else{ alert(response.message, 'error'); } } }); return false; }); $booking_data_form.find('.os-late-select').lateSelect(); $booking_data_form.find('.trigger-quick-availability').on('click', function(){ latepoint_load_quick_availability(jQuery(this)); return false; }); let field_base_name = 'order_items[' + $booking_data_form.data('order-item-id') +'][bookings][' + $booking_data_form.data('booking-id') +']'; $booking_data_form.find('input[name="' + field_base_name +'[start_time][formatted_value]"]').on('change', function(){ latepoint_set_booking_end_time($booking_data_form); }); $booking_data_form.find('input[name="' + field_base_name +'[end_time][formatted_value]"]').on('change', function(){ latepoint_is_next_day($booking_data_form); }); $booking_data_form.on('change', '.agent-selector', function(){ latepoint_apply_agent_selector_change($booking_data_form); }); $booking_data_form.on('change', '.location-selector', function(){ latepoint_apply_agent_selector_change($booking_data_form); }); $booking_data_form.on('change', 'select[name="booking[location_id]"]', function(){ latepoint_apply_agent_selector_change($booking_data_form); }); $booking_data_form.on('change', 'select[name="booking[total_attendees]"]', function(){ latepoint_apply_agent_selector_change($booking_data_form); }); $booking_data_form.on('change', '.os-affects-duration', function(){ latepoint_set_booking_end_time($booking_data_form); if(jQuery('.quick-availability-per-day-w').length){ latepoint_load_quick_availability($booking_data_form.find('.trigger-quick-availability')); } }); $booking_data_form.on('change', '.os-affects-price', function(){ latepoint_reload_price_breakdown(); }); $booking_data_form.on('change', '.os-affects-balance', function(){ latepoint_reload_balance_and_payments(); }); $booking_data_form.on('keyup', '.os-affects-balance', function(event){ if(event.keyCode == 13) { latepoint_reload_balance_and_payments(); } }); $booking_data_form.on('click', '.services-options-list .service-option', function(){ var selected_option_html = jQuery(this).html(); var $selected_option = jQuery(this).closest('.os-services-select-field-w').find('.service-option-selected'); $selected_option.html(selected_option_html) .data('id', jQuery(this).data('id')) .data('duration', jQuery(this).data('duration')) .data('duration-name', jQuery(this).data('duration-name')) .data('buffer-before', jQuery(this).data('buffer-before')) .data('buffer-after', jQuery(this).data('buffer-after')) .data('capacity-min', jQuery(this).data('capacity-min')) .data('capacity-max', jQuery(this).data('capacity-max')) .data('extra-durations', jQuery(this).data('extra-durations')); jQuery(this).closest('.os-services-select-field-w').find('.service-option.selected').removeClass('selected'); jQuery(this).addClass('selected').closest('.os-services-select-field-w').removeClass('active'); latepoint_apply_service_selector_change($booking_data_form); return false; }); $booking_data_form.trigger('latepoint:initBookingDataForm'); } function latepoint_init_payment_request_form($quick_order_form){ $quick_order_form.find('select[name="payment_request[portion]"]').on('change', function(){ if(jQuery(this).val() == 'custom'){ $quick_order_form.find('.custom-charge-amount-wrapper').show(); }else{ $quick_order_form.find('.custom-charge-amount-wrapper').hide(); } }) } function latepoint_show_all_order_items(){ let $quick_order_form = jQuery('.quick-order-form-w'); $quick_order_form.find('.order-items-info-w').removeClass('show-preselected-only'); $quick_order_form.find('.holds-preselected-booking').removeClass('holds-preselected-booking'); } function latepoint_init_quick_order_form(){ let $quick_order_form = jQuery('.quick-order-form-w'); $quick_order_form.trigger('latepoint:initOrderEditForm'); $quick_order_form.on('change', '.os-affects-balance', function(){ latepoint_reload_balance_and_payments(); }); $quick_order_form.on('keyup', '.os-affects-balance', function(event){ if(event.keyCode == 13) { latepoint_reload_balance_and_payments(); } }); latepoint_init_customer_inline_edit_form($quick_order_form.find('.customer-info-w')); $quick_order_form.find('.order-item-booking-data-form-wrapper').each(function(){ latepoint_init_booking_data_form(jQuery(this)); }); latepoint_lightbox_close(); latepoint_remove_floating_popup(); latepoint_init_input_masks($quick_order_form); latepoint_init_daterangepicker($quick_order_form.find('.os-date-range-picker')); latepoint_init_payment_request_form($quick_order_form); // Transactions $quick_order_form.on('click', '.transaction-refund-settings-button', function(){ jQuery(this).closest('.quick-add-transaction-box-w').addClass('show-refund-settings'); }); $quick_order_form.on('click', '.transaction-refund-submit-button', function(){ let $trigger_elem = jQuery(this); if(confirm(jQuery(this).data('os-prompt'))){ $trigger_elem.addClass('os-loading'); let route = $trigger_elem.data('route'); let data = { action: 'latepoint_route_call', route_name: route, params: $trigger_elem.closest('.refund-settings-fields').find('input, textarea, select').serialize(), return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $trigger_elem.removeClass('os-loading'); if(response.status === "success"){ $trigger_elem.closest('.quick-add-transaction-box-w').replaceWith(response.message); latepoint_reload_balance_and_payments(); }else{ alert(response.message, 'error'); } } }); return false; } }); $quick_order_form.on('click', '.refund-settings-close', function(){ jQuery(this).closest('.quick-add-transaction-box-w').removeClass('show-refund-settings'); }); $quick_order_form.on('change', '.refund-portion-selector', function(){ if(jQuery(this).val() == 'full'){ jQuery(this).closest('.refund-settings-fields').find('.custom-charge-amount-wrapper').hide(); }else{ jQuery(this).closest('.refund-settings-fields').find('.custom-charge-amount-wrapper').show(); } }); // Log $quick_order_form.find('.quick-order-form-view-log-btn').on('click', function(){ var $trigger_elem = jQuery(this); $trigger_elem.addClass('os-loading'); var route = $trigger_elem.data('route'); var data = { action: 'latepoint_route_call', route_name: route, params: {order_id: $trigger_elem.data('order-id')}, return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $trigger_elem.removeClass('os-loading'); if(response.status === "success"){ latepoint_display_in_side_sub_panel(response.message); jQuery('body').addClass('has-side-sub-panel'); }else{ alert(response.message, 'error'); } } }); return false; }); $quick_order_form.find('.new-order-item-variant-bundle').on('click', function(){ $quick_order_form.find('.new-order-item-list-bundles-wrapper').toggleClass('is-open'); $quick_order_form.find('.new-order-item-variant-selector-wrapper').toggleClass('is-open'); return false; }); $quick_order_form.find('.hidden-order-items-notice-link, .hidden-bundle-items-notice-link').on('click', function(e){ latepoint_show_all_order_items(); return false; }); $quick_order_form.find('.order-quick-edit-form').on('submit', function(e){ if(jQuery(this).find('button[type="submit"]').hasClass('os-loading')) return false; e.preventDefault(); latepoint_submit_quick_order_form(); }); $quick_order_form.on("keydown", ":input:not(textarea):not(:submit)", function(event) { if (event.key == "Enter") { event.preventDefault(); } }); $quick_order_form.find('.order-items-list').on('click', '.remove-order-item-btn', function(){ latepoint_close_quick_availability_form(); if(confirm(jQuery(this).data('os-prompt'))){ if(jQuery(this).closest('.order-item-variant-bundle-booking-wrapper').length){ // it's a bundle booking // need to figure out how to remove it when bundle jQuery(this).closest('.order-item-variant-bundle-booking').removeClass('is-booked').find('.scheduled-bundle-booking').html(''); }else{ jQuery(this).closest('.order-item').remove(); jQuery(this).closest('.order-item-booking-data-form-wrapper').remove(); } latepoint_quick_order_items_changed(); } return false; }); $quick_order_form.find('.new-order-item-variant-booking').on('click', function(){ latepoint_fold_all_open_booking_data_forms(); latepoint_build_new_booking_order_item(); }); $quick_order_form.on('click', '.order-item-pill.order-item-pill-variant-booking', function(){ jQuery(this).closest('.order-item-booking-data-form-wrapper').removeClass('is-folded').addClass('is-unfolded'); return false; }); $quick_order_form.on('click', '.bundle-booking-item-pill', function(){ jQuery(this).closest('.order-item-booking-data-form-wrapper').removeClass('is-folded').addClass('is-unfolded'); return false; }); $quick_order_form.on('click', '.unscheduled-bundle-booking', function(){ latepoint_build_booking_data_form_for_bundle(jQuery(this).closest('.order-item-variant-bundle-booking')); }); $quick_order_form.find('.order-form-add-item-btn').on('click', function(){ let $booking_data_forms = jQuery('.order-item-booking-data-form-wrapper'); $booking_data_forms.each(function(){ latepoint_fold_booking_data_form_in_order_quick_edit(jQuery(this)); }); if(jQuery(this).hasClass('is-cancelling')){ latepoint_cancel_adding_new_order_item_to_quick_edit_form(); }else{ if(jQuery('.new-order-item-variant-selector-wrapper').length){ jQuery('.order-items-list').addClass('is-blurred'); jQuery('.new-order-item-variant-selector-wrapper').addClass('is-open'); jQuery(this).addClass('is-cancelling').find('span').text(jQuery(this).data('cancel-label')); }else{ // no bundles exist, create booking form latepoint_cancel_adding_new_order_item_to_quick_edit_form(); latepoint_build_new_booking_order_item(); } } return false; }); $quick_order_form.on('click', '.order-item-variant-bundle .bundle-icon', function(){ jQuery(this).closest('.order-item-variant-bundle').toggleClass('is-open'); return false; }); $quick_order_form.find('.reload-price-breakdown').on('click', function(){ latepoint_reload_price_breakdown(); return false; }); $quick_order_form.on('click', '.trigger-remove-transaction-btn', function(){ jQuery(this).closest('.quick-add-transaction-box-w').remove(); return false; }); $quick_order_form.trigger('latepoint:initQuickOrderForm'); } function latepoint_fold_all_open_booking_data_forms(){ let $booking_data_forms = jQuery('.order-item-booking-data-form-wrapper'); $booking_data_forms.each(function(){ latepoint_fold_booking_data_form_in_order_quick_edit(jQuery(this)); }); } function latepoint_init_customer_inline_edit_form($customer_form){ latepoint_init_input_masks($customer_form); $customer_form.find('.customers-selector-search-input').on('keyup',function(){ var $queryInput = jQuery(this); var query = $queryInput.val().toLowerCase(); if(query == $queryInput.data('current-query')) return; // Search $queryInput.closest('.customers-selector-search-w').addClass('os-loading'); $queryInput.data('searching-query', query); setTimeout(function(){ if(query != jQuery('.customers-selector-search-input').data('searching-query')) return; var data = { action: latepoint_helper.route_action, route_name: $queryInput.data('route'), params: {query: query}, return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ if($queryInput.data('searching-query') != query) return; $queryInput.closest('.customers-selector-search-w').removeClass('os-loading'); if(response.status === "success"){ $queryInput.data('current-query', query); jQuery('.quick-order-form-w .customers-options-list').html(response.message); }else{ // console.log(response.message); } } }); }, 300, query, $queryInput); }); } function latepoint_load_quick_availability($trigger_elem, custom_agent_id = false, start_date = false, load_more_days = false, load_prev_days = false){ $trigger_elem.addClass('os-loading'); let $booking_form = $trigger_elem.closest('.order-item-booking-data-form-wrapper'); var route = $booking_form.find('.trigger-quick-availability').data('route'); var $quick_order_form = jQuery('.quick-order-form-w'); if(custom_agent_id) $quick_order_form.find('.agent-selector').val(custom_agent_id); if(!$quick_order_form.find('.service-selector').val() || $quick_order_form.find('.service-selector').val() == '0'){ $quick_order_form.find('.os-services-select-field-w .service-option:first').trigger('click'); } let form_data = new FormData($quick_order_form.find('form')[0]); form_data.set('trigger_form_booking_id', $booking_form.data('booking-id')); form_data.set('trigger_form_order_item_id', $booking_form.data('order-item-id')); if(start_date) form_data.set('start_date', start_date); if(load_more_days || load_prev_days) form_data.set('show_days_only', true); if(load_prev_days) form_data.set('previous_days', true); var data = { action: latepoint_helper.route_action, route_name: route, params: latepoint_formdata_to_url_encoded_string(form_data), return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $trigger_elem.removeClass('os-loading'); if(response.status === "success"){ if(load_more_days){ jQuery('.latepoint-side-panel-w .quick-availability-per-day-w').html(response.message); jQuery('.latepoint-side-panel-w .os-availability-days').scrollTop(52); }else if(load_prev_days){ jQuery('.latepoint-side-panel-w .quick-availability-per-day-w').html(response.message); jQuery('.latepoint-side-panel-w .os-availability-days').scrollTop(jQuery('.latepoint-side-panel-w .os-availability-days')[0].scrollHeight - jQuery('.latepoint-side-panel-w .os-availability-days')[0].clientHeight - 50); }else{ latepoint_display_in_side_sub_panel(response.message); jQuery('.latepoint-side-panel-w .os-availability-days').scrollTop(52); jQuery('body').addClass('has-side-sub-panel'); latepoint_init_quick_availability_form(); } }else{ alert(response.message, 'error'); } } }); } function latepoint_create_field_base_name(order_item_id, booking_id){ return 'order_items['+order_item_id+'][bookings]['+booking_id+']'; } function latepoint_close_quick_availability_form(){ jQuery('.quick-availability-per-day-w').remove(); jQuery('body').removeClass('has-side-sub-panel'); } function latepoint_init_quick_availability_form(){ // TODO set booking ID let $quick_availability_wrapper = jQuery('.quick-availability-per-day-w'); let trigger_form_order_item_id = $quick_availability_wrapper.data('trigger-form-order-item-id'); let trigger_form_booking_id = $quick_availability_wrapper.data('trigger-form-booking-id'); let field_base_name = latepoint_create_field_base_name(trigger_form_order_item_id, trigger_form_booking_id); let $booking_data_form = jQuery('.quick-order-form-w .order-item-booking-data-form-wrapper[data-booking-id="'+trigger_form_booking_id+'"]'); var selected_start_date = $booking_data_form.find('input[name="'+field_base_name+'[start_date_formatted]"').val(); var selected_start_time = $booking_data_form.find('input[name="'+field_base_name+'[start_time][formatted_value]"]').val(); var selected_start_time_ampm = $booking_data_form.find('input[name="'+field_base_name+'[start_time][ampm]"]').val(); var selected_start_time_minutes = latepoint_hours_and_minutes_to_minutes(selected_start_time, selected_start_time_ampm); $quick_availability_wrapper.find('.os-availability-days').find('.agent-timeslot[data-formatted-date="'+ selected_start_date +'"][data-minutes="' + selected_start_time_minutes + '"]').addClass('selected'); $quick_availability_wrapper.on('click', '.load-more-quick-availability', function(){ jQuery(this).addClass('os-loading'); let booking_form_id = jQuery(this).closest('.quick-availability-per-day-w').data('trigger-form-booking-id'); let $trigger_btn = jQuery('.order-item-booking-data-form-wrapper[data-booking-id="' + booking_form_id + '"]').find('.trigger-quick-availability'); latepoint_load_quick_availability($trigger_btn, false, jQuery(this).data('start-date'), true); return false; }); $quick_availability_wrapper.on('click', '.load-prev-quick-availability', function(){ jQuery(this).addClass('os-loading'); let booking_form_id = jQuery(this).closest('.quick-availability-per-day-w').data('trigger-form-booking-id'); let $trigger_btn = jQuery('.order-item-booking-data-form-wrapper[data-booking-id="' + booking_form_id + '"]').find('.trigger-quick-availability'); latepoint_load_quick_availability($trigger_btn, false, jQuery(this).data('start-date'), false, true); return false; }); $quick_availability_wrapper.find('select[name="booking[agent_id]"]').on('change', function(){ latepoint_load_quick_availability(jQuery('.trigger-quick-availability'), jQuery(this).val()); }); jQuery('.os-time-group label').on('click', function(){ jQuery(this).closest('.os-time-group').find('.os-form-control').trigger('focus'); }); $quick_availability_wrapper.on('click', '.fill-booking-time', function(){ jQuery('.os-availability-days .agent-timeslot.selected').removeClass('selected'); jQuery(this).addClass('selected'); var formatted_date = jQuery(this).data('formatted-date'); var minutes = jQuery(this).data('minutes'); $booking_data_form.find('input[name="'+field_base_name+'[start_date_formatted]"]').val(formatted_date); var start_minutes = minutes; var start_hours_and_minutes = latepoint_minutes_to_hours_and_minutes(start_minutes); if(start_minutes >= 720){ $booking_data_form.find('.quick-start-time-w .time-pm').trigger('click'); }else{ $booking_data_form.find('.quick-start-time-w .time-am').trigger('click'); } $booking_data_form.find('input[name="'+field_base_name+'[start_time][formatted_value]"]').val(start_hours_and_minutes); latepoint_set_booking_end_time($booking_data_form); $booking_data_form.find('.ws-period, .as-period').addClass('animate-filled-in'); setTimeout(function(){ $booking_data_form.find('.ws-period, .as-period').removeClass('animate-filled-in'); }, 500) }); } function latepoint_reload_after_order_save(){ latepoint_reload_calendar_view(); jQuery('.os-widget').each(function(){ latepoint_reload_widget(jQuery(this)); }); if(jQuery('table.os-reload-on-booking-update').length) latepoint_filter_table(jQuery('table.os-reload-on-booking-update'), jQuery('table.os-reload-on-booking-update')); latepoint_close_side_panel(); } /* * Copyright (c) 2024 LatePoint LLC. All rights reserved. */ class LatepointStripeConnectAdmin { // Init constructor(){ this.ready(); } ready() { jQuery(document).ready(() => { jQuery('.stripe-connect-status-wrapper').on('click', '.payment-start-connecting', function(){ let $link = jQuery(this); $link.addClass('os-loading'); var data = { action: 'latepoint_route_call', route_name: $link.data('route-name'), params: { env: $link.data('env') }, layout: 'none', return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: (data) => { window.location.href = data.url; } }); return false; }); if(jQuery('.stripe-connect-status-wrapper').length){ jQuery('.stripe-connect-status-wrapper').each((index, elem) => { let $wrapper = jQuery(elem); var data = { action: 'latepoint_route_call', route_name: $wrapper.data('route-name'), params: { env: $wrapper.data('env') }, layout: 'none', return_format: 'json' } jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: (data) => { this.reload_connect_status_wrapper($wrapper, data); } }); }) } }); } reload_connect_status_wrapper($elem, data){ if(data.status === 'success'){ if($elem.hasClass('.stripe-connect-status-wrapper')){ $elem.html(data.message); }else{ $elem.closest('.stripe-connect-status-wrapper').html(data.message); } }else{ alert(data.message); } } } window.latepointStripeConnectAdmin = new LatepointStripeConnectAdmin(); /* * Copyright (c) 2022 LatePoint LLC. All rights reserved. */ // @codekit-prepend "bin/time.js"; // @codekit-prepend "bin/lateselect.js"; // @codekit-prepend "bin/latecheckbox.js"; // @codekit-prepend "bin/actions.js"; // @codekit-prepend "bin/notifications.js"; // @codekit-prepend "bin/shared.js"; // @codekit-prepend "bin/admin/updates.js"; // @codekit-prepend "bin/admin/main.js"; // @codekit-prepend "bin/admin/_agents.js"; // @codekit-prepend "bin/admin/_customers.js"; // @codekit-prepend "bin/admin/_customers_import.js"; // @codekit-prepend "bin/admin/_chart.js"; // @codekit-prepend "bin/admin/_calendar.js"; // @codekit-prepend "bin/admin/_processes.js"; // @codekit-prepend "bin/admin/_steps.js"; // @codekit-prepend "bin/admin/_orders.js"; // @codekit-prepend "bin/admin/_stripe_connect.js"; // DOCUMENT READY jQuery(document).ready(function( $ ) { // DASHBOARD latepoint_init_calendars(); latepoint_init_circles_charts(); latepoint_init_donut_charts(); latepoint_init_daily_bookings_chart(); latepoint_init_element_togglers(); latepoint_init_daterangepicker(jQuery('.os-date-range-picker')); latepoint_init_monthly_view(); latepoint_init_form_blocks(); latepoint_init_reminders_form(); latepoint_init_coupons_form(); latepoint_init_copy_on_click_elements(); latepoint_init_side_menu(); latepoint_init_color_picker(); latepoint_init_clickable_cells(); latepoint_init_input_masks(); latepoint_init_process_forms(); latepoint_init_sticky_side_menu(); latepoint_init_sortable_columns(); latepoint_init_accordions(); latepoint_init_default_form_fields_settings(); latepoint_init_steps_settings(); latepoint_init_booking_form_preview(); latepoint_init_sticky_side_nav(); latepoint_init_version5_intro(); jQuery(document).on({ mouseenter: function () { let $elem = jQuery(this); let offset = $elem.offset(); jQuery('body > .late-tooltip').remove(); let $popup = jQuery('<div/>').addClass('late-tooltip').text($elem.data('late-tooltip')).appendTo(jQuery('body')); $popup.css('top', offset.top - 2); $popup.css('left', offset.left + $elem.outerWidth() / 2); return false; }, mouseleave: function () { jQuery('body > .late-tooltip').remove(); } }, "[data-late-tooltip]"); jQuery('body').on('click', '.disabled-items-open-trigger', function(){ jQuery('.disabled-items-wrapper').toggleClass('is-open'); return false; }); jQuery('body').on('click', '.latepoint-side-panel-close', function(){ jQuery('.side-sub-panel-wrapper').remove(); return false; }); jQuery('#settings_list_of_phone_countries').on('change', function(){ if(jQuery(this).val() == latepoint_helper.value_all){ jQuery('.select-phone-countries-wrapper').hide(); }else{ jQuery('.select-phone-countries-wrapper').show(); } }); jQuery('.os-select-all-toggler').on('change', function(){ var $connection_wrappers = jQuery(this).closest('.white-box').find('.os-complex-connections-selector .connection'); if(jQuery(this).is(':checked')){ latepoint_complex_selector_select($connection_wrappers); }else{ latepoint_complex_selector_deselect($connection_wrappers); } return false; }); jQuery('.os-main-location-selector').on('change', function(){ var route = jQuery(this).data('route'); var params = 'id=' + jQuery(this).val(); var data = { action: latepoint_helper.route_action, route_name: route, params: params, layout: 'none', return_format: 'json' }; jQuery('.latepoint-content-w').addClass('os-loading'); jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(data){ location.reload(); } }); }); jQuery('.os-service-durations-w').on('click', '.os-remove-duration', function(){ jQuery(this).closest('.duration-box').slideUp(300, function(){ jQuery(this).remove(); }); return false; }); jQuery('.menu-color-toggler').on('click', function(){ jQuery('.latepoint-side-menu-w').toggleClass('dark'); return false; }); jQuery('.latepoint-mobile-top-menu-trigger').on('click', function(){ jQuery(this).closest('.latepoint-all-wrapper').toggleClass('os-show-mobile-menu'); if(jQuery(this).closest('.latepoint-all-wrapper').hasClass('os-show-mobile-menu')){ jQuery('.latepoint-side-menu-w ul.side-menu > li.has-children > a').on('click', function(){ jQuery(this).closest('li').toggleClass('menu-item-sub-open-mobile'); return false; }); }else{ jQuery('.latepoint-side-menu-w ul.side-menu > li.has-children > a').off('click'); } return false; }); jQuery('.latepoint-mobile-top-search-trigger-cancel').on('click', function(){ jQuery(this).closest('.latepoint-all-wrapper').removeClass('os-show-mobile-search'); return false; }); jQuery('.latepoint-mobile-top-search-trigger').on('click', function(){ jQuery(this).closest('.latepoint-all-wrapper').toggleClass('os-show-mobile-search'); if(jQuery(this).closest('.latepoint-all-wrapper').hasClass('os-show-mobile-search')){ jQuery('.latepoint-top-search').trigger('focus'); } return false; }); jQuery('.latepoint-top-bar-w').on('click', '.top-user-info-toggler', function(){ jQuery('.latepoint-user-info-dropdown').toggleClass('os-visible'); return false; }); jQuery('.latepoint-content').on('click', '.mobile-calendar-actions-trigger', function(){ jQuery(this).closest('.calendar-mobile-controls').toggleClass('os-show-actions'); return false; }); jQuery('.latepoint-content').on('click', '.os-widget-header-actions-trigger', function(){ jQuery(this).closest('.os-widget-header').toggleClass('os-show-actions'); return false; }); jQuery('.latepoint-content').on('click', '.mobile-table-actions-trigger', function(){ jQuery(this).closest('.os-pagination-w').toggleClass('os-show-actions'); return false; }); jQuery('.download-csv-with-filters').on('click', function(){ var filter_params = jQuery(this).closest('.table-with-pagination-w').find('.os-table-filter').serialize(); filter_params+= '&download=csv'; jQuery(this).attr('href', this.href + '&' + filter_params); }); jQuery('select.pagination-page-select').on('change', function(){ latepoint_filter_table(jQuery(this).closest('.table-with-pagination-w').find('table'), jQuery(this).closest('.pagination-page-select-w'), false); }); jQuery('select.os-table-filter').on('change', function(){ latepoint_filter_table(jQuery(this).closest('table'), jQuery(this).closest('.os-form-group')); }); jQuery('input.os-table-filter').on('keyup', function(){ latepoint_filter_table(jQuery(this).closest('table'), jQuery(this).closest('.os-form-group')); }); jQuery('.customize-connection-btn').on('click', function(){ jQuery(this).closest('.connection').toggleClass('show-customize-box'); return false; }); jQuery('.connection-children-list').on('click', 'li', function(){ if(jQuery(this).hasClass('active')){ jQuery(this).removeClass('active'); jQuery(this).find('input.connection-child-is-connected').val('no'); }else{ jQuery(this).addClass('active'); jQuery(this).find('input.connection-child-is-connected').val('yes'); } latepoint_count_active_connections(jQuery(this).closest('.connection')); return false; }); jQuery('.display-toggler-control').on('change', function(){ let group = jQuery(this).data('toggler-group'); let key = jQuery(this).val(); jQuery('.display-toggler-target[data-toggler-group="' + group + '"]').hide(); jQuery('.display-toggler-target[data-toggler-group="' + group + '"][data-toggler-key="'+ key +'"]').show(); return false; }); jQuery('.add-item-category-trigger').on('click', function(){ jQuery('.add-item-category-box').toggle(); jQuery('.os-new-item-category-form-w').toggle(); return false; }); jQuery('.latepoint-top-search').on('keyup', function(event){ var $wrapper = jQuery(this).closest('.latepoint-top-search-w'); $wrapper.addClass('os-loading'); var query = jQuery(this).val(); if(event.keyCode == 27){ $wrapper.removeClass('typing'); jQuery('.latepoint-top-search-results-w').html(''); jQuery(this).val(''); $wrapper.removeClass('os-loading'); return; } if(query == ''){ $wrapper.removeClass('typing'); jQuery('.latepoint-top-search-results-w').html(''); $wrapper.removeClass('os-loading'); return; } var route = jQuery(this).data('route'); var params = 'query=' + query; var data = { action: latepoint_helper.route_action, route_name: route, params: params, layout: 'none', return_format: 'json' }; $wrapper.addClass('typing'); jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(data){ if(!$wrapper.hasClass('typing')) return; $wrapper.removeClass('os-loading'); if(data.status === "success"){ jQuery('.latepoint-top-search-results-w').html(data.message); }else{ // console.log(data.message); } } }); }); jQuery('.appointment-status-selector').on('click', function(e){ e.stopPropagation(); }); jQuery('.latepoint-show-license-details').on('click', function(e){ jQuery(this).closest('.active-license-info').find('.license-info-w').slideToggle(200); return false; }); jQuery('.aba-button-w').on('click', function(e){ e.stopPropagation(); var confirm_message = (jQuery(this).hasClass('aba-approve')) ? latepoint_helper.approve_confirm : latepoint_helper.reject_confirm; if(confirm(confirm_message)){ var $box = jQuery(this).closest('.appointment-box-large'); $box.find('.appointment-status-selector select').val(jQuery(this).data('status')).trigger('change'); } return false; }); jQuery('.appointment-status-selector select').on('change', function(e){ var $wrapper = jQuery(this).closest('.appointment-status-selector'); var route = $wrapper.data('route'); var nonce = $wrapper.data('wp-nonce'); var booking_id = $wrapper.data('booking-id'); var status = jQuery(this).val(); jQuery(this).closest('.appointment-box-large').attr('class', 'appointment-box-large status-' + status); var params = 'id=' + booking_id + '&status=' + status + '&_wpnonce=' + nonce; var data = { action: latepoint_helper.route_action, route_name: route, params: params, layout: 'none', return_format: 'json' }; jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(data){ if(data.status === "success"){ latepoint_add_notification(data.message); }else{ latepoint_add_notification(data.message, 'error'); // console.log(data.message); } } }); }); jQuery('body').on('click', '.open-template-variables-panel', function(){ jQuery('.latepoint-template-variables').toggleClass('is-visible'); return false; }); jQuery('body').on('click', '.close-template-variables-panel', function(){ jQuery('.latepoint-template-variables').removeClass('is-visible'); return false; }); jQuery('body').on('click', '.open-layout-template-variables-panel', function(){ jQuery('.latepoint-layout-template-variables').toggleClass('is-visible'); return false; }); jQuery('body').on('click', '.close-layout-template-variables-panel', function(){ jQuery('.latepoint-layout-template-variables').removeClass('is-visible'); return false; }); jQuery('body').on('click', '.os-notifications .os-notification-close', function(){ jQuery(this).closest('.item').remove(); return false; }); jQuery('body').on('keyup', '.os-form-group .os-form-control', function(){ if(jQuery(this).val()){ jQuery(this).closest('.os-form-group').addClass('has-value'); }else{ jQuery(this).closest('.os-form-group').removeClass('has-value'); } }); jQuery('.os-wizard-setup-w, .latepoint-settings-w, .custom-schedule-wrapper').on('click', '.ws-head', function(){ var $schedule_wrapper = jQuery(this).closest('.weekday-schedule-w'); $schedule_wrapper.toggleClass('is-editing').removeClass('day-off'); $schedule_wrapper.find('.os-toggler').removeClass('off'); $schedule_wrapper.find('input.is-active').val(1); }); jQuery('body.latepoint').on('click', '.wizard-add-edit-item-trigger', function(e){ jQuery(this).addClass('os-loading'); var add_item_route_name = jQuery(this).data('route'); var item_info = { }; if(jQuery(this).data('id')){ item_info.id = jQuery(this).data('id'); } var data = { action: latepoint_helper.route_action, route_name: add_item_route_name, params: item_info, layout: 'none', return_format: 'json' }; jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(data){ jQuery('.wizard-add-edit-item-trigger.os-loading').removeClass('os-loading'); if(data.status === "success"){ jQuery('.os-wizard-step-content-i').html(data.message); jQuery('.os-wizard-setup-w').addClass('is-sub-editing'); jQuery('.os-wizard-footer').hide(); latepoint_init_wizard_content(); }else{ // console.log(data.message); } } }); }); jQuery('body.latepoint').on('click', '.os-wizard-trigger-next-btn', function(){ var $next_btn = jQuery(this); $next_btn.addClass('os-loading'); var current_step_code = jQuery('#wizard_current_step_code').val(); var params = 'current_step_code='+current_step_code; // work periods step if(jQuery('.os-wizard-setup-w form.weekday-schedules-w').length){ params+= '&'+ jQuery('.os-wizard-setup-w form.weekday-schedules-w .weekday-schedule-w:not(.day-off) input').serialize(); } // agent/notifications step if(jQuery('.os-wizard-default-agent-form').length){ params+= '&'+ jQuery('.os-wizard-default-agent-form input').serialize(); var $form = $('.os-wizard-default-agent-form'); var form_data = new FormData($form[0]); form_data.set('current_step_code', current_step_code); if (('lp_intlTelInputGlobals' in window) && ('lp_intlTelInputUtils' in window)) { // Get e164 formatted number from phone fields when form is submitted $form.find('input.os-mask-phone').each(function () { let telInstance = window.lp_intlTelInputGlobals.getInstance(this); if(telInstance){ const phoneInputName = this.getAttribute('name'); const phoneInputValue = window.lp_intlTelInputGlobals.getInstance(this).getNumber(window.lp_intlTelInputUtils.numberFormat.E164); form_data.set(phoneInputName, phoneInputValue); } }); } params = latepoint_formdata_to_url_encoded_string(form_data); } var data = { action: latepoint_helper.route_action, route_name: jQuery(this).data('route-name'), params: params, layout: 'none', return_format: 'json'}; jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(data){ $next_btn.removeClass('os-loading'); if(data.status === "success"){ jQuery('#wizard_current_step_code').val(data.step_code); jQuery('.os-wizard-setup-w').attr('class', 'os-wizard-setup-w step-' + data.step_code); jQuery('.os-wizard-step-content').html(data.message); latepoint_init_wizard_content(); if(data.show_prev_btn){ jQuery('.os-wizard-prev-btn').show(); }else{ jQuery('.os-wizard-prev-btn').hide(); } if(data.show_next_btn){ jQuery('.os-wizard-next-btn').show(); }else{ jQuery('.os-wizard-next-btn').hide(); } if(!data.show_next_btn && !data.show_prev_btn){ jQuery('.os-wizard-footer').hide(); }else{ jQuery('.os-wizard-footer').show(); } } } }); return false; }); // WIZARD PREV BUTTON CLICK LOGIC jQuery('body.latepoint').on('click', '.os-wizard-trigger-prev-btn', function(){ var $prev_btn = jQuery(this); $prev_btn.addClass('os-loading'); var current_step_code = jQuery('#wizard_current_step_code').val(); var params = 'current_step_code='+current_step_code; var data = { action: latepoint_helper.route_action, route_name: jQuery(this).data('route-name'), params: params, layout: 'none', return_format: 'json'}; jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(data){ $prev_btn.removeClass('os-loading'); if(data.status === "success"){ jQuery('#wizard_current_step_code').val(data.step_code); jQuery('.os-wizard-setup-w').attr('class', 'os-wizard-setup-w step-' + data.step_code); jQuery('.os-wizard-step-content').html(data.message); latepoint_init_wizard_content(); if(data.show_prev_btn){ jQuery('.os-wizard-prev-btn').show(); }else{ jQuery('.os-wizard-prev-btn').hide(); } if(data.show_next_btn){ jQuery('.os-wizard-next-btn').show(); }else{ jQuery('.os-wizard-next-btn').hide(); } if(!data.show_next_btn && !data.show_prev_btn){ jQuery('.os-wizard-footer').hide(); }else{ jQuery('.os-wizard-footer').show(); } } } }); return false; }); jQuery('.latepoint-content-w').on('change', '.os-widget .os-trigger-reload-widget', function(){ latepoint_reload_widget(jQuery(this).closest('.os-widget')); }); jQuery('.latepoint-content-w').on('click', '.os-widget .timeline-type-toggle .timeline-type-option', function(){ jQuery(this).closest('.timeline-type-toggle').find('.timeline-type-option.active').removeClass('active'); jQuery(this).addClass('active'); jQuery('.timeline-and-availability-contents').removeClass('shows-appointments shows-availability').addClass('shows-' + jQuery(this).data('value')); jQuery('#' + jQuery(this).closest('.timeline-type-toggle').data('value-holder-id')).val(jQuery(this).data('value')); }); dragula([].slice.apply(document.querySelectorAll('.os-categories-ordering-w .os-category-children')), { moves: function (el, container, handle) { return (handle.classList.contains('os-category-drag') || handle.classList.contains('os-category-item-drag')); }, }).on('drop', function(el){ var $categories_wrapper = jQuery('.os-categories-ordering-w'); var category_datas = []; var item_datas = []; $categories_wrapper.find('.os-category-parent-w').each(function(index){ var order_number = jQuery(this).index() + 1; var parent_id = jQuery(this).parent().closest('.os-category-parent-w').data('id') || 0; category_datas.push({id: jQuery(this).data('id'), order_number: order_number, parent_id: parent_id}); }); $categories_wrapper.find('.item-in-category-w').each(function(index){ var item_order_number = jQuery(this).index() + 1; var category_id = jQuery(this).closest('.os-category-parent-w').data('id') || 0; item_datas.push({id: jQuery(this).data('id'), order_number: item_order_number, category_id: category_id}); }); latepoint_recalculate_items_count_in_category(); var data = { action: latepoint_helper.route_action, route_name: $categories_wrapper.data('category-order-update-route'), params: {category_datas: category_datas, item_datas: item_datas}, return_format: 'json' } $categories_wrapper.addClass('os-loading'); jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $categories_wrapper.removeClass('os-loading'); if(response.status === "success"){ // latepoint_add_notification(response.message); }else{ alert(response.message); } } }); }); // Universal re-ordering dragging for form blocks dragula([jQuery('.os-draggable-form-blocks')[0]], { moves: function (el, container, handle) { return handle.classList.contains('os-form-block-drag'); }, }).on('drop', function(el){ var blocks_order_data = {}; var $draggable_form_blocks_wrapper = jQuery('.os-draggable-form-blocks'); $draggable_form_blocks_wrapper.find('.os-form-block').each(function(index){ var new_order_number = jQuery(this).index() + 1; var $block_model_id = jQuery(this).find('.os-form-block-id'); if($block_model_id.length && $block_model_id.val()) blocks_order_data[$block_model_id.val()] = new_order_number; }); var data = { action: latepoint_helper.route_action, route_name: $draggable_form_blocks_wrapper.data('order-update-route'), params: {ordered_fields: blocks_order_data, fields_for: $draggable_form_blocks_wrapper.data('fields-for')}, return_format: 'json' } $draggable_form_blocks_wrapper.addClass('os-loading'); jQuery.ajax({ type : "post", dataType : "json", url : latepoint_timestamped_ajaxurl(), data : data, success: function(response){ $draggable_form_blocks_wrapper.removeClass('os-loading'); } }); }); jQuery('body.latepoint-admin').on('click', '.os-category-edit-btn, .os-category-edit-cancel-btn, .os-category-w .os-category-name', function(){ jQuery(this).closest('.os-category-w').toggleClass('editing'); return false; }); jQuery('body.latepoint-admin').on('click', '.step-edit-btn, .step-edit-cancel-btn, .step-w .step-head', function(){ jQuery(this).closest('.step-w').toggleClass('editing'); return false; }); jQuery('body.latepoint-admin').on('click', '.agent-info-change-agent-btn', function(){ jQuery(this).closest('.agent-info-w').removeClass('selected').addClass('selecting'); return false; }); jQuery('body.latepoint-admin').on('click', '.agent-info-change-agent-btn', function(){ jQuery(this).closest('.agent-info-w').removeClass('selected').addClass('selecting'); return false; }); jQuery('body.latepoint-admin').on('click', '.customer-info-create-btn', function(){ jQuery(this).closest('.customer-info-w').removeClass('selecting').addClass('selected'); return false; }); jQuery('body.latepoint-admin').on('click', '.customer-info-load-btn', function(){ jQuery(this).closest('.customer-info-w').removeClass('selected').addClass('selecting').find('.customers-selector-search-input').trigger('focus'); return false; }); jQuery('body.latepoint-admin').on('click', '.customers-selector-cancel', function(){ jQuery(this).closest('.customer-info-w').removeClass('selecting').addClass('selected '); jQuery('.customers-options-list .customer-option').show(); jQuery('.customers-selector-search-input').val(''); return false; }); // CUSTOMER SELECTOR // SERVICES SELECTOR jQuery('body.latepoint-admin').on('click', '.service-option-selected', function(){ var $select = jQuery(this).closest('.os-services-select-field-w'); if($select.hasClass('active')){ $select.removeClass('active'); }else{ $select.addClass('active').find('input').trigger('focus'); } return false; }); jQuery('body.latepoint-admin').on('keyup', '.service-options-filter-input', function(){ var $list = jQuery(this).closest('.services-options-list'); var text = jQuery(this).val().toLowerCase(); $list.find('.service-option').hide(); // Search $list.find('.service-option').each(function(){ if(jQuery(this).text().toLowerCase().indexOf(""+text+"") != -1 ){ jQuery(this).show(); } }); return false; }); jQuery('.calendar-week-agent-w').on('click', '.calendar-load-target-date', function(event){ jQuery(this).addClass('os-loading'); latepoint_reload_week_view_calendar(jQuery(this).data('target-date')); return false; }); jQuery('.calendar-week-agent-w').on('change', '.cc-availability-toggler #overlay_service_availability', function(event){ if(jQuery(this).val() == 'on'){ jQuery('.calendar-week-agent-w .cc-service-selector').show(); }else{ jQuery('.calendar-week-agent-w .cc-service-selector').hide(); } latepoint_reload_week_view_calendar(); }); jQuery('.calendar-week-agent-w').on('change', '.trigger-weekly-calendar-reload', function(event){ latepoint_reload_week_view_calendar(); return false; }); jQuery('.latepoint-admin').on('click', '.os-complex-connections-selector .selector-trigger', function(e){ var $connection_wrapper = jQuery(this).closest('.connection'); if($connection_wrapper.hasClass('active')){ latepoint_complex_selector_deselect($connection_wrapper); jQuery(this).closest('.white-box').find('.os-select-all-toggler').prop('checked', false); }else{ latepoint_complex_selector_select($connection_wrapper); } return false; }); jQuery('.latepoint-admin').on('click', '.os-complex-connections-selector .item-quantity-selector', function(e){ let val = parseInt(jQuery(this).closest('.item-quantity-selector-w').find('.item-quantity-selector-input').val()); if(jQuery(this).data('sign') == 'plus'){ val = val + 1; }else{ val = val - 1; } val = (val > 0) ? val : 0; jQuery(this).closest('.item-quantity-selector-w').find('.item-quantity-selector-input').val(val).trigger('change'); return false; }); jQuery('.latepoint-admin').on('change', '.os-complex-connections-selector .item-quantity-selector-input', function(e){ let $this = jQuery(this); let $connection_wrapper = jQuery(this).closest('.connection'); if($this.val() > 0){ latepoint_complex_selector_select($connection_wrapper, $this.val()); }else{ latepoint_complex_selector_deselect($connection_wrapper); } return false; }); jQuery('.latepoint-admin').on('click', '.os-agents-selector .agent', function(){ if(jQuery(this).hasClass('active')){ jQuery(this).removeClass('active'); jQuery(this).find('.connection-child-is-connected').val('no'); }else{ jQuery(this).addClass('active'); jQuery(this).find('.connection-child-is-connected').val('yes'); } return false; }); jQuery('.latepoint-admin').on('click', '.os-services-selector .service', function(){ if(jQuery(this).hasClass('active')){ jQuery(this).removeClass('active'); jQuery(this).find('.connection-child-is-connected').val('no'); }else{ jQuery(this).addClass('active'); jQuery(this).find('.connection-child-is-connected').val('yes'); } return false; }); jQuery('.latepoint-admin').on( 'click', '.os-form-toggler-group', function( event ){ jQuery(this).find('.os-toggler').trigger('click'); return false; }); jQuery('.latepoint-admin').on( 'click', '.os-toggler', function( event ){ let $toggler = jQuery(this); if($toggler.data('confirm')){ if(!confirm($toggler.data('confirm'))) return false; } if($toggler.hasClass('on')){ $toggler.removeClass('on').addClass('off'); }else{ $toggler.removeClass('off').addClass('on'); } if($toggler.data('for')){ if($toggler.hasClass('os-toggler-radio')){ // radio // uncheck all radio buttons with the same name let $radio = jQuery('#' + $toggler.data('for')); jQuery('input[type="radio"][name="'+ $radio.prop('name') + '"]:checked').each(function(index){ let toggle_content_id = jQuery(this).prop('checked', false).closest('.os-toggler-w').find('.os-toggler.on').removeClass('on').addClass('off').data('controlled-toggle-id'); jQuery('#'+ toggle_content_id).hide(); }); $radio.prop('checked', !$toggler.hasClass('off')); }else{ var $hiddenInput = jQuery('input[type="hidden"]#' + $toggler.data('for')); if($hiddenInput.length){ // hidden input if($toggler.data('is-string-value')){ $hiddenInput.val($toggler.hasClass('off') ? 'off' : 'on').trigger('change'); }else{ $hiddenInput.val($toggler.hasClass('off') ? 0 : 1).trigger('change'); } if($toggler.data('os-instant-update')){ let data = new FormData(); let params = $hiddenInput.serialize(); if($toggler.data('nonce')) params+= '&_wpnonce='+$toggler.data('nonce'); data.append('params', params); data.append('action', latepoint_helper.route_action); data.append('route_name', $toggler.data('os-instant-update')); data.append('return_format', 'json'); jQuery.ajax({ type: "post", dataType: "json", processData: false, contentType: false, url: latepoint_timestamped_ajaxurl(), data: data, success: function (response) { } }); } }else{ // checkbox jQuery('#' + $toggler.data('for')).prop('checked', !$toggler.hasClass('off')); } } } if($toggler.data('controlled-toggle-id')){ if($toggler.hasClass('off')){ jQuery('#' + $toggler.data('controlled-toggle-id')).hide(); }else{ jQuery('#' + $toggler.data('controlled-toggle-id')).show(); } } if($toggler.data('negative-controlled-toggle-id')){ if($toggler.hasClass('off')){ jQuery('#' + $toggler.data('negative-controlled-toggle-id')).show(); }else{ jQuery('#' + $toggler.data('negative-controlled-toggle-id')).hide(); } } $toggler.trigger('ostoggler:toggle'); return false; }); // UPLOAD/REMOVE IMAGE LINK LOGIC jQuery('.latepoint-admin').on( 'click', '.os-image-selector-trigger', function( event ){ var frame; event.preventDefault(); var $image_uploader_trigger = jQuery(this); var $image_selector_w = jQuery(this).closest('.os-image-selector-w'); var $image_container = $image_selector_w.find('.os-image-container'); var $image_id_holder = $image_selector_w.find('.os-image-id-holder'); let is_avatar = $image_selector_w.hasClass('is-avatar'); var image_exists = is_avatar ? $image_container.find('.image-self').length : $image_container.find('img').length; if(image_exists){ $image_id_holder.val(''); $image_selector_w.removeClass('has-image'); $image_container.html(''); $image_uploader_trigger.find('.os-text-holder').text($image_uploader_trigger.data('label-set-str')); }else{ // If the media frame already exists, reopen it. if ( frame ) { frame.open(); return false; } // Create a new media frame frame = wp.media({ title: 'Select or Upload Media', button: { text: 'Use this media' }, multiple: false }); frame.on( 'select', function() { var attachment = frame.state().get('selection').first().toJSON(); if(is_avatar){ $image_container.html( '<div class="image-self" style="background-image: url('+attachment.url+')"></div>' ); }else{ $image_container.html( '<img src="'+attachment.url+'" alt=""/>' ); } $image_id_holder.val( attachment.id ); $image_selector_w.addClass('has-image'); $image_uploader_trigger.find('.os-text-holder').text($image_uploader_trigger.data('label-remove-str')); }); frame.open(); } return false; }); jQuery('.latepoint-admin').on('click', '.os-multiple-files-uploader a', function(event) { event.stopPropagation(); }); jQuery('.latepoint-admin').on('click', '.os-multiple-files-uploader', function(event) { var frame; event.preventDefault(); var $uploader_trigger = jQuery(this); var $uploader_wrapper = $uploader_trigger.closest('.os-multiple-files-uploader'); var $files_list = $uploader_wrapper.find('.os-uploaded-files-list'); var $file_ids_holder = $uploader_wrapper.find('.os-file-ids-holder'); // Create a new media frame frame = wp.media({ title: 'Select or Upload Files', button: { text: 'Add selected files' }, multiple: 'add' // Allows to select multiple files }); // When files are selected... frame.on('select', function() { var attachments = frame.state().get('selection').map(function(attachment) { attachment = attachment.toJSON(); return attachment; }); var current_ids = $file_ids_holder.val() ? $file_ids_holder.val().split(',') : []; attachments.forEach(function(attachment) { // Skip if file already added if(current_ids.indexOf(attachment.id.toString()) !== -1) return; // Add to IDs list current_ids.push(attachment.id); // Add to files list var $file_item = jQuery('<div class="os-uploaded-file" data-file-id="'+attachment.id+'">'); $file_item.append('<a class="os-file-link" href="'+attachment.url+'" target="_blank">'+attachment.filename+'</a>'); $file_item.append('<a href="#" class="os-remove-file" title="'+$uploader_trigger.data('label-remove-str')+'"><i class="latepoint-icon latepoint-icon-cross"></i></a>'); $files_list.append($file_item); }); // Update hidden field with all IDs $file_ids_holder.val(current_ids.join(',')); }); frame.open(); return false; }); jQuery('.latepoint-admin').on('click', '.os-remove-file', function(event) { event.preventDefault(); let $remove_btn = jQuery(this); const confirm_text = $remove_btn.closest('.os-uploaded-files-list').data('confirm-text') || 'Are you sure you want to remove this file?'; if (confirm(confirm_text)) { let $file_item = $remove_btn.closest('.os-uploaded-file'); let $file_ids_holder = $file_item.closest('.os-multiple-files-uploader').find('.os-file-ids-holder'); let file_id = $file_item.data('file-id'); let current_ids = $file_ids_holder.val() ? $file_ids_holder.val().split(',') : []; current_ids = current_ids.filter(function(id) { return id != file_id; }); $file_ids_holder.val(current_ids.join(',')); $file_item.remove(); } }); jQuery('body').on('click', '.latepoint-lightbox-close', function(){ latepoint_lightbox_close(); return false; }); jQuery('body').on('click', '.latepoint-side-panel-close-trigger', function(){ latepoint_close_side_panel(); return false; }); jQuery('body').on('click', '.latepoint-side-sub-panel-close-trigger', function(){ jQuery(this).closest('.side-sub-panel-wrapper').remove(); return false; }); jQuery('body.latepoint-admin').on('click', '.time-ampm-select', function(){ let $form = jQuery(this).closest('.order-item-booking-data-form-wrapper'); jQuery(this).closest('.time-ampm-w').find('.active').removeClass('active'); jQuery(this).addClass('active'); var ampm_value = jQuery(this).data('ampm-value'); jQuery(this).closest('.os-time-group').find('.ampm-value-hidden-holder').val(ampm_value); if(jQuery(this).closest('.quick-start-time-w').length){ // if called from quick edit form - we need to make sure it accurately changes time to next day if end time is earlier than start time latepoint_set_booking_end_time($form); latepoint_is_next_day($form); } if(jQuery(this).closest('.quick-end-time-w').length){ latepoint_is_next_day($form); } return false; }); jQuery('body.latepoint-admin').on('click', '.latepoint-lightbox-shadow', function(){ latepoint_lightbox_close(); return false; }); jQuery('body.latepoint-admin').on('click', '.latepoint-side-panel-shadow', function(){ jQuery('.latepoint-side-panel-w').remove(); return false; }); // SCHEDULE jQuery('body.latepoint-admin').on('click', '.ws-period-remove', function(e){ jQuery(this).closest('.ws-period').remove(); return false; }); jQuery('.latepoint-admin').on( 'click', '.weekday-schedule-w .os-toggler', function( event ){ if(jQuery(this).hasClass('off')){ jQuery(this).closest('.weekday-schedule-w').addClass('day-off').removeClass('is-editing').find('input.is-active').val(0); }else{ jQuery(this).closest('.weekday-schedule-w').removeClass('day-off').addClass('is-editing').find('input.is-active').val(1); } return false; }); });