PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / trunk
LatePoint – Calendar Booking Plugin for Appointments and Events vtrunk
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 2 days ago _events.js 1 year ago _razorpay_connect.js 1 month ago _stripe_connect.js 1 year ago main.js 2 days ago
_customer.js
408 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 addons contribute extra params to the reschedule request (e.g. a reschedule reason).
223 $wrapper.find('[data-os-request-param]').each(function () {
224 params[jQuery(this).data('os-request-param')] = jQuery(this).val();
225 });
226 let data = {
227 action: latepoint_helper.route_action,
228 route_name: $trigger.data('route-name'),
229 params: params,
230 layout: 'none',
231 return_format: 'json'
232 };
233 jQuery.ajax({
234 type: "post",
235 dataType: "json",
236 url: latepoint_timestamped_ajaxurl(),
237 data: data,
238 success: function (data) {
239 $trigger.removeClass('os-loading')
240 if (data.status === "success") {
241 jQuery('.latepoint-lightbox-content').html(data.message);
242 jQuery('.latepoint-lightbox-footer, .latepoint-lightbox-heading').remove();
243 if (jQuery('.customer-bookings-tiles').length) {
244 // called from customer cabinet
245 latepoint_customer_cabinet_reload_booking_tile(jQuery('.customer-bookings-tiles .customer-booking[data-id="' + booking_id + '"]'));
246 } else {
247 // called from manage by key
248 latepoint_manage_by_key_reload_booking();
249 }
250 } else {
251 latepoint_show_message_inside_element(data.message, jQuery('.latepoint-lightbox-content'), 'error');
252 jQuery('.latepoint-lightbox-content').animate({scrollTop: 0}, 300);
253 }
254 }
255 });
256 return false;
257 });
258
259 $reschedule_wrapper.on('click keydown', '.dp-timepicker-trigger', function (event) {
260 if (event.type === 'keydown' && event.key !== ' ' && event.key !== 'Enter') return;
261 var $reschedule_calendar_wrapper = jQuery(this).closest('.reschedule-calendar-wrapper');
262 if (jQuery(this).hasClass('is-booked') || jQuery(this).hasClass('is-off')) {
263 // Show error message that you cant select a booked period
264 } else {
265 if (jQuery(this).hasClass('selected')) {
266 jQuery(this).removeClass('selected');
267 jQuery(this).find('.dp-success-label').remove();
268 $reschedule_calendar_wrapper.find('.latepoint_start_time').val('');
269 latepoint_hide_reschedule_button();
270 } else {
271 $reschedule_calendar_wrapper.find('.dp-timepicker-trigger.selected').removeClass('selected').find('.dp-success-label').remove();
272 var selected_timeslot_time = jQuery(this).find('.dp-label-time').html();
273 jQuery(this).addClass('selected').find('.dp-label').prepend('<span class="dp-success-label">' + latepoint_helper.datepicker_timeslot_selected_label + '</span>');
274
275 var minutes = parseInt(jQuery(this).data('minutes'));
276 var start_date = new Date($reschedule_calendar_wrapper.find('.os-day.selected').data('date'));
277
278 $reschedule_calendar_wrapper.find('.latepoint_start_date').val(start_date.toISOString().split('T')[0])
279 $reschedule_calendar_wrapper.find('.latepoint_start_time').val(minutes);
280 latepoint_show_reschedule_button();
281 }
282 }
283 return false;
284 });
285
286
287 $reschedule_wrapper.on('click', '.os-month-next-btn', function () {
288 var $reschedule_calendar_wrapper = jQuery(this).closest('.reschedule-calendar-wrapper');
289 var next_month_route_name = jQuery(this).data('route');
290 if ($reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active + .os-monthly-calendar-days-w').length) {
291 $reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').removeClass('active').next('.os-monthly-calendar-days-w').addClass('active');
292 latepoint_calendar_set_month_label($reschedule_calendar_wrapper);
293 } else {
294 // TODO add condition to check maximum number months to call into the future
295 if (true) {
296 var $btn = jQuery(this);
297 $btn.addClass('os-loading');
298 var $calendar_element = $reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w').last();
299 var calendar_year = $calendar_element.data('calendar-year');
300 var calendar_month = $calendar_element.data('calendar-month');
301 if (calendar_month == 12) {
302 calendar_year = calendar_year + 1;
303 calendar_month = 1;
304 } else {
305 calendar_month = calendar_month + 1;
306 }
307 var data = {
308 action: latepoint_helper.route_action,
309 route_name: next_month_route_name,
310 params: {
311 timezone_name: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_timezone_name').val(),
312 key: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_manage_booking_key').val(),
313 target_date_string: `${calendar_year}-${calendar_month}-1`,
314 booking: {
315 id: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_booking_id').val()
316 }
317 },
318 layout: 'none',
319 return_format: 'json'
320 }
321 jQuery.ajax({
322 type: "post",
323 dataType: "json",
324 url: latepoint_timestamped_ajaxurl(),
325 data: data,
326 success: function (data) {
327 $btn.removeClass('os-loading');
328 if (data.status === "success") {
329 $reschedule_calendar_wrapper.find('.os-months').append(data.message);
330 $reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').removeClass('active').next('.os-monthly-calendar-days-w').addClass('active');
331 latepoint_calendar_set_month_label($reschedule_calendar_wrapper);
332 } else {
333 // console.log(data.message);
334 }
335 }
336 });
337 }
338 }
339 latepoint_calendar_show_or_hide_prev_next_buttons($reschedule_calendar_wrapper);
340 return false;
341 });
342
343 $reschedule_wrapper.on('click', '.os-month-prev-btn', function () {
344 var $reschedule_calendar_wrapper = jQuery(this).closest('.reschedule-calendar-wrapper');
345 if ($reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').prev('.os-monthly-calendar-days-w').length) {
346 $reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').removeClass('active').prev('.os-monthly-calendar-days-w').addClass('active');
347 latepoint_calendar_set_month_label($reschedule_calendar_wrapper);
348 }
349 latepoint_calendar_show_or_hide_prev_next_buttons($reschedule_calendar_wrapper);
350 return false;
351 });
352
353 $reschedule_wrapper.on('click', '.os-day', function () {
354 if (jQuery(this).hasClass('os-day-passed')) return false;
355 if (jQuery(this).hasClass('os-not-in-allowed-period')) return false;
356 if(jQuery(this).closest('.os-dates-and-times-w').hasClass('calendar-style-modern')){
357 if(jQuery(this).hasClass('os-month-prev')) return false;
358 if(jQuery(this).hasClass('os-month-next')) return false;
359 }
360 var $reschedule_calendar_wrapper = jQuery(this).closest('.reschedule-calendar-wrapper');
361 if (jQuery(this).closest('.os-monthly-calendar-days-w').hasClass('hide-if-single-slot')) {
362
363 // HIDE TIMESLOT IF ONLY ONE TIMEPOINT
364 if (jQuery(this).hasClass('os-not-available')) {
365 // clicked on a day that has no available timeslots
366 // do nothing
367 } else {
368 $reschedule_calendar_wrapper.find('.os-day.selected').removeClass('selected');
369 jQuery(this).addClass('selected');
370 // set date
371 $reschedule_calendar_wrapper.find('.latepoint_start_date').val(jQuery(this).data('date'));
372 if (jQuery(this).hasClass('os-one-slot-only')) {
373 // clicked on a day that has only one slot available
374 var bookable_minutes = jQuery(this).data('bookable-minutes').toString().split(':')[0];
375 var selected_timeslot_time = latepoint_format_minutes_to_time(Number(bookable_minutes), Number(jQuery(this).data('service-duration')));
376 $reschedule_calendar_wrapper.find('.latepoint_start_time').val(jQuery(this).data('bookable-minutes'));
377 $reschedule_calendar_wrapper.find('.time-selector-w').slideUp(200);
378 latepoint_show_reschedule_button()
379 } else {
380 // regular day with more than 1 timeslots available
381 // build timeslots
382 latepoint_generate_day_timeslots(jQuery(this), $reschedule_calendar_wrapper, $reschedule_calendar_wrapper.find('.latepoint-lightbox-content'));
383 // initialize timeslots events
384 // clear time and hide next btn
385 $reschedule_calendar_wrapper.find('.latepoint_start_time').val('');
386 }
387 }
388 } else {
389
390 // SHOW TIMESLOTS EVEN IF ONLY ONE TIMEPOINT
391 $reschedule_calendar_wrapper.find('.latepoint_start_date').val(jQuery(this).data('date'));
392 $reschedule_calendar_wrapper.find('.os-day.selected').removeClass('selected');
393 jQuery(this).addClass('selected');
394
395 // build timeslots
396 latepoint_generate_day_timeslots(jQuery(this), $reschedule_calendar_wrapper, $reschedule_calendar_wrapper.find('.latepoint-lightbox-content'));
397 // initialize timeslots events
398 // clear time and hide next btn
399 let $booking_form_element = jQuery(this).closest('.latepoint-booking-form-element');
400 if ($booking_form_element.length) latepoint_reload_summary($booking_form_element);
401 $reschedule_calendar_wrapper.find('.latepoint_start_time').val('');
402 latepoint_hide_next_btn($reschedule_calendar_wrapper);
403 }
404
405 return false;
406 });
407 }
408