/* * 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'); }