[FIX] website_sale, website_sale_options: fixing prices of product vs options in the modal
Before this commit, having an option on a product, the modal had every prices set to the one of the option
This was brought about by commit c8a434306f which was designed for the pricelists and striked prices
After this commit, we keep the intended behavior for pricelists while controlling that options would not mess up the modal
The prices that are displayed are the right ones.
OPW 744943
GH-17342
[FIX] website_sale, website_sale_options:fix the modal of options
Before this commit, the add quantity button were not working at all
This commit corrects the behavior by browsing the dom for anything that looks like a product section
Closes #17353
This commit is contained in:
@@ -128,16 +128,17 @@ class WebsiteSale(http.Controller):
|
||||
(variant id, [visible attribute ids], variant price, variant sale price)
|
||||
"""
|
||||
# product attributes with at least two choices
|
||||
product = product.with_context(quantity=1)
|
||||
quantity = product._context.get('quantity') or 1
|
||||
product = product.with_context(quantity=quantity)
|
||||
|
||||
visible_attrs_ids = product.attribute_line_ids.filtered(lambda l: len(l.value_ids) > 1).mapped('attribute_id').ids
|
||||
to_currency = request.website.get_current_pricelist().currency_id
|
||||
attribute_value_ids = []
|
||||
for variant in product.product_variant_ids:
|
||||
if to_currency != product.currency_id:
|
||||
price = variant.currency_id.compute(variant.website_public_price, to_currency)
|
||||
price = variant.currency_id.compute(variant.website_public_price, to_currency) / quantity
|
||||
else:
|
||||
price = variant.website_public_price
|
||||
price = variant.website_public_price / quantity
|
||||
visible_attribute_ids = [v.id for v in variant.attribute_value_ids if v.attribute_id.id in visible_attrs_ids]
|
||||
attribute_value_ids.append([variant.id, visible_attribute_ids, variant.website_price, price])
|
||||
return attribute_value_ids
|
||||
|
||||
@@ -86,23 +86,30 @@ odoo.define('website_sale.website_sale', function (require) {
|
||||
|
||||
$(oe_website_sale).on("change", 'input[name="add_qty"]', function (event) {
|
||||
var product_ids = [];
|
||||
var product_dom = $(".js_product .js_add_cart_variants[data-attribute_value_ids]").last();
|
||||
var product_dom = $(".js_product .js_add_cart_variants[data-attribute_value_ids]");
|
||||
var qty = $(event.target).closest('form').find('input[name="add_qty"]').val();
|
||||
if (!product_dom.length) {
|
||||
return;
|
||||
}
|
||||
_.each(product_dom.data("attribute_value_ids"), function(entry) {
|
||||
product_ids.push(entry[0]);});
|
||||
var qty = $(event.target).closest('form').find('input[name="add_qty"]').val();
|
||||
_.each(product_dom, function (prod) {
|
||||
_.each($(prod).data("attribute_value_ids"), function(entry) {
|
||||
if (product_ids.indexOf(entry[0]) === -1) {
|
||||
product_ids.push(entry[0]);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
if ($("#product_detail").length) {
|
||||
// display the reduction from the pricelist in function of the quantity
|
||||
ajax.jsonRpc("/shop/get_unit_price", 'call', {'product_ids': product_ids,'add_qty': parseInt(qty)})
|
||||
.then(function (data) {
|
||||
var current = product_dom.data("attribute_value_ids");
|
||||
for(var j=0; j < current.length; j++){
|
||||
current[j][2] = data[current[j][0]];
|
||||
}
|
||||
product_dom.attr("data-attribute_value_ids", JSON.stringify(current)).trigger("change");
|
||||
_.each(product_dom, function (prod) {
|
||||
var current = $(prod).data("attribute_value_ids");
|
||||
for(var j=0; j < current.length; j++){
|
||||
current[j][2] = data[current[j][0]];
|
||||
}
|
||||
$(prod).trigger("change");
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -294,17 +301,18 @@ odoo.define('website_sale.website_sale', function (require) {
|
||||
$(oe_website_sale).on('change', 'input.js_variant_change, select.js_variant_change, ul[data-attribute_value_ids]', function (ev) {
|
||||
var $ul = $(ev.target).closest('.js_add_cart_variants');
|
||||
var $parent = $ul.closest('.js_product');
|
||||
var $product_id = $parent.find('input.product_id').first();
|
||||
var $price = $parent.find(".oe_price:first .oe_currency_value")
|
||||
.add($('#product_confirmation').find(".oe_price"));
|
||||
var $default_price = $parent.find(".oe_default_price:first .oe_currency_value")
|
||||
.add($('#product_confirmation').find(".oe_default_price:first .oe_currency_value"));
|
||||
var $product_id = $parent.find('.product_id').first();
|
||||
var $price = $parent.find(".oe_price:first .oe_currency_value");
|
||||
var $default_price = $parent.find(".oe_default_price:first .oe_currency_value");
|
||||
var $optional_price = $parent.find(".oe_optional:first .oe_currency_value");
|
||||
var variant_ids = $ul.data("attribute_value_ids");
|
||||
var values = [];
|
||||
var unchanged_values = $parent.find('div.oe_unchanged_value_ids').data('unchanged_value_ids') || [];
|
||||
|
||||
$parent.find('input.js_variant_change:checked, select.js_variant_change').each(function () {
|
||||
values.push(+$(this).val());
|
||||
});
|
||||
values = values.concat(unchanged_values);
|
||||
|
||||
$parent.find("label").removeClass("text-muted css_not_available");
|
||||
|
||||
@@ -318,8 +326,10 @@ odoo.define('website_sale.website_sale', function (require) {
|
||||
if (variant_ids[k][3]-variant_ids[k][2]>0.01) {
|
||||
$default_price.closest('.oe_website_sale').addClass("discount");
|
||||
$optional_price.closest('.oe_optional').show().css('text-decoration', 'line-through');
|
||||
$default_price.parent().removeClass('hidden');
|
||||
} else {
|
||||
$optional_price.closest('.oe_optional').hide();
|
||||
$default_price.parent().addClass('hidden');
|
||||
}
|
||||
product_id = variant_ids[k][0];
|
||||
update_product_image(this, product_id);
|
||||
|
||||
@@ -443,7 +443,8 @@
|
||||
<div class="col-sm-5 col-lg-4 col-lg-offset-1" id="product_details">
|
||||
<h1 itemprop="name" t-field="product.name">Product Name</h1>
|
||||
<span itemprop="url" style="display:none;" t-esc="'/shop/product/%s' % slug(product)" />
|
||||
<form action="/shop/cart/update" class="js_add_cart_variants" t-att-data-attribute_value_ids="product.product_variant_ids.ids" method="POST">
|
||||
<t t-set="attribute_value_ids" t-value="get_attribute_value_ids(product)"/>
|
||||
<form action="/shop/cart/update" class="js_add_cart_variants" t-att-data-attribute_value_ids="attribute_value_ids" method="POST">
|
||||
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()" />
|
||||
<div class="js_product" t-if="product.product_variant_ids">
|
||||
<t t-placeholder="select">
|
||||
|
||||
@@ -54,6 +54,7 @@ class WebsiteSaleOptions(WebsiteSale):
|
||||
def modal(self, product_id, **kw):
|
||||
pricelist = request.website.get_current_pricelist()
|
||||
product_context = dict(request.context)
|
||||
quantity = kw['kwargs']['context']['quantity']
|
||||
if not product_context.get('pricelist'):
|
||||
product_context['pricelist'] = pricelist.id
|
||||
# fetch quantity from custom context
|
||||
@@ -63,8 +64,18 @@ class WebsiteSaleOptions(WebsiteSale):
|
||||
to_currency = pricelist.currency_id
|
||||
compute_currency = lambda price: request.env['res.currency']._compute(from_currency, to_currency, price)
|
||||
product = request.env['product.product'].with_context(product_context).browse(int(product_id))
|
||||
|
||||
main_product_attr_ids = self.get_attribute_value_ids(product)
|
||||
for variant in main_product_attr_ids:
|
||||
if variant[0] == product.id:
|
||||
# We indeed need a list of lists (even with only 1 element)
|
||||
main_product_attr_ids = [variant]
|
||||
break
|
||||
|
||||
return request.env['ir.ui.view'].render_template("website_sale_options.modal", {
|
||||
'product': product,
|
||||
'quantity': quantity,
|
||||
'compute_currency': compute_currency,
|
||||
'get_attribute_value_ids': self.get_attribute_value_ids,
|
||||
'main_product_attr_ids': main_product_attr_ids,
|
||||
})
|
||||
|
||||
@@ -4,4 +4,9 @@
|
||||
|
||||
table.js_cart_lines .optional_product .js_delete_product {
|
||||
display: none
|
||||
}
|
||||
}
|
||||
|
||||
.oe_striked_price {
|
||||
text-decoration: line-through;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ $('.oe_website_sale #add_to_cart, .oe_website_sale #products_grid .a-submit')
|
||||
var product_id = $($modal.find('span.oe_price[data-product-id]')).first().data('product-id');
|
||||
var product_ids = [product_id];
|
||||
var $products_dom = [];
|
||||
$modal.find(".js_add_cart_variants[data-attribute_value_ids]").each(function(){
|
||||
$("ul.js_add_cart_variants[data-attribute_value_ids]").each(function(){
|
||||
var $el = $(this);
|
||||
$products_dom.push($el);
|
||||
_.each($el.data("attribute_value_ids"), function (values) {
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr id="product_confirmation">
|
||||
<tr id="product_confirmation" class="js_product">
|
||||
<td width="100">
|
||||
<span t-field="product.image_medium" t-options='{"widget": "image" }'/>
|
||||
</td>
|
||||
@@ -54,16 +54,18 @@
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<span t-attf-class="text-danger oe_default_price" style="text-decoration: line-through; white-space: nowrap;"
|
||||
<ul class="hidden js_add_cart_variants" t-att-data-attribute_value_ids="main_product_attr_ids"></ul>
|
||||
<div class="hidden oe_unchanged_value_ids" t-att-data-unchanged_value_ids="main_product_attr_ids[0][1]" ></div>
|
||||
<span t-attf-class="text-danger oe_default_price oe_striked_price {{ (compute_currency(product.lst_price) - product.website_price) < 0.01 and 'hidden' }}"
|
||||
t-field="product.lst_price"
|
||||
t-options='{
|
||||
"widget": "monetary",
|
||||
"from_currency": product.currency_id,
|
||||
"display_currency": website.currency_id
|
||||
}'/>
|
||||
<span class="oe_price" style="white-space: nowrap;"
|
||||
<span class="oe_price product_id" style="white-space: nowrap;"
|
||||
t-att-data-product-id="product.id"
|
||||
t-field="product.with_context(quantity=1).website_price"
|
||||
t-esc="product.website_price / quantity"
|
||||
t-options='{
|
||||
"widget": "monetary",
|
||||
"display_currency": website.currency_id
|
||||
|
||||
Reference in New Issue
Block a user