From 3751379f1e9a4c215fb6eb898b4ccc67659b9ace Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 10 May 2022 21:51:50 +0700 Subject: initial commit 2 --- .../static/description/icon.png | Bin 0 -> 9865 bytes .../static/description/icon.svg | 1 + .../static/src/js/website_sale_delivery.js | 155 +++++++++++++++++++++ .../static/src/scss/website_sale_delivery.scss | 10 ++ .../static/tests/tours/website_free_delivery.js | 47 +++++++ 5 files changed, 213 insertions(+) create mode 100644 addons/website_sale_delivery/static/description/icon.png create mode 100644 addons/website_sale_delivery/static/description/icon.svg create mode 100644 addons/website_sale_delivery/static/src/js/website_sale_delivery.js create mode 100644 addons/website_sale_delivery/static/src/scss/website_sale_delivery.scss create mode 100644 addons/website_sale_delivery/static/tests/tours/website_free_delivery.js (limited to 'addons/website_sale_delivery/static') diff --git a/addons/website_sale_delivery/static/description/icon.png b/addons/website_sale_delivery/static/description/icon.png new file mode 100644 index 00000000..607cbd79 Binary files /dev/null and b/addons/website_sale_delivery/static/description/icon.png differ diff --git a/addons/website_sale_delivery/static/description/icon.svg b/addons/website_sale_delivery/static/description/icon.svg new file mode 100644 index 00000000..a8997f1c --- /dev/null +++ b/addons/website_sale_delivery/static/description/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file 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 new file mode 100644 index 00000000..e0187438 --- /dev/null +++ b/addons/website_sale_delivery/static/src/js/website_sale_delivery.js @@ -0,0 +1,155 @@ +odoo.define('website_sale_delivery.checkout', function (require) { +'use strict'; + +var core = require('web.core'); +var publicWidget = require('web.public.widget'); + +var _t = core._t; +var concurrency = require('web.concurrency'); +var dp = new concurrency.DropPrevious(); + +publicWidget.registry.websiteSaleDelivery = publicWidget.Widget.extend({ + selector: '.oe_website_sale', + events: { + 'change select[name="shipping_id"]': '_onSetAddress', + 'click #delivery_carrier .o_delivery_carrier_select': '_onCarrierClick', + }, + + /** + * @override + */ + start: function () { + var self = this; + var $carriers = $('#delivery_carrier input[name="delivery_type"]'); + var $payButton = $('#o_payment_form_pay'); + // Workaround to: + // - update the amount/error on the label at first rendering + // - prevent clicking on 'Pay Now' if the shipper rating fails + if ($carriers.length > 0) { + if ($carriers.filter(':checked').length === 0) { + $payButton.prop('disabled', true); + var disabledReasons = $payButton.data('disabled_reasons') || {}; + disabledReasons.carrier_selection = true; + $payButton.data('disabled_reasons', disabledReasons); + } + $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); + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @private + * @param {jQuery} $carrierInput + */ + _showLoading: function ($carrierInput) { + $carrierInput.siblings('.o_wsale_delivery_badge_price').html(''); + }, + /** + * @private + * @param {Object} result + */ + _handleCarrierUpdateResult: function (result) { + this._handleCarrierUpdateResultBadge(result); + var $payButton = $('#o_payment_form_pay'); + var $amountDelivery = $('#order_delivery .monetary_field'); + var $amountUntaxed = $('#order_total_untaxed .monetary_field'); + var $amountTax = $('#order_total_taxes .monetary_field'); + var $amountTotal = $('#order_total .monetary_field, #amount_total_summary.monetary_field'); + + if (result.status === true) { + $amountDelivery.html(result.new_amount_delivery); + $amountUntaxed.html(result.new_amount_untaxed); + $amountTax.html(result.new_amount_tax); + $amountTotal.html(result.new_amount_total); + var disabledReasons = $payButton.data('disabled_reasons') || {}; + disabledReasons.carrier_selection = false; + $payButton.data('disabled_reasons', disabledReasons); + $payButton.prop('disabled', _.contains($payButton.data('disabled_reasons'), true)); + } else { + $amountDelivery.html(result.new_amount_delivery); + $amountUntaxed.html(result.new_amount_untaxed); + $amountTax.html(result.new_amount_tax); + $amountTotal.html(result.new_amount_total); + } + }, + /** + * @private + * @param {Object} result + */ + _handleCarrierUpdateResultBadge: function (result) { + var $carrierBadge = $('#delivery_carrier input[name="delivery_type"][value=' + result.carrier_id + '] ~ .o_wsale_delivery_badge_price'); + + if (result.status === true) { + // if free delivery (`free_over` field), show 'Free', not '$0' + if (result.is_free_delivery) { + $carrierBadge.text(_t('Free')); + } else { + $carrierBadge.html(result.new_amount_delivery); + } + $carrierBadge.removeClass('o_wsale_delivery_carrier_error'); + } else { + $carrierBadge.addClass('o_wsale_delivery_carrier_error'); + $carrierBadge.text(result.error_message); + } + }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + * @param {Event} ev + */ + _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); + var disabledReasons = $payButton.data('disabled_reasons') || {}; + disabledReasons.carrier_selection = true; + $payButton.data('disabled_reasons', disabledReasons); + dp.add(this._rpc({ + route: '/shop/update_carrier', + params: { + carrier_id: $radio.val(), + }, + })).then(this._handleCarrierUpdateResult.bind(this)); + }, + /** + * @private + * @param {Event} ev + */ + _onSetAddress: function (ev) { + var value = $(ev.currentTarget).val(); + var $providerFree = $('select[name="country_id"]:not(.o_provider_restricted), select[name="state_id"]:not(.o_provider_restricted)'); + var $providerRestricted = $('select[name="country_id"].o_provider_restricted, select[name="state_id"].o_provider_restricted'); + if (value === 0) { + // Ship to the same address : only show shipping countries available for billing + $providerFree.hide().attr('disabled', true); + $providerRestricted.show().attr('disabled', false).change(); + } else { + // Create a new address : show all countries available for billing + $providerFree.show().attr('disabled', false).change(); + $providerRestricted.hide().attr('disabled', true); + } + }, +}); +}); diff --git a/addons/website_sale_delivery/static/src/scss/website_sale_delivery.scss b/addons/website_sale_delivery/static/src/scss/website_sale_delivery.scss new file mode 100644 index 00000000..c0a0cb4a --- /dev/null +++ b/addons/website_sale_delivery/static/src/scss/website_sale_delivery.scss @@ -0,0 +1,10 @@ +@include media-breakpoint-down(sm) { + .o_wsale_delivery_badge_price { + max-width: 130px; + text-overflow: ellipsis; + overflow: hidden; + } +} +#delivery_method .o_delivery_carrier_select:hover { + cursor: pointer; +} diff --git a/addons/website_sale_delivery/static/tests/tours/website_free_delivery.js b/addons/website_sale_delivery/static/tests/tours/website_free_delivery.js new file mode 100644 index 00000000..cad090af --- /dev/null +++ b/addons/website_sale_delivery/static/tests/tours/website_free_delivery.js @@ -0,0 +1,47 @@ +odoo.define('website_sale_delivery.tour', function (require) { +'use strict'; + +var tour = require("web_tour.tour"); + +tour.register('check_free_delivery', { + test: true, + url: '/shop?search=office chair black', +}, + [ + // Part 1: Check free delivery + { + content: "select office chair black", + trigger: '.oe_product_cart a:contains("Office Chair Black TEST")', + }, + { + content: "click on add to cart", + trigger: '#product_details #add_to_cart', + }, + { + content: "go to checkout", + extra_trigger: '#cart_products input.js_quantity:propValue(1)', + trigger: 'a[href*="/shop/checkout"]', + }, + { + content: "Check Free Delivery value to be zero", + extra_trigger: '#delivery_carrier label:containsExact("Delivery Now Free Over 10")', + trigger: "#delivery_carrier span:contains('0.0')" + }, + // Part 2: check multiple delivery & price loaded asynchronously + { + content: "Ensure price was loaded asynchronously", + extra_trigger: '#delivery_carrier input[name="delivery_type"]:checked', + trigger: '#delivery_method .o_delivery_carrier_select:contains("20.0"):contains("The Poste")', + run: function () {}, // it's a check + }, + { + content: "Click on Pay Now", + trigger: 'button[id="o_payment_form_pay"]:visible:not(:disabled)', + }, + { + content: "Confirmation page should be shown", + trigger: '#oe_structure_website_sale_confirmation_1', + run: function () {}, // it's a check + } + ]); +}); -- cgit v1.2.3