PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / 5.2.0
LatePoint – Calendar Booking Plugin for Appointments and Events v5.2.0
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 9 months ago vendor 1 year ago admin.js 9 months ago front.js 9 months ago vendor-admin.js 1 year ago vendor-front.js 1 year ago
admin.js
1003 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('.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
423 var data = {
424 action: latepoint_helper.route_action,
425 route_name: jQuery(this).data('route-name'),
426 params: params,
427 layout: 'none',
428 return_format: 'json'};
429 jQuery.ajax({
430 type : "post",
431 dataType : "json",
432 url : latepoint_timestamped_ajaxurl(),
433 data : data,
434 success: function(data){
435 $next_btn.removeClass('os-loading');
436 if(data.status === "success"){
437 jQuery('#wizard_current_step_code').val(data.step_code);
438 jQuery('.os-wizard-setup-w').attr('class', 'os-wizard-setup-w step-' + data.step_code);
439 jQuery('.os-wizard-step-content').html(data.message);
440 latepoint_init_wizard_content();
441 if(data.show_prev_btn){
442 jQuery('.os-wizard-prev-btn').show();
443 }else{
444 jQuery('.os-wizard-prev-btn').hide();
445 }
446 if(data.show_next_btn){
447 jQuery('.os-wizard-next-btn').show();
448 }else{
449 jQuery('.os-wizard-next-btn').hide();
450 }
451 if(!data.show_next_btn && !data.show_prev_btn){
452 jQuery('.os-wizard-footer').hide();
453 }else{
454 jQuery('.os-wizard-footer').show();
455 }
456 }
457 }
458 });
459 return false;
460 });
461
462 // WIZARD PREV BUTTON CLICK LOGIC
463 jQuery('body.latepoint').on('click', '.os-wizard-trigger-prev-btn', function(){
464 var $prev_btn = jQuery(this);
465 $prev_btn.addClass('os-loading');
466 var current_step_code = jQuery('#wizard_current_step_code').val();
467 var params = 'current_step_code='+current_step_code;
468 var data = { action: latepoint_helper.route_action, route_name: jQuery(this).data('route-name'), params: params, layout: 'none', return_format: 'json'};
469 jQuery.ajax({
470 type : "post",
471 dataType : "json",
472 url : latepoint_timestamped_ajaxurl(),
473 data : data,
474 success: function(data){
475 $prev_btn.removeClass('os-loading');
476 if(data.status === "success"){
477 jQuery('#wizard_current_step_code').val(data.step_code);
478 jQuery('.os-wizard-setup-w').attr('class', 'os-wizard-setup-w step-' + data.step_code);
479 jQuery('.os-wizard-step-content').html(data.message);
480 latepoint_init_wizard_content();
481 if(data.show_prev_btn){
482 jQuery('.os-wizard-prev-btn').show();
483 }else{
484 jQuery('.os-wizard-prev-btn').hide();
485 }
486 if(data.show_next_btn){
487 jQuery('.os-wizard-next-btn').show();
488 }else{
489 jQuery('.os-wizard-next-btn').hide();
490 }
491 if(!data.show_next_btn && !data.show_prev_btn){
492 jQuery('.os-wizard-footer').hide();
493 }else{
494 jQuery('.os-wizard-footer').show();
495 }
496 }
497 }
498 });
499 return false;
500 });
501
502 jQuery('.latepoint-content-w').on('change', '.os-widget .os-trigger-reload-widget', function(){
503 latepoint_reload_widget(jQuery(this).closest('.os-widget'));
504 });
505
506 jQuery('.latepoint-content-w').on('click', '.os-widget .timeline-type-toggle .timeline-type-option', function(){
507 jQuery(this).closest('.timeline-type-toggle').find('.timeline-type-option.active').removeClass('active');
508 jQuery(this).addClass('active');
509 jQuery('.timeline-and-availability-contents').removeClass('shows-appointments shows-availability').addClass('shows-' + jQuery(this).data('value'));
510 jQuery('#' + jQuery(this).closest('.timeline-type-toggle').data('value-holder-id')).val(jQuery(this).data('value'));
511 });
512
513
514 dragula([].slice.apply(document.querySelectorAll('.os-categories-ordering-w .os-category-children')), {
515 moves: function (el, container, handle) {
516 return (handle.classList.contains('os-category-drag') || handle.classList.contains('os-category-item-drag'));
517 },
518 }).on('drop', function(el){
519 var $categories_wrapper = jQuery('.os-categories-ordering-w');
520 var category_datas = [];
521 var item_datas = [];
522
523 $categories_wrapper.find('.os-category-parent-w').each(function(index){
524 var order_number = jQuery(this).index() + 1;
525 var parent_id = jQuery(this).parent().closest('.os-category-parent-w').data('id') || 0;
526 category_datas.push({id: jQuery(this).data('id'), order_number: order_number, parent_id: parent_id});
527 });
528 $categories_wrapper.find('.item-in-category-w').each(function(index){
529 var item_order_number = jQuery(this).index() + 1;
530 var category_id = jQuery(this).closest('.os-category-parent-w').data('id') || 0;
531 item_datas.push({id: jQuery(this).data('id'), order_number: item_order_number, category_id: category_id});
532 });
533 latepoint_recalculate_items_count_in_category();
534 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' }
535 $categories_wrapper.addClass('os-loading');
536 jQuery.ajax({
537 type : "post",
538 dataType : "json",
539 url : latepoint_timestamped_ajaxurl(),
540 data : data,
541 success: function(response){
542 $categories_wrapper.removeClass('os-loading');
543 if(response.status === "success"){
544 // latepoint_add_notification(response.message);
545 }else{
546 alert(response.message);
547 }
548 }
549 });
550 });
551
552
553 // Universal re-ordering dragging for form blocks
554 dragula([jQuery('.os-draggable-form-blocks')[0]], {
555 moves: function (el, container, handle) {
556 return handle.classList.contains('os-form-block-drag');
557 },
558 }).on('drop', function(el){
559 var blocks_order_data = {};
560 var $draggable_form_blocks_wrapper = jQuery('.os-draggable-form-blocks');
561 $draggable_form_blocks_wrapper.find('.os-form-block').each(function(index){
562 var new_order_number = jQuery(this).index() + 1;
563 var $block_model_id = jQuery(this).find('.os-form-block-id');
564 if($block_model_id.length && $block_model_id.val()) blocks_order_data[$block_model_id.val()] = new_order_number;
565 });
566 var data = { action: latepoint_helper.route_action,
567 route_name: $draggable_form_blocks_wrapper.data('order-update-route'),
568 params: {ordered_fields: blocks_order_data,
569 fields_for: $draggable_form_blocks_wrapper.data('fields-for')},
570 return_format: 'json' }
571 $draggable_form_blocks_wrapper.addClass('os-loading');
572 jQuery.ajax({
573 type : "post",
574 dataType : "json",
575 url : latepoint_timestamped_ajaxurl(),
576 data : data,
577 success: function(response){
578 $draggable_form_blocks_wrapper.removeClass('os-loading');
579 }
580 });
581 });
582
583
584 jQuery('body.latepoint-admin').on('click', '.os-category-edit-btn, .os-category-edit-cancel-btn, .os-category-w .os-category-name', function(){
585 jQuery(this).closest('.os-category-w').toggleClass('editing');
586 return false;
587 });
588
589 jQuery('body.latepoint-admin').on('click', '.step-edit-btn, .step-edit-cancel-btn, .step-w .step-head', function(){
590 jQuery(this).closest('.step-w').toggleClass('editing');
591 return false;
592 });
593
594 jQuery('body.latepoint-admin').on('click', '.agent-info-change-agent-btn', function(){
595 jQuery(this).closest('.agent-info-w').removeClass('selected').addClass('selecting');
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
605 jQuery('body.latepoint-admin').on('click', '.customer-info-create-btn', function(){
606 jQuery(this).closest('.customer-info-w').removeClass('selecting').addClass('selected');
607 return false;
608 });
609
610 jQuery('body.latepoint-admin').on('click', '.customer-info-load-btn', function(){
611 jQuery(this).closest('.customer-info-w').removeClass('selected').addClass('selecting').find('.customers-selector-search-input').trigger('focus');
612 return false;
613 });
614
615 jQuery('body.latepoint-admin').on('click', '.customers-selector-cancel', function(){
616 jQuery(this).closest('.customer-info-w').removeClass('selecting').addClass('selected ');
617 jQuery('.customers-options-list .customer-option').show();
618 jQuery('.customers-selector-search-input').val('');
619 return false;
620 });
621
622 // CUSTOMER SELECTOR
623
624 // SERVICES SELECTOR
625 jQuery('body.latepoint-admin').on('click', '.service-option-selected', function(){
626 var $select = jQuery(this).closest('.os-services-select-field-w');
627 if($select.hasClass('active')){
628 $select.removeClass('active');
629 }else{
630 $select.addClass('active').find('input').trigger('focus');
631 }
632 return false;
633 });
634
635
636 jQuery('body.latepoint-admin').on('keyup', '.service-options-filter-input', function(){
637 var $list = jQuery(this).closest('.services-options-list');
638 var text = jQuery(this).val().toLowerCase();
639 $list.find('.service-option').hide();
640
641 // Search
642 $list.find('.service-option').each(function(){
643
644 if(jQuery(this).text().toLowerCase().indexOf(""+text+"") != -1 ){
645 jQuery(this).show();
646 }
647 });
648 return false;
649 });
650
651
652 jQuery('.calendar-week-agent-w').on('click', '.calendar-load-target-date', function(event){
653 jQuery(this).addClass('os-loading');
654 latepoint_reload_week_view_calendar(jQuery(this).data('target-date'));
655 return false;
656 });
657
658 jQuery('.calendar-week-agent-w').on('change', '.cc-availability-toggler #overlay_service_availability', function(event){
659 if(jQuery(this).val() == 'on'){
660 jQuery('.calendar-week-agent-w .cc-service-selector').show();
661 }else{
662 jQuery('.calendar-week-agent-w .cc-service-selector').hide();
663 }
664 latepoint_reload_week_view_calendar();
665 });
666
667
668 jQuery('.calendar-week-agent-w').on('change', '.trigger-weekly-calendar-reload', function(event){
669 latepoint_reload_week_view_calendar();
670 return false;
671 });
672
673 jQuery('.latepoint-admin').on('click', '.os-complex-connections-selector .selector-trigger', function(e){
674 var $connection_wrapper = jQuery(this).closest('.connection');
675 if($connection_wrapper.hasClass('active')){
676 latepoint_complex_selector_deselect($connection_wrapper);
677 jQuery(this).closest('.white-box').find('.os-select-all-toggler').prop('checked', false);
678 }else{
679 latepoint_complex_selector_select($connection_wrapper);
680 }
681 return false;
682 });
683
684 jQuery('.latepoint-admin').on('click', '.os-complex-connections-selector .item-quantity-selector', function(e){
685 let val = parseInt(jQuery(this).closest('.item-quantity-selector-w').find('.item-quantity-selector-input').val());
686 if(jQuery(this).data('sign') == 'plus'){
687 val = val + 1;
688 }else{
689 val = val - 1;
690 }
691 val = (val > 0) ? val : 0;
692 jQuery(this).closest('.item-quantity-selector-w').find('.item-quantity-selector-input').val(val).trigger('change');
693 return false;
694 });
695
696 jQuery('.latepoint-admin').on('change', '.os-complex-connections-selector .item-quantity-selector-input', function(e){
697 let $this = jQuery(this);
698 let $connection_wrapper = jQuery(this).closest('.connection');
699 if($this.val() > 0){
700 latepoint_complex_selector_select($connection_wrapper, $this.val());
701 }else{
702 latepoint_complex_selector_deselect($connection_wrapper);
703 }
704 return false;
705 });
706
707 jQuery('.latepoint-admin').on('click', '.os-agents-selector .agent', function(){
708 if(jQuery(this).hasClass('active')){
709 jQuery(this).removeClass('active');
710 jQuery(this).find('.connection-child-is-connected').val('no');
711 }else{
712 jQuery(this).addClass('active');
713 jQuery(this).find('.connection-child-is-connected').val('yes');
714 }
715 return false;
716 });
717
718 jQuery('.latepoint-admin').on('click', '.os-services-selector .service', function(){
719 if(jQuery(this).hasClass('active')){
720 jQuery(this).removeClass('active');
721 jQuery(this).find('.connection-child-is-connected').val('no');
722 }else{
723 jQuery(this).addClass('active');
724 jQuery(this).find('.connection-child-is-connected').val('yes');
725 }
726 return false;
727 });
728
729 jQuery('.latepoint-admin').on( 'click', '.os-form-toggler-group', function( event ){
730 jQuery(this).find('.os-toggler').trigger('click');
731 return false;
732 });
733
734 jQuery('.latepoint-admin').on( 'click', '.os-toggler', function( event ){
735 let $toggler = jQuery(this);
736 if($toggler.data('confirm')){
737 if(!confirm($toggler.data('confirm'))) return false;
738 }
739 if($toggler.hasClass('on')){
740 $toggler.removeClass('on').addClass('off');
741 }else{
742 $toggler.removeClass('off').addClass('on');
743 }
744 if($toggler.data('for')){
745 if($toggler.hasClass('os-toggler-radio')){
746 // radio
747 // uncheck all radio buttons with the same name
748 let $radio = jQuery('#' + $toggler.data('for'));
749 jQuery('input[type="radio"][name="'+ $radio.prop('name') + '"]:checked').each(function(index){
750 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');
751 jQuery('#'+ toggle_content_id).hide();
752 });
753 $radio.prop('checked', !$toggler.hasClass('off'));
754 }else{
755 var $hiddenInput = jQuery('input[type="hidden"]#' + $toggler.data('for'));
756 if($hiddenInput.length){
757 // hidden input
758 if($toggler.data('is-string-value')){
759 $hiddenInput.val($toggler.hasClass('off') ? 'off' : 'on').trigger('change');
760 }else{
761 $hiddenInput.val($toggler.hasClass('off') ? 0 : 1).trigger('change');
762 }
763
764 if($toggler.data('os-instant-update')){
765 let data = new FormData();
766
767 let params = $hiddenInput.serialize();
768 if($toggler.data('nonce')) params+= '&_wpnonce='+$toggler.data('nonce');
769 data.append('params', params);
770 data.append('action', latepoint_helper.route_action);
771 data.append('route_name', $toggler.data('os-instant-update'));
772 data.append('return_format', 'json');
773
774 jQuery.ajax({
775 type: "post",
776 dataType: "json",
777 processData: false,
778 contentType: false,
779 url: latepoint_timestamped_ajaxurl(),
780 data: data,
781 success: function (response) {
782
783 }
784 });
785 }
786 }else{
787 // checkbox
788 jQuery('#' + $toggler.data('for')).prop('checked', !$toggler.hasClass('off'));
789 }
790 }
791 }
792 if($toggler.data('controlled-toggle-id')){
793 if($toggler.hasClass('off')){
794 jQuery('#' + $toggler.data('controlled-toggle-id')).hide();
795 }else{
796 jQuery('#' + $toggler.data('controlled-toggle-id')).show();
797 }
798 }
799 if($toggler.data('negative-controlled-toggle-id')){
800 if($toggler.hasClass('off')){
801 jQuery('#' + $toggler.data('negative-controlled-toggle-id')).show();
802 }else{
803 jQuery('#' + $toggler.data('negative-controlled-toggle-id')).hide();
804 }
805 }
806 $toggler.trigger('ostoggler:toggle');
807 return false;
808 });
809
810
811
812 // UPLOAD/REMOVE IMAGE LINK LOGIC
813 jQuery('.latepoint-admin').on( 'click', '.os-image-selector-trigger', function( event ){
814 var frame;
815
816 event.preventDefault();
817
818 var $image_uploader_trigger = jQuery(this);
819 var $image_selector_w = jQuery(this).closest('.os-image-selector-w');
820 var $image_container = $image_selector_w.find('.os-image-container');
821 var $image_id_holder = $image_selector_w.find('.os-image-id-holder');
822
823 let is_avatar = $image_selector_w.hasClass('is-avatar');
824
825 var image_exists = is_avatar ? $image_container.find('.image-self').length : $image_container.find('img').length;
826
827 if(image_exists){
828 $image_id_holder.val('');
829 $image_selector_w.removeClass('has-image');
830 $image_container.html('');
831 $image_uploader_trigger.find('.os-text-holder').text($image_uploader_trigger.data('label-set-str'));
832 }else{
833 // If the media frame already exists, reopen it.
834 if ( frame ) {
835 frame.open();
836 return false;
837 }
838
839 // Create a new media frame
840 frame = wp.media({
841 title: 'Select or Upload Media',
842 button: { text: 'Use this media' },
843 multiple: false
844 });
845
846 frame.on( 'select', function() {
847 var attachment = frame.state().get('selection').first().toJSON();
848 if(is_avatar){
849 $image_container.html( '<div class="image-self" style="background-image: url('+attachment.url+')"></div>' );
850 }else{
851 $image_container.html( '<img src="'+attachment.url+'" alt=""/>' );
852 }
853 $image_id_holder.val( attachment.id );
854 $image_selector_w.addClass('has-image');
855 $image_uploader_trigger.find('.os-text-holder').text($image_uploader_trigger.data('label-remove-str'));
856 });
857
858 frame.open();
859 }
860
861 return false;
862 });
863
864
865 jQuery('.latepoint-admin').on('click', '.os-multiple-files-uploader a', function(event) {
866 event.stopPropagation();
867 });
868
869 jQuery('.latepoint-admin').on('click', '.os-multiple-files-uploader', function(event) {
870 var frame;
871 event.preventDefault();
872
873 var $uploader_trigger = jQuery(this);
874 var $uploader_wrapper = $uploader_trigger.closest('.os-multiple-files-uploader');
875 var $files_list = $uploader_wrapper.find('.os-uploaded-files-list');
876 var $file_ids_holder = $uploader_wrapper.find('.os-file-ids-holder');
877
878 // Create a new media frame
879 frame = wp.media({
880 title: 'Select or Upload Files',
881 button: { text: 'Add selected files' },
882 multiple: 'add' // Allows to select multiple files
883 });
884
885 // When files are selected...
886 frame.on('select', function() {
887 var attachments = frame.state().get('selection').map(function(attachment) {
888 attachment = attachment.toJSON();
889 return attachment;
890 });
891
892 var current_ids = $file_ids_holder.val() ? $file_ids_holder.val().split(',') : [];
893
894 attachments.forEach(function(attachment) {
895 // Skip if file already added
896 if(current_ids.indexOf(attachment.id.toString()) !== -1) return;
897
898 // Add to IDs list
899 current_ids.push(attachment.id);
900
901 // Add to files list
902 var $file_item = jQuery('<div class="os-uploaded-file" data-file-id="'+attachment.id+'">');
903 $file_item.append('<a class="os-file-link" href="'+attachment.url+'" target="_blank">'+attachment.filename+'</a>');
904 $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>');
905 $files_list.append($file_item);
906 });
907
908 // Update hidden field with all IDs
909 $file_ids_holder.val(current_ids.join(','));
910 });
911
912 frame.open();
913 return false;
914 });
915
916 jQuery('.latepoint-admin').on('click', '.os-remove-file', function(event) {
917 event.preventDefault();
918
919 let $remove_btn = jQuery(this);
920 const confirm_text = $remove_btn.closest('.os-uploaded-files-list').data('confirm-text') || 'Are you sure you want to remove this file?';
921 if (confirm(confirm_text)) {
922 let $file_item = $remove_btn.closest('.os-uploaded-file');
923 let $file_ids_holder = $file_item.closest('.os-multiple-files-uploader').find('.os-file-ids-holder');
924
925 let file_id = $file_item.data('file-id');
926 let current_ids = $file_ids_holder.val() ? $file_ids_holder.val().split(',') : [];
927
928 current_ids = current_ids.filter(function(id) {
929 return id != file_id;
930 });
931
932 $file_ids_holder.val(current_ids.join(','));
933 $file_item.remove();
934 }
935 });
936
937
938
939 jQuery('body').on('click', '.latepoint-lightbox-close', function(){
940 latepoint_lightbox_close();
941 return false;
942 });
943
944
945 jQuery('body').on('click', '.latepoint-side-panel-close-trigger', function(){
946 latepoint_close_side_panel();
947 return false;
948 });
949 jQuery('body').on('click', '.latepoint-side-sub-panel-close-trigger', function(){
950 jQuery(this).closest('.side-sub-panel-wrapper').remove();
951 return false;
952 });
953
954
955
956 jQuery('body.latepoint-admin').on('click', '.time-ampm-select', function(){
957 let $form = jQuery(this).closest('.order-item-booking-data-form-wrapper');
958 jQuery(this).closest('.time-ampm-w').find('.active').removeClass('active');
959 jQuery(this).addClass('active');
960 var ampm_value = jQuery(this).data('ampm-value');
961 jQuery(this).closest('.os-time-group').find('.ampm-value-hidden-holder').val(ampm_value);
962 if(jQuery(this).closest('.quick-start-time-w').length){
963 // 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
964 latepoint_set_booking_end_time($form);
965 latepoint_is_next_day($form);
966 }
967 if(jQuery(this).closest('.quick-end-time-w').length){
968 latepoint_is_next_day($form);
969 }
970 return false;
971 });
972
973
974 jQuery('body.latepoint-admin').on('click', '.latepoint-lightbox-shadow', function(){
975 latepoint_lightbox_close();
976 return false;
977 });
978
979 jQuery('body.latepoint-admin').on('click', '.latepoint-side-panel-shadow', function(){
980 jQuery('.latepoint-side-panel-w').remove();
981 return false;
982 });
983
984 // SCHEDULE
985
986 jQuery('body.latepoint-admin').on('click', '.ws-period-remove', function(e){
987 jQuery(this).closest('.ws-period').remove();
988 return false;
989 });
990
991
992 jQuery('.latepoint-admin').on( 'click', '.weekday-schedule-w .os-toggler', function( event ){
993 if(jQuery(this).hasClass('off')){
994 jQuery(this).closest('.weekday-schedule-w').addClass('day-off').removeClass('is-editing').find('input.is-active').val(0);
995 }else{
996 jQuery(this).closest('.weekday-schedule-w').removeClass('day-off').addClass('is-editing').find('input.is-active').val(1);
997 }
998 return false;
999 });
1000
1001
1002
1003 });