[IMP] website_sale_delivery: load carrier price async

Before this commit:
User landing on checkout payment step had to select a carrier.
These carriers only showed 'Select to compute price'. This was done to
prevent the page to take seconds to load, since it would compute all the
carrier price by querying these carrier API then display the page.
The users would still click on every carrier anyway to check all the prices and
select the cheapest one.

Now:
Once the page is loaded, we will asynchronously retrieve every carrier prices.
That way, the page rendering page will not be affected and the user will be
able to see the price of every carrier after a few seconds without having to do
anything.

Closes #31857
task-1867265
This commit is contained in:
Romain Derie
2019-04-02 08:00:34 +00:00
committed by Jeremy Kersten
parent 37f4bfff3f
commit 3bdf6cb358
3 changed files with 39 additions and 1 deletions
@@ -29,6 +29,22 @@ class WebsiteSaleDelivery(WebsiteSale):
order._check_carrier_quotation(force_carrier_id=carrier_id)
return self._update_website_sale_delivery_return(order, **post)
@http.route(['/shop/carrier_rate_shipment'], type='json', auth='public', methods=['POST'], website=True)
def cart_carrier_rate_shipment(self, carrier_id, **kw):
order = request.website.sale_get_order(force_create=True)
res = {'carrier_id': carrier_id}
carrier = request.env['delivery.carrier'].browse(int(carrier_id))
rate = carrier.rate_shipment(order)
if rate.get('success'):
res['status'] = True
res['new_amount_delivery'] = rate['price']
res['error_message'] = rate['warning_message']
else:
res['status'] = False
res['new_amount_delivery'] = 0.0
res['error_message'] = rate['error_message']
return res
def order_lines_2_google_api(self, order_lines):
""" Transforms a list of order lines into a dict for google analytics """
order_lines_not_delivery = order_lines.filtered(lambda line: not line.is_delivery)
@@ -19,6 +19,7 @@ publicWidget.registry.websiteSaleDelivery = publicWidget.Widget.extend({
* @override
*/
start: function () {
var self = this;
var $carriers = $('#delivery_carrier input[name="delivery_type"]');
// Workaround to:
// - update the amount/error on the label at first rendering
@@ -26,6 +27,18 @@ publicWidget.registry.websiteSaleDelivery = publicWidget.Widget.extend({
if ($carriers.length > 0) {
$carriers.filter(':checked').click();
}
// Asynchronously retrieve every carrier price
_.each($carriers, function (carrierInput, k) {
self._showLoading($(carrierInput));
self._rpc({
route: '/shop/carrier_rate_shipment',
params: {
'carrier_id': carrierInput.value,
},
}).then(self._handleCarrierUpdateResultBadge.bind(self));
});
return this._super.apply(this, arguments);
},
@@ -33,6 +46,14 @@ publicWidget.registry.websiteSaleDelivery = publicWidget.Widget.extend({
// Private
//--------------------------------------------------------------------------
/**
* @private
* @param {jQuery} $carrierInput
*/
_showLoading: function ($carrierInput) {
$carrierInput.siblings('.o_wsale_delivery_badge_price').addClass('d-none');
$carrierInput.siblings('.o_delivery_compute').removeClass('d-none').html('<span class="fa fa-spinner fa-spin"/>');
},
/**
* @private
* @param {Object} result
@@ -94,6 +115,7 @@ publicWidget.registry.websiteSaleDelivery = publicWidget.Widget.extend({
*/
_onCarrierClick: function (ev) {
var $radio = $(ev.currentTarget).find('input[type="radio"]');
this._showLoading($radio);
$radio.prop("checked", true);
var $payButton = $('#o_payment_form_pay');
$payButton.prop('disabled', true);
@@ -31,7 +31,7 @@
<span t-else="" t-att-class="badge_class">Free</span>
</t>
<t t-else="">
<span t-attf-class="#{badge_class} d-none" t-field="delivery.fixed_price" t-options='{"widget": "monetary", "from_currency": delivery.product_id.company_id.currency_id, "display_currency": website_sale_order.currency_id}'/>
<span t-attf-class="#{badge_class} o_wsale_delivery_badge_price d-none" t-field="delivery.fixed_price" t-options='{"widget": "monetary", "from_currency": delivery.product_id.company_id.currency_id, "display_currency": website_sale_order.currency_id}'/>
<span t-attf-class="#{badge_class} o_delivery_compute">Select to compute delivery rate</span>
</t>
<t t-if="delivery.website_description">