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