From bded351b738715e34ab7bf45aba30ec7744f2c80 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 12 Mar 2024 13:48:53 +0100 Subject: [PATCH 01/11] [ADD] web_filter_header_button: New module TT47127 --- web_filter_header_button/README.rst | 139 +++++ web_filter_header_button/__init__.py | 0 web_filter_header_button/__manifest__.py | 20 + .../demo/ir_module_module_view.xml | 19 + .../i18n/web_filter_header_button.pot | 13 + web_filter_header_button/readme/CONFIGURE.md | 32 ++ web_filter_header_button/readme/CONTEXT.md | 1 + .../readme/CONTRIBUTORS.md | 2 + .../readme/DESCRIPTION.md | 1 + web_filter_header_button/readme/ROADMAP.md | 2 + web_filter_header_button/readme/USAGE.md | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 479 ++++++++++++++++++ .../src/control_panel/control_panel.esm.js | 11 + .../src/control_panel/control_panel.xml | 10 + .../control_panel_model_extension.esm.js | 36 ++ .../src/filter_button/filter_button.esm.js | 50 ++ .../src/filter_button/filter_button.xml | 38 ++ 18 files changed, 855 insertions(+) create mode 100644 web_filter_header_button/README.rst create mode 100644 web_filter_header_button/__init__.py create mode 100644 web_filter_header_button/__manifest__.py create mode 100644 web_filter_header_button/demo/ir_module_module_view.xml create mode 100644 web_filter_header_button/i18n/web_filter_header_button.pot create mode 100644 web_filter_header_button/readme/CONFIGURE.md create mode 100644 web_filter_header_button/readme/CONTEXT.md create mode 100644 web_filter_header_button/readme/CONTRIBUTORS.md create mode 100644 web_filter_header_button/readme/DESCRIPTION.md create mode 100644 web_filter_header_button/readme/ROADMAP.md create mode 100644 web_filter_header_button/readme/USAGE.md create mode 100644 web_filter_header_button/static/description/icon.png create mode 100644 web_filter_header_button/static/description/index.html create mode 100644 web_filter_header_button/static/src/control_panel/control_panel.esm.js create mode 100644 web_filter_header_button/static/src/control_panel/control_panel.xml create mode 100644 web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js create mode 100644 web_filter_header_button/static/src/filter_button/filter_button.esm.js create mode 100644 web_filter_header_button/static/src/filter_button/filter_button.xml diff --git a/web_filter_header_button/README.rst b/web_filter_header_button/README.rst new file mode 100644 index 000000000000..80879470a2fc --- /dev/null +++ b/web_filter_header_button/README.rst @@ -0,0 +1,139 @@ +============= +Filter Button +============= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:9da8b47931a94c1b0a4f43e7a450e88a87095f7d1d6aa5fdf36fc59efbb75fe4 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/15.0/web_filter_header_button + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-15-0/web-15-0-web_filter_header_button + :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=15.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to add some selected filters as buttons in the header +control panel. + +**Table of contents** + +.. contents:: + :local: + +Use Cases / Context +=================== + +This developement is aimed to ease the filter access for touch screens +users. + +Configuration +============= + +To show a filter in the header of the views, it should have the a +``context`` attribute with the key ``shown_in_panel``. + +.. code:: xml + + + +This will show the filter in the header with its name. You can customize +the button adding an icon or with a custom name passing an object to +that key: + +.. code:: python + + {'shown_in_panel': {'icon': 'fa-thumbs-up', 'name': 'Ok'}} + +You might be interested in leaving just the icon. In that case, set an +empty string on the ``name`` property: + +.. code:: python + + {'shown_in_panel': {'icon': 'fa-thumbs-up', 'name': ''}} + +You could also want to add a hotkey. In such case add the ``hotkey`` +property: + +.. code:: python + + {'shown_in_panel': {'icon': 'fa-thumbs-up', 'hotkey': 'F'}} + +You can show filter, groups or even favorites. + +Usage +===== + +There's a demo implementation in ``Apps`` and you can play around +following the *Configure* section. + +Known issues / Roadmap +====================== + +- Group filters by kind +- As we use the ``context`` attribute, the inheritance could be + limiting in some cases. Keep it in mind or use + ``base_view_inheritance_extension`` if you want to use proper context + inheritance. + +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 `__ + + - David Vidal + +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_filter_header_button/__init__.py b/web_filter_header_button/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/web_filter_header_button/__manifest__.py b/web_filter_header_button/__manifest__.py new file mode 100644 index 000000000000..1587328bca4a --- /dev/null +++ b/web_filter_header_button/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2024 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Filter Button", + "version": "15.0.1.0.0", + "summary": "Show selected filters as buttons in the control panel", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "category": "Server UX", + "website": "https://github.com/OCA/web", + "depends": ["web"], + "data": [], + "demo": [ + "demo/ir_module_module_view.xml", + ], + "assets": { + "web.assets_backend": ["web_filter_header_button/static/src/**/*.js"], + "web.assets_qweb": ["web_filter_header_button/static/src/**/*.xml"], + }, +} diff --git a/web_filter_header_button/demo/ir_module_module_view.xml b/web_filter_header_button/demo/ir_module_module_view.xml new file mode 100644 index 000000000000..77773bbe86bb --- /dev/null +++ b/web_filter_header_button/demo/ir_module_module_view.xml @@ -0,0 +1,19 @@ + + + + ir.module.module + + + + {'shown_in_panel': {'icon': 'fa-toggle-on', 'hotkey': 'i'}} + + + {'shown_in_panel': {'icon': 'fa-toggle-off', 'hotkey': 'u'}} + + + + diff --git a/web_filter_header_button/i18n/web_filter_header_button.pot b/web_filter_header_button/i18n/web_filter_header_button.pot new file mode 100644 index 000000000000..a11baf5cd77c --- /dev/null +++ b/web_filter_header_button/i18n/web_filter_header_button.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 15.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" diff --git a/web_filter_header_button/readme/CONFIGURE.md b/web_filter_header_button/readme/CONFIGURE.md new file mode 100644 index 000000000000..8f87f4e5b8ed --- /dev/null +++ b/web_filter_header_button/readme/CONFIGURE.md @@ -0,0 +1,32 @@ +To show a filter in the header of the views, it should have the a `context` attribute with the key `shown_in_panel`. + +```xml + +``` + +This will show the filter in the header with its name. You can customize the button +adding an icon or with a custom name passing an object to that key: + +```python +{'shown_in_panel': {'icon': 'fa-thumbs-up', 'name': 'Ok'}} +``` + +You might be interested in leaving just the icon. In that case, set an empty string on +the `name` property: + +```python +{'shown_in_panel': {'icon': 'fa-thumbs-up', 'name': ''}} +``` + +You could also want to add a hotkey. In such case add the `hotkey` property: + +```python +{'shown_in_panel': {'icon': 'fa-thumbs-up', 'hotkey': 'F'}} +``` + +You can show filter, groups or even favorites. diff --git a/web_filter_header_button/readme/CONTEXT.md b/web_filter_header_button/readme/CONTEXT.md new file mode 100644 index 000000000000..2d9eb2fe08e7 --- /dev/null +++ b/web_filter_header_button/readme/CONTEXT.md @@ -0,0 +1 @@ +This developement is aimed to ease the filter access for touch screens users. diff --git a/web_filter_header_button/readme/CONTRIBUTORS.md b/web_filter_header_button/readme/CONTRIBUTORS.md new file mode 100644 index 000000000000..96d0c4c7ffc3 --- /dev/null +++ b/web_filter_header_button/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- [Tecnativa](https://tecnativa.com) + - David Vidal diff --git a/web_filter_header_button/readme/DESCRIPTION.md b/web_filter_header_button/readme/DESCRIPTION.md new file mode 100644 index 000000000000..0647834694a6 --- /dev/null +++ b/web_filter_header_button/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module allows to add some selected filters as buttons in the header control panel. diff --git a/web_filter_header_button/readme/ROADMAP.md b/web_filter_header_button/readme/ROADMAP.md new file mode 100644 index 000000000000..804bf5e48459 --- /dev/null +++ b/web_filter_header_button/readme/ROADMAP.md @@ -0,0 +1,2 @@ +- Group filters by kind +- As we use the `context` attribute, the inheritance could be limiting in some cases. Keep it in mind or use `base_view_inheritance_extension` if you want to use proper context inheritance. diff --git a/web_filter_header_button/readme/USAGE.md b/web_filter_header_button/readme/USAGE.md new file mode 100644 index 000000000000..ad0e8190e225 --- /dev/null +++ b/web_filter_header_button/readme/USAGE.md @@ -0,0 +1,2 @@ +There's a demo implementation in `Apps` and you can play around following the *Configure* +section. diff --git a/web_filter_header_button/static/description/icon.png b/web_filter_header_button/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_filter_header_button/static/description/index.html b/web_filter_header_button/static/description/index.html new file mode 100644 index 000000000000..f80e0c98ef40 --- /dev/null +++ b/web_filter_header_button/static/description/index.html @@ -0,0 +1,479 @@ + + + + + + +Filter Button + + + +
+

Filter Button

+ + +

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

+

This module allows to add some selected filters as buttons in the header +control panel.

+

Table of contents

+ +
+

Use Cases / Context

+

This developement is aimed to ease the filter access for touch screens +users.

+
+
+

Configuration

+

To show a filter in the header of the views, it should have the a +context attribute with the key shown_in_panel.

+
+<filter
+    string="My filter"
+    name="my_filter"
+    domain="[('active', '!=', False)]"
+    context="{'shown_in_panel': True}"
+>
+
+

This will show the filter in the header with its name. You can customize +the button adding an icon or with a custom name passing an object to +that key:

+
+{'shown_in_panel': {'icon': 'fa-thumbs-up', 'name': 'Ok'}}
+
+

You might be interested in leaving just the icon. In that case, set an +empty string on the name property:

+
+{'shown_in_panel': {'icon': 'fa-thumbs-up', 'name': ''}}
+
+

You could also want to add a hotkey. In such case add the hotkey +property:

+
+{'shown_in_panel': {'icon': 'fa-thumbs-up', 'hotkey': 'F'}}
+
+

You can show filter, groups or even favorites.

+
+
+

Usage

+

There’s a demo implementation in Apps and you can play around +following the Configure section.

+
+
+

Known issues / Roadmap

+
    +
  • Group filters by kind
  • +
  • As we use the context attribute, the inheritance could be +limiting in some cases. Keep it in mind or use +base_view_inheritance_extension if you want to use proper context +inheritance.
  • +
+
+
+

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

+ +
+
+

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_filter_header_button/static/src/control_panel/control_panel.esm.js b/web_filter_header_button/static/src/control_panel/control_panel.esm.js new file mode 100644 index 000000000000..75b54f56dc99 --- /dev/null +++ b/web_filter_header_button/static/src/control_panel/control_panel.esm.js @@ -0,0 +1,11 @@ +/** @odoo-module **/ +import {FilterButton} from "../filter_button/filter_button.esm"; +import LegacyControlPanel from "web.ControlPanel"; +import {patch} from "web.utils"; + +patch(LegacyControlPanel, "filter_button.ControlPanel", { + components: { + ...LegacyControlPanel.components, + FilterButton, + }, +}); diff --git a/web_filter_header_button/static/src/control_panel/control_panel.xml b/web_filter_header_button/static/src/control_panel/control_panel.xml new file mode 100644 index 000000000000..7a11ebf55492 --- /dev/null +++ b/web_filter_header_button/static/src/control_panel/control_panel.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js b/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js new file mode 100644 index 000000000000..57716199d499 --- /dev/null +++ b/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js @@ -0,0 +1,36 @@ +/** @odoo-module **/ +import LegacyControlPanelModelExtension from "web/static/src/js/control_panel/control_panel_model_extension.js"; +import {patch} from "web.utils"; + +patch( + LegacyControlPanelModelExtension.prototype, + "filter_button.ControlPanelModelExtension", + { + /** + * Clean the `show_in_panel` context to avoid showing it in the panel + * @private + * @override + * @param {Object} preFilter + * @returns {Promise} + */ + async _saveQuery() { + const preFilter = await this._super(...arguments); + if (preFilter && preFilter.context) { + delete preFilter.context.shown_in_panel; + } + return preFilter; + }, + /** + * Clear the `show_in_panel` context to prevent it being saved with this context + * @override + * @returns {Object} + */ + getIrFilterValues() { + const preFilter = this._super(...arguments); + if (preFilter && preFilter.context) { + delete preFilter.context.shown_in_panel; + } + return preFilter; + }, + } +); diff --git a/web_filter_header_button/static/src/filter_button/filter_button.esm.js b/web_filter_header_button/static/src/filter_button/filter_button.esm.js new file mode 100644 index 000000000000..a7499b571f1f --- /dev/null +++ b/web_filter_header_button/static/src/filter_button/filter_button.esm.js @@ -0,0 +1,50 @@ +/** @odoo-module **/ +const {Component} = owl; + +export class FilterButton extends Component { + setup() { + this.model = this.env.searchModel; + } + /** + * Filter flagged filters to be shown in the control panel. + * + * @param {Array} filters + * @returns {Array} + */ + shownFilters(filters) { + return filters.filter((filter) => { + return filter.context && filter.context.shown_in_panel; + }); + } + /** + * Return custom properties depending on the filter properties + * + * @param {Object} filter + * @returns {Object} + */ + mapFilterType(filter) { + const mapping = { + filter: { + color: "primary", + }, + favorite: { + color: "warning", + }, + }; + return mapping[filter.type]; + } + /** + * Clear filters + */ + onClickReset() { + this.model.dispatch("clearQuery"); + } + /** + * Set / unset filter + * @param {Object} filter + */ + onToggleFilter(filter) { + this.model.dispatch("toggleFilter", filter.id); + } +} +FilterButton.template = "filter_button.FilterButton"; diff --git a/web_filter_header_button/static/src/filter_button/filter_button.xml b/web_filter_header_button/static/src/filter_button/filter_button.xml new file mode 100644 index 000000000000..425bd508d8d9 --- /dev/null +++ b/web_filter_header_button/static/src/filter_button/filter_button.xml @@ -0,0 +1,38 @@ + + + + + +
+ + + + + + + + + + +
+
+
From abe151833edd950a104ce2de6865e433be4f9f34 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 24 May 2024 10:42:25 +0200 Subject: [PATCH 02/11] [IMP] web_filter_header_button: show groupBy filters Now we can configure group filters to show up along the other filters so users can easily access those as well. TT49232 --- .../demo/ir_module_module_view.xml | 5 +++++ .../control_panel_model_extension.esm.js | 12 ++++++++++++ .../static/src/filter_button/filter_button.esm.js | 3 +++ 3 files changed, 20 insertions(+) diff --git a/web_filter_header_button/demo/ir_module_module_view.xml b/web_filter_header_button/demo/ir_module_module_view.xml index 77773bbe86bb..1742e196d611 100644 --- a/web_filter_header_button/demo/ir_module_module_view.xml +++ b/web_filter_header_button/demo/ir_module_module_view.xml @@ -14,6 +14,11 @@ name="context" >{'shown_in_panel': {'icon': 'fa-toggle-off', 'hotkey': 'u'}} + + {'group_by':'state', 'shown_in_panel': {'icon': 'fa-th-list', 'hotkey': 's'}} + diff --git a/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js b/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js index 57716199d499..c08124e43e82 100644 --- a/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js +++ b/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js @@ -32,5 +32,17 @@ patch( } return preFilter; }, + /** + * Allow groupBy filters to show up as buttons + * @override + * @param {Object} filter + * @param {Object} attrs + */ + _extractAttributes(filter, attrs) { + this._super(...arguments); + if (filter.type === "groupBy" && attrs.context.shown_in_panel) { + filter.context = attrs.context; + } + }, } ); diff --git a/web_filter_header_button/static/src/filter_button/filter_button.esm.js b/web_filter_header_button/static/src/filter_button/filter_button.esm.js index a7499b571f1f..b0881432fff9 100644 --- a/web_filter_header_button/static/src/filter_button/filter_button.esm.js +++ b/web_filter_header_button/static/src/filter_button/filter_button.esm.js @@ -30,6 +30,9 @@ export class FilterButton extends Component { favorite: { color: "warning", }, + groupBy: { + color: "info", + }, }; return mapping[filter.type]; } From b2a8106a285349231311b7502bb4727788692f9c Mon Sep 17 00:00:00 2001 From: David Date: Thu, 30 May 2024 17:54:01 +0200 Subject: [PATCH 03/11] [IMP] web_filter_header_button: put buttons in their own row When there are too many buttons, they won't fit in the window and they will overlap with other ui elemnets. We can prevent it putting them in their own row. TT49431 --- web_filter_header_button/README.rst | 6 +- web_filter_header_button/__manifest__.py | 2 +- web_filter_header_button/readme/ROADMAP.md | 3 + .../static/description/index.html | 7 ++- .../src/control_panel/control_panel.xml | 2 +- .../src/filter_button/filter_button.xml | 56 ++++++++++--------- 6 files changed, 44 insertions(+), 32 deletions(-) diff --git a/web_filter_header_button/README.rst b/web_filter_header_button/README.rst index 80879470a2fc..709cdb9d5128 100644 --- a/web_filter_header_button/README.rst +++ b/web_filter_header_button/README.rst @@ -7,7 +7,7 @@ Filter Button !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:9da8b47931a94c1b0a4f43e7a450e88a87095f7d1d6aa5fdf36fc59efbb75fe4 + !! source digest: sha256:474ef01827c48e1ba05df2c8301f718da67a2251d4ae3282ab86a3537dd7d3f2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -95,6 +95,10 @@ Known issues / Roadmap limiting in some cases. Keep it in mind or use ``base_view_inheritance_extension`` if you want to use proper context inheritance. +- Another nice to have would be to be able to hide the filters in the + filter list to be able to show them just in the header, although + there's not a straigh forward way to do it and it could lead to side + effects. Bug Tracker =========== diff --git a/web_filter_header_button/__manifest__.py b/web_filter_header_button/__manifest__.py index 1587328bca4a..b3eba5ba61a9 100644 --- a/web_filter_header_button/__manifest__.py +++ b/web_filter_header_button/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Filter Button", - "version": "15.0.1.0.0", + "version": "15.0.1.1.0", "summary": "Show selected filters as buttons in the control panel", "author": "Tecnativa, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/web_filter_header_button/readme/ROADMAP.md b/web_filter_header_button/readme/ROADMAP.md index 804bf5e48459..b91b7003b6bc 100644 --- a/web_filter_header_button/readme/ROADMAP.md +++ b/web_filter_header_button/readme/ROADMAP.md @@ -1,2 +1,5 @@ - Group filters by kind - As we use the `context` attribute, the inheritance could be limiting in some cases. Keep it in mind or use `base_view_inheritance_extension` if you want to use proper context inheritance. +- Another nice to have would be to be able to hide the filters in the filter list to be + able to show them just in the header, although there's not a straigh forward way to + do it and it could lead to side effects. diff --git a/web_filter_header_button/static/description/index.html b/web_filter_header_button/static/description/index.html index f80e0c98ef40..10cda641a30b 100644 --- a/web_filter_header_button/static/description/index.html +++ b/web_filter_header_button/static/description/index.html @@ -1,4 +1,3 @@ - @@ -367,7 +366,7 @@

Filter Button

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:9da8b47931a94c1b0a4f43e7a450e88a87095f7d1d6aa5fdf36fc59efbb75fe4 +!! source digest: sha256:474ef01827c48e1ba05df2c8301f718da67a2251d4ae3282ab86a3537dd7d3f2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module allows to add some selected filters as buttons in the header @@ -436,6 +435,10 @@

Known issues / Roadmap

limiting in some cases. Keep it in mind or use base_view_inheritance_extension if you want to use proper context inheritance. +
  • Another nice to have would be to be able to hide the filters in the +filter list to be able to show them just in the header, although +there’s not a straigh forward way to do it and it could lead to side +effects.
  • diff --git a/web_filter_header_button/static/src/control_panel/control_panel.xml b/web_filter_header_button/static/src/control_panel/control_panel.xml index 7a11ebf55492..93ce85281835 100644 --- a/web_filter_header_button/static/src/control_panel/control_panel.xml +++ b/web_filter_header_button/static/src/control_panel/control_panel.xml @@ -1,7 +1,7 @@ - + diff --git a/web_filter_header_button/static/src/filter_button/filter_button.xml b/web_filter_header_button/static/src/filter_button/filter_button.xml index 425bd508d8d9..fcdf2f2b4cb0 100644 --- a/web_filter_header_button/static/src/filter_button/filter_button.xml +++ b/web_filter_header_button/static/src/filter_button/filter_button.xml @@ -3,36 +3,38 @@ -
    - - - - - - - - +
    +
    - + + + + + + + + + +
    From 7d0b33d3956f0cde59a746b64582ba79bcadb3fb Mon Sep 17 00:00:00 2001 From: David Date: Tue, 18 Jun 2024 17:01:00 +0200 Subject: [PATCH 04/11] [FIX] web_filter_header_button: custom view compatibility In custom views, like the reconciliation one, that use the control panel we must prevent loading the FilterButton component. TT49664 --- web_filter_header_button/README.rst | 2 +- web_filter_header_button/__manifest__.py | 2 +- web_filter_header_button/static/description/index.html | 2 +- .../static/src/control_panel/control_panel.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/web_filter_header_button/README.rst b/web_filter_header_button/README.rst index 709cdb9d5128..f2bfa6fcf849 100644 --- a/web_filter_header_button/README.rst +++ b/web_filter_header_button/README.rst @@ -7,7 +7,7 @@ Filter Button !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:474ef01827c48e1ba05df2c8301f718da67a2251d4ae3282ab86a3537dd7d3f2 + !! source digest: sha256:c2b64cc19b28ee8850599360a44f1ba6ad28db0bc8574f041a845a5ca9529af1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/web_filter_header_button/__manifest__.py b/web_filter_header_button/__manifest__.py index b3eba5ba61a9..2b7aa29fb42d 100644 --- a/web_filter_header_button/__manifest__.py +++ b/web_filter_header_button/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Filter Button", - "version": "15.0.1.1.0", + "version": "15.0.1.1.1", "summary": "Show selected filters as buttons in the control panel", "author": "Tecnativa, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/web_filter_header_button/static/description/index.html b/web_filter_header_button/static/description/index.html index 10cda641a30b..af6d42538443 100644 --- a/web_filter_header_button/static/description/index.html +++ b/web_filter_header_button/static/description/index.html @@ -366,7 +366,7 @@

    Filter Button

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:474ef01827c48e1ba05df2c8301f718da67a2251d4ae3282ab86a3537dd7d3f2 +!! source digest: sha256:c2b64cc19b28ee8850599360a44f1ba6ad28db0bc8574f041a845a5ca9529af1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

    This module allows to add some selected filters as buttons in the header diff --git a/web_filter_header_button/static/src/control_panel/control_panel.xml b/web_filter_header_button/static/src/control_panel/control_panel.xml index 93ce85281835..8b3654da51cc 100644 --- a/web_filter_header_button/static/src/control_panel/control_panel.xml +++ b/web_filter_header_button/static/src/control_panel/control_panel.xml @@ -2,7 +2,7 @@ - + From 7b366b241d2058a15f72bc958d8fc7e2485b943d Mon Sep 17 00:00:00 2001 From: David Date: Mon, 24 Mar 2025 17:57:59 +0100 Subject: [PATCH 05/11] [IMP] web_filter_header_button: pre-commit auto fixes --- web_filter_header_button/pyproject.toml | 3 +++ .../static/src/filter_button/filter_button.xml | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 web_filter_header_button/pyproject.toml diff --git a/web_filter_header_button/pyproject.toml b/web_filter_header_button/pyproject.toml new file mode 100644 index 000000000000..4231d0cccb3d --- /dev/null +++ b/web_filter_header_button/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/web_filter_header_button/static/src/filter_button/filter_button.xml b/web_filter_header_button/static/src/filter_button/filter_button.xml index fcdf2f2b4cb0..1fc5df24f987 100644 --- a/web_filter_header_button/static/src/filter_button/filter_button.xml +++ b/web_filter_header_button/static/src/filter_button/filter_button.xml @@ -1,6 +1,5 @@ -

    From c81a08ab6289110b8be92743f08d1fe9a1f603e4 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 26 Mar 2025 17:31:48 +0100 Subject: [PATCH 06/11] [MIG] web_filter_header_button: Migration to 18.0 TT54366 --- web_filter_header_button/README.rst | 13 +++-- web_filter_header_button/__manifest__.py | 5 +- web_filter_header_button/readme/USAGE.md | 3 + .../static/description/index.html | 19 ++++--- .../src/control_panel/control_panel.esm.js | 11 ---- .../src/control_panel/control_panel.xml | 35 ++++++++++-- .../control_panel_model_extension.esm.js | 48 ---------------- .../control_panel/control_panel_patch.esm.js | 37 +++++++++++++ .../src/filter_button/filter_button.esm.js | 23 +++----- .../src/filter_button/filter_button.xml | 14 ++--- .../search/search_arch_parser_patch.esm.js | 23 ++++++++ .../src/search/search_model_patch.esm.js | 55 +++++++++++++++++++ 12 files changed, 184 insertions(+), 102 deletions(-) delete mode 100644 web_filter_header_button/static/src/control_panel/control_panel.esm.js delete mode 100644 web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js create mode 100644 web_filter_header_button/static/src/control_panel/control_panel_patch.esm.js create mode 100644 web_filter_header_button/static/src/search/search_arch_parser_patch.esm.js create mode 100644 web_filter_header_button/static/src/search/search_model_patch.esm.js diff --git a/web_filter_header_button/README.rst b/web_filter_header_button/README.rst index f2bfa6fcf849..b2c3bd49ada5 100644 --- a/web_filter_header_button/README.rst +++ b/web_filter_header_button/README.rst @@ -17,13 +17,13 @@ Filter Button :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/15.0/web_filter_header_button + :target: https://github.com/OCA/web/tree/18.0/web_filter_header_button :alt: OCA/web .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/web-15-0/web-15-0-web_filter_header_button + :target: https://translation.odoo-community.org/projects/web-18-0/web-18-0-web_filter_header_button :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=15.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| @@ -84,6 +84,9 @@ You can show filter, groups or even favorites. Usage ===== +In a search view with header filter buttons, you'll see a filter icon +(funnel). Use it to unfold the filters. + There's a demo implementation in ``Apps`` and you can play around following the *Configure* section. @@ -106,7 +109,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. @@ -138,6 +141,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_filter_header_button/__manifest__.py b/web_filter_header_button/__manifest__.py index 2b7aa29fb42d..dcf1f840325c 100644 --- a/web_filter_header_button/__manifest__.py +++ b/web_filter_header_button/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Filter Button", - "version": "15.0.1.1.1", + "version": "18.0.1.0.0", "summary": "Show selected filters as buttons in the control panel", "author": "Tecnativa, Odoo Community Association (OCA)", "license": "AGPL-3", @@ -14,7 +14,6 @@ "demo/ir_module_module_view.xml", ], "assets": { - "web.assets_backend": ["web_filter_header_button/static/src/**/*.js"], - "web.assets_qweb": ["web_filter_header_button/static/src/**/*.xml"], + "web.assets_backend": ["web_filter_header_button/static/src/**/*"], }, } diff --git a/web_filter_header_button/readme/USAGE.md b/web_filter_header_button/readme/USAGE.md index ad0e8190e225..16c1ab4e831d 100644 --- a/web_filter_header_button/readme/USAGE.md +++ b/web_filter_header_button/readme/USAGE.md @@ -1,2 +1,5 @@ +In a search view with header filter buttons, you'll see a filter icon (funnel). Use it +to unfold the filters. + There's a demo implementation in `Apps` and you can play around following the *Configure* section. diff --git a/web_filter_header_button/static/description/index.html b/web_filter_header_button/static/description/index.html index af6d42538443..9c227eaa59b0 100644 --- a/web_filter_header_button/static/description/index.html +++ b/web_filter_header_button/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -368,7 +369,7 @@

    Filter Button

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:c2b64cc19b28ee8850599360a44f1ba6ad28db0bc8574f041a845a5ca9529af1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

    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 add some selected filters as buttons in the header control panel.

    Table of contents

    @@ -424,6 +425,8 @@

    Configuration

    Usage

    +

    In a search view with header filter buttons, you’ll see a filter icon +(funnel). Use it to unfold the filters.

    There’s a demo implementation in Apps and you can play around following the Configure section.

    @@ -446,7 +449,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.

    @@ -469,11 +472,13 @@

    Contributors

    Maintainers

    This module is maintained by the OCA.

    -Odoo Community Association + +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.

    +

    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_filter_header_button/static/src/control_panel/control_panel.esm.js b/web_filter_header_button/static/src/control_panel/control_panel.esm.js deleted file mode 100644 index 75b54f56dc99..000000000000 --- a/web_filter_header_button/static/src/control_panel/control_panel.esm.js +++ /dev/null @@ -1,11 +0,0 @@ -/** @odoo-module **/ -import {FilterButton} from "../filter_button/filter_button.esm"; -import LegacyControlPanel from "web.ControlPanel"; -import {patch} from "web.utils"; - -patch(LegacyControlPanel, "filter_button.ControlPanel", { - components: { - ...LegacyControlPanel.components, - FilterButton, - }, -}); diff --git a/web_filter_header_button/static/src/control_panel/control_panel.xml b/web_filter_header_button/static/src/control_panel/control_panel.xml index 8b3654da51cc..8913d8eb18c8 100644 --- a/web_filter_header_button/static/src/control_panel/control_panel.xml +++ b/web_filter_header_button/static/src/control_panel/control_panel.xml @@ -1,10 +1,35 @@ - - - - - + + + + + +
    + +
    +
    + + + +
    diff --git a/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js b/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js deleted file mode 100644 index c08124e43e82..000000000000 --- a/web_filter_header_button/static/src/control_panel/control_panel_model_extension.esm.js +++ /dev/null @@ -1,48 +0,0 @@ -/** @odoo-module **/ -import LegacyControlPanelModelExtension from "web/static/src/js/control_panel/control_panel_model_extension.js"; -import {patch} from "web.utils"; - -patch( - LegacyControlPanelModelExtension.prototype, - "filter_button.ControlPanelModelExtension", - { - /** - * Clean the `show_in_panel` context to avoid showing it in the panel - * @private - * @override - * @param {Object} preFilter - * @returns {Promise} - */ - async _saveQuery() { - const preFilter = await this._super(...arguments); - if (preFilter && preFilter.context) { - delete preFilter.context.shown_in_panel; - } - return preFilter; - }, - /** - * Clear the `show_in_panel` context to prevent it being saved with this context - * @override - * @returns {Object} - */ - getIrFilterValues() { - const preFilter = this._super(...arguments); - if (preFilter && preFilter.context) { - delete preFilter.context.shown_in_panel; - } - return preFilter; - }, - /** - * Allow groupBy filters to show up as buttons - * @override - * @param {Object} filter - * @param {Object} attrs - */ - _extractAttributes(filter, attrs) { - this._super(...arguments); - if (filter.type === "groupBy" && attrs.context.shown_in_panel) { - filter.context = attrs.context; - } - }, - } -); diff --git a/web_filter_header_button/static/src/control_panel/control_panel_patch.esm.js b/web_filter_header_button/static/src/control_panel/control_panel_patch.esm.js new file mode 100644 index 000000000000..f2ece582abf9 --- /dev/null +++ b/web_filter_header_button/static/src/control_panel/control_panel_patch.esm.js @@ -0,0 +1,37 @@ +import {ControlPanel} from "@web/search/control_panel/control_panel"; +import {FilterButton} from "../filter_button/filter_button.esm"; +import {browser} from "@web/core/browser/browser"; +import {patch} from "@web/core/utils/patch"; +import {useState} from "@odoo/owl"; +import {user} from "@web/core/user"; + +patch(ControlPanel, { + components: {...ControlPanel.components, FilterButton}, +}); + +patch(ControlPanel.prototype, { + setup() { + super.setup(...arguments); + this.buttonFiltersVisibilityKey = `visibleHeaderButtons${this.env.config.actionId}+${user.userId}`; + this.state = useState({ + ...this.state, + headerButtonFilters: this.env.searchModel?.headerButtonFilters, + showButtonFilters: + this.env.searchModel?.headerButtonFilters.length > 0 && + Boolean(this.env.config.actionId) && + Boolean( + JSON.parse( + browser.localStorage.getItem(this.buttonFiltersVisibilityKey) + ) + ), + }); + }, + onClickShowshowButtonFilters() { + if (this.state.showButtonFilters) { + browser.localStorage.removeItem(this.buttonFiltersVisibilityKey); + } else { + browser.localStorage.setItem(this.buttonFiltersVisibilityKey, true); + } + this.state.showButtonFilters = !this.state.showButtonFilters; + }, +}); diff --git a/web_filter_header_button/static/src/filter_button/filter_button.esm.js b/web_filter_header_button/static/src/filter_button/filter_button.esm.js index b0881432fff9..a62f20fc219d 100644 --- a/web_filter_header_button/static/src/filter_button/filter_button.esm.js +++ b/web_filter_header_button/static/src/filter_button/filter_button.esm.js @@ -1,21 +1,13 @@ -/** @odoo-module **/ -const {Component} = owl; +import {Component} from "@odoo/owl"; export class FilterButton extends Component { + static template = "filter_button.FilterButton"; + static props = { + filters: {type: Object, optional: false}, + }; setup() { this.model = this.env.searchModel; } - /** - * Filter flagged filters to be shown in the control panel. - * - * @param {Array} filters - * @returns {Array} - */ - shownFilters(filters) { - return filters.filter((filter) => { - return filter.context && filter.context.shown_in_panel; - }); - } /** * Return custom properties depending on the filter properties * @@ -40,14 +32,13 @@ export class FilterButton extends Component { * Clear filters */ onClickReset() { - this.model.dispatch("clearQuery"); + this.model.clearQuery(); } /** * Set / unset filter * @param {Object} filter */ onToggleFilter(filter) { - this.model.dispatch("toggleFilter", filter.id); + this.model.toggleSearchItem(filter.id); } } -FilterButton.template = "filter_button.FilterButton"; diff --git a/web_filter_header_button/static/src/filter_button/filter_button.xml b/web_filter_header_button/static/src/filter_button/filter_button.xml index 1fc5df24f987..366770d539b1 100644 --- a/web_filter_header_button/static/src/filter_button/filter_button.xml +++ b/web_filter_header_button/static/src/filter_button/filter_button.xml @@ -1,13 +1,13 @@ - - + +
    -
    +
    @@ -22,8 +22,8 @@ t-value="options.name !== undefined ? options.name : filter.description" />
    -

    Use Cases / Context

    +

    Use Cases / Context

    This developement is aimed to ease the filter access for touch screens users.

    -

    Configuration

    +

    Configuration

    To show a filter in the header of the views, it should have the a context attribute with the key shown_in_panel.

    @@ -424,14 +429,14 @@ 

    Configuration

    You can show filter, groups or even favorites.

    -

    Usage

    +

    Usage

    In a search view with header filter buttons, you’ll see a filter icon (funnel). Use it to unfold the filters.

    There’s a demo implementation in Apps and you can play around following the Configure section.

    -

    Known issues / Roadmap

    +

    Known issues / Roadmap

    • Group filters by kind
    • As we use the context attribute, the inheritance could be limiting @@ -445,32 +450,36 @@

      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 -feedback.

    +feedback.

    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 @@ -478,10 +487,11 @@

    Maintainers

    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.

    +