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