PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / 5.2.11
LatePoint – Calendar Booking Plugin for Appointments and Events v5.2.11
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 3 months ago vendor 1 year ago admin.js 3 months ago front.js 4 months ago vendor-admin.js 1 year ago vendor-front.js 1 year ago
admin.js
1011 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 _wpnonce: $draggable_form_blocks_wrapper.data('order-update-nonce')},
575 return_format: 'json' }
576 $draggable_form_blocks_wrapper.addClass('os-loading');
577 jQuery.ajax({
578 type : "post",
579 dataType : "json",
580 url : latepoint_timestamped_ajaxurl(),
581 data : data,
582 success: function(response){
583 $draggable_form_blocks_wrapper.removeClass('os-loading');
584 }
585 });
586 });
587
588
589 jQuery('body.latepoint-admin').on('click', '.os-category-edit-btn, .os-category-edit-cancel-btn, .os-category-w .os-category-name', function(){
590 jQuery(this).closest('.os-category-w').toggleClass('editing');
591 return false;
592 });
593
594 jQuery('body.latepoint-admin').on('click', '.step-edit-btn, .step-edit-cancel-btn, .step-w .step-head', function(){
595 jQuery(this).closest('.step-w').toggleClass('editing');
596 return false;
597 });
598
599 jQuery('body.latepoint-admin').on('click', '.agent-info-change-agent-btn', function(){
600 jQuery(this).closest('.agent-info-w').removeClass('selected').addClass('selecting');
601 return false;
602 });
603
604 jQuery('body.latepoint-admin').on('click', '.agent-info-change-agent-btn', function(){
605 jQuery(this).closest('.agent-info-w').removeClass('selected').addClass('selecting');
606 return false;
607 });
608
609
610 jQuery('body.latepoint-admin').on('click', '.customer-info-create-btn', function(){
611 jQuery(this).closest('.customer-info-w').removeClass('selecting').addClass('selected');
612 return false;
613 });
614
615 jQuery('body.latepoint-admin').on('click', '.customer-info-load-btn', function(){
616 jQuery(this).closest('.customer-info-w').removeClass('selected').addClass('selecting').find('.customers-selector-search-input').trigger('focus');
617 return false;
618 });
619
620 jQuery('body.latepoint-admin').on('click', '.customers-selector-cancel', function(){
621 jQuery(this).closest('.customer-info-w').removeClass('selecting').addClass('selected ');
622 jQuery('.customers-options-list .customer-option').show();
623 jQuery('.customers-selector-search-input').val('');
624 return false;
625 });
626
627 // CUSTOMER SELECTOR
628
629 // SERVICES SELECTOR
630 jQuery('body.latepoint-admin').on('click', '.service-option-selected', function(){
631 var $select = jQuery(this).closest('.os-services-select-field-w');
632 if($select.hasClass('active')){
633 $select.removeClass('active');
634 }else{
635 $select.addClass('active').find('input').trigger('focus');
636 }
637 return false;
638 });
639
640
641 jQuery('body.latepoint-admin').on('keyup', '.service-options-filter-input', function(){
642 var $list = jQuery(this).closest('.services-options-list');
643 var text = jQuery(this).val().toLowerCase();
644 $list.find('.service-option').hide();
645
646 // Search
647 $list.find('.service-option').each(function(){
648
649 if(jQuery(this).text().toLowerCase().indexOf(""+text+"") != -1 ){
650 jQuery(this).show();
651 }
652 });
653 return false;
654 });
655
656
657 jQuery('.calendar-week-agent-w').on('click', '.calendar-load-target-date', function(event){
658 jQuery(this).addClass('os-loading');
659 latepoint_reload_week_view_calendar(jQuery(this).data('target-date'));
660 return false;
661 });
662
663 jQuery('.calendar-week-agent-w').on('change', '.cc-availability-toggler #overlay_service_availability', function(event){
664 if(jQuery(this).val() == 'on'){
665 jQuery('.calendar-week-agent-w .cc-service-selector').show();
666 }else{
667 jQuery('.calendar-week-agent-w .cc-service-selector').hide();
668 }
669 latepoint_reload_week_view_calendar();
670 });
671
672
673 jQuery('.calendar-week-agent-w').on('change', '.trigger-weekly-calendar-reload', function(event){
674 latepoint_reload_week_view_calendar();
675 return false;
676 });
677
678 jQuery('.latepoint-admin').on('click', '.os-complex-connections-selector .selector-trigger', function(e){
679 var $connection_wrapper = jQuery(this).closest('.connection');
680 if($connection_wrapper.hasClass('active')){
681 latepoint_complex_selector_deselect($connection_wrapper);
682 jQuery(this).closest('.white-box').find('.os-select-all-toggler').prop('checked', false);
683 }else{
684 latepoint_complex_selector_select($connection_wrapper);
685 }
686 return false;
687 });
688
689 jQuery('.latepoint-admin').on('click', '.os-complex-connections-selector .item-quantity-selector', function(e){
690 let val = parseInt(jQuery(this).closest('.item-quantity-selector-w').find('.item-quantity-selector-input').val());
691 if(jQuery(this).data('sign') == 'plus'){
692 val = val + 1;
693 }else{
694 val = val - 1;
695 }
696 val = (val > 0) ? val : 0;
697 jQuery(this).closest('.item-quantity-selector-w').find('.item-quantity-selector-input').val(val).trigger('change');
698 return false;
699 });
700
701 jQuery('.latepoint-admin').on('change', '.os-complex-connections-selector .item-quantity-selector-input', function(e){
702 let $this = jQuery(this);
703 let $connection_wrapper = jQuery(this).closest('.connection');
704 if($this.val() > 0){
705 latepoint_complex_selector_select($connection_wrapper, $this.val());
706 }else{
707 latepoint_complex_selector_deselect($connection_wrapper);
708 }
709 return false;
710 });
711
712 jQuery('.latepoint-admin').on('click', '.os-agents-selector .agent', function(){
713 if(jQuery(this).hasClass('active')){
714 jQuery(this).removeClass('active');
715 jQuery(this).find('.connection-child-is-connected').val('no');
716 }else{
717 jQuery(this).addClass('active');
718 jQuery(this).find('.connection-child-is-connected').val('yes');
719 }
720 return false;
721 });
722
723 jQuery('.latepoint-admin').on('click', '.os-services-selector .service', function(){
724 if(jQuery(this).hasClass('active')){
725 jQuery(this).removeClass('active');
726 jQuery(this).find('.connection-child-is-connected').val('no');
727 }else{
728 jQuery(this).addClass('active');
729 jQuery(this).find('.connection-child-is-connected').val('yes');
730 }
731 return false;
732 });
733
734 jQuery('.latepoint-admin').on( 'click', '.os-form-toggler-group', function( event ){
735 if (jQuery(event.target).closest('a').length) {
736 return true;
737 }
738 jQuery(this).find('.os-toggler').trigger('click');
739 return false;
740 });
741
742 jQuery('.latepoint-admin').on( 'click', '.os-toggler', function( event ){
743 let $toggler = jQuery(this);
744 if($toggler.data('confirm')){
745 if(!confirm($toggler.data('confirm'))) return false;
746 }
747 if($toggler.hasClass('on')){
748 $toggler.removeClass('on').addClass('off');
749 }else{
750 $toggler.removeClass('off').addClass('on');
751 }
752 if($toggler.data('for')){
753 if($toggler.hasClass('os-toggler-radio')){
754 // radio
755 // uncheck all radio buttons with the same name
756 let $radio = jQuery('#' + $toggler.data('for'));
757 jQuery('input[type="radio"][name="'+ $radio.prop('name') + '"]:checked').each(function(index){
758 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');
759 jQuery('#'+ toggle_content_id).hide();
760 });
761 $radio.prop('checked', !$toggler.hasClass('off'));
762 }else{
763 var $hiddenInput = jQuery('input[type="hidden"]#' + $toggler.data('for'));
764 if($hiddenInput.length){
765 // hidden input
766 if($toggler.data('is-string-value')){
767 $hiddenInput.val($toggler.hasClass('off') ? 'off' : 'on').trigger('change');
768 }else{
769 $hiddenInput.val($toggler.hasClass('off') ? 0 : 1).trigger('change');
770 }
771
772 if($toggler.data('os-instant-update')){
773 let data = new FormData();
774
775 let params = $hiddenInput.serialize();
776 if($toggler.data('nonce')) params+= '&_wpnonce='+$toggler.data('nonce');
777 data.append('params', params);
778 data.append('action', latepoint_helper.route_action);
779 data.append('route_name', $toggler.data('os-instant-update'));
780 data.append('return_format', 'json');
781
782 jQuery.ajax({
783 type: "post",
784 dataType: "json",
785 processData: false,
786 contentType: false,
787 url: latepoint_timestamped_ajaxurl(),
788 data: data,
789 success: function (response) {
790
791 }
792 });
793 }
794 }else{
795 // checkbox
796 jQuery('#' + $toggler.data('for')).prop('checked', !$toggler.hasClass('off'));
797 }
798 }
799 }
800 if($toggler.data('controlled-toggle-id')){
801 if($toggler.hasClass('off')){
802 jQuery('#' + $toggler.data('controlled-toggle-id')).hide();
803 }else{
804 jQuery('#' + $toggler.data('controlled-toggle-id')).show();
805 }
806 }
807 if($toggler.data('negative-controlled-toggle-id')){
808 if($toggler.hasClass('off')){
809 jQuery('#' + $toggler.data('negative-controlled-toggle-id')).show();
810 }else{
811 jQuery('#' + $toggler.data('negative-controlled-toggle-id')).hide();
812 }
813 }
814 $toggler.trigger('ostoggler:toggle');
815 return false;
816 });
817
818
819
820 // UPLOAD/REMOVE IMAGE LINK LOGIC
821 jQuery('.latepoint-admin').on( 'click', '.os-image-selector-trigger', function( event ){
822 var frame;
823
824 event.preventDefault();
825
826 var $image_uploader_trigger = jQuery(this);
827 var $image_selector_w = jQuery(this).closest('.os-image-selector-w');
828 var $image_container = $image_selector_w.find('.os-image-container');
829 var $image_id_holder = $image_selector_w.find('.os-image-id-holder');
830
831 let is_avatar = $image_selector_w.hasClass('is-avatar');
832
833 var image_exists = is_avatar ? $image_container.find('.image-self').length : $image_container.find('img').length;
834
835 if(image_exists){
836 $image_id_holder.val('');
837 $image_selector_w.removeClass('has-image');
838 $image_container.html('');
839 $image_uploader_trigger.find('.os-text-holder').text($image_uploader_trigger.data('label-set-str'));
840 }else{
841 // If the media frame already exists, reopen it.
842 if ( frame ) {
843 frame.open();
844 return false;
845 }
846
847 // Create a new media frame
848 frame = wp.media({
849 title: 'Select or Upload Media',
850 button: { text: 'Use this media' },
851 multiple: false
852 });
853
854 frame.on( 'select', function() {
855 var attachment = frame.state().get('selection').first().toJSON();
856 if(is_avatar){
857 $image_container.html( '<div class="image-self" style="background-image: url('+attachment.url+')"></div>' );
858 }else{
859 $image_container.html( '<img src="'+attachment.url+'" alt=""/>' );
860 }
861 $image_id_holder.val( attachment.id );
862 $image_selector_w.addClass('has-image');
863 $image_uploader_trigger.find('.os-text-holder').text($image_uploader_trigger.data('label-remove-str'));
864 });
865
866 frame.open();
867 }
868
869 return false;
870 });
871
872
873 jQuery('.latepoint-admin').on('click', '.os-multiple-files-uploader a', function(event) {
874 event.stopPropagation();
875 });
876
877 jQuery('.latepoint-admin').on('click', '.os-multiple-files-uploader', function(event) {
878 var frame;
879 event.preventDefault();
880
881 var $uploader_trigger = jQuery(this);
882 var $uploader_wrapper = $uploader_trigger.closest('.os-multiple-files-uploader');
883 var $files_list = $uploader_wrapper.find('.os-uploaded-files-list');
884 var $file_ids_holder = $uploader_wrapper.find('.os-file-ids-holder');
885
886 // Create a new media frame
887 frame = wp.media({
888 title: 'Select or Upload Files',
889 button: { text: 'Add selected files' },
890 multiple: 'add' // Allows to select multiple files
891 });
892
893 // When files are selected...
894 frame.on('select', function() {
895 var attachments = frame.state().get('selection').map(function(attachment) {
896 attachment = attachment.toJSON();
897 return attachment;
898 });
899
900 var current_ids = $file_ids_holder.val() ? $file_ids_holder.val().split(',') : [];
901
902 attachments.forEach(function(attachment) {
903 // Skip if file already added
904 if(current_ids.indexOf(attachment.id.toString()) !== -1) return;
905
906 // Add to IDs list
907 current_ids.push(attachment.id);
908
909 // Add to files list
910 var $file_item = jQuery('<div class="os-uploaded-file" data-file-id="'+attachment.id+'">');
911 $file_item.append('<a class="os-file-link" href="'+attachment.url+'" target="_blank">'+attachment.filename+'</a>');
912 $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>');
913 $files_list.append($file_item);
914 });
915
916 // Update hidden field with all IDs
917 $file_ids_holder.val(current_ids.join(','));
918 });
919
920 frame.open();
921 return false;
922 });
923
924 jQuery('.latepoint-admin').on('click', '.os-remove-file', function(event) {
925 event.preventDefault();
926
927 let $remove_btn = jQuery(this);
928 const confirm_text = $remove_btn.closest('.os-uploaded-files-list').data('confirm-text') || 'Are you sure you want to remove this file?';
929 if (confirm(confirm_text)) {
930 let $file_item = $remove_btn.closest('.os-uploaded-file');
931 let $file_ids_holder = $file_item.closest('.os-multiple-files-uploader').find('.os-file-ids-holder');
932
933 let file_id = $file_item.data('file-id');
934 let current_ids = $file_ids_holder.val() ? $file_ids_holder.val().split(',') : [];
935
936 current_ids = current_ids.filter(function(id) {
937 return id != file_id;
938 });
939
940 $file_ids_holder.val(current_ids.join(','));
941 $file_item.remove();
942 }
943 });
944
945
946
947 jQuery('body').on('click', '.latepoint-lightbox-close', function(){
948 latepoint_lightbox_close();
949 return false;
950 });
951
952
953 jQuery('body').on('click', '.latepoint-side-panel-close-trigger', function(){
954 latepoint_close_side_panel();
955 return false;
956 });
957 jQuery('body').on('click', '.latepoint-side-sub-panel-close-trigger', function(){
958 jQuery(this).closest('.side-sub-panel-wrapper').remove();
959 return false;
960 });
961
962
963
964 jQuery('body.latepoint-admin').on('click', '.time-ampm-select', function(){
965 let $form = jQuery(this).closest('.order-item-booking-data-form-wrapper');
966 jQuery(this).closest('.time-ampm-w').find('.active').removeClass('active');
967 jQuery(this).addClass('active');
968 var ampm_value = jQuery(this).data('ampm-value');
969 jQuery(this).closest('.os-time-group').find('.ampm-value-hidden-holder').val(ampm_value);
970 if(jQuery(this).closest('.quick-start-time-w').length){
971 // 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
972 latepoint_set_booking_end_time($form);
973 latepoint_is_next_day($form);
974 }
975 if(jQuery(this).closest('.quick-end-time-w').length){
976 latepoint_is_next_day($form);
977 }
978 return false;
979 });
980
981
982 jQuery('body.latepoint-admin').on('click', '.latepoint-lightbox-shadow', function(){
983 latepoint_lightbox_close();
984 return false;
985 });
986
987 jQuery('body.latepoint-admin').on('click', '.latepoint-side-panel-shadow', function(){
988 jQuery('.latepoint-side-panel-w').remove();
989 return false;
990 });
991
992 // SCHEDULE
993
994 jQuery('body.latepoint-admin').on('click', '.ws-period-remove', function(e){
995 jQuery(this).closest('.ws-period').remove();
996 return false;
997 });
998
999
1000 jQuery('.latepoint-admin').on( 'click', '.weekday-schedule-w .os-toggler', function( event ){
1001 if(jQuery(this).hasClass('off')){
1002 jQuery(this).closest('.weekday-schedule-w').addClass('day-off').removeClass('is-editing').find('input.is-active').val(0);
1003 }else{
1004 jQuery(this).closest('.weekday-schedule-w').removeClass('day-off').addClass('is-editing').find('input.is-active').val(1);
1005 }
1006 return false;
1007 });
1008
1009
1010
1011 });