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