PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / 5.1.3
LatePoint – Calendar Booking Plugin for Appointments and Events v5.1.3
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 / bin / admin / _orders.js
latepoint / lib / assets / javascripts / bin / admin Last commit date
_agents.js 1 year ago _calendar.js 1 year ago _chart.js 1 year ago _customers.js 1 year ago _orders.js 1 year ago _processes.js 1 year ago _steps.js 1 year ago _stripe_connect.js 1 year ago main.js 1 year ago updates.js 1 year ago
_orders.js
764 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', 'select[name="booking[location_id]"]', function(){
325 latepoint_apply_agent_selector_change($booking_data_form);
326 });
327 $booking_data_form.on('change', 'select[name="booking[total_attendees]"]', function(){
328 latepoint_apply_agent_selector_change($booking_data_form);
329 });
330
331 $booking_data_form.on('change', '.os-affects-duration', function(){
332 latepoint_set_booking_end_time($booking_data_form);
333 if(jQuery('.quick-availability-per-day-w').length){
334 latepoint_load_quick_availability($booking_data_form.find('.trigger-quick-availability'));
335 }
336 });
337
338 $booking_data_form.on('change', '.os-affects-price', function(){
339 latepoint_reload_price_breakdown();
340 });
341
342 $booking_data_form.on('change', '.os-affects-balance', function(){
343 latepoint_reload_balance_and_payments();
344 });
345 $booking_data_form.on('keyup', '.os-affects-balance', function(event){
346 if(event.keyCode == 13) {
347 latepoint_reload_balance_and_payments();
348 }
349 });
350
351
352 $booking_data_form.on('click', '.services-options-list .service-option', function(){
353 var selected_option_html = jQuery(this).html();
354 var $selected_option = jQuery(this).closest('.os-services-select-field-w').find('.service-option-selected');
355 $selected_option.html(selected_option_html)
356 .data('id', jQuery(this).data('id'))
357 .data('duration', jQuery(this).data('duration'))
358 .data('duration-name', jQuery(this).data('duration-name'))
359 .data('buffer-before', jQuery(this).data('buffer-before'))
360 .data('buffer-after', jQuery(this).data('buffer-after'))
361 .data('capacity-min', jQuery(this).data('capacity-min'))
362 .data('capacity-max', jQuery(this).data('capacity-max'))
363 .data('extra-durations', jQuery(this).data('extra-durations'));
364 jQuery(this).closest('.os-services-select-field-w').find('.service-option.selected').removeClass('selected');
365 jQuery(this).addClass('selected').closest('.os-services-select-field-w').removeClass('active');
366 latepoint_apply_service_selector_change($booking_data_form);
367 return false;
368 });
369
370 $booking_data_form.trigger('latepoint:initBookingDataForm');
371
372 }
373
374 function latepoint_init_payment_request_form($quick_order_form){
375 $quick_order_form.find('select[name="payment_request[portion]"]').on('change', function(){
376 if(jQuery(this).val() == 'custom'){
377 $quick_order_form.find('.custom-charge-amount-wrapper').show();
378 }else{
379 $quick_order_form.find('.custom-charge-amount-wrapper').hide();
380 }
381 })
382 }
383
384 function latepoint_show_all_order_items(){
385 let $quick_order_form = jQuery('.quick-order-form-w');
386 $quick_order_form.find('.order-items-info-w').removeClass('show-preselected-only');
387 $quick_order_form.find('.holds-preselected-booking').removeClass('holds-preselected-booking');
388 }
389
390 function latepoint_init_quick_order_form(){
391 let $quick_order_form = jQuery('.quick-order-form-w');
392 $quick_order_form.trigger('latepoint:initOrderEditForm');
393
394 $quick_order_form.on('change', '.os-affects-balance', function(){
395 latepoint_reload_balance_and_payments();
396 });
397 $quick_order_form.on('keyup', '.os-affects-balance', function(event){
398 if(event.keyCode == 13) {
399 latepoint_reload_balance_and_payments();
400 }
401 });
402
403 latepoint_init_customer_inline_edit_form($quick_order_form.find('.customer-info-w'));
404 $quick_order_form.find('.order-item-booking-data-form-wrapper').each(function(){
405 latepoint_init_booking_data_form(jQuery(this));
406 });
407
408 latepoint_lightbox_close();
409 latepoint_remove_floating_popup();
410 latepoint_init_input_masks($quick_order_form);
411 latepoint_init_daterangepicker($quick_order_form.find('.os-date-range-picker'));
412 latepoint_init_payment_request_form($quick_order_form);
413
414 // Transactions
415
416 $quick_order_form.on('click', '.transaction-refund-settings-button', function(){
417 jQuery(this).closest('.quick-add-transaction-box-w').addClass('show-refund-settings');
418 });
419 $quick_order_form.on('click', '.transaction-refund-submit-button', function(){
420 let $trigger_elem = jQuery(this);
421 if(confirm(jQuery(this).data('os-prompt'))){
422 $trigger_elem.addClass('os-loading');
423 let route = $trigger_elem.data('route');
424 let data = { action: 'latepoint_route_call', route_name: route, params: $trigger_elem.closest('.refund-settings-fields').find('input, textarea, select').serialize(), return_format: 'json' }
425 jQuery.ajax({
426 type : "post",
427 dataType : "json",
428 url : latepoint_timestamped_ajaxurl(),
429 data : data,
430 success: function(response){
431 $trigger_elem.removeClass('os-loading');
432 if(response.status === "success"){
433 $trigger_elem.closest('.quick-add-transaction-box-w').replaceWith(response.message);
434 latepoint_reload_balance_and_payments();
435 }else{
436 alert(response.message, 'error');
437 }
438 }
439 });
440 return false;
441 }
442 });
443
444 $quick_order_form.on('click', '.refund-settings-close', function(){
445 jQuery(this).closest('.quick-add-transaction-box-w').removeClass('show-refund-settings');
446 });
447 $quick_order_form.on('change', '.refund-portion-selector', function(){
448 if(jQuery(this).val() == 'full'){
449 jQuery(this).closest('.refund-settings-fields').find('.custom-charge-amount-wrapper').hide();
450 }else{
451 jQuery(this).closest('.refund-settings-fields').find('.custom-charge-amount-wrapper').show();
452 }
453 });
454
455 // Log
456
457 $quick_order_form.find('.quick-order-form-view-log-btn').on('click', function(){
458 var $trigger_elem = jQuery(this);
459 $trigger_elem.addClass('os-loading');
460 var route = $trigger_elem.data('route');
461 var data = { action: 'latepoint_route_call', route_name: route, params: {order_id: $trigger_elem.data('order-id')}, return_format: 'json' }
462 jQuery.ajax({
463 type : "post",
464 dataType : "json",
465 url : latepoint_timestamped_ajaxurl(),
466 data : data,
467 success: function(response){
468 $trigger_elem.removeClass('os-loading');
469 if(response.status === "success"){
470 latepoint_display_in_side_sub_panel(response.message);
471 jQuery('body').addClass('has-side-sub-panel');
472 }else{
473 alert(response.message, 'error');
474 }
475 }
476 });
477 return false;
478 });
479
480
481 $quick_order_form.find('.new-order-item-variant-bundle').on('click', function(){
482 $quick_order_form.find('.new-order-item-list-bundles-wrapper').toggleClass('is-open');
483 $quick_order_form.find('.new-order-item-variant-selector-wrapper').toggleClass('is-open');
484 return false;
485 });
486
487
488
489
490 $quick_order_form.find('.hidden-order-items-notice-link, .hidden-bundle-items-notice-link').on('click', function(e){
491 latepoint_show_all_order_items();
492 return false;
493 });
494
495 $quick_order_form.find('.order-quick-edit-form').on('submit', function(e){
496 if(jQuery(this).find('button[type="submit"]').hasClass('os-loading')) return false;
497 e.preventDefault();
498 latepoint_submit_quick_order_form();
499 });
500
501 $quick_order_form.on("keydown", ":input:not(textarea):not(:submit)", function(event) {
502 if (event.key == "Enter") {
503 event.preventDefault();
504 }
505 });
506
507 $quick_order_form.find('.order-items-list').on('click', '.remove-order-item-btn', function(){
508 latepoint_close_quick_availability_form();
509 if(confirm(jQuery(this).data('os-prompt'))){
510 if(jQuery(this).closest('.order-item-variant-bundle-booking-wrapper').length){
511 // it's a bundle booking
512 // need to figure out how to remove it when bundle
513 jQuery(this).closest('.order-item-variant-bundle-booking').removeClass('is-booked').find('.scheduled-bundle-booking').html('');
514 }else{
515 jQuery(this).closest('.order-item').remove();
516 jQuery(this).closest('.order-item-booking-data-form-wrapper').remove();
517
518 }
519 latepoint_quick_order_items_changed();
520 }
521 return false;
522 });
523
524 $quick_order_form.find('.new-order-item-variant-booking').on('click', function(){
525 latepoint_fold_all_open_booking_data_forms();
526 latepoint_build_new_booking_order_item();
527 });
528
529 $quick_order_form.on('click', '.order-item-pill.order-item-pill-variant-booking', function(){
530 jQuery(this).closest('.order-item-booking-data-form-wrapper').removeClass('is-folded').addClass('is-unfolded');
531 return false;
532 });
533
534 $quick_order_form.on('click', '.bundle-booking-item-pill', function(){
535 jQuery(this).closest('.order-item-booking-data-form-wrapper').removeClass('is-folded').addClass('is-unfolded');
536 return false;
537 });
538
539 $quick_order_form.on('click', '.unscheduled-bundle-booking', function(){
540 latepoint_build_booking_data_form_for_bundle(jQuery(this).closest('.order-item-variant-bundle-booking'));
541 });
542
543
544 $quick_order_form.find('.order-form-add-item-btn').on('click', function(){
545 let $booking_data_forms = jQuery('.order-item-booking-data-form-wrapper');
546 $booking_data_forms.each(function(){
547 latepoint_fold_booking_data_form_in_order_quick_edit(jQuery(this));
548 });
549 if(jQuery(this).hasClass('is-cancelling')){
550 latepoint_cancel_adding_new_order_item_to_quick_edit_form();
551 }else{
552 if(jQuery('.new-order-item-variant-selector-wrapper').length){
553 jQuery('.order-items-list').addClass('is-blurred');
554 jQuery('.new-order-item-variant-selector-wrapper').addClass('is-open');
555 jQuery(this).addClass('is-cancelling').find('span').text(jQuery(this).data('cancel-label'));
556 }else{
557 // no bundles exist, create booking form
558 latepoint_cancel_adding_new_order_item_to_quick_edit_form();
559 latepoint_build_new_booking_order_item();
560 }
561 }
562 return false;
563 });
564
565
566 $quick_order_form.on('click', '.order-item-variant-bundle .bundle-icon', function(){
567 jQuery(this).closest('.order-item-variant-bundle').toggleClass('is-open');
568 return false;
569 });
570
571 $quick_order_form.find('.reload-price-breakdown').on('click', function(){
572 latepoint_reload_price_breakdown();
573 return false;
574 });
575
576 $quick_order_form.on('click', '.trigger-remove-transaction-btn', function(){
577 jQuery(this).closest('.quick-add-transaction-box-w').remove();
578 return false;
579 });
580
581
582 $quick_order_form.trigger('latepoint:initQuickOrderForm');
583 }
584
585 function latepoint_fold_all_open_booking_data_forms(){
586 let $booking_data_forms = jQuery('.order-item-booking-data-form-wrapper');
587 $booking_data_forms.each(function(){
588 latepoint_fold_booking_data_form_in_order_quick_edit(jQuery(this));
589 });
590 }
591
592 function latepoint_init_customer_inline_edit_form($customer_form){
593
594 latepoint_init_input_masks($customer_form);
595
596 $customer_form.find('.customers-selector-search-input').on('keyup',function(){
597 var $queryInput = jQuery(this);
598 var query = $queryInput.val().toLowerCase();
599 if(query == $queryInput.data('current-query')) return;
600
601 // Search
602 $queryInput.closest('.customers-selector-search-w').addClass('os-loading');
603 $queryInput.data('searching-query', query);
604 setTimeout(function(){
605 if(query != jQuery('.customers-selector-search-input').data('searching-query')) return;
606 var data = { action: latepoint_helper.route_action, route_name: $queryInput.data('route'), params: {query: query}, return_format: 'json' }
607 jQuery.ajax({
608 type : "post",
609 dataType : "json",
610 url : latepoint_timestamped_ajaxurl(),
611 data : data,
612 success: function(response){
613 if($queryInput.data('searching-query') != query) return;
614 $queryInput.closest('.customers-selector-search-w').removeClass('os-loading');
615 if(response.status === "success"){
616 $queryInput.data('current-query', query);
617 jQuery('.quick-order-form-w .customers-options-list').html(response.message);
618 }else{
619 // console.log(response.message);
620 }
621 }
622 });
623 }, 300, query, $queryInput);
624 });
625
626 }
627
628
629 function latepoint_load_quick_availability($trigger_elem, custom_agent_id = false, start_date = false, load_more_days = false, load_prev_days = false){
630 $trigger_elem.addClass('os-loading');
631
632 let $booking_form = $trigger_elem.closest('.order-item-booking-data-form-wrapper');
633 var route = $booking_form.find('.trigger-quick-availability').data('route');
634 var $quick_order_form = jQuery('.quick-order-form-w');
635
636 if(custom_agent_id) $quick_order_form.find('.agent-selector').val(custom_agent_id);
637 if(!$quick_order_form.find('.service-selector').val() || $quick_order_form.find('.service-selector').val() == '0'){
638 $quick_order_form.find('.os-services-select-field-w .service-option:first').trigger('click');
639 }
640
641 let form_data = new FormData($quick_order_form.find('form')[0]);
642
643
644 form_data.set('trigger_form_booking_id', $booking_form.data('booking-id'));
645 form_data.set('trigger_form_order_item_id', $booking_form.data('order-item-id'));
646
647 if(start_date) form_data.set('start_date', start_date);
648 if(load_more_days || load_prev_days) form_data.set('show_days_only', true);
649 if(load_prev_days) form_data.set('previous_days', true);
650
651 var data = {
652 action: latepoint_helper.route_action,
653 route_name: route,
654 params: latepoint_formdata_to_url_encoded_string(form_data),
655 return_format: 'json'
656 }
657
658 jQuery.ajax({
659 type : "post",
660 dataType : "json",
661 url : latepoint_timestamped_ajaxurl(),
662 data : data,
663 success: function(response){
664 $trigger_elem.removeClass('os-loading');
665 if(response.status === "success"){
666 if(load_more_days){
667 jQuery('.latepoint-side-panel-w .quick-availability-per-day-w').html(response.message);
668 }else if(load_prev_days){
669 jQuery('.latepoint-side-panel-w .quick-availability-per-day-w').html(response.message);
670 jQuery('.latepoint-side-panel-w .os-availability-days').scrollTop(30);
671 }else{
672 latepoint_display_in_side_sub_panel(response.message);
673 jQuery('.latepoint-side-panel-w .os-availability-days').scrollTop(30);
674 jQuery('body').addClass('has-side-sub-panel');
675 latepoint_init_quick_availability_form();
676 }
677 }else{
678 alert(response.message, 'error');
679 }
680 }
681 });
682 }
683
684 function latepoint_create_field_base_name(order_item_id, booking_id){
685 return 'order_items['+order_item_id+'][bookings]['+booking_id+']';
686 }
687
688 function latepoint_close_quick_availability_form(){
689 jQuery('.quick-availability-per-day-w').remove();
690 jQuery('body').removeClass('has-side-sub-panel');
691 }
692
693 function latepoint_init_quick_availability_form(){
694 // TODO set booking ID
695 let $quick_availability_wrapper = jQuery('.quick-availability-per-day-w');
696
697 let trigger_form_order_item_id = $quick_availability_wrapper.data('trigger-form-order-item-id');
698 let trigger_form_booking_id = $quick_availability_wrapper.data('trigger-form-booking-id');
699
700 let field_base_name = latepoint_create_field_base_name(trigger_form_order_item_id, trigger_form_booking_id);
701
702 let $booking_data_form = jQuery('.quick-order-form-w .order-item-booking-data-form-wrapper[data-booking-id="'+trigger_form_booking_id+'"]');
703
704 var selected_start_date = $booking_data_form.find('input[name="'+field_base_name+'[start_date_formatted]"').val();
705 var selected_start_time = $booking_data_form.find('input[name="'+field_base_name+'[start_time][formatted_value]"]').val();
706 var selected_start_time_ampm = $booking_data_form.find('input[name="'+field_base_name+'[start_time][ampm]"]').val();
707
708
709 var selected_start_time_minutes = latepoint_hours_and_minutes_to_minutes(selected_start_time, selected_start_time_ampm);
710 $quick_availability_wrapper.find('.os-availability-days').find('.agent-timeslot[data-formatted-date="'+ selected_start_date +'"][data-minutes="' + selected_start_time_minutes + '"]').addClass('selected');
711 $quick_availability_wrapper.on('click', '.load-more-quick-availability', function(){
712 jQuery(this).addClass('os-loading');
713 let booking_form_id = jQuery(this).closest('.quick-availability-per-day-w').data('trigger-form-booking-id');
714 let $trigger_btn = jQuery('.order-item-booking-data-form-wrapper[data-booking-id="' + booking_form_id + '"]').find('.trigger-quick-availability');
715 latepoint_load_quick_availability($trigger_btn, false, jQuery(this).data('start-date'), true);
716 return false;
717 });
718 $quick_availability_wrapper.on('click', '.load-prev-quick-availability', function(){
719 jQuery(this).addClass('os-loading');
720 let booking_form_id = jQuery(this).closest('.quick-availability-per-day-w').data('trigger-form-booking-id');
721 let $trigger_btn = jQuery('.order-item-booking-data-form-wrapper[data-booking-id="' + booking_form_id + '"]').find('.trigger-quick-availability');
722 latepoint_load_quick_availability($trigger_btn, false, jQuery(this).data('start-date'), false, true);
723 return false;
724 });
725 $quick_availability_wrapper.find('select[name="booking[agent_id]"]').on('change', function(){
726 latepoint_load_quick_availability(jQuery('.trigger-quick-availability'), jQuery(this).val());
727 });
728 jQuery('.os-time-group label').on('click', function(){
729 jQuery(this).closest('.os-time-group').find('.os-form-control').trigger('focus');
730 });
731 $quick_availability_wrapper.on('click', '.fill-booking-time', function(){
732 jQuery('.os-availability-days .agent-timeslot.selected').removeClass('selected');
733 jQuery(this).addClass('selected');
734 var formatted_date = jQuery(this).data('formatted-date');
735 var minutes = jQuery(this).data('minutes');
736 $booking_data_form.find('input[name="'+field_base_name+'[start_date_formatted]"]').val(formatted_date);
737 var start_minutes = minutes;
738 var start_hours_and_minutes = latepoint_minutes_to_hours_and_minutes(start_minutes);
739
740 if(start_minutes >= 720){
741 $booking_data_form.find('.quick-start-time-w .time-pm').trigger('click');
742 }else{
743 $booking_data_form.find('.quick-start-time-w .time-am').trigger('click');
744 }
745
746 $booking_data_form.find('input[name="'+field_base_name+'[start_time][formatted_value]"]').val(start_hours_and_minutes);
747 latepoint_set_booking_end_time($booking_data_form);
748 $booking_data_form.find('.ws-period, .as-period').addClass('animate-filled-in');
749 setTimeout(function(){
750 $booking_data_form.find('.ws-period, .as-period').removeClass('animate-filled-in');
751 }, 500)
752 });
753 }
754
755
756 function latepoint_reload_after_order_save(){
757 latepoint_reload_calendar_view();
758
759 jQuery('.os-widget').each(function(){
760 latepoint_reload_widget(jQuery(this));
761 });
762 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'));
763 latepoint_close_side_panel();
764 }