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); }); }, /**