[Back] /*
* Copyright (c) 2023 LatePoint LLC. All rights reserved.
*/
async function latepoint_init_transaction_payment_form() {
let callbacks_list = [];
let $transaction_payment_form = jQuery('.latepoint-transaction-payment-form');
let current_step = $transaction_payment_form.find('input[name="current_step"]').val();
$transaction_payment_form.on('click keydown', '.lp-option', (e) => {
let $option = jQuery(e.currentTarget);
if(e.type === 'keydown' && e.key !== ' ' && e.key !== 'Enter') return;
$option.closest('.lp-options').find('.lp-option.selected').removeClass('selected');
$option.addClass('selected');
$transaction_payment_form.find('input[name="' + $option.data('holder') + '"]').val($option.data('value'));
$transaction_payment_form.trigger('submit');
return false;
});
switch (current_step) {
case 'methods':
break;
case 'processors':
break;
case 'pay':
$transaction_payment_form.trigger('latepoint:initOrderPaymentMethod', [{
callbacks_list: callbacks_list,
payment_method: $transaction_payment_form.find('input[name="payment_method"]').val(),
payment_processor: $transaction_payment_form.find('input[name="payment_processor"]').val(),
}]);
$transaction_payment_form.addClass('os-loading');
try {
for (const callback of callbacks_list) {
await callback.action();
}
$transaction_payment_form.removeClass('os-loading');
} catch (error) {
latepoint_show_error_and_stop_loading_booking_form(error, $transaction_payment_form);
}
break;
case 'confirmation':
break;
}
$transaction_payment_form.on('submit', async function (e) {
e.preventDefault();
await latepoint_submit_transaction_payment_form(jQuery(e.target));
});
}
async function latepoint_submit_transaction_payment_form($transaction_payment_form) {
if($transaction_payment_form.hasClass('os-loading')) return false;
let callbacks_list = [];
$transaction_payment_form.find('.latepoint-message').remove();
$transaction_payment_form.addClass('os-loading');
$transaction_payment_form.find('.latepoint-btn').addClass('os-loading');
$transaction_payment_form.trigger('latepoint:submitTransactionPaymentForm', [{
callbacks_list: callbacks_list,
payment_method: $transaction_payment_form.find('input[name="payment_method"]').val(),
payment_processor: $transaction_payment_form.find('input[name="payment_processor"]').val(),
current_step: $transaction_payment_form.find('input[name="current_step"]').val(),
}]);
try {
for (const callback of callbacks_list) {
await callback.action();
}
} catch (error) {
$transaction_payment_form.removeClass('os-loading').find('.os-loading').removeClass('os-loading');
latepoint_show_message_inside_element(error.message, $transaction_payment_form.find('.lp-payment-method-content'), 'error');
return false;
}
try {
let response = await jQuery.ajax({
type: "post",
dataType: "json",
processData: false,
contentType: false,
url: latepoint_timestamped_ajaxurl(),
data: latepoint_create_form_data($transaction_payment_form, latepoint_helper.invoices_payment_form_route)
});
$transaction_payment_form.removeClass('os-loading').find('.os-loading').removeClass('os-loading');
if (response.status === 'success') {
$transaction_payment_form.html(response.message);
return await latepoint_init_transaction_payment_form();
} else {
latepoint_show_message_inside_element(response.message, $transaction_payment_form.find('.lp-payment-method-content'), 'error');
return false;
}
} catch (e) {
$transaction_payment_form.removeClass('os-loading').find('.os-loading').removeClass('os-loading');
console.log(e);
alert('Error:' + e);
}
}
function latepoint_hide_reschedule_button() {
jQuery('.reschedule-confirmation-button-wrapper').hide();
}
function latepoint_show_reschedule_button() {
jQuery('.reschedule-confirmation-button-wrapper').show();
}
function latepoint_customer_cabinet_reload_booking_tile($booking_tile) {
$booking_tile.addClass('os-loading');
let params = {
booking_id: $booking_tile.data('id'),
}
let data = {
action: latepoint_helper.route_action,
route_name: $booking_tile.data('route-name'),
params: params,
layout: 'none',
return_format: 'json'
};
jQuery.ajax({
type: "post",
dataType: "json",
url: latepoint_timestamped_ajaxurl(),
data: data,
success: function (data) {
$booking_tile.removeClass('os-loading')
if (data.status === "success") {
$booking_tile.replaceWith(data.message);
} else {
alert(data.message);
}
}
});
}
// show invoices -> summary_before_payment in modal
function show_summary_before_payment($access_key) {
let data = {
action: latepoint_helper.route_action,
route_name: latepoint_helper.invoices_summary_before_payment_route,
params: {key: $access_key},
layout: 'none',
return_format: 'json'
}
jQuery.ajax({
type: "post",
dataType: "json",
url: latepoint_timestamped_ajaxurl(),
data: data,
success: function (data) {
latepoint_show_data_in_lightbox(data.message, 'width-500');
}
});
}
function latepoint_reload_reschedule_calendar($reschedule_calendar_wrapper) {
$reschedule_calendar_wrapper.addClass('os-loading');
let $calendar_element = $reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').last();
let calendar_year = $calendar_element.data('calendar-year');
let calendar_month = $calendar_element.data('calendar-month');
let data = {
action: latepoint_helper.route_action,
route_name: $reschedule_calendar_wrapper.data('route'),
params: {
timezone_name: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_timezone_name').val(),
key: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_manage_booking_key').val(),
target_date_string: `${calendar_year}-${calendar_month}-1`,
booking_id: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_booking_id').val()
},
layout: 'none',
return_format: 'json'
}
jQuery.ajax({
type: "post",
dataType: "json",
url: latepoint_timestamped_ajaxurl(),
data: data,
success: function (data) {
$reschedule_calendar_wrapper.removeClass('os-loading');
if (data.status === "success") {
jQuery('.latepoint-lightbox-i').html(data.message);
} else {
// console.log(data.message);
}
}
});
latepoint_calendar_show_or_hide_prev_next_buttons($reschedule_calendar_wrapper);
return false;
}
function latepoint_init_reschedule() {
let $reschedule_wrapper = jQuery('.reschedule-calendar-wrapper');
latepoint_init_timezone_picker($reschedule_wrapper);
$reschedule_wrapper.on('click', '.latepoint-request-reschedule-trigger', function () {
let $trigger = jQuery(this)
let $wrapper = $trigger.closest('.reschedule-calendar-wrapper')
let booking_id = $wrapper.find('input[type="hidden"].latepoint_booking_id').val()
$trigger.addClass('os-loading')
let params = {
booking_id: booking_id,
key: $wrapper.find('input[type="hidden"].latepoint_manage_booking_key').val(),
start_date: $wrapper.find('input[type="hidden"].latepoint_start_date').val(),
start_time: $wrapper.find('input[type="hidden"].latepoint_start_time').val(),
timezone_name: $wrapper.find('input[type="hidden"].latepoint_timezone_name').val(),
}
let data = {
action: latepoint_helper.route_action,
route_name: $trigger.data('route-name'),
params: params,
layout: 'none',
return_format: 'json'
};
jQuery.ajax({
type: "post",
dataType: "json",
url: latepoint_timestamped_ajaxurl(),
data: data,
success: function (data) {
$trigger.removeClass('os-loading')
if (data.status === "success") {
jQuery('.latepoint-lightbox-content').html(data.message);
jQuery('.latepoint-lightbox-footer, .latepoint-lightbox-heading').remove();
if (jQuery('.customer-bookings-tiles').length) {
// called from customer cabinet
latepoint_customer_cabinet_reload_booking_tile(jQuery('.customer-bookings-tiles .customer-booking[data-id="' + booking_id + '"]'));
} else {
// called from manage by key
latepoint_manage_by_key_reload_booking();
}
} else {
latepoint_show_message_inside_element(data.message, jQuery('.latepoint-lightbox-content'), 'error');
jQuery('.latepoint-lightbox-content').animate({scrollTop: 0}, 300);
}
}
});
return false;
});
$reschedule_wrapper.on('click keydown', '.dp-timepicker-trigger', function (event) {
if (event.type === 'keydown' && event.key !== ' ' && event.key !== 'Enter') return;
var $reschedule_calendar_wrapper = jQuery(this).closest('.reschedule-calendar-wrapper');
if (jQuery(this).hasClass('is-booked') || jQuery(this).hasClass('is-off')) {
// Show error message that you cant select a booked period
} else {
if (jQuery(this).hasClass('selected')) {
jQuery(this).removeClass('selected');
jQuery(this).find('.dp-success-label').remove();
$reschedule_calendar_wrapper.find('.latepoint_start_time').val('');
latepoint_hide_reschedule_button();
} else {
$reschedule_calendar_wrapper.find('.dp-timepicker-trigger.selected').removeClass('selected').find('.dp-success-label').remove();
var selected_timeslot_time = jQuery(this).find('.dp-label-time').html();
jQuery(this).addClass('selected').find('.dp-label').prepend('<span class="dp-success-label">' + latepoint_helper.datepicker_timeslot_selected_label + '</span>');
var minutes = parseInt(jQuery(this).data('minutes'));
var start_date = new Date($reschedule_calendar_wrapper.find('.os-day.selected').data('date'));
$reschedule_calendar_wrapper.find('.latepoint_start_date').val(start_date.toISOString().split('T')[0])
$reschedule_calendar_wrapper.find('.latepoint_start_time').val(minutes);
latepoint_show_reschedule_button();
}
}
return false;
});
$reschedule_wrapper.on('click', '.os-month-next-btn', function () {
var $reschedule_calendar_wrapper = jQuery(this).closest('.reschedule-calendar-wrapper');
var next_month_route_name = jQuery(this).data('route');
if ($reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active + .os-monthly-calendar-days-w').length) {
$reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').removeClass('active').next('.os-monthly-calendar-days-w').addClass('active');
latepoint_calendar_set_month_label($reschedule_calendar_wrapper);
} else {
// TODO add condition to check maximum number months to call into the future
if (true) {
var $btn = jQuery(this);
$btn.addClass('os-loading');
var $calendar_element = $reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w').last();
var calendar_year = $calendar_element.data('calendar-year');
var calendar_month = $calendar_element.data('calendar-month');
if (calendar_month == 12) {
calendar_year = calendar_year + 1;
calendar_month = 1;
} else {
calendar_month = calendar_month + 1;
}
var data = {
action: latepoint_helper.route_action,
route_name: next_month_route_name,
params: {
timezone_name: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_timezone_name').val(),
key: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_manage_booking_key').val(),
target_date_string: `${calendar_year}-${calendar_month}-1`,
booking: {
id: $reschedule_calendar_wrapper.find('input[type="hidden"].latepoint_booking_id').val()
}
},
layout: 'none',
return_format: 'json'
}
jQuery.ajax({
type: "post",
dataType: "json",
url: latepoint_timestamped_ajaxurl(),
data: data,
success: function (data) {
$btn.removeClass('os-loading');
if (data.status === "success") {
$reschedule_calendar_wrapper.find('.os-months').append(data.message);
$reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').removeClass('active').next('.os-monthly-calendar-days-w').addClass('active');
latepoint_calendar_set_month_label($reschedule_calendar_wrapper);
} else {
// console.log(data.message);
}
}
});
}
}
latepoint_calendar_show_or_hide_prev_next_buttons($reschedule_calendar_wrapper);
return false;
});
$reschedule_wrapper.on('click', '.os-month-prev-btn', function () {
var $reschedule_calendar_wrapper = jQuery(this).closest('.reschedule-calendar-wrapper');
if ($reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').prev('.os-monthly-calendar-days-w').length) {
$reschedule_calendar_wrapper.find('.os-monthly-calendar-days-w.active').removeClass('active').prev('.os-monthly-calendar-days-w').addClass('active');
latepoint_calendar_set_month_label($reschedule_calendar_wrapper);
}
latepoint_calendar_show_or_hide_prev_next_buttons($reschedule_calendar_wrapper);
return false;
});
$reschedule_wrapper.on('click', '.os-day', function () {
if (jQuery(this).hasClass('os-day-passed')) return false;
if (jQuery(this).hasClass('os-not-in-allowed-period')) return false;
if(jQuery(this).closest('.os-dates-and-times-w').hasClass('calendar-style-modern')){
if(jQuery(this).hasClass('os-month-prev')) return false;
if(jQuery(this).hasClass('os-month-next')) return false;
}
var $reschedule_calendar_wrapper = jQuery(this).closest('.reschedule-calendar-wrapper');
if (jQuery(this).closest('.os-monthly-calendar-days-w').hasClass('hide-if-single-slot')) {
// HIDE TIMESLOT IF ONLY ONE TIMEPOINT
if (jQuery(this).hasClass('os-not-available')) {
// clicked on a day that has no available timeslots
// do nothing
} else {
$reschedule_calendar_wrapper.find('.os-day.selected').removeClass('selected');
jQuery(this).addClass('selected');
// set date
$reschedule_calendar_wrapper.find('.latepoint_start_date').val(jQuery(this).data('date'));
if (jQuery(this).hasClass('os-one-slot-only')) {
// clicked on a day that has only one slot available
var bookable_minutes = jQuery(this).data('bookable-minutes').toString().split(':')[0];
var selected_timeslot_time = latepoint_format_minutes_to_time(Number(bookable_minutes), Number(jQuery(this).data('service-duration')));
$reschedule_calendar_wrapper.find('.latepoint_start_time').val(jQuery(this).data('bookable-minutes'));
$reschedule_calendar_wrapper.find('.time-selector-w').slideUp(200);
latepoint_show_reschedule_button()
} else {
// regular day with more than 1 timeslots available
// build timeslots
latepoint_generate_day_timeslots(jQuery(this), $reschedule_calendar_wrapper, $reschedule_calendar_wrapper.find('.latepoint-lightbox-content'));
// initialize timeslots events
// clear time and hide next btn
$reschedule_calendar_wrapper.find('.latepoint_start_time').val('');
}
}
} else {
// SHOW TIMESLOTS EVEN IF ONLY ONE TIMEPOINT
$reschedule_calendar_wrapper.find('.latepoint_start_date').val(jQuery(this).data('date'));
$reschedule_calendar_wrapper.find('.os-day.selected').removeClass('selected');
jQuery(this).addClass('selected');
// build timeslots
latepoint_generate_day_timeslots(jQuery(this), $reschedule_calendar_wrapper, $reschedule_calendar_wrapper.find('.latepoint-lightbox-content'));
// initialize timeslots events
// clear time and hide next btn
let $booking_form_element = jQuery(this).closest('.latepoint-booking-form-element');
if ($booking_form_element.length) latepoint_reload_summary($booking_form_element);
$reschedule_calendar_wrapper.find('.latepoint_start_time').val('');
latepoint_hide_next_btn($reschedule_calendar_wrapper);
}
return false;
});
}