[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:
Lucas Perais (lpe)
2017-07-10 10:44:43 +02:00
parent 7522e29927
commit 8bd56bb466
7 changed files with 54 additions and 24 deletions
+4 -3
View File
@@ -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);
+2 -1
View File
@@ -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) &lt; 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