PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / 5.2.4
LatePoint – Calendar Booking Plugin for Appointments and Events v5.2.4
5.6.7 5.6.6 5.6.5 5.6.4 5.6.3 5.6.2 5.6.1 5.6.0 5.5.2 5.5.1 5.5.0 5.4.2 trunk 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.1.8 5.1.9 5.1.91 5.1.92 5.1.93 5.1.94 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1
latepoint / lib / assets / javascripts / bin / admin / main.js
latepoint / lib / assets / javascripts / bin / admin Last commit date
_agents.js 1 year ago _calendar.js 9 months ago _chart.js 9 months ago _customers.js 1 year ago _customers_import.js 9 months ago _orders.js 9 months ago _processes.js 1 year ago _steps.js 9 months ago _stripe_connect.js 1 year ago main.js 9 months ago updates.js 1 year ago
main.js
1097 lines
1 /*
2 * Copyright (c) 2022 LatePoint LLC. All rights reserved.
3 */
4
5 function latepoint_init_version5_intro(){
6 if(jQuery('.improvement-install-pro').length){
7 let $install_btn = jQuery('.improvement-install-pro');
8 var data = {
9 action: latepoint_helper.route_action,
10 route_name: $install_btn.data('route-name'),
11 params: {},
12 return_format: 'json'
13 }
14 jQuery.ajax({
15 type : "post",
16 dataType : "json",
17 url : latepoint_timestamped_ajaxurl(),
18 data : data,
19 success: function(response){
20 $install_btn.removeClass('os-loading');
21 if(response.status == 'success'){
22 $install_btn.addClass('is-installed').find('span').html(response.message);
23 }else{
24 $install_btn.addClass('is-not-installed').find('span').html(response.message);
25 }
26 }
27 });
28 }
29 }
30
31
32 function latepoint_settings_customer_authentication_method_changed($select){
33 if($select.val() === 'password_or_otp'){
34 jQuery('#authDefaultMethod').show();
35 }else{
36 jQuery('#authDefaultMethod').hide();
37 }
38 }
39
40 function latepoint_settings_customer_authentication_field_type_changed($select){
41 if($select.val() === 'disabled'){
42 jQuery('#passwordFields, #customerStepSettings').hide();
43 jQuery('#authDefaultMergeBehavior').show();
44 }else{
45 jQuery('#passwordFields, #customerStepSettings').show();
46 jQuery('#authDefaultMergeBehavior').hide();
47 }
48 if($select.val() === 'email_or_phone'){
49 jQuery('#authDefaultContactType').show();
50 }else{
51 jQuery('#authDefaultContactType').hide();
52 }
53 }
54
55 function latepoint_init_sticky_side_nav(){
56 jQuery('.latepoint-page-side-nav a').on('click', function(e) {
57 e.preventDefault();
58 let target = jQuery(this).attr('href');
59 let targetOffset = jQuery(target).offset().top - 20;
60
61 jQuery('html, body').animate({
62 scrollTop: targetOffset
63 }, 400, 'swing');
64 });
65 if(jQuery('.latepoint-page-side-nav').length){
66 jQuery(window).on('scroll', function() {
67 let scrollPos = jQuery(window).scrollTop() + 100; // 100px offset for better UX
68
69 jQuery('.section-anchor').each(function() {
70 let sectionTop = jQuery(this).offset().top;
71 let sectionBottom = sectionTop + jQuery(this).outerHeight();
72 let sectionId = jQuery(this).attr('id');
73
74 // Check if current scroll position is within this section
75 if (scrollPos >= sectionTop && scrollPos < sectionBottom) {
76 // Remove active class from all menu items
77 jQuery('.latepoint-page-side-nav a').removeClass('is-active');
78
79 // Add active class to current section's menu item
80 jQuery('.latepoint-page-side-nav a[href="#' + sectionId + '"]').addClass('is-active');
81 }
82 });
83 });
84 }
85 }
86
87 function latepoint_init_instant_booking_settings(){
88
89 jQuery('.instant-copy-url').on('click', function(e){
90 e.preventDefault();
91 let $this = jQuery(this);
92 jQuery('body').find('.os-click-to-copy-prompt').hide();
93 let text_to_copy = jQuery('.instant-visit-url').prop('href');
94 navigator.clipboard.writeText(text_to_copy);
95
96 let position_info = $this.offset();
97 let position_left = position_info.left;
98 let position_top = position_info.top;
99
100 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>');
101 $done_prompt.appendTo(jQuery('body')).animate({
102 opacity: 0,
103 left: (position_left + 20),
104 }, 600);
105 setTimeout(function(){
106 jQuery('body').find('.os-click-to-copy-done').remove();
107 jQuery('body').find('.os-click-to-copy-prompt').show();
108 }, 800);
109 });
110
111 jQuery('.instant-booking-preview-settings-content').find('select, input').on('change', function(){
112 latepoint_build_url_for_instant_booking_page();
113 })
114 jQuery('.preview-background-option').on('click', function(e){
115 jQuery('.preview-background-option').removeClass('selected');
116 jQuery(this).addClass('selected');
117 jQuery('input[name="instant_booking[background_pattern]"]').val(jQuery(this).data('pattern-key')).trigger('change');
118 });
119
120 jQuery('.latepoint-instant-preview-close-trigger').on('click', function(e){
121 jQuery('.latepoint-full-panel-w').remove();
122 return false;
123 });
124
125 }
126
127 async function latepoint_build_url_for_instant_booking_page(){
128 let data = {
129 action: 'latepoint_route_call',
130 route_name: jQuery('.instant-booking-preview-settings-content').data('route-name'),
131 params: jQuery('.instant-booking-preview-settings-content').find('select, input').serialize(),
132 layout: 'none',
133 return_format: 'json'
134 }
135 try {
136 let response = await jQuery.ajax({
137 type: "post",
138 dataType: "json",
139 url: latepoint_timestamped_ajaxurl(),
140 data: data
141 });
142 if (response.status == 'success') {
143 jQuery('.instant-booking-settings-iframe-wrapper').html('<iframe class="instant-preview-iframe" src="' + response.message + '"/>');
144 jQuery('.instant-visit-url').attr('href', response.message);
145 } else {
146 throw new Error('Error: ' + response.message);
147 }
148 } catch (e) {
149 throw e;
150 }
151 }
152
153 function latepoint_build_and_save_step_order(){
154 var $steps_wrapper = jQuery('.os-ordered-steps');
155 let steps_in_order = [];
156 $steps_wrapper.find('.os-ordered-step').each(function(index){
157 if(jQuery(this).find('.os-ordered-step-children').length){
158 jQuery(this).find('.os-ordered-step-child').each(function(){
159 steps_in_order.push(jQuery(this).data('step-code'));
160 });
161 }else{
162 steps_in_order.push(jQuery(this).data('step-code'));
163 }
164 });
165 var data = { action: latepoint_helper.route_action, route_name: $steps_wrapper.data('route-name'), params: {steps_order: steps_in_order.join(',')}, return_format: 'json' }
166 jQuery('.latepoint-lightbox-heading').addClass('os-loading');
167 jQuery.ajax({
168 type : "post",
169 dataType : "json",
170 url : latepoint_timestamped_ajaxurl(),
171 data : data,
172 success: function(response){
173 jQuery('.latepoint-lightbox-heading').removeClass('os-loading');
174 latepoint_add_lightbox_notification(response.message, response.status);
175 }
176 });
177 }
178
179 function latepoint_init_step_reordering(){
180 jQuery('.os-ordered-step-expand').on('click', function(){
181 jQuery(this).closest('.os-ordered-step').toggleClass('is-expanded');
182 return false;
183 });
184
185
186 // Steps Order Dragging
187 dragula([jQuery('.os-ordered-steps')[0]], {
188 moves: function (el, container, handle) {
189 return handle.classList.contains('os-ordered-step-drag-handle');
190 },
191 }).on('drop', function(el){
192 latepoint_build_and_save_step_order();
193 });
194
195 jQuery('.os-ordered-step-children').each(function(){
196 let step_holder = jQuery(this)
197 // Child steps Order Dragging
198 dragula([step_holder[0]], {
199 moves: function (el, container, handle) {
200 return handle.classList.contains('os-ordered-step-child-drag-handle');
201 },
202 }).on('drop', function(el){
203 latepoint_build_and_save_step_order();
204 });
205 });
206 }
207
208
209 function latepoint_init_json_view($pre_element = false){
210 if(!$pre_element){
211 // if pre is not provided -search for all unitialised ones
212 $pre_element = jQuery('pre.format-json:not(.json-document)');
213 }
214 if($pre_element.length){
215 $pre_element.each(function(){
216 let json_data = JSON.parse(jQuery(this).html());
217 jQuery(this).jsonViewer(json_data);
218 });
219 }
220 }
221
222 function latepoint_init_accordions(){
223 jQuery('.latepoint-admin').on('click', '.os-accordion-title', function(){
224 jQuery(this).closest('.os-accordion-wrapper').toggleClass('is-open');
225 return false;
226 });
227 }
228
229
230 function latepoint_init_sticky_side_menu(){
231 jQuery('.os-sticky-side-menu a').on('click', function(){
232 jQuery('.os-sticky-side-menu li.os-active').removeClass('os-active');
233 jQuery(this).closest('li').addClass('os-active');
234 let section_anchor = jQuery(this).data('section-anchor');
235 let position = jQuery('.section-anchor#'+section_anchor).offset();
236 jQuery('html').animate({ scrollTop: position.top }, 300);
237 return false;
238 });
239 }
240
241 function latepoint_init_template_library(){
242 jQuery('.os-templates-wrapper .template-type-selector').on('click', function(){
243 jQuery(this).toggleClass('is-selected');
244 let user_type = jQuery(this).data('user-type');
245 jQuery('.os-template-items[data-user-type="'+user_type+'"]').toggleClass('hidden');
246 return false;
247 });
248
249 jQuery('.os-templates-wrapper .os-template-item').on('click', function(){
250 let $this = jQuery(this);
251 $this.closest('.os-templates-list').find('.os-template-item.selected').removeClass('selected');
252 $this.addClass('selected');
253 let templateId = $this.data('id');
254 jQuery('.os-template-preview').hide();
255 jQuery('.os-template-preview[data-id="'+ templateId+'"]').show();
256 jQuery('.os-no-template-selected-message').hide();
257 jQuery('.os-template-use-button-wrapper').removeClass('hidden');
258 return false;
259 });
260
261 jQuery('.latepoint-select-template-btn').on('click', function(){
262 let $btn = jQuery(this);
263 let route_name = $btn.data('route');
264 let action_id = $btn.data('action-id');
265 let process_id = $btn.data('process-id');
266 let action_type = $btn.data('action-type');
267 $btn.addClass('os-loading');
268
269 let data = { action: latepoint_helper.route_action,
270 route_name: route_name,
271 params: {
272 template_id: jQuery('.os-template-item.selected').data('id'),
273 action_id: action_id,
274 process_id: process_id,
275 action_type: action_type
276 },
277 return_format: 'json' }
278 jQuery.ajax({
279 type: 'post',
280 dataType : "json",
281 url : latepoint_timestamped_ajaxurl(),
282 data : data,
283 success: (response) => {
284 $btn.removeClass('os-loading');
285 if(response.status === latepoint_helper.response_status.success){
286 let $action_form = jQuery('.process-action-form[data-id="'+action_id+'"]');
287 $action_form.find('.process-action-settings').html(response.message);
288 latepoint_init_process_action_form($action_form);
289 latepoint_close_side_panel();
290 }else{
291 alert("Error!");
292 }
293 }
294 });
295
296 return false;
297 });
298 }
299
300 function latepoint_init_default_form_fields_settings(){
301
302 if(jQuery('.os-default-fields').length){
303 jQuery('.os-default-field input[type="checkbox"], .os-default-field select').on('change', (event) => {
304 latepoint_update_default_form_fields_settings();
305 });
306
307 jQuery('.os-default-field .os-toggler').on('ostoggler:toggle', (event) => {
308 if(jQuery(event.currentTarget).hasClass('off')){
309 jQuery(event.currentTarget).closest('.os-default-field').addClass('is-disabled');
310 }else{
311 jQuery(event.currentTarget).closest('.os-default-field').removeClass('is-disabled');
312 }
313 latepoint_update_default_form_fields_settings();
314 });
315 }
316 }
317
318 function latepoint_update_default_form_fields_settings(){
319 var $wrapper = jQuery('.os-default-fields');
320
321 var form_data = new FormData($wrapper.find('form')[0]);
322 var data = { action: latepoint_helper.route_action,
323 route_name: $wrapper.data('route'),
324 params: latepoint_formdata_to_url_encoded_string(form_data),
325 return_format: 'json' }
326
327 jQuery.ajax({
328 type : "post",
329 dataType : "json",
330 url : latepoint_timestamped_ajaxurl(),
331 data : data,
332 success: (response) => {
333 latepoint_add_notification(response.message);
334 }
335 });
336 }
337
338 function latepoint_init_side_menu(){
339 jQuery('.menu-toggler').on('click', function(){
340 let layout_style = 'full';
341 if(jQuery('.latepoint-side-menu-w').hasClass('side-menu-full')){
342 layout_style = 'compact';
343 jQuery('.latepoint-side-menu-w').addClass('side-menu-compact').removeClass('side-menu-full');
344 }else{
345 jQuery('.latepoint-side-menu-w').addClass('side-menu-full').removeClass('side-menu-compact');
346 }
347 let route_name = jQuery(this).data('route');
348 let data = { action: latepoint_helper.route_action, route_name: route_name, params: { menu_layout_style: layout_style }, layout: 'none', return_format: 'json' }
349 jQuery.ajax({
350 type : "post",
351 dataType : "json",
352 url : latepoint_timestamped_ajaxurl(),
353 data : data,
354 success: function(data){
355 }
356 });
357 return false;
358 });
359 }
360
361 function latepoint_init_grouped_bookings_form(){
362
363 }
364
365 function latepoint_quick_order_customer_cleared(){
366 latepoint_init_input_masks(jQuery('.quick-order-form-w .customer-quick-edit-form-w'));
367 }
368
369 function latepoint_quick_order_customer_selected(){
370 latepoint_init_input_masks(jQuery('.quick-order-form-w .customer-quick-edit-form-w'));
371 jQuery('.customer-info-w').removeClass('selecting').addClass('selected');
372 }
373
374 function latepoint_custom_day_removed($elem){
375 $elem.closest('.custom-day-work-period').fadeOut(300, function(){ jQuery(this).remove()});
376 }
377
378
379 function latepoint_count_active_connections($connection_wrapper){
380 var connected_services_count = $connection_wrapper.find('.connection-children-list li.active').length;
381 var all_services_count = $connection_wrapper.find('.connection-children-list li').length;
382 if(connected_services_count == all_services_count){
383 connected_services_count = jQuery('.selected-connections').data('all-text');
384 jQuery('.selected-connections').removeClass('not-all-selected');
385 }else{
386 connected_services_count = connected_services_count + '/' + all_services_count;
387 jQuery('.selected-connections').addClass('not-all-selected');
388 $connection_wrapper.closest('.white-box').find('.os-select-all-toggler').prop('checked', false);
389 }
390 $connection_wrapper.find('.selected-connections strong').text(connected_services_count);
391 }
392
393 function latepoint_custom_field_removed($elem){
394 $elem.closest('.os-form-block').remove();
395 }
396
397 function latepoint_coupon_removed($elem){
398 $elem.closest('.os-coupon-form').remove();
399 }
400
401 function latepoint_reminder_removed($elem){
402 $elem.closest('.os-reminder-form').remove();
403 }
404
405 function latepoint_init_form_blocks(){
406 jQuery('.latepoint-content-w').on('click', '.os-form-block-header', function(){
407 jQuery(this).closest('.os-form-block').toggleClass('os-is-editing');
408 return false;
409 });
410 jQuery('.latepoint-content-w').on('keyup', '.os-form-block-name-input', function(){
411 jQuery(this).closest('.os-form-block').find('.os-form-block-name').text(jQuery(this).val());
412 });
413 }
414
415
416 function latepoint_init_coupons_form(){
417 jQuery('.latepoint-content-w').on('click', '.os-coupon-form-info', function(){
418 jQuery(this).closest('.os-coupon-form').toggleClass('os-is-editing');
419 return false;
420 });
421 jQuery('.latepoint-content-w').on('change', 'select.os-coupon-medium-select', function(){
422 if(jQuery(this).val() == 'email'){
423 jQuery(this).closest('.os-coupon-form').find('.os-coupon-email-subject').show();
424 }else{
425 jQuery(this).closest('.os-coupon-form').find('.os-coupon-email-subject').hide();
426 }
427 });
428 jQuery('.latepoint-content-w').on('keyup', '.os-coupon-name-input', function(){
429 jQuery(this).closest('.os-coupon-form').find('.os-coupon-name').text(jQuery(this).val());
430 });
431 jQuery('.latepoint-content-w').on('keyup', '.os-coupon-code-input', function(){
432 jQuery(this).closest('.os-coupon-form').find('.os-coupon-code').text(jQuery(this).val());
433 });
434 }
435
436 function latepoint_init_reminders_form(){
437 jQuery('.latepoint-content-w').on('click', '.os-reminder-form-info', function(){
438 jQuery(this).closest('.os-reminder-form').toggleClass('os-is-editing');
439 return false;
440 });
441 jQuery('.latepoint-content-w').on('change', 'select.os-reminder-medium-select', function(){
442 if(jQuery(this).val() == 'email'){
443 jQuery(this).closest('.os-reminder-form').find('.os-reminder-email-subject').show();
444 }else{
445 jQuery(this).closest('.os-reminder-form').find('.os-reminder-email-subject').hide();
446 }
447 });
448 jQuery('.latepoint-content-w').on('keyup', '.os-reminder-name-input', function(){
449 jQuery(this).closest('.os-reminder-form').find('.os-reminder-name').text(jQuery(this).val());
450 });
451 }
452
453 function latepoint_custom_field_saved($elem){
454 }
455
456 function latepoint_init_custom_day_schedule(){
457 latepoint_init_input_masks(jQuery('.latepoint-lightbox-w .custom-day-schedule-w'));
458
459 jQuery('.period-type-selector').on('change', function(){
460 jQuery(this).closest('.custom-day-calendar').attr('data-period-type', jQuery(this).val());
461 jQuery('.custom-day-calendar').attr('data-picking', 'start').data('picking', 'start');
462 if(jQuery(this).val() == 'range'){
463 jQuery('.custom-day-calendar-head .calendar-heading').text(jQuery('.custom-day-calendar-head .calendar-heading').data('label-start'));
464 jQuery('.custom-day-calendar #start_custom_date').trigger('focus');
465 }else{
466 jQuery('.custom-day-calendar .os-day.selected').removeClass('selected');
467 jQuery('.latepoint-lightbox-footer').hide();
468 jQuery('.custom-day-calendar-head .calendar-heading').text(jQuery('.custom-day-calendar-head .calendar-heading').data('label-single'));
469 }
470 });
471
472
473 jQuery('#custom_day_calendar_month, #custom_day_calendar_year').on('change', function(){
474 var $calendar = jQuery('.custom-day-calendar-month');
475 var route_name = $calendar.data('route');
476 $calendar.addClass('os-loading');
477 var target_date_string = jQuery('#custom_day_calendar_year').val() + '-' + jQuery('#custom_day_calendar_month').val() + '-01';
478 var data = { action: latepoint_helper.route_action, route_name: route_name, params: { target_date_string: target_date_string }, layout: 'none', return_format: 'json' }
479 jQuery.ajax({
480 type : "post",
481 dataType : "json",
482 url : latepoint_timestamped_ajaxurl(),
483 data : data,
484 success: function(data){
485 $calendar.removeClass('os-loading');
486 if(data.status === "success"){
487 $calendar.html(data.message);
488 }else{
489 // console.log(data.message);
490 }
491 }
492 });
493 });
494
495
496
497 jQuery('.custom-day-calendar').on('focus', '#start_custom_date', function(){
498 jQuery('.custom-day-calendar-head .calendar-heading').text(jQuery('.custom-day-calendar-head .calendar-heading').data('label-start'));
499 jQuery('.custom-day-calendar').attr('data-picking', 'start').data('picking', 'start');
500 });
501
502 jQuery('.custom-day-calendar').on('focus', '#end_custom_date', function(){
503 jQuery('.custom-day-calendar-head .calendar-heading').text(jQuery('.custom-day-calendar-head .calendar-heading').data('label-end'));
504 jQuery('.custom-day-calendar').attr('data-picking', 'end').data('picking', 'end');
505 });
506
507 jQuery('.custom-day-calendar').on('click', '.os-day', function(){
508 var $this = jQuery(this);
509 $this.closest('.custom-day-calendar').find('.os-day.selected').removeClass('selected');
510 $this.addClass('selected');
511
512 if(jQuery('.custom-day-calendar').data('picking') == 'start'){
513 jQuery('.custom-day-settings-w #start_custom_date').val($this.data('date')).trigger('keyup');
514 if(jQuery('.period-type-selector').val() == 'range'){
515 jQuery('.custom-day-calendar #end_custom_date').trigger('focus');
516 if(!jQuery('.custom-day-calendar #end_custom_date').val()) return false;
517 }
518 }else{
519 jQuery('.custom-day-settings-w #end_custom_date').val($this.data('date')).trigger('keyup');
520 }
521 jQuery('.latepoint-lightbox-footer').slideDown(200);
522 if(jQuery('.custom-day-calendar').data('show-schedule') == 'yes') jQuery('.latepoint-lightbox-w').removeClass('hide-schedule');
523 return false;
524 });
525 }
526
527 function latepoint_init_updates_page(){
528
529 }
530
531 function latepoint_calendar_set_month_label(){
532 jQuery('.os-current-month-label .current-month').text(jQuery('.os-monthly-calendar-days-w.active').data('calendar-month-label'));
533 jQuery('.os-current-month-label .current-year').text(jQuery('.os-monthly-calendar-days-w.active').data('calendar-year'));
534 }
535
536
537 function latepoint_init_element_togglers(){
538 jQuery('[data-toggle-element]').on('click', function(){
539 var $this = jQuery(this);
540 $this.closest('.os-form-checkbox-group').toggleClass('is-checked');
541 jQuery($this.data('toggle-element')).toggle();
542 });
543 }
544
545
546 function latepoint_init_color_picker(){
547 if(jQuery('.latepoint-color-picker').length){
548 jQuery('.latepoint-color-picker').each(function(){
549 var color = jQuery(this).data('color');
550 var picker = jQuery(this)[0];
551 var $picker_wrapper = jQuery(this).closest('.latepoint-color-picker-w');
552 Pickr.create({
553 el: picker,
554 default: color,
555 comparison: false,
556 useAsButton: true,
557 components: {
558
559 // Main components
560 preview: false,
561 opacity: false,
562 hue: true,
563
564 // Input / output Options
565 interaction: {
566 input: false,
567 clear: false,
568 save: true
569 }
570 },
571 onChange(hsva, instance) {
572 $picker_wrapper.find('.os-form-control').val(hsva.toHEX().toString());
573 },
574 });
575 });
576 }
577 }
578
579
580 function latepoint_lightbox_close(){
581 jQuery('body').removeClass('latepoint-lightbox-active');
582 jQuery('.latepoint-lightbox-w').remove();
583 }
584
585 function latepoint_reload_select_service_categories(){
586 jQuery('.service-selector-adder-field-w').each(function(){
587 var $trigger_elem = jQuery(this);
588 var route = jQuery('.service-selector-adder-field-w').find('select').data('select-source');
589 var data = { action: latepoint_helper.route_action, route_name: route, params: '', return_format: 'json' }
590 jQuery.ajax({
591 type : "post",
592 dataType : "json",
593 url : latepoint_timestamped_ajaxurl(),
594 data : data,
595 success: function(response){
596 $trigger_elem.removeClass('os-loading');
597 if(response.status === "success"){
598 latepoint_lightbox_close();
599 $trigger_elem.find('select').html(response.message);
600 $trigger_elem.find('select option:last').attr('selected', 'selected');
601 }else{
602 alert(response.message, 'error');
603 }
604 }
605 });
606 });
607 }
608
609 function latepoint_wizard_item_editing_cancelled(response){
610 jQuery('.os-wizard-setup-w').removeClass('is-sub-editing');
611 jQuery('.os-wizard-footer').show();
612 jQuery('.os-wizard-footer .os-wizard-next-btn').show();
613 if(response.show_prev_btn){
614 jQuery('.os-wizard-footer .os-wizard-prev-btn').show();
615 }
616 }
617
618
619 function latepoint_reload_week_view_calendar(start_date = false){
620 var service_id = (jQuery('.cc-availability-toggler #overlay_service_availability').val() == 'on') ? jQuery('.calendar-service-selector').val() : false;
621 var agent_id = jQuery('.calendar-agent-selector').val();
622 var location_id = jQuery('.calendar-location-selector').val();
623 var calendar_start_date = (start_date) ? start_date : jQuery('.calendar-start-date').val();
624 latepoint_load_calendar(calendar_start_date, agent_id, location_id, service_id);
625 }
626
627 function latepoint_init_work_period_form(){
628 latepoint_mask_timefield(jQuery('.os-time-input-w .os-mask-time'));
629 }
630
631 function latepoint_close_side_panel(){
632 latepoint_close_quick_availability_form();
633 jQuery('.latepoint-side-panel-w').remove();
634 }
635
636 function reload_process_jobs_table(){
637 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'));
638 }
639
640
641 function latepoint_transaction_removed($trigger){
642 $trigger.closest('.quick-add-transaction-box-w').remove();
643 latepoint_reload_balance_and_payments();
644 }
645
646 function latepoint_reload_widget($widget_elem){
647 var form_data = $widget_elem.find('select, input').serialize();
648 var data = { action: latepoint_helper.route_action, route_name: $widget_elem.data('os-reload-action'), params: form_data, return_format: 'json' }
649 $widget_elem.addClass('os-loading');
650 jQuery.ajax({
651 type : "post",
652 dataType : "json",
653 url : latepoint_timestamped_ajaxurl(),
654 data : data,
655 success: function(response){
656 $widget_elem.removeClass('os-loading');
657 if(response.status === "success"){
658 var $updated_widget_elem = jQuery(response.message);
659 $updated_widget_elem.removeClass('os-widget-animated');
660 $widget_elem = $widget_elem.replaceWith($updated_widget_elem);
661 latepoint_init_daterangepicker($updated_widget_elem.find('.os-date-range-picker'));
662 if($widget_elem.hasClass('os-widget-top-agents')) latepoint_init_circles_charts();
663 if($widget_elem.hasClass('os-widget-daily-bookings')){
664 latepoint_init_daily_bookings_chart();
665 latepoint_init_donut_charts();
666 }
667 }else{
668 alert(response.message);
669 }
670 }
671 });
672 }
673
674 function latepoint_load_calendar(target_date, agent_id, location_id = false, service_id = false){
675 var route_name = jQuery('.calendar-week-agent-w').data('calendar-action');
676 jQuery('.calendar-week-agent-w').addClass('os-loading');
677 var params_arr = {target_date: target_date, agent_id: agent_id};
678 if(location_id) params_arr.location_id = location_id;
679 if(service_id) params_arr.service_id = service_id;
680 var data = { action: latepoint_helper.route_action, route_name: route_name, params: jQuery.param(params_arr), return_format: 'json' }
681 jQuery.ajax({
682 type : "post",
683 dataType : "json",
684 url : latepoint_timestamped_ajaxurl(),
685 data : data,
686 success: function(response){
687 if(response.status === "success"){
688 jQuery('.calendar-week-agent-w').html(response.message).removeClass('os-loading');
689 jQuery('.calendar-load-target-date.os-loading').removeClass('os-loading');
690 }else{
691 alert(response.message);
692 }
693 }
694 });
695 }
696
697 function latepoint_init_quick_transaction_form(){
698 latepoint_mask_money(jQuery('.quick-add-transaction-box-w .os-mask-money'));
699 }
700
701 function latepoint_reload_price_breakdown(){
702 var $trigger = jQuery('.reload-price-breakdown');
703 $trigger.addClass('os-loading');
704 var $quick_edit_form = $trigger.closest('form.order-quick-edit-form');
705 var form_data = new FormData($quick_edit_form[0]);
706 var route = $trigger.data('route');
707
708 var data = { action: latepoint_helper.route_action, route_name: route, params: latepoint_formdata_to_url_encoded_string(form_data), return_format: 'json' }
709 jQuery.ajax({
710 type : "post",
711 dataType : "json",
712 url : latepoint_timestamped_ajaxurl(),
713 data : data,
714 success: function(response){
715 $trigger.removeClass('os-loading');
716 if(response.status === "success"){
717 jQuery('.price-breakdown-wrapper').html(response.message);
718 latepoint_mask_money(jQuery('.price-breakdown-wrapper .os-mask-money'));
719 latepoint_reload_balance_and_payments();
720 }else{
721 alert(response.message);
722 }
723 }
724 });
725 }
726
727 function latepoint_complex_selector_select($connection_wrappers, qty = 1){
728 $connection_wrappers.each(function(){
729 jQuery(this).addClass('active');
730 jQuery(this).find('.connection-children-list li').addClass('active');
731 jQuery(this).find('.connection-child-is-connected').val('yes');
732 jQuery(this).find('.item-quantity-selector-input').val(qty);
733 latepoint_count_active_connections(jQuery(this));
734 });
735 }
736
737 function latepoint_complex_selector_deselect($connection_wrappers){
738 $connection_wrappers.each(function(){
739 jQuery(this).removeClass('active');
740 jQuery(this).removeClass('show-customize-box');
741 jQuery(this).find('.connection-children-list li.active').removeClass('active');
742 jQuery(this).find('.connection-child-is-connected').val('no');
743 jQuery(this).find('.item-quantity-selector-input').val(0);
744 latepoint_count_active_connections(jQuery(this));
745 });
746 }
747
748
749
750 function latepoint_is_next_day($form){
751 let field_base_name = 'order_items[' + $form.data('order-item-id') +'][bookings][' + $form.data('booking-id') +']';
752
753 var start_time = $form.find('input[name="' + field_base_name + '[start_time][formatted_value]"]').val();
754 var start_time_ampm = $form.find('input[name="' + field_base_name + '[start_time][ampm]"]').val();
755 var start_time_minutes = latepoint_hours_and_minutes_to_minutes(start_time, start_time_ampm);
756 var end_time = $form.find('input[name="' + field_base_name + '[end_time][formatted_value]"]').val();
757 var end_time_ampm = $form.find('input[name="' + field_base_name + '[end_time][ampm]"]').val();
758 var end_time_minutes = latepoint_hours_and_minutes_to_minutes(end_time, end_time_ampm);
759
760 if(end_time_minutes && (end_time_minutes <= start_time_minutes)){
761 $form.find('.quick-end-time-w').addClass('ending-next-day');
762 }else{
763 $form.find('.quick-end-time-w').removeClass('ending-next-day');
764 }
765 }
766
767 function latepoint_set_booking_end_time($booking_data_form){
768 var booking_duration = 0;
769 var service_duration = Number($booking_data_form.find('.os-service-durations select').val());
770
771 let field_base_name = 'order_items[' + $booking_data_form.data('order-item-id') +'][bookings][' + $booking_data_form.data('booking-id') +']';
772
773 booking_duration = booking_duration + service_duration;
774 if($booking_data_form.find('select[name="temp_service_extras_ids"] option:selected').length){
775 $booking_data_form.find('select[name="temp_service_extras_ids"] option:selected').each(function(){
776 var extra_duration = Number(jQuery(this).data('duration'));
777 var $extra_quantity_input = jQuery(this).closest('.lateselect-w').find('.ls-item[data-value="' + jQuery(this).val() + '"]').find('.os-late-quantity-selector-input');
778 if($extra_quantity_input.length) extra_duration = Number(extra_duration) * Number($extra_quantity_input.val());
779 booking_duration = Number(booking_duration) + Number(extra_duration);
780 });
781 }
782
783 var start_time = $booking_data_form.find('input[name="'+field_base_name+'[start_time][formatted_value]"]').val();
784
785 if(start_time){
786 var start_time_ampm = $booking_data_form.find('input[name="'+field_base_name+'[start_time][ampm]"]').val();
787 var start_time_minutes = latepoint_hours_and_minutes_to_minutes(start_time, start_time_ampm);
788 var end_time_minutes = parseInt(start_time_minutes) + parseInt(booking_duration);
789 if(end_time_minutes >= (24 * 60)) end_time_minutes = (end_time_minutes - 24 * 60);
790 var end_time_ampm = (end_time_minutes >= 720 && end_time_minutes < (24 * 60)) ? 'pm' : 'am';
791 var end_hours_and_minutes = latepoint_minutes_to_hours_and_minutes(end_time_minutes);
792
793 $booking_data_form.find('input[name="'+field_base_name+'[end_time][formatted_value]"]').val(end_hours_and_minutes);
794 $booking_data_form.find('.quick-end-time-w .time-ampm-select.time-' + end_time_ampm).trigger('click');
795 $booking_data_form.find('input[name="'+field_base_name+'[end_time][formatted_value]"]').closest('.os-form-group').addClass('has-value');
796 }
797 latepoint_is_next_day($booking_data_form);
798 }
799
800
801
802 function latepoint_init_sortable_columns(){
803 jQuery('.os-sortable-column').on('click', function(){
804 let current_direction = jQuery(this).hasClass('ordered-desc') ? 'desc' : 'asc';
805 let new_direction = (current_direction == 'desc') ? 'asc' : 'desc';
806 jQuery(this).closest('table').find('.os-sortable-column').removeClass('ordered-desc').removeClass('ordered-asc');
807 jQuery(this).addClass('ordered-' + new_direction);
808
809 jQuery(this).closest('table').find('.records-ordered-by-key').val(jQuery(this).data('order-key'));
810 jQuery(this).closest('table').find('.records-ordered-by-direction').val(new_direction);
811 latepoint_filter_table(jQuery(this).closest('table'), jQuery(this).closest('.os-form-group'));
812 return false;
813 });
814 }
815 function latepoint_random_text(length){
816 var result = '';
817 var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
818 var charactersLength = characters.length;
819 for ( var i = 0; i < length; i++ ) {
820 result += characters.charAt(Math.floor(Math.random() * charactersLength));
821 }
822 return result;
823 }
824
825 function latepoint_get_order_for_service_categories(){
826
827 }
828
829
830 function latepoint_init_daterangepicker($elem){
831 $elem.each(function(){
832 // DATERANGEPICKER
833 var picker_start_time = jQuery(this).find('input[name="date_from"], .os-datepicker-date-from').val();
834 var picker_end_time = jQuery(this).find('input[name="date_to"], .os-datepicker-date-to').val();
835 var locale = {};
836 if(jQuery(this).data('can-be-cleared')) locale = { cancelLabel: jQuery(this).data('clear-btn-label')};
837
838
839 moment.locale(latepoint_helper.wp_locale);
840
841 jQuery(this).daterangepicker({
842 opens: 'center',
843 singleDatePicker: (jQuery(this).data('single-date') == 'yes'),
844 startDate: (picker_start_time) ? moment(picker_start_time) : moment(),
845 endDate: (picker_end_time) ? moment(picker_end_time) : moment(),
846 locale: locale
847 });
848 });
849
850 $elem.on('cancel.daterangepicker', function(ev, picker) {
851 if(picker.element.data('can-be-cleared')){
852 picker.element.find('input[name="date_from"], .os-datepicker-date-from').val('');
853 picker.element.find('input[name="date_to"], .os-datepicker-date-to').val('');
854 picker.element.find('span.range-picker-value').text(picker.element.data('no-value-label'));
855 if(picker.element.hasClass('os-table-filter-datepicker')){
856 latepoint_filter_table(picker.element.closest('table'), picker.element.closest('.os-form-group'));
857 }
858 }
859 });
860
861 $elem.on('apply.daterangepicker', function(ev, picker) {
862 if(picker.element.data('single-date') == 'yes'){
863 picker.element.find('.range-picker-value').text(picker.startDate.format('ll'));
864 }else{
865 picker.element.find('.range-picker-value').text(picker.startDate.format('ll') + ' - ' + picker.endDate.format('ll'));
866 }
867 picker.element.find('input[name="date_from"], .os-datepicker-date-from').attr('value', picker.startDate.format('YYYY-MM-DD'));
868 picker.element.find('input[name="date_to"], .os-datepicker-date-to').attr('value', picker.endDate.format('YYYY-MM-DD'));
869 if(picker.element.closest('.os-widget').length){
870 latepoint_reload_widget(picker.element.closest('.os-widget'));
871 }
872 if(picker.element.hasClass('os-table-filter-datepicker')){
873 latepoint_filter_table(picker.element.closest('table'), picker.element.closest('.os-form-group'));
874 }
875 });
876 }
877
878 function latepoint_recalculate_items_count_in_category(){
879 jQuery('.os-category-items-count').each(function(){
880 var number_of_items = jQuery(this).closest('.os-category-parent-w').find('.item-in-category-w').length;
881 jQuery(this).find('span').text(number_of_items);
882 });
883 }
884
885 function latepoint_remove_agent_box($remove_btn){
886 var $agent_box = $remove_btn.closest('.agent-box-w');
887 $agent_box.fadeOut(300, function(){ jQuery(this).remove(); });
888 }
889
890 function latepoint_remove_service_box($remove_btn){
891 var $service_box = $remove_btn.closest('.service-box-w');
892 $service_box.fadeOut(300, function(){ jQuery(this).remove(); });
893 }
894
895 function latepoint_init_monthly_view(){
896 if(!jQuery('.calendar-month-agents-w').length) return;
897
898 jQuery('.monthly-calendar-headers select').on('change', function(){
899 var $calendar = jQuery('.calendar-month-agents-w');
900 var route_name = $calendar.data('route');
901 $calendar.addClass('os-loading');
902 var params = { month: jQuery('#monthly_calendar_month_select').val(), year: jQuery('#monthly_calendar_year_select').val() };
903 if(jQuery('#monthly_calendar_location_select').length && jQuery('#monthly_calendar_location_select').val()) params.location_id = jQuery('#monthly_calendar_location_select').val();
904 if(jQuery('#monthly_calendar_service_select').length && jQuery('#monthly_calendar_service_select').val()) params.service_id = jQuery('#monthly_calendar_service_select').val();
905 var data = { action: latepoint_helper.route_action, route_name: route_name, params: params, layout: 'none', return_format: 'json' }
906 jQuery.ajax({
907 type : "post",
908 dataType : "json",
909 url : latepoint_timestamped_ajaxurl(),
910 data : data,
911 success: function(data){
912 $calendar.removeClass('os-loading');
913 if(data.status === "success"){
914 $calendar.html(data.message);
915 }else{
916 // console.log(data.message);
917 }
918 }
919 });
920 });
921 }
922
923
924 function latepoint_init_copy_on_click_elements(){
925
926 jQuery('.os-click-to-copy').on('mouseenter', function() {
927 var $this = jQuery(this);
928 var position_info = $this.offset();
929 var width = jQuery(this).outerWidth();
930 var position_left = position_info.left;
931 var position_top = position_info.top - 20 - jQuery(window).scrollTop();
932
933 let color = ($this.data('copy-tooltip-color') == 'dark') ? 'dark' : 'light';
934 if($this.data('copy-tooltip-position') == 'left'){
935 position_left = position_left - width - 5;
936 position_top = position_top + $this.outerHeight() - jQuery(window).scrollTop();
937 }
938 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>');
939 }).on('mouseleave', function() {
940 jQuery('body').find('.os-click-to-copy-prompt').remove();
941 });
942 jQuery('.os-click-to-copy').on('click', function(){
943 var $this = jQuery(this);
944 let color = ($this.data('copy-tooltip-color') == 'dark') ? 'dark' : 'light';
945 jQuery('body').find('.os-click-to-copy-prompt').hide();
946 var text_to_copy = $this.is('input') ? $this.val() : $this.text();
947 navigator.clipboard.writeText(text_to_copy);
948
949 var position_info = $this.offset();
950 var width = $this.outerWidth();
951 var position_left = position_info.left;
952 var position_top = position_info.top - 20 - jQuery(window).scrollTop();
953
954 if($this.data('copy-tooltip-position') == 'left'){
955 position_left = position_left - width - 5;
956 position_top = position_top + $this.outerHeight() - jQuery(window).scrollTop();
957 }
958 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>');
959 $done_prompt.appendTo(jQuery('body')).animate({
960 opacity: 0,
961 left: (position_left + 20),
962 }, 600);
963 setTimeout(function(){
964 jQuery('body').find('.os-click-to-copy-done').remove();
965 jQuery('body').find('.os-click-to-copy-prompt').show();
966 }, 800);
967 });
968 }
969
970 function latepoint_remove_floating_popup(){
971 jQuery('.os-showing-popup').removeClass('os-showing-popup');
972 jQuery('.os-floating-popup').remove();
973 }
974
975 function latepoint_init_clickable_cells(){
976 jQuery('.os-clickable-popup-trigger').on('click', function(){
977 var $this = jQuery(this);
978 var position = $this.offset();
979 var width = $this.outerWidth();
980 var $popup = jQuery('<div class="os-floating-popup os-loading"></div>');
981 if($this.hasClass('os-showing-popup')){
982 latepoint_remove_floating_popup();
983 }else{
984 latepoint_remove_floating_popup();
985 $popup.offset({top: position.top, left: (position.left + width/2)});
986 jQuery('body').append($popup);
987 $this.addClass('os-showing-popup');
988
989 var route = $this.data('route');
990 var params = $this.data('os-params');
991 var data = { action: latepoint_helper.route_action, route_name: route, params: params, layout: 'none', return_format: 'json' };
992 jQuery.ajax({
993 type : "post",
994 dataType : "json",
995 url : latepoint_timestamped_ajaxurl(),
996 data : data,
997 success: function(response){
998 if(response.status === latepoint_helper.response_status.success){
999 jQuery('body').find('.os-floating-popup').html(response.message).removeClass('os-loading');
1000 latepoint_init_customer_donut_chart();
1001 jQuery('.os-floating-popup .os-floating-popup-close').on('click', function(){
1002 latepoint_remove_floating_popup();
1003 return false;
1004 });
1005 }else{
1006
1007 }
1008 }
1009 });
1010 }
1011 return false;
1012 });
1013 }
1014
1015 function latepoint_init_tiny_mce(element_id){
1016 // TODO CHECK IF wp.editor is defined
1017 if(typeof wp !== 'undefined' && typeof wp.editor !== 'undefined' && jQuery('#'+ element_id).length){
1018 wp.editor.remove(element_id);
1019 wp.editor.initialize(element_id,
1020 {
1021 tinymce: {
1022 wpautop: false,
1023 toolbar1: 'formatselect alignjustify forecolor | bold italic underline strikethrough | bullist numlist | blockquote hr | alignleft aligncenter alignright | link unlink | pastetext removeformat | outdent indent | undo redo',
1024 height : "480",
1025 },
1026 quicktags: true,
1027 mediaButtons: true,
1028 }
1029 );
1030 }
1031 }
1032
1033 function latepoint_init_reminder_form(){
1034 latepoint_init_tiny_mce(jQuery('.os-reminder-form:last-child textarea').attr('id'));
1035 }
1036
1037
1038 function latepoint_filter_table($table, $filter_elem, reset_page = true){
1039 $filter_elem.addClass('os-loading');
1040 var filter_params = $table.find('.os-table-filter').serialize();
1041 var $table_w = $table.closest('.table-with-pagination-w');
1042 if(reset_page){
1043 $table_w.find('select.pagination-page-select').val(1);
1044 }else{
1045 filter_params+= '&page_number='+$table_w.find('select.pagination-page-select').val();
1046 }
1047 var route = $table.data('route');
1048 var data = { action: latepoint_helper.route_action, route_name: route, params: filter_params, layout: 'none', return_format: 'json' };
1049 jQuery.ajax({
1050 type : "post",
1051 dataType : "json",
1052 url : latepoint_timestamped_ajaxurl(),
1053 data : data,
1054 success: function(data){
1055 $filter_elem.removeClass('os-loading');
1056 if(data.status === "success"){
1057 $table.find('tbody').html(data.message);
1058 if(data.total_pages && reset_page){
1059 var options = '';
1060 for(var i = 1; i <= data.total_pages; i++){
1061 options+= '<option>'+ i +'</option>';
1062 }
1063 $table_w.find('select.pagination-page-select').html(options);
1064 }
1065 $table_w.find('.os-pagination-from').text(data.showing_from);
1066 $table_w.find('.os-pagination-to').text(data.showing_to);
1067 $table_w.find('.os-pagination-total').text(data.total_records);
1068 latepoint_init_clickable_cells();
1069 }else{
1070 // console.log(data.message);
1071 }
1072 }
1073 });
1074 }
1075
1076 function latepoint_init_service_duration_box($duration_box){
1077 latepoint_init_input_masks(jQuery('.service-duration-box:last-child'));
1078 }
1079
1080 function latepoint_init_wizard_content(){
1081 latepoint_init_input_masks(jQuery('.os-wizard-step-content'));
1082 }
1083
1084 function latepoint_init_input_masks($scoped_element = false){
1085 let $wrapper = $scoped_element ? $scoped_element : jQuery('body');
1086 latepoint_mask_timefield($wrapper.find('.os-mask-time'));
1087
1088 $wrapper.find('.os-mask-phone').each(function(){
1089 latepoint_mask_phone(jQuery(this));
1090 });
1091
1092 latepoint_mask_money($wrapper.find('.os-mask-money'));
1093 latepoint_mask_date($wrapper.find('.os-mask-date'));
1094 latepoint_mask_minutes($wrapper.find('.os-mask-minutes'));
1095
1096 $wrapper.trigger('latepoint:initInputMasks');
1097 }