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