summaryrefslogtreecommitdiff
path: root/addons/website_sale_delivery/static/src
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/src
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_sale_delivery/static/src')
-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
2 files changed, 165 insertions, 0 deletions
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;
+}