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