From 3bdf6cb3589b081b6491284bf32dd43c5d9f66d4 Mon Sep 17 00:00:00 2001 From: Romain Derie Date: Mon, 1 Apr 2019 14:06:14 +0000 Subject: [PATCH] [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 --- .../website_sale_delivery/controllers/main.py | 16 ++++++++++++++ .../static/src/js/website_sale_delivery.js | 22 +++++++++++++++++++ .../views/website_sale_delivery_templates.xml | 2 +- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/addons/website_sale_delivery/controllers/main.py b/addons/website_sale_delivery/controllers/main.py index 4cf050cea7d..58a9e26a36b 100644 --- a/addons/website_sale_delivery/controllers/main.py +++ b/addons/website_sale_delivery/controllers/main.py @@ -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) diff --git a/addons/website_sale_delivery/static/src/js/website_sale_delivery.js b/addons/website_sale_delivery/static/src/js/website_sale_delivery.js index f893f743a83..f2d775362ee 100644 --- a/addons/website_sale_delivery/static/src/js/website_sale_delivery.js +++ b/addons/website_sale_delivery/static/src/js/website_sale_delivery.js @@ -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(''); + }, /** * @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); diff --git a/addons/website_sale_delivery/views/website_sale_delivery_templates.xml b/addons/website_sale_delivery/views/website_sale_delivery_templates.xml index 96f3aae0cdd..0f802fe7d80 100644 --- a/addons/website_sale_delivery/views/website_sale_delivery_templates.xml +++ b/addons/website_sale_delivery/views/website_sale_delivery_templates.xml @@ -31,7 +31,7 @@ Free - + Select to compute delivery rate