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