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