diff --git a/setup/web_advanced_search/odoo/addons/web_advanced_search b/setup/web_advanced_search/odoo/addons/web_advanced_search new file mode 120000 index 000000000..77a1d3db8 --- /dev/null +++ b/setup/web_advanced_search/odoo/addons/web_advanced_search @@ -0,0 +1 @@ +../../../../web_advanced_search \ No newline at end of file diff --git a/setup/web_advanced_search/setup.py b/setup/web_advanced_search/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/web_advanced_search/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/web_advanced_search/README.rst b/web_advanced_search/README.rst new file mode 100644 index 000000000..4be970bea --- /dev/null +++ b/web_advanced_search/README.rst @@ -0,0 +1,177 @@ +=============== +Advanced search +=============== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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/14.0/web_advanced_search + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-14-0/web-14-0-web_advanced_search + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/162/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +More powerful and easy to use search, especially for related fields. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +* Open *Filters* in a search view +* Select any relational field +* Select operator `is equal to` or `is not equal to` +* The text field changes to a relational selection field where you + can search for the record in question +* Click *Apply* + +To search for properties of linked records (ie invoices for customers +with a credit limit higher than X): + +* Open *Filters* in a search view +* Select *Add Advanced Filter* +* Edit the advanced filter +* Click *Save* + +Note that you can stack searching for properties: Simply add another +advanced search in the selection search window. You can do +this indefinetely, so it is possible to search for moves belonging +to a journal which has a user who is member of a certain group etc. + +Note also the domain dialog offers an editable preview in debug mode: + .. image:: https://raw.githubusercontent.com/OCA/web/14.0/web_advanced_search/static/img/debug_mode.png + +Known issues / Roadmap +====================== + +Improvements to the ``domain`` widget, not exclusively related to this addon: + +* Use relational widgets when filtering a relational field +* Allow to filter field names + +Improvements to the search view in this addon: + +* Use widgets ``one2many_tags`` when searching ``one2many`` fields +* Use widgets ``many2many_tags`` when searching ``many2many`` fields +* Allow to edit current full search using the advanced domain editor + +Issues: + +* Grouped totals can show incorrect values. See https://github.com/odoo/odoo/issues/47950 + +Changelog +========= + +11.0.1.0.2 (2018-10-31) +~~~~~~~~~~~~~~~~~~~~~~~ + +* Fix initialization of 1st domain node + + Sometime the dialog is not ready yet, like on EE version. + Hence when you inject the 1st domain node + the dialog must be already opened. + + [simahawk] + + +11.0.1.0.1 (2018-09-18) +~~~~~~~~~~~~~~~~~~~~~~~ + +* Fix `undefined` in x2m fields + + Before this patch, when searching with the "equals to" operator in any + x2many field, the searched parameter was always `undefined`. + + The problem was that the underlying field manager implementation was + treating those fields as x2many, while the widget used was the `one2many` + one. + + This patch simply mocks the underlying fake record to make think that + any relational field is always a `one2many`. This sets all pieces in + place and makes the field manager work as expected, and thus you can + search as expected too. + +* Make linter happy + + [Yajo] + + +11.0.1.0.0 (2018-07-20) +~~~~~~~~~~~~~~~~~~~~~~~ + +* Rename, refactor, migrate to v11 + + [Yajo] + +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 +~~~~~~~ + +* Therp BV +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* Holger Brunn +* Rami Alwafaie +* Jose Mª Bernet +* Simone Orsi +* Dennis Sluijk +* `Tecnativa `_: + + * Vicent Cubells + * Jairo Llopis + * Alexandre Díaz + +* `DynApps NV `_: + + * Raf Ven + +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_advanced_search/__init__.py b/web_advanced_search/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/web_advanced_search/__manifest__.py b/web_advanced_search/__manifest__.py new file mode 100644 index 000000000..b29f71640 --- /dev/null +++ b/web_advanced_search/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright 2015 Therp BV +# Copyright 2017 Tecnativa - Vicent Cubells +# Copyright 2018 Tecnativa - Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Advanced search", + "version": "14.0.1.0.0", + "author": "Therp BV, " "Tecnativa, " "Odoo Community Association (OCA)", + "license": "AGPL-3", + "category": "Usability", + "summary": "Easier and more powerful searching tools", + "website": "https://github.com/OCA/web", + "depends": ["web"], + "data": ["views/templates.xml"], + "qweb": [ + "static/src/xml/web_advanced_search.xml", + ], + "installable": True, + "application": False, +} diff --git a/web_advanced_search/i18n/da.po b/web_advanced_search/i18n/da.po new file mode 100644 index 000000000..116ce354c --- /dev/null +++ b/web_advanced_search/i18n/da.po @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2018-09-01 05:03+0000\n" +"Last-Translator: Hans Henrik Gabelgaard \n" +"Language-Team: none\n" +"Language: da\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 3.1.1\n" + +#. module: web_advanced_search +#. openerp-web +#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Tilføj avanceret filter" diff --git a/web_advanced_search/i18n/de.po b/web_advanced_search/i18n/de.po new file mode 100644 index 000000000..c85dc8b23 --- /dev/null +++ b/web_advanced_search/i18n/de.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search_x2x +# +# Translators: +# Rudolf Schnapka , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-03 03:49+0000\n" +"PO-Revision-Date: 2020-07-21 18:19+0000\n" +"Last-Translator: c2cdidier \n" +"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n" +"Language: de\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 3.10\n" + +#. module: web_advanced_search +#. openerp-web +#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Erweitertes Filter hinzufügen" + +#~ msgid "is in selection" +#~ msgstr "Ist in Auswahl" diff --git a/web_advanced_search/i18n/es.po b/web_advanced_search/i18n/es.po new file mode 100644 index 000000000..ed4c6b362 --- /dev/null +++ b/web_advanced_search/i18n/es.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search_x2x +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-03 03:49+0000\n" +"PO-Revision-Date: 2019-08-04 17:44+0000\n" +"Last-Translator: eduardgm \n" +"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" +"Language: es\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 3.7.1\n" + +#. module: web_advanced_search +#. openerp-web +#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Añadir un Filtro Avanzado" + +#~ msgid "is in selection" +#~ msgstr "está en la selección" diff --git a/web_advanced_search/i18n/fr.po b/web_advanced_search/i18n/fr.po new file mode 100644 index 000000000..afc868a8d --- /dev/null +++ b/web_advanced_search/i18n/fr.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search_x2x +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-03 03:49+0000\n" +"PO-Revision-Date: 2019-05-27 13:20+0000\n" +"Last-Translator: Kévin Allard \n" +"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" +"Language: fr\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 3.6.1\n" + +#. module: web_advanced_search +#. openerp-web +#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Ajouter un filtre avancé" + +#~ msgid "is in selection" +#~ msgstr "parmi la sélection" diff --git a/web_advanced_search/i18n/hr.po b/web_advanced_search/i18n/hr.po new file mode 100644 index 000000000..9f5f34b87 --- /dev/null +++ b/web_advanced_search/i18n/hr.po @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search_x2x +# +# Translators: +# Bole , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-03 03:49+0000\n" +"PO-Revision-Date: 2019-11-14 10:34+0000\n" +"Last-Translator: Bole \n" +"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 3.8\n" + +#. module: web_advanced_search +#. openerp-web +#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Dodaj napredni filter" + +#~ msgid "is in selection" +#~ msgstr "je u odabiru" diff --git a/web_advanced_search/i18n/nl.po b/web_advanced_search/i18n/nl.po new file mode 100644 index 000000000..2896da278 --- /dev/null +++ b/web_advanced_search/i18n/nl.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search_x2x +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-03 03:49+0000\n" +"PO-Revision-Date: 2020-11-11 13:08+0000\n" +"Last-Translator: Dennis Sluijk \n" +"Language-Team: Dutch (https://www.transifex.com/oca/teams/23907/nl/)\n" +"Language: nl\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 3.10\n" + +#. module: web_advanced_search +#. openerp-web +#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Voeg Geavanceerde Filter Toe" + +#~ msgid "is in selection" +#~ msgstr "is in selectie" diff --git a/web_advanced_search/i18n/nl_NL.po b/web_advanced_search/i18n/nl_NL.po new file mode 100644 index 000000000..173a67ad5 --- /dev/null +++ b/web_advanced_search/i18n/nl_NL.po @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search_x2x +# +# Translators: +# Peter Hageman , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-03 03:49+0000\n" +"PO-Revision-Date: 2020-12-10 13:36+0000\n" +"Last-Translator: Dennis Sluijk \n" +"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/teams/" +"23907/nl_NL/)\n" +"Language: nl_NL\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 3.10\n" + +#. module: web_advanced_search +#. openerp-web +#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Voeg geavanceerde filter toe" + +#~ msgid "is in selection" +#~ msgstr "Is in selectie" diff --git a/web_advanced_search/i18n/pt.po b/web_advanced_search/i18n/pt.po new file mode 100644 index 000000000..426bbf533 --- /dev/null +++ b/web_advanced_search/i18n/pt.po @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-08-12 11:44+0000\n" +"Last-Translator: Pedro Castro Silva \n" +"Language-Team: none\n" +"Language: pt\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 3.7.1\n" + +#. module: web_advanced_search +#. openerp-web +#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Adicionar Filtro Avançado" diff --git a/web_advanced_search/i18n/pt_BR.po b/web_advanced_search/i18n/pt_BR.po new file mode 100644 index 000000000..08da1be3b --- /dev/null +++ b/web_advanced_search/i18n/pt_BR.po @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search_x2x +# +# Translators: +# Rodrigo de Almeida Sottomaior Macedo , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-03 03:49+0000\n" +"PO-Revision-Date: 2019-08-30 15:23+0000\n" +"Last-Translator: Rodrigo Macedo \n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/" +"teams/23907/pt_BR/)\n" +"Language: pt_BR\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 3.8\n" + +#. module: web_advanced_search +#. openerp-web +#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Adicionar filtro avançado" + +#~ msgid "is in selection" +#~ msgstr "Está em seleção" diff --git a/web_advanced_search/i18n/web_advanced_search.pot b/web_advanced_search/i18n/web_advanced_search.pot new file mode 100644 index 000000000..32609e355 --- /dev/null +++ b/web_advanced_search/i18n/web_advanced_search.pot @@ -0,0 +1,21 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.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_advanced_search +#. openerp-web +#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "" diff --git a/web_advanced_search/i18n/zh_CN.po b/web_advanced_search/i18n/zh_CN.po new file mode 100644 index 000000000..7c703ca62 --- /dev/null +++ b/web_advanced_search/i18n/zh_CN.po @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-09-01 12:52+0000\n" +"Last-Translator: 黎伟杰 <674416404@qq.com>\n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.8\n" + +#. module: web_advanced_search +#. openerp-web +#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "添加高级过滤器" diff --git a/web_advanced_search/readme/CONTRIBUTORS.rst b/web_advanced_search/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..fbe3b818d --- /dev/null +++ b/web_advanced_search/readme/CONTRIBUTORS.rst @@ -0,0 +1,14 @@ +* Holger Brunn +* Rami Alwafaie +* Jose Mª Bernet +* Simone Orsi +* Dennis Sluijk +* `Tecnativa `_: + + * Vicent Cubells + * Jairo Llopis + * Alexandre Díaz + +* `DynApps NV `_: + + * Raf Ven diff --git a/web_advanced_search/readme/DESCRIPTION.rst b/web_advanced_search/readme/DESCRIPTION.rst new file mode 100644 index 000000000..bd4c29fdd --- /dev/null +++ b/web_advanced_search/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +More powerful and easy to use search, especially for related fields. diff --git a/web_advanced_search/readme/HISTORY.rst b/web_advanced_search/readme/HISTORY.rst new file mode 100644 index 000000000..7b791ed95 --- /dev/null +++ b/web_advanced_search/readme/HISTORY.rst @@ -0,0 +1,40 @@ +11.0.1.0.2 (2018-10-31) +~~~~~~~~~~~~~~~~~~~~~~~ + +* Fix initialization of 1st domain node + + Sometime the dialog is not ready yet, like on EE version. + Hence when you inject the 1st domain node + the dialog must be already opened. + + [simahawk] + + +11.0.1.0.1 (2018-09-18) +~~~~~~~~~~~~~~~~~~~~~~~ + +* Fix `undefined` in x2m fields + + Before this patch, when searching with the "equals to" operator in any + x2many field, the searched parameter was always `undefined`. + + The problem was that the underlying field manager implementation was + treating those fields as x2many, while the widget used was the `one2many` + one. + + This patch simply mocks the underlying fake record to make think that + any relational field is always a `one2many`. This sets all pieces in + place and makes the field manager work as expected, and thus you can + search as expected too. + +* Make linter happy + + [Yajo] + + +11.0.1.0.0 (2018-07-20) +~~~~~~~~~~~~~~~~~~~~~~~ + +* Rename, refactor, migrate to v11 + + [Yajo] diff --git a/web_advanced_search/readme/ROADMAP.rst b/web_advanced_search/readme/ROADMAP.rst new file mode 100644 index 000000000..b71b3c344 --- /dev/null +++ b/web_advanced_search/readme/ROADMAP.rst @@ -0,0 +1,14 @@ +Improvements to the ``domain`` widget, not exclusively related to this addon: + +* Use relational widgets when filtering a relational field +* Allow to filter field names + +Improvements to the search view in this addon: + +* Use widgets ``one2many_tags`` when searching ``one2many`` fields +* Use widgets ``many2many_tags`` when searching ``many2many`` fields +* Allow to edit current full search using the advanced domain editor + +Issues: + +* Grouped totals can show incorrect values. See https://github.com/odoo/odoo/issues/47950 diff --git a/web_advanced_search/readme/USAGE.rst b/web_advanced_search/readme/USAGE.rst new file mode 100644 index 000000000..76f224a0d --- /dev/null +++ b/web_advanced_search/readme/USAGE.rst @@ -0,0 +1,24 @@ +To use this module, you need to: + +* Open *Filters* in a search view +* Select any relational field +* Select operator `is equal to` or `is not equal to` +* The text field changes to a relational selection field where you + can search for the record in question +* Click *Apply* + +To search for properties of linked records (ie invoices for customers +with a credit limit higher than X): + +* Open *Filters* in a search view +* Select *Add Advanced Filter* +* Edit the advanced filter +* Click *Save* + +Note that you can stack searching for properties: Simply add another +advanced search in the selection search window. You can do +this indefinetely, so it is possible to search for moves belonging +to a journal which has a user who is member of a certain group etc. + +Note also the domain dialog offers an editable preview in debug mode: + .. image:: ../static/img/debug_mode.png diff --git a/web_advanced_search/static/description/icon.png b/web_advanced_search/static/description/icon.png new file mode 100644 index 000000000..1ab5d1e10 Binary files /dev/null and b/web_advanced_search/static/description/icon.png differ diff --git a/web_advanced_search/static/description/index.html b/web_advanced_search/static/description/index.html new file mode 100644 index 000000000..8e653864d --- /dev/null +++ b/web_advanced_search/static/description/index.html @@ -0,0 +1,530 @@ + + + + + + +Advanced search + + + + + + diff --git a/web_advanced_search/static/img/debug_mode.png b/web_advanced_search/static/img/debug_mode.png new file mode 100644 index 000000000..e9a4b46ff Binary files /dev/null and b/web_advanced_search/static/img/debug_mode.png differ diff --git a/web_advanced_search/static/src/js/control_panel/advanced_filter_item.js b/web_advanced_search/static/src/js/control_panel/advanced_filter_item.js new file mode 100644 index 000000000..be480eef1 --- /dev/null +++ b/web_advanced_search/static/src/js/control_panel/advanced_filter_item.js @@ -0,0 +1,66 @@ +odoo.define("web_advanced_search.AdvancedFilterItem", function (require) { + "use strict"; + + const config = require("web.config"); + const DropdownMenuItem = require("web.DropdownMenuItem"); + const patchMixin = require("web.patchMixin"); + const DomainSelectorDialog = require("web.DomainSelectorDialog"); + const Domain = require("web.Domain"); + const human_domain = require("web_advanced_search.human_domain"); + const {useModel} = require("web/static/src/js/model.js"); + + class AdvancedFilterItem extends DropdownMenuItem { + constructor() { + super(...arguments); + this.model = useModel("searchModel"); + this._modelName = this.model.config.modelName; + } + /** + * Open advanced search dialog + * + * @returns {DomainSelectorDialog} The opened dialog itself. + */ + advanced_search_open() { + const domain_selector_dialog = new DomainSelectorDialog( + this, + this._modelName, + "[]", + { + debugMode: config.isDebug(), + readonly: false, + } + ); + domain_selector_dialog.opened(() => { + // Add 1st domain node by default + domain_selector_dialog.domainSelector._onAddFirstButtonClick(); + }); + domain_selector_dialog.on("domain_selected", this, function (e) { + const preFilter = { + description: human_domain.getHumanDomain( + domain_selector_dialog.domainSelector + ), + domain: Domain.prototype.arrayToString(e.data.domain), + type: "filter", + }; + this.model.dispatch("createNewFilters", [preFilter]); + }); + return domain_selector_dialog.open(); + } + /** + * Mocks _trigger_up to redirect Odoo legacy events to OWL events. + * + * @private + * @param {OdooEvent} ev + */ + _trigger_up(ev) { + const evType = ev.name; + const payload = ev.data; + payload.__targetWidget = ev.target; + this.trigger(evType.replace(/_/g, "-"), payload); + } + } + + AdvancedFilterItem.template = "web_advanced_search.AdvancedFilterItem"; + + return patchMixin(AdvancedFilterItem); +}); diff --git a/web_advanced_search/static/src/js/control_panel/filter_menu.js b/web_advanced_search/static/src/js/control_panel/filter_menu.js new file mode 100644 index 000000000..97438eefb --- /dev/null +++ b/web_advanced_search/static/src/js/control_panel/filter_menu.js @@ -0,0 +1,18 @@ +odoo.define("web_advanced_search.FilterMenu", function (require) { + "use strict"; + + const FilterMenu = require("web.FilterMenu"); + const patchMixin = require("web.patchMixin"); + const PatchableFilterMenu = patchMixin(FilterMenu); + const AdvancedFilterItem = require("web_advanced_search.AdvancedFilterItem"); + + PatchableFilterMenu.patch("web_advanced_search.FilterMenu", (T) => { + class AdvancedFilterMenu extends T {} + + AdvancedFilterMenu.components = Object.assign({}, FilterMenu.components, { + AdvancedFilterItem, + }); + return AdvancedFilterMenu; + }); + FilterMenu.components = PatchableFilterMenu.components; +}); diff --git a/web_advanced_search/static/src/js/human_domain.js b/web_advanced_search/static/src/js/human_domain.js new file mode 100644 index 000000000..9dbc49e4d --- /dev/null +++ b/web_advanced_search/static/src/js/human_domain.js @@ -0,0 +1,61 @@ +/* Copyright 2018 Tecnativa - Jairo Llopis + * Copyright 2020 Tecnativa - Alexandre Díaz + * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ + +odoo.define("web_advanced_search.human_domain", function () { + "use strict"; + + const join_mapping = { + "&": _(" and "), + "|": _(" or "), + "!": _(" is not "), + }; + + const human_domain_methods = { + DomainTree: function () { + const human_domains = []; + _.each(this.children, (child) => { + human_domains.push(human_domain_methods[child.template].apply(child)); + }); + return `(${human_domains.join(join_mapping[this.operator])})`; + }, + + DomainSelector: function () { + const result = human_domain_methods.DomainTree.apply(this, arguments); + // Remove surrounding parenthesis + return result.slice(1, -1); + }, + + DomainLeaf: function () { + const chain = []; + let operator = this.operator_mapping[this.operator], + value = `"${this.value}"`; + // Humanize chain + const chain_splitted = this.chain.split("."); + const len = chain_splitted.length; + for (let x = 0; x < len; ++x) { + const element = chain_splitted[x]; + chain.push( + _.findWhere(this.fieldSelector.pages[x], {name: element}).string || + element + ); + } + // Special beautiness for some values + if (this.operator === "=" && _.isBoolean(this.value)) { + operator = this.operator_mapping[this.value ? "set" : "not set"]; + value = ""; + } else if (_.isArray(this.value)) { + value = `["${this.value.join('", "')}"]`; + } + return `${chain.join("→")} ${operator || this.operator} ${value}`.trim(); + }, + }; + + function getHumanDomain(domain_selector) { + return human_domain_methods.DomainSelector.apply(domain_selector); + } + + return { + getHumanDomain: getHumanDomain, + }; +}); diff --git a/web_advanced_search/static/src/xml/web_advanced_search.xml b/web_advanced_search/static/src/xml/web_advanced_search.xml new file mode 100644 index 000000000..431969b5b --- /dev/null +++ b/web_advanced_search/static/src/xml/web_advanced_search.xml @@ -0,0 +1,23 @@ + + + + + +