PluginProbe ʕ •ᴥ•ʔ
Appointment Booking Plugin – LatePoint | Calendar & Scheduling for WordPress / 5.2.10
Appointment Booking Plugin – LatePoint | Calendar & Scheduling for WordPress v5.2.10
5.6.11 5.6.10 5.6.9 5.6.8 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 / admin.js
latepoint / lib / assets / javascripts Last commit date
bin 6 months ago vendor 1 year ago admin.js 6 months ago front.js 6 months ago vendor-admin.js 1 year ago vendor-front.js 1 year ago
admin.js
1010 lines
1 /*
2 * Copyright (c) 2022 LatePoint LLC. All rights reserved.
3 */
4
5 // @codekit-prepend "bin/time.js";
6 // @codekit-prepend "bin/lateselect.js";
7 // @codekit-prepend "bin/latecheckbox.js";
8 // @codekit-prepend "bin/actions.js";
9 // @codekit-prepend "bin/notifications.js";
10 // @codekit-prepend "bin/shared.js";
11 // @codekit-prepend "bin/admin/updates.js";
12 // @codekit-prepend "bin/admin/main.js";
13 // @codekit-prepend "bin/admin/_agents.js";
14 // @codekit-prepend "bin/admin/_customers.js";
15 // @codekit-prepend "bin/admin/_customers_import.js";
16 // @codekit-prepend "bin/admin/_chart.js";
17 // @codekit-prepend "bin/admin/_calendar.js";
18 // @codekit-prepend "bin/admin/_processes.js";
19 // @codekit-prepend "bin/admin/_steps.js";
20 // @codekit-prepend "bin/admin/_orders.js";
21 // @codekit-prepend "bin/admin/_stripe_connect.js";
22
23
24
25 // DOCUMENT READY
26 jQuery(document).ready(function( $ ) {
27
28
29 // DASHBOARD
30 latepoint_init_calendars();
31 latepoint_init_circles_charts();
32 latepoint_init_donut_charts();
33 latepoint_init_daily_bookings_chart();
34 latepoint_init_element_togglers();
35 latepoint_init_daterangepicker(jQuery('.os-date-range-picker'));
36 latepoint_init_monthly_view();
37 latepoint_init_form_blocks();
38 latepoint_init_reminders_form();
39 latepoint_init_coupons_form();
40 latepoint_init_copy_on_click_elements();
41 latepoint_init_side_menu();
42 latepoint_init_color_picker();
43 latepoint_init_clickable_cells();
44 latepoint_init_input_masks();
45 latepoint_init_process_forms();
46 latepoint_init_sticky_side_menu();
47 latepoint_init_sortable_columns();
48 latepoint_init_accordions();
49 latepoint_init_default_form_fields_settings();
50 latepoint_init_steps_settings();
51 latepoint_init_booking_form_preview();
52 latepoint_init_sticky_side_nav();
53 latepoint_init_version5_intro();
54
55 jQuery(document).on({
56 mouseenter: function () {
57 let $elem = jQuery(this);
58 let offset = $elem.offset();
59 jQuery('body > .late-tooltip').remove();
60 let $popup = jQuery('<div/>').addClass('late-tooltip').text($elem.data('late-tooltip')).appendTo(jQuery('body'));
61 $popup.css('top', offset.top - 2);
62 $popup.css('left', offset.left + $elem.outerWidth() / 2);
63 return false;
64 },
65 mouseleave: function () {
66 jQuery('body > .late-tooltip').remove();
67 }
68 }, "[data-late-tooltip]");
69
70 jQuery('body').on('click', '.disabled-items-open-trigger', function(){
71 jQuery(this).closest('.disabled-items-wrapper').toggleClass('is-open');
72 return false;
73 });
74
75 jQuery('body').on('click', '.latepoint-side-panel-close', function(){
76 jQuery('.side-sub-panel-wrapper').remove();
77 return false;
78 });
79
80 jQuery('#settings_list_of_phone_countries').on('change', function(){
81 if(jQuery(this).val() == latepoint_helper.value_all){
82 jQuery('.select-phone-countries-wrapper').hide();
83 }else{
84 jQuery('.select-phone-countries-wrapper').show();
85 }
86 });
87
88
89 jQuery('.os-select-all-toggler').on('change', function(){
90 var $connection_wrappers = jQuery(this).closest('.white-box').find('.os-complex-connections-selector .connection');
91 if(jQuery(this).is(':checked')){
92 latepoint_complex_selector_select($connection_wrappers);
93 }else{
94 latepoint_complex_selector_deselect($connection_wrappers);
95 }
96 return false;
97 });
98
99
100 jQuery('.os-main-location-selector').on('change', function(){
101 var route = jQuery(this).data('route');
102 var params = 'id=' + jQuery(this).val();
103 var data = { action: latepoint_helper.route_action, route_name: route, params: params, layout: 'none', return_format: 'json' };
104 jQuery('.latepoint-content-w').addClass('os-loading');
105 jQuery.ajax({
106 type : "post",
107 dataType : "json",
108 url : latepoint_timestamped_ajaxurl(),
109 data : data,
110 success: function(data){
111 location.reload();
112 }
113 });
114 });
115
116 jQuery('.os-service-durations-w').on('click', '.os-remove-duration', function(){
117 jQuery(this).closest('.duration-box').slideUp(300, function(){
118 jQuery(this).remove();
119 });
120 return false;
121 });
122
123
124 jQuery('.menu-color-toggler').on('click', function(){
125 jQuery('.latepoint-side-menu-w').toggleClass('dark');
126 return false;
127 });
128
129
130 jQuery('.latepoint-mobile-top-menu-trigger').on('click', function(){
131 jQuery(this).closest('.latepoint-all-wrapper').toggleClass('os-show-mobile-menu');
132 if(jQuery(this).closest('.latepoint-all-wrapper').hasClass('os-show-mobile-menu')){
133 jQuery('.latepoint-side-menu-w ul.side-menu > li.has-children > a').on('click', function(){
134 jQuery(this).closest('li').toggleClass('menu-item-sub-open-mobile');
135 return false;
136 });
137 }else{
138 jQuery('.latepoint-side-menu-w ul.side-menu > li.has-children > a').off('click');
139 }
140 return false;
141 });
142
143 jQuery('.latepoint-mobile-top-search-trigger-cancel').on('click', function(){
144 jQuery(this).closest('.latepoint-all-wrapper').removeClass('os-show-mobile-search');
145 return false;
146 });
147
148 jQuery('.latepoint-mobile-top-search-trigger').on('click', function(){
149 jQuery(this).closest('.latepoint-all-wrapper').toggleClass('os-show-mobile-search');
150 if(jQuery(this).closest('.latepoint-all-wrapper').hasClass('os-show-mobile-search')){
151 jQuery('.latepoint-top-search').trigger('focus');
152 }
153 return false;
154 });
155
156
157 jQuery('.latepoint-top-bar-w').on('click', '.top-user-info-toggler', function(){
158 jQuery('.latepoint-user-info-dropdown').toggleClass('os-visible');
159 return false;
160 });
161
162 jQuery('.latepoint-content').on('click', '.mobile-calendar-actions-trigger', function(){
163 jQuery(this).closest('.calendar-mobile-controls').toggleClass('os-show-actions');
164 return false;
165 });
166
167 jQuery('.latepoint-content').on('click', '.os-widget-header-actions-trigger', function(){
168 jQuery(this).closest('.os-widget-header').toggleClass('os-show-actions');
169 return false;
170 });
171
172 jQuery('.latepoint-content').on('click', '.mobile-table-actions-trigger', function(){
173 jQuery(this).closest('.os-pagination-w').toggleClass('os-show-actions');
174 return false;
175 });
176
177
178
179
180
181
182 jQuery('.download-csv-with-filters').on('click', function(){
183 var filter_params = jQuery(this).closest('.table-with-pagination-w').find('.os-table-filter').serialize();
184 filter_params+= '&download=csv';
185 jQuery(this).attr('href', this.href + '&' + filter_params);
186 });
187
188 jQuery('select.pagination-page-select').on('change', function(){
189 latepoint_filter_table(jQuery(this).closest('.table-with-pagination-w').find('table'), jQuery(this).closest('.pagination-page-select-w'), false);
190 });
191
192 jQuery('select.os-table-filter').on('change', function(){
193 latepoint_filter_table(jQuery(this).closest('table'), jQuery(this).closest('.os-form-group'));
194 });
195
196 jQuery('input.os-table-filter').on('keyup', function(){
197 latepoint_filter_table(jQuery(this).closest('table'), jQuery(this).closest('.os-form-group'));
198 });
199
200
201 jQuery('.customize-connection-btn').on('click', function(){
202 jQuery(this).closest('.connection').toggleClass('show-customize-box');
203 return false;
204 });
205
206 jQuery('.connection-children-list').on('click', 'li', function(){
207 if(jQuery(this).hasClass('active')){
208 jQuery(this).removeClass('active');
209 jQuery(this).find('input.connection-child-is-connected').val('no');
210 }else{
211 jQuery(this).addClass('active');
212 jQuery(this).find('input.connection-child-is-connected').val('yes');
213 }
214 latepoint_count_active_connections(jQuery(this).closest('.connection'));
215 return false;
216 });
217
218 jQuery('.display-toggler-control').on('change', function(){
219 let group = jQuery(this).data('toggler-group');
220 let key = jQuery(this).val();
221 jQuery('.display-toggler-target[data-toggler-group="' + group + '"]').hide();
222 jQuery('.display-toggler-target[data-toggler-group="' + group + '"][data-toggler-key="'+ key +'"]').show();
223 return false;
224 });
225
226 jQuery('.add-item-category-trigger').on('click', function(){
227 jQuery('.add-item-category-box').toggle();
228 jQuery('.os-new-item-category-form-w').toggle();
229 return false;
230 });
231
232 jQuery('.latepoint-top-search').on('keyup', function(event){
233 var $wrapper = jQuery(this).closest('.latepoint-top-search-w');
234 $wrapper.addClass('os-loading');
235 var query = jQuery(this).val();
236 if(event.keyCode == 27){
237 $wrapper.removeClass('typing');
238 jQuery('.latepoint-top-search-results-w').html('');
239 jQuery(this).val('');
240 $wrapper.removeClass('os-loading');
241 return;
242 }
243 if(query == ''){
244 $wrapper.removeClass('typing');
245 jQuery('.latepoint-top-search-results-w').html('');
246 $wrapper.removeClass('os-loading');
247 return;
248 }
249 var route = jQuery(this).data('route');
250 var params = 'query=' + query;
251 var data = { action: latepoint_helper.route_action, route_name: route, params: params, layout: 'none', return_format: 'json' };
252 $wrapper.addClass('typing');
253 jQuery.ajax({
254 type : "post",
255 dataType : "json",
256 url : latepoint_timestamped_ajaxurl(),
257 data : data,
258 success: function(data){
259 if(!$wrapper.hasClass('typing')) return;
260 $wrapper.removeClass('os-loading');
261 if(data.status === "success"){
262 jQuery('.latepoint-top-search-results-w').html(data.message);
263 }else{
264 // console.log(data.message);
265 }
266 }
267 });
268 });
269
270
271 jQuery('.appointment-status-selector').on('click', function(e){
272 e.stopPropagation();
273 });
274
275 jQuery('.latepoint-show-license-details').on('click', function(e){
276 jQuery(this).closest('.active-license-info').find('.license-info-w').slideToggle(200);
277 return false;
278 });
279
280 jQuery('.aba-button-w').on('click', function(e){
281 e.stopPropagation();
282 var confirm_message = (jQuery(this).hasClass('aba-approve')) ? latepoint_helper.approve_confirm : latepoint_helper.reject_confirm;
283 if(confirm(confirm_message)){
284 var $box = jQuery(this).closest('.appointment-box-large');
285 $box.find('.appointment-status-selector select').val(jQuery(this).data('status')).trigger('change');
286 }
287 return false;
288 });
289
290
291
292 jQuery('.appointment-status-selector select').on('change', function(e){
293 var $wrapper = jQuery(this).closest('.appointment-status-selector');
294 var route = $wrapper.data('route');
295 var nonce = $wrapper.data('wp-nonce');
296 var booking_id = $wrapper.data('booking-id');
297 var status = jQuery(this).val();
298 jQuery(this).closest('.appointment-box-large').attr('class', 'appointment-box-large status-' + status);
299 var params = 'id=' + booking_id + '&status=' + status + '&_wpnonce=' + nonce;
300 var data = { action: latepoint_helper.route_action, route_name: route, params: params, layout: 'none', return_format: 'json' };
301 jQuery.ajax({
302 type : "post",
303 dataType : "json",
304 url : latepoint_timestamped_ajaxurl(),
305 data : data,
306 success: function(data){
307 if(data.status === "success"){
308 latepoint_add_notification(data.message);
309 }else{
310 latepoint_add_notification(data.message, 'error');
311 // console.log(data.message);
312 }
313 }
314 });
315 });
316
317 jQuery('body').on('click', '.open-template-variables-panel', function(){
318 jQuery('.latepoint-template-variables').toggleClass('is-visible');
319 return false;
320 });
321
322 jQuery('body').on('click', '.close-template-variables-panel', function(){
323 jQuery('.latepoint-template-variables').removeClass('is-visible');
324 return false;
325 });
326
327 jQuery('body').on('click', '.open-layout-template-variables-panel', function(){
328 jQuery('.latepoint-layout-template-variables').toggleClass('is-visible');
329 return false;
330 });
331
332 jQuery('body').on('click', '.close-layout-template-variables-panel', function(){
333 jQuery('.latepoint-layout-template-variables').removeClass('is-visible');
334 return false;
335 });
336
337 jQuery('body').on('click', '.os-notifications .os-notification-close', function(){
338 jQuery(this).closest('.item').remove();
339 return false;
340 });
341
342
343 jQuery('body').on('keyup', '.os-form-group .os-form-control', function(){
344 if(jQuery(this).val()){
345 jQuery(this).closest('.os-form-group').addClass('has-value');
346 }else{
347 jQuery(this).closest('.os-form-group').removeClass('has-value');
348 }
349 });
350
351
352
353 jQuery('.os-wizard-setup-w, .latepoint-settings-w, .custom-schedule-wrapper').on('click', '.ws-head', function(){
354 var $schedule_wrapper = jQuery(this).closest('.weekday-schedule-w');
355 $schedule_wrapper.toggleClass('is-editing').removeClass('day-off');
356 $schedule_wrapper.find('.os-toggler').removeClass('off');
357 $schedule_wrapper.find('input.is-active').val(1);
358 });
359
360
361 jQuery('body.latepoint').on('click', '.wizard-add-edit-item-trigger', function(e){
362 jQuery(this).addClass('os-loading');
363 var add_item_route_name = jQuery(this).data('route');
364 var item_info = { };
365 if(jQuery(this).data('id')){
366 item_info.id = jQuery(this).data('id');
367 }
368 var data = { action: latepoint_helper.route_action, route_name: add_item_route_name, params: item_info, layout: 'none', return_format: 'json' };
369 jQuery.ajax({
370 type : "post",
371 dataType : "json",
372 url : latepoint_timestamped_ajaxurl(),
373 data : data,
374 success: function(data){
375 jQuery('.wizard-add-edit-item-trigger.os-loading').removeClass('os-loading');
376 if(data.status === "success"){
377 jQuery('.os-wizard-step-content-i').html(data.message);
378 jQuery('.os-wizard-setup-w').addClass('is-sub-editing');
379 jQuery('.os-wizard-footer').hide();
380 latepoint_init_wizard_content();
381 }else{
382 // console.log(data.message);
383 }
384 }
385 });
386 });
387
388
389
390
391 jQuery('body.latepoint').on('click', '.os-wizard-trigger-next-btn', function(){
392 var $next_btn = jQuery(this);
393 $next_btn.addClass('os-loading');
394 var current_step_code = jQuery('#wizard_current_step_code').val();
395 var params = 'current_step_code='+current_step_code;
396
397 // work periods step
398 if(jQuery('.os-wizard-setup-w form.weekday-schedules-w').length){
399 params+= '&'+ jQuery('.os-wizard-setup-w form.weekday-schedules-w .weekday-schedule-w:not(.day-off) input').serialize();
400 }
401 // agent/notifications step
402 if(jQuery('.os-wizard-default-agent-form').length){
403 params+= '&'+ jQuery('.os-wizard-default-agent-form input').serialize();
404
405 var $form = $('.os-wizard-default-agent-form');
406 var form_data = new FormData($form[0]);
407 form_data.set('current_step_code', current_step_code);
408
409 if (('lp_intlTelInputGlobals' in window) && ('lp_intlTelInputUtils' in window)) {
410 // Get e164 formatted number from phone fields when form is submitted
411 $form.find('input.os-mask-phone').each(function () {
412 let telInstance = window.lp_intlTelInputGlobals.getInstance(this);
413 if(telInstance){
414 const phoneInputName = this.getAttribute('name');
415 const phoneInputValue = window.lp_intlTelInputGlobals.getInstance(this).getNumber(window.lp_intlTelInputUtils.numberFormat.E164);
416 form_data.set(phoneInputName, phoneInputValue);
417 }
418 });
419 }
420 params = latepoint_formdata_to_url_encoded_string(form_data);
421 }
422 // personal info step
423 if(jQuery('.os-wizard-personal-info-form').length){
424 params+= '&'+ jQuery('.os-wizard-personal-info-form input').serialize();
425 }
426
427 var data = {
428 action: latepoint_helper.route_action,
429 route_name: jQuery(this).data('route-name'),
430 params: params,
431 layout: 'none',
432 return_format: 'json'};
433 jQuery.ajax({
434 type : "post",
435 dataType : "json",
436 url : latepoint_timestamped_ajaxurl(),
437 data : data,
438 success: function(data){
439 $next_btn.removeClass('os-loading');
440 if(data.status === "success"){
441 jQuery('#wizard_current_step_code').val(data.step_code);
442 jQuery('.os-wizard-setup-w').attr('class', 'os-wizard-setup-w step-' + data.step_code);
443 jQuery('.os-wizard-step-content').html(data.message);
444 latepoint_init_wizard_content();
445 if(data.show_prev_btn){
446 jQuery('.os-wizard-prev-btn').show();
447 }else{
448 jQuery('.os-wizard-prev-btn').hide();
449 }
450 if(data.show_next_btn){
451 jQuery('.os-wizard-next-btn').show();
452 }else{
453 jQuery('.os-wizard-next-btn').hide();
454 }
455 if(!data.show_next_btn && !data.show_prev_btn){
456 jQuery('.os-wizard-footer').hide();
457 }else{
458 jQuery('.os-wizard-footer').show();
459 }
460 }
461 }
462 });
463 return false;
464 });
465
466 // WIZARD PREV BUTTON CLICK LOGIC
467 jQuery('body.latepoint').on('click', '.os-wizard-trigger-prev-btn', function(){
468 var $prev_btn = jQuery(this);
469 $prev_btn.addClass('os-loading');
470 var current_step_code = jQuery('#wizard_current_step_code').val();
471 var params = 'current_step_code='+current_step_code;
472 var data = { action: latepoint_helper.route_action, route_name: jQuery(this).data('route-name'), params: params, layout: 'none', return_format: 'json'};
473 jQuery.ajax({
474 type : "post",
475 dataType : "json",
476 url : latepoint_timestamped_ajaxurl(),
477 data : data,
478 success: function(data){
479 $prev_btn.removeClass('os-loading');
480 if(data.status === "success"){
481 jQuery('#wizard_current_step_code').val(data.step_code);
482 jQuery('.os-wizard-setup-w').attr('class', 'os-wizard-setup-w step-' + data.step_code);
483 jQuery('.os-wizard-step-content').html(data.message);
484 latepoint_init_wizard_content();
485 if(data.show_prev_btn){
486 jQuery('.os-wizard-prev-btn').show();
487 }else{
488 jQuery('.os-wizard-prev-btn').hide();
489 }
490 if(data.show_next_btn){
491 jQuery('.os-wizard-next-btn').show();
492 }else{
493 jQuery('.os-wizard-next-btn').hide();
494 }
495 if(!data.show_next_btn && !data.show_prev_btn){
496 jQuery('.os-wizard-footer').hide();
497 }else{
498 jQuery('.os-wizard-footer').show();
499 }
500 }
501 }
502 });
503 return false;
504 });
505
506 jQuery('.latepoint-content-w').on('change', '.os-widget .os-trigger-reload-widget', function(){
507 latepoint_reload_widget(jQuery(this).closest('.os-widget'));
508 });
509
510 jQuery('.latepoint-content-w').on('click', '.os-widget .timeline-type-toggle .timeline-type-option', function(){
511 jQuery(this).closest('.timeline-type-toggle').find('.timeline-type-option.active').removeClass('active');
512 jQuery(this).addClass('active');
513 jQuery('.timeline-and-availability-contents').removeClass('shows-appointments shows-availability').addClass('shows-' + jQuery(this).data('value'));
514 jQuery('#' + jQuery(this).closest('.timeline-type-toggle').data('value-holder-id')).val(jQuery(this).data('value'));
515 });
516
517
518 dragula([].slice.apply(document.querySelectorAll('.os-categories-ordering-w .os-category-children')), {
519 moves: function (el, container, handle) {
520 return (handle.classList.contains('os-category-drag') || handle.classList.contains('os-category-item-drag'));
521 },
522 }).on('drop', function(el){
523 var $categories_wrapper = jQuery('.os-categories-ordering-w');
524 var category_datas = [];
525 var item_datas = [];
526
527 $categories_wrapper.find('.os-category-parent-w').each(function(index){
528 var order_number = jQuery(this).index() + 1;
529 var parent_id = jQuery(this).parent().closest('.os-category-parent-w').data('id') || 0;
530 category_datas.push({id: jQuery(this).data('id'), order_number: order_number, parent_id: parent_id});
531 });
532 $categories_wrapper.find('.item-in-category-w').each(function(index){
533 var item_order_number = jQuery(this).index() + 1;
534 var category_id = jQuery(this).closest('.os-category-parent-w').data('id') || 0;
535 item_datas.push({id: jQuery(this).data('id'), order_number: item_order_number, category_id: category_id});
536 });
537 latepoint_recalculate_items_count_in_category();
538 var data = { action: latepoint_helper.route_action, route_name: $categories_wrapper.data('category-order-update-route'), params: {category_datas: category_datas, item_datas: item_datas}, return_format: 'json' }
539 $categories_wrapper.addClass('os-loading');
540 jQuery.ajax({
541 type : "post",
542 dataType : "json",
543 url : latepoint_timestamped_ajaxurl(),
544 data : data,
545 success: function(response){
546 $categories_wrapper.removeClass('os-loading');
547 if(response.status === "success"){
548 // latepoint_add_notification(response.message);
549 }else{
550 alert(response.message);
551 }
552 }
553 });
554 });
555
556
557 // Universal re-ordering dragging for form blocks
558 dragula([jQuery('.os-draggable-form-blocks')[0]], {
559 moves: function (el, container, handle) {
560 return handle.classList.contains('os-form-block-drag');
561 },
562 }).on('drop', function(el){
563 var blocks_order_data = {};
564 var $draggable_form_blocks_wrapper = jQuery('.os-draggable-form-blocks');
565 $draggable_form_blocks_wrapper.find('.os-form-block').each(function(index){
566 var new_order_number = jQuery(this).index() + 1;
567 var $block_model_id = jQuery(this).find('.os-form-block-id');
568 if($block_model_id.length && $block_model_id.val()) blocks_order_data[$block_model_id.val()] = new_order_number;
569 });
570 var data = { action: latepoint_helper.route_action,
571 route_name: $draggable_form_blocks_wrapper.data('order-update-route'),
572 params: {ordered_fields: blocks_order_data,
573 fields_for: $draggable_form_blocks_wrapper.data('fields-for')},
574 return_format: 'json' }
575 $draggable_form_blocks_wrapper.addClass('os-loading');
576 jQuery.ajax({
577 type : "post",
578 dataType : "json",
579 url : latepoint_timestamped_ajaxurl(),
580 data : data,
581 success: function(response){
582 $draggable_form_blocks_wrapper.removeClass('os-loading');
583 }
584 });
585 });
586
587
588 jQuery('body.latepoint-admin').on('click', '.os-category-edit-btn, .os-category-edit-cancel-btn, .os-category-w .os-category-name', function(){
589 jQuery(this).closest('.os-category-w').toggleClass('editing');
590 return false;
591 });
592
593 jQuery('body.latepoint-admin').on('click', '.step-edit-btn, .step-edit-cancel-btn, .step-w .step-head', function(){
594 jQuery(this).closest('.step-w').toggleClass('editing');
595 return false;
596 });
597
598 jQuery('body.latepoint-admin').on('click', '.agent-info-change-agent-btn', function(){
599 jQuery(this).closest('.agent-info-w').removeClass('selected').addClass('selecting');
600 return false;
601 });
602
603 jQuery('body.latepoint-admin').on('click', '.agent-info-change-agent-btn', function(){
604 jQuery(this).closest('.agent-info-w').removeClass('selected').addClass('selecting');
605 return false;
606 });
607
608
609 jQuery('body.latepoint-admin').on('click', '.customer-info-create-btn', function(){
610 jQuery(this).closest('.customer-info-w').removeClass('selecting').addClass('selected');
611 return false;
612 });
613
614 jQuery('body.latepoint-admin').on('click', '.customer-info-load-btn', function(){
615 jQuery(this).closest('.customer-info-w').removeClass('selected').addClass('selecting').find('.customers-selector-search-input').trigger('focus');
616 return false;
617 });
618
619 jQuery('body.latepoint-admin').on('click', '.customers-selector-cancel', function(){
620 jQuery(this).closest('.customer-info-w').removeClass('selecting').addClass('selected ');
621 jQuery('.customers-options-list .customer-option').show();
622 jQuery('.customers-selector-search-input').val('');
623 return false;
624 });
625
626 // CUSTOMER SELECTOR
627
628 // SERVICES SELECTOR
629 jQuery('body.latepoint-admin').on('click', '.service-option-selected', function(){
630 var $select = jQuery(this).closest('.os-services-select-field-w');
631 if($select.hasClass('active')){
632 $select.removeClass('active');
633 }else{
634 $select.addClass('active').find('input').trigger('focus');
635 }
636 return false;
637 });
638
639
640 jQuery('body.latepoint-admin').on('keyup', '.service-options-filter-input', function(){
641 var $list = jQuery(this).closest('.services-options-list');
642 var text = jQuery(this).val().toLowerCase();
643 $list.find('.service-option').hide();
644
645 // Search
646 $list.find('.service-option').each(function(){
647
648 if(jQuery(this).text().toLowerCase().indexOf(""+text+"") != -1 ){
649 jQuery(this).show();
650 }
651 });
652 return false;
653 });
654
655
656 jQuery('.calendar-week-agent-w').on('click', '.calendar-load-target-date', function(event){
657 jQuery(this).addClass('os-loading');
658 latepoint_reload_week_view_calendar(jQuery(this).data('target-date'));
659 return false;
660 });
661
662 jQuery('.calendar-week-agent-w').on('change', '.cc-availability-toggler #overlay_service_availability', function(event){
663 if(jQuery(this).val() == 'on'){
664 jQuery('.calendar-week-agent-w .cc-service-selector').show();
665 }else{
666 jQuery('.calendar-week-agent-w .cc-service-selector').hide();
667 }
668 latepoint_reload_week_view_calendar();
669 });
670
671
672 jQuery('.calendar-week-agent-w').on('change', '.trigger-weekly-calendar-reload', function(event){
673 latepoint_reload_week_view_calendar();
674 return false;
675 });
676
677 jQuery('.latepoint-admin').on('click', '.os-complex-connections-selector .selector-trigger', function(e){
678 var $connection_wrapper = jQuery(this).closest('.connection');
679 if($connection_wrapper.hasClass('active')){
680 latepoint_complex_selector_deselect($connection_wrapper);
681 jQuery(this).closest('.white-box').find('.os-select-all-toggler').prop('checked', false);
682 }else{
683 latepoint_complex_selector_select($connection_wrapper);
684 }
685 return false;
686 });
687
688 jQuery('.latepoint-admin').on('click', '.os-complex-connections-selector .item-quantity-selector', function(e){
689 let val = parseInt(jQuery(this).closest('.item-quantity-selector-w').find('.item-quantity-selector-input').val());
690 if(jQuery(this).data('sign') == 'plus'){
691 val = val + 1;
692 }else{
693 val = val - 1;
694 }
695 val = (val > 0) ? val : 0;
696 jQuery(this).closest('.item-quantity-selector-w').find('.item-quantity-selector-input').val(val).trigger('change');
697 return false;
698 });
699
700 jQuery('.latepoint-admin').on('change', '.os-complex-connections-selector .item-quantity-selector-input', function(e){
701 let $this = jQuery(this);
702 let $connection_wrapper = jQuery(this).closest('.connection');
703 if($this.val() > 0){
704 latepoint_complex_selector_select($connection_wrapper, $this.val());
705 }else{
706 latepoint_complex_selector_deselect($connection_wrapper);
707 }
708 return false;
709 });
710
711 jQuery('.latepoint-admin').on('click', '.os-agents-selector .agent', function(){
712 if(jQuery(this).hasClass('active')){
713 jQuery(this).removeClass('active');
714 jQuery(this).find('.connection-child-is-connected').val('no');
715 }else{
716 jQuery(this).addClass('active');
717 jQuery(this).find('.connection-child-is-connected').val('yes');
718 }
719 return false;
720 });
721
722 jQuery('.latepoint-admin').on('click', '.os-services-selector .service', function(){
723 if(jQuery(this).hasClass('active')){
724 jQuery(this).removeClass('active');
725 jQuery(this).find('.connection-child-is-connected').val('no');
726 }else{
727 jQuery(this).addClass('active');
728 jQuery(this).find('.connection-child-is-connected').val('yes');
729 }
730 return false;
731 });
732
733 jQuery('.latepoint-admin').on( 'click', '.os-form-toggler-group', function( event ){
734 if (jQuery(event.target).closest('a').length) {
735 return true;
736 }
737 jQuery(this).find('.os-toggler').trigger('click');
738 return false;
739 });
740
741 jQuery('.latepoint-admin').on( 'click', '.os-toggler', function( event ){
742 let $toggler = jQuery(this);
743 if($toggler.data('confirm')){
744 if(!confirm($toggler.data('confirm'))) return false;
745 }
746 if($toggler.hasClass('on')){
747 $toggler.removeClass('on').addClass('off');
748 }else{
749 $toggler.removeClass('off').addClass('on');
750 }
751 if($toggler.data('for')){
752 if($toggler.hasClass('os-toggler-radio')){
753 // radio
754 // uncheck all radio buttons with the same name
755 let $radio = jQuery('#' + $toggler.data('for'));
756 jQuery('input[type="radio"][name="'+ $radio.prop('name') + '"]:checked').each(function(index){
757 let toggle_content_id = jQuery(this).prop('checked', false).closest('.os-toggler-w').find('.os-toggler.on').removeClass('on').addClass('off').data('controlled-toggle-id');
758 jQuery('#'+ toggle_content_id).hide();
759 });
760 $radio.prop('checked', !$toggler.hasClass('off'));
761 }else{
762 var $hiddenInput = jQuery('input[type="hidden"]#' + $toggler.data('for'));
763 if($hiddenInput.length){
764 // hidden input
765 if($toggler.data('is-string-value')){
766 $hiddenInput.val($toggler.hasClass('off') ? 'off' : 'on').trigger('change');
767 }else{
768 $hiddenInput.val($toggler.hasClass('off') ? 0 : 1).trigger('change');
769 }
770
771 if($toggler.data('os-instant-update')){
772 let data = new FormData();
773
774 let params = $hiddenInput.serialize();
775 if($toggler.data('nonce')) params+= '&_wpnonce='+$toggler.data('nonce');
776 data.append('params', params);
777 data.append('action', latepoint_helper.route_action);
778 data.append('route_name', $toggler.data('os-instant-update'));
779 data.append('return_format', 'json');
780
781 jQuery.ajax({
782 type: "post",
783 dataType: "json",
784 processData: false,
785 contentType: false,
786 url: latepoint_timestamped_ajaxurl(),
787 data: data,
788 success: function (response) {
789
790 }
791 });
792 }
793 }else{
794 // checkbox
795 jQuery('#' + $toggler.data('for')).prop('checked', !$toggler.hasClass('off'));
796 }
797 }
798 }
799 if($toggler.data('controlled-toggle-id')){
800 if($toggler.hasClass('off')){
801 jQuery('#' + $toggler.data('controlled-toggle-id')).hide();
802 }else{
803 jQuery('#' + $toggler.data('controlled-toggle-id')).show();
804 }
805 }
806 if($toggler.data('negative-controlled-toggle-id')){
807 if($toggler.hasClass('off')){
808 jQuery('#' + $toggler.data('negative-controlled-toggle-id')).show();
809 }else{
810 jQuery('#' + $toggler.data('negative-controlled-toggle-id')).hide();
811 }
812 }
813 $toggler.trigger('ostoggler:toggle');
814 return false;
815 });
816
817
818
819 // UPLOAD/REMOVE IMAGE LINK LOGIC
820 jQuery('.latepoint-admin').on( 'click', '.os-image-selector-trigger', function( event ){
821 var frame;
822
823 event.preventDefault();
824
825 var $image_uploader_trigger = jQuery(this);
826 var $image_selector_w = jQuery(this).closest('.os-image-selector-w');
827 var $image_container = $image_selector_w.find('.os-image-container');
828 var $image_id_holder = $image_selector_w.find('.os-image-id-holder');
829
830 let is_avatar = $image_selector_w.hasClass('is-avatar');
831
832 var image_exists = is_avatar ? $image_container.find('.image-self').length : $image_container.find('img').length;
833
834 if(image_exists){
835 $image_id_holder.val('');
836 $image_selector_w.removeClass('has-image');
837 $image_container.html('');
838 $image_uploader_trigger.find('.os-text-holder').text($image_uploader_trigger.data('label-set-str'));
839 }else{
840 // If the media frame already exists, reopen it.
841 if ( frame ) {
842 frame.open();
843 return false;
844 }
845
846 // Create a new media frame
847 frame = wp.media({
848 title: 'Select or Upload Media',
849 button: { text: 'Use this media' },
850 multiple: false
851 });
852
853 frame.on( 'select', function() {
854 var attachment = frame.state().get('selection').first().toJSON();
855 if(is_avatar){
856 $image_container.html( '<div class="image-self" style="background-image: url('+attachment.url+')"></div>' );
857 }else{
858 $image_container.html( '<img src="'+attachment.url+'" alt=""/>' );
859 }
860 $image_id_holder.val( attachment.id );
861 $image_selector_w.addClass('has-image');
862 $image_uploader_trigger.find('.os-text-holder').text($image_uploader_trigger.data('label-remove-str'));
863 });
864
865 frame.open();
866 }
867
868 return false;
869 });
870
871
872 jQuery('.latepoint-admin').on('click', '.os-multiple-files-uploader a', function(event) {
873 event.stopPropagation();
874 });
875
876 jQuery('.latepoint-admin').on('click', '.os-multiple-files-uploader', function(event) {
877 var frame;
878 event.preventDefault();
879
880 var $uploader_trigger = jQuery(this);
881 var $uploader_wrapper = $uploader_trigger.closest('.os-multiple-files-uploader');
882 var $files_list = $uploader_wrapper.find('.os-uploaded-files-list');
883 var $file_ids_holder = $uploader_wrapper.find('.os-file-ids-holder');
884
885 // Create a new media frame
886 frame = wp.media({
887 title: 'Select or Upload Files',
888 button: { text: 'Add selected files' },
889 multiple: 'add' // Allows to select multiple files
890 });
891
892 // When files are selected...
893 frame.on('select', function() {
894 var attachments = frame.state().get('selection').map(function(attachment) {
895 attachment = attachment.toJSON();
896 return attachment;
897 });
898
899 var current_ids = $file_ids_holder.val() ? $file_ids_holder.val().split(',') : [];
900
901 attachments.forEach(function(attachment) {
902 // Skip if file already added
903 if(current_ids.indexOf(attachment.id.toString()) !== -1) return;
904
905 // Add to IDs list
906 current_ids.push(attachment.id);
907
908 // Add to files list
909 var $file_item = jQuery('<div class="os-uploaded-file" data-file-id="'+attachment.id+'">');
910 $file_item.append('<a class="os-file-link" href="'+attachment.url+'" target="_blank">'+attachment.filename+'</a>');
911 $file_item.append('<a href="#" class="os-remove-file" title="'+$uploader_trigger.data('label-remove-str')+'"><i class="latepoint-icon latepoint-icon-cross"></i></a>');
912 $files_list.append($file_item);
913 });
914
915 // Update hidden field with all IDs
916 $file_ids_holder.val(current_ids.join(','));
917 });
918
919 frame.open();
920 return false;
921 });
922
923 jQuery('.latepoint-admin').on('click', '.os-remove-file', function(event) {
924 event.preventDefault();
925
926 let $remove_btn = jQuery(this);
927 const confirm_text = $remove_btn.closest('.os-uploaded-files-list').data('confirm-text') || 'Are you sure you want to remove this file?';
928 if (confirm(confirm_text)) {
929 let $file_item = $remove_btn.closest('.os-uploaded-file');
930 let $file_ids_holder = $file_item.closest('.os-multiple-files-uploader').find('.os-file-ids-holder');
931
932 let file_id = $file_item.data('file-id');
933 let current_ids = $file_ids_holder.val() ? $file_ids_holder.val().split(',') : [];
934
935 current_ids = current_ids.filter(function(id) {
936 return id != file_id;
937 });
938
939 $file_ids_holder.val(current_ids.join(','));
940 $file_item.remove();
941 }
942 });
943
944
945
946 jQuery('body').on('click', '.latepoint-lightbox-close', function(){
947 latepoint_lightbox_close();
948 return false;
949 });
950
951
952 jQuery('body').on('click', '.latepoint-side-panel-close-trigger', function(){
953 latepoint_close_side_panel();
954 return false;
955 });
956 jQuery('body').on('click', '.latepoint-side-sub-panel-close-trigger', function(){
957 jQuery(this).closest('.side-sub-panel-wrapper').remove();
958 return false;
959 });
960
961
962
963 jQuery('body.latepoint-admin').on('click', '.time-ampm-select', function(){
964 let $form = jQuery(this).closest('.order-item-booking-data-form-wrapper');
965 jQuery(this).closest('.time-ampm-w').find('.active').removeClass('active');
966 jQuery(this).addClass('active');
967 var ampm_value = jQuery(this).data('ampm-value');
968 jQuery(this).closest('.os-time-group').find('.ampm-value-hidden-holder').val(ampm_value);
969 if(jQuery(this).closest('.quick-start-time-w').length){
970 // if called from quick edit form - we need to make sure it accurately changes time to next day if end time is earlier than start time
971 latepoint_set_booking_end_time($form);
972 latepoint_is_next_day($form);
973 }
974 if(jQuery(this).closest('.quick-end-time-w').length){
975 latepoint_is_next_day($form);
976 }
977 return false;
978 });
979
980
981 jQuery('body.latepoint-admin').on('click', '.latepoint-lightbox-shadow', function(){
982 latepoint_lightbox_close();
983 return false;
984 });
985
986 jQuery('body.latepoint-admin').on('click', '.latepoint-side-panel-shadow', function(){
987 jQuery('.latepoint-side-panel-w').remove();
988 return false;
989 });
990
991 // SCHEDULE
992
993 jQuery('body.latepoint-admin').on('click', '.ws-period-remove', function(e){
994 jQuery(this).closest('.ws-period').remove();
995 return false;
996 });
997
998
999 jQuery('.latepoint-admin').on( 'click', '.weekday-schedule-w .os-toggler', function( event ){
1000 if(jQuery(this).hasClass('off')){
1001 jQuery(this).closest('.weekday-schedule-w').addClass('day-off').removeClass('is-editing').find('input.is-active').val(0);
1002 }else{
1003 jQuery(this).closest('.weekday-schedule-w').removeClass('day-off').addClass('is-editing').find('input.is-active').val(1);
1004 }
1005 return false;
1006 });
1007
1008
1009
1010 });