From d003abfab647d7f2249597a2308857436ef5ac04 Mon Sep 17 00:00:00 2001 From: hapt-odoo Date: Wed, 2 Jul 2025 18:26:27 +0530 Subject: [PATCH 1/2] [ADD] odoo_self_order_details: In pos add dialog for self-ordering products In odoo_self_order_details, added a pop-up while adding a product in the card which shows the product image, product name for the products, which are available for self-ordering. --- odoo_self_order_details/__manifest__.py | 14 +++++++ .../static/src/product_card/product_card.js | 38 +++++++++++++++++++ .../product_pop_details.js | 18 +++++++++ .../product_pop_details.xml | 23 +++++++++++ 4 files changed, 93 insertions(+) create mode 100644 odoo_self_order_details/__manifest__.py create mode 100644 odoo_self_order_details/static/src/product_card/product_card.js create mode 100644 odoo_self_order_details/static/src/product_pop_details/product_pop_details.js create mode 100644 odoo_self_order_details/static/src/product_pop_details/product_pop_details.xml diff --git a/odoo_self_order_details/__manifest__.py b/odoo_self_order_details/__manifest__.py new file mode 100644 index 00000000000..7241f517ad2 --- /dev/null +++ b/odoo_self_order_details/__manifest__.py @@ -0,0 +1,14 @@ +{ + 'name': "Sale Order POS", + 'category': 'pos_restaurant', + 'version': '0.1', + 'depends': ['pos_restaurant', 'pos_self_order'], + 'sequence': 1, + 'application': True, + 'installable': True, + "assets": { + "pos_self_order.assets": + ["odoo_self_order_details/static/src/**/*"], + }, + 'license': 'AGPL-3' +} diff --git a/odoo_self_order_details/static/src/product_card/product_card.js b/odoo_self_order_details/static/src/product_card/product_card.js new file mode 100644 index 00000000000..27ece04ec04 --- /dev/null +++ b/odoo_self_order_details/static/src/product_card/product_card.js @@ -0,0 +1,38 @@ +import { patch } from "@web/core/utils/patch"; +import { ProductCard } from '@pos_self_order/app/components/product_card/product_card'; +import { ProductPopDetails } from '../product_pop_details/product_pop_details'; + +patch(ProductCard.prototype,{ + async selectProduct(qty = 1) { + const product = this.props.product; + + if (!product.self_order_available || !this.isAvailable) { + return; + } + + if (product.isCombo()) { + this.router.navigate("combo_selection", { id: product.id }); + } else if (product.isConfigurable()) { + this.router.navigate("product", { id: product.id }); + } else { + this.dialog.add(ProductPopDetails, { + product: product, + addToCart: (qty) => { + this.flyToCart(); + this.scaleUpPrice(); + + const isProductInCart = this.selfOrder.currentOrder.lines.find( + (line) => line.product_id === product.id + ); + + if (isProductInCart) { + isProductInCart.qty += qty; + } else { + this.selfOrder.addToCart(product, qty); + } + }, + close: () => this.dialog.close(), + }); + } + } +}); diff --git a/odoo_self_order_details/static/src/product_pop_details/product_pop_details.js b/odoo_self_order_details/static/src/product_pop_details/product_pop_details.js new file mode 100644 index 00000000000..c5f1085a074 --- /dev/null +++ b/odoo_self_order_details/static/src/product_pop_details/product_pop_details.js @@ -0,0 +1,18 @@ +import { Component,useState,useExternalListener } from "@odoo/owl"; + +export class ProductPopDetails extends Component { + static template = "odoo_self_order_details.ProductPopDetails"; + static props = ["product", "addToCart", "close"]; + + setup() { + useExternalListener(window, "click", this.props.close); + this.state = useState({ + qty: 1, + }); + } + + addToCartAndClose() { + this.props.addToCart(this.state.qty); + this.props.close(); + } +} diff --git a/odoo_self_order_details/static/src/product_pop_details/product_pop_details.xml b/odoo_self_order_details/static/src/product_pop_details/product_pop_details.xml new file mode 100644 index 00000000000..d799d6d3db7 --- /dev/null +++ b/odoo_self_order_details/static/src/product_pop_details/product_pop_details.xml @@ -0,0 +1,23 @@ + + + + + + From 59eb811b6889563559bf842d21570b7e2c325d55 Mon Sep 17 00:00:00 2001 From: hapt-odoo Date: Thu, 3 Jul 2025 15:43:19 +0530 Subject: [PATCH 2/2] [IMP] odoo_self_order_details: In product pop-up added self-description In a self-ordering product, a pop-up added description below the product display-name. --- odoo_self_order_details/__init__.py | 1 + odoo_self_order_details/__manifest__.py | 3 +++ odoo_self_order_details/models/__init__.py | 2 ++ odoo_self_order_details/models/product.py | 10 ++++++++++ .../models/product_template.py | 7 +++++++ .../static/src/product_card/product_card.js | 1 - .../product_pop_details/product_pop_details.js | 3 ++- .../product_pop_details/product_pop_details.xml | 4 ++++ odoo_self_order_details/views/product_views.xml | 15 +++++++++++++++ 9 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 odoo_self_order_details/__init__.py create mode 100644 odoo_self_order_details/models/__init__.py create mode 100644 odoo_self_order_details/models/product.py create mode 100644 odoo_self_order_details/models/product_template.py create mode 100644 odoo_self_order_details/views/product_views.xml diff --git a/odoo_self_order_details/__init__.py b/odoo_self_order_details/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/odoo_self_order_details/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/odoo_self_order_details/__manifest__.py b/odoo_self_order_details/__manifest__.py index 7241f517ad2..029dc21dc7e 100644 --- a/odoo_self_order_details/__manifest__.py +++ b/odoo_self_order_details/__manifest__.py @@ -6,6 +6,9 @@ 'sequence': 1, 'application': True, 'installable': True, + 'data': [ + "views/product_views.xml", + ], "assets": { "pos_self_order.assets": ["odoo_self_order_details/static/src/**/*"], diff --git a/odoo_self_order_details/models/__init__.py b/odoo_self_order_details/models/__init__.py new file mode 100644 index 00000000000..b194f4906c9 --- /dev/null +++ b/odoo_self_order_details/models/__init__.py @@ -0,0 +1,2 @@ +from . import product_template +from . import product diff --git a/odoo_self_order_details/models/product.py b/odoo_self_order_details/models/product.py new file mode 100644 index 00000000000..7d22ba14475 --- /dev/null +++ b/odoo_self_order_details/models/product.py @@ -0,0 +1,10 @@ +from odoo import models + + +class ProductProduct(models.Model): + _inherit = "product.product" + + def _load_pos_data_fields(self, config_id): + params = super()._load_pos_data_fields(config_id) + params.append('self_order_description') + return params diff --git a/odoo_self_order_details/models/product_template.py b/odoo_self_order_details/models/product_template.py new file mode 100644 index 00000000000..bb3b99e86d4 --- /dev/null +++ b/odoo_self_order_details/models/product_template.py @@ -0,0 +1,7 @@ +from odoo import fields, models + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + self_order_description = fields.Html(string='Self Product Description') diff --git a/odoo_self_order_details/static/src/product_card/product_card.js b/odoo_self_order_details/static/src/product_card/product_card.js index 27ece04ec04..cecc7b0f332 100644 --- a/odoo_self_order_details/static/src/product_card/product_card.js +++ b/odoo_self_order_details/static/src/product_card/product_card.js @@ -5,7 +5,6 @@ import { ProductPopDetails } from '../product_pop_details/product_pop_details'; patch(ProductCard.prototype,{ async selectProduct(qty = 1) { const product = this.props.product; - if (!product.self_order_available || !this.isAvailable) { return; } diff --git a/odoo_self_order_details/static/src/product_pop_details/product_pop_details.js b/odoo_self_order_details/static/src/product_pop_details/product_pop_details.js index c5f1085a074..c5d66ad4266 100644 --- a/odoo_self_order_details/static/src/product_pop_details/product_pop_details.js +++ b/odoo_self_order_details/static/src/product_pop_details/product_pop_details.js @@ -1,10 +1,11 @@ -import { Component,useState,useExternalListener } from "@odoo/owl"; +import { Component,useState,useExternalListener,markup } from "@odoo/owl"; export class ProductPopDetails extends Component { static template = "odoo_self_order_details.ProductPopDetails"; static props = ["product", "addToCart", "close"]; setup() { + this.self_order_description = markup(this.props.product.self_order_description || ''); useExternalListener(window, "click", this.props.close); this.state = useState({ qty: 1, diff --git a/odoo_self_order_details/static/src/product_pop_details/product_pop_details.xml b/odoo_self_order_details/static/src/product_pop_details/product_pop_details.xml index d799d6d3db7..58eeff9ce46 100644 --- a/odoo_self_order_details/static/src/product_pop_details/product_pop_details.xml +++ b/odoo_self_order_details/static/src/product_pop_details/product_pop_details.xml @@ -4,6 +4,9 @@