218 lines
7.9 KiB
JavaScript
218 lines
7.9 KiB
JavaScript
function refreshCart(parameters, element, update = false) {
|
|
VvvebTheme.Cart.module = 'checkout/checkout';
|
|
VvvebTheme.Cart.component_id = 1;
|
|
//action, parameters, element, selector, callback
|
|
if (!update) {
|
|
update = ['.cart-summary', '.container > .notifications'];
|
|
}
|
|
VvvebTheme.Cart.ajax('', parameters, element, update);
|
|
//cart-summary
|
|
}
|
|
|
|
function toggleBillingAddress(element) {
|
|
|
|
let address = document.querySelector(".billing_address");
|
|
if (element.value == 0) {
|
|
address.querySelectorAll("input,select,textarea").forEach(e => e.removeAttribute("disabled"));
|
|
address.style.display = "";
|
|
} else {
|
|
address.querySelectorAll("input,select,textarea").forEach(e => e.setAttribute("disabled", "true"));
|
|
address.style.display = "none";
|
|
}
|
|
}
|
|
|
|
function toggleShippingAddress(element) {
|
|
let address = document.querySelector(".shipping_address");
|
|
if (element) {
|
|
if (element.checked == 0) {
|
|
address.querySelectorAll("input,select,textarea").forEach(e => e.setAttribute("disabled", "true"));
|
|
address.style.display = "none";
|
|
} else {
|
|
address.querySelectorAll("input,select,textarea").forEach(e => e.removeAttribute("disabled"));
|
|
address.style.display = "";
|
|
}
|
|
}
|
|
}
|
|
|
|
function toggleRegister(element) {
|
|
let register = document.querySelector(".register-account");
|
|
|
|
if (element.value == 'false') {
|
|
register.querySelectorAll("input,select,textarea").forEach(e => e.setAttribute("disabled", "true"));
|
|
register.style.display = "none";
|
|
} else {
|
|
register.querySelectorAll("input,select,textarea").forEach(e => e.removeAttribute("disabled"));
|
|
register.style.display = "";
|
|
}
|
|
}
|
|
|
|
window.addEventListener('DOMContentLoaded', (e) => {
|
|
|
|
//show billing address form if no address is selected
|
|
document.addEventListener("change", e => {
|
|
let element = e.target.closest("[name=billing_address_id]");
|
|
if (element) {
|
|
toggleBillingAddress(element);
|
|
}
|
|
});
|
|
|
|
if (!document.getElementById("billing_address_new")?.checked && !document.querySelector("[name=billing_address_id]:checked")?.value) {
|
|
//if new address is not checked and no address is selected
|
|
document.querySelector("[name=billing_address_id]")?.dispatchEvent(new MouseEvent('click'));//select first address
|
|
}
|
|
|
|
let billing_address = document.querySelector("[name=billing_address_id]:checked");
|
|
//if an address is selected hide billing address form
|
|
if (billing_address && billing_address.value != false) {
|
|
document.querySelector(".billing_address").style.display = "none";
|
|
}
|
|
|
|
//hide shipping address form if same as billing checkbox is checked
|
|
toggleShippingAddress(document.getElementById("shipping-form-check"));
|
|
|
|
//if login form is filled show form
|
|
if (document.querySelector("#checkout-login-form [name=password]")?.value) {
|
|
document.getElementById('checkout-login-container').style.display = "";
|
|
document.getElementById('login-form-check').checked = true;
|
|
}
|
|
|
|
//if shipping or payment method is selected collapse the accordion
|
|
document.querySelector('.accordion-item input[type="radio"]:checked')?.closest("label").dispatchEvent(new MouseEvent('click'));
|
|
|
|
document.addEventListener("click", function(e) {
|
|
let element = e.target.closest(".accordion-header label");
|
|
if (element) {
|
|
//e.stopPropagation();
|
|
|
|
let item = element.closest(".accordion-item");
|
|
let parent = item.closest(".accordion");
|
|
let collapse = item.querySelector(":scope > .collapse");
|
|
|
|
parent.querySelectorAll(".collapse.show").forEach(e => bootstrap.Collapse.getOrCreateInstance(e)?.hide());
|
|
parent.querySelectorAll(".accordion-button").forEach(e => e.classList.add("collapsed"));
|
|
|
|
item.querySelector(".accordion-button").classList.remove("collapsed");
|
|
bootstrap.Collapse.getOrCreateInstance(collapse)?.show();
|
|
|
|
//disable inputs for non selected payment and shipping methods to avoid form validation issues
|
|
parent.querySelectorAll(".accordion-body input, .accordion-body select, .accordion-body textarea").forEach(e => e.setAttribute("disabled", "true"));
|
|
//enable only for selected method
|
|
item.querySelectorAll(".accordion-body input, .accordion-body select, .accordion-body textarea").forEach(e => e.removeAttribute("disabled"));
|
|
|
|
let input = item.querySelector('[name="shipping_method"], [name="payment_method"]');
|
|
let parameters = {};
|
|
parameters[element.name] = element.value;
|
|
refreshCart(parameters, element);
|
|
}
|
|
});
|
|
|
|
//document.querySelector("[data-v-countries][readonly]")?.dispatchEvent(new Event('change', {bubbles:true}));
|
|
document.querySelector('input[name="register"]:checked')?.dispatchEvent(new MouseEvent('click', {bubbles:true}));
|
|
});
|
|
|
|
//load regions for region select when country changes
|
|
let regions = [];
|
|
|
|
function addRegionsToSelect(regionSelect, data, region_id = 0, countrySelect) {
|
|
regionSelect.replaceChildren();
|
|
for (const region of data) {
|
|
regionSelect.append(new Option(region.name, region.region_id));
|
|
}
|
|
regionSelect.value = region_id;
|
|
regionSelect.removeAttribute("readonly");
|
|
countrySelect.removeAttribute("readonly");
|
|
}
|
|
|
|
function reloadRegions(element){
|
|
let parameters = {};
|
|
if (element) {
|
|
document.querySelectorAll("[data-v-countries],[data-v-regions]").forEach(e => parameters[e.name] = e.value ?? 0);
|
|
}
|
|
document.querySelector("[data-v-countries][readonly]")?.dispatchEvent(new Event('change'));
|
|
refreshCart(parameters, element, ['.cart-summary', '[data-v-component-checkout-shipping]' ,'[data-v-component-checkout-payment]']);
|
|
}
|
|
|
|
document.addEventListener("change", function (e) {
|
|
let element = e.target.closest("[data-v-countries]");
|
|
if (element) {
|
|
let regionGroup = element.closest(".address");
|
|
let regionSelect = regionGroup.querySelector("[data-v-regions]");
|
|
let country_id = element.value;
|
|
let region_id = element.dataset.vRegionId;
|
|
let self = element;
|
|
element.readonly = false;
|
|
|
|
if (country_id) {
|
|
if (regions[country_id]) {
|
|
addRegionsToSelect(regionSelect, regions[country_id], region_id, self);
|
|
reloadRegions(element);
|
|
} else {
|
|
fetch(regionsUrl + "&country_id=" + country_id)
|
|
.then(response => {
|
|
if (!response.ok) { throw new Error(response) }
|
|
return response.json()
|
|
})
|
|
.then(data => {
|
|
regions[country_id] = data;
|
|
addRegionsToSelect(regionSelect, data, region_id, self);
|
|
document.querySelector("[data-v-countries][readonly]")?.dispatchEvent(new Event('change', {bubbles:true}));
|
|
reloadRegions(element);
|
|
})
|
|
.catch(error => {
|
|
console.log(error.statusText);
|
|
//displayToast("danger", "Revision", "Error!");
|
|
});
|
|
}
|
|
}
|
|
|
|
element.dataset.vRegionId = 0;
|
|
} else {
|
|
let element = e.target.closest("[data-v-regions]");
|
|
if (element) {
|
|
reloadRegions(element);
|
|
}
|
|
}
|
|
});
|
|
|
|
function togglePasswordInput(element, input) {
|
|
let password = document.getElementById(input);
|
|
if (password.type == "password") {
|
|
password.type = "text";
|
|
let i = element.querySelector("i")
|
|
i.classList.add("la-eye")
|
|
i.classList.remove("la-eye-slash");
|
|
} else {
|
|
password.type = "password";
|
|
let i = element.querySelector("i")
|
|
i.classList.remove("la-eye")
|
|
i.classList.add("la-eye-slash");
|
|
}
|
|
}
|
|
|
|
|
|
document.addEventListener('click', function (e) {
|
|
let element = e.target.closest('.btn-coupon, .btn-remove-coupon');
|
|
if (element) {
|
|
let updateElements = [".cart-right-column", ".mini-cart", ".cart-summary"];
|
|
VvvebTheme.Cart.module= 'checkout/checkout';
|
|
if (element.classList.contains("btn-remove-coupon")) {
|
|
let coupon = element.parentNode.querySelector(".code").innerHTML;
|
|
let container = e.target.closest("[data-v-cart-coupon]");
|
|
VvvebTheme.Cart.removeCoupon({coupon}, element, updateElements);
|
|
container.remove();
|
|
} else {
|
|
let coupon = document.querySelector("[name='coupon']").value;
|
|
VvvebTheme.Cart.coupon({coupon}, element, updateElements);
|
|
}
|
|
e.preventDefault();
|
|
}
|
|
});
|
|
|
|
function toggleLoginForm() {
|
|
let container = document.getElementById('checkout-login-container');
|
|
container.style.display = container.style.display ? "" : "none";
|
|
}
|
|
|
|
|
|
document.querySelectorAll(".accordion-button .form-check-input:checked").forEach(e => e.parentNode.classList.remove("collapsed"));
|