[FIX] website_sale_aplicoop: wire home delivery preference through all save flows
Three bugs prevented home_delivery from reaching sale.order: 1. #home-delivery-btn (shop sidebar) had no JS handler — clicking it did nothing. Now it toggles active state and persists choice to sessionStorage. 2. _executeSaveCartAsDraft (Save Cart button) never included is_delivery in the request body. Now reads the toggle button state (or the page-level data-home-delivery-enabled fallback) and sends is_delivery correctly. 3. #home-delivery-checkbox on checkout page was unchecked by default and always shown. Now it is pre-checked when group_order.home_delivery is True, wrapped in t-if to hide it when delivery is not configured, and synced bidirectionally with sessionStorage so the shop-page toggle state carries over to checkout. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
a1899483c5
commit
27097004fb
2 changed files with 61 additions and 2 deletions
|
|
@ -806,6 +806,30 @@
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// On checkout page: apply sessionStorage delivery preference to checkbox.
|
||||||
|
// The shop-page toggle may have stored a "false" preference even though
|
||||||
|
// the checkbox is checked by default in the template.
|
||||||
|
var checkoutCheckbox = document.getElementById("home-delivery-checkbox");
|
||||||
|
if (checkoutCheckbox) {
|
||||||
|
var storedDeliveryPref = sessionStorage.getItem(
|
||||||
|
"eskaera_is_delivery_" + self.orderId
|
||||||
|
);
|
||||||
|
if (storedDeliveryPref !== null) {
|
||||||
|
checkoutCheckbox.checked = storedDeliveryPref === "true";
|
||||||
|
console.log(
|
||||||
|
"[CHECKOUT] Restored delivery checkbox from sessionStorage:",
|
||||||
|
checkoutCheckbox.checked
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// Sync sessionStorage when user manually changes the checkbox
|
||||||
|
checkoutCheckbox.addEventListener("change", function () {
|
||||||
|
sessionStorage.setItem(
|
||||||
|
"eskaera_is_delivery_" + self.orderId,
|
||||||
|
this.checked ? "true" : "false"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Button to reload from draft (in My Cart header - cart pages)
|
// Button to reload from draft (in My Cart header - cart pages)
|
||||||
var reloadCartBtn = document.getElementById("reload-cart-btn");
|
var reloadCartBtn = document.getElementById("reload-cart-btn");
|
||||||
console.log("[_attachEventListeners] reload-cart-btn found:", !!reloadCartBtn);
|
console.log("[_attachEventListeners] reload-cart-btn found:", !!reloadCartBtn);
|
||||||
|
|
@ -830,6 +854,28 @@
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Home-delivery toggle button (shop sidebar)
|
||||||
|
var homeDeliveryBtn = document.getElementById("home-delivery-btn");
|
||||||
|
if (homeDeliveryBtn) {
|
||||||
|
// Restore persisted preference on page load
|
||||||
|
var storedDelivery = sessionStorage.getItem(
|
||||||
|
"eskaera_is_delivery_" + self.orderId
|
||||||
|
);
|
||||||
|
if (storedDelivery === "true") {
|
||||||
|
homeDeliveryBtn.classList.add("active");
|
||||||
|
}
|
||||||
|
homeDeliveryBtn.addEventListener("click", function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var isNowActive = !homeDeliveryBtn.classList.contains("active");
|
||||||
|
homeDeliveryBtn.classList.toggle("active", isNowActive);
|
||||||
|
sessionStorage.setItem(
|
||||||
|
"eskaera_is_delivery_" + self.orderId,
|
||||||
|
isNowActive ? "true" : "false"
|
||||||
|
);
|
||||||
|
console.log("[HOME_DELIVERY_BTN] toggled to:", isNowActive);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Buttons to clear cart (header + footer)
|
// Buttons to clear cart (header + footer)
|
||||||
var clearCartBtns = [
|
var clearCartBtns = [
|
||||||
document.getElementById("clear-cart-btn"),
|
document.getElementById("clear-cart-btn"),
|
||||||
|
|
@ -1553,6 +1599,17 @@
|
||||||
merge_action: "replace",
|
merge_action: "replace",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Include delivery preference: read from toggle button state,
|
||||||
|
// falling back to the page-level home-delivery-enabled attribute.
|
||||||
|
var deliveryBtn = document.getElementById("home-delivery-btn");
|
||||||
|
if (deliveryBtn) {
|
||||||
|
orderData.is_delivery = deliveryBtn.classList.contains("active");
|
||||||
|
} else {
|
||||||
|
var wrap = document.getElementById("wrap");
|
||||||
|
var enabledAttr = wrap && wrap.getAttribute("data-home-delivery-enabled");
|
||||||
|
orderData.is_delivery = enabledAttr === "true";
|
||||||
|
}
|
||||||
|
|
||||||
var xhr = new XMLHttpRequest();
|
var xhr = new XMLHttpRequest();
|
||||||
xhr.open("POST", "/eskaera/save-order", true);
|
xhr.open("POST", "/eskaera/save-order", true);
|
||||||
xhr.setRequestHeader("Content-Type", "application/json");
|
xhr.setRequestHeader("Content-Type", "application/json");
|
||||||
|
|
|
||||||
|
|
@ -503,16 +503,17 @@
|
||||||
</t>
|
</t>
|
||||||
</div>
|
</div>
|
||||||
<div class="oe_structure oe_empty mb-4" data-name="After Summary" />
|
<div class="oe_structure oe_empty mb-4" data-name="After Summary" />
|
||||||
|
<t t-if="group_order.home_delivery">
|
||||||
<div class="card border-0 shadow-sm mb-4">
|
<div class="card border-0 shadow-sm mb-4">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input type="checkbox" class="form-check-input" id="home-delivery-checkbox" name="home_delivery" />
|
<input type="checkbox" class="form-check-input" id="home-delivery-checkbox" name="home_delivery" checked="checked" />
|
||||||
<label class="form-check-label fw-bold" for="home-delivery-checkbox">Home Delivery</label>
|
<label class="form-check-label fw-bold" for="home-delivery-checkbox">Home Delivery</label>
|
||||||
</div>
|
</div>
|
||||||
<div id="delivery-info-alert" class="alert alert-info mt-3 d-none">
|
<div id="delivery-info-alert" class="alert alert-info mt-3 d-none">
|
||||||
<p class="mb-2">
|
<p class="mb-2">
|
||||||
<i class="fa fa-truck" aria-hidden="true" t-translation="off" />
|
<i class="fa fa-truck" aria-hidden="true" t-translation="off" />
|
||||||
<t t-if="group_order.delivery_date and group_order.home_delivery">
|
<t t-if="group_order.delivery_date">
|
||||||
<strong>Delivery Information:</strong> Your order will be delivered at
|
<strong>Delivery Information:</strong> Your order will be delivered at
|
||||||
<t t-esc="day_names[(int(group_order.pickup_day) + 1) % 7]" />
|
<t t-esc="day_names[(int(group_order.pickup_day) + 1) % 7]" />
|
||||||
<t t-esc="group_order.delivery_date.strftime('%d/%m/%Y')" />
|
<t t-esc="group_order.delivery_date.strftime('%d/%m/%Y')" />
|
||||||
|
|
@ -525,6 +526,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</t>
|
||||||
<div class="checkout-actions d-grid gap-3" id="checkout-form-labels">
|
<div class="checkout-actions d-grid gap-3" id="checkout-form-labels">
|
||||||
<button class="btn btn-success btn-lg" id="confirm-order-btn" t-attf-data-order-id="{{ group_order.id }}" t-att-data-confirmed-label="labels.get('order_saved_as_draft', 'Order saved as draft')" t-att-data-pickup-label="labels.get('pickup_day_label', 'Pickup Day')" t-att-aria-label="labels.get('save_order_as_draft', 'Save order as draft')" t-att-data-bs-title="labels.get('save_draft', 'Save Draft')" data-bs-toggle="tooltip">
|
<button class="btn btn-success btn-lg" id="confirm-order-btn" t-attf-data-order-id="{{ group_order.id }}" t-att-data-confirmed-label="labels.get('order_saved_as_draft', 'Order saved as draft')" t-att-data-pickup-label="labels.get('pickup_day_label', 'Pickup Day')" t-att-aria-label="labels.get('save_order_as_draft', 'Save order as draft')" t-att-data-bs-title="labels.get('save_draft', 'Save Draft')" data-bs-toggle="tooltip">
|
||||||
<i class="fa fa-save" aria-hidden="true" t-translation="off" />
|
<i class="fa fa-save" aria-hidden="true" t-translation="off" />
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue