From bfe857db1dd5408af57f46aa51eae8be82a4c6f9 Mon Sep 17 00:00:00 2001 From: vava-odoo Date: Fri, 20 Oct 2023 13:29:34 +0200 Subject: [PATCH] [IMP] website_sale: display warning in notifications When adding items to the cart, the server returns warnings that are never displayed to the customer. This commit makes use of the new notification system of website_sale to display it. task-3502911 Part-of: odoo/odoo#139332 --- addons/website_sale/__manifest__.py | 4 ++ addons/website_sale/controllers/main.py | 1 + .../add_to_cart_notification.js | 48 +++++++++++++++++++ .../add_to_cart_notification.xml | 25 ++++++++++ .../cart_notification/cart_notification.js | 28 ++--------- .../cart_notification/cart_notification.xml | 23 ++------- .../warning_notification.js | 10 ++++ .../warning_notification.xml | 11 +++++ .../static/src/js/website_sale.js | 2 +- .../static/src/js/website_sale_utils.js | 11 ++++- .../static/src/js/website_sale_wishlist.js | 1 - 11 files changed, 118 insertions(+), 46 deletions(-) create mode 100644 addons/website_sale/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.js create mode 100644 addons/website_sale/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.xml create mode 100644 addons/website_sale/static/src/js/notification/warning_notification/warning_notification.js create mode 100644 addons/website_sale/static/src/js/notification/warning_notification/warning_notification.xml diff --git a/addons/website_sale/__manifest__.py b/addons/website_sale/__manifest__.py index 832e4f0f188..b641ad81034 100644 --- a/addons/website_sale/__manifest__.py +++ b/addons/website_sale/__manifest__.py @@ -81,8 +81,12 @@ 'website_sale/static/src/js/website_sale_reorder.js', 'website_sale/static/src/js/website_sale_delivery.js', 'website_sale/static/src/scss/product_configurator.scss', + 'website_sale/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.js', + 'website_sale/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.xml', 'website_sale/static/src/js/notification/cart_notification/cart_notification.js', 'website_sale/static/src/js/notification/cart_notification/cart_notification.xml', + 'website_sale/static/src/js/notification/warning_notification/warning_notification.js', + 'website_sale/static/src/js/notification/warning_notification/warning_notification.xml', 'website_sale/static/src/js/notification/notification_service.js', ], 'web._assets_primary_variables': [ diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index 732e28bce04..0588de0a9da 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -870,6 +870,7 @@ class WebsiteSale(payment_portal.PaymentPortal): ) values['notification_info'] = self._get_cart_notification_information(order, [values['line_id']]) + values['notification_info']['warning'] = values.pop('warning', '') request.session['website_sale_cart_quantity'] = order.cart_quantity if not order.cart_quantity: diff --git a/addons/website_sale/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.js b/addons/website_sale/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.js new file mode 100644 index 00000000000..df7cc3c22eb --- /dev/null +++ b/addons/website_sale/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.js @@ -0,0 +1,48 @@ +/** @odoo-module **/ + +import { Component } from "@odoo/owl"; +import { formatCurrency } from "@web/core/currency"; + +export class AddToCartNotification extends Component { + static template = "website_sale.addToCartNotification"; + static props = { + lines: { + type: Array, + element: { + type: Object, + shape: { + id: Number, + image_url: String, + quantity: Number, + name: String, + description: { type: String, optional: true }, + line_price_total: Number, + }, + }, + }, + currency_id: Number, + } + + /** + * Return the price, in the format of the sale order currency. + * + * @param {Object} line - The line element for which to return the formatted price. + * @return {String} - The price, in the format of the sale order currency. + */ + getFormattedPrice(line) { + return formatCurrency(line.line_price_total, this.props.currency_id); + } + + /** + * Return the product summary based on the line information. + * + * The product summary is computed based on the line quantity and name, separated by the symbol + * 'x' (e.g.: 1 x Chair Floor Protection). + * + * @param {Object} line - The line element for which to return the product summary. + * @return {String} - The product summary. + */ + getProductSummary(line) { + return line.quantity + " x " + line.name; + } +} diff --git a/addons/website_sale/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.xml b/addons/website_sale/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.xml new file mode 100644 index 00000000000..e0ed8ee832c --- /dev/null +++ b/addons/website_sale/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.xml @@ -0,0 +1,25 @@ + + + + +
+
+ +
+
+ + +
+
+
+ + View cart + + + + diff --git a/addons/website_sale/static/src/js/notification/cart_notification/cart_notification.js b/addons/website_sale/static/src/js/notification/cart_notification/cart_notification.js index 06a0ff729a0..fb38c545a6a 100644 --- a/addons/website_sale/static/src/js/notification/cart_notification/cart_notification.js +++ b/addons/website_sale/static/src/js/notification/cart_notification/cart_notification.js @@ -1,12 +1,15 @@ /** @odoo-module **/ import { Component } from "@odoo/owl"; -import { formatCurrency } from "@web/core/currency"; +import { AddToCartNotification } from "../add_to_cart_notification/add_to_cart_notification"; +import { WarningNotification } from "../warning_notification/warning_notification"; export class CartNotification extends Component { + static components = { AddToCartNotification, WarningNotification }; static template = "website_sale.cartNotification"; static props = { message: [String, { toString: Function }], + warning: [String, { toString: Function }], lines: { type: Array, element: { @@ -34,27 +37,4 @@ export class CartNotification extends Component { get positionOffset() { return (document.querySelector('header.o_top_fixed_element')?.offsetHeight || 0) + 'px'; } - - /** - * Return the price, in the format of the sale order currency. - * - * @param {Object} line - The line element for which to return the formatted price. - * @return {String} - The price, in the format of the sale order currency. - */ - getFormattedPrice(line) { - return formatCurrency(line.line_price_total, this.props.currency_id); - } - - /** - * Return the product summary based on the line information. - * - * The product summary is computed based on the line quantity and name, separated by the symbol - * 'x' (e.g.: 1 x Chair Floor Protection). - * - * @param {Object} line - The line element for which to return the product summary. - * @return {String} - The product summary. - */ - getProductSummary(line) { - return line.quantity + " x " + line.name; - } } diff --git a/addons/website_sale/static/src/js/notification/cart_notification/cart_notification.xml b/addons/website_sale/static/src/js/notification/cart_notification/cart_notification.xml index f4820a66832..a5e9a5b5b8e 100644 --- a/addons/website_sale/static/src/js/notification/cart_notification/cart_notification.xml +++ b/addons/website_sale/static/src/js/notification/cart_notification/cart_notification.xml @@ -15,24 +15,11 @@ aria-label="Close"/>
-
-
- -
-
- - -
-
-
- - View cart - + +
diff --git a/addons/website_sale/static/src/js/notification/warning_notification/warning_notification.js b/addons/website_sale/static/src/js/notification/warning_notification/warning_notification.js new file mode 100644 index 00000000000..4944c14824b --- /dev/null +++ b/addons/website_sale/static/src/js/notification/warning_notification/warning_notification.js @@ -0,0 +1,10 @@ +/** @odoo-module **/ + +import { Component } from "@odoo/owl"; + +export class WarningNotification extends Component { + static template = "website_sale.warningNotification"; + static props = { + warning: [String, { toString: Function }], + } +} diff --git a/addons/website_sale/static/src/js/notification/warning_notification/warning_notification.xml b/addons/website_sale/static/src/js/notification/warning_notification/warning_notification.xml new file mode 100644 index 00000000000..22f3c5f7bd8 --- /dev/null +++ b/addons/website_sale/static/src/js/notification/warning_notification/warning_notification.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/addons/website_sale/static/src/js/website_sale.js b/addons/website_sale/static/src/js/website_sale.js index eda04372405..ccaa416ed04 100644 --- a/addons/website_sale/static/src/js/website_sale.js +++ b/addons/website_sale/static/src/js/website_sale.js @@ -225,7 +225,7 @@ export const WebsiteSale = publicWidget.Widget.extend(VariantMixin, cartHandlerM $('.js_quantity[data-line-id='+line_id+']').val(data.quantity).text(data.quantity); wSaleUtils.updateCartNavBar(data); - wSaleUtils.showWarning(data.warning); + wSaleUtils.showWarning(data.notification_info.warning); // Propagating the change to the express checkout forms Component.env.bus.trigger('cart_amount_changed', [data.amount, data.minor_amount]); }); diff --git a/addons/website_sale/static/src/js/website_sale_utils.js b/addons/website_sale/static/src/js/website_sale_utils.js index aa50679a18d..abd810f6fdf 100644 --- a/addons/website_sale/static/src/js/website_sale_utils.js +++ b/addons/website_sale/static/src/js/website_sale_utils.js @@ -35,8 +35,8 @@ export const cartHandlerMixin = { }); if (data.cart_quantity && (data.cart_quantity !== parseInt($(".my_cart_quantity").text()))) { updateCartNavBar(data); - showCartNotification(this.call.bind(this), data.notification_info); }; + showCartNotification(this.call.bind(this), data.notification_info); return data; }, }; @@ -119,7 +119,14 @@ function showCartNotification(callService, props, options = {}) { // Show the notification about the cart if (props.lines) { callService("cartNotificationService", "add", "Item(s) added to your cart", { - ...props, + lines: props.lines, + currency_id: props.currency_id, + ...options, + }); + } + if (props.warning) { + callService("cartNotificationService", "add", "Warning", { + warning: props.warning, ...options, }); } diff --git a/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js b/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js index f0a798f10dc..d51c804509d 100644 --- a/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js +++ b/addons/website_sale_wishlist/static/src/js/website_sale_wishlist.js @@ -198,7 +198,6 @@ publicWidget.registry.ProductWishlist = publicWidget.Widget.extend(VariantMixin, }).then(function (data) { wSaleUtils.updateCartNavBar(data); wSaleUtils.showCartNotification(callService, data.notification_info); - wSaleUtils.showWarning(data.warning); }); }, /**