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