PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / 5.5.2
LatePoint – Calendar Booking Plugin for Appointments and Events v5.5.2
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 / front / _customer.js
latepoint / lib / assets / javascripts / bin / front Last commit date
_customer.js 4 months ago _events.js 1 year ago _stripe_connect.js 1 year ago main.js 4 months ago
_customer.js
404 lines
1 /*
2 * Copyright (c) 2023 LatePoint LLC. All rights reserved.
3 */
4
5 async function latepoint_init_transaction_payment_form() {
6 let callbacks_list = [];
7 let $transaction_payment_form = jQuery('.latepoint-transaction-payment-form');
8 let current_step = $transaction_payment_form.find('input[name="current_step"]').val();
9
10 $transaction_payment_form.on('click keydown', '.lp-option', (e) => {
11 let $option = jQuery(e.currentTarget);
12 if(e.type === 'keydown' && e.key !== ' ' && e.key !== 'Enter') return;
13 $option.closest('.lp-options').find('.lp-option.selected').removeClass('selected');
14 $option.addClass('selected');
15 $transaction_payment_form.find('input[name="' + $option.data('holder') + '"]').val($option.data('value'));
16 $transaction_payment_form.trigger('submit');
17 return false;
18 });
19
20
21 switch (current_step) {
22 case 'methods':
23 break;
24 case 'processors':
25 break;
26 case 'pay':
27 $transaction_payment_form.trigger('latepoint:initOrderPaymentMethod', [{
28 callbacks_list: callbacks_list,
29 payment_method: $transaction_payment_form.find('input[name="payment_method"]').val(),
30 payment_processor: $transaction_payment_form.find('input[name="payment_processor"]').val(),
31 }]);
32 $transaction_payment_form.addClass('os-loading');
33
34 try {
35 for (const callback of callbacks_list) {
36 await callback.action();
37 }
38 $transaction_payment_form.removeClass('os-loading');
39 } catch (error) {
40 latepoint_show_error_and_stop_loading_booking_form(error, $transaction_payment_form);
41 }
42 break;
43 case 'confirmation':
44 break;
45 }
46
47 $transaction_payment_form.on('submit', async function (e) {
48 e.preventDefault();
49 await latepoint_submit_transaction_payment_form(jQuery(e.target));
50 });
51 }
52
53 async function latepoint_submit_transaction_payment_form($transaction_payment_form) {
54
55 if($transaction_payment_form.hasClass('os-loading')) return false;
56 let callbacks_list = [];
57
58 $transaction_payment_form.find('.latepoint-message').remove();
59 $transaction_payment_form.addClass('os-loading');
60 $transaction_payment_form.find('.latepoint-btn').addClass('os-loading');
61
62 $transaction_payment_form.trigger('latepoint:submitTransactionPaymentForm', [{
63 callbacks_list: callbacks_list,
64 payment_method: $transaction_payment_form.find('input[name="payment_method"]').val(),
65 payment_processor: $transaction_payment_form.find('input[name="payment_processor"]').val(),
66 current_step: $transaction_payment_form.find('input[name="current_step"]').val(),
67 }]);
68
69 try {
70 for (const callback of callbacks_list) {
71 await callback.action();
72 }
73 } catch (error) {
74 $transaction_payment_form.removeClass('os-loading').find('.os-loading').removeClass('os-loading');
75 latepoint_show_message_inside_element(error.message, $transaction_payment_form.find('.lp-payment-method-content'), 'error');
76 return false;
77 }
78
79
80 try {
81 let response = await jQuery.ajax({
82 type: "post",
83 dataType: "json",
84 processData: false,
85 contentType: false,
86 url: latepoint_timestamped_ajaxurl(),
87 data: latepoint_create_form_data($transaction_payment_form, latepoint_helper.invoices_payment_form_route)
88 });
89
90 $transaction_payment_form.removeClass('os-loading').find('.os-loading').removeClass('os-loading');
91
92 if (response.status === 'success') {
93 $transaction_payment_form.html(response.message);
94 return await latepoint_init_transaction_payment_form();
95
96 } else {
97 latepoint_show_message_inside_element(response.message, $transaction_payment_form.find('.lp-payment-method-content'), 'error');
98 return false;
99 }
100 } catch (e) {
101
102 $transaction_payment_form.removeClass('os-loading').find('.os-loading').removeClass('os-loading');
103 console.log(e);
104 alert('Error:' + e);
105 }
106
107 }
108
109 function latepoint_hide_reschedule_button() {
110 jQuery('.reschedule-confirmation-button-wrapper').hide();
111 }
112
113 function latepoint_show_reschedule_button() {
114 jQuery('.reschedule-confirmation-button-wrapper').show();
115 }
116
117 function latepoint_customer_cabinet_reload_booking_tile($booking_tile) {
118 $booking_tile.addClass('os-loading');
119 let params = {
120 booking_id: $booking_tile.data('id'),
121 }
122 let data = {
123 action: latepoint_helper.route_action,
124 route_name: $booking_tile.data('route-name'),
125 params: params,
126 layout: 'none',
127 return_format: 'json'
128 };
129 jQuery.ajax({
130 type: "post",
131 dataType: "json",
132 url: latepoint_timestamped_ajaxurl(),
133 data: data,
134 success: function (data) {
135 $booking_tile.removeClass('os-loading')
136 if (data.status === "success") {
137 $booking_tile.replaceWith(data.message);
138 } else {
139 alert(data.message);
140 }
141 }
142 });
143 }
144
145 // show invoices -> summary_before_payment in modal
146 function show_summary_before_payment($access_key) {
147 let data = {
148 action: latepoint_helper.route_action,
149 route_name: latepoint_helper.invoices_summary_before_payment_route,
150 params: {key: $access_key},
151 layout: 'none',
152 return_format: 'json'
153 }
154
155 jQuery.ajax({
156 type: "post",
157 dataType: "json",
158 url: latepoint_timestamped_ajaxurl(),
159 data: data,
160 success: function (data) {
161 latepoint_show_data_in_lightbox(data.message, 'width-500');
162 }
163 });
164 }
165
166 function latepoint_reload_reschedule_calendar($reschedule_calendar_wrapper) {
167 $reschedule_calendar_wrapper.addClass('os-loading');
168 let $calendar_element = $reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').last();
169 let calendar_year = $calendar_element.data('calendar-year');
170 let calendar_month = $calendar_element.data('calendar-month');
171
172 let data = {
173 action: latepoint_helper.route_action,
174 route_name: $reschedule_calendar_wrapper.data('route'),
175 params: {
176 timezone_name: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_timezone_name').val(),
177 key: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_manage_booking_key').val(),
178 target_date_string: `${calendar_year}-${calendar_month}-1`,
179 booking_id: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_booking_id').val()
180 },
181 layout: 'none',
182 return_format: 'json'
183 }
184 jQuery.ajax({
185 type: "post",
186 dataType: "json",
187 url: latepoint_timestamped_ajaxurl(),
188 data: data,
189 success: function (data) {
190 $reschedule_calendar_wrapper.removeClass('os-loading');
191 if (data.status === "success") {
192 jQuery('.latepoint-lightbox-i').html(data.message);
193 } else {
194 // console.log(data.message);
195 }
196 }
197 });
198 latepoint_calendar_show_or_hide_prev_next_buttons($reschedule_calendar_wrapper);
199 return false;
200 }
201
202 function latepoint_init_reschedule() {
203
204 let $reschedule_wrapper = jQuery('.reschedule-calendar-wrapper');
205
206 latepoint_init_timezone_picker($reschedule_wrapper);
207
208 $reschedule_wrapper.on('click', '.latepoint-request-reschedule-trigger', function () {
209 let $trigger = jQuery(this)
210 let $wrapper = $trigger.closest('.reschedule-calendar-wrapper')
211 let booking_id = $wrapper.find('input[type="hidden"].latepoint_booking_id').val()
212
213 $trigger.addClass('os-loading')
214 let params = {
215 booking_id: booking_id,
216 key: $wrapper.find('input[type="hidden"].latepoint_manage_booking_key').val(),
217 start_date: $wrapper.find('input[type="hidden"].latepoint_start_date').val(),
218 start_time: $wrapper.find('input[type="hidden"].latepoint_start_time').val(),
219 timezone_name: $wrapper.find('input[type="hidden"].latepoint_timezone_name').val(),
220 _wpnonce: $wrapper.find('input[name="_wpnonce"]').val(),
221 }
222 let data = {
223 action: latepoint_helper.route_action,
224 route_name: $trigger.data('route-name'),
225 params: params,
226 layout: 'none',
227 return_format: 'json'
228 };
229 jQuery.ajax({
230 type: "post",
231 dataType: "json",
232 url: latepoint_timestamped_ajaxurl(),
233 data: data,
234 success: function (data) {
235 $trigger.removeClass('os-loading')
236 if (data.status === "success") {
237 jQuery('.latepoint-lightbox-content').html(data.message);
238 jQuery('.latepoint-lightbox-footer, .latepoint-lightbox-heading').remove();
239 if (jQuery('.customer-bookings-tiles').length) {
240 // called from customer cabinet
241 latepoint_customer_cabinet_reload_booking_tile(jQuery('.customer-bookings-tiles .customer-booking[data-id="' + booking_id + '"]'));
242 } else {
243 // called from manage by key
244 latepoint_manage_by_key_reload_booking();
245 }
246 } else {
247 latepoint_show_message_inside_element(data.message, jQuery('.latepoint-lightbox-content'), 'error');
248 jQuery('.latepoint-lightbox-content').animate({scrollTop: 0}, 300);
249 }
250 }
251 });
252 return false;
253 });
254
255 $reschedule_wrapper.on('click keydown', '.dp-timepicker-trigger', function (event) {
256 if (event.type === 'keydown' && event.key !== ' ' && event.key !== 'Enter') return;
257 var $reschedule_calendar_wrapper = jQuery(this).closest('.reschedule-calendar-wrapper');
258 if (jQuery(this).hasClass('is-booked') || jQuery(this).hasClass('is-off')) {
259 // Show error message that you cant select a booked period
260 } else {
261 if (jQuery(this).hasClass('selected')) {
262 jQuery(this).removeClass('selected');
263 jQuery(this).find('.dp-success-label').remove();
264 $reschedule_calendar_wrapper.find('.latepoint_start_time').val('');
265 latepoint_hide_reschedule_button();
266 } else {
267 $reschedule_calendar_wrapper.find('.dp-timepicker-trigger.selected').removeClass('selected').find('.dp-success-label').remove();
268 var selected_timeslot_time = jQuery(this).find('.dp-label-time').html();
269 jQuery(this).addClass('selected').find('.dp-label').prepend('<span class="dp-success-label">' + latepoint_helper.datepicker_timeslot_selected_label + '</span>');
270
271 var minutes = parseInt(jQuery(this).data('minutes'));
272 var start_date = new Date($reschedule_calendar_wrapper.find('.os-day.selected').data('date'));
273
274 $reschedule_calendar_wrapper.find('.latepoint_start_date').val(start_date.toISOString().split('T')[0])
275 $reschedule_calendar_wrapper.find('.latepoint_start_time').val(minutes);
276 latepoint_show_reschedule_button();
277 }
278 }
279 return false;
280 });
281
282
283 $reschedule_wrapper.on('click', '.os-month-next-btn', function () {
284 var $reschedule_calendar_wrapper = jQuery(this).closest('.reschedule-calendar-wrapper');
285 var next_month_route_name = jQuery(this).data('route');
286 if ($reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active + .os-monthly-calendar-days-w').length) {
287 $reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').removeClass('active').next('.os-monthly-calendar-days-w').addClass('active');
288 latepoint_calendar_set_month_label($reschedule_calendar_wrapper);
289 } else {
290 // TODO add condition to check maximum number months to call into the future
291 if (true) {
292 var $btn = jQuery(this);
293 $btn.addClass('os-loading');
294 var $calendar_element = $reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w').last();
295 var calendar_year = $calendar_element.data('calendar-year');
296 var calendar_month = $calendar_element.data('calendar-month');
297 if (calendar_month == 12) {
298 calendar_year = calendar_year + 1;
299 calendar_month = 1;
300 } else {
301 calendar_month = calendar_month + 1;
302 }
303 var data = {
304 action: latepoint_helper.route_action,
305 route_name: next_month_route_name,
306 params: {
307 timezone_name: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_timezone_name').val(),
308 key: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_manage_booking_key').val(),
309 target_date_string: `${calendar_year}-${calendar_month}-1`,
310 booking: {
311 id: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_booking_id').val()
312 }
313 },
314 layout: 'none',
315 return_format: 'json'
316 }
317 jQuery.ajax({
318 type: "post",
319 dataType: "json",
320 url: latepoint_timestamped_ajaxurl(),
321 data: data,
322 success: function (data) {
323 $btn.removeClass('os-loading');
324 if (data.status === "success") {
325 $reschedule_calendar_wrapper.find('.os-months').append(data.message);
326 $reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').removeClass('active').next('.os-monthly-calendar-days-w').addClass('active');
327 latepoint_calendar_set_month_label($reschedule_calendar_wrapper);
328 } else {
329 // console.log(data.message);
330 }
331 }
332 });
333 }
334 }
335 latepoint_calendar_show_or_hide_prev_next_buttons($reschedule_calendar_wrapper);
336 return false;
337 });
338
339 $reschedule_wrapper.on('click', '.os-month-prev-btn', function () {
340 var $reschedule_calendar_wrapper = jQuery(this).closest('.reschedule-calendar-wrapper');
341 if ($reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').prev('.os-monthly-calendar-days-w').length) {
342 $reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').removeClass('active').prev('.os-monthly-calendar-days-w').addClass('active');
343 latepoint_calendar_set_month_label($reschedule_calendar_wrapper);
344 }
345 latepoint_calendar_show_or_hide_prev_next_buttons($reschedule_calendar_wrapper);
346 return false;
347 });
348
349 $reschedule_wrapper.on('click', '.os-day', function () {
350 if (jQuery(this).hasClass('os-day-passed')) return false;
351 if (jQuery(this).hasClass('os-not-in-allowed-period')) return false;
352 if(jQuery(this).closest('.os-dates-and-times-w').hasClass('calendar-style-modern')){
353 if(jQuery(this).hasClass('os-month-prev')) return false;
354 if(jQuery(this).hasClass('os-month-next')) return false;
355 }
356 var $reschedule_calendar_wrapper = jQuery(this).closest('.reschedule-calendar-wrapper');
357 if (jQuery(this).closest('.os-monthly-calendar-days-w').hasClass('hide-if-single-slot')) {
358
359 // HIDE TIMESLOT IF ONLY ONE TIMEPOINT
360 if (jQuery(this).hasClass('os-not-available')) {
361 // clicked on a day that has no available timeslots
362 // do nothing
363 } else {
364 $reschedule_calendar_wrapper.find('.os-day.selected').removeClass('selected');
365 jQuery(this).addClass('selected');
366 // set date
367 $reschedule_calendar_wrapper.find('.latepoint_start_date').val(jQuery(this).data('date'));
368 if (jQuery(this).hasClass('os-one-slot-only')) {
369 // clicked on a day that has only one slot available
370 var bookable_minutes = jQuery(this).data('bookable-minutes').toString().split(':')[0];
371 var selected_timeslot_time = latepoint_format_minutes_to_time(Number(bookable_minutes), Number(jQuery(this).data('service-duration')));
372 $reschedule_calendar_wrapper.find('.latepoint_start_time').val(jQuery(this).data('bookable-minutes'));
373 $reschedule_calendar_wrapper.find('.time-selector-w').slideUp(200);
374 latepoint_show_reschedule_button()
375 } else {
376 // regular day with more than 1 timeslots available
377 // build timeslots
378 latepoint_generate_day_timeslots(jQuery(this), $reschedule_calendar_wrapper, $reschedule_calendar_wrapper.find('.latepoint-lightbox-content'));
379 // initialize timeslots events
380 // clear time and hide next btn
381 $reschedule_calendar_wrapper.find('.latepoint_start_time').val('');
382 }
383 }
384 } else {
385
386 // SHOW TIMESLOTS EVEN IF ONLY ONE TIMEPOINT
387 $reschedule_calendar_wrapper.find('.latepoint_start_date').val(jQuery(this).data('date'));
388 $reschedule_calendar_wrapper.find('.os-day.selected').removeClass('selected');
389 jQuery(this).addClass('selected');
390
391 // build timeslots
392 latepoint_generate_day_timeslots(jQuery(this), $reschedule_calendar_wrapper, $reschedule_calendar_wrapper.find('.latepoint-lightbox-content'));
393 // initialize timeslots events
394 // clear time and hide next btn
395 let $booking_form_element = jQuery(this).closest('.latepoint-booking-form-element');
396 if ($booking_form_element.length) latepoint_reload_summary($booking_form_element);
397 $reschedule_calendar_wrapper.find('.latepoint_start_time').val('');
398 latepoint_hide_next_btn($reschedule_calendar_wrapper);
399 }
400
401 return false;
402 });
403 }
404