From b818b76256f65baf2dd39c209fe6ff920152cc2a Mon Sep 17 00:00:00 2001
From: fkantelberg
Date: Tue, 29 Nov 2022 18:44:45 +0100
Subject: [PATCH 01/44] [ADD][16.0] Module web_dark_mode
---
web_dark_mode/README.rst | 79 ++++
web_dark_mode/__init__.py | 4 +
web_dark_mode/__manifest__.py | 28 ++
web_dark_mode/models/__init__.py | 4 +
web_dark_mode/models/ir_http.py | 22 +
web_dark_mode/models/res_users.py | 12 +
web_dark_mode/readme/CONTRIBUTORS.rst | 1 +
web_dark_mode/readme/DESCRIPTION.rst | 2 +
web_dark_mode/readme/ROADMAP.rst | 1 +
web_dark_mode/static/description/index.html | 427 ++++++++++++++++++
.../static/src/js/switch_item.esm.js | 49 ++
web_dark_mode/static/src/scss/variables.scss | 65 +++
web_dark_mode/tests/__init__.py | 4 +
web_dark_mode/tests/test_dark_mode.py | 35 ++
web_dark_mode/views/res_users_views.xml | 14 +
15 files changed, 747 insertions(+)
create mode 100644 web_dark_mode/README.rst
create mode 100644 web_dark_mode/__init__.py
create mode 100644 web_dark_mode/__manifest__.py
create mode 100644 web_dark_mode/models/__init__.py
create mode 100644 web_dark_mode/models/ir_http.py
create mode 100644 web_dark_mode/models/res_users.py
create mode 100644 web_dark_mode/readme/CONTRIBUTORS.rst
create mode 100644 web_dark_mode/readme/DESCRIPTION.rst
create mode 100644 web_dark_mode/readme/ROADMAP.rst
create mode 100644 web_dark_mode/static/description/index.html
create mode 100644 web_dark_mode/static/src/js/switch_item.esm.js
create mode 100644 web_dark_mode/static/src/scss/variables.scss
create mode 100644 web_dark_mode/tests/__init__.py
create mode 100644 web_dark_mode/tests/test_dark_mode.py
create mode 100644 web_dark_mode/views/res_users_views.xml
diff --git a/web_dark_mode/README.rst b/web_dark_mode/README.rst
new file mode 100644
index 000000000000..f119aff9fc20
--- /dev/null
+++ b/web_dark_mode/README.rst
@@ -0,0 +1,79 @@
+=========
+Dark Mode
+=========
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |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/16.0/web_dark_mode
+ :alt: OCA/web
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_dark_mode
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+ :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/web&target_branch=16.0
+ :alt: Try me on Runboat
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This modules offers the dark mode for Odoo CE. The dark mode can be activated by
+every user in the user menu in the top right.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Known issues / Roadmap
+======================
+
+- Implement dark mode for PoS with a glue module
+
+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 smashing it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* initOS GmbH
+
+Contributors
+~~~~~~~~~~~~
+
+* Florian Kantelberg
+
+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_dark_mode/__init__.py b/web_dark_mode/__init__.py
new file mode 100644
index 000000000000..1d408a8a039e
--- /dev/null
+++ b/web_dark_mode/__init__.py
@@ -0,0 +1,4 @@
+# © 2022 Florian Kantelberg - initOS GmbH
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import models
diff --git a/web_dark_mode/__manifest__.py b/web_dark_mode/__manifest__.py
new file mode 100644
index 000000000000..b32c688e9b70
--- /dev/null
+++ b/web_dark_mode/__manifest__.py
@@ -0,0 +1,28 @@
+# © 2022 Florian Kantelberg - initOS GmbH
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+{
+ "name": "Dark Mode",
+ "summary": "Enabled Dark Mode for the Odoo Backend",
+ "license": "AGPL-3",
+ "version": "16.0.1.0.0",
+ "website": "https://github.com/OCA/web",
+ "author": "initOS GmbH, Odoo Community Association (OCA)",
+ "depends": ["web"],
+ "excludes": ["web_enterprise"],
+ "installable": True,
+ "assets": {
+ "web.dark_mode_assets_common": [
+ ("prepend", "web_dark_mode/static/src/scss/variables.scss"),
+ ],
+ "web.dark_mode_assets_backend": [
+ ("prepend", "web_dark_mode/static/src/scss/variables.scss"),
+ ],
+ "web.assets_backend": [
+ "web_dark_mode/static/src/js/switch_item.esm.js",
+ ],
+ },
+ "data": [
+ "views/res_users_views.xml",
+ ],
+}
diff --git a/web_dark_mode/models/__init__.py b/web_dark_mode/models/__init__.py
new file mode 100644
index 000000000000..d565f59dcc8d
--- /dev/null
+++ b/web_dark_mode/models/__init__.py
@@ -0,0 +1,4 @@
+# © 2022 Florian Kantelberg - initOS GmbH
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import ir_http, res_users
diff --git a/web_dark_mode/models/ir_http.py b/web_dark_mode/models/ir_http.py
new file mode 100644
index 000000000000..20755c49de24
--- /dev/null
+++ b/web_dark_mode/models/ir_http.py
@@ -0,0 +1,22 @@
+# © 2022 Florian Kantelberg - initOS GmbH
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import models
+from odoo.http import request
+
+
+class IrHttp(models.AbstractModel):
+ _inherit = "ir.http"
+
+ @classmethod
+ def _set_color_scheme(cls, response):
+ scheme = request.httprequest.cookies.get("color_scheme")
+ user = request.env.user
+ user_scheme = "dark" if user.dark_mode else "light"
+ if (not user.dark_mode_device_dependent) and scheme != user_scheme:
+ response.set_cookie("color_scheme", user_scheme)
+
+ @classmethod
+ def _post_dispatch(cls, response):
+ cls._set_color_scheme(response)
+ return super()._post_dispatch(response)
diff --git a/web_dark_mode/models/res_users.py b/web_dark_mode/models/res_users.py
new file mode 100644
index 000000000000..c1bb2a9df8be
--- /dev/null
+++ b/web_dark_mode/models/res_users.py
@@ -0,0 +1,12 @@
+# © 2022 Florian Kantelberg - initOS GmbH
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+
+from odoo import fields, models
+
+
+class ResUsers(models.Model):
+ _inherit = "res.users"
+
+ dark_mode = fields.Boolean()
+ dark_mode_device_dependent = fields.Boolean("Device Dependent Dark Mode")
diff --git a/web_dark_mode/readme/CONTRIBUTORS.rst b/web_dark_mode/readme/CONTRIBUTORS.rst
new file mode 100644
index 000000000000..e2028261215c
--- /dev/null
+++ b/web_dark_mode/readme/CONTRIBUTORS.rst
@@ -0,0 +1 @@
+* Florian Kantelberg
diff --git a/web_dark_mode/readme/DESCRIPTION.rst b/web_dark_mode/readme/DESCRIPTION.rst
new file mode 100644
index 000000000000..acfc15cd7266
--- /dev/null
+++ b/web_dark_mode/readme/DESCRIPTION.rst
@@ -0,0 +1,2 @@
+This modules offers the dark mode for Odoo CE. The dark mode can be activated by
+every user in the user menu in the top right.
diff --git a/web_dark_mode/readme/ROADMAP.rst b/web_dark_mode/readme/ROADMAP.rst
new file mode 100644
index 000000000000..b1437e5f398e
--- /dev/null
+++ b/web_dark_mode/readme/ROADMAP.rst
@@ -0,0 +1 @@
+- Implement dark mode for PoS with a glue module
diff --git a/web_dark_mode/static/description/index.html b/web_dark_mode/static/description/index.html
new file mode 100644
index 000000000000..87e4776f7e0a
--- /dev/null
+++ b/web_dark_mode/static/description/index.html
@@ -0,0 +1,427 @@
+
+
+
+
+
+
+Dark Mode
+
+
+
+
+
Dark Mode
+
+
+

+
This modules offers the dark mode for Odoo CE. The dark mode can be activated by
+every user in the user menu in the top right.
+
Table of contents
+
+
+
+
+- Implement dark mode for PoS with a glue module
+
+
+
+
+
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 smashing it by providing a detailed and welcomed
+feedback.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+

+
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_dark_mode/static/src/js/switch_item.esm.js b/web_dark_mode/static/src/js/switch_item.esm.js
new file mode 100644
index 000000000000..1eb67e77e45d
--- /dev/null
+++ b/web_dark_mode/static/src/js/switch_item.esm.js
@@ -0,0 +1,49 @@
+/** @odoo-module **/
+
+import {browser} from "@web/core/browser/browser";
+import {registry} from "@web/core/registry";
+
+export function darkModeSwitchItem(env) {
+ return {
+ type: "switch",
+ id: "color_scheme.switch",
+ description: env._t("Dark Mode"),
+ callback: () => {
+ env.services.color_scheme.switchColorScheme();
+ },
+ isChecked: env.services.cookie.current.color_scheme === "dark",
+ sequence: 40,
+ };
+}
+
+export const colorSchemeService = {
+ dependencies: ["cookie", "orm", "ui", "user"],
+
+ async start(env, {cookie, orm, ui, user}) {
+ registry.category("user_menuitems").add("darkmode", darkModeSwitchItem);
+
+ if (!cookie.current.color_scheme) {
+ const match_media = window.matchMedia("(prefers-color-scheme: dark)");
+ const dark_mode = match_media.matches;
+ cookie.setCookie("color_scheme", dark_mode ? "dark" : "light");
+ if (dark_mode) browser.location.reload();
+ }
+
+ return {
+ async switchColorScheme() {
+ const scheme =
+ cookie.current.color_scheme === "dark" ? "light" : "dark";
+ cookie.setCookie("color_scheme", scheme);
+
+ await orm.write("res.users", [user.userId], {
+ dark_mode: scheme === "dark",
+ });
+
+ ui.block();
+ browser.location.reload();
+ },
+ };
+ },
+};
+
+registry.category("services").add("color_scheme", colorSchemeService);
diff --git a/web_dark_mode/static/src/scss/variables.scss b/web_dark_mode/static/src/scss/variables.scss
new file mode 100644
index 000000000000..a32c59d44373
--- /dev/null
+++ b/web_dark_mode/static/src/scss/variables.scss
@@ -0,0 +1,65 @@
+$o-webclient-color-scheme: dark;
+
+$o-white: #000000;
+$o-black: #ffffff;
+
+$o-gray-100: #191c24;
+$o-gray-200: #242733;
+$o-gray-300: #3f4149;
+$o-gray-400: #5f6167;
+$o-gray-500: #797a80;
+$o-gray-600: #94959a;
+$o-gray-700: #b0b0b4;
+$o-gray-800: #cccccf;
+$o-gray-900: #e9e9eb;
+
+$o-community-color: $o-gray-400;
+$o-enterprise-color: $o-gray-400;
+$o-enterprise-primary-color: $o-gray-500;
+$o-brand-primary: $o-gray-600;
+$o-brand-secondary: $o-gray-700;
+
+$o-success: #28a745;
+$o-info: #74dcf3;
+$o-warning: #ff7b00;
+$o-danger: #ff0020;
+
+$primary: $o-gray-800;
+
+$o-main-bg-color: #f0eeee;
+$o-main-favorite-color: #f3cc00;
+$o-main-code-color: #d2317b;
+
+$o-view-background-color: $o-white;
+$o-view-background-color: $o-gray-100;
+$o-shadow-color: #c0c0c0;
+
+$o-form-lightsecondary: #ccc;
+
+$o-list-footer-bg-color: #eee;
+
+$o-tooltip-arrow-color: white;
+
+// Layout
+$o-dropdown-box-shadow: 0 1rem 1.1rem rgba(#fff, 0.1);
+
+// == List group
+
+$o-list-group-active-bg: lighten(saturate(adjust-hue($o-info, 15), 1.8), 5);
+$o-list-footer-bg-color: $o-gray-200;
+
+// == Badges
+
+// Define a minimum width. This value is arbitrary and strictly font-related.
+$o-datepicker-week-color: #8f8f8f;
+
+$component-active-bg: red;
+
+$o-webclient-background-color: $o-gray-300;
+
+.o-settings-form-view .o_base_settings {
+ --settings__tab-bg: #{$o-gray-100};
+ --settings__tab-bg--active: #{$o-gray-300};
+ --settings__tab-color: #{$o-gray-700};
+ --settings__title-bg: #{$o-gray-100};
+}
diff --git a/web_dark_mode/tests/__init__.py b/web_dark_mode/tests/__init__.py
new file mode 100644
index 000000000000..634cfc9d3dc0
--- /dev/null
+++ b/web_dark_mode/tests/__init__.py
@@ -0,0 +1,4 @@
+# © 2022 Florian Kantelberg - initOS GmbH
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import test_dark_mode
diff --git a/web_dark_mode/tests/test_dark_mode.py b/web_dark_mode/tests/test_dark_mode.py
new file mode 100644
index 000000000000..466ee7e3ac19
--- /dev/null
+++ b/web_dark_mode/tests/test_dark_mode.py
@@ -0,0 +1,35 @@
+# © 2022 Florian Kantelberg - initOS GmbH
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from unittest.mock import MagicMock
+
+import odoo.http
+from odoo.tests import common
+
+
+class TestDarkMode(common.TransactionCase):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls.request = MagicMock(env=cls.env)
+ odoo.http._request_stack.push(cls.request)
+
+ def test_dark_mode_cookie(self):
+ response = MagicMock()
+
+ # Cookie is set because the color_scheme changed
+ self.request.httprequest.cookies = {"color_scheme": "dark"}
+ self.env["ir.http"]._post_dispatch(response)
+ response.set_cookie.assert_called_with("color_scheme", "light")
+
+ # Cookie isn't set because the color_scheme is the same
+ response.reset_mock()
+ self.request.httprequest.cookies = {"color_scheme": "light"}
+ self.env["ir.http"]._post_dispatch(response)
+ response.set_cookie.assert_not_called()
+
+ # Cookie isn't set because it's device dependent
+ self.env.user.dark_mode_device_dependent = True
+ self.request.httprequest.cookies = {"color_scheme": "dark"}
+ self.env["ir.http"]._post_dispatch(response)
+ response.set_cookie.assert_not_called()
diff --git a/web_dark_mode/views/res_users_views.xml b/web_dark_mode/views/res_users_views.xml
new file mode 100644
index 000000000000..47f02427f757
--- /dev/null
+++ b/web_dark_mode/views/res_users_views.xml
@@ -0,0 +1,14 @@
+
+
+
+ res.users
+
+
+
+
+
+
+
+
+
+
From 08b9964bffce5567423c2164d902f8eac0c8aab1 Mon Sep 17 00:00:00 2001
From: oca-ci
Date: Wed, 7 Dec 2022 08:41:45 +0000
Subject: [PATCH 02/44] [UPD] Update web_dark_mode.pot
---
web_dark_mode/i18n/web_dark_mode.pot | 37 ++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
create mode 100644 web_dark_mode/i18n/web_dark_mode.pot
diff --git a/web_dark_mode/i18n/web_dark_mode.pot b/web_dark_mode/i18n/web_dark_mode.pot
new file mode 100644
index 000000000000..f3daced67eea
--- /dev/null
+++ b/web_dark_mode/i18n/web_dark_mode.pot
@@ -0,0 +1,37 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * web_dark_mode
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \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_dark_mode
+#. odoo-javascript
+#: code:addons/web_dark_mode/static/src/js/switch_item.esm.js:0
+#: model:ir.model.fields,field_description:web_dark_mode.field_res_users__dark_mode
+#, python-format
+msgid "Dark Mode"
+msgstr ""
+
+#. module: web_dark_mode
+#: model:ir.model.fields,field_description:web_dark_mode.field_res_users__dark_mode_device_dependent
+msgid "Device Dependent Dark Mode"
+msgstr ""
+
+#. module: web_dark_mode
+#: model:ir.model,name:web_dark_mode.model_ir_http
+msgid "HTTP Routing"
+msgstr ""
+
+#. module: web_dark_mode
+#: model:ir.model,name:web_dark_mode.model_res_users
+msgid "User"
+msgstr ""
From 78a679ff3ebc65884eb015831ce042339955ca5d Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Wed, 7 Dec 2022 08:43:48 +0000
Subject: [PATCH 03/44] [UPD] README.rst
---
web_dark_mode/README.rst | 6 +++---
web_dark_mode/static/description/index.html | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/web_dark_mode/README.rst b/web_dark_mode/README.rst
index f119aff9fc20..d29503d0000b 100644
--- a/web_dark_mode/README.rst
+++ b/web_dark_mode/README.rst
@@ -19,9 +19,9 @@ Dark Mode
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_dark_mode
:alt: Translate me on Weblate
-.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
- :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/web&target_branch=16.0
- :alt: Try me on Runboat
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/162/16.0
+ :alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
diff --git a/web_dark_mode/static/description/index.html b/web_dark_mode/static/description/index.html
index 87e4776f7e0a..273e0bae3607 100644
--- a/web_dark_mode/static/description/index.html
+++ b/web_dark_mode/static/description/index.html
@@ -3,7 +3,7 @@
-
+
Dark Mode
+
+
+
+
+
diff --git a/web_sort_menu/static/src/js/sort_app_menu.esm.js b/web_sort_menu/static/src/js/sort_app_menu.esm.js
new file mode 100644
index 000000000000..60ec85cb87ae
--- /dev/null
+++ b/web_sort_menu/static/src/js/sort_app_menu.esm.js
@@ -0,0 +1,10 @@
+/** @odoo-module **/
+
+import {NavBar} from "@web/webclient/navbar/navbar";
+import {patch} from "@web/core/utils/patch";
+
+patch(NavBar.prototype, "web_sort_menu.sortmenu", {
+ sortApps: (apps) => {
+ return apps.sort((a, b) => a.name.localeCompare(b.name));
+ },
+});
diff --git a/web_sort_menu/static/src/xml/sort_app_menu.xml b/web_sort_menu/static/src/xml/sort_app_menu.xml
new file mode 100644
index 000000000000..db79bac46ef0
--- /dev/null
+++ b/web_sort_menu/static/src/xml/sort_app_menu.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
From a81680e005d73e1208286fc0bc90d3674517585c Mon Sep 17 00:00:00 2001
From: anusrinps96
Date: Tue, 28 Oct 2025 10:08:18 +0100
Subject: [PATCH 40/44] [MIG] web_sort_menu: Migration to 18.0
---
web_sort_menu/README.rst | 26 ++++++++++--------
web_sort_menu/__manifest__.py | 2 +-
web_sort_menu/pyproject.toml | 3 ++
web_sort_menu/readme/CONTRIBUTORS.md | 1 +
web_sort_menu/readme/CONTRIBUTORS.rst | 1 -
.../{DESCRIPTION.rst => DESCRIPTION.md} | 5 ++--
web_sort_menu/readme/USAGE.md | 2 ++
web_sort_menu/readme/USAGE.rst | 1 -
web_sort_menu/static/description/icon.png | Bin 9455 -> 0 bytes
web_sort_menu/static/description/index.html | 14 ++++++----
.../static/src/js/sort_app_menu.esm.js | 4 +--
.../static/src/xml/sort_app_menu.xml | 15 ++++------
12 files changed, 38 insertions(+), 36 deletions(-)
create mode 100644 web_sort_menu/pyproject.toml
create mode 100644 web_sort_menu/readme/CONTRIBUTORS.md
delete mode 100644 web_sort_menu/readme/CONTRIBUTORS.rst
rename web_sort_menu/readme/{DESCRIPTION.rst => DESCRIPTION.md} (60%)
create mode 100644 web_sort_menu/readme/USAGE.md
delete mode 100644 web_sort_menu/readme/USAGE.rst
delete mode 100644 web_sort_menu/static/description/icon.png
diff --git a/web_sort_menu/README.rst b/web_sort_menu/README.rst
index d49f382c9ca5..0eb3df871e03 100644
--- a/web_sort_menu/README.rst
+++ b/web_sort_menu/README.rst
@@ -17,20 +17,21 @@ Web Sort Menu
: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/16.0/web_sort_menu
+ :target: https://github.com/OCA/web/tree/18.0/web_sort_menu
:alt: OCA/web
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_sort_menu
+ :target: https://translation.odoo-community.org/projects/web-18-0/web-18-0-web_sort_menu
: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=16.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
By default, apps displayed in dropdown menu are sorted alphabetically.
-If web_responsive module is installed, apps displayed on NavBar menu is sorted in alphabetical order.
-Menus are sorted based on languages used by users.
+If web_responsive module is installed, apps displayed on NavBar menu is
+sorted in alphabetical order. Menus are sorted based on languages used
+by users.
**Table of contents**
@@ -40,7 +41,8 @@ Menus are sorted based on languages used by users.
Usage
=====
-To use this module, you need to install it. After installation, Apps displayed on dropdown/NavBar menu will be sorted alphabetically.
+To use this module, you need to install it. After installation, Apps
+displayed on dropdown/NavBar menu will be sorted alphabetically.
Bug Tracker
===========
@@ -48,7 +50,7 @@ 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 `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -56,17 +58,17 @@ Credits
=======
Authors
-~~~~~~~
+-------
* Anusri Veerappan Prakasam
Contributors
-~~~~~~~~~~~~
+------------
-* Anusri Veerappan Prakasam, Odoo Community Association (OCA)
+- Anusri Veerappan Prakasam, Odoo Community Association (OCA)
Maintainers
-~~~~~~~~~~~
+-----------
This module is maintained by the OCA.
@@ -78,6 +80,6 @@ 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.
+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_sort_menu/__manifest__.py b/web_sort_menu/__manifest__.py
index 24f6e5e3151f..0291d26ec724 100644
--- a/web_sort_menu/__manifest__.py
+++ b/web_sort_menu/__manifest__.py
@@ -1,7 +1,7 @@
{
"name": "Web Sort Menu",
"summary": "Sort Apps in DropDown/NavBar Menu alphabetically",
- "version": "16.0.1.0.0",
+ "version": "18.0.1.0.0",
"category": "Web",
"author": "Anusri Veerappan Prakasam, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/web",
diff --git a/web_sort_menu/pyproject.toml b/web_sort_menu/pyproject.toml
new file mode 100644
index 000000000000..4231d0cccb3d
--- /dev/null
+++ b/web_sort_menu/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/web_sort_menu/readme/CONTRIBUTORS.md b/web_sort_menu/readme/CONTRIBUTORS.md
new file mode 100644
index 000000000000..9c9119a49fbe
--- /dev/null
+++ b/web_sort_menu/readme/CONTRIBUTORS.md
@@ -0,0 +1 @@
+- Anusri Veerappan Prakasam, Odoo Community Association (OCA)
diff --git a/web_sort_menu/readme/CONTRIBUTORS.rst b/web_sort_menu/readme/CONTRIBUTORS.rst
deleted file mode 100644
index a7a016d43a93..000000000000
--- a/web_sort_menu/readme/CONTRIBUTORS.rst
+++ /dev/null
@@ -1 +0,0 @@
-* Anusri Veerappan Prakasam, Odoo Community Association (OCA)
diff --git a/web_sort_menu/readme/DESCRIPTION.rst b/web_sort_menu/readme/DESCRIPTION.md
similarity index 60%
rename from web_sort_menu/readme/DESCRIPTION.rst
rename to web_sort_menu/readme/DESCRIPTION.md
index 01033502b0c4..3463228e471d 100644
--- a/web_sort_menu/readme/DESCRIPTION.rst
+++ b/web_sort_menu/readme/DESCRIPTION.md
@@ -1,3 +1,4 @@
By default, apps displayed in dropdown menu are sorted alphabetically.
-If web_responsive module is installed, apps displayed on NavBar menu is sorted in alphabetical order.
-Menus are sorted based on languages used by users.
+If web_responsive module is installed, apps displayed on NavBar menu is
+sorted in alphabetical order. Menus are sorted based on languages used
+by users.
diff --git a/web_sort_menu/readme/USAGE.md b/web_sort_menu/readme/USAGE.md
new file mode 100644
index 000000000000..b2f260192a3a
--- /dev/null
+++ b/web_sort_menu/readme/USAGE.md
@@ -0,0 +1,2 @@
+To use this module, you need to install it. After installation, Apps
+displayed on dropdown/NavBar menu will be sorted alphabetically.
diff --git a/web_sort_menu/readme/USAGE.rst b/web_sort_menu/readme/USAGE.rst
deleted file mode 100644
index be9bb61389a7..000000000000
--- a/web_sort_menu/readme/USAGE.rst
+++ /dev/null
@@ -1 +0,0 @@
-To use this module, you need to install it. After installation, Apps displayed on dropdown/NavBar menu will be sorted alphabetically.
diff --git a/web_sort_menu/static/description/icon.png b/web_sort_menu/static/description/icon.png
deleted file mode 100644
index 3a0328b516c4980e8e44cdb63fd945757ddd132d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 9455
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
z
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
diff --git a/web_sort_menu/static/description/index.html b/web_sort_menu/static/description/index.html
index b1b9d60c72a8..8c81d3a7aa31 100644
--- a/web_sort_menu/static/description/index.html
+++ b/web_sort_menu/static/description/index.html
@@ -369,10 +369,11 @@ Web Sort Menu
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:5e79dd93ca6197202c76aef91babbcc3175a386bc2037885d95f65e662813fd9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

By default, apps displayed in dropdown menu are sorted alphabetically.
-If web_responsive module is installed, apps displayed on NavBar menu is sorted in alphabetical order.
-Menus are sorted based on languages used by users.
+If web_responsive module is installed, apps displayed on NavBar menu is
+sorted in alphabetical order. Menus are sorted based on languages used
+by users.
Table of contents
@@ -388,14 +389,15 @@ Web Sort Menu
-
To use this module, you need to install it. After installation, Apps displayed on dropdown/NavBar menu will be sorted alphabetically.
+
To use this module, you need to install it. After installation, Apps
+displayed on dropdown/NavBar menu will be sorted alphabetically.
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.
+
feedback.
Do not contact contributors directly about support or help with technical issues.
@@ -421,7 +423,7 @@
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.
+
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_sort_menu/static/src/js/sort_app_menu.esm.js b/web_sort_menu/static/src/js/sort_app_menu.esm.js
index 60ec85cb87ae..a8c88ca924c5 100644
--- a/web_sort_menu/static/src/js/sort_app_menu.esm.js
+++ b/web_sort_menu/static/src/js/sort_app_menu.esm.js
@@ -1,9 +1,7 @@
-/** @odoo-module **/
-
import {NavBar} from "@web/webclient/navbar/navbar";
import {patch} from "@web/core/utils/patch";
-patch(NavBar.prototype, "web_sort_menu.sortmenu", {
+patch(NavBar.prototype, {
sortApps: (apps) => {
return apps.sort((a, b) => a.name.localeCompare(b.name));
},
diff --git a/web_sort_menu/static/src/xml/sort_app_menu.xml b/web_sort_menu/static/src/xml/sort_app_menu.xml
index db79bac46ef0..62b618edae3f 100644
--- a/web_sort_menu/static/src/xml/sort_app_menu.xml
+++ b/web_sort_menu/static/src/xml/sort_app_menu.xml
@@ -1,13 +1,8 @@
-
-
-
-
-
+
+
+
+
+
From a166fa98ef9ae64544a530f08d9b005232d13d9c Mon Sep 17 00:00:00 2001
From: oca-ci
Date: Tue, 30 Dec 2025 10:47:50 +0000
Subject: [PATCH 41/44] [UPD] Update web_sort_menu.pot
---
web_sort_menu/i18n/web_sort_menu.pot | 13 +++++++++++++
1 file changed, 13 insertions(+)
create mode 100644 web_sort_menu/i18n/web_sort_menu.pot
diff --git a/web_sort_menu/i18n/web_sort_menu.pot b/web_sort_menu/i18n/web_sort_menu.pot
new file mode 100644
index 000000000000..aadee09bfeda
--- /dev/null
+++ b/web_sort_menu/i18n/web_sort_menu.pot
@@ -0,0 +1,13 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 18.0\n"
+"Report-Msgid-Bugs-To: \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"
From 240c85a12122efb623956863375b244717e8ab44 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Tue, 30 Dec 2025 10:52:30 +0000
Subject: [PATCH 42/44] [BOT] post-merge updates
---
README.md | 1 +
setup/_metapackage/pyproject.toml | 3 ++-
web_sort_menu/README.rst | 8 ++++--
web_sort_menu/static/description/icon.png | Bin 0 -> 10254 bytes
web_sort_menu/static/description/index.html | 28 ++++++++++++--------
5 files changed, 26 insertions(+), 14 deletions(-)
create mode 100644 web_sort_menu/static/description/icon.png
diff --git a/README.md b/README.md
index 78afdce19e64..536be4879d31 100644
--- a/README.md
+++ b/README.md
@@ -54,6 +54,7 @@ addon | version | maintainers | summary
[web_search_with_and](web_search_with_and/) | 18.0.1.0.1 | | Use AND conditions on omnibar search
[web_send_message_popup](web_send_message_popup/) | 18.0.1.0.0 | | Web Send Message as Popup
[web_session_auto_close](web_session_auto_close/) | 18.0.1.0.1 | | Automatically logs out inactive users based on a configurable timeout.
+[web_sort_menu](web_sort_menu/) | 18.0.1.0.0 | | Sort Apps in DropDown/NavBar Menu alphabetically
[web_systray_button_init_action](web_systray_button_init_action/) | 18.0.1.0.2 | | Add a button to go to the user init action.
[web_theme_classic](web_theme_classic/) | 18.0.1.1.0 |
| Contrasted style on fields to improve the UI.
[web_timeline](web_timeline/) | 18.0.1.0.1 |
| Interactive visualization chart to show events in time
diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml
index cd8c8ce8d4aa..f5deabf84d8e 100644
--- a/setup/_metapackage/pyproject.toml
+++ b/setup/_metapackage/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "odoo-addons-oca-web"
-version = "18.0.20251201.0"
+version = "18.0.20251230.0"
dependencies = [
"odoo-addon-web_calendar_slot_duration==18.0.*",
"odoo-addon-web_chatter_position==18.0.*",
@@ -35,6 +35,7 @@ dependencies = [
"odoo-addon-web_search_with_and==18.0.*",
"odoo-addon-web_send_message_popup==18.0.*",
"odoo-addon-web_session_auto_close==18.0.*",
+ "odoo-addon-web_sort_menu==18.0.*",
"odoo-addon-web_systray_button_init_action==18.0.*",
"odoo-addon-web_theme_classic==18.0.*",
"odoo-addon-web_timeline==18.0.*",
diff --git a/web_sort_menu/README.rst b/web_sort_menu/README.rst
index 0eb3df871e03..e997e30dd95a 100644
--- a/web_sort_menu/README.rst
+++ b/web_sort_menu/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 Sort Menu
=============
@@ -7,13 +11,13 @@ Web Sort Menu
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !! source digest: sha256:5e79dd93ca6197202c76aef91babbcc3175a386bc2037885d95f65e662813fd9
+ !! source digest: sha256:f1d56e2c1ad3ffd632fdba68876daefc03d26f76bcfd71126db70a25721d7c07
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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_sort_menu/static/description/icon.png b/web_sort_menu/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..1dcc49c24f364e9adf0afbc6fc0bac6dbecdeb11
GIT binary patch
literal 10254
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
-Web Sort Menu
+README.rst
-