mirror of
https://github.com/bringout/oca-ocb-sale.git
synced 2026-04-28 05:52:05 +02:00
Initial commit: Sale packages
This commit is contained in:
commit
14e3d26998
6469 changed files with 2479670 additions and 0 deletions
|
|
@ -0,0 +1,176 @@
|
|||
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 = $('button[name="o_payment_submit_button"]');
|
||||
// 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').empty();
|
||||
$carrierInput.siblings('.o_wsale_delivery_badge_price').append('<span class="fa fa-circle-o-notch fa-spin"/>');
|
||||
},
|
||||
/**
|
||||
* Update the total cost according to the selected shipping method
|
||||
*
|
||||
* @private
|
||||
* @param {float} amount : The new total amount of to be paid
|
||||
*/
|
||||
_updateShippingCost: function(amount){
|
||||
core.bus.trigger('update_shipping_cost', amount);
|
||||
},
|
||||
/**
|
||||
* @private
|
||||
* @param {Object} result
|
||||
*/
|
||||
_handleCarrierUpdateResult: function (result) {
|
||||
this._handleCarrierUpdateResultBadge(result);
|
||||
var $payButton = $('button[name="o_payment_submit_button"]');
|
||||
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);
|
||||
}
|
||||
if (result.new_amount_total_raw !== undefined) {
|
||||
this._updateShippingCost(result.new_amount_total_raw);
|
||||
// reload page only when amount_total switches between zero and not zero
|
||||
const hasPaymentMethod = document.querySelector(
|
||||
"div[name='o_website_sale_free_cart']"
|
||||
) === null;
|
||||
const shouldDisplayPaymentMethod = result.new_amount_total_raw !== 0;
|
||||
if (hasPaymentMethod !== shouldDisplayPaymentMethod) {
|
||||
location.reload(false);
|
||||
}
|
||||
}
|
||||
},
|
||||
/**
|
||||
* @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 = $('button[name="o_payment_submit_button"]');
|
||||
$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);
|
||||
}
|
||||
},
|
||||
});
|
||||
});
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
@include media-breakpoint-down(md) {
|
||||
.o_wsale_delivery_badge_price {
|
||||
max-width: 130px;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
#delivery_method .o_delivery_carrier_select:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue