From f490829f63b08c3a617f52b28924d7f9b2cc6000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abraham=20Jes=C3=BAs?= Date: Sun, 31 Aug 2025 17:40:22 -0400 Subject: [PATCH 01/23] [IMP] Adds a font size selector (pt) to the Document Layout wizard --- web_font_size_report_layout/README.rst | 114 ++++ web_font_size_report_layout/__init__.py | 1 + web_font_size_report_layout/__manifest__.py | 22 + .../models/__init__.py | 2 + .../models/base_document_layout.py | 19 + .../models/res_company.py | 47 ++ web_font_size_report_layout/pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 3 + .../readme/DESCRIPTION.md | 10 + web_font_size_report_layout/readme/INSTALL.md | 3 + web_font_size_report_layout/readme/USAGE.md | 7 + .../static/description/index.html | 485 ++++++++++++++++++ .../static/src/scss/report_font_size.scss | 15 + .../views/base_document_layout_views.xml | 14 + .../views/report_templates_inherit.xml | 113 ++++ 15 files changed, 858 insertions(+) create mode 100644 web_font_size_report_layout/README.rst create mode 100644 web_font_size_report_layout/__init__.py create mode 100644 web_font_size_report_layout/__manifest__.py create mode 100644 web_font_size_report_layout/models/__init__.py create mode 100644 web_font_size_report_layout/models/base_document_layout.py create mode 100644 web_font_size_report_layout/models/res_company.py create mode 100644 web_font_size_report_layout/pyproject.toml create mode 100644 web_font_size_report_layout/readme/CONTRIBUTORS.md create mode 100644 web_font_size_report_layout/readme/DESCRIPTION.md create mode 100644 web_font_size_report_layout/readme/INSTALL.md create mode 100644 web_font_size_report_layout/readme/USAGE.md create mode 100644 web_font_size_report_layout/static/description/index.html create mode 100644 web_font_size_report_layout/static/src/scss/report_font_size.scss create mode 100644 web_font_size_report_layout/views/base_document_layout_views.xml create mode 100644 web_font_size_report_layout/views/report_templates_inherit.xml diff --git a/web_font_size_report_layout/README.rst b/web_font_size_report_layout/README.rst new file mode 100644 index 000000000000..b4e3d03151af --- /dev/null +++ b/web_font_size_report_layout/README.rst @@ -0,0 +1,114 @@ +=================================== +Report Font Size in Document Layout +=================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:ee6f96a1077aace09df8bdf60b5d93ee172924b3bf73a462880b7c52adf87ab2 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/17.0/web_font_size_report_layout + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-17-0/web-17-0-web_font_size_report_layout + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This Odoo module adds the capability to customize font size in all PDF +reports throughout the system. Through a simple configuration, +administrators can select from a range of predefined font sizes +(measured in points) to optimize readability and appearance of invoices, +quotations, sales orders, and other printed documents. + +The module offers the following font size options (in points): + +=========== ==== ========================= +Option Size Description +=========== ==== ========================= +Small 8pt For maximum compactness +Standard 10pt Odoo's default size +Large 12pt Better readability +Extra Large 14pt For high visibility needs +=========== ==== ========================= + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +1. Copy the ``web_font_size_report_layout`` directory to your Odoo + addons folder +2. Update the module list from developer mode +3. Search for "Report Font Size in Document Layout" in the app store and + install it. + +Usage +===== + +Once installed: + +1. Go to **Settings → General Settings → Companies → Configure Document + Layout** +2. Locate the new **"Font Size"** field +3. Select your preferred size from the dropdown list +4. Look at Preview or Download PDF Preview +5. Save changes + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Binhex + +Contributors +------------ + +- `Binhex `__: +- Mario Montes +- Abraham J. Febres + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_font_size_report_layout/__init__.py b/web_font_size_report_layout/__init__.py new file mode 100644 index 000000000000..0650744f6bc6 --- /dev/null +++ b/web_font_size_report_layout/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/web_font_size_report_layout/__manifest__.py b/web_font_size_report_layout/__manifest__.py new file mode 100644 index 000000000000..eee27b52729c --- /dev/null +++ b/web_font_size_report_layout/__manifest__.py @@ -0,0 +1,22 @@ +{ + "name": "Report Font Size in Document Layout", + "version": "17.0.1.1.0", + "summary": "Adds a font size selector (pt) to the Document Layout wizard", + "author": "Binhex," "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "license": "LGPL-3", + "depends": ["web"], + "data": [ + "views/base_document_layout_views.xml", + "views/report_templates_inherit.xml", + ], + "assets": { + "web.report_assets_common": [ + "web_font_size_report_layout/static/src/scss/report_font_size.scss" + ], + "web.report_assets_pdf": [ + "web_font_size_report_layout/static/src/scss/report_font_size.scss" + ], + }, + "installable": True, +} diff --git a/web_font_size_report_layout/models/__init__.py b/web_font_size_report_layout/models/__init__.py new file mode 100644 index 000000000000..290c7e13846b --- /dev/null +++ b/web_font_size_report_layout/models/__init__.py @@ -0,0 +1,2 @@ +from . import res_company +from . import base_document_layout diff --git a/web_font_size_report_layout/models/base_document_layout.py b/web_font_size_report_layout/models/base_document_layout.py new file mode 100644 index 000000000000..cfc7540d0014 --- /dev/null +++ b/web_font_size_report_layout/models/base_document_layout.py @@ -0,0 +1,19 @@ +from odoo import api, fields, models + + +class BaseDocumentLayout(models.TransientModel): + _inherit = "base.document.layout" + + report_font_size = fields.Selection( + related="company_id.report_font_size", + readonly=False, + string="Font size", + ) + + @api.onchange("report_font_size") + def _onchange_report_font_size(self): + if hasattr(self, "_compute_preview"): + try: + self._compute_preview() + except Exception: + self.preview = False diff --git a/web_font_size_report_layout/models/res_company.py b/web_font_size_report_layout/models/res_company.py new file mode 100644 index 000000000000..eb0a6b47569d --- /dev/null +++ b/web_font_size_report_layout/models/res_company.py @@ -0,0 +1,47 @@ +from odoo import api, fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + report_font_size = fields.Selection( + selection=[ + ("9", "9 pt"), + ("10", "10 pt"), + ("11", "11 pt"), + ("12", "12 pt"), + ("13", "13 pt"), + ("14", "14 pt"), + ], + string="Report font size", + default="11", + help="Base font size for PDF content (in points), applied on the external " + "report layout.", + ) + + @api.model_create_multi + def create(self, vals_list): + companies = super().create(vals_list) + style_fields = { + "external_report_layout_id", + "font", + "report_font_size", + "primary_color", + "secondary_color", + } + if any(not style_fields.isdisjoint(values) for values in vals_list): + self._update_asset_style() + return companies + + def write(self, values): + res = super().write(values) + style_fields = { + "external_report_layout_id", + "font", + "report_font_size", + "primary_color", + "secondary_color", + } + if not style_fields.isdisjoint(values): + self._update_asset_style() + return res diff --git a/web_font_size_report_layout/pyproject.toml b/web_font_size_report_layout/pyproject.toml new file mode 100644 index 000000000000..4231d0cccb3d --- /dev/null +++ b/web_font_size_report_layout/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/web_font_size_report_layout/readme/CONTRIBUTORS.md b/web_font_size_report_layout/readme/CONTRIBUTORS.md new file mode 100644 index 000000000000..f796d63ad965 --- /dev/null +++ b/web_font_size_report_layout/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Binhex](https://www.binhex.cloud): +- Mario Montes\<\> +- Abraham J. Febres \<\> diff --git a/web_font_size_report_layout/readme/DESCRIPTION.md b/web_font_size_report_layout/readme/DESCRIPTION.md new file mode 100644 index 000000000000..409938fb51d0 --- /dev/null +++ b/web_font_size_report_layout/readme/DESCRIPTION.md @@ -0,0 +1,10 @@ +This Odoo module adds the capability to customize font size in all PDF reports throughout the system. Through a simple configuration, administrators can select from a range of predefined font sizes (measured in points) to optimize readability and appearance of invoices, quotations, sales orders, and other printed documents. + +The module offers the following font size options (in points): + +| Option | Size | Description | +|--------|------|-------------| +| Small | 8pt | For maximum compactness | +| Standard | 10pt | Odoo's default size | +| Large | 12pt | Better readability | +| Extra Large | 14pt | For high visibility needs | diff --git a/web_font_size_report_layout/readme/INSTALL.md b/web_font_size_report_layout/readme/INSTALL.md new file mode 100644 index 000000000000..91069158fc0e --- /dev/null +++ b/web_font_size_report_layout/readme/INSTALL.md @@ -0,0 +1,3 @@ +1. Copy the `web_font_size_report_layout` directory to your Odoo addons folder +2. Update the module list from developer mode +3. Search for "Report Font Size in Document Layout" in the app store and install it. diff --git a/web_font_size_report_layout/readme/USAGE.md b/web_font_size_report_layout/readme/USAGE.md new file mode 100644 index 000000000000..cf1e758aaa01 --- /dev/null +++ b/web_font_size_report_layout/readme/USAGE.md @@ -0,0 +1,7 @@ +Once installed: + +1. Go to **Settings → General Settings → Companies → Configure Document Layout** +2. Locate the new **"Font Size"** field +3. Select your preferred size from the dropdown list +5. Look at Preview or Download PDF Preview +4. Save changes diff --git a/web_font_size_report_layout/static/description/index.html b/web_font_size_report_layout/static/description/index.html new file mode 100644 index 000000000000..c8540bfca7e6 --- /dev/null +++ b/web_font_size_report_layout/static/description/index.html @@ -0,0 +1,485 @@ + + + + + +Report Font Size in Document Layout + + + +
+

Report Font Size in Document Layout

+ + +

Beta License: LGPL-3 OCA/web Translate me on Weblate Try me on Runboat

+

This Odoo module adds the capability to customize font size in all PDF +reports throughout the system. Through a simple configuration, +administrators can select from a range of predefined font sizes +(measured in points) to optimize readability and appearance of invoices, +quotations, sales orders, and other printed documents.

+

The module offers the following font size options (in points):

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
OptionSizeDescription
Small8ptFor maximum compactness
Standard10ptOdoo’s default size
Large12ptBetter readability
Extra Large14ptFor high visibility needs
+

Table of contents

+ +
+

Installation

+
    +
  1. Copy the web_font_size_report_layout directory to your Odoo +addons folder
  2. +
  3. Update the module list from developer mode
  4. +
  5. Search for “Report Font Size in Document Layout” in the app store and +install it.
  6. +
+
+
+

Usage

+

Once installed:

+
    +
  1. Go to Settings → General Settings → Companies → Configure Document +Layout
  2. +
  3. Locate the new “Font Size” field
  4. +
  5. Select your preferred size from the dropdown list
  6. +
  7. Look at Preview or Download PDF Preview
  8. +
  9. Save changes
  10. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Binhex
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/web project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/web_font_size_report_layout/static/src/scss/report_font_size.scss b/web_font_size_report_layout/static/src/scss/report_font_size.scss new file mode 100644 index 000000000000..3aa60f231e11 --- /dev/null +++ b/web_font_size_report_layout/static/src/scss/report_font_size.scss @@ -0,0 +1,15 @@ +/* Valor por defecto en pt */ +:root { + --report-font-size: 11pt; +} + +/* Aplica al wrapper típico y a .page (usado por algunos informes) */ +.o_report_layout, +.page { + font-size: var(--report-font-size) !important; +} + +.o_report_layout *, +.page * { + font-size: inherit !important; +} diff --git a/web_font_size_report_layout/views/base_document_layout_views.xml b/web_font_size_report_layout/views/base_document_layout_views.xml new file mode 100644 index 000000000000..9d1ebae03fb8 --- /dev/null +++ b/web_font_size_report_layout/views/base_document_layout_views.xml @@ -0,0 +1,14 @@ + + + + base.document.layout.font.size + base.document.layout + + 50 + + + + + + + diff --git a/web_font_size_report_layout/views/report_templates_inherit.xml b/web_font_size_report_layout/views/report_templates_inherit.xml new file mode 100644 index 000000000000..67e834f2008e --- /dev/null +++ b/web_font_size_report_layout/views/report_templates_inherit.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + From d369d30d335ab06f1e17fd00154702bce1ef55ba Mon Sep 17 00:00:00 2001 From: Mario Montes Date: Wed, 3 Sep 2025 09:28:12 +0100 Subject: [PATCH 02/23] Update README.rst --- web_font_size_report_layout/README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web_font_size_report_layout/README.rst b/web_font_size_report_layout/README.rst index b4e3d03151af..63aec6e848e4 100644 --- a/web_font_size_report_layout/README.rst +++ b/web_font_size_report_layout/README.rst @@ -93,8 +93,8 @@ Contributors ------------ - `Binhex `__: -- Mario Montes -- Abraham J. Febres +- Mario Montes +- Abraham J. Febres Maintainers ----------- From 6410b4cc8688f533de1274bf12decdd4300f629d Mon Sep 17 00:00:00 2001 From: Mario Montes Date: Wed, 3 Sep 2025 09:29:31 +0100 Subject: [PATCH 03/23] Update README.rst --- web_font_size_report_layout/README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web_font_size_report_layout/README.rst b/web_font_size_report_layout/README.rst index b4e3d03151af..63aec6e848e4 100644 --- a/web_font_size_report_layout/README.rst +++ b/web_font_size_report_layout/README.rst @@ -93,8 +93,8 @@ Contributors ------------ - `Binhex `__: -- Mario Montes -- Abraham J. Febres +- Mario Montes +- Abraham J. Febres Maintainers ----------- From fd39cabd58038138d271bd8cdaba68b10bf1dd92 Mon Sep 17 00:00:00 2001 From: Mario Montes Date: Wed, 3 Sep 2025 10:35:59 +0100 Subject: [PATCH 04/23] [FIX] web_font_size_report_layout: readme --- web_font_size_report_layout/README.rst | 6 +-- .../readme/DESCRIPTION.md | 2 +- .../static/description/index.html | 2 +- web_font_size_report_layout/tests/__init__.py | 2 + .../tests/test_company_font_size.py | 41 +++++++++++++++ .../tests/test_document_layout_onchange.py | 52 +++++++++++++++++++ 6 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 web_font_size_report_layout/tests/__init__.py create mode 100644 web_font_size_report_layout/tests/test_company_font_size.py create mode 100644 web_font_size_report_layout/tests/test_document_layout_onchange.py diff --git a/web_font_size_report_layout/README.rst b/web_font_size_report_layout/README.rst index 63aec6e848e4..b3d69397eb27 100644 --- a/web_font_size_report_layout/README.rst +++ b/web_font_size_report_layout/README.rst @@ -39,7 +39,7 @@ The module offers the following font size options (in points): =========== ==== ========================= Option Size Description =========== ==== ========================= -Small 8pt For maximum compactness +Small 9pt For maximum compactness Standard 10pt Odoo's default size Large 12pt Better readability Extra Large 14pt For high visibility needs @@ -93,8 +93,8 @@ Contributors ------------ - `Binhex `__: -- Mario Montes -- Abraham J. Febres +- Mario Montes +- Abraham J. Febres Maintainers ----------- diff --git a/web_font_size_report_layout/readme/DESCRIPTION.md b/web_font_size_report_layout/readme/DESCRIPTION.md index 409938fb51d0..f6edbaf0a458 100644 --- a/web_font_size_report_layout/readme/DESCRIPTION.md +++ b/web_font_size_report_layout/readme/DESCRIPTION.md @@ -4,7 +4,7 @@ The module offers the following font size options (in points): | Option | Size | Description | |--------|------|-------------| -| Small | 8pt | For maximum compactness | +| Small | 9pt | For maximum compactness | | Standard | 10pt | Odoo's default size | | Large | 12pt | Better readability | | Extra Large | 14pt | For high visibility needs | diff --git a/web_font_size_report_layout/static/description/index.html b/web_font_size_report_layout/static/description/index.html index c8540bfca7e6..63e018ae358d 100644 --- a/web_font_size_report_layout/static/description/index.html +++ b/web_font_size_report_layout/static/description/index.html @@ -390,7 +390,7 @@

Report Font Size in Document Layout

Small -8pt +9pt For maximum compactness Standard diff --git a/web_font_size_report_layout/tests/__init__.py b/web_font_size_report_layout/tests/__init__.py new file mode 100644 index 000000000000..18a2b6ed09f7 --- /dev/null +++ b/web_font_size_report_layout/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_company_font_size +from . import test_document_layout_onchange diff --git a/web_font_size_report_layout/tests/test_company_font_size.py b/web_font_size_report_layout/tests/test_company_font_size.py new file mode 100644 index 000000000000..d7412963da0e --- /dev/null +++ b/web_font_size_report_layout/tests/test_company_font_size.py @@ -0,0 +1,41 @@ +from odoo.tests.common import TransactionCase, tagged + + +@tagged("post_install", "-at_install") +class TestCompanyFontSize(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.Company = cls.env["res.company"] + + def test_default_and_selection_values(self): + co = self.Company.create({"name": "Co A"}) + # Default del módulo: "11" + self.assertEqual(co.report_font_size, "11") + # Selección válida + co.report_font_size = "9" + self.assertEqual(co.report_font_size, "9") + + def test_create_with_explicit_font_size_persists(self): + co = self.Company.create({"name": "Co B", "report_font_size": "12"}) + self.assertEqual(co.report_font_size, "12") + + def test_write_only_style_field_is_safe(self): + co = self.Company.create({"name": "Co C"}) + # Cambiar sólo el tamaño de fuente no debe romper ni requerir otros campos + co.write({"report_font_size": "14"}) + self.assertEqual(co.report_font_size, "14") + + def test_write_unrelated_fields_dont_affect_font_size(self): + co = self.Company.create({"name": "Co D"}) + old = co.report_font_size + co.write({"email": "x@example.com"}) + self.assertEqual(co.report_font_size, old) + + def test_multi_company_independence(self): + co1 = self.Company.create({"name": "Co E"}) + co2 = self.Company.create({"name": "Co F"}) + co1.write({"report_font_size": "9"}) + co2.write({"report_font_size": "14"}) + self.assertEqual(co1.report_font_size, "9") + self.assertEqual(co2.report_font_size, "14") diff --git a/web_font_size_report_layout/tests/test_document_layout_onchange.py b/web_font_size_report_layout/tests/test_document_layout_onchange.py new file mode 100644 index 000000000000..29130da11af6 --- /dev/null +++ b/web_font_size_report_layout/tests/test_document_layout_onchange.py @@ -0,0 +1,52 @@ +from odoo.tests.common import TransactionCase, tagged + + +@tagged("post_install", "-at_install") +class TestDocumentLayoutWizard(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.Company = cls.env["res.company"] + cls.company = cls.Company.create({"name": "WZ Co", "report_font_size": "11"}) + cls.Wizard = cls.env["base.document.layout"] + + def test_wizard_default_inherits_company_value(self): + wiz = cls = self.__class__ + wiz = cls.Wizard.with_company(cls.company.id).create( + {"company_id": cls.company.id} + ) + self.assertEqual(wiz.report_font_size, "11") + + def test_onchange_updates_wizard_field_without_crash(self): + wiz = cls = self.__class__ + wiz = cls.Wizard.with_company(cls.company.id).create( + {"company_id": cls.company.id} + ) + wiz.report_font_size = "14" + # Debe ejecutarse el onchange sin excepción + if hasattr(wiz, "_onchange_report_font_size"): + wiz._onchange_report_font_size() + self.assertEqual(wiz.report_font_size, "14") + + def test_apply_wizard_persists_on_company(self): + wiz = cls = self.__class__ + wiz = cls.Wizard.with_company(cls.company.id).create( + {"company_id": cls.company.id} + ) + wiz.report_font_size = "12" + + done = False + for meth in ( + "execute", + "action_confirm", + "action_apply", + "action_configure_document_layout", + ): + if hasattr(wiz, meth): + getattr(wiz, meth)() + done = True + break + if not done: + cls.company.write({"report_font_size": wiz.report_font_size}) + + self.assertEqual(cls.company.report_font_size, "12") From b6165a2dd028aa84371dba1b924eee7b45ca4b65 Mon Sep 17 00:00:00 2001 From: Mario Montes Date: Wed, 3 Sep 2025 10:53:48 +0100 Subject: [PATCH 05/23] [ADD] web_font_size_report_layout: tests --- web_font_size_report_layout/tests/test_company_font_size.py | 3 --- .../tests/test_document_layout_onchange.py | 1 - 2 files changed, 4 deletions(-) diff --git a/web_font_size_report_layout/tests/test_company_font_size.py b/web_font_size_report_layout/tests/test_company_font_size.py index d7412963da0e..a2b43dbfbb81 100644 --- a/web_font_size_report_layout/tests/test_company_font_size.py +++ b/web_font_size_report_layout/tests/test_company_font_size.py @@ -10,9 +10,7 @@ def setUpClass(cls): def test_default_and_selection_values(self): co = self.Company.create({"name": "Co A"}) - # Default del módulo: "11" self.assertEqual(co.report_font_size, "11") - # Selección válida co.report_font_size = "9" self.assertEqual(co.report_font_size, "9") @@ -22,7 +20,6 @@ def test_create_with_explicit_font_size_persists(self): def test_write_only_style_field_is_safe(self): co = self.Company.create({"name": "Co C"}) - # Cambiar sólo el tamaño de fuente no debe romper ni requerir otros campos co.write({"report_font_size": "14"}) self.assertEqual(co.report_font_size, "14") diff --git a/web_font_size_report_layout/tests/test_document_layout_onchange.py b/web_font_size_report_layout/tests/test_document_layout_onchange.py index 29130da11af6..caf8fb26bf67 100644 --- a/web_font_size_report_layout/tests/test_document_layout_onchange.py +++ b/web_font_size_report_layout/tests/test_document_layout_onchange.py @@ -23,7 +23,6 @@ def test_onchange_updates_wizard_field_without_crash(self): {"company_id": cls.company.id} ) wiz.report_font_size = "14" - # Debe ejecutarse el onchange sin excepción if hasattr(wiz, "_onchange_report_font_size"): wiz._onchange_report_font_size() self.assertEqual(wiz.report_font_size, "14") From 89da7fe9696b55544af36ed3f567f5df8caa0186 Mon Sep 17 00:00:00 2001 From: Mario Montes Date: Wed, 3 Sep 2025 11:07:28 +0100 Subject: [PATCH 06/23] [FIX] web_font_size_report_layout: tests --- .../tests/test_company_font_size.py | 9 +++ .../tests/test_document_layout_onchange.py | 73 +++++++++++++++---- 2 files changed, 68 insertions(+), 14 deletions(-) diff --git a/web_font_size_report_layout/tests/test_company_font_size.py b/web_font_size_report_layout/tests/test_company_font_size.py index a2b43dbfbb81..4c7df5ca5c48 100644 --- a/web_font_size_report_layout/tests/test_company_font_size.py +++ b/web_font_size_report_layout/tests/test_company_font_size.py @@ -36,3 +36,12 @@ def test_multi_company_independence(self): co2.write({"report_font_size": "14"}) self.assertEqual(co1.report_font_size, "9") self.assertEqual(co2.report_font_size, "14") + + def test_multiple_changes_persist_in_sequence(self): + co = self.Company.create({"name": "Co G"}) + co.write({"report_font_size": "14"}) + self.assertEqual(co.report_font_size, "14") + co.write({"report_font_size": "10"}) + self.assertEqual(co.report_font_size, "10") + co.write({"report_font_size": "12"}) + self.assertEqual(co.report_font_size, "12") diff --git a/web_font_size_report_layout/tests/test_document_layout_onchange.py b/web_font_size_report_layout/tests/test_document_layout_onchange.py index caf8fb26bf67..d5f674125b61 100644 --- a/web_font_size_report_layout/tests/test_document_layout_onchange.py +++ b/web_font_size_report_layout/tests/test_document_layout_onchange.py @@ -1,3 +1,5 @@ +from unittest.mock import patch + from odoo.tests.common import TransactionCase, tagged @@ -11,16 +13,14 @@ def setUpClass(cls): cls.Wizard = cls.env["base.document.layout"] def test_wizard_default_inherits_company_value(self): - wiz = cls = self.__class__ - wiz = cls.Wizard.with_company(cls.company.id).create( - {"company_id": cls.company.id} + wiz = self.Wizard.with_company(self.company.id).create( + {"company_id": self.company.id} ) self.assertEqual(wiz.report_font_size, "11") def test_onchange_updates_wizard_field_without_crash(self): - wiz = cls = self.__class__ - wiz = cls.Wizard.with_company(cls.company.id).create( - {"company_id": cls.company.id} + wiz = self.Wizard.with_company(self.company.id).create( + {"company_id": self.company.id} ) wiz.report_font_size = "14" if hasattr(wiz, "_onchange_report_font_size"): @@ -28,13 +28,11 @@ def test_onchange_updates_wizard_field_without_crash(self): self.assertEqual(wiz.report_font_size, "14") def test_apply_wizard_persists_on_company(self): - wiz = cls = self.__class__ - wiz = cls.Wizard.with_company(cls.company.id).create( - {"company_id": cls.company.id} + wiz = self.Wizard.with_company(self.company.id).create( + {"company_id": self.company.id} ) wiz.report_font_size = "12" - done = False for meth in ( "execute", "action_confirm", @@ -43,9 +41,56 @@ def test_apply_wizard_persists_on_company(self): ): if hasattr(wiz, meth): getattr(wiz, meth)() - done = True break - if not done: - cls.company.write({"report_font_size": wiz.report_font_size}) + else: + self.company.write({"report_font_size": wiz.report_font_size}) + + self.assertEqual(self.company.report_font_size, "12") + + def test_wizard_reflects_company_change_on_new_instance(self): + self.company.write({"report_font_size": "14"}) + wiz = self.Wizard.with_company(self.company.id).create( + {"company_id": self.company.id} + ) + self.assertEqual(wiz.report_font_size, "14") + + def test_onchange_handles_compute_exception_sets_preview_false(self): + wiz = self.Wizard.with_company(self.company.id).create( + {"company_id": self.company.id} + ) + if "preview" not in wiz._fields: + self.skipTest( + "This Odoo version has no 'preview' field on base.document.layout" + ) + + wiz.report_font_size = "14" + with patch.object( + type(wiz), "_compute_preview", side_effect=Exception("boom"), create=True + ): + wiz._onchange_report_font_size() + self.assertFalse(bool(wiz.preview)) + + def test_apply_uses_action_apply_when_present(self): + wiz = self.Wizard.with_company(self.company.id).create( + {"company_id": self.company.id} + ) + wiz.report_font_size = "13" + + def _fake_action_apply(self): + self.company_id.report_font_size = self.report_font_size + + with patch.object(type(wiz), "action_apply", _fake_action_apply, create=True): + done = False + for meth in ( + "execute", + "action_confirm", + "action_apply", + "action_configure_document_layout", + ): + if hasattr(wiz, meth): + getattr(wiz, meth)() + done = True + break - self.assertEqual(cls.company.report_font_size, "12") + self.assertTrue(done, "Expected loop to call injected action_apply") + self.assertEqual(self.company.report_font_size, "13") From 28f09798cee98a5975c2a1f8dff6407317a5ae1e Mon Sep 17 00:00:00 2001 From: Mario Montes Date: Wed, 3 Sep 2025 11:15:39 +0100 Subject: [PATCH 07/23] [FIX] web_font_size_report_layout: tests --- .../tests/test_document_layout_onchange.py | 60 +++++-------------- 1 file changed, 14 insertions(+), 46 deletions(-) diff --git a/web_font_size_report_layout/tests/test_document_layout_onchange.py b/web_font_size_report_layout/tests/test_document_layout_onchange.py index d5f674125b61..948a96f813ac 100644 --- a/web_font_size_report_layout/tests/test_document_layout_onchange.py +++ b/web_font_size_report_layout/tests/test_document_layout_onchange.py @@ -27,70 +27,38 @@ def test_onchange_updates_wizard_field_without_crash(self): wiz._onchange_report_font_size() self.assertEqual(wiz.report_font_size, "14") - def test_apply_wizard_persists_on_company(self): + def test_apply_wizard_persists_on_company_via_fallback(self): wiz = self.Wizard.with_company(self.company.id).create( {"company_id": self.company.id} ) wiz.report_font_size = "12" - - for meth in ( - "execute", - "action_confirm", - "action_apply", - "action_configure_document_layout", - ): - if hasattr(wiz, meth): - getattr(wiz, meth)() - break - else: - self.company.write({"report_font_size": wiz.report_font_size}) - + self.company.write({"report_font_size": wiz.report_font_size}) self.assertEqual(self.company.report_font_size, "12") - def test_wizard_reflects_company_change_on_new_instance(self): - self.company.write({"report_font_size": "14"}) + def test_apply_uses_action_apply_when_present(self): wiz = self.Wizard.with_company(self.company.id).create( {"company_id": self.company.id} ) - self.assertEqual(wiz.report_font_size, "14") + wiz.report_font_size = "13" + + def _fake_action_apply(self): + self.company_id.report_font_size = self.report_font_size + + with patch.object(type(wiz), "action_apply", _fake_action_apply, create=True): + wiz.action_apply() + + self.assertEqual(self.company.report_font_size, "13") def test_onchange_handles_compute_exception_sets_preview_false(self): wiz = self.Wizard.with_company(self.company.id).create( {"company_id": self.company.id} ) - if "preview" not in wiz._fields: - self.skipTest( - "This Odoo version has no 'preview' field on base.document.layout" - ) + self.assertIn("preview", wiz._fields) wiz.report_font_size = "14" with patch.object( type(wiz), "_compute_preview", side_effect=Exception("boom"), create=True ): wiz._onchange_report_font_size() - self.assertFalse(bool(wiz.preview)) - def test_apply_uses_action_apply_when_present(self): - wiz = self.Wizard.with_company(self.company.id).create( - {"company_id": self.company.id} - ) - wiz.report_font_size = "13" - - def _fake_action_apply(self): - self.company_id.report_font_size = self.report_font_size - - with patch.object(type(wiz), "action_apply", _fake_action_apply, create=True): - done = False - for meth in ( - "execute", - "action_confirm", - "action_apply", - "action_configure_document_layout", - ): - if hasattr(wiz, meth): - getattr(wiz, meth)() - done = True - break - - self.assertTrue(done, "Expected loop to call injected action_apply") - self.assertEqual(self.company.report_font_size, "13") + self.assertFalse(bool(wiz.preview)) From 68cf1b358e2b8a6e85c71414a725ef65031e088c Mon Sep 17 00:00:00 2001 From: Mario Montes Date: Wed, 3 Sep 2025 11:30:26 +0100 Subject: [PATCH 08/23] [FIX] web_font_size_report_layout: tests --- .../models/base_document_layout.py | 18 +++++-- .../tests/test_document_layout_onchange.py | 47 ++++++------------- 2 files changed, 28 insertions(+), 37 deletions(-) diff --git a/web_font_size_report_layout/models/base_document_layout.py b/web_font_size_report_layout/models/base_document_layout.py index cfc7540d0014..53dea78187bc 100644 --- a/web_font_size_report_layout/models/base_document_layout.py +++ b/web_font_size_report_layout/models/base_document_layout.py @@ -1,5 +1,10 @@ +# web_font_size_report_layout/models/base_document_layout.py +import logging + from odoo import api, fields, models +_logger = logging.getLogger(__name__) + class BaseDocumentLayout(models.TransientModel): _inherit = "base.document.layout" @@ -12,8 +17,11 @@ class BaseDocumentLayout(models.TransientModel): @api.onchange("report_font_size") def _onchange_report_font_size(self): - if hasattr(self, "_compute_preview"): - try: - self._compute_preview() - except Exception: - self.preview = False + func = getattr(self, "_compute_preview", None) + if not callable(func): + return + try: + func() + except Exception as exc: # pylint: disable=broad-except + _logger.debug("Failed computing document layout preview: %s", exc) + self.preview = False diff --git a/web_font_size_report_layout/tests/test_document_layout_onchange.py b/web_font_size_report_layout/tests/test_document_layout_onchange.py index 948a96f813ac..6869dde61aca 100644 --- a/web_font_size_report_layout/tests/test_document_layout_onchange.py +++ b/web_font_size_report_layout/tests/test_document_layout_onchange.py @@ -4,7 +4,7 @@ @tagged("post_install", "-at_install") -class TestDocumentLayoutWizard(TransactionCase): +class TestDocumentLayoutOnchange(TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() @@ -12,53 +12,36 @@ def setUpClass(cls): cls.company = cls.Company.create({"name": "WZ Co", "report_font_size": "11"}) cls.Wizard = cls.env["base.document.layout"] - def test_wizard_default_inherits_company_value(self): + def test_onchange_when_compute_preview_absent_does_nothing(self): wiz = self.Wizard.with_company(self.company.id).create( {"company_id": self.company.id} ) - self.assertEqual(wiz.report_font_size, "11") + prev = getattr(wiz, "preview", None) + wiz.report_font_size = "10" - def test_onchange_updates_wizard_field_without_crash(self): - wiz = self.Wizard.with_company(self.company.id).create( - {"company_id": self.company.id} - ) - wiz.report_font_size = "14" - if hasattr(wiz, "_onchange_report_font_size"): + with patch.object(type(wiz), "_compute_preview", new=None, create=True): wiz._onchange_report_font_size() - self.assertEqual(wiz.report_font_size, "14") - def test_apply_wizard_persists_on_company_via_fallback(self): - wiz = self.Wizard.with_company(self.company.id).create( - {"company_id": self.company.id} - ) - wiz.report_font_size = "12" - self.company.write({"report_font_size": wiz.report_font_size}) - self.assertEqual(self.company.report_font_size, "12") - - def test_apply_uses_action_apply_when_present(self): - wiz = self.Wizard.with_company(self.company.id).create( - {"company_id": self.company.id} - ) - wiz.report_font_size = "13" - - def _fake_action_apply(self): - self.company_id.report_font_size = self.report_font_size - - with patch.object(type(wiz), "action_apply", _fake_action_apply, create=True): - wiz.action_apply() - - self.assertEqual(self.company.report_font_size, "13") + self.assertEqual(getattr(wiz, "preview", None), prev) def test_onchange_handles_compute_exception_sets_preview_false(self): wiz = self.Wizard.with_company(self.company.id).create( {"company_id": self.company.id} ) self.assertIn("preview", wiz._fields) - wiz.report_font_size = "14" + with patch.object( type(wiz), "_compute_preview", side_effect=Exception("boom"), create=True ): wiz._onchange_report_font_size() self.assertFalse(bool(wiz.preview)) + + def test_onchange_updates_wizard_field_without_crash(self): + wiz = self.Wizard.with_company(self.company.id).create( + {"company_id": self.company.id} + ) + wiz.report_font_size = "14" + wiz._onchange_report_font_size() + self.assertEqual(wiz.report_font_size, "14") From df843d5ed51f3405468215d103cbb973dd9bfa34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Fri, 8 Nov 2024 14:12:10 +0100 Subject: [PATCH 09/23] [ADD] web_pwa_customize: New module TT51658 --- web_pwa_customize/README.rst | 100 ++++ web_pwa_customize/__init__.py | 2 + web_pwa_customize/__manifest__.py | 14 + web_pwa_customize/controllers/__init__.py | 1 + web_pwa_customize/controllers/webmanifest.py | 71 +++ web_pwa_customize/i18n/es.po | 83 ++++ web_pwa_customize/i18n/web_pwa_customize.pot | 83 ++++ web_pwa_customize/models/__init__.py | 1 + .../models/res_config_settings.py | 136 ++++++ web_pwa_customize/pyproject.toml | 3 + web_pwa_customize/readme/CONFIGURE.md | 2 + web_pwa_customize/readme/CONTEXT.md | 2 + web_pwa_customize/readme/CONTRIBUTORS.md | 3 + web_pwa_customize/readme/DESCRIPTION.md | 1 + web_pwa_customize/static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 442 ++++++++++++++++++ web_pwa_customize/tests/__init__.py | 4 + .../tests/test_web_pwa_customize.py | 26 ++ .../views/res_config_settings_views.xml | 38 ++ 19 files changed, 1012 insertions(+) create mode 100644 web_pwa_customize/README.rst create mode 100644 web_pwa_customize/__init__.py create mode 100644 web_pwa_customize/__manifest__.py create mode 100644 web_pwa_customize/controllers/__init__.py create mode 100644 web_pwa_customize/controllers/webmanifest.py create mode 100644 web_pwa_customize/i18n/es.po create mode 100644 web_pwa_customize/i18n/web_pwa_customize.pot create mode 100644 web_pwa_customize/models/__init__.py create mode 100644 web_pwa_customize/models/res_config_settings.py create mode 100644 web_pwa_customize/pyproject.toml create mode 100644 web_pwa_customize/readme/CONFIGURE.md create mode 100644 web_pwa_customize/readme/CONTEXT.md create mode 100644 web_pwa_customize/readme/CONTRIBUTORS.md create mode 100644 web_pwa_customize/readme/DESCRIPTION.md create mode 100644 web_pwa_customize/static/description/icon.png create mode 100644 web_pwa_customize/static/description/index.html create mode 100644 web_pwa_customize/tests/__init__.py create mode 100644 web_pwa_customize/tests/test_web_pwa_customize.py create mode 100644 web_pwa_customize/views/res_config_settings_views.xml diff --git a/web_pwa_customize/README.rst b/web_pwa_customize/README.rst new file mode 100644 index 000000000000..df67e32b79e9 --- /dev/null +++ b/web_pwa_customize/README.rst @@ -0,0 +1,100 @@ +================= +Web Pwa Customize +================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:4a63e846d259636f1c4cd9c622f602c5a66bf775ab189162f90c00b3e278c7af + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/17.0/web_pwa_customize + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-17-0/web-17-0-web_pwa_customize + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to configure data for Progressive Web App: Short +name, Background color, Theme color and Icon. + +**Table of contents** + +.. contents:: + :local: + +Use Cases / Context +=================== + +The existing definitions in the old web_pwa_oca of 16.0 (not existing or +customizable in core) are maintained. + +Configuration +============= + +#. Go to Settings > General Settings. #. In the 'Progressive Web App' +section you can configure all the data. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__: + + - Víctor Martínez + - Pedro M. Baeza + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-victoralmau| image:: https://github.com/victoralmau.png?size=40px + :target: https://github.com/victoralmau + :alt: victoralmau + +Current `maintainer `__: + +|maintainer-victoralmau| + +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_pwa_customize/__init__.py b/web_pwa_customize/__init__.py new file mode 100644 index 000000000000..91c5580fed36 --- /dev/null +++ b/web_pwa_customize/__init__.py @@ -0,0 +1,2 @@ +from . import controllers +from . import models diff --git a/web_pwa_customize/__manifest__.py b/web_pwa_customize/__manifest__.py new file mode 100644 index 000000000000..42248c120fc8 --- /dev/null +++ b/web_pwa_customize/__manifest__.py @@ -0,0 +1,14 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Web Pwa Customize", + "author": "Tecnativa, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "version": "17.0.1.0.0", + "depends": ["web"], + "license": "AGPL-3", + "category": "Website", + "installable": True, + "maintainers": ["victoralmau"], + "data": ["views/res_config_settings_views.xml"], +} diff --git a/web_pwa_customize/controllers/__init__.py b/web_pwa_customize/controllers/__init__.py new file mode 100644 index 000000000000..ca3774be4c99 --- /dev/null +++ b/web_pwa_customize/controllers/__init__.py @@ -0,0 +1 @@ +from . import webmanifest diff --git a/web_pwa_customize/controllers/webmanifest.py b/web_pwa_customize/controllers/webmanifest.py new file mode 100644 index 000000000000..7b2f1aa0dfc6 --- /dev/null +++ b/web_pwa_customize/controllers/webmanifest.py @@ -0,0 +1,71 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import json + +from odoo import http +from odoo.http import request +from odoo.tools import ustr + +from odoo.addons.web.controllers import webmanifest + + +class WebManifest(webmanifest.WebManifest): + def _get_pwa_manifest_icons(self, pwa_icon): + icons = [] + if not pwa_icon.mimetype.startswith("image/svg"): + all_icons = ( + request.env["ir.attachment"] + .sudo() + .search( + [ + ("url", "like", "/web_pwa_customize/icon"), + ( + "url", + "not like", + "/web_pwa_customize/icon.", + ), # Get only resized icons + ] + ) + ) + for icon in all_icons: + icon_size_name = icon.url.split("/")[-1].lstrip("icon").split(".")[0] + icons.append( + {"src": icon.url, "sizes": icon_size_name, "type": icon.mimetype} + ) + else: + icons = [ + { + "src": pwa_icon.url, + "sizes": "128x128 144x144 152x152 192x192 256x256 512x512", + "type": pwa_icon.mimetype, + } + ] + return icons + + @http.route( + "/web/manifest.webmanifest", type="http", auth="public", methods=["GET"] + ) + def webmanifest(self): + """Call super and overwrite the values that we want.""" + res = super().webmanifest() + manifest = json.loads(res.response[0]) + icp = request.env["ir.config_parameter"].sudo() + manifest["short_name"] = icp.get_param("pwa.manifest.short_name", "Odoo") + manifest["background_color"] = icp.get_param( + "pwa.manifest.background_color", "#714B67" + ) + manifest["theme_color"] = icp.get_param("pwa.manifest.theme_color", "#714B67") + pwa_icon = ( + request.env["ir.attachment"] + .sudo() + .search([("url", "like", "/web_pwa_customize/icon.")]) + ) + if pwa_icon: + manifest["icons"] = self._get_pwa_manifest_icons(pwa_icon) + body = json.dumps(manifest, default=ustr) + return request.make_response( + body, + [ + ("Content-Type", "application/manifest+json"), + ], + ) diff --git a/web_pwa_customize/i18n/es.po b/web_pwa_customize/i18n/es.po new file mode 100644 index 000000000000..86891801202e --- /dev/null +++ b/web_pwa_customize/i18n/es.po @@ -0,0 +1,83 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_pwa_customize +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-11-08 16:57+0000\n" +"PO-Revision-Date: 2024-11-08 16:57+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_pwa_customize +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Background Color" +msgstr "Color de fondo" + +#. module: web_pwa_customize +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Theme Color" +msgstr "Color del tema" + +#. module: web_pwa_customize +#: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_background_color +msgid "Background Color" +msgstr "Color de fondo" + +#. module: web_pwa_customize +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Colors" +msgstr "Colores" + +#. module: web_pwa_customize +#: model:ir.model,name:web_pwa_customize.model_res_config_settings +msgid "Config Settings" +msgstr "Ajustes de configuración" + +#. module: web_pwa_customize +#: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_icon +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Icon" +msgstr "Icono" + +#. module: web_pwa_customize +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Odoo" +msgstr "Odoo" + +#. module: web_pwa_customize +#: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_theme_color +msgid "Theme Color" +msgstr "Color del tema" + +#. module: web_pwa_customize +#: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_short_name +msgid "Web App Short Name" +msgstr "Nombre corto de la aplicación" + +#. module: web_pwa_customize +#. odoo-python +#: code:addons/web_pwa_customize/models/res_config_settings.py:0 +#, python-format +msgid "You can only upload PNG files bigger than 512x512" +msgstr "Solo puede cargar archivos PNG de más de 512 x 512" + +#. module: web_pwa_customize +#. odoo-python +#: code:addons/web_pwa_customize/models/res_config_settings.py:0 +#, python-format +msgid "You can only upload SVG or PNG files. Found: %s." +msgstr "Solo puedes cargar archivos SVG o PNG. Encontrado: %s." + +#. module: web_pwa_customize +#. odoo-python +#: code:addons/web_pwa_customize/models/res_config_settings.py:0 +#, python-format +msgid "You can't upload a file with more than 2 MB." +msgstr "No puede cargar un archivo con más de 2 MB." diff --git a/web_pwa_customize/i18n/web_pwa_customize.pot b/web_pwa_customize/i18n/web_pwa_customize.pot new file mode 100644 index 000000000000..1c5d9d43133f --- /dev/null +++ b/web_pwa_customize/i18n/web_pwa_customize.pot @@ -0,0 +1,83 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_pwa_customize +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-11-08 16:56+0000\n" +"PO-Revision-Date: 2024-11-08 16:56+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_pwa_customize +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Background Color" +msgstr "" + +#. module: web_pwa_customize +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Theme Color" +msgstr "" + +#. module: web_pwa_customize +#: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_background_color +msgid "Background Color" +msgstr "" + +#. module: web_pwa_customize +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Colors" +msgstr "" + +#. module: web_pwa_customize +#: model:ir.model,name:web_pwa_customize.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: web_pwa_customize +#: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_icon +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Icon" +msgstr "" + +#. module: web_pwa_customize +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Odoo" +msgstr "" + +#. module: web_pwa_customize +#: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_theme_color +msgid "Theme Color" +msgstr "" + +#. module: web_pwa_customize +#: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_short_name +msgid "Web App Short Name" +msgstr "" + +#. module: web_pwa_customize +#. odoo-python +#: code:addons/web_pwa_customize/models/res_config_settings.py:0 +#, python-format +msgid "You can only upload PNG files bigger than 512x512" +msgstr "" + +#. module: web_pwa_customize +#. odoo-python +#: code:addons/web_pwa_customize/models/res_config_settings.py:0 +#, python-format +msgid "You can only upload SVG or PNG files. Found: %s." +msgstr "" + +#. module: web_pwa_customize +#. odoo-python +#: code:addons/web_pwa_customize/models/res_config_settings.py:0 +#, python-format +msgid "You can't upload a file with more than 2 MB." +msgstr "" diff --git a/web_pwa_customize/models/__init__.py b/web_pwa_customize/models/__init__.py new file mode 100644 index 000000000000..0deb68c46806 --- /dev/null +++ b/web_pwa_customize/models/__init__.py @@ -0,0 +1 @@ +from . import res_config_settings diff --git a/web_pwa_customize/models/res_config_settings.py b/web_pwa_customize/models/res_config_settings.py new file mode 100644 index 000000000000..2f4226dcbd5c --- /dev/null +++ b/web_pwa_customize/models/res_config_settings.py @@ -0,0 +1,136 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). +import base64 +import io +import sys + +from PIL import Image + +from odoo import _, api, exceptions, fields, models +from odoo.tools.mimetypes import guess_mimetype + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + _pwa_icon_url_base = "/web_pwa_customize/icon" + + pwa_short_name = fields.Char( + "Web App Short Name", + config_parameter="pwa.manifest.short_name", + ) + pwa_icon = fields.Binary("Icon", readonly=False) + pwa_background_color = fields.Char( + "Background Color", config_parameter="pwa.manifest.background_color" + ) + pwa_theme_color = fields.Char( + "Theme Color", config_parameter="pwa.manifest.theme_color" + ) + + @api.model + def get_values(self): + res = super().get_values() + pwa_icon_attachment = ( + self.env["ir.attachment"] + .sudo() + .search([("url", "like", self._pwa_icon_url_base + ".")]) + ) + res["pwa_icon"] = pwa_icon_attachment.datas if pwa_icon_attachment else False + return res + + @api.model + def default_get(self, fields): + res = super().default_get(fields) + for f_name in ["pwa_background_color", "pwa_theme_color"]: + if f_name in fields and not res.get(f_name): + res[f_name] = "#714B67" + return res + + def _unpack_icon(self, icon): + # Wrap decoded_icon in BytesIO object + decoded_icon = base64.b64decode(icon) + icon_bytes = io.BytesIO(decoded_icon) + return Image.open(icon_bytes) + + def _write_icon_to_attachment(self, extension, mimetype, size=None): + url = self._pwa_icon_url_base + extension + icon = self.pwa_icon + # Resize image + if size: + image = self._unpack_icon(icon) + resized_image = image.resize(size) + icon_bytes_output = io.BytesIO() + resized_image.save(icon_bytes_output, format=extension.lstrip(".").upper()) + icon = base64.b64encode(icon_bytes_output.getvalue()) + url = f"{self._pwa_icon_url_base}{str(size[0])}x{str(size[1])}{extension}" + # Retreive existing attachment + attachment_model = self.env["ir.attachment"].sudo() + attachment = attachment_model.search([("url", "like", url)]) + # Write values to ir_attachment + values = { + "datas": icon, + "db_datas": icon, + "url": url, + "name": url, + "type": "binary", + "mimetype": mimetype, + } + # Rewrite if exists, else create + if attachment: + attachment.sudo().write(values) + else: + attachment_model.create(values) + + @api.model + def set_values(self): + res = super().set_values() + # Retrieve previous value for pwa_icon from ir_attachment + pwa_icon_ir_attachments = ( + self.env["ir.attachment"] + .sudo() + .search([("url", "like", self._pwa_icon_url_base)]) + ) + # Delete or ignore if no icon provided + if not self.pwa_icon: + if pwa_icon_ir_attachments: + pwa_icon_ir_attachments.unlink() + return res + # Fail if icon provided is larger than 2mb + if sys.getsizeof(self.pwa_icon) > 2196608: + raise exceptions.UserError( + _("You can't upload a file with more than 2 MB.") + ) + # Confirm if the pwa_icon binary content is an SVG or PNG + # and process accordingly + decoded_pwa_icon = base64.b64decode(self.pwa_icon) + # Full mimetype detection + pwa_icon_mimetype = guess_mimetype(decoded_pwa_icon) + pwa_icon_extension = "." + pwa_icon_mimetype.split("/")[-1].split("+")[0] + if not pwa_icon_mimetype.startswith( + "image/svg" + ) and not pwa_icon_mimetype.startswith("image/png"): + raise exceptions.UserError( + _("You can only upload SVG or PNG files. Found: %s.") + % pwa_icon_mimetype + ) + # Delete all previous records if we are writting new ones + if pwa_icon_ir_attachments: + pwa_icon_ir_attachments.unlink() + self._write_icon_to_attachment(pwa_icon_extension, pwa_icon_mimetype) + # write multiple sizes if not SVG + if pwa_icon_extension != ".svg": + # Fail if provided PNG is smaller than 512x512 + if self._unpack_icon(self.pwa_icon).size < (512, 512): + raise exceptions.UserError( + _("You can only upload PNG files bigger than 512x512") + ) + for size in [ + (128, 128), + (144, 144), + (152, 152), + (192, 192), + (256, 256), + (512, 512), + ]: + self._write_icon_to_attachment( + pwa_icon_extension, pwa_icon_mimetype, size=size + ) diff --git a/web_pwa_customize/pyproject.toml b/web_pwa_customize/pyproject.toml new file mode 100644 index 000000000000..4231d0cccb3d --- /dev/null +++ b/web_pwa_customize/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/web_pwa_customize/readme/CONFIGURE.md b/web_pwa_customize/readme/CONFIGURE.md new file mode 100644 index 000000000000..0efc85e2c57b --- /dev/null +++ b/web_pwa_customize/readme/CONFIGURE.md @@ -0,0 +1,2 @@ +#. Go to Settings > General Settings. +#. In the 'Progressive Web App' section you can configure all the data. diff --git a/web_pwa_customize/readme/CONTEXT.md b/web_pwa_customize/readme/CONTEXT.md new file mode 100644 index 000000000000..6f4089074ca3 --- /dev/null +++ b/web_pwa_customize/readme/CONTEXT.md @@ -0,0 +1,2 @@ +The existing definitions in the old web_pwa_oca of 16.0 (not existing or customizable +in core) are maintained. diff --git a/web_pwa_customize/readme/CONTRIBUTORS.md b/web_pwa_customize/readme/CONTRIBUTORS.md new file mode 100644 index 000000000000..5fee3904270d --- /dev/null +++ b/web_pwa_customize/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Tecnativa](https://www.tecnativa.com): + - Víctor Martínez + - Pedro M. Baeza diff --git a/web_pwa_customize/readme/DESCRIPTION.md b/web_pwa_customize/readme/DESCRIPTION.md new file mode 100644 index 000000000000..d780ed50121a --- /dev/null +++ b/web_pwa_customize/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module allows to configure data for Progressive Web App: Short name, Background color, Theme color and Icon. diff --git a/web_pwa_customize/static/description/icon.png b/web_pwa_customize/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/web_pwa_customize/static/description/index.html b/web_pwa_customize/static/description/index.html new file mode 100644 index 000000000000..130c40d0190d --- /dev/null +++ b/web_pwa_customize/static/description/index.html @@ -0,0 +1,442 @@ + + + + + +Web Pwa Customize + + + +
+

Web Pwa Customize

+ + +

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

+

This module allows to configure data for Progressive Web App: Short +name, Background color, Theme color and Icon.

+

Table of contents

+ +
+

Use Cases / Context

+

The existing definitions in the old web_pwa_oca of 16.0 (not existing or +customizable in core) are maintained.

+
+
+

Configuration

+

#. Go to Settings > General Settings. #. In the ‘Progressive Web App’ +section you can configure all the data.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Tecnativa:
      +
    • Víctor Martínez
    • +
    • Pedro M. Baeza
    • +
    +
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

victoralmau

+

This module is part of the OCA/web project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/web_pwa_customize/tests/__init__.py b/web_pwa_customize/tests/__init__.py new file mode 100644 index 000000000000..b94650f769f9 --- /dev/null +++ b/web_pwa_customize/tests/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2021 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_web_pwa_customize diff --git a/web_pwa_customize/tests/test_web_pwa_customize.py b/web_pwa_customize/tests/test_web_pwa_customize.py new file mode 100644 index 000000000000..5d6935a2119b --- /dev/null +++ b/web_pwa_customize/tests/test_web_pwa_customize.py @@ -0,0 +1,26 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests.common import tagged + +from odoo.addons.base.tests.common import HttpCaseWithUserDemo + + +@tagged("-at_install", "post_install") +class TestWebPwaCustomize(HttpCaseWithUserDemo): + @classmethod + def setUpClass(cls): + super().setUpClass() + icp = cls.env["ir.config_parameter"].sudo() + icp.set_param("pwa.manifest.short_name", "SHORT-NAME") + icp.set_param("pwa.manifest.background_color", "#2E69B5") + icp.set_param("pwa.manifest.theme_color", "#2E69B4") + + def test_webmanifest_customize(self): + response = self.url_open("/web/manifest.webmanifest") + self.assertEqual(response.status_code, 200) + self.assertEqual(response.headers["Content-Type"], "application/manifest+json") + data = response.json() + self.assertEqual(data["short_name"], "SHORT-NAME") + self.assertEqual(data["background_color"], "#2E69B5") + self.assertEqual(data["theme_color"], "#2E69B4") diff --git a/web_pwa_customize/views/res_config_settings_views.xml b/web_pwa_customize/views/res_config_settings_views.xml new file mode 100644 index 000000000000..44e0f27e1e3c --- /dev/null +++ b/web_pwa_customize/views/res_config_settings_views.xml @@ -0,0 +1,38 @@ + + + + res.config.settings.view.form.pwa + res.config.settings + + + + + + + +
+ Background Color + +
+
+ Theme Color + +
+
+ +
+ +
+
+
+
+
+
From 2af87273dbcc7faad001890a0e66924cf4c95676 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 29 Jul 2025 19:44:47 +0000 Subject: [PATCH 10/23] [UPD] Update web_pwa_customize.pot --- web_pwa_customize/i18n/web_pwa_customize.pot | 2 -- 1 file changed, 2 deletions(-) diff --git a/web_pwa_customize/i18n/web_pwa_customize.pot b/web_pwa_customize/i18n/web_pwa_customize.pot index 1c5d9d43133f..d5518362a823 100644 --- a/web_pwa_customize/i18n/web_pwa_customize.pot +++ b/web_pwa_customize/i18n/web_pwa_customize.pot @@ -6,8 +6,6 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-08 16:56+0000\n" -"PO-Revision-Date: 2024-11-08 16:56+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" From 95eb02fb5945a97eef207da12b6b99c5bc8498ce Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 29 Jul 2025 19:48:27 +0000 Subject: [PATCH 11/23] [BOT] post-merge updates --- README.md | 1 + setup/_metapackage/pyproject.toml | 3 +- web_pwa_customize/README.rst | 14 +++++---- .../static/description/index.html | 30 +++++++++++-------- 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index d932815595dd..2d556aa785d9 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ addon | version | maintainers | summary [web_m2x_options](web_m2x_options/) | 17.0.1.0.7 | | web_m2x_options [web_no_bubble](web_no_bubble/) | 17.0.1.0.0 | | Remove the bubbles from the web interface [web_notify](web_notify/) | 17.0.1.1.0 | | Send notification messages to user +[web_pwa_customize](web_pwa_customize/) | 17.0.1.0.0 | victoralmau | Web Pwa Customize [web_refresher](web_refresher/) | 17.0.1.1.2 | | Web Refresher [web_remember_tree_column_width](web_remember_tree_column_width/) | 17.0.1.0.0 | frahikLV luisg123v cuongnmtm | Remember the tree columns' widths across sessions. [web_responsive](web_responsive/) | 17.0.1.1.7 | Tardo SplashS | Responsive web client, community-supported diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index 8c1b96d87d35..899a1454fca2 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "odoo-addons-oca-web" -version = "17.0.20250630.0" +version = "17.0.20250729.0" dependencies = [ "odoo-addon-web_calendar_slot_duration>=17.0dev,<17.1dev", "odoo-addon-web_chatter_position>=17.0dev,<17.1dev", @@ -15,6 +15,7 @@ dependencies = [ "odoo-addon-web_m2x_options>=17.0dev,<17.1dev", "odoo-addon-web_no_bubble>=17.0dev,<17.1dev", "odoo-addon-web_notify>=17.0dev,<17.1dev", + "odoo-addon-web_pwa_customize>=17.0dev,<17.1dev", "odoo-addon-web_refresher>=17.0dev,<17.1dev", "odoo-addon-web_remember_tree_column_width>=17.0dev,<17.1dev", "odoo-addon-web_responsive>=17.0dev,<17.1dev", diff --git a/web_pwa_customize/README.rst b/web_pwa_customize/README.rst index df67e32b79e9..985606e81a83 100644 --- a/web_pwa_customize/README.rst +++ b/web_pwa_customize/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ================= Web Pwa Customize ================= @@ -7,13 +11,13 @@ Web Pwa Customize !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:4a63e846d259636f1c4cd9c622f602c5a66bf775ab189162f90c00b3e278c7af + !! source digest: sha256:8415b51de0273f7a4646b27d9dd9e8a0e3a10f92aed0e8b5636cf66800c70918 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github @@ -69,10 +73,10 @@ Authors Contributors ------------ -- `Tecnativa `__: +- `Tecnativa `__: - - Víctor Martínez - - Pedro M. Baeza + - Víctor Martínez + - Pedro M. Baeza Maintainers ----------- diff --git a/web_pwa_customize/static/description/index.html b/web_pwa_customize/static/description/index.html index 130c40d0190d..d7a10ef069e5 100644 --- a/web_pwa_customize/static/description/index.html +++ b/web_pwa_customize/static/description/index.html @@ -3,7 +3,7 @@ -Web Pwa Customize +README.rst -
-

Web Pwa Customize

+
+ + +Odoo Community Association + +
+

Web Pwa Customize

-

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

This module allows to configure data for Progressive Web App: Short name, Background color, Theme color and Icon.

Table of contents

@@ -387,17 +392,17 @@

Web Pwa Customize

-

Use Cases / Context

+

Use Cases / Context

The existing definitions in the old web_pwa_oca of 16.0 (not existing or customizable in core) are maintained.

-

Configuration

+

Configuration

#. Go to Settings > General Settings. #. In the ‘Progressive Web App’ section you can configure all the data.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -405,15 +410,15 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Tecnativa
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -438,5 +443,6 @@

Maintainers

+
From 3831b499013039535602931d447e83d9eb88042b Mon Sep 17 00:00:00 2001 From: mymage Date: Wed, 30 Jul 2025 12:25:03 +0000 Subject: [PATCH 12/23] Added translation using Weblate (Italian) --- web_pwa_customize/i18n/it.po | 82 ++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 web_pwa_customize/i18n/it.po diff --git a/web_pwa_customize/i18n/it.po b/web_pwa_customize/i18n/it.po new file mode 100644 index 000000000000..99bf1489baad --- /dev/null +++ b/web_pwa_customize/i18n/it.po @@ -0,0 +1,82 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_pwa_customize +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: web_pwa_customize +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Background Color" +msgstr "" + +#. module: web_pwa_customize +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Theme Color" +msgstr "" + +#. module: web_pwa_customize +#: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_background_color +msgid "Background Color" +msgstr "" + +#. module: web_pwa_customize +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Colors" +msgstr "" + +#. module: web_pwa_customize +#: model:ir.model,name:web_pwa_customize.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: web_pwa_customize +#: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_icon +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Icon" +msgstr "" + +#. module: web_pwa_customize +#: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form +msgid "Odoo" +msgstr "" + +#. module: web_pwa_customize +#: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_theme_color +msgid "Theme Color" +msgstr "" + +#. module: web_pwa_customize +#: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_short_name +msgid "Web App Short Name" +msgstr "" + +#. module: web_pwa_customize +#. odoo-python +#: code:addons/web_pwa_customize/models/res_config_settings.py:0 +#, python-format +msgid "You can only upload PNG files bigger than 512x512" +msgstr "" + +#. module: web_pwa_customize +#. odoo-python +#: code:addons/web_pwa_customize/models/res_config_settings.py:0 +#, python-format +msgid "You can only upload SVG or PNG files. Found: %s." +msgstr "" + +#. module: web_pwa_customize +#. odoo-python +#: code:addons/web_pwa_customize/models/res_config_settings.py:0 +#, python-format +msgid "You can't upload a file with more than 2 MB." +msgstr "" From aa161d87ca1e596fc7c7e1aecb2ffe1c54a933a9 Mon Sep 17 00:00:00 2001 From: Carlos Lopez Date: Tue, 5 Aug 2025 12:21:32 -0500 Subject: [PATCH 13/23] [FIX] web_responsive: prevent error in tests when accessing an undefined variable For an unknown reason, when running the tests, the session does not have all variables filled, so apps_menu is undefined. This causes an error in tours of other modules: "Cannot read properties of undefined (reading 'theme')". The curious thing is that if you run the tests of this module alone, they pass. But when running tests together with another module, tests from the other module fail. For example, when running tests with the voip_oca module. --- web_responsive/static/src/components/apps_menu/apps_menu.esm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web_responsive/static/src/components/apps_menu/apps_menu.esm.js b/web_responsive/static/src/components/apps_menu/apps_menu.esm.js index b1c3b2f29b25..2a8c54f9e7ba 100644 --- a/web_responsive/static/src/components/apps_menu/apps_menu.esm.js +++ b/web_responsive/static/src/components/apps_menu/apps_menu.esm.js @@ -49,7 +49,7 @@ export class AppsMenu extends Component { setup() { super.setup(); this.state = useState({open: false}); - this.theme = session.apps_menu.theme || "milk"; + this.theme = session.apps_menu?.theme || "milk"; this.menuService = useService("menu"); browser.localStorage.setItem("redirect_menuId", ""); if (this.env.services.user.context.is_redirect_to_home) { From 49c89398a116c79bd925e08e798cc55168e6a283 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 6 Aug 2025 04:44:02 +0000 Subject: [PATCH 14/23] [BOT] post-merge updates --- README.md | 2 +- web_responsive/README.rst | 8 ++++-- web_responsive/__manifest__.py | 2 +- web_responsive/static/description/index.html | 30 ++++++++++++-------- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 2d556aa785d9..0f7c1c833a5d 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ addon | version | maintainers | summary [web_pwa_customize](web_pwa_customize/) | 17.0.1.0.0 | victoralmau | Web Pwa Customize [web_refresher](web_refresher/) | 17.0.1.1.2 | | Web Refresher [web_remember_tree_column_width](web_remember_tree_column_width/) | 17.0.1.0.0 | frahikLV luisg123v cuongnmtm | Remember the tree columns' widths across sessions. -[web_responsive](web_responsive/) | 17.0.1.1.7 | Tardo SplashS | Responsive web client, community-supported +[web_responsive](web_responsive/) | 17.0.1.1.8 | Tardo SplashS | Responsive web client, community-supported [web_save_discard_button](web_save_discard_button/) | 17.0.1.0.1 | synconics | Save & Discard Buttons [web_search_with_and](web_search_with_and/) | 17.0.1.0.0 | | Use AND conditions on omnibar search [web_theme_classic](web_theme_classic/) | 17.0.1.0.0 | legalsylvain | Contrasted style on fields to improve the UI. diff --git a/web_responsive/README.rst b/web_responsive/README.rst index 63e613f4fc67..e402871952d3 100644 --- a/web_responsive/README.rst +++ b/web_responsive/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ============== Web Responsive ============== @@ -7,13 +11,13 @@ Web Responsive !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:5f24f0c6452301f09d6c38dcfc6f6c6c499887db956d356f354613e199aad2a1 + !! source digest: sha256:ea6c474292fc4c26a8944820ee63c95af49aa986136a7c57fed801edd2b17188 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png :target: https://odoo-community.org/page/development-status :alt: Production/Stable -.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github diff --git a/web_responsive/__manifest__.py b/web_responsive/__manifest__.py index 1456e4c6ded8..1bc19d50eaf2 100644 --- a/web_responsive/__manifest__.py +++ b/web_responsive/__manifest__.py @@ -9,7 +9,7 @@ { "name": "Web Responsive", "summary": "Responsive web client, community-supported", - "version": "17.0.1.1.7", + "version": "17.0.1.1.8", "category": "Website", "website": "https://github.com/OCA/web", "author": "LasLabs, Tecnativa, ITerra, Onestein, " diff --git a/web_responsive/static/description/index.html b/web_responsive/static/description/index.html index 7225063713d9..ad5326fc8b16 100644 --- a/web_responsive/static/description/index.html +++ b/web_responsive/static/description/index.html @@ -3,7 +3,7 @@ -Web Responsive +README.rst -
-

Web Responsive

+
+ + +Odoo Community Association + +
+

Web Responsive

-

Production/Stable License: LGPL-3 OCA/web Translate me on Weblate Try me on Runboat

+

Production/Stable License: LGPL-3 OCA/web Translate me on Weblate Try me on Runboat

This module adds responsiveness to web backend.

Features for all devices:

    @@ -444,7 +449,7 @@

    Web Responsive

-

Usage

+

Usage

The following keyboard shortcuts are implemented:

  • Navigate app search results - Arrow keys
  • @@ -453,14 +458,14 @@

    Usage

-

Known issues / Roadmap

+

Known issues / Roadmap

  • App navigation with keyboard.
  • Handle long titles on forms in a better way
-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -468,9 +473,9 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • LasLabs
  • Tecnativa
  • @@ -479,7 +484,7 @@

    Authors

-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -514,5 +519,6 @@

Maintainers

+
From 1f66ab1fae1e5175c02859be9a460173595c16fb Mon Sep 17 00:00:00 2001 From: mymage Date: Wed, 6 Aug 2025 11:32:25 +0000 Subject: [PATCH 15/23] Translated using Weblate (Italian) Currently translated at 100.0% (12 of 12 strings) Translation: web-17.0/web-17.0-web_pwa_customize Translate-URL: https://translation.odoo-community.org/projects/web-17-0/web-17-0-web_pwa_customize/it/ --- web_pwa_customize/i18n/it.po | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/web_pwa_customize/i18n/it.po b/web_pwa_customize/i18n/it.po index 99bf1489baad..df2a5904578b 100644 --- a/web_pwa_customize/i18n/it.po +++ b/web_pwa_customize/i18n/it.po @@ -6,77 +6,79 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2025-08-06 14:27+0000\n" +"Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" #. module: web_pwa_customize #: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form msgid "Background Color" -msgstr "" +msgstr "Colore sfondo" #. module: web_pwa_customize #: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form msgid "Theme Color" -msgstr "" +msgstr "Colore tema" #. module: web_pwa_customize #: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_background_color msgid "Background Color" -msgstr "" +msgstr "Colore sfondo" #. module: web_pwa_customize #: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form msgid "Colors" -msgstr "" +msgstr "Colori" #. module: web_pwa_customize #: model:ir.model,name:web_pwa_customize.model_res_config_settings msgid "Config Settings" -msgstr "" +msgstr "Impostazioni configurazione" #. module: web_pwa_customize #: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_icon #: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form msgid "Icon" -msgstr "" +msgstr "Icona" #. module: web_pwa_customize #: model_terms:ir.ui.view,arch_db:web_pwa_customize.res_config_settings_view_form msgid "Odoo" -msgstr "" +msgstr "Odoo" #. module: web_pwa_customize #: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_theme_color msgid "Theme Color" -msgstr "" +msgstr "Colore tema" #. module: web_pwa_customize #: model:ir.model.fields,field_description:web_pwa_customize.field_res_config_settings__pwa_short_name msgid "Web App Short Name" -msgstr "" +msgstr "Nome corto applicazione web" #. module: web_pwa_customize #. odoo-python #: code:addons/web_pwa_customize/models/res_config_settings.py:0 #, python-format msgid "You can only upload PNG files bigger than 512x512" -msgstr "" +msgstr "Si possono caricare solo file PNG maggiori di 512x512" #. module: web_pwa_customize #. odoo-python #: code:addons/web_pwa_customize/models/res_config_settings.py:0 #, python-format msgid "You can only upload SVG or PNG files. Found: %s." -msgstr "" +msgstr "Si possono caricare solo file SVG o PNG. trovato %s." #. module: web_pwa_customize #. odoo-python #: code:addons/web_pwa_customize/models/res_config_settings.py:0 #, python-format msgid "You can't upload a file with more than 2 MB." -msgstr "" +msgstr "Non si può caricare un file superiore a 2MB." From b299dd0b9d2f431b388640bf382ea6d9fa07e457 Mon Sep 17 00:00:00 2001 From: Carlos Lopez Date: Fri, 8 Aug 2025 12:20:54 -0500 Subject: [PATCH 16/23] [IMP] web_widget_product_label_section_and_note: force a width on the column Odoo does not facilitate inheritance in the function https://github.com/odoo/odoo/blob/3bc173a6b22f2e360ec363277800ee5efa12088f/addons/web/static/src/views/list/list_renderer.js#L406 so it is necessary to force a max width at this low level. In v18, Odoo provides an attribute at the field level https://github.com/odoo/odoo/blob/1702cb44ab7692d70bfabfc25db9592dac85e7a2/addons/web/static/src/views/list/column_width_hook.js#L299 and in this widget Odoo uses a default value, which we also use here, see https://github.com/odoo/odoo/blob/1702cb44ab7692d70bfabfc25db9592dac85e7a2/addons/account/static/src/components/product_label_section_and_note_field/product_label_section_and_note_field.js#L249 --- ...product_label_section_and_note_field.esm.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/web_widget_product_label_section_and_note/static/src/components/product_label_section_and_note_field/product_label_section_and_note_field.esm.js b/web_widget_product_label_section_and_note/static/src/components/product_label_section_and_note_field/product_label_section_and_note_field.esm.js index 4d2bdc032569..c5a338d6853a 100644 --- a/web_widget_product_label_section_and_note/static/src/components/product_label_section_and_note_field/product_label_section_and_note_field.esm.js +++ b/web_widget_product_label_section_and_note/static/src/components/product_label_section_and_note_field/product_label_section_and_note_field.esm.js @@ -298,3 +298,21 @@ export const productLabelSectionAndNoteField = { registry .category("fields") .add("product_label_section_and_note_field", productLabelSectionAndNoteField); + +// Patch HTMLElement to set a max width on the product and label field cells. +// Odoo does not facilitate inheritance in the function computeColumnWidthsFromContent, +// so we need to patch the getBoundingClientRect method to enforce a max width. +const originalGetBoundingClientRect = HTMLElement.prototype.getBoundingClientRect; +HTMLElement.prototype.getBoundingClientRect = function () { + const rect = originalGetBoundingClientRect.call(this); + if ( + this.classList && + this.classList.contains("o_product_label_section_and_note_field_cell") + ) { + return { + ...rect, + width: Math.min(rect.width, 400), // Set your desired max width here + }; + } + return rect; +}; From b19856836d5270f6264e8802562a2545616c1ccf Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 12 Aug 2025 13:09:09 +0000 Subject: [PATCH 17/23] [BOT] post-merge updates --- README.md | 2 +- .../README.rst | 8 +++-- .../__manifest__.py | 2 +- .../static/description/index.html | 32 +++++++++++-------- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 0f7c1c833a5d..c33d3d1c0073 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ addon | version | maintainers | summary [web_widget_numeric_step](web_widget_numeric_step/) | 17.0.1.0.0 | rafaelbn yajo | Web Widget Numeric Step [web_widget_open_tab](web_widget_open_tab/) | 17.0.1.0.0 | | Allow to open record from trees on new tab from tree views [web_widget_plotly_chart](web_widget_plotly_chart/) | 17.0.1.0.0 | robyf70 | Allow to draw plotly charts. -[web_widget_product_label_section_and_note](web_widget_product_label_section_and_note/) | 17.0.1.0.0 | | unify the product and name into a single column +[web_widget_product_label_section_and_note](web_widget_product_label_section_and_note/) | 17.0.1.0.1 | | unify the product and name into a single column [web_widget_section_and_note_text_scrollable](web_widget_section_and_note_text_scrollable/) | 17.0.1.0.0 | ivantodorovich | Make the text field of Section and Note widget scrollable [web_widget_url_advanced](web_widget_url_advanced/) | 17.0.1.0.0 | | This module extends URL widget for displaying anchors with custom labels. [web_widget_x2many_2d_matrix](web_widget_x2many_2d_matrix/) | 17.0.2.0.0 | JasminSForgeFlow hbrunn | Show list fields as a matrix diff --git a/web_widget_product_label_section_and_note/README.rst b/web_widget_product_label_section_and_note/README.rst index 66970020ca3b..5543adb61201 100644 --- a/web_widget_product_label_section_and_note/README.rst +++ b/web_widget_product_label_section_and_note/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ========================================= Web widget product label section and note ========================================= @@ -7,13 +11,13 @@ Web widget product label section and note !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:709ddfea019ddd0adedf75e793c8fdb77cc4329f0e6c02f9e78e2f3c99c9a5b6 + !! source digest: sha256:f337be9d3a849faaacd2915b7068977f1f6d6c5d8c515243078ec7e7a067f92f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github diff --git a/web_widget_product_label_section_and_note/__manifest__.py b/web_widget_product_label_section_and_note/__manifest__.py index 3d0121a4a3e7..1a26acec403e 100644 --- a/web_widget_product_label_section_and_note/__manifest__.py +++ b/web_widget_product_label_section_and_note/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Web widget product label section and note", - "version": "17.0.1.0.0", + "version": "17.0.1.0.1", "summary": "unify the product and name into a single column", "author": "Tecnativa, Odoo Community Association (OCA), Odoo S.A.", "website": "https://github.com/OCA/web", diff --git a/web_widget_product_label_section_and_note/static/description/index.html b/web_widget_product_label_section_and_note/static/description/index.html index da63ae5fecbf..499625585d0c 100644 --- a/web_widget_product_label_section_and_note/static/description/index.html +++ b/web_widget_product_label_section_and_note/static/description/index.html @@ -3,7 +3,7 @@ -Web widget product label section and note +README.rst -
-

Web widget product label section and note

+
+ + +Odoo Community Association + +
+

Web widget product label section and note

-

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

This module unifies the product and name into a single column, making it more user-friendly and space-saving.

Table of contents

@@ -388,7 +393,7 @@

Web widget product label section and note

-

Configuration

+

Configuration

To extend this functionality to other modules (for example, Purchase), in a new module, it is necessary to create an inherited view to change the widget for these fields:

@@ -400,7 +405,7 @@

Configuration

-

Usage

+

Usage

  • Go to the Invoicing > Customers > Invoices and add a new line.
  • The product label must be displayed just after the product name.
  • @@ -409,7 +414,7 @@

    Usage

-

Known issues / Roadmap

+

Known issues / Roadmap

  • Add compatibility with sale_product_configurator module
  • Add compatibility with purchase_product_matrix module
  • @@ -421,7 +426,7 @@

    Known issues / Roadmap

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -429,16 +434,16 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Tecnativa
  • Odoo S.A.
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -464,5 +469,6 @@

Maintainers

+
From 834c64f15827f4d723c89171b90232ede5f1cb27 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Fri, 8 Aug 2025 18:20:00 +0200 Subject: [PATCH 18/23] [FIX] web_widget_x2many_2d_matrix: restore pre-v17 functionality (axes) use components to render axes and aggregates, allowing custom widgets there --- .../demo/res_groups_views.xml | 36 +++++- .../x2many_2d_matrix_renderer.esm.js | 105 ++++++++---------- .../x2many_2d_matrix_renderer.xml | 45 ++++---- 3 files changed, 100 insertions(+), 86 deletions(-) diff --git a/web_widget_x2many_2d_matrix/demo/res_groups_views.xml b/web_widget_x2many_2d_matrix/demo/res_groups_views.xml index 4488c30e167b..fd87de62e57c 100644 --- a/web_widget_x2many_2d_matrix/demo/res_groups_views.xml +++ b/web_widget_x2many_2d_matrix/demo/res_groups_views.xml @@ -15,7 +15,7 @@ field_y_axis="partner_id" field_value="country_id" > - [ + -
Char field as value
+
Char field as value, clickable X axis
- [ - + + +
Boolean field as value
@@ -53,7 +57,7 @@ field_y_axis="partner_id" field_value="active" > - [ + - [ + +
Float field as value with float_time widget
+ + + + + + +
diff --git a/web_widget_x2many_2d_matrix/static/src/components/x2many_2d_matrix_renderer/x2many_2d_matrix_renderer.esm.js b/web_widget_x2many_2d_matrix/static/src/components/x2many_2d_matrix_renderer/x2many_2d_matrix_renderer.esm.js index cb429feff4ae..9f4dceced343 100644 --- a/web_widget_x2many_2d_matrix/static/src/components/x2many_2d_matrix_renderer/x2many_2d_matrix_renderer.esm.js +++ b/web_widget_x2many_2d_matrix/static/src/components/x2many_2d_matrix_renderer/x2many_2d_matrix_renderer.esm.js @@ -3,17 +3,14 @@ import {Component, onWillUpdateProps} from "@odoo/owl"; import {evaluateBooleanExpr, evaluateExpr} from "@web/core/py_js/py"; import {Domain} from "@web/core/domain"; +import {Record} from "@web/model/relational_model/record"; import {getFieldContext} from "@web/model/relational_model/utils"; -import {registry} from "@web/core/registry"; -const fieldRegistry = registry.category("fields"); export class X2Many2DMatrixRenderer extends Component { setup() { - this.ValueFieldComponent = this._getValueFieldComponent(); this.columns = this._getColumns(); this.rows = this._getRows(); this.matrix = this._getMatrix(); - this.ValueFieldType = this._getValueFieldType(); onWillUpdateProps((newProps) => { this.columns = this._getColumns(newProps.list.records); @@ -28,6 +25,7 @@ export class X2Many2DMatrixRenderer extends Component { const column = { value: record.data[this.matrixFields.x], text: record.data[this.matrixFields.x], + rawValue: record.data[this.matrixFields.x], }; if (record.fields[this.matrixFields.x].type === "many2one") { column.text = column.value[1]; @@ -45,6 +43,7 @@ export class X2Many2DMatrixRenderer extends Component { const row = { value: record.data[this.matrixFields.y], text: record.data[this.matrixFields.y], + rawValue: record.data[this.matrixFields.y], }; if (record.fields[this.matrixFields.y].type === "many2one") { row.text = row.value[1]; @@ -94,62 +93,41 @@ export class X2Many2DMatrixRenderer extends Component { return this.props.matrixFields; } - _getValueField() { - const field = this.list.fields[this.matrixFields.value]; - if (!field.widget) { - return fieldRegistry.get(field.type); - } - return fieldRegistry.get(field.widget); - } - - _getValueFieldComponent() { - return this._getValueField().component; + get valueFieldComponent() { + return this.props.list_view.fieldNodes[this.matrixFields.value + "_0"].field + .component; } - _getValueFieldType() { - const field = this.list.fields[this.matrixFields.value]; - return field.type; + get xFieldComponent() { + return this.props.list_view.fieldNodes[this.matrixFields.x + "_0"].field + .component; } - _getXAxisField() { - return this.list.fields[this.matrixFields.x]; - } - - _getYAxisField() { - return this.list.fields[this.matrixFields.y]; + get yFieldComponent() { + return this.props.list_view.fieldNodes[this.matrixFields.y + "_0"].field + .component; } _aggregateRow(row) { const y = this.rows.findIndex((r) => r.value === row); const total = this.matrix[y].map((r) => r.value).reduce((aggr, x) => aggr + x); - if (this.ValueFieldType === "integer") { - return total; - } - return Number(total).toFixed(2); + return total; } _aggregateColumn(column) { const x = this.columns.findIndex((c) => c.value === column); - const total = this.matrix - .map((r) => r[x]) .map((r) => r.value) .reduce((aggr, y) => aggr + y); - if (this.ValueFieldType === "integer") { - return total; - } - return Number(total).toFixed(2); + return total; } _aggregateAll() { const total = this.matrix .map((r) => r.map((x) => x.value).reduce((aggr, x) => aggr + x)) .reduce((aggr, y) => aggr + y); - if (this.ValueFieldType === "integer") { - return total; - } - return Number(total).toFixed(2); + return total; } _canAggregate() { @@ -158,26 +136,43 @@ export class X2Many2DMatrixRenderer extends Component { ); } - getValueFieldProps(column, row) { + _getValueFieldProps(column, row) { const x = this.columns.findIndex((c) => c.value === column); const y = this.rows.findIndex((r) => r.value === row); - let record = null; - let value = null; - if ( - this.matrix[y] && - this.matrix[y][x] && - (record = this.matrix[y][x].records[0]) - ) { - record = this.matrix[y][x].records[0]; - value = this.matrix[y][x].value; - } - value = record ? record.data[this.matrixFields.value] : value; - this.matrix[y][x].value = value; + const record = this.matrix[y][x].records[0]; + if (!record) { return null; } + return this._getMatrixFieldProps(record, "value"); + } + + _getAxisFieldProps(value, axis) { + const fieldName = this.matrixFields[axis]; + const record = new Record(this.list.model, this.list._config, { + [fieldName]: value, + }); + const props = this._getMatrixFieldProps(record, axis); + if (this.list.fields[fieldName].type === "many2one") { + props.canOpen = + axis === "x" ? this.props.isXClickable : this.props.isYClickable; + } + props.readonly = true; + return props; + } + + _getAggregateProps(value) { + const record = new Record(this.list.model, this.list._config, { + [this.matrixFields.value]: value, + }); + const props = this._getMatrixFieldProps(record, "value"); + props.readonly = true; + return props; + } + + _getMatrixFieldProps(record, fieldName) { const fieldInfo = - this.props.list_view.fieldNodes[this.matrixFields.value + "_0"]; + this.props.list_view.fieldNodes[this.matrixFields[fieldName] + "_0"]; const dynamicInfo = { get context() { return getFieldContext(record, fieldInfo.name, fieldInfo.context); @@ -201,19 +196,15 @@ export class X2Many2DMatrixRenderer extends Component { record.evalContextWithVirtualIds ), }; - const valueField = this._getValueField(); const result = { readonly: dynamicInfo.readonly, record: record, - name: this.matrixFields.value, - ...(valueField.extractProps || (() => ({}))).apply(valueField, [ + name: this.matrixFields[fieldName], + ...(fieldInfo.field.extractProps || (() => ({}))).apply(fieldInfo.field, [ fieldInfo, dynamicInfo, ]), }; - if (value === null) { - result.readonly = true; - } return result; } } diff --git a/web_widget_x2many_2d_matrix/static/src/components/x2many_2d_matrix_renderer/x2many_2d_matrix_renderer.xml b/web_widget_x2many_2d_matrix/static/src/components/x2many_2d_matrix_renderer/x2many_2d_matrix_renderer.xml index edc7b67fa5db..6aff7687dbf5 100644 --- a/web_widget_x2many_2d_matrix/static/src/components/x2many_2d_matrix_renderer/x2many_2d_matrix_renderer.xml +++ b/web_widget_x2many_2d_matrix/static/src/components/x2many_2d_matrix_renderer/x2many_2d_matrix_renderer.xml @@ -14,15 +14,10 @@ t-key="column.value" class="text-center" > - - - - - - + @@ -30,24 +25,19 @@ - - - - - - + @@ -55,7 +45,10 @@ t-if="props.showRowTotals and _canAggregate()" class="row-total" > - + @@ -63,10 +56,16 @@ - + - + From 69b506d248bd05cbfd73729a0c157d100591b999 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Mon, 18 Aug 2025 10:27:52 +0000 Subject: [PATCH 19/23] [UPD] Update web_widget_x2many_2d_matrix.pot --- .../i18n/web_widget_x2many_2d_matrix.pot | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web_widget_x2many_2d_matrix/i18n/web_widget_x2many_2d_matrix.pot b/web_widget_x2many_2d_matrix/i18n/web_widget_x2many_2d_matrix.pot index 59e77621a175..beaaa1c87a15 100644 --- a/web_widget_x2many_2d_matrix/i18n/web_widget_x2many_2d_matrix.pot +++ b/web_widget_x2many_2d_matrix/i18n/web_widget_x2many_2d_matrix.pot @@ -20,7 +20,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -28,6 +28,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" From 68c4ccabf61c5f5c5bb0fa9eed00195e9b4a8b74 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 18 Aug 2025 10:31:13 +0000 Subject: [PATCH 20/23] [BOT] post-merge updates --- README.md | 2 +- web_widget_x2many_2d_matrix/README.rst | 2 +- web_widget_x2many_2d_matrix/__manifest__.py | 2 +- web_widget_x2many_2d_matrix/static/description/index.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c33d3d1c0073..e26c0dbfa6f3 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ addon | version | maintainers | summary [web_widget_product_label_section_and_note](web_widget_product_label_section_and_note/) | 17.0.1.0.1 | | unify the product and name into a single column [web_widget_section_and_note_text_scrollable](web_widget_section_and_note_text_scrollable/) | 17.0.1.0.0 | ivantodorovich | Make the text field of Section and Note widget scrollable [web_widget_url_advanced](web_widget_url_advanced/) | 17.0.1.0.0 | | This module extends URL widget for displaying anchors with custom labels. -[web_widget_x2many_2d_matrix](web_widget_x2many_2d_matrix/) | 17.0.2.0.0 | JasminSForgeFlow hbrunn | Show list fields as a matrix +[web_widget_x2many_2d_matrix](web_widget_x2many_2d_matrix/) | 17.0.2.0.1 | JasminSForgeFlow hbrunn | Show list fields as a matrix [//]: # (end addons) diff --git a/web_widget_x2many_2d_matrix/README.rst b/web_widget_x2many_2d_matrix/README.rst index 6c3766041d32..b218f059e650 100644 --- a/web_widget_x2many_2d_matrix/README.rst +++ b/web_widget_x2many_2d_matrix/README.rst @@ -11,7 +11,7 @@ !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:3b939ed31516b2624a4420ffc82a3930260841d3edd944ba87968d79353e11c1 + !! source digest: sha256:b3c49bb3ff89ecca8e15592499b305035a572489dbca5abb391c3a1946978fc5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png diff --git a/web_widget_x2many_2d_matrix/__manifest__.py b/web_widget_x2many_2d_matrix/__manifest__.py index d219bf546365..6ba83068125e 100644 --- a/web_widget_x2many_2d_matrix/__manifest__.py +++ b/web_widget_x2many_2d_matrix/__manifest__.py @@ -5,7 +5,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { "name": "2D matrix for x2many fields", - "version": "17.0.2.0.0", + "version": "17.0.2.0.1", "maintainers": ["JasminSForgeFlow", "hbrunn"], "development_status": "Production/Stable", "author": ( diff --git a/web_widget_x2many_2d_matrix/static/description/index.html b/web_widget_x2many_2d_matrix/static/description/index.html index 8eebac8b6c9e..08ec9c7ff39c 100644 --- a/web_widget_x2many_2d_matrix/static/description/index.html +++ b/web_widget_x2many_2d_matrix/static/description/index.html @@ -372,7 +372,7 @@

2D matrix for x2many fields

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:3b939ed31516b2624a4420ffc82a3930260841d3edd944ba87968d79353e11c1 +!! source digest: sha256:b3c49bb3ff89ecca8e15592499b305035a572489dbca5abb391c3a1946978fc5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Production/Stable License: AGPL-3 OCA/web Translate me on Weblate Try me on Runboat

This module allows to show an x2many field with 3-tuples ($x_value, From d9ba747264c868027e52d82f9f47fa61233ff36b Mon Sep 17 00:00:00 2001 From: Weblate Date: Mon, 18 Aug 2025 10:31:23 +0000 Subject: [PATCH 21/23] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: web-17.0/web-17.0-web_widget_x2many_2d_matrix Translate-URL: https://translation.odoo-community.org/projects/web-17-0/web-17-0-web_widget_x2many_2d_matrix/ --- web_widget_x2many_2d_matrix/i18n/ar.po | 7 ++++++- web_widget_x2many_2d_matrix/i18n/de.po | 7 ++++++- web_widget_x2many_2d_matrix/i18n/es.po | 7 ++++++- web_widget_x2many_2d_matrix/i18n/fi.po | 7 ++++++- web_widget_x2many_2d_matrix/i18n/fr.po | 7 ++++++- web_widget_x2many_2d_matrix/i18n/hr.po | 7 ++++++- web_widget_x2many_2d_matrix/i18n/it.po | 16 ++++++++++++---- web_widget_x2many_2d_matrix/i18n/lt.po | 7 ++++++- web_widget_x2many_2d_matrix/i18n/nl.po | 7 ++++++- web_widget_x2many_2d_matrix/i18n/nl_NL.po | 7 ++++++- web_widget_x2many_2d_matrix/i18n/pt_BR.po | 7 ++++++- web_widget_x2many_2d_matrix/i18n/sl.po | 7 ++++++- web_widget_x2many_2d_matrix/i18n/tr.po | 7 ++++++- web_widget_x2many_2d_matrix/i18n/zh_CN.po | 7 ++++++- 14 files changed, 90 insertions(+), 17 deletions(-) diff --git a/web_widget_x2many_2d_matrix/i18n/ar.po b/web_widget_x2many_2d_matrix/i18n/ar.po index c763e753a9a8..268bf7b5eef7 100644 --- a/web_widget_x2many_2d_matrix/i18n/ar.po +++ b/web_widget_x2many_2d_matrix/i18n/ar.po @@ -27,7 +27,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -35,6 +35,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" diff --git a/web_widget_x2many_2d_matrix/i18n/de.po b/web_widget_x2many_2d_matrix/i18n/de.po index a81a0aa8a6cb..6661b583da7f 100644 --- a/web_widget_x2many_2d_matrix/i18n/de.po +++ b/web_widget_x2many_2d_matrix/i18n/de.po @@ -27,7 +27,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -35,6 +35,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" diff --git a/web_widget_x2many_2d_matrix/i18n/es.po b/web_widget_x2many_2d_matrix/i18n/es.po index 71fbb8154ad9..f3990c0f5446 100644 --- a/web_widget_x2many_2d_matrix/i18n/es.po +++ b/web_widget_x2many_2d_matrix/i18n/es.po @@ -26,7 +26,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -34,6 +34,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" diff --git a/web_widget_x2many_2d_matrix/i18n/fi.po b/web_widget_x2many_2d_matrix/i18n/fi.po index db07ba2e98f2..c1f7bce73b4c 100644 --- a/web_widget_x2many_2d_matrix/i18n/fi.po +++ b/web_widget_x2many_2d_matrix/i18n/fi.po @@ -26,7 +26,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -34,6 +34,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" diff --git a/web_widget_x2many_2d_matrix/i18n/fr.po b/web_widget_x2many_2d_matrix/i18n/fr.po index bd00378c78ed..4c179a0d0505 100644 --- a/web_widget_x2many_2d_matrix/i18n/fr.po +++ b/web_widget_x2many_2d_matrix/i18n/fr.po @@ -26,7 +26,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -34,6 +34,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" diff --git a/web_widget_x2many_2d_matrix/i18n/hr.po b/web_widget_x2many_2d_matrix/i18n/hr.po index 49283c5a7c0b..48f2d47aa34a 100644 --- a/web_widget_x2many_2d_matrix/i18n/hr.po +++ b/web_widget_x2many_2d_matrix/i18n/hr.po @@ -28,7 +28,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -36,6 +36,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" diff --git a/web_widget_x2many_2d_matrix/i18n/it.po b/web_widget_x2many_2d_matrix/i18n/it.po index 5670a1ff16e7..70d4cbfac70f 100644 --- a/web_widget_x2many_2d_matrix/i18n/it.po +++ b/web_widget_x2many_2d_matrix/i18n/it.po @@ -10,8 +10,8 @@ msgstr "" "POT-Creation-Date: 2016-03-17 07:30+0000\n" "PO-Revision-Date: 2025-07-11 21:04+0000\n" "Last-Translator: mymage \n" -"Language-Team: Italian (http://www.transifex.com/oca/OCA-web-8-0/language/it/" -")\n" +"Language-Team: Italian (http://www.transifex.com/oca/OCA-web-8-0/language/" +"it/)\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,14 +26,19 @@ msgstr "Campo booleano come valore" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" -msgstr "Campo carattere come valore" +msgid "Char field as value, clickable X axis" +msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "Float field as value" msgstr "Campo a virgola mobile come valore" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" @@ -58,6 +63,9 @@ msgstr "Niente da visualizzare." msgid "Selection field as value" msgstr "Campo selezione come valore" +#~ msgid "Char field as value" +#~ msgstr "Campo carattere come valore" + #, python-format #~ msgid "Sorry no matrix data to display." #~ msgstr "Spiacenti, nessun dato da visualizzare." diff --git a/web_widget_x2many_2d_matrix/i18n/lt.po b/web_widget_x2many_2d_matrix/i18n/lt.po index fd7c347cc17f..f9a7aa3320e2 100644 --- a/web_widget_x2many_2d_matrix/i18n/lt.po +++ b/web_widget_x2many_2d_matrix/i18n/lt.po @@ -26,7 +26,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -34,6 +34,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" diff --git a/web_widget_x2many_2d_matrix/i18n/nl.po b/web_widget_x2many_2d_matrix/i18n/nl.po index 1583f43acb50..a72279857429 100644 --- a/web_widget_x2many_2d_matrix/i18n/nl.po +++ b/web_widget_x2many_2d_matrix/i18n/nl.po @@ -23,7 +23,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -31,6 +31,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" diff --git a/web_widget_x2many_2d_matrix/i18n/nl_NL.po b/web_widget_x2many_2d_matrix/i18n/nl_NL.po index 057b2373847d..073714a08a89 100644 --- a/web_widget_x2many_2d_matrix/i18n/nl_NL.po +++ b/web_widget_x2many_2d_matrix/i18n/nl_NL.po @@ -27,7 +27,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -35,6 +35,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" diff --git a/web_widget_x2many_2d_matrix/i18n/pt_BR.po b/web_widget_x2many_2d_matrix/i18n/pt_BR.po index 1d506b2de4bf..230e0efe14cd 100644 --- a/web_widget_x2many_2d_matrix/i18n/pt_BR.po +++ b/web_widget_x2many_2d_matrix/i18n/pt_BR.po @@ -26,7 +26,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -34,6 +34,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" diff --git a/web_widget_x2many_2d_matrix/i18n/sl.po b/web_widget_x2many_2d_matrix/i18n/sl.po index 359bb5d731fb..fa617f788615 100644 --- a/web_widget_x2many_2d_matrix/i18n/sl.po +++ b/web_widget_x2many_2d_matrix/i18n/sl.po @@ -26,7 +26,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -34,6 +34,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" diff --git a/web_widget_x2many_2d_matrix/i18n/tr.po b/web_widget_x2many_2d_matrix/i18n/tr.po index 9c97bf3dc4c7..5eb199b0072e 100644 --- a/web_widget_x2many_2d_matrix/i18n/tr.po +++ b/web_widget_x2many_2d_matrix/i18n/tr.po @@ -26,7 +26,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -34,6 +34,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" diff --git a/web_widget_x2many_2d_matrix/i18n/zh_CN.po b/web_widget_x2many_2d_matrix/i18n/zh_CN.po index 66e5c5dabbcd..f4ab95a8554d 100644 --- a/web_widget_x2many_2d_matrix/i18n/zh_CN.po +++ b/web_widget_x2many_2d_matrix/i18n/zh_CN.po @@ -23,7 +23,7 @@ msgstr "" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form -msgid "Char field as value" +msgid "Char field as value, clickable X axis" msgstr "" #. module: web_widget_x2many_2d_matrix @@ -31,6 +31,11 @@ msgstr "" msgid "Float field as value" msgstr "" +#. module: web_widget_x2many_2d_matrix +#: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form +msgid "Float field as value with float_time widget" +msgstr "" + #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "" From 0c70c3193ab6fc8cd29ca18d34a484dbbdc4b18f Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 19 Aug 2025 13:14:51 +0000 Subject: [PATCH 22/23] Translated using Weblate (Italian) Currently translated at 100.0% (8 of 8 strings) Translation: web-17.0/web-17.0-web_widget_x2many_2d_matrix Translate-URL: https://translation.odoo-community.org/projects/web-17-0/web-17-0-web_widget_x2many_2d_matrix/it/ --- web_widget_x2many_2d_matrix/i18n/it.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web_widget_x2many_2d_matrix/i18n/it.po b/web_widget_x2many_2d_matrix/i18n/it.po index 70d4cbfac70f..394d95525be3 100644 --- a/web_widget_x2many_2d_matrix/i18n/it.po +++ b/web_widget_x2many_2d_matrix/i18n/it.po @@ -8,10 +8,10 @@ msgstr "" "Project-Id-Version: web (8.0)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-03-17 07:30+0000\n" -"PO-Revision-Date: 2025-07-11 21:04+0000\n" +"PO-Revision-Date: 2025-08-19 15:25+0000\n" "Last-Translator: mymage \n" -"Language-Team: Italian (http://www.transifex.com/oca/OCA-web-8-0/language/" -"it/)\n" +"Language-Team: Italian (http://www.transifex.com/oca/OCA-web-8-0/language/it/" +")\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,7 +27,7 @@ msgstr "Campo booleano come valore" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "Char field as value, clickable X axis" -msgstr "" +msgstr "Campo carattere come valore, asse X cliccabile" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form @@ -37,7 +37,7 @@ msgstr "Campo a virgola mobile come valore" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form msgid "Float field as value with float_time widget" -msgstr "" +msgstr "Valore in virgola mobile con widget float_time" #. module: web_widget_x2many_2d_matrix #: model_terms:ir.ui.view,arch_db:web_widget_x2many_2d_matrix.view_groups_form From a9f773ed8b6ba3e54becee7857a665e083a5bdae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi?= Date: Mon, 8 Sep 2025 07:05:09 +0000 Subject: [PATCH 23/23] Translated using Weblate (French) Currently translated at 96.7% (30 of 31 strings) Translation: web-17.0/web-17.0-web_responsive Translate-URL: https://translation.odoo-community.org/projects/web-17-0/web-17-0-web_responsive/fr/ --- web_responsive/i18n/fr.po | 55 ++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/web_responsive/i18n/fr.po b/web_responsive/i18n/fr.po index b7d9caee5b09..34c702babe7c 100644 --- a/web_responsive/i18n/fr.po +++ b/web_responsive/i18n/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2023-03-13 14:23+0000\n" +"PO-Revision-Date: 2025-09-08 09:43+0000\n" "Last-Translator: Rémi \n" "Language-Team: none\n" "Language: fr\n" @@ -14,55 +14,55 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 5.10.4\n" #. module: web_responsive #. odoo-javascript #: code:addons/web_responsive/static/src/views/form/status_bar_buttons.xml:0 #, python-format msgid "Action" -msgstr "" +msgstr "Action" #. module: web_responsive #. odoo-javascript #: code:addons/web_responsive/static/src/components/menu_canonical_searchbar/searchbar.xml:0 #, python-format msgid "App Icon" -msgstr "" +msgstr "Icône de l'application" #. module: web_responsive #: model:ir.actions.act_window,name:web_responsive.res_users_view_form_apps_menu_preferences_action msgid "Apps Menu Preferences" -msgstr "" +msgstr "Préférences du menu des applications" #. module: web_responsive #: model:ir.model.fields,field_description:web_responsive.field_res_users__apps_menu_search_type #: model_terms:ir.ui.view,arch_db:web_responsive.res_users_view_form_apps_menu_preferences msgid "Apps Menu Search Type" -msgstr "" +msgstr "Type de recherche dans le menu des applications" #. module: web_responsive #: model:ir.model.fields,field_description:web_responsive.field_res_users__apps_menu_theme #: model_terms:ir.ui.view,arch_db:web_responsive.res_users_view_form_apps_menu_preferences msgid "Apps Menu Theme" -msgstr "" +msgstr "Thème du menu des applications" #. module: web_responsive #: model:ir.model.fields.selection,name:web_responsive.selection__res_users__apps_menu_search_type__canonical #: model_terms:ir.ui.view,arch_db:web_responsive.res_users_view_form_apps_menu_preferences msgid "Canonical" -msgstr "" +msgstr "Canonique" #. module: web_responsive #: model:ir.model.fields.selection,name:web_responsive.selection__res_users__apps_menu_search_type__command_palette #: model_terms:ir.ui.view,arch_db:web_responsive.res_users_view_form_apps_menu_preferences msgid "Command Palette" -msgstr "" +msgstr "Interface de commandes" #. module: web_responsive #: model:ir.model.fields.selection,name:web_responsive.selection__res_users__apps_menu_theme__community msgid "Community" -msgstr "" +msgstr "Communauté" #. module: web_responsive #. odoo-javascript @@ -76,18 +76,18 @@ msgstr "Annuler" #: code:addons/web_responsive/static/src/components/command_palette/main.xml:0 #, python-format msgid "Exit" -msgstr "" +msgstr "Quitter" #. module: web_responsive #: model:ir.model.fields.selection,name:web_responsive.selection__res_users__apps_menu_search_type__fuse #: model_terms:ir.ui.view,arch_db:web_responsive.res_users_view_form_apps_menu_preferences msgid "Fuse" -msgstr "" +msgstr "Fondu" #. module: web_responsive #: model:ir.model,name:web_responsive.model_ir_http msgid "HTTP Routing" -msgstr "" +msgstr "Routage HTTP" #. module: web_responsive #. odoo-javascript @@ -108,43 +108,44 @@ msgstr "Enregistrer une note" #: code:addons/web_responsive/static/src/components/file_viewer/file_viewer.xml:0 #, python-format msgid "Maximize" -msgstr "Maximiser" +msgstr "Agrandir" #. module: web_responsive #: model:ir.model.fields.selection,name:web_responsive.selection__res_users__apps_menu_theme__milk +#, fuzzy msgid "Milk" -msgstr "" +msgstr "Milk" #. module: web_responsive #. odoo-javascript #: code:addons/web_responsive/static/src/components/file_viewer/file_viewer.xml:0 #, python-format msgid "Minimize" -msgstr "Minimiser" +msgstr "Réduire" #. module: web_responsive #. odoo-javascript #: code:addons/web_responsive/static/src/legacy/xml/form_buttons.xml:0 #, python-format msgid "New" -msgstr "" +msgstr "Nouveau" #. module: web_responsive #. odoo-javascript #: code:addons/web_responsive/static/src/components/menu_canonical_searchbar/searchbar.xml:0 #, python-format msgid "Nothing to show" -msgstr "" +msgstr "Rien à afficher" #. module: web_responsive #: model:ir.model.fields,field_description:web_responsive.field_res_users__is_redirect_home msgid "Redirect to Home" -msgstr "" +msgstr "Rediriger vers l'écran d'accueil" #. module: web_responsive #: model:ir.model.fields,help:web_responsive.field_res_users__is_redirect_home msgid "Redirect to dashboard after signing in" -msgstr "" +msgstr "Rediriger vers le tableau de bord après authentification" #. module: web_responsive #. odoo-javascript @@ -156,12 +157,12 @@ msgstr "Enregistrer" #. module: web_responsive #: model_terms:ir.ui.view,arch_db:web_responsive.res_users_view_form_apps_menu_preferences msgid "Search Type" -msgstr "" +msgstr "Type de recherche" #. module: web_responsive #: model_terms:ir.ui.view,arch_db:web_responsive.res_users_view_form_apps_menu_preferences msgid "Search Type Help" -msgstr "" +msgstr "Aide du type de recherche" #. module: web_responsive #. odoo-javascript @@ -181,27 +182,27 @@ msgstr "Envoyer un message" #. module: web_responsive #: model_terms:ir.ui.view,arch_db:web_responsive.res_users_view_form_apps_menu_preferences msgid "Theme" -msgstr "" +msgstr "Thème" #. module: web_responsive #: model:ir.model,name:web_responsive.model_res_users msgid "User" -msgstr "" +msgstr "Utilisateur" #. module: web_responsive #: model_terms:ir.ui.view,arch_db:web_responsive.res_users_view_form_apps_menu_preferences msgid "a new search algorithm is used" -msgstr "" +msgstr "un nouvel algorithme de recherche est utilisé" #. module: web_responsive #: model_terms:ir.ui.view,arch_db:web_responsive.res_users_view_form_apps_menu_preferences msgid "the standard odoo search tool" -msgstr "" +msgstr "l'outil de recherche standard d'Odoo" #. module: web_responsive #: model_terms:ir.ui.view,arch_db:web_responsive.res_users_view_form_apps_menu_preferences msgid "uses a standard algorithm" -msgstr "" +msgstr "utilise un algorithme standard" #, python-format #~ msgid "Activities"