_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 |