PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / trunk
LatePoint – Calendar Booking Plugin for Appointments and Events vtrunk
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 / bin / admin / _orders.js
latepoint / lib / assets / javascripts / bin / admin Last commit date
_agents.js 1 year ago _calendar.js 3 months ago _chart.js 9 months ago _customers.js 1 year ago _customers_import.js 9 months ago _delete-confirm.js 1 week ago _orders.js 9 months ago _processes.js 1 year ago _razorpay_connect.js 1 month ago _steps.js 9 months ago _stripe_connect.js 1 year ago main.js 2 weeks ago updates.js 3 months ago
_orders.js
768 lines
1
2 /*
3 * Copyright (c) 2024 LatePoint LLC. All rights reserved.
4 */
5
6 function latepoint_submit_quick_order_form(){
7 let $quick_edit_form = jQuery('form.order-quick-edit-form');
8
9 let errors = latepoint_validate_form($quick_edit_form);
10 if(errors.length){
11 let error_messages = errors.map(error => error.message ).join(', ');
12 latepoint_add_notification(error_messages, 'error');
13 return false;
14 }
15
16 $quick_edit_form.find('button[type="submit"]').addClass('os-loading');
17 jQuery.ajax({
18 type: "post",
19 dataType: "json",
20 processData: false,
21 contentType: false,
22 url: latepoint_timestamped_ajaxurl(),
23 data: latepoint_create_form_data($quick_edit_form),
24 success: function (response) {
25 if(response.fields_to_update){
26 for (const [key, value] of Object.entries(response.fields_to_update)) {
27 $quick_edit_form.find('input[name="' + key + '"]').val(value)
28 }
29 }
30 $quick_edit_form.find('button[type="submit"]').removeClass('os-loading');
31 if(response.form_values_to_update){
32 jQuery.each(response.form_values_to_update, function(name, value){
33 $quick_edit_form.find('[name="'+ name +'"]').val(value);
34 });
35 }
36 if (response.status === "success") {
37 latepoint_add_notification(response.message);
38 latepoint_reload_after_order_save();
39 }else{
40 latepoint_add_notification(response.message, 'error');
41 }
42 }
43 });
44
45 }
46
47 function latepoint_apply_agent_selector_change(){
48 if(jQuery('.quick-availability-per-day-w').length){
49
50 let booking_form_id = jQuery('.quick-availability-per-day-w').data('trigger-form-booking-id');
51 let $trigger_btn = jQuery('.order-item-booking-data-form-wrapper[data-booking-id="' + booking_form_id + '"]').find('.trigger-quick-availability');
52
53 latepoint_load_quick_availability($trigger_btn);
54 }
55 }
56
57 function latepoint_apply_service_selector_change($form){
58 let field_base_name = 'order_items[' + $form.data('order-item-id') +'][bookings][' + $form.data('booking-id') +']';
59
60 var $selected_service = $form.find('.os-services-select-field-w .service-option-selected');
61 var service_id = $selected_service.data('id');
62 var buffer_before = $selected_service.data('buffer-before');
63 var buffer_after = $selected_service.data('buffer-after');
64 var default_duration = $selected_service.data('duration');
65 var default_duration_name = $selected_service.data('duration-name');
66 var min_capacity = $selected_service.data('capacity-min');
67 var max_capacity = $selected_service.data('capacity-max');
68
69 var extra_durations = $selected_service.data('extra-durations');
70
71 $form.find('input[name="'+field_base_name+'[buffer_before]"]').val(buffer_before).trigger('change').closest('.os-form-group').addClass('has-value');
72 $form.find('input[name="'+field_base_name+'[buffer_after]"]').val(buffer_after).trigger('change').closest('.os-form-group').addClass('has-value');
73 $form.find('input[name="'+field_base_name+'[service_id]"]').val(service_id).trigger('change').closest('.os-form-group').addClass('has-value');
74
75 var duration_name = default_duration_name ? default_duration_name : (default_duration + ' ' + latepoint_helper.string_minutes);
76 var options = '<option value="'+ default_duration +'">' + duration_name + '</option>';
77 if(extra_durations.length){
78 jQuery.each(extra_durations, function(index, value){
79 var duration_name = value.name ? value.name : value.duration + ' ' + latepoint_helper.string_minutes;
80 options+= '<option value="'+ value.duration +'">' + duration_name + '</option>';
81 });
82 $form.find('.os-service-durations').show();
83 }else{
84 $form.find('.os-service-durations').hide();
85 }
86
87 $form.find('.booking-total-attendees-selector-w .capacity-info strong').text(max_capacity);
88 var attendees_options_html = '';
89 for(var i=1;i<=max_capacity;i++){
90 attendees_options_html+= '<option value="' + i + '">' + i + '</option>';
91 }
92 var selected_attendees = Math.min(jQuery('.booking-total-attendees-selector-w select').val(), max_capacity);
93 $form.find('.booking-total-attendees-selector-w select').html(attendees_options_html).val(selected_attendees);
94 if(max_capacity > 1){
95 $form.find('.booking-total-attendees-selector-w').show();
96 }else{
97 $form.find('.booking-total-attendees-selector-w').hide();
98 }
99
100 $form.find('.os-service-durations select').html(options);
101
102 latepoint_set_booking_end_time($form);
103 if(jQuery('.quick-availability-per-day-w').length){
104 latepoint_load_quick_availability($form.find('.trigger-quick-availability'));
105 }
106
107 latepoint_init_input_masks($form);
108 }
109
110 function latepoint_reload_balance_and_payments(){
111 let $wrapper = jQuery('.balance-payment-info');
112 $wrapper.closest('.balance-payment-wrapper').addClass('os-loading');
113 let route_name = $wrapper.data('route');
114 let $quick_edit_form = $wrapper.closest('form.order-quick-edit-form');
115 let form_data = new FormData($quick_edit_form[0]);
116
117 let data = { action: latepoint_helper.route_action, route_name: route_name, params: latepoint_formdata_to_url_encoded_string(form_data), return_format: 'json' }
118 jQuery.ajax({
119 type : "post",
120 dataType : "json",
121 url : latepoint_timestamped_ajaxurl(),
122 data : data,
123 success: function(response){
124 $wrapper.closest('.balance-payment-wrapper').removeClass('os-loading');
125 if(response.status === "success"){
126 jQuery('.balance-payment-wrapper').html(response.message);
127 latepoint_init_input_masks(jQuery('.balance-payment-wrapper'));
128 latepoint_init_daterangepicker(jQuery('.balance-payment-wrapper .os-date-range-picker'));
129 latepoint_init_payment_request_form(jQuery('.quick-order-form-w'));
130 }else{
131 alert(response.message);
132 }
133 }
134 });
135 }
136
137
138
139 function latepoint_cancel_adding_new_order_item_to_quick_edit_form(){
140 jQuery('.order-items-list').removeClass('is-blurred');
141 jQuery('.new-order-item-list-bundles-wrapper').removeClass('is-open');
142 jQuery('.new-order-item-variant-selector-wrapper').removeClass('is-open');
143 jQuery('.order-form-add-item-btn').removeClass('is-cancelling').find('span').text(jQuery('.order-form-add-item-btn').data('add-label'));
144 }
145
146 function latepoint_build_new_booking_order_item(){
147 jQuery('.order-form-add-item-btn').addClass('os-loading');
148 latepoint_cancel_adding_new_order_item_to_quick_edit_form();
149 let params = {}
150
151 var data = {
152 action: 'latepoint_route_call',
153 route_name: jQuery('.order-form-add-item-btn').data('booking-form-route-name'),
154 params: params,
155 return_format: 'json'
156 }
157 jQuery.ajax({
158 type : "post",
159 dataType : "json",
160 url : latepoint_timestamped_ajaxurl(),
161 data : data,
162 success: function(response){
163 if(response.status === "success"){
164 let $form = jQuery(response.message);
165 jQuery('.order-items-list').prepend($form);
166 jQuery('.order-form-add-item-btn').removeClass('os-loading');
167 latepoint_init_booking_data_form(jQuery('.order-item-booking-data-form-wrapper[data-order-item-id="' + $form.data('order-item-id') + '"]'));
168 // new item added, trigger change event
169 latepoint_quick_order_items_changed();
170 }else{
171 alert(response.message, 'error');
172 }
173 }
174 });
175 }
176
177 function latepoint_build_booking_data_form_for_bundle($slot_for_booking){
178 $slot_for_booking.addClass('os-loading');
179 latepoint_cancel_adding_new_order_item_to_quick_edit_form();
180 let params = {}
181
182 let is_booked = $slot_for_booking.hasClass('is-booked');
183
184 var data = {
185 action: 'latepoint_route_call',
186 route_name: jQuery('.order-form-add-item-btn').data('booking-form-route-name'),
187 params: {
188 order_item_id: $slot_for_booking.data('order-item-id'),
189 order_item_variant: $slot_for_booking.data('order-item-variant'),
190 booking_id: $slot_for_booking.data('booking-id'),
191 booking_item_data: is_booked ? $slot_for_booking.find('.booking_item_data').val() : $slot_for_booking.find('.unscheduled_booking_item_data').val()
192 },
193 return_format: 'json'
194 }
195 jQuery.ajax({
196 type : "post",
197 dataType : "json",
198 url : latepoint_timestamped_ajaxurl(),
199 data : data,
200 success: function(response){
201 if(response.status === "success"){
202 let $form = jQuery(response.message);
203 $slot_for_booking.removeClass('os-loading');
204 if($slot_for_booking){
205 $slot_for_booking.find('.scheduled-bundle-booking').html($form).closest('.order-item-variant-bundle-booking ').addClass('is-booked');
206 }else{
207 jQuery('.order-items-list').prepend($form);
208 }
209 latepoint_init_booking_data_form(jQuery('.order-item-booking-data-form-wrapper[data-order-item-id="' + $form.data('order-item-id') + '"][data-booking-id="' + $form.data('booking-id') + '"]'));
210 // new item added, trigger change event
211 if(!$slot_for_booking) latepoint_quick_order_items_changed();
212 }else{
213 alert(response.message, 'error');
214 }
215 }
216 });
217 }
218
219 function latepoint_bundle_added_to_quick_order(){
220 latepoint_quick_order_items_changed();
221 latepoint_cancel_adding_new_order_item_to_quick_edit_form();
222 }
223
224 function latepoint_quick_order_items_changed(){
225 latepoint_reload_price_breakdown();
226 }
227
228
229 function latepoint_fold_booking_data_form_in_order_quick_edit($booking_data_form){
230 if(!$booking_data_form.length) return false;
231 latepoint_close_quick_availability_form();
232 latepoint_show_all_order_items();
233 let order_item_id = $booking_data_form.data('order-item-id');
234 let booking_id = $booking_data_form.data('booking-id');
235 let order_item_variant = $booking_data_form.data('order-item-variant');
236
237
238 $booking_data_form.addClass('is-loading');
239
240 let form_data = new FormData(jQuery('.order-quick-edit-form')[0]);
241 form_data.set('order_item_id', order_item_id);
242 form_data.set('booking_id', booking_id);
243 var data = {
244 action: 'latepoint_route_call',
245 route_name: jQuery('.order-form-add-item-btn').data('fold-booking-data-route-name'),
246 params: latepoint_formdata_to_url_encoded_string(form_data),
247 return_format: 'json'
248 }
249 jQuery.ajax({
250 type : "post",
251 dataType : "json",
252 url : latepoint_timestamped_ajaxurl(),
253 data : data,
254 success: function(response){
255 if(response.status === "success"){
256 $booking_data_form.removeClass('is-loading').removeClass('is-unfolded').addClass('is-folded');
257 if(order_item_variant == latepoint_helper.order_item_variant_bundle){
258 $booking_data_form.closest('.order-item-variant-bundle-booking').addClass('is-booked');
259 $booking_data_form.find('.bundle-booking-item-pill').replaceWith(response.message);
260 }else{
261 $booking_data_form.find('.order-item-pill').replaceWith(response.message);
262 }
263 }else{
264 alert(response.message, 'error');
265 }
266 }
267 });
268 }
269
270
271 function latepoint_init_booking_data_form($booking_data_form){
272 latepoint_init_input_masks($booking_data_form);
273
274 $booking_data_form.find('.fold-order-item-booking-data-form-btn').on('click', function(){
275 latepoint_fold_booking_data_form_in_order_quick_edit($booking_data_form);
276 return false;
277 });
278
279 $booking_data_form.find('.quick-booking-form-view-log-btn').on('click', function(){
280 var $trigger_elem = jQuery(this);
281 $trigger_elem.addClass('os-loading');
282 var route = $trigger_elem.data('route');
283 var data = { action: 'latepoint_route_call', route_name: route, params: {booking_id: $trigger_elem.data('booking-id')}, return_format: 'json' }
284 jQuery.ajax({
285 type : "post",
286 dataType : "json",
287 url : latepoint_timestamped_ajaxurl(),
288 data : data,
289 success: function(response){
290 $trigger_elem.removeClass('os-loading');
291 if(response.status === "success"){
292 latepoint_display_in_side_sub_panel(response.message);
293 jQuery('body').addClass('has-side-sub-panel');
294 }else{
295 alert(response.message, 'error');
296 }
297 }
298 });
299 return false;
300 });
301
302
303 $booking_data_form.find('.os-late-select').lateSelect();
304
305 $booking_data_form.find('.trigger-quick-availability').on('click', function(){
306 latepoint_load_quick_availability(jQuery(this));
307 return false;
308 });
309
310 let field_base_name = 'order_items[' + $booking_data_form.data('order-item-id') +'][bookings][' + $booking_data_form.data('booking-id') +']';
311
312 $booking_data_form.find('input[name="' + field_base_name +'[start_time][formatted_value]"]').on('change', function(){
313 latepoint_set_booking_end_time($booking_data_form);
314 });
315 $booking_data_form.find('input[name="' + field_base_name +'[end_time][formatted_value]"]').on('change', function(){
316 latepoint_is_next_day($booking_data_form);
317 });
318
319
320
321 $booking_data_form.on('change', '.agent-selector', function(){
322 latepoint_apply_agent_selector_change($booking_data_form);
323 });
324 $booking_data_form.on('change', '.location-selector', function(){
325 latepoint_apply_agent_selector_change($booking_data_form);
326 });
327 $booking_data_form.on('change', 'select[name="booking[location_id]"]', function(){
328 latepoint_apply_agent_selector_change($booking_data_form);
329 });
330 $booking_data_form.on('change', 'select[name="booking[total_attendees]"]', function(){
331 latepoint_apply_agent_selector_change($booking_data_form);
332 });
333
334 $booking_data_form.on('change', '.os-affects-duration', function(){
335 latepoint_set_booking_end_time($booking_data_form);
336 if(jQuery('.quick-availability-per-day-w').length){
337 latepoint_load_quick_availability($booking_data_form.find('.trigger-quick-availability'));
338 }
339 });
340
341 $booking_data_form.on('change', '.os-affects-price', function(){
342 latepoint_reload_price_breakdown();
343 });
344
345 $booking_data_form.on('change', '.os-affects-balance', function(){
346 latepoint_reload_balance_and_payments();
347 });
348 $booking_data_form.on('keyup', '.os-affects-balance', function(event){
349 if(event.keyCode == 13) {
350 latepoint_reload_balance_and_payments();
351 }
352 });
353
354
355 $booking_data_form.on('click', '.services-options-list .service-option', function(){
356 var selected_option_html = jQuery(this).html();
357 var $selected_option = jQuery(this).closest('.os-services-select-field-w').find('.service-option-selected');
358 $selected_option.html(selected_option_html)
359 .data('id', jQuery(this).data('id'))
360 .data('duration', jQuery(this).data('duration'))
361 .data('duration-name', jQuery(this).data('duration-name'))
362 .data('buffer-before', jQuery(this).data('buffer-before'))
363 .data('buffer-after', jQuery(this).data('buffer-after'))
364 .data('capacity-min', jQuery(this).data('capacity-min'))
365 .data('capacity-max', jQuery(this).data('capacity-max'))
366 .data('extra-durations', jQuery(this).data('extra-durations'));
367 jQuery(this).closest('.os-services-select-field-w').find('.service-option.selected').removeClass('selected');
368 jQuery(this).addClass('selected').closest('.os-services-select-field-w').removeClass('active');
369 latepoint_apply_service_selector_change($booking_data_form);
370 return false;
371 });
372
373 $booking_data_form.trigger('latepoint:initBookingDataForm');
374
375 }
376
377 function latepoint_init_payment_request_form($quick_order_form){
378 $quick_order_form.find('select[name="payment_request[portion]"]').on('change', function(){
379 if(jQuery(this).val() == 'custom'){
380 $quick_order_form.find('.custom-charge-amount-wrapper').show();
381 }else{
382 $quick_order_form.find('.custom-charge-amount-wrapper').hide();
383 }
384 })
385 }
386
387 function latepoint_show_all_order_items(){
388 let $quick_order_form = jQuery('.quick-order-form-w');
389 $quick_order_form.find('.order-items-info-w').removeClass('show-preselected-only');
390 $quick_order_form.find('.holds-preselected-booking').removeClass('holds-preselected-booking');
391 }
392
393 function latepoint_init_quick_order_form(){
394 let $quick_order_form = jQuery('.quick-order-form-w');
395 $quick_order_form.trigger('latepoint:initOrderEditForm');
396
397 $quick_order_form.on('change', '.os-affects-balance', function(){
398 latepoint_reload_balance_and_payments();
399 });
400 $quick_order_form.on('keyup', '.os-affects-balance', function(event){
401 if(event.keyCode == 13) {
402 latepoint_reload_balance_and_payments();
403 }
404 });
405
406 latepoint_init_customer_inline_edit_form($quick_order_form.find('.customer-info-w'));
407 $quick_order_form.find('.order-item-booking-data-form-wrapper').each(function(){
408 latepoint_init_booking_data_form(jQuery(this));
409 });
410
411 latepoint_lightbox_close();
412 latepoint_remove_floating_popup();
413 latepoint_init_input_masks($quick_order_form);
414 latepoint_init_daterangepicker($quick_order_form.find('.os-date-range-picker'));
415 latepoint_init_payment_request_form($quick_order_form);
416
417 // Transactions
418
419 $quick_order_form.on('click', '.transaction-refund-settings-button', function(){
420 jQuery(this).closest('.quick-add-transaction-box-w').addClass('show-refund-settings');
421 });
422 $quick_order_form.on('click', '.transaction-refund-submit-button', function(){
423 let $trigger_elem = jQuery(this);
424 if(confirm(jQuery(this).data('os-prompt'))){
425 $trigger_elem.addClass('os-loading');
426 let route = $trigger_elem.data('route');
427 let data = { action: 'latepoint_route_call', route_name: route, params: $trigger_elem.closest('.refund-settings-fields').find('input, textarea, select').serialize(), return_format: 'json' }
428 jQuery.ajax({
429 type : "post",
430 dataType : "json",
431 url : latepoint_timestamped_ajaxurl(),
432 data : data,
433 success: function(response){
434 $trigger_elem.removeClass('os-loading');
435 if(response.status === "success"){
436 $trigger_elem.closest('.quick-add-transaction-box-w').replaceWith(response.message);
437 latepoint_reload_balance_and_payments();
438 }else{
439 alert(response.message, 'error');
440 }
441 }
442 });
443 return false;
444 }
445 });
446
447 $quick_order_form.on('click', '.refund-settings-close', function(){
448 jQuery(this).closest('.quick-add-transaction-box-w').removeClass('show-refund-settings');
449 });
450 $quick_order_form.on('change', '.refund-portion-selector', function(){
451 if(jQuery(this).val() == 'full'){
452 jQuery(this).closest('.refund-settings-fields').find('.custom-charge-amount-wrapper').hide();
453 }else{
454 jQuery(this).closest('.refund-settings-fields').find('.custom-charge-amount-wrapper').show();
455 }
456 });
457
458 // Log
459
460 $quick_order_form.find('.quick-order-form-view-log-btn').on('click', function(){
461 var $trigger_elem = jQuery(this);
462 $trigger_elem.addClass('os-loading');
463 var route = $trigger_elem.data('route');
464 var data = { action: 'latepoint_route_call', route_name: route, params: {order_id: $trigger_elem.data('order-id')}, return_format: 'json' }
465 jQuery.ajax({
466 type : "post",
467 dataType : "json",
468 url : latepoint_timestamped_ajaxurl(),
469 data : data,
470 success: function(response){
471 $trigger_elem.removeClass('os-loading');
472 if(response.status === "success"){
473 latepoint_display_in_side_sub_panel(response.message);
474 jQuery('body').addClass('has-side-sub-panel');
475 }else{
476 alert(response.message, 'error');
477 }
478 }
479 });
480 return false;
481 });
482
483
484 $quick_order_form.find('.new-order-item-variant-bundle').on('click', function(){
485 $quick_order_form.find('.new-order-item-list-bundles-wrapper').toggleClass('is-open');
486 $quick_order_form.find('.new-order-item-variant-selector-wrapper').toggleClass('is-open');
487 return false;
488 });
489
490
491
492
493 $quick_order_form.find('.hidden-order-items-notice-link, .hidden-bundle-items-notice-link').on('click', function(e){
494 latepoint_show_all_order_items();
495 return false;
496 });
497
498 $quick_order_form.find('.order-quick-edit-form').on('submit', function(e){
499 if(jQuery(this).find('button[type="submit"]').hasClass('os-loading')) return false;
500 e.preventDefault();
501 latepoint_submit_quick_order_form();
502 });
503
504 $quick_order_form.on("keydown", ":input:not(textarea):not(:submit)", function(event) {
505 if (event.key == "Enter") {
506 event.preventDefault();
507 }
508 });
509
510 $quick_order_form.find('.order-items-list').on('click', '.remove-order-item-btn', function(){
511 latepoint_close_quick_availability_form();
512 if(confirm(jQuery(this).data('os-prompt'))){
513 if(jQuery(this).closest('.order-item-variant-bundle-booking-wrapper').length){
514 // it's a bundle booking
515 // need to figure out how to remove it when bundle
516 jQuery(this).closest('.order-item-variant-bundle-booking').removeClass('is-booked').find('.scheduled-bundle-booking').html('');
517 }else{
518 jQuery(this).closest('.order-item').remove();
519 jQuery(this).closest('.order-item-booking-data-form-wrapper').remove();
520
521 }
522 latepoint_quick_order_items_changed();
523 }
524 return false;
525 });
526
527 $quick_order_form.find('.new-order-item-variant-booking').on('click', function(){
528 latepoint_fold_all_open_booking_data_forms();
529 latepoint_build_new_booking_order_item();
530 });
531
532 $quick_order_form.on('click', '.order-item-pill.order-item-pill-variant-booking', function(){
533 jQuery(this).closest('.order-item-booking-data-form-wrapper').removeClass('is-folded').addClass('is-unfolded');
534 return false;
535 });
536
537 $quick_order_form.on('click', '.bundle-booking-item-pill', function(){
538 jQuery(this).closest('.order-item-booking-data-form-wrapper').removeClass('is-folded').addClass('is-unfolded');
539 return false;
540 });
541
542 $quick_order_form.on('click', '.unscheduled-bundle-booking', function(){
543 latepoint_build_booking_data_form_for_bundle(jQuery(this).closest('.order-item-variant-bundle-booking'));
544 });
545
546
547 $quick_order_form.find('.order-form-add-item-btn').on('click', function(){
548 let $booking_data_forms = jQuery('.order-item-booking-data-form-wrapper');
549 $booking_data_forms.each(function(){
550 latepoint_fold_booking_data_form_in_order_quick_edit(jQuery(this));
551 });
552 if(jQuery(this).hasClass('is-cancelling')){
553 latepoint_cancel_adding_new_order_item_to_quick_edit_form();
554 }else{
555 if(jQuery('.new-order-item-variant-selector-wrapper').length){
556 jQuery('.order-items-list').addClass('is-blurred');
557 jQuery('.new-order-item-variant-selector-wrapper').addClass('is-open');
558 jQuery(this).addClass('is-cancelling').find('span').text(jQuery(this).data('cancel-label'));
559 }else{
560 // no bundles exist, create booking form
561 latepoint_cancel_adding_new_order_item_to_quick_edit_form();
562 latepoint_build_new_booking_order_item();
563 }
564 }
565 return false;
566 });
567
568
569 $quick_order_form.on('click', '.order-item-variant-bundle .bundle-icon', function(){
570 jQuery(this).closest('.order-item-variant-bundle').toggleClass('is-open');
571 return false;
572 });
573
574 $quick_order_form.find('.reload-price-breakdown').on('click', function(){
575 latepoint_reload_price_breakdown();
576 return false;
577 });
578
579 $quick_order_form.on('click', '.trigger-remove-transaction-btn', function(){
580 jQuery(this).closest('.quick-add-transaction-box-w').remove();
581 return false;
582 });
583
584
585 $quick_order_form.trigger('latepoint:initQuickOrderForm');
586 }
587
588 function latepoint_fold_all_open_booking_data_forms(){
589 let $booking_data_forms = jQuery('.order-item-booking-data-form-wrapper');
590 $booking_data_forms.each(function(){
591 latepoint_fold_booking_data_form_in_order_quick_edit(jQuery(this));
592 });
593 }
594
595 function latepoint_init_customer_inline_edit_form($customer_form){
596
597 latepoint_init_input_masks($customer_form);
598
599 $customer_form.find('.customers-selector-search-input').on('keyup',function(){
600 var $queryInput = jQuery(this);
601 var query = $queryInput.val().toLowerCase();
602 if(query == $queryInput.data('current-query')) return;
603
604 // Search
605 $queryInput.closest('.customers-selector-search-w').addClass('os-loading');
606 $queryInput.data('searching-query', query);
607 setTimeout(function(){
608 if(query != jQuery('.customers-selector-search-input').data('searching-query')) return;
609 var data = { action: latepoint_helper.route_action, route_name: $queryInput.data('route'), params: {query: query}, return_format: 'json' }
610 jQuery.ajax({
611 type : "post",
612 dataType : "json",
613 url : latepoint_timestamped_ajaxurl(),
614 data : data,
615 success: function(response){
616 if($queryInput.data('searching-query') != query) return;
617 $queryInput.closest('.customers-selector-search-w').removeClass('os-loading');
618 if(response.status === "success"){
619 $queryInput.data('current-query', query);
620 jQuery('.quick-order-form-w .customers-options-list').html(response.message);
621 }else{
622 // console.log(response.message);
623 }
624 }
625 });
626 }, 300, query, $queryInput);
627 });
628
629 }
630
631
632 function latepoint_load_quick_availability($trigger_elem, custom_agent_id = false, start_date = false, load_more_days = false, load_prev_days = false){
633 $trigger_elem.addClass('os-loading');
634
635 let $booking_form = $trigger_elem.closest('.order-item-booking-data-form-wrapper');
636 var route = $booking_form.find('.trigger-quick-availability').data('route');
637 var $quick_order_form = jQuery('.quick-order-form-w');
638
639 if(custom_agent_id) $quick_order_form.find('.agent-selector').val(custom_agent_id);
640 if(!$quick_order_form.find('.service-selector').val() || $quick_order_form.find('.service-selector').val() == '0'){
641 $quick_order_form.find('.os-services-select-field-w .service-option:first').trigger('click');
642 }
643
644 let form_data = new FormData($quick_order_form.find('form')[0]);
645
646
647 form_data.set('trigger_form_booking_id', $booking_form.data('booking-id'));
648 form_data.set('trigger_form_order_item_id', $booking_form.data('order-item-id'));
649
650 if(start_date) form_data.set('start_date', start_date);
651 if(load_more_days || load_prev_days) form_data.set('show_days_only', true);
652 if(load_prev_days) form_data.set('previous_days', true);
653
654 var data = {
655 action: latepoint_helper.route_action,
656 route_name: route,
657 params: latepoint_formdata_to_url_encoded_string(form_data),
658 return_format: 'json'
659 }
660
661 jQuery.ajax({
662 type : "post",
663 dataType : "json",
664 url : latepoint_timestamped_ajaxurl(),
665 data : data,
666 success: function(response){
667 $trigger_elem.removeClass('os-loading');
668 if(response.status === "success"){
669 if(load_more_days){
670 jQuery('.latepoint-side-panel-w .quick-availability-per-day-w').html(response.message);
671 jQuery('.latepoint-side-panel-w .os-availability-days').scrollTop(52);
672 }else if(load_prev_days){
673 jQuery('.latepoint-side-panel-w .quick-availability-per-day-w').html(response.message);
674 jQuery('.latepoint-side-panel-w .os-availability-days').scrollTop(jQuery('.latepoint-side-panel-w .os-availability-days')[0].scrollHeight - jQuery('.latepoint-side-panel-w .os-availability-days')[0].clientHeight - 50);
675 }else{
676 latepoint_display_in_side_sub_panel(response.message);
677 jQuery('.latepoint-side-panel-w .os-availability-days').scrollTop(52);
678 jQuery('body').addClass('has-side-sub-panel');
679 latepoint_init_quick_availability_form();
680 }
681 }else{
682 alert(response.message, 'error');
683 }
684 }
685 });
686 }
687
688 function latepoint_create_field_base_name(order_item_id, booking_id){
689 return 'order_items['+order_item_id+'][bookings]['+booking_id+']';
690 }
691
692 function latepoint_close_quick_availability_form(){
693 jQuery('.quick-availability-per-day-w').remove();
694 jQuery('body').removeClass('has-side-sub-panel');
695 }
696
697 function latepoint_init_quick_availability_form(){
698 // TODO set booking ID
699 let $quick_availability_wrapper = jQuery('.quick-availability-per-day-w');
700
701 let trigger_form_order_item_id = $quick_availability_wrapper.data('trigger-form-order-item-id');
702 let trigger_form_booking_id = $quick_availability_wrapper.data('trigger-form-booking-id');
703
704 let field_base_name = latepoint_create_field_base_name(trigger_form_order_item_id, trigger_form_booking_id);
705
706 let $booking_data_form = jQuery('.quick-order-form-w .order-item-booking-data-form-wrapper[data-booking-id="'+trigger_form_booking_id+'"]');
707
708 var selected_start_date = $booking_data_form.find('input[name="'+field_base_name+'[start_date_formatted]"').val();
709 var selected_start_time = $booking_data_form.find('input[name="'+field_base_name+'[start_time][formatted_value]"]').val();
710 var selected_start_time_ampm = $booking_data_form.find('input[name="'+field_base_name+'[start_time][ampm]"]').val();
711
712
713 var selected_start_time_minutes = latepoint_hours_and_minutes_to_minutes(selected_start_time, selected_start_time_ampm);
714 $quick_availability_wrapper.find('.os-availability-days').find('.agent-timeslot[data-formatted-date="'+ selected_start_date +'"][data-minutes="' + selected_start_time_minutes + '"]').addClass('selected');
715 $quick_availability_wrapper.on('click', '.load-more-quick-availability', function(){
716 jQuery(this).addClass('os-loading');
717 let booking_form_id = jQuery(this).closest('.quick-availability-per-day-w').data('trigger-form-booking-id');
718 let $trigger_btn = jQuery('.order-item-booking-data-form-wrapper[data-booking-id="' + booking_form_id + '"]').find('.trigger-quick-availability');
719 latepoint_load_quick_availability($trigger_btn, false, jQuery(this).data('start-date'), true);
720 return false;
721 });
722 $quick_availability_wrapper.on('click', '.load-prev-quick-availability', function(){
723 jQuery(this).addClass('os-loading');
724 let booking_form_id = jQuery(this).closest('.quick-availability-per-day-w').data('trigger-form-booking-id');
725 let $trigger_btn = jQuery('.order-item-booking-data-form-wrapper[data-booking-id="' + booking_form_id + '"]').find('.trigger-quick-availability');
726 latepoint_load_quick_availability($trigger_btn, false, jQuery(this).data('start-date'), false, true);
727 return false;
728 });
729 $quick_availability_wrapper.find('select[name="booking[agent_id]"]').on('change', function(){
730 latepoint_load_quick_availability(jQuery('.trigger-quick-availability'), jQuery(this).val());
731 });
732 jQuery('.os-time-group label').on('click', function(){
733 jQuery(this).closest('.os-time-group').find('.os-form-control').trigger('focus');
734 });
735 $quick_availability_wrapper.on('click', '.fill-booking-time', function(){
736 jQuery('.os-availability-days .agent-timeslot.selected').removeClass('selected');
737 jQuery(this).addClass('selected');
738 var formatted_date = jQuery(this).data('formatted-date');
739 var minutes = jQuery(this).data('minutes');
740 $booking_data_form.find('input[name="'+field_base_name+'[start_date_formatted]"]').val(formatted_date);
741 var start_minutes = minutes;
742 var start_hours_and_minutes = latepoint_minutes_to_hours_and_minutes(start_minutes);
743
744 if(start_minutes >= 720){
745 $booking_data_form.find('.quick-start-time-w .time-pm').trigger('click');
746 }else{
747 $booking_data_form.find('.quick-start-time-w .time-am').trigger('click');
748 }
749
750 $booking_data_form.find('input[name="'+field_base_name+'[start_time][formatted_value]"]').val(start_hours_and_minutes);
751 latepoint_set_booking_end_time($booking_data_form);
752 $booking_data_form.find('.ws-period, .as-period').addClass('animate-filled-in');
753 setTimeout(function(){
754 $booking_data_form.find('.ws-period, .as-period').removeClass('animate-filled-in');
755 }, 500)
756 });
757 }
758
759
760 function latepoint_reload_after_order_save(){
761 latepoint_reload_calendar_view();
762
763 jQuery('.os-widget').each(function(){
764 latepoint_reload_widget(jQuery(this));
765 });
766 if(jQuery('table.os-reload-on-booking-update').length) latepoint_filter_table(jQuery('table.os-reload-on-booking-update'), jQuery('table.os-reload-on-booking-update'));
767 latepoint_close_side_panel();
768 }