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