Compare commits

...

No commits in common. '12.0' and '6.1' have entirely different histories.
12.0 ... 6.1

  1. 16
      .coveragerc
  2. 2
      .gitignore
  3. 30
      .travis.yml
  4. 8
      README.md
  5. 1
      hide_duplicate_button/AUTHORS.txt
  6. 20
      hide_duplicate_button/__init__.py
  7. 43
      hide_duplicate_button/__openerp__.py
  8. 4
      hide_duplicate_button/static/css/duplicate_button.css
  9. 2
      setup/.setuptools-odoo-make-default-ignore
  10. 2
      setup/README
  11. 1
      setup/_metapackage/VERSION.txt
  12. 49
      setup/_metapackage/setup.py
  13. 1
      setup/web_advanced_search/odoo/addons/web_advanced_search
  14. 6
      setup/web_advanced_search/setup.py
  15. 1
      setup/web_company_color/odoo/addons/web_company_color
  16. 6
      setup/web_company_color/setup.py
  17. 1
      setup/web_decimal_numpad_dot/odoo/addons/web_decimal_numpad_dot
  18. 6
      setup/web_decimal_numpad_dot/setup.py
  19. 1
      setup/web_dialog_size/odoo/addons/web_dialog_size
  20. 6
      setup/web_dialog_size/setup.py
  21. 1
      setup/web_disable_export_group/odoo/addons/web_disable_export_group
  22. 6
      setup/web_disable_export_group/setup.py
  23. 1
      setup/web_edit_user_filter/odoo/addons/web_edit_user_filter
  24. 6
      setup/web_edit_user_filter/setup.py
  25. 1
      setup/web_editor_background_color/odoo/addons/web_editor_background_color
  26. 6
      setup/web_editor_background_color/setup.py
  27. 1
      setup/web_environment_ribbon/odoo/addons/web_environment_ribbon
  28. 6
      setup/web_environment_ribbon/setup.py
  29. 1
      setup/web_export_view/odoo/addons/web_export_view
  30. 6
      setup/web_export_view/setup.py
  31. 1
      setup/web_favicon/odoo/addons/web_favicon
  32. 6
      setup/web_favicon/setup.py
  33. 1
      setup/web_group_by_percentage/odoo/addons/web_group_by_percentage
  34. 6
      setup/web_group_by_percentage/setup.py
  35. 1
      setup/web_ir_actions_act_multi/odoo/addons/web_ir_actions_act_multi
  36. 6
      setup/web_ir_actions_act_multi/setup.py
  37. 1
      setup/web_ir_actions_act_view_reload/odoo/addons/web_ir_actions_act_view_reload
  38. 6
      setup/web_ir_actions_act_view_reload/setup.py
  39. 1
      setup/web_listview_range_select/odoo/addons/web_listview_range_select
  40. 6
      setup/web_listview_range_select/setup.py
  41. 1
      setup/web_m2x_options/odoo/addons/web_m2x_options
  42. 6
      setup/web_m2x_options/setup.py
  43. 1
      setup/web_no_bubble/odoo/addons/web_no_bubble
  44. 6
      setup/web_no_bubble/setup.py
  45. 1
      setup/web_notify/odoo/addons/web_notify
  46. 6
      setup/web_notify/setup.py
  47. 1
      setup/web_responsive/odoo/addons/web_responsive
  48. 6
      setup/web_responsive/setup.py
  49. 1
      setup/web_searchbar_full_width/odoo/addons/web_searchbar_full_width
  50. 6
      setup/web_searchbar_full_width/setup.py
  51. 1
      setup/web_switch_context_warning/odoo/addons/web_switch_context_warning
  52. 6
      setup/web_switch_context_warning/setup.py
  53. 1
      setup/web_timeline/odoo/addons/web_timeline
  54. 6
      setup/web_timeline/setup.py
  55. 1
      setup/web_tree_duplicate/odoo/addons/web_tree_duplicate
  56. 6
      setup/web_tree_duplicate/setup.py
  57. 1
      setup/web_tree_dynamic_colored_field/odoo/addons/web_tree_dynamic_colored_field
  58. 6
      setup/web_tree_dynamic_colored_field/setup.py
  59. 1
      setup/web_tree_image_tooltip/odoo/addons/web_tree_image_tooltip
  60. 6
      setup/web_tree_image_tooltip/setup.py
  61. 1
      setup/web_tree_many2one_clickable/odoo/addons/web_tree_many2one_clickable
  62. 6
      setup/web_tree_many2one_clickable/setup.py
  63. 1
      setup/web_tree_resize_column/odoo/addons/web_tree_resize_column
  64. 6
      setup/web_tree_resize_column/setup.py
  65. 1
      setup/web_widget_color/odoo/addons/web_widget_color
  66. 6
      setup/web_widget_color/setup.py
  67. 1
      setup/web_widget_domain_editor_dialog/odoo/addons/web_widget_domain_editor_dialog
  68. 6
      setup/web_widget_domain_editor_dialog/setup.py
  69. 1
      setup/web_widget_image_download/odoo/addons/web_widget_image_download
  70. 6
      setup/web_widget_image_download/setup.py
  71. 1
      setup/web_widget_image_url/odoo/addons/web_widget_image_url
  72. 6
      setup/web_widget_image_url/setup.py
  73. 1
      setup/web_widget_many2many_tags_multi_selection/odoo/addons/web_widget_many2many_tags_multi_selection
  74. 6
      setup/web_widget_many2many_tags_multi_selection/setup.py
  75. 1
      setup/web_widget_x2many_2d_matrix/odoo/addons/web_widget_x2many_2d_matrix
  76. 6
      setup/web_widget_x2many_2d_matrix/setup.py
  77. 1
      setup/web_widget_x2many_2d_matrix_example/odoo/addons/web_widget_x2many_2d_matrix_example
  78. 6
      setup/web_widget_x2many_2d_matrix_example/setup.py
  79. 162
      web_advanced_search/README.rst
  80. 27
      web_advanced_search/__manifest__.py
  81. 24
      web_advanced_search/i18n/da.po
  82. 29
      web_advanced_search/i18n/de.po
  83. 29
      web_advanced_search/i18n/es.po
  84. 30
      web_advanced_search/i18n/fr.po
  85. 30
      web_advanced_search/i18n/hr.po
  86. 29
      web_advanced_search/i18n/nl.po
  87. 30
      web_advanced_search/i18n/nl_NL.po
  88. 31
      web_advanced_search/i18n/pt_BR.po
  89. 22
      web_advanced_search/i18n/web_advanced_search.pot
  90. 6
      web_advanced_search/readme/CONTRIBUTORS.rst
  91. 1
      web_advanced_search/readme/DESCRIPTION.rst
  92. 40
      web_advanced_search/readme/HISTORY.rst
  93. 10
      web_advanced_search/readme/ROADMAP.rst
  94. 21
      web_advanced_search/readme/USAGE.rst
  95. BIN
      web_advanced_search/static/description/icon.png
  96. 512
      web_advanced_search/static/description/index.html
  97. 86
      web_advanced_search/static/src/js/human_domain.js
  98. 348
      web_advanced_search/static/src/js/web_advanced_search.js
  99. 11
      web_advanced_search/static/src/xml/web_advanced_search.xml
  100. 13
      web_advanced_search/views/templates.xml

16
.coveragerc

@ -0,0 +1,16 @@
# Config file .coveragerc
[report]
include =
*/OCA/web/*
omit =
*/tests/*
*__init__.py
# Regexes for lines to exclude from consideration
exclude_lines =
# Have to re-enable the standard pragma
pragma: no cover
# Don't complain about null context checking
if context is None:

2
.gitignore

@ -13,6 +13,7 @@ build/
develop-eggs/
dist/
eggs/
lib/
lib64/
parts/
sdist/
@ -20,7 +21,6 @@ var/
*.egg-info/
.installed.cfg
*.egg
*.eggs
# Installer logs
pip-log.txt

30
.travis.yml

@ -1,36 +1,28 @@
language: python
python:
- "3.5"
- "2.7"
sudo: false
cache: pip
addons:
postgresql: "9.6"
apt:
packages:
- expect-dev # provides unbuffer utility
- python-lxml # because pip installation is slow
env:
global:
- VERSION="12.0" TESTS="0" LINT_CHECK="0" TRANSIFEX="0"
matrix:
- LINT_CHECK="1"
- TESTS="1" ODOO_REPO="OCA/OCB"
- TESTS="1" ODOO_REPO="odoo/odoo" MAKEPOT="1"
virtualenv:
system_site_packages: true
install:
- pip install anybox.testing.openerp
- git clone --depth=1 https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools
- export PATH=${HOME}/maintainer-quality-tools/travis:${PATH}
- travis_install_nightly
- git clone https://github.com/OCA/maintainer-quality-tools.git $HOME/maintainer-quality-tools
- export PATH=$HOME/maintainer-quality-tools/travis:$PATH
- travis_install_nightly 6.1
- pip install coveralls flake8
script:
- travis_run_tests
- travis_run_flake8
- travis_run_tests 6.1
after_success:
- travis_after_tests_success
coveralls

8
README.md

@ -1,6 +1,6 @@
[![Runbot Status](https://runbot.odoo-community.org/runbot/badge/flat/162/12.0.svg)](https://runbot.odoo-community.org/runbot/repo/github-com-oca-web-162)
[![Build Status](https://travis-ci.org/OCA/web.svg?branch=12.0)](https://travis-ci.org/OCA/web)
[![Coverage Status](https://coveralls.io/repos/OCA/web/badge.png?branch=12.0)](https://coveralls.io/r/OCA/web?branch=12.0)
[![Runbot Status](https://runbot.odoo-community.org/runbot/badge/flat/162/6.1.svg)](https://runbot.odoo-community.org/runbot/repo/github-com-oca-web-162)
[![Build Status](https://travis-ci.org/OCA/web.svg?branch=6.1)](https://travis-ci.org/OCA/web)
[![Coverage Status](https://coveralls.io/repos/OCA/web/badge.png?branch=6.1)](https://coveralls.io/r/OCA/web?branch=6.1)
Web addons for Odoo
===================
@ -11,5 +11,3 @@ This project aims to deal with modules related to the webclient of Odoo. You'll
- Add widgets
- Ease the import/export features
- Generally add clientside functionality

1
hide_duplicate_button/AUTHORS.txt

@ -0,0 +1 @@
Lorenzo Battistini <lorenzo.battistini@agilebg.com>

20
hide_duplicate_button/__init__.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2013 Agile Business Group sagl (<http://www.agilebg.com>)
# Copyright (C) 2013 Domsense srl (<http://www.domsense.com>)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################

43
hide_duplicate_button/__openerp__.py

@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright (C) 2013 Agile Business Group sagl (<http://www.agilebg.com>)
# Copyright (C) 2013 Domsense srl (<http://www.domsense.com>)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'Hide duplicate button',
'version': '0.1',
'category': 'Web',
'description': """As 'duplicate' button often produce inconveniences when
modules don't correctly handle the 'copy' methods, this module allow to hide
'duplicate' button for every form view""",
'author': "Agile Business Group,Odoo Community Association (OCA)",
'website': 'http://www.agilebg.com',
'license': 'AGPL-3',
'depends': [
'web',
],
'init_xml': [],
'update_xml': [],
'demo_xml': [],
'active': False,
'installable': True,
'css': [
"static/css/duplicate_button.css",
],
}

4
hide_duplicate_button/static/css/duplicate_button.css

@ -0,0 +1,4 @@
.openerp .oe_form_button_duplicate {
display:none;
}

2
setup/.setuptools-odoo-make-default-ignore

@ -1,2 +0,0 @@
# addons listed in this file are ignored by
# setuptools-odoo-make-default (one addon per line)

2
setup/README

@ -1,2 +0,0 @@
To learn more about this directory, please visit
https://pypi.python.org/pypi/setuptools-odoo

1
setup/_metapackage/VERSION.txt

@ -1 +0,0 @@
12.0.20190710.0

49
setup/_metapackage/setup.py

@ -1,49 +0,0 @@
import setuptools
with open('VERSION.txt', 'r') as f:
version = f.read().strip()
setuptools.setup(
name="odoo12-addons-oca-web",
description="Meta package for oca-web Odoo addons",
version=version,
install_requires=[
'odoo12-addon-web_advanced_search',
'odoo12-addon-web_company_color',
'odoo12-addon-web_decimal_numpad_dot',
'odoo12-addon-web_dialog_size',
'odoo12-addon-web_disable_export_group',
'odoo12-addon-web_edit_user_filter',
'odoo12-addon-web_editor_background_color',
'odoo12-addon-web_environment_ribbon',
'odoo12-addon-web_export_view',
'odoo12-addon-web_favicon',
'odoo12-addon-web_group_by_percentage',
'odoo12-addon-web_ir_actions_act_multi',
'odoo12-addon-web_ir_actions_act_view_reload',
'odoo12-addon-web_listview_range_select',
'odoo12-addon-web_m2x_options',
'odoo12-addon-web_no_bubble',
'odoo12-addon-web_notify',
'odoo12-addon-web_responsive',
'odoo12-addon-web_searchbar_full_width',
'odoo12-addon-web_switch_context_warning',
'odoo12-addon-web_timeline',
'odoo12-addon-web_tree_duplicate',
'odoo12-addon-web_tree_dynamic_colored_field',
'odoo12-addon-web_tree_image_tooltip',
'odoo12-addon-web_tree_many2one_clickable',
'odoo12-addon-web_tree_resize_column',
'odoo12-addon-web_widget_color',
'odoo12-addon-web_widget_domain_editor_dialog',
'odoo12-addon-web_widget_image_download',
'odoo12-addon-web_widget_image_url',
'odoo12-addon-web_widget_many2many_tags_multi_selection',
'odoo12-addon-web_widget_x2many_2d_matrix',
'odoo12-addon-web_widget_x2many_2d_matrix_example',
],
classifiers=[
'Programming Language :: Python',
'Framework :: Odoo',
]
)

1
setup/web_advanced_search/odoo/addons/web_advanced_search

@ -1 +0,0 @@
../../../../web_advanced_search

6
setup/web_advanced_search/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_company_color/odoo/addons/web_company_color

@ -1 +0,0 @@
../../../../web_company_color

6
setup/web_company_color/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_decimal_numpad_dot/odoo/addons/web_decimal_numpad_dot

@ -1 +0,0 @@
../../../../web_decimal_numpad_dot

6
setup/web_decimal_numpad_dot/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_dialog_size/odoo/addons/web_dialog_size

@ -1 +0,0 @@
../../../../web_dialog_size

6
setup/web_dialog_size/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_disable_export_group/odoo/addons/web_disable_export_group

@ -1 +0,0 @@
../../../../web_disable_export_group

6
setup/web_disable_export_group/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_edit_user_filter/odoo/addons/web_edit_user_filter

@ -1 +0,0 @@
../../../../web_edit_user_filter

6
setup/web_edit_user_filter/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_editor_background_color/odoo/addons/web_editor_background_color

@ -1 +0,0 @@
../../../../web_editor_background_color

6
setup/web_editor_background_color/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_environment_ribbon/odoo/addons/web_environment_ribbon

@ -1 +0,0 @@
../../../../web_environment_ribbon

6
setup/web_environment_ribbon/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_export_view/odoo/addons/web_export_view

@ -1 +0,0 @@
../../../../web_export_view

6
setup/web_export_view/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_favicon/odoo/addons/web_favicon

@ -1 +0,0 @@
../../../../web_favicon

6
setup/web_favicon/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_group_by_percentage/odoo/addons/web_group_by_percentage

@ -1 +0,0 @@
../../../../web_group_by_percentage

6
setup/web_group_by_percentage/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_ir_actions_act_multi/odoo/addons/web_ir_actions_act_multi

@ -1 +0,0 @@
../../../../web_ir_actions_act_multi

6
setup/web_ir_actions_act_multi/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_ir_actions_act_view_reload/odoo/addons/web_ir_actions_act_view_reload

@ -1 +0,0 @@
../../../../web_ir_actions_act_view_reload

6
setup/web_ir_actions_act_view_reload/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_listview_range_select/odoo/addons/web_listview_range_select

@ -1 +0,0 @@
../../../../web_listview_range_select

6
setup/web_listview_range_select/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_m2x_options/odoo/addons/web_m2x_options

@ -1 +0,0 @@
../../../../web_m2x_options

6
setup/web_m2x_options/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_no_bubble/odoo/addons/web_no_bubble

@ -1 +0,0 @@
../../../../web_no_bubble

6
setup/web_no_bubble/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_notify/odoo/addons/web_notify

@ -1 +0,0 @@
../../../../web_notify

6
setup/web_notify/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_responsive/odoo/addons/web_responsive

@ -1 +0,0 @@
../../../../web_responsive

6
setup/web_responsive/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_searchbar_full_width/odoo/addons/web_searchbar_full_width

@ -1 +0,0 @@
../../../../web_searchbar_full_width

6
setup/web_searchbar_full_width/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_switch_context_warning/odoo/addons/web_switch_context_warning

@ -1 +0,0 @@
../../../../web_switch_context_warning

6
setup/web_switch_context_warning/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_timeline/odoo/addons/web_timeline

@ -1 +0,0 @@
../../../../web_timeline

6
setup/web_timeline/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_tree_duplicate/odoo/addons/web_tree_duplicate

@ -1 +0,0 @@
../../../../web_tree_duplicate

6
setup/web_tree_duplicate/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_tree_dynamic_colored_field/odoo/addons/web_tree_dynamic_colored_field

@ -1 +0,0 @@
../../../../web_tree_dynamic_colored_field

6
setup/web_tree_dynamic_colored_field/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_tree_image_tooltip/odoo/addons/web_tree_image_tooltip

@ -1 +0,0 @@
../../../../web_tree_image_tooltip

6
setup/web_tree_image_tooltip/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_tree_many2one_clickable/odoo/addons/web_tree_many2one_clickable

@ -1 +0,0 @@
../../../../web_tree_many2one_clickable

6
setup/web_tree_many2one_clickable/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_tree_resize_column/odoo/addons/web_tree_resize_column

@ -1 +0,0 @@
../../../../web_tree_resize_column

6
setup/web_tree_resize_column/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_widget_color/odoo/addons/web_widget_color

@ -1 +0,0 @@
../../../../web_widget_color

6
setup/web_widget_color/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_widget_domain_editor_dialog/odoo/addons/web_widget_domain_editor_dialog

@ -1 +0,0 @@
../../../../web_widget_domain_editor_dialog

6
setup/web_widget_domain_editor_dialog/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_widget_image_download/odoo/addons/web_widget_image_download

@ -1 +0,0 @@
../../../../web_widget_image_download

6
setup/web_widget_image_download/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_widget_image_url/odoo/addons/web_widget_image_url

@ -1 +0,0 @@
../../../../web_widget_image_url

6
setup/web_widget_image_url/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_widget_many2many_tags_multi_selection/odoo/addons/web_widget_many2many_tags_multi_selection

@ -1 +0,0 @@
../../../../web_widget_many2many_tags_multi_selection

6
setup/web_widget_many2many_tags_multi_selection/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_widget_x2many_2d_matrix/odoo/addons/web_widget_x2many_2d_matrix

@ -1 +0,0 @@
../../../../web_widget_x2many_2d_matrix

6
setup/web_widget_x2many_2d_matrix/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

1
setup/web_widget_x2many_2d_matrix_example/odoo/addons/web_widget_x2many_2d_matrix_example

@ -1 +0,0 @@
../../../../web_widget_x2many_2d_matrix_example

6
setup/web_widget_x2many_2d_matrix_example/setup.py

@ -1,6 +0,0 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

162
web_advanced_search/README.rst

@ -1,162 +0,0 @@
===============
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/12.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-12-0/web-12-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/12.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.
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
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 <https://github.com/OCA/web/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 <https://github.com/OCA/web/issues/new?body=module:%20web_advanced_search%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Therp BV
* Tecnativa
Contributors
~~~~~~~~~~~~
* Holger Brunn <hbrunn@therp.nl>
* Vicent Cubells <vicent.cubells@tecnativa.com>
* Jairo Llopis <jairo.llopis@tecnativa.com>
* Rami Alwafaie <rami.alwafaie@initos.com>
* Jose Mª Bernet <josemaria.bernet@guadaltech.es>
* Simone Orsi <simone.orsi@camptocamp.com>
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 <https://github.com/OCA/web/tree/12.0/web_advanced_search>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

27
web_advanced_search/__manifest__.py

@ -1,27 +0,0 @@
# Copyright 2015 Therp BV <http://therp.nl>
# 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": "12.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,
}

24
web_advanced_search/i18n/da.po

@ -1,24 +0,0 @@
# 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 <hhg@gabelgaard.org>\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:8
#, python-format
msgid "Add Advanced Filter"
msgstr "Tilføj avanceret filter"

29
web_advanced_search/i18n/de.po

@ -1,29 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_advanced_search_x2x
#
# Translators:
# Rudolf Schnapka <rs@techno-flex.de>, 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: 2018-01-03 03:49+0000\n"
"Last-Translator: Rudolf Schnapka <rs@techno-flex.de>, 2018\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"
#. module: web_advanced_search
#. openerp-web
#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:8
#, python-format
msgid "Add Advanced Filter"
msgstr ""
#~ msgid "is in selection"
#~ msgstr "Ist in Auswahl"

29
web_advanced_search/i18n/es.po

@ -1,29 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_advanced_search_x2x
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 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: 2018-01-03 03:49+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\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"
#. module: web_advanced_search
#. openerp-web
#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:8
#, python-format
msgid "Add Advanced Filter"
msgstr ""
#~ msgid "is in selection"
#~ msgstr "está en la selección"

30
web_advanced_search/i18n/fr.po

@ -1,30 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_advanced_search_x2x
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 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 <kallard@efficom-lille.com>\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:8
#, python-format
msgid "Add Advanced Filter"
msgstr "Ajouter un filtre avancé"
#~ msgid "is in selection"
#~ msgstr "parmi la sélection"

30
web_advanced_search/i18n/hr.po

@ -1,30 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_advanced_search_x2x
#
# Translators:
# Bole <bole@dajmi5.com>, 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: 2018-01-03 03:49+0000\n"
"Last-Translator: Bole <bole@dajmi5.com>, 2017\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"
#. module: web_advanced_search
#. openerp-web
#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:8
#, python-format
msgid "Add Advanced Filter"
msgstr ""
#~ msgid "is in selection"
#~ msgstr "je u odabiru"

29
web_advanced_search/i18n/nl.po

@ -1,29 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_advanced_search_x2x
#
# Translators:
# OCA Transbot <transbot@odoo-community.org>, 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: 2018-01-03 03:49+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>, 2017\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"
#. module: web_advanced_search
#. openerp-web
#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:8
#, python-format
msgid "Add Advanced Filter"
msgstr ""
#~ msgid "is in selection"
#~ msgstr "is in selectie"

30
web_advanced_search/i18n/nl_NL.po

@ -1,30 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_advanced_search_x2x
#
# Translators:
# Peter Hageman <hageman.p@gmail.com>, 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: 2018-01-03 03:49+0000\n"
"Last-Translator: Peter Hageman <hageman.p@gmail.com>, 2017\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"
#. module: web_advanced_search
#. openerp-web
#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:8
#, python-format
msgid "Add Advanced Filter"
msgstr ""
#~ msgid "is in selection"
#~ msgstr "Is in selectie"

31
web_advanced_search/i18n/pt_BR.po

@ -1,31 +0,0 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web_advanced_search_x2x
#
# Translators:
# Rodrigo de Almeida Sottomaior Macedo <rmsolucoeseminformatic4@gmail.com>, 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: 2018-01-03 03:49+0000\n"
"Last-Translator: Rodrigo de Almeida Sottomaior Macedo "
"<rmsolucoeseminformatic4@gmail.com>, 2017\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"
#. module: web_advanced_search
#. openerp-web
#: code:addons/web_advanced_search/static/src/xml/web_advanced_search.xml:8
#, python-format
msgid "Add Advanced Filter"
msgstr ""
#~ msgid "is in selection"
#~ msgstr "Está em seleção"

22
web_advanced_search/i18n/web_advanced_search.pot

@ -1,22 +0,0 @@
# 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"
"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:8
#, python-format
msgid "Add Advanced Filter"
msgstr ""

6
web_advanced_search/readme/CONTRIBUTORS.rst

@ -1,6 +0,0 @@
* Holger Brunn <hbrunn@therp.nl>
* Vicent Cubells <vicent.cubells@tecnativa.com>
* Jairo Llopis <jairo.llopis@tecnativa.com>
* Rami Alwafaie <rami.alwafaie@initos.com>
* Jose Mª Bernet <josemaria.bernet@guadaltech.es>
* Simone Orsi <simone.orsi@camptocamp.com>

1
web_advanced_search/readme/DESCRIPTION.rst

@ -1 +0,0 @@
More powerful and easy to use search, especially for related fields.

40
web_advanced_search/readme/HISTORY.rst

@ -1,40 +0,0 @@
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]

10
web_advanced_search/readme/ROADMAP.rst

@ -1,10 +0,0 @@
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

21
web_advanced_search/readme/USAGE.rst

@ -1,21 +0,0 @@
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.

BIN
web_advanced_search/static/description/icon.png

Before

Width: 100  |  Height: 100  |  Size: 2.0 KiB

512
web_advanced_search/static/description/index.html

@ -1,512 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" />
<title>Advanced search</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* 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 }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="advanced-search">
<h1 class="title">Advanced search</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/web/tree/12.0/web_advanced_search"><img alt="OCA/web" src="https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/web-12-0/web-12-0-web_advanced_search"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/162/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>More powerful and easy to use search, especially for related fields.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="id4">Usage</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id5">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#changelog" id="id6">Changelog</a><ul>
<li><a class="reference internal" href="#id1" id="id7">11.0.1.0.2 (2018-10-31)</a></li>
<li><a class="reference internal" href="#id2" id="id8">11.0.1.0.1 (2018-09-18)</a></li>
<li><a class="reference internal" href="#id3" id="id9">11.0.1.0.0 (2018-07-20)</a></li>
</ul>
</li>
<li><a class="reference internal" href="#bug-tracker" id="id10">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id11">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id12">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id13">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id14">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id4">Usage</a></h1>
<p>To use this module, you need to:</p>
<ul class="simple">
<li>Open <em>Filters</em> in a search view</li>
<li>Select any relational field</li>
<li>Select operator <cite>is equal to</cite> or <cite>is not equal to</cite></li>
<li>The text field changes to a relational selection field where you
can search for the record in question</li>
<li>Click <em>Apply</em></li>
</ul>
<p>To search for properties of linked records (ie invoices for customers
with a credit limit higher than X):</p>
<ul class="simple">
<li>Open <em>Filters</em> in a search view</li>
<li>Select <em>Add Advanced Filter</em></li>
<li>Edit the advanced filter</li>
<li>Click <em>Save</em></li>
</ul>
<p>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.</p>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id5">Known issues / Roadmap</a></h1>
<p>Improvements to the <tt class="docutils literal">domain</tt> widget, not exclusively related to this addon:</p>
<ul class="simple">
<li>Use relational widgets when filtering a relational field</li>
<li>Allow to filter field names</li>
</ul>
<p>Improvements to the search view in this addon:</p>
<ul class="simple">
<li>Use widgets <tt class="docutils literal">one2many_tags</tt> when searching <tt class="docutils literal">one2many</tt> fields</li>
<li>Use widgets <tt class="docutils literal">many2many_tags</tt> when searching <tt class="docutils literal">many2many</tt> fields</li>
<li>Allow to edit current full search using the advanced domain editor</li>
</ul>
</div>
<div class="section" id="changelog">
<h1><a class="toc-backref" href="#id6">Changelog</a></h1>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id7">11.0.1.0.2 (2018-10-31)</a></h2>
<ul>
<li><p class="first">Fix initialization of 1st domain node</p>
<p>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.</p>
<p>[simahawk]</p>
</li>
</ul>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id8">11.0.1.0.1 (2018-09-18)</a></h2>
<ul>
<li><p class="first">Fix <cite>undefined</cite> in x2m fields</p>
<p>Before this patch, when searching with the “equals to” operator in any
x2many field, the searched parameter was always <cite>undefined</cite>.</p>
<p>The problem was that the underlying field manager implementation was
treating those fields as x2many, while the widget used was the <cite>one2many</cite>
one.</p>
<p>This patch simply mocks the underlying fake record to make think that
any relational field is always a <cite>one2many</cite>. This sets all pieces in
place and makes the field manager work as expected, and thus you can
search as expected too.</p>
</li>
<li><p class="first">Make linter happy</p>
<p>[Yajo]</p>
</li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id9">11.0.1.0.0 (2018-07-20)</a></h2>
<ul>
<li><p class="first">Rename, refactor, migrate to v11</p>
<p>[Yajo]</p>
</li>
</ul>
</div>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id10">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/web/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/web/issues/new?body=module:%20web_advanced_search%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id11">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id12">Authors</a></h2>
<ul class="simple">
<li>Therp BV</li>
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id13">Contributors</a></h2>
<ul class="simple">
<li>Holger Brunn &lt;<a class="reference external" href="mailto:hbrunn&#64;therp.nl">hbrunn&#64;therp.nl</a>&gt;</li>
<li>Vicent Cubells &lt;<a class="reference external" href="mailto:vicent.cubells&#64;tecnativa.com">vicent.cubells&#64;tecnativa.com</a>&gt;</li>
<li>Jairo Llopis &lt;<a class="reference external" href="mailto:jairo.llopis&#64;tecnativa.com">jairo.llopis&#64;tecnativa.com</a>&gt;</li>
<li>Rami Alwafaie &lt;<a class="reference external" href="mailto:rami.alwafaie&#64;initos.com">rami.alwafaie&#64;initos.com</a>&gt;</li>
<li>Jose Mª Bernet &lt;<a class="reference external" href="mailto:josemaria.bernet&#64;guadaltech.es">josemaria.bernet&#64;guadaltech.es</a>&gt;</li>
<li>Simone Orsi &lt;<a class="reference external" href="mailto:simone.orsi&#64;camptocamp.com">simone.orsi&#64;camptocamp.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id14">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/web/tree/12.0/web_advanced_search">OCA/web</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

86
web_advanced_search/static/src/js/human_domain.js

@ -1,86 +0,0 @@
/* Copyright 2018 Tecnativa - Jairo Llopis
* License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
odoo.define("web_advanced_search.human_domain", function (require) {
"use strict";
var DomainSelector = require("web.DomainSelector");
var join_mapping = {
"&": _(" and "),
"|": _(" or "),
"!": _(" is not "),
};
// HACK I should extend classes, but they are not exposed
// TODO Remove file when merged https://github.com/odoo/odoo/pull/25922
var human_domain_methods = {
DomainTree: function () {
var human_domains = [];
_.each(this.children, function (child) {
human_domains.push(
human_domain_methods[child.template].apply(child)
);
});
return _.str.sprintf(
"(%s)",
human_domains.join(join_mapping[this.operator])
);
},
DomainSelector: function () {
var result = human_domain_methods.DomainTree.apply(this, arguments);
// Remove surrounding parenthesis
return result.slice(1, -1);
},
DomainLeaf: function () {
var chain = [],
operator = this.operator_mapping[this.operator],
value = _.str.sprintf('"%s"', this.value);
// Humanize chain
this.chain.split(".").forEach(function (element, index) {
chain.push(
_.findWhere(
this.fieldSelector.pages[index],
{name: element}
).string || element
);
}, this);
// 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 = _.str.sprintf('["%s"]', this.value.join('", "'));
}
return _.str.sprintf(
"%s %s %s",
chain.join("→"),
operator || this.operator,
value
).trim();
},
};
function getHumanDomain (parent, model, domain, options) {
var domain_selector = new DomainSelector(
parent,
model,
domain,
options
);
var dummy_parent = $("<div>");
domain_selector.appendTo(dummy_parent);
var result = human_domain_methods.DomainSelector.apply(
domain_selector
);
domain_selector.destroy();
dummy_parent.destroy();
return result;
}
return {
getHumanDomain: getHumanDomain,
};
});

348
web_advanced_search/static/src/js/web_advanced_search.js

@ -1,348 +0,0 @@
/* Copyright 2015 Therp BV <http://therp.nl>
* Copyright 2017-2018 Jairo Llopis <jairo.llopis@tecnativa.com>
* License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
odoo.define("web_advanced_search", function (require) {
"use strict";
var core = require("web.core");
var Domain = require("web.Domain");
var DomainSelectorDialog = require("web.DomainSelectorDialog");
var field_registry = require("web.field_registry");
var FieldManagerMixin = require("web.FieldManagerMixin");
var FiltersMenu = require("web.FiltersMenu");
var human_domain = require("web_advanced_search.human_domain");
var SearchView = require("web.SearchView");
var Widget = require("web.Widget");
var Char = core.search_filters_registry.get("char");
SearchView.include({
custom_events: _.extend({}, SearchView.prototype.custom_events, {
"get_dataset": "_on_get_dataset",
}),
/**
* Add or update a `dataset` attribute in event target
*
* The search view dataset includes things such as the model, which
* is required to make some parts of search views smarter.
*
* @param {OdooEvent} event The target will get the dataset.
*/
_on_get_dataset: function (event) {
event.target.dataset = this.dataset;
event.stopPropagation();
},
});
/**
* An almost dummy search proposition, to use with domain widget
*/
var AdvancedSearchProposition = Widget.extend({
/**
* @override
*/
init: function (parent, model, domain) {
this._super(parent);
this.model = model;
this.domain = new Domain(domain);
},
/**
* Produce a filter descriptor for advanced searches.
*
* @returns {Object} In the format expected by `web.FiltersMenu`.
*/
get_filter: function () {
var domain_array = this.domain.toArray();
return {
attrs: {
domain: domain_array,
// TODO Remove when merged
// https://github.com/odoo/odoo/pull/25922
string: human_domain.getHumanDomain(
this,
this.model,
domain_array
),
},
children: [],
tag: "filter",
};
},
});
// Add advanced search features
FiltersMenu.include({
custom_events: _.extend({}, FiltersMenu.prototype.custom_events, {
"domain_selected": "advanced_search_commit",
}),
events: _.extend({}, FiltersMenu.prototype.events, {
"click .o_add_advanced_search": "advanced_search_open",
}),
/**
* @override
*/
init: function () {
this._super.apply(this, arguments);
this.trigger_up("get_dataset");
},
/**
* Open advanced search dialog
*
* @returns {$.Deferred} The opening dialog itself.
*/
advanced_search_open: function () {
var domain_selector_dialog = new DomainSelectorDialog(
this,
this.dataset.model,
"[]",
{
debugMode: core.debug,
readonly: false,
}
);
domain_selector_dialog.opened(function () {
// Add 1st domain node by default
domain_selector_dialog.domainSelector._onAddFirstButtonClick();
});
return domain_selector_dialog.open();
},
/**
* Apply advanced search on dialog save
*
* @param {OdooEvent} event A `domain_selected` event from the dialog.
*/
advanced_search_commit: function (event) {
_.invoke(this.propositions, "destroy");
var proposition = new AdvancedSearchProposition(
this,
this.dataset.model,
event.data.domain
);
this.propositions = [proposition];
this._commitSearch();
},
});
/**
* A search field for relational fields.
*
* It implements and extends the `FieldManagerMixin`, and acts as if it
* were a reduced dummy controller. Some actions "mock" the underlying
* model, since sometimes we use a char widget to fill related fields
* (which is not supported by that widget), and fields need an underlying
* model implementation, which can only hold fake data, given a search view
* has no data on it by definition.
*/
var Relational = Char.extend(FieldManagerMixin, {
tagName: "div",
className: "x2x_container",
attributes: {},
/**
* @override
*/
init: function () {
this._super.apply(this, arguments);
// To make widgets work, we need a model and an empty record
FieldManagerMixin.init.call(this);
this.trigger_up("get_dataset");
// Make equal and not equal appear 1st and 2nd
this.operators = _.sortBy(
this.operators,
function (op) {
switch (op.value) {
case "=":
return -2;
case "!=":
return -1;
default:
return 0;
}
});
// Create dummy record with only the field the user is searching
var params = {
fieldNames: [this.field.name],
modelName: this.dataset.model,
context: this.dataset.context,
fields: {},
type: "record",
viewType: "default",
fieldsInfo: {
default: {},
},
};
// See https://stackoverflow.com/a/11508530/1468388
// to know how to include this in the previous step in ES6
params.fields[this.field.name] = _.omit(
this.field,
// User needs all records, to actually produce a new domain
"domain",
// Onchanges make no sense in this context, there's no record
"onChange"
);
if (this.field.type.endsWith("2many")) {
// X2many fields behave like m2o in the search context
params.fields[this.field.name].type = "many2one";
}
params.fieldsInfo.default[this.field.name] = {};
// Emulate `model.load()`, without RPC-calling `default_get()`
this.datapoint_id = this.model._makeDataPoint(params).id;
this.model.applyDefaultValues(
this.datapoint_id,
{},
params.fieldNames
);
// To generate a new fake ID
this._fake_id = -1;
},
/**
* @override
*/
start: function () {
var result = this._super.apply(this, arguments);
// Render the initial widget
result.done($.proxy(this, "show_inputs", $("<input value='='/>")));
return result;
},
/**
* @override
*/
destroy: function () {
if (this._field_widget) {
this._field_widget.destroy();
}
this.model.destroy();
delete this.record;
return this._super.apply(this, arguments);
},
/**
* Get record object for current datapoint.
*
* @returns {Object}
*/
_get_record: function () {
return this.model.get(this.datapoint_id);
},
/**
* @override
*/
show_inputs: function ($operator) {
// Get widget class to be used
switch ($operator.val()) {
case "=":
case "!=":
this._field_widget_name = "many2one";
break;
default:
this._field_widget_name = "char";
}
var _Widget = field_registry.get(this._field_widget_name);
// Destroy previous widget, if any
if (this._field_widget) {
this._field_widget.destroy();
delete this._field_widget;
}
// Create new widget
var options = {
mode: "edit",
attrs: {
options: {
no_create_edit: true,
no_create: true,
no_open: true,
no_quick_create: true,
},
},
};
this._field_widget = new _Widget(
this,
this.field.name,
this._get_record(),
options
);
this._field_widget.appendTo(this.$el);
return this._super.apply(this, arguments);
},
/**
* @override
*/
_applyChanges: function (dataPointID, changes, event) {
// Make char updates look like valid x2one updates
if (_.isNaN(changes[this.field.name].id)) {
changes[this.field.name] = {
id: this._fake_id--,
display_name: event.target.lastSetValue,
};
}
return FieldManagerMixin._applyChanges.apply(this, arguments);
},
/**
* @override
*/
_confirmChange: function (id, fields, event) {
this.datapoint_id = id;
return this._field_widget.reset(this._get_record(), event);
},
/**
* @override
*/
get_value: function () {
try {
switch (this._field_widget_name) {
case "many2one":
return this._field_widget.value.res_id;
default:
return this._field_widget.value.data.display_name;
}
} catch (error) {
if (error.name === "TypeError") {
return false;
}
}
},
/**
* Extract the field's value in a human-readable format.
*
* @override
*/
toString: function () {
try {
switch (this._field_widget_name) {
case "many2one":
return this._field_widget.value.data.display_name;
}
return this._super.apply(this, arguments);
} catch (error) {
if (error.name === "TypeError") {
return "";
}
}
},
});
// Register search filter widgets
core.search_filters_registry
.add("many2many", Relational)
.add("many2one", Relational)
.add("one2many", Relational);
return {
AdvancedSearchProposition: AdvancedSearchProposition,
Relational: Relational,
};
});

11
web_advanced_search/static/src/xml/web_advanced_search.xml

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2017-2018 Jairo Llopis <jairo.llopis@tecnativa.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<templates>
<t t-extend="FiltersMenuGenerator">
<t t-jquery=".o_add_filter_menu" t-operation="after">
<div role="separator" class="dropdown-divider"/>
<a class="dropdown-item o_add_advanced_search">Add Advanced Filter</a>
</t>
</t>
</templates>

13
web_advanced_search/views/templates.xml

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2017-2018 Jairo Llopis <jairo.llopis@tecnativa.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<template id="assets_backend" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/web_advanced_search/static/src/js/human_domain.js"/>
<script type="text/javascript" src="/web_advanced_search/static/src/js/web_advanced_search.js"/>
</xpath>
</template>
</odoo>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save