summaryrefslogtreecommitdiff
path: root/addons/website_sale_delivery/static
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/website_sale_delivery/static
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_sale_delivery/static')
-rw-r--r--addons/website_sale_delivery/static/description/icon.pngbin0 -> 9865 bytes
-rw-r--r--addons/website_sale_delivery/static/description/icon.svg1
-rw-r--r--addons/website_sale_delivery/static/src/js/website_sale_delivery.js155
-rw-r--r--addons/website_sale_delivery/static/src/scss/website_sale_delivery.scss10
-rw-r--r--addons/website_sale_delivery/static/tests/tours/website_free_delivery.js47
5 files changed, 213 insertions, 0 deletions
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
--- /dev/null
+++ b/addons/website_sale_delivery/static/description/icon.png
Binary files 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 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="70" height="70" viewBox="0 0 70 70"><defs><path id="a" d="M4 0h61c4 0 5 1 5 5v60c0 4-1 5-5 5H4c-3 0-4-1-4-5V5c0-4 1-5 4-5z"/><linearGradient id="c" x1="100%" x2="0%" y1="0%" y2="100%"><stop offset="0%" stop-color="#7CC098"/><stop offset="100%" stop-color="#5F8A71"/></linearGradient></defs><g fill="none" fill-rule="evenodd"><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><g mask="url(#b)"><path fill="url(#c)" d="M0 0H70V70H0z"/><path fill="#FFF" fill-opacity=".383" d="M4 1h61c2.667 0 4.333.667 5 2V0H0v3c.667-1.333 2-2 4-2z"/><path fill="#393939" d="M44.5 69H4c-2 0-4-1-4-4V36.525L21 16h9l4-4h3l4 5h9l4 11 1 26-10.5 15z" opacity=".324"/><path fill="#000" fill-opacity=".383" d="M4 69h61c2.667 0 4.333-1 5-3v4H0v-4c.667 2 2 3 4 3z"/><path fill="#000" d="M16 51.482V29.488L20.875 18h9.147a5.5 5.5 0 0 1 10.956 0h9.147L55 29.488V56H16v-4.023l15.79-5.185.216 1.967 1.37-.61.642-2.245 5.024-2.236.628 7.555 1.826-.813 1.656-8.572 5.023-2.237c.758-.337 1.126-1.157.824-1.836-.302-.678-1.158-.953-1.916-.616l-5.023 2.237-7.478-4.506-1.827.813 5.195 5.522-5.023 2.237-2.098-1.025-1.37.61 1.466 1.645L16 51.482zM30.207 20h-8.951L18 29h35l-4.07-9h-8.137a5.502 5.502 0 0 1-10.586 0zm3.934-.08H33a2.49 2.49 0 0 0 .165.99c.116.287.281.528.495.725.213.197.47.348.77.455.3.107.63.163.99.17v.78h.43v-.78c.333-.013.643-.068.93-.165a2.23 2.23 0 0 0 .75-.42 1.93 1.93 0 0 0 .505-.69c.123-.277.185-.602.185-.975 0-.36-.067-.663-.2-.91a1.904 1.904 0 0 0-.53-.62 2.957 2.957 0 0 0-.76-.41c-.287-.107-.58-.2-.88-.28v-2.11c.36 0 .621.09.785.27.163.18.251.44.265.78h1.14a1.99 1.99 0 0 0-.175-.86 1.721 1.721 0 0 0-.47-.61 1.996 1.996 0 0 0-.695-.36c-.267-.08-.55-.12-.85-.12V14h-.43v.78c-.3 0-.587.043-.86.13a2.302 2.302 0 0 0-.725.375c-.21.163-.377.367-.5.61a1.845 1.845 0 0 0-.185.845c0 .367.066.673.2.92.133.247.308.452.525.615.216.163.46.297.73.4.27.103.541.192.815.265v2.42c-.46-.013-.79-.147-.99-.4-.2-.253-.297-.6-.29-1.04zM35.13 16v2a3.704 3.704 0 0 1-.415-.125 1.33 1.33 0 0 1-.36-.195 1.013 1.013 0 0 1-.255-.29.795.795 0 0 1-.1-.41c0-.353.098-.605.295-.755.197-.15.475-.225.835-.225zm.87 5.33V19c.153.04.303.087.45.14.147.053.278.123.395.21.117.087.21.193.28.32a.96.96 0 0 1 .105.47c0 .4-.115.692-.345.875-.23.183-.525.288-.885.315z" opacity=".3"/><path fill="#FFF" d="M16 49.482V27.488L20.875 16h9.147a5.5 5.5 0 0 1 10.956 0h9.147L55 27.488V54H16v-4.023l15.79-5.185.216 1.967 1.37-.61.642-2.245 5.024-2.236.628 7.555 1.826-.813 1.656-8.572 5.023-2.237c.758-.337 1.126-1.157.824-1.836-.302-.678-1.158-.953-1.916-.616l-5.023 2.237-7.478-4.506-1.827.813 5.195 5.522-5.023 2.237-2.098-1.025-1.37.61 1.466 1.645L16 49.482zM30.207 18h-8.951L18 27h35l-4.07-9h-8.137a5.502 5.502 0 0 1-10.586 0zm3.934-.08H33a2.49 2.49 0 0 0 .165.99c.116.287.281.528.495.725.213.197.47.348.77.455.3.107.63.163.99.17v.78h.43v-.78c.333-.013.643-.068.93-.165a2.23 2.23 0 0 0 .75-.42 1.93 1.93 0 0 0 .505-.69c.123-.277.185-.602.185-.975 0-.36-.067-.663-.2-.91a1.904 1.904 0 0 0-.53-.62 2.957 2.957 0 0 0-.76-.41c-.287-.107-.58-.2-.88-.28v-2.11c.36 0 .621.09.785.27.163.18.251.44.265.78h1.14a1.99 1.99 0 0 0-.175-.86 1.721 1.721 0 0 0-.47-.61 1.996 1.996 0 0 0-.695-.36c-.267-.08-.55-.12-.85-.12V12h-.43v.78c-.3 0-.587.043-.86.13a2.302 2.302 0 0 0-.725.375c-.21.163-.377.367-.5.61a1.845 1.845 0 0 0-.185.845c0 .367.066.673.2.92.133.247.308.452.525.615.216.163.46.297.73.4.27.103.541.192.815.265v2.42c-.46-.013-.79-.147-.99-.4-.2-.253-.297-.6-.29-1.04zM35.13 14v2a3.704 3.704 0 0 1-.415-.125 1.33 1.33 0 0 1-.36-.195 1.013 1.013 0 0 1-.255-.29.795.795 0 0 1-.1-.41c0-.353.098-.605.295-.755.197-.15.475-.225.835-.225zm.87 5.33V17c.153.04.303.087.45.14.147.053.278.123.395.21.117.087.21.193.28.32a.96.96 0 0 1 .105.47c0 .4-.115.692-.345.875-.23.183-.525.288-.885.315z"/></g></g></svg> \ 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('<span class="fa fa-spinner fa-spin"/>');
+ },
+ /**
+ * @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
+ }
+ ]);
+});