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