From 53fddf87c890dfa4fd8d80db2732f1c9b9784274 Mon Sep 17 00:00:00 2001 From: Ernad Husremovic Date: Sat, 30 Aug 2025 17:27:15 +0200 Subject: [PATCH] Add oca-web submodule with 68 web modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../README.md | 47 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 6 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../web_action_conditionable/README.rst | 104 +++ .../web_action_conditionable/__init__.py | 0 .../web_action_conditionable/__manifest__.py | 16 + .../web_action_conditionable/i18n/es.po | 0 .../web_action_conditionable/i18n/hr.po | 0 .../web_action_conditionable/i18n/it.po | 14 + .../i18n/web_action_conditionable.pot | 13 + .../web_action_conditionable/i18n/zh_CN.po | 0 .../readme/CONTRIBUTORS.rst | 7 + .../readme/CREDITS.rst | 1 + .../readme/DESCRIPTION.rst | 1 + .../web_action_conditionable/readme/USAGE.rst | 13 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 451 ++++++++++++ .../src/components/field_one2many.esm.js | 37 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_advanced_search/README.rst | 193 +++++ .../web_advanced_search/__init__.py | 0 .../web_advanced_search/__manifest__.py | 23 + .../web_advanced_search/i18n/bs.po | 56 ++ .../web_advanced_search/i18n/da.po | 59 ++ .../web_advanced_search/i18n/de.po | 65 ++ .../web_advanced_search/i18n/es.po | 65 ++ .../web_advanced_search/i18n/fr.po | 65 ++ .../web_advanced_search/i18n/hr.po | 66 ++ .../web_advanced_search/i18n/it.po | 59 ++ .../web_advanced_search/i18n/nl.po | 65 ++ .../web_advanced_search/i18n/nl_NL.po | 66 ++ .../web_advanced_search/i18n/pl.po | 60 ++ .../web_advanced_search/i18n/pt.po | 59 ++ .../web_advanced_search/i18n/pt_BR.po | 67 ++ .../web_advanced_search/i18n/tr.po | 59 ++ .../i18n/web_advanced_search.pot | 56 ++ .../web_advanced_search/i18n/zh_CN.po | 59 ++ .../readme/CONTRIBUTORS.rst | 18 + .../readme/DESCRIPTION.rst | 1 + .../web_advanced_search/readme/HISTORY.rst | 40 ++ .../web_advanced_search/readme/ROADMAP.rst | 14 + .../web_advanced_search/readme/USAGE.rst | 24 + .../static/description/icon.png | Bin 0 -> 2053 bytes .../static/description/index.html | 551 +++++++++++++++ .../static/img/debug_mode.png | Bin 0 -> 16604 bytes .../static/src/js/DomainSelector.esm.js | 57 ++ .../static/src/js/RecordPicker.esm.js | 202 ++++++ .../static/src/js/dropdown.esm.js | 21 + .../static/src/js/utils.esm.js | 58 ++ .../control_panel/advanced_filter_item.esm.js | 59 ++ .../control_panel/custom_filter_item.esm.js | 95 +++ .../js/control_panel/filter_menu.esm.js | 20 + .../filter_menu/advanced_filter_item.esm.js | 57 ++ .../filter_menu/advanced_filter_item.xml | 15 + .../filter_menu/custom_filter_item.esm.js | 105 +++ .../search/filter_menu/custom_filter_item.xml | 22 + .../src/search/filter_menu/filter_menu.esm.js | 16 + .../src/search/filter_menu/filter_menu.xml | 18 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_apply_field_style/README.rst | 101 +++ .../web_apply_field_style/__init__.py | 6 + .../web_apply_field_style/__manifest__.py | 15 + .../web_apply_field_style/demo/__init__.py | 1 + .../web_apply_field_style/demo/base.py | 30 + .../web_apply_field_style/i18n/bs.po | 19 + .../web_apply_field_style/i18n/es.po | 22 + .../web_apply_field_style/i18n/it.po | 22 + .../i18n/web_apply_field_style.pot | 19 + .../web_apply_field_style/models/__init__.py | 1 + .../web_apply_field_style/models/base.py | 55 ++ .../readme/CONFIGURE.rst | 15 + .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 6 + .../static/description/demo.png | Bin 0 -> 48605 bytes .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 449 ++++++++++++ .../web_apply_field_style/tests/__init__.py | 1 + .../tests/test_module.py | 54 ++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_calendar_slot_duration/README.rst | 124 ++++ .../web_calendar_slot_duration/__init__.py | 0 .../__manifest__.py | 22 + .../web_calendar_slot_duration/i18n/de.po | 0 .../web_calendar_slot_duration/i18n/it.po | 14 + .../web_calendar_slot_duration/i18n/pt_BR.po | 0 .../i18n/web_calendar_slot_duration.pot | 13 + .../readme/CONFIGURE.rst | 20 + .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 3 + .../readme/ROADMAP.rst | 1 + .../readme/USAGE.rst | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 465 ++++++++++++ .../src/js/calendar_common_renderer.esm.js | 24 + .../static/src/js/calendar_model.esm.js | 32 + .../README.md | 47 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 6 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../web_chatter_position/README.rst | 89 +++ .../web_chatter_position/__init__.py | 1 + .../web_chatter_position/__manifest__.py | 19 + .../web_chatter_position/i18n/bs.po | 39 ++ .../web_chatter_position/i18n/ca.po | 42 ++ .../web_chatter_position/i18n/de.po | 42 ++ .../web_chatter_position/i18n/es.po | 42 ++ .../web_chatter_position/i18n/fr.po | 42 ++ .../web_chatter_position/i18n/hr.po | 43 ++ .../web_chatter_position/i18n/it.po | 42 ++ .../web_chatter_position/i18n/nl.po | 42 ++ .../web_chatter_position/i18n/pt_BR.po | 42 ++ .../web_chatter_position/i18n/tr.po | 42 ++ .../i18n/web_chatter_position.pot | 39 ++ .../migrations/16.0.1.0.3/post-migration.py | 21 + .../web_chatter_position/models/__init__.py | 1 + .../web_chatter_position/models/res_users.py | 25 + .../readme/CONTRIBUTORS.rst | 5 + .../readme/DESCRIPTION.rst | 3 + .../web_chatter_position/readme/USAGE.rst | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 436 ++++++++++++ .../static/src/js/web_chatter_position.esm.js | 165 +++++ .../web_chatter_position/views/res_users.xml | 12 + .../web_chatter_position/views/web.xml | 12 + .../README.md | 47 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 6 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 13 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../web_company_color/README.rst | 98 +++ .../web_company_color/__init__.py | 5 + .../web_company_color/__manifest__.py | 18 + .../web_company_color/hooks.py | 15 + .../web_company_color/i18n/bs.po | 97 +++ .../web_company_color/i18n/ca.po | 101 +++ .../web_company_color/i18n/de.po | 128 ++++ .../web_company_color/i18n/es.po | 118 ++++ .../web_company_color/i18n/fr.po | 104 +++ .../web_company_color/i18n/hr.po | 115 +++ .../web_company_color/i18n/it.po | 117 ++++ .../web_company_color/i18n/nl.po | 118 ++++ .../web_company_color/i18n/pt.po | 103 +++ .../i18n/web_company_color.pot | 97 +++ .../web_company_color/i18n/zh_CN.po | 114 +++ .../migrations/16.0.1.2.1/post-migration.py | 9 + .../web_company_color/models/__init__.py | 5 + .../web_company_color/models/assetsbundle.py | 22 + .../web_company_color/models/ir_qweb.py | 38 + .../web_company_color/models/res_company.py | 231 ++++++ .../web_company_color/readme/CONTRIBUTORS.rst | 11 + .../web_company_color/readme/DESCRIPTION.rst | 1 + .../web_company_color/readme/ROADMAP.rst | 1 + .../web_company_color/readme/USAGE.rst | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 445 ++++++++++++ .../web_company_color/tests/__init__.py | 1 + .../tests/test_res_company.py | 77 ++ .../web_company_color/utils.py | 40 ++ .../web_company_color/view/assets.xml | 19 + .../web_company_color/view/res_company.xml | 46 ++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_copy_confirm/README.rst | 86 +++ .../web_copy_confirm/__init__.py | 0 .../web_copy_confirm/__manifest__.py | 23 + .../web_copy_confirm/i18n/bs.po | 28 + .../web_copy_confirm/i18n/de.po | 31 + .../web_copy_confirm/i18n/fr.po | 31 + .../web_copy_confirm/i18n/it.po | 31 + .../i18n/web_copy_confirm.pot | 28 + .../web_copy_confirm/readme/CONTRIBUTORS.rst | 3 + .../web_copy_confirm/readme/DESCRIPTION.rst | 2 + .../web_copy_confirm/readme/HISTORY.rst | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 436 ++++++++++++ .../static/src/js/web_copy_confirm.esm.js | 23 + .../static/tests/confirm_tests.js | 91 +++ odoo-bringout-oca-web-web_dark_mode/README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 13 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_dark_mode/README.rst | 82 +++ .../web_dark_mode/__init__.py | 4 + .../web_dark_mode/__manifest__.py | 28 + .../web_dark_mode/i18n/bs.po | 37 + .../web_dark_mode/i18n/es.po | 40 ++ .../web_dark_mode/i18n/es_AR.po | 40 ++ .../web_dark_mode/i18n/fr.po | 40 ++ .../web_dark_mode/i18n/hr.po | 41 ++ .../web_dark_mode/i18n/it.po | 40 ++ .../web_dark_mode/i18n/tr.po | 40 ++ .../web_dark_mode/i18n/web_dark_mode.pot | 37 + .../web_dark_mode/i18n/zh.po | 38 + .../web_dark_mode/models/__init__.py | 4 + .../web_dark_mode/models/ir_http.py | 23 + .../web_dark_mode/models/res_users.py | 26 + .../web_dark_mode/readme/CONTRIBUTORS.rst | 1 + .../web_dark_mode/readme/DESCRIPTION.rst | 2 + .../web_dark_mode/readme/ROADMAP.rst | 1 + .../web_dark_mode/static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 429 ++++++++++++ .../static/src/js/switch_item.esm.js | 49 ++ .../static/src/scss/variables.scss | 65 ++ .../web_dark_mode/tests/__init__.py | 4 + .../web_dark_mode/tests/test_dark_mode.py | 35 + .../web_dark_mode/views/res_users_views.xml | 14 + .../README.md | 47 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 6 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 13 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 42 ++ .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../web_dashboard_tile/README.rst | 168 +++++ .../web_dashboard_tile/__init__.py | 1 + .../web_dashboard_tile/__manifest__.py | 36 + .../web_dashboard_tile/demo/tile_category.xml | 16 + .../web_dashboard_tile/demo/tile_tile.xml | 33 + .../web_dashboard_tile/i18n/bs.po | 422 +++++++++++ .../web_dashboard_tile/i18n/fr.po | 424 +++++++++++ .../web_dashboard_tile/i18n/it.po | 434 ++++++++++++ .../i18n/web_dashboard_tile.pot | 422 +++++++++++ .../web_dashboard_tile/models/__init__.py | 2 + .../models/tile_category.py | 107 +++ .../web_dashboard_tile/models/tile_tile.py | 377 ++++++++++ .../web_dashboard_tile/readme/CONFIGURE.rst | 30 + .../readme/CONTRIBUTORS.rst | 3 + .../web_dashboard_tile/readme/DESCRIPTION.rst | 16 + .../web_dashboard_tile/readme/ROADMAP.rst | 14 + .../web_dashboard_tile/readme/USAGE.rst | 9 + .../security/ir.model.access.csv | 3 + .../web_dashboard_tile/security/ir_rule.xml | 20 + .../static/description/icon.png | Bin 0 -> 1044 bytes .../static/description/index.html | 497 +++++++++++++ .../static/description/tile_category_form.png | Bin 0 -> 17806 bytes .../description/tile_tile_2_tree_view.png | Bin 0 -> 86859 bytes .../static/description/tile_tile_form.png | Bin 0 -> 32306 bytes .../tile_tile_form_secondary_value.png | Bin 0 -> 23144 bytes .../static/description/tile_tile_kanban.png | Bin 0 -> 5736 bytes .../static/src/css/web_dashboard_tile.css | 46 ++ .../web_dashboard_tile/tests/__init__.py | 1 + .../web_dashboard_tile/tests/test_tile.py | 63 ++ .../web_dashboard_tile/views/menu.xml | 11 + .../views/tile_category.xml | 73 ++ .../web_dashboard_tile/views/tile_tile.xml | 231 ++++++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../README.rst | 122 ++++ .../__init__.py | 0 .../__manifest__.py | 21 + .../i18n/it.po | 14 + .../i18n/web_datetime_picker_default_time.pot | 13 + .../readme/CONTRIBUTORS.md | 2 + .../readme/DESCRIPTION.md | 7 + .../readme/ROADMAP.md | 1 + .../readme/USAGE.md | 21 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 460 ++++++++++++ .../static/src/js/datepicker.esm.js | 58 ++ .../static/src/js/datetime_field.esm.js | 42 ++ .../static/src/xml/datetime_field.xml | 8 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 44 ++ .../web_dialog_size/README.rst | 112 +++ .../web_dialog_size/__init__.py | 1 + .../web_dialog_size/__manifest__.py | 33 + .../web_dialog_size/i18n/bs.po | 19 + .../web_dialog_size/i18n/de.po | 31 + .../web_dialog_size/i18n/es.po | 25 + .../web_dialog_size/i18n/fr.po | 25 + .../web_dialog_size/i18n/hr.po | 23 + .../web_dialog_size/i18n/it.po | 31 + .../web_dialog_size/i18n/nl.po | 31 + .../web_dialog_size/i18n/tr.po | 22 + .../web_dialog_size/i18n/web_dialog_size.pot | 19 + .../web_dialog_size/i18n/zh_CN.po | 22 + .../web_dialog_size/models/__init__.py | 1 + .../models/ir_config_parameter.py | 18 + .../web_dialog_size/readme/CONFIGURE.rst | 6 + .../web_dialog_size/readme/CONTRIBUTORS.rst | 16 + .../web_dialog_size/readme/DESCRIPTION.rst | 3 + .../web_dialog_size/readme/ROADMAP.rst | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 465 ++++++++++++ .../static/src/js/web_dialog_draggable.esm.js | 50 ++ .../static/src/js/web_dialog_size.esm.js | 96 +++ .../static/src/js/web_dialog_size.js | 50 ++ .../static/src/scss/web_dialog_size.scss | 16 + .../static/src/xml/DialogDraggable.xml | 8 + .../static/src/xml/ExpandButton.xml | 21 + .../static/src/xml/web_dialog_size.xml | 65 ++ .../web_dialog_size/tests/__init__.py | 1 + .../tests/test_web_dialog_size.py | 20 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 13 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 42 ++ .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_disable_export_group/README.rst | 107 +++ .../web_disable_export_group/__init__.py | 1 + .../web_disable_export_group/__manifest__.py | 24 + .../web_disable_export_group/i18n/bs.po | 29 + .../web_disable_export_group/i18n/es.po | 43 ++ .../web_disable_export_group/i18n/hr.po | 47 ++ .../web_disable_export_group/i18n/it.po | 32 + .../web_disable_export_group/i18n/pt.po | 46 ++ .../i18n/web_disable_export_group.pot | 29 + .../web_disable_export_group/i18n/zh_CN.po | 46 ++ .../models/__init__.py | 2 + .../models/ir_http.py | 20 + .../web_disable_export_group/models/models.py | 23 + .../readme/CONFIGURE.rst | 2 + .../readme/CONTRIBUTORS.rst | 12 + .../readme/DESCRIPTION.rst | 7 + .../web_disable_export_group/readme/USAGE.rst | 3 + .../security/groups.xml | 19 + .../security/ir.model.access.csv | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 453 ++++++++++++ .../static/src/js/abstract_controller.esm.js | 26 + .../static/src/js/list_controller.esm.js | 20 + .../static/src/xml/export_xls_views.xml | 17 + .../web_disable_export_group_tour.esm.js | 33 + .../tests/__init__.py | 1 + .../tests/test_tour.py | 35 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../web_domain_field/README.rst | 157 +++++ .../web_domain_field/__init__.py | 0 .../web_domain_field/__manifest__.py | 23 + .../web_domain_field/i18n/it.po | 14 + .../i18n/web_domain_field.pot | 13 + .../web_domain_field/readme/CONTRIBUTORS.rst | 3 + .../web_domain_field/readme/DESCRIPTION.rst | 8 + .../web_domain_field/readme/USAGE.rst | 68 ++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 497 +++++++++++++ .../static/tests/test_qunit.js | 129 ++++ .../web_domain_field/tests/__init__.py | 1 + .../web_domain_field/tests/test_qunit.py | 16 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 34 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_editor_class_selector/README.rst | 86 +++ .../web_editor_class_selector/__init__.py | 1 + .../web_editor_class_selector/__manifest__.py | 32 + .../demo/web_editor_class_demo.xml | 17 + .../web_editor_class_selector/i18n/bs.po | 115 +++ .../web_editor_class_selector/i18n/it.po | 118 ++++ .../i18n/web_editor_class_selector.pot | 115 +++ .../models/__init__.py | 1 + .../models/web_editor_class.py | 19 + .../readme/DESCRIPTION.rst | 2 + .../readme/ROADMAP.rst | 1 + .../readme/USAGE.rst | 5 + .../security/ir.model.access.csv | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 433 ++++++++++++ .../static/src/js/backend/html_field.esm.js | 27 + .../src/js/odoo-editor/OdooEditor.esm.js | 68 ++ .../static/src/js/odoo-editor/commands.esm.js | 12 + .../static/src/js/odoo-editor/utils.esm.js | 37 + .../static/src/js/wysiwyg/wysiwyg.esm.js | 25 + .../static/src/scss/demo_styles.scss | 21 + .../static/src/xml/web_editor.xml | 33 + .../web_editor_class_selector/views/menus.xml | 11 + .../views/web_editor_class_views.xml | 62 ++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_environment_ribbon/README.rst | 101 +++ .../web_environment_ribbon/__init__.py | 1 + .../web_environment_ribbon/__manifest__.py | 27 + .../data/ribbon_data.xml | 20 + .../web_environment_ribbon/i18n/bs.po | 19 + .../web_environment_ribbon/i18n/ca.po | 31 + .../web_environment_ribbon/i18n/de.po | 34 + .../web_environment_ribbon/i18n/es.po | 31 + .../web_environment_ribbon/i18n/fr.po | 34 + .../web_environment_ribbon/i18n/hr.po | 35 + .../web_environment_ribbon/i18n/it.po | 22 + .../web_environment_ribbon/i18n/nl.po | 31 + .../web_environment_ribbon/i18n/nl_NL.po | 35 + .../web_environment_ribbon/i18n/pt.po | 31 + .../web_environment_ribbon/i18n/pt_BR.po | 35 + .../web_environment_ribbon/i18n/sl.po | 28 + .../i18n/web_environment_ribbon.pot | 19 + .../web_environment_ribbon/i18n/zh.po | 20 + .../web_environment_ribbon/i18n/zh_CN.po | 31 + .../web_environment_ribbon/models/__init__.py | 1 + .../models/web_environment_ribbon_backend.py | 36 + .../readme/CONFIGURE.rst | 8 + .../readme/CONTRIBUTORS.rst | 7 + .../readme/DESCRIPTION.rst | 1 + .../web_environment_ribbon/readme/USAGE.rst | 2 + .../static/description/icon.png | Bin 0 -> 9272 bytes .../static/description/index.html | 448 ++++++++++++ .../static/description/screenshot.png | Bin 0 -> 43941 bytes .../static/src/css/ribbon.css | 36 + .../static/src/js/ribbon.js | 62 ++ .../web_environment_ribbon/tests/__init__.py | 3 + .../tests/test_environment_ribbon_data.py | 26 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_field_numeric_formatting/README.rst | 97 +++ .../web_field_numeric_formatting/__init__.py | 0 .../__manifest__.py | 24 + .../web_field_numeric_formatting/i18n/it.po | 14 + .../i18n/web_field_numeric_formatting.pot | 13 + .../readme/CONTRIBUTORS.rst | 3 + .../readme/DESCRIPTION.rst | 20 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 437 ++++++++++++ .../static/src/components/float_field.esm.js | 30 + .../src/components/integer_field.esm.js | 30 + .../src/components/list_renderer.esm.js | 13 + .../static/tests/field_tests.esm.js | 159 +++++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 15 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 77 ++ .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../web_field_tooltip/README.rst | 99 +++ .../web_field_tooltip/__init__.py | 1 + .../web_field_tooltip/__manifest__.py | 32 + .../web_field_tooltip/i18n/bs.po | 160 +++++ .../web_field_tooltip/i18n/fr.po | 188 +++++ .../web_field_tooltip/i18n/it.po | 164 +++++ .../i18n/web_field_tooltip.pot | 160 +++++ .../web_field_tooltip/models/__init__.py | 4 + .../web_field_tooltip/models/base.py | 29 + .../web_field_tooltip/models/ir_http.py | 19 + .../models/ir_model_fields_tooltip.py | 77 ++ .../web_field_tooltip/models/res_users.py | 37 + .../web_field_tooltip/readme/CONTRIBUTORS.rst | 1 + .../web_field_tooltip/readme/DESCRIPTION.rst | 2 + .../web_field_tooltip/readme/ROADMAP.rst | 1 + .../web_field_tooltip/readme/USAGE.rst | 13 + .../security/ir_model_access.xml | 46 ++ .../web_field_tooltip/security/res_groups.xml | 16 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 444 ++++++++++++ .../field_tooltip/field_tooltip.esm.js | 86 +++ .../field_tooltip/field_tooltip.scss | 35 + .../field_tooltip/field_tooltip.xml | 29 + .../src/views/form/form_controller.esm.js | 34 + .../static/src/views/form/form_label.esm.js | 34 + .../static/src/views/form/form_label.xml | 17 + .../src/views/list/list_renderer.esm.js | 36 + .../static/src/views/list/list_renderer.xml | 28 + .../web_field_tooltip/tests/__init__.py | 1 + .../tests/test_web_field_tooltip.py | 48 ++ .../views/ir_model_fields_tooltip.xml | 85 +++ .../web_field_tooltip/views/res_users.xml | 22 + .../web_field_tooltip/views/template.xml | 30 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_group_expand/README.rst | 92 +++ .../web_group_expand/__init__.py | 0 .../web_group_expand/__manifest__.py | 20 + .../web_group_expand/i18n/bs.po | 30 + .../web_group_expand/i18n/ca.po | 39 ++ .../web_group_expand/i18n/de.po | 39 ++ .../web_group_expand/i18n/es.po | 39 ++ .../web_group_expand/i18n/fr.po | 31 + .../web_group_expand/i18n/it.po | 31 + .../web_group_expand/i18n/nl.po | 39 ++ .../web_group_expand/i18n/pt_BR.po | 39 ++ .../i18n/web_group_expand.pot | 30 + .../web_group_expand/readme/CONTRIBUTORS.rst | 8 + .../web_group_expand/readme/DESCRIPTION.rst | 6 + .../static/description/icon.png | Bin 0 -> 705 bytes .../static/description/index.html | 435 ++++++++++++ .../static/src/js/list_controller.esm.js | 59 ++ .../static/src/xml/list_controller.xml | 23 + odoo-bringout-oca-web-web_help/README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + odoo-bringout-oca-web-web_help/doc/FAQ.md | 4 + odoo-bringout-oca-web-web_help/doc/INSTALL.md | 7 + odoo-bringout-oca-web-web_help/doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + odoo-bringout-oca-web-web_help/doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + odoo-bringout-oca-web-web_help/doc/USAGE.md | 7 + odoo-bringout-oca-web-web_help/doc/WIZARDS.md | 3 + odoo-bringout-oca-web-web_help/pyproject.toml | 42 ++ .../web_help/README.rst | 106 +++ .../web_help/__init__.py | 0 .../web_help/__manifest__.py | 26 + .../web_help/i18n/bs.po | 84 +++ .../web_help/i18n/es.po | 87 +++ .../web_help/i18n/hr.po | 88 +++ .../web_help/i18n/it.po | 87 +++ .../web_help/i18n/web_help.pot | 84 +++ .../web_help/readme/CONTRIBUTORS.rst | 1 + .../web_help/readme/DESCRIPTION.rst | 7 + .../web_help/readme/ROADMAP.rst | 1 + .../web_help/readme/USAGE.rst | 15 + .../static/description/changepassword.png | Bin 0 -> 13500 bytes .../web_help/static/description/demo.gif | Bin 0 -> 87733 bytes .../web_help/static/description/icon.png | Bin 0 -> 9455 bytes .../web_help/static/description/index.html | 454 ++++++++++++ .../static/description/viewswitcher.png | Bin 0 -> 4435 bytes .../static/src/change_password_trip.esm.js | 23 + .../components/help_button/help_button.esm.js | 31 + .../components/help_button/help_button.xml | 44 ++ .../components/highlighter/highlighter.esm.js | 131 ++++ .../components/highlighter/highlighter.scss | 23 + .../components/highlighter/highlighter.xml | 15 + .../web_help/static/src/helpers.esm.js | 40 ++ .../web_help/static/src/trip.esm.js | 103 +++ .../web_help/static/src/trip.xml | 29 + .../web_help/static/src/user_trip.esm.js | 32 + .../README.md | 47 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 6 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../web_hide_field_with_key/README.rst | 95 +++ .../web_hide_field_with_key/__init__.py | 0 .../web_hide_field_with_key/__manifest__.py | 18 + .../web_hide_field_with_key/i18n/it.po | 14 + .../i18n/web_hide_field_with_key.pot | 13 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 1 + .../web_hide_field_with_key/readme/USAGE.rst | 7 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 431 ++++++++++++ .../src/js/hide_custom_hidden_fields.js | 50 ++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 16 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 34 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_ir_actions_act_multi/README.rst | 101 +++ .../web_ir_actions_act_multi/__init__.py | 1 + .../web_ir_actions_act_multi/__manifest__.py | 23 + .../web_ir_actions_act_multi/i18n/bs.po | 118 ++++ .../web_ir_actions_act_multi/i18n/es.po | 124 ++++ .../web_ir_actions_act_multi/i18n/it.po | 125 ++++ .../i18n/web_ir_actions_act_multi.pot | 118 ++++ .../web_ir_actions_act_multi/i18n/zh_CN.po | 118 ++++ .../models/__init__.py | 2 + .../models/ir_actions.py | 15 + .../models/ir_model.py | 37 + .../readme/CONTRIBUTORS.rst | 8 + .../readme/DESCRIPTION.rst | 1 + .../web_ir_actions_act_multi/readme/USAGE.rst | 13 + .../security/ir.model.access.csv | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 447 ++++++++++++ .../src/js/web_ir_actions_act_multi.esm.js | 23 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 13 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 34 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../README.rst | 140 ++++ .../__init__.py | 1 + .../__manifest__.py | 21 + .../i18n/ar.po | 27 + .../i18n/bs.po | 110 +++ .../i18n/de.po | 26 + .../i18n/es.po | 26 + .../i18n/eu.po | 26 + .../i18n/fi.po | 26 + .../i18n/fr.po | 26 + .../i18n/hr.po | 27 + .../i18n/it.po | 26 + .../i18n/nl.po | 26 + .../i18n/nl_NL.po | 27 + .../i18n/pt.po | 26 + .../i18n/pt_BR.po | 27 + .../i18n/ro.po | 27 + .../i18n/sl.po | 27 + .../i18n/tr.po | 26 + .../web_ir_actions_act_window_message.pot | 110 +++ .../models/__init__.py | 1 + .../models/ir_actions.py | 21 + .../readme/CONTRIBUTORS.rst | 10 + .../readme/DESCRIPTION.rst | 1 + .../readme/ROADMAP.rst | 2 + .../readme/USAGE.rst | 44 ++ .../security/ir.model.access.csv | 2 + .../static/description/icon.png | Bin 0 -> 2034 bytes .../static/description/index.html | 485 +++++++++++++ .../web_ir_actions_act_window_message.esm.js | 101 +++ .../xml/web_ir_actions_act_window_message.xml | 7 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 14 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_ir_actions_act_window_page/README.rst | 98 +++ .../__init__.py | 3 + .../__manifest__.py | 22 + .../demo/demo_action.xml | 43 ++ .../web_ir_actions_act_window_page/i18n/bs.po | 49 ++ .../web_ir_actions_act_window_page/i18n/de.po | 54 ++ .../web_ir_actions_act_window_page/i18n/es.po | 54 ++ .../web_ir_actions_act_window_page/i18n/it.po | 52 ++ .../i18n/web_ir_actions_act_window_page.pot | 49 ++ .../models/__init__.py | 3 + .../models/ir_actions_act_window_page.py | 27 + .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 15 + .../readme/USAGE.rst | 2 + .../static/description/icon.png | Bin 0 -> 7939 bytes .../static/description/index.html | 442 ++++++++++++ .../src/web_ir_actions_act_window_page.esm.js | 40 ++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 13 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 34 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../README.rst | 90 +++ .../__init__.py | 4 + .../__manifest__.py | 23 + .../i18n/bs.po | 103 +++ .../i18n/it.po | 110 +++ ...b_ir_actions_close_wizard_refresh_view.pot | 103 +++ .../models/__init__.py | 1 + .../models/ir_actions.py | 10 + .../readme/DESCRIPTION.rst | 1 + .../readme/USAGE.rst | 14 + .../security/ir.model.access.csv | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 430 ++++++++++++ ...r_actions_close_wizard_refresh_view.esm.js | 20 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 44 ++ .../web_listview_range_select/README.rst | 98 +++ .../web_listview_range_select/__init__.py | 2 + .../web_listview_range_select/__manifest__.py | 23 + .../web_listview_range_select/i18n/es.po | 0 .../web_listview_range_select/i18n/hr.po | 0 .../web_listview_range_select/i18n/it.po | 14 + .../i18n/web_listview_range_select.pot | 13 + .../web_listview_range_select/i18n/zh_CN.po | 0 .../readme/CONTRIBUTORS.rst | 6 + .../readme/DESCRIPTION.rst | 1 + .../readme/ROADMAP.rst | 3 + .../readme/USAGE.rst | 6 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 447 ++++++++++++ .../src/js/web_listview_range_select.esm.js | 101 +++ .../src/xml/web_listview_range_select.xml | 10 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 13 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_m2x_options/README.rst | 217 ++++++ .../web_m2x_options/__init__.py | 1 + .../web_m2x_options/__manifest__.py | 21 + .../web_m2x_options/i18n/ar.po | 133 ++++ .../web_m2x_options/i18n/bs.po | 115 +++ .../web_m2x_options/i18n/de.po | 159 +++++ .../web_m2x_options/i18n/es.po | 145 ++++ .../web_m2x_options/i18n/es_BO.po | 116 +++ .../web_m2x_options/i18n/fi.po | 132 ++++ .../web_m2x_options/i18n/fr.po | 158 +++++ .../web_m2x_options/i18n/hr.po | 150 ++++ .../web_m2x_options/i18n/it.po | 133 ++++ .../web_m2x_options/i18n/nl.po | 162 +++++ .../web_m2x_options/i18n/nl_NL.po | 125 ++++ .../web_m2x_options/i18n/pt_BR.po | 156 +++++ .../web_m2x_options/i18n/sl.po | 133 ++++ .../web_m2x_options/i18n/tr.po | 133 ++++ .../web_m2x_options/i18n/web_m2x_options.pot | 115 +++ .../web_m2x_options/i18n/zh_CN.po | 153 ++++ .../web_m2x_options/models/__init__.py | 2 + .../models/ir_config_parameter.py | 18 + .../web_m2x_options/models/ir_http.py | 11 + .../web_m2x_options/readme/CONTRIBUTORS.rst | 16 + .../web_m2x_options/readme/CREDITS.rst | 1 + .../web_m2x_options/readme/DESCRIPTION.rst | 10 + .../web_m2x_options/readme/ROADMAP.rst | 6 + .../web_m2x_options/readme/USAGE.rst | 95 +++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 412 +++++++++++ .../static/src/components/base.xml | 46 ++ .../static/src/components/form.esm.js | 404 +++++++++++ .../src/components/relational_utils.esm.js | 221 ++++++ .../web_m2x_options/tests/__init__.py | 2 + .../tests/test_ir_config_parameter.py | 28 + .../README.md | 47 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 6 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 15 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 34 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../web_m2x_options_manager/README.rst | 91 +++ .../web_m2x_options_manager/__init__.py | 4 + .../web_m2x_options_manager/__manifest__.py | 23 + .../demo/res_partner_demo_view.xml | 29 + .../web_m2x_options_manager/i18n/bs.po | 198 ++++++ .../web_m2x_options_manager/i18n/it.po | 216 ++++++ .../i18n/web_m2x_options_manager.pot | 198 ++++++ .../models/__init__.py | 6 + .../models/ir_model.py | 39 ++ .../models/ir_ui_view.py | 19 + .../models/m2x_create_edit_option.py | 184 +++++ .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 2 + .../web_m2x_options_manager/readme/USAGE.rst | 7 + .../security/ir.model.access.csv | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 435 ++++++++++++ .../web_m2x_options_manager/tests/__init__.py | 4 + .../tests/test_m2x_create_edit_option.py | 120 ++++ .../views/ir_model.xml | 38 + odoo-bringout-oca-web-web_no_bubble/README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_no_bubble/README.rst | 80 +++ .../web_no_bubble/__init__.py | 0 .../web_no_bubble/__manifest__.py | 19 + .../web_no_bubble/i18n/es.po | 0 .../web_no_bubble/i18n/fr_FR.po | 0 .../web_no_bubble/i18n/hr.po | 0 .../web_no_bubble/i18n/it.po | 14 + .../web_no_bubble/i18n/web_no_bubble.pot | 13 + .../web_no_bubble/i18n/zh_CN.po | 0 .../web_no_bubble/readme/CONTRIBUTORS.rst | 4 + .../web_no_bubble/readme/DESCRIPTION.rst | 2 + .../web_no_bubble/static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 425 +++++++++++ .../static/src/css/web_no_bubble.scss | 3 + odoo-bringout-oca-web-web_notify/README.md | 49 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 8 + odoo-bringout-oca-web-web_notify/doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + odoo-bringout-oca-web-web_notify/doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 46 ++ .../web_notify/README.rst | 186 +++++ .../web_notify/__init__.py | 4 + .../web_notify/__manifest__.py | 23 + .../web_notify/i18n/bs.po | 123 ++++ .../web_notify/i18n/da.po | 129 ++++ .../web_notify/i18n/de.po | 132 ++++ .../web_notify/i18n/es.po | 132 ++++ .../web_notify/i18n/hr.po | 137 ++++ .../web_notify/i18n/it.po | 129 ++++ .../web_notify/i18n/nl.po | 138 ++++ .../web_notify/i18n/nl_NL.po | 132 ++++ .../web_notify/i18n/pt_BR.po | 134 ++++ .../web_notify/i18n/tr.po | 126 ++++ .../web_notify/i18n/web_notify.pot | 123 ++++ .../web_notify/i18n/zh_CN.po | 129 ++++ .../web_notify/models/__init__.py | 1 + .../web_notify/models/res_users.py | 152 ++++ .../web_notify/readme/CONTRIBUTORS.rst | 10 + .../web_notify/readme/DESCRIPTION.rst | 10 + .../web_notify/readme/INSTALL.rst | 1 + .../web_notify/readme/USAGE.rst | 78 +++ .../web_notify/static/description/icon.png | Bin 0 -> 8377 bytes .../web_notify/static/description/index.html | 514 ++++++++++++++ .../static/img/notifications_screenshot.gif | Bin 0 -> 214995 bytes .../static/img/test_notifications_demo.png | Bin 0 -> 55889 bytes .../static/src/components/audio_player.esm.js | 70 ++ .../static/src/components/audio_player.xml | 10 + .../src/js/services/notification.esm.js | 12 + .../js/services/notification_services.esm.js | 70 ++ .../static/src/services/effect_service.esm.js | 43 ++ .../notification_sound_service.esm.js | 58 ++ .../web_notify/tests/__init__.py | 3 + .../web_notify/tests/test_res_users.py | 124 ++++ .../web_notify/views/res_users_demo.xml | 62 ++ .../README.md | 47 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 6 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 44 ++ .../web_notify_channel_message/README.rst | 84 +++ .../web_notify_channel_message/__init__.py | 1 + .../__manifest__.py | 16 + .../web_notify_channel_message/i18n/bs.po | 26 + .../web_notify_channel_message/i18n/es.po | 29 + .../web_notify_channel_message/i18n/fr.po | 38 + .../web_notify_channel_message/i18n/it.po | 29 + .../i18n/web_notify_channel_message.pot | 26 + .../models/__init__.py | 1 + .../models/mail_channel.py | 24 + .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 432 ++++++++++++ .../tests/__init__.py | 1 + .../tests/test_notify_channel_message.py | 51 ++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_notify_upgrade/README.rst | 84 +++ .../web_notify_upgrade/__init__.py | 1 + .../web_notify_upgrade/__manifest__.py | 14 + .../web_notify_upgrade/i18n/bs.po | 40 ++ .../web_notify_upgrade/i18n/fr.po | 44 ++ .../web_notify_upgrade/i18n/it.po | 43 ++ .../i18n/web_notify_upgrade.pot | 40 ++ .../web_notify_upgrade/models/__init__.py | 1 + .../web_notify_upgrade/models/ir_model.py | 61 ++ .../readme/CONTRIBUTORS.rst | 3 + .../web_notify_upgrade/readme/DESCRIPTION.rst | 7 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 430 ++++++++++++ .../static/description/notify.png | Bin 0 -> 27309 bytes .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_pivot_computed_measure/README.rst | 124 ++++ .../web_pivot_computed_measure/__init__.py | 0 .../__manifest__.py | 25 + .../web_pivot_computed_measure/i18n/bs.po | 149 ++++ .../web_pivot_computed_measure/i18n/ca.po | 154 ++++ .../web_pivot_computed_measure/i18n/es.po | 159 +++++ .../web_pivot_computed_measure/i18n/it.po | 186 +++++ .../i18n/web_pivot_computed_measure.pot | 149 ++++ .../readme/CONTRIBUTORS.rst | 6 + .../readme/DESCRIPTION.rst | 1 + .../readme/ROADMAP.rst | 2 + .../readme/USAGE.rst | 25 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 483 +++++++++++++ .../dropdown_item_custom_measure.esm.js | 49 ++ .../dropdown_item_custom_measure.scss | 9 + .../dropdown_item_custom_measure.xml | 160 +++++ .../static/src/helpers/utils.esm.js | 124 ++++ .../static/src/pivot/pivot_controller.esm.js | 26 + .../static/src/pivot/pivot_model.esm.js | 296 ++++++++ .../static/src/pivot/pivot_renderer.esm.js | 15 + .../static/src/pivot/pivot_view.xml | 9 + .../static/src/test/test.esm.js | 67 ++ .../static/src/view.xml | 25 + .../tests/__init__.py | 1 + .../tests/res_users_fake.py | 12 + .../tests/test_ui_pivot.py | 42 ++ odoo-bringout-oca-web-web_pwa_oca/README.md | 47 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 17 + .../doc/DEPENDENCIES.md | 6 + odoo-bringout-oca-web-web_pwa_oca/doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../web_pwa_oca/README.rst | 195 ++++++ .../web_pwa_oca/__init__.py | 2 + .../web_pwa_oca/__manifest__.py | 27 + .../web_pwa_oca/controllers/__init__.py | 4 + .../web_pwa_oca/controllers/main.py | 120 ++++ .../web_pwa_oca/controllers/service_worker.py | 106 +++ .../web_pwa_oca/i18n/bs.po | 128 ++++ .../web_pwa_oca/i18n/es.po | 151 ++++ .../web_pwa_oca/i18n/es_AR.po | 136 ++++ .../web_pwa_oca/i18n/it.po | 133 ++++ .../web_pwa_oca/i18n/pt_BR.po | 137 ++++ .../web_pwa_oca/i18n/web_pwa_oca.pot | 128 ++++ .../web_pwa_oca/models/__init__.py | 1 + .../web_pwa_oca/models/res_config_settings.py | 159 +++++ .../web_pwa_oca/readme/CONFIGURE.rst | 11 + .../web_pwa_oca/readme/CONTRIBUTORS.rst | 9 + .../web_pwa_oca/readme/DESCRIPTION.rst | 16 + .../web_pwa_oca/readme/INSTALL.rst | 18 + .../web_pwa_oca/readme/ROADMAP.rst | 35 + .../web_pwa_oca/readme/USAGE.rst | 7 + .../web_pwa_oca/static/description/icon.png | Bin 0 -> 15864 bytes .../web_pwa_oca/static/description/index.html | 535 ++++++++++++++ .../web_pwa_oca/static/description/pwa.png | Bin 0 -> 31569 bytes .../static/img/icons/icon-128x128.png | Bin 0 -> 4047 bytes .../static/img/icons/icon-144x144.png | Bin 0 -> 4535 bytes .../static/img/icons/icon-152x152.png | Bin 0 -> 4333 bytes .../static/img/icons/icon-192x192.png | Bin 0 -> 5604 bytes .../static/img/icons/icon-256x256.png | Bin 0 -> 6924 bytes .../static/img/icons/icon-512x512.png | Bin 0 -> 16833 bytes .../static/img/icons/odoo_logo.svg | 67 ++ .../web_pwa_oca/static/src/js/pwa_manager.js | 81 +++ .../web_pwa_oca/static/src/js/webclient.js | 15 + .../static/src/js/worker/jquery-sw-compat.js | 62 ++ .../web_pwa_oca/static/src/js/worker/pwa.js | 57 ++ .../web_pwa_oca/templates/assets.xml | 32 + .../web_pwa_oca/tests/__init__.py | 1 + .../tests/test_web_pwa_oca_controller.py | 124 ++++ .../views/res_config_settings_views.xml | 70 ++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 14 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 42 ++ .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_quick_start_screen/README.rst | 137 ++++ .../web_quick_start_screen/__init__.py | 1 + .../web_quick_start_screen/__manifest__.py | 28 + .../demo/quick_screen_action_demo_data.xml | 57 ++ .../web_quick_start_screen/i18n/bs.po | 247 +++++++ .../web_quick_start_screen/i18n/es.po | 257 +++++++ .../web_quick_start_screen/i18n/it.po | 256 +++++++ .../i18n/web_quick_start_screen.pot | 247 +++++++ .../web_quick_start_screen/models/__init__.py | 3 + .../models/quick_start_screen.py | 68 ++ .../models/quick_start_screen_action.py | 68 ++ .../models/res_users.py | 9 + .../readme/CONFIGURE.md | 27 + .../web_quick_start_screen/readme/CONTEXT.md | 2 + .../readme/CONTRIBUTORS.md | 3 + .../readme/DESCRIPTION.md | 4 + .../web_quick_start_screen/readme/ROADMAP.md | 6 + .../web_quick_start_screen/readme/USAGE.md | 2 + .../security/ir.model.access.csv | 5 + .../security/security.xml | 7 + .../static/description/icon.png | Bin 0 -> 5571 bytes .../static/description/icon.svg | 107 +++ .../static/description/index.html | 487 +++++++++++++ .../static/src/js/kanban_controller.esm.js | 18 + .../static/src/scss/quick_start_screen.scss | 6 + .../web_quick_start_screen/tests/__init__.py | 2 + .../tests/test_web_quick_start_screen.py | 26 + .../views/quick_screen_action_view.xml | 110 +++ .../views/quick_start_screen_views.xml | 54 ++ .../views/res_users_views.xml | 12 + odoo-bringout-oca-web-web_refresher/README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_refresher/README.rst | 89 +++ .../web_refresher/__init__.py | 0 .../web_refresher/__manifest__.py | 34 + .../web_refresher/i18n/bs.po | 29 + .../web_refresher/i18n/ca.po | 13 + .../web_refresher/i18n/es.po | 33 + .../web_refresher/i18n/fr.po | 31 + .../web_refresher/i18n/hr.po | 36 + .../web_refresher/i18n/it.po | 35 + .../web_refresher/i18n/pt_BR.po | 30 + .../web_refresher/i18n/web_refresher.pot | 29 + .../web_refresher/readme/CONTRIBUTORS.rst | 11 + .../web_refresher/readme/DESCRIPTION.rst | 3 + .../web_refresher/static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 436 ++++++++++++ .../static/description/refresh.png | Bin 0 -> 18324 bytes .../static/src/js/control_panel.esm.js | 31 + .../static/src/js/refresher.esm.js | 135 ++++ .../static/src/scss/refresher.scss | 23 + .../static/src/xml/control_panel.xml | 49 ++ .../static/src/xml/form_control_panel.xml | 27 + .../static/src/xml/refresher.xml | 21 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_remember_tree_column_width/README.rst | 103 +++ .../__init__.py | 0 .../__manifest__.py | 24 + .../web_remember_tree_column_width/i18n/hr.po | 15 + .../web_remember_tree_column_width/i18n/it.po | 14 + .../i18n/web_remember_tree_column_width.pot | 13 + .../readme/CONTRIBUTORS.rst | 5 + .../readme/CREDITS.rst | 5 + .../readme/DESCRIPTION.rst | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 438 ++++++++++++ .../static/src/js/list_renderer.esm.js | 66 ++ .../static/src/scss/main.scss | 4 + .../README.md | 47 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 6 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../web_responsive/README.rst | 191 +++++ .../web_responsive/__init__.py | 0 .../web_responsive/__manifest__.py | 53 ++ .../web_responsive/i18n/ar.po | 170 +++++ .../web_responsive/i18n/bs.po | 130 ++++ .../web_responsive/i18n/ca.po | 154 ++++ .../web_responsive/i18n/da.po | 151 ++++ .../web_responsive/i18n/de.po | 178 +++++ .../web_responsive/i18n/es.po | 188 +++++ .../web_responsive/i18n/fr.po | 186 +++++ .../web_responsive/i18n/fr_FR.po | 148 ++++ .../web_responsive/i18n/hr.po | 152 ++++ .../web_responsive/i18n/it.po | 136 ++++ .../web_responsive/i18n/nl.po | 162 +++++ .../web_responsive/i18n/pl.po | 164 +++++ .../web_responsive/i18n/pt.po | 148 ++++ .../web_responsive/i18n/pt_BR.po | 193 +++++ .../web_responsive/i18n/ru.po | 160 +++++ .../web_responsive/i18n/tr.po | 136 ++++ .../web_responsive/i18n/web_responsive.pot | 130 ++++ .../web_responsive/i18n/zh_CN.po | 169 +++++ .../web_responsive/readme/CONTRIBUTORS.rst | 11 + .../web_responsive/readme/DESCRIPTION.rst | 73 ++ .../web_responsive/readme/ROADMAP.rst | 2 + .../web_responsive/readme/USAGE.rst | 5 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 530 ++++++++++++++ .../web_responsive/static/img/appmenu.gif | Bin 0 -> 395807 bytes .../web_responsive/static/img/appsearch.gif | Bin 0 -> 191495 bytes .../web_responsive/static/img/breadcrumbs.gif | Bin 0 -> 66437 bytes .../web_responsive/static/img/calendar.gif | Bin 0 -> 53850 bytes .../static/img/chatter-colors.gif | Bin 0 -> 140636 bytes .../web_responsive/static/img/chatter.gif | Bin 0 -> 408786 bytes .../static/img/chatter_sided.gif | Bin 0 -> 463400 bytes .../static/img/chatter_topbar.gif | Bin 0 -> 179505 bytes .../static/img/default_icon_app.png | Bin 0 -> 9824 bytes .../static/img/device_rotation.gif | Bin 0 -> 65368 bytes .../static/img/document_viewer.gif | Bin 0 -> 528526 bytes .../static/img/dropdown_scroll.gif | Bin 0 -> 94934 bytes .../static/img/form_buttons.gif | Bin 0 -> 37249 bytes .../web_responsive/static/img/formview.gif | Bin 0 -> 437847 bytes .../web_responsive/static/img/hamburger.gif | Bin 0 -> 81148 bytes .../web_responsive/static/img/kanban.gif | Bin 0 -> 43323 bytes .../static/img/label_size_large.png | Bin 0 -> 18332 bytes .../static/img/label_size_small.png | Bin 0 -> 17924 bytes .../web_responsive/static/img/listview.gif | Bin 0 -> 689735 bytes .../static/img/mobile_search.gif | Bin 0 -> 130810 bytes .../web_responsive/static/img/navbar.gif | Bin 0 -> 434351 bytes .../static/img/search_panel.gif | Bin 0 -> 59694 bytes .../web_responsive/static/img/shortcuts.gif | Bin 0 -> 39972 bytes .../web_responsive/static/img/usermenu.gif | Bin 0 -> 93025 bytes .../web_responsive/static/img/viewtype.gif | Bin 0 -> 62849 bytes .../src/components/apps_menu/apps_menu.esm.js | 335 +++++++++ .../src/components/apps_menu/apps_menu.scss | 205 ++++++ .../src/components/apps_menu/apps_menu.xml | 97 +++ .../attachment_viewer.esm.js | 37 + .../attachment_viewer/attachment_viewer.scss | 61 ++ .../attachment_viewer/attachment_viewer.xml | 39 ++ .../chatter_topbar/chatter_topbar.esm.js | 15 + .../chatter_topbar/chatter_topbar.scss | 12 + .../chatter_topbar/chatter_topbar.xml | 59 ++ .../control_panel/control_panel.esm.js | 45 ++ .../control_panel/control_panel.scss | 299 ++++++++ .../control_panel/control_panel.xml | 227 ++++++ .../static/src/components/hotkey/hotkey.scss | 12 + .../static/src/components/hotkey/hotkey.xml | 27 + .../search_panel/search_panel.esm.js | 55 ++ .../components/search_panel/search_panel.scss | 112 +++ .../components/search_panel/search_panel.xml | 53 ++ .../static/src/components/ui_context.esm.js | 47 ++ .../static/src/img/home-menu-bg-overlay.svg | 5 + .../static/src/legacy/js/web_responsive.js | 22 + .../src/legacy/scss/web_responsive.scss | 382 ++++++++++ .../static/src/legacy/xml/form_buttons.xml | 158 +++++ .../src/views/form/form_controller.esm.js | 14 + .../src/views/form/form_controller.scss | 9 + .../web_responsive/static/tests/test_patch.js | 19 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_save_discard_button/README.md | 1 + .../web_save_discard_button/README.rst | 87 +++ .../web_save_discard_button/__init__.py | 4 + .../web_save_discard_button/__manifest__.py | 25 + .../web_save_discard_button/i18n/bs.po | 33 + .../web_save_discard_button/i18n/es.po | 36 + .../web_save_discard_button/i18n/fr.po | 36 + .../web_save_discard_button/i18n/it.po | 36 + .../web_save_discard_button/i18n/tr.po | 36 + .../i18n/web_save_discard_button.pot | 33 + .../models/__init__.py | 4 + .../web_save_discard_button/models/ir_http.py | 13 + .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 3 + .../static/description/icon.png | Bin 0 -> 3718 bytes .../static/description/index.html | 425 +++++++++++ .../static/description/save_button.png | Bin 0 -> 213235 bytes .../static/src/scss/indicator_button.scss | 65 ++ .../static/src/xml/template.xml | 17 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_search_with_and/README.rst | 106 +++ .../web_search_with_and/__init__.py | 0 .../web_search_with_and/__manifest__.py | 20 + .../web_search_with_and/i18n/es.po | 0 .../web_search_with_and/i18n/it.po | 0 .../web_search_with_and/i18n/pt.po | 0 .../web_search_with_and/i18n/tr.po | 14 + .../i18n/web_search_with_and.pot | 13 + .../readme/CONTRIBUTORS.rst | 8 + .../readme/DESCRIPTION.rst | 10 + .../web_search_with_and/readme/USAGE.rst | 7 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 450 ++++++++++++ .../static/src/js/search_bar.esm.js | 23 + .../static/src/js/search_model.esm.js | 84 +++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_select_all_companies/README.rst | 78 +++ .../web_select_all_companies/__init__.py | 0 .../web_select_all_companies/__manifest__.py | 21 + .../web_select_all_companies/i18n/bs.po | 28 + .../web_select_all_companies/i18n/es.po | 31 + .../web_select_all_companies/i18n/fr.po | 31 + .../web_select_all_companies/i18n/it.po | 31 + .../i18n/web_select_all_companies.pot | 28 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 422 +++++++++++ .../description/select_all_companies.gif | Bin 0 -> 1108051 bytes .../src/js/switch_all_company_menu.esm.js | 45 ++ .../src/scss/switch_all_company_menu.scss | 4 + .../src/xml/switch_all_company_menu.xml | 39 ++ .../README.md | 47 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 6 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../web_send_message_popup/README.rst | 88 +++ .../web_send_message_popup/__init__.py | 0 .../web_send_message_popup/__manifest__.py | 15 + .../web_send_message_popup/i18n/bs.po | 21 + .../web_send_message_popup/i18n/fa.po | 6 + .../web_send_message_popup/i18n/it.po | 24 + .../i18n/web_send_message_popup.pot | 21 + .../readme/CONTRIBUTORS.rst | 6 + .../readme/DESCRIPTION.rst | 8 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 432 ++++++++++++ .../static/src/models/chatter/chatter.esm.js | 62 ++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_sheet_full_width/README.rst | 91 +++ .../web_sheet_full_width/__init__.py | 0 .../web_sheet_full_width/__manifest__.py | 18 + .../web_sheet_full_width/i18n/es.po | 0 .../web_sheet_full_width/i18n/it.po | 14 + .../i18n/web_sheet_full_width.pot | 13 + .../readme/CONTRIBUTORS.rst | 6 + .../readme/DESCRIPTION.rst | 8 + .../static/description/icon.png | Bin 0 -> 411 bytes .../static/description/index.html | 434 ++++++++++++ .../static/src/scss/web_sheet_full_width.scss | 9 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_systray_button_init_action/README.rst | 96 +++ .../__init__.py | 0 .../__manifest__.py | 20 + .../web_systray_button_init_action/i18n/bs.po | 22 + .../web_systray_button_init_action/i18n/it.po | 25 + .../i18n/web_systray_button_init_action.pot | 22 + .../readme/CONFIGURE.rst | 8 + .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 2 + .../static/description/icon.png | Bin 0 -> 10254 bytes .../static/description/index.html | 446 ++++++++++++ .../static/src/button/button.esm.js | 33 + .../static/src/button/button.xml | 17 + .../static/src/tours/tour.esm.js | 41 ++ .../tests/__init__.py | 1 + .../test_web_systray_button_init_action.py | 25 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_theme_classic/README.rst | 110 +++ .../web_theme_classic/__init__.py | 0 .../web_theme_classic/__manifest__.py | 24 + .../web_theme_classic/i18n/it.po | 14 + .../web_theme_classic/i18n/pt_BR.po | 14 + .../i18n/web_theme_classic.pot | 13 + .../web_theme_classic/readme/CONTRIBUTORS.rst | 1 + .../web_theme_classic/readme/DESCRIPTION.rst | 21 + .../web_theme_classic/readme/ROADMAP.rst | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 449 ++++++++++++ .../product_template_form_with_module.png | Bin 0 -> 58115 bytes .../product_template_form_without_module.png | Bin 0 -> 63244 bytes .../static/src/scss/web_theme_classic.scss | 102 +++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_time_range_menu_custom/README.rst | 100 +++ .../web_time_range_menu_custom/__init__.py | 1 + .../__manifest__.py | 19 + .../web_time_range_menu_custom/i18n/bs.po | 56 ++ .../web_time_range_menu_custom/i18n/es.po | 59 ++ .../web_time_range_menu_custom/i18n/it.po | 75 ++ .../web_time_range_menu_custom/i18n/tr.po | 75 ++ .../i18n/web_time_range_menu_custom.pot | 56 ++ .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 2 + .../readme/USAGE.rst | 16 + .../description/custom_period_option.png | Bin 0 -> 254423 bytes .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 445 ++++++++++++ .../static/src/js/comparison_menu.esm.js | 13 + .../static/src/js/date_selector.esm.js | 121 ++++ .../static/src/js/dates.esm.js | 363 ++++++++++ .../static/src/js/filter_menu.esm.js | 13 + .../src/scss/web_time_range_menu_custom.scss | 8 + .../static/src/xml/comparison_menu.xml | 10 + .../static/src/xml/date_selector.xml | 72 ++ .../static/src/xml/filter_menu.xml | 15 + odoo-bringout-oca-web-web_timeline/README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + odoo-bringout-oca-web-web_timeline/doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_timeline/README.rst | 264 +++++++ .../web_timeline/__init__.py | 4 + .../web_timeline/__manifest__.py | 35 + .../web_timeline/demo/ir_cron_view.xml | 19 + .../web_timeline/i18n/bs.po | 102 +++ .../web_timeline/i18n/de.po | 116 +++ .../web_timeline/i18n/es.po | 114 +++ .../web_timeline/i18n/fa.po | 108 +++ .../web_timeline/i18n/fr.po | 147 ++++ .../web_timeline/i18n/he.po | 106 +++ .../web_timeline/i18n/hr.po | 137 ++++ .../web_timeline/i18n/it.po | 107 +++ .../web_timeline/i18n/nl_NL.po | 112 +++ .../web_timeline/i18n/pt.po | 128 ++++ .../web_timeline/i18n/pt_BR.po | 107 +++ .../web_timeline/i18n/tr.po | 106 +++ .../web_timeline/i18n/web_timeline.pot | 102 +++ .../web_timeline/i18n/zh_CN.po | 138 ++++ .../web_timeline/models/__init__.py | 4 + .../web_timeline/models/ir_ui_view.py | 12 + .../web_timeline/readme/CONFIGURE.rst | 101 +++ .../web_timeline/readme/CONTRIBUTORS.rst | 21 + .../web_timeline/readme/DESCRIPTION.rst | 4 + .../web_timeline/readme/ROADMAP.rst | 11 + .../web_timeline/readme/USAGE.rst | 29 + .../web_timeline/static/description/icon.png | Bin 0 -> 12001 bytes .../static/description/index.html | 631 +++++++++++++++++ .../static/src/js/timeline_canvas.js | 160 +++++ .../static/src/js/timeline_controller.esm.js | 378 ++++++++++ .../static/src/js/timeline_model.js | 77 ++ .../static/src/js/timeline_renderer.js | 663 ++++++++++++++++++ .../static/src/js/timeline_view.js | 174 +++++ .../static/src/scss/web_timeline.scss | 36 + .../static/src/xml/web_timeline.xml | 41 ++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_touchscreen/README.rst | 143 ++++ .../web_touchscreen/__init__.py | 0 .../web_touchscreen/__manifest__.py | 22 + .../web_touchscreen/i18n/it.po | 14 + .../web_touchscreen/i18n/web_touchscreen.pot | 13 + .../web_touchscreen/readme/CONTEXT.md | 9 + .../web_touchscreen/readme/CONTRIBUTORS.md | 1 + .../web_touchscreen/readme/CREDITS.md | 3 + .../web_touchscreen/readme/DESCRIPTION.md | 12 + .../web_touchscreen/readme/ROADMAP.md | 3 + .../web_touchscreen/readme/USAGE.md | 4 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 486 +++++++++++++ .../static/src/form_controller.esm.js | 21 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_tree_duplicate/README.rst | 123 ++++ .../web_tree_duplicate/__init__.py | 0 .../web_tree_duplicate/__manifest__.py | 20 + .../web_tree_duplicate/i18n/bs.po | 28 + .../web_tree_duplicate/i18n/ca.po | 31 + .../web_tree_duplicate/i18n/es.po | 31 + .../web_tree_duplicate/i18n/fr.po | 31 + .../web_tree_duplicate/i18n/he_IL.po | 30 + .../web_tree_duplicate/i18n/it.po | 31 + .../web_tree_duplicate/i18n/pt.po | 31 + .../web_tree_duplicate/i18n/pt_BR.po | 31 + .../i18n/web_tree_duplicate.pot | 28 + .../web_tree_duplicate/i18n/zh_CN.po | 31 + .../web_tree_duplicate/readme/CONFIGURE.rst | 20 + .../readme/CONTRIBUTORS.rst | 2 + .../web_tree_duplicate/readme/DESCRIPTION.rst | 1 + .../web_tree_duplicate/readme/USAGE.rst | 9 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 458 ++++++++++++ .../description/screenshot-duplicate.png | Bin 0 -> 41539 bytes .../static/src/web_tree_duplicate.esm.js | 40 ++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_tree_dynamic_colored_field/README.rst | 192 +++++ .../__init__.py | 1 + .../__manifest__.py | 20 + .../demo/res_users.xml | 21 + .../web_tree_dynamic_colored_field/i18n/es.po | 22 + .../web_tree_dynamic_colored_field/i18n/fi.po | 22 + .../web_tree_dynamic_colored_field/i18n/fr.po | 0 .../web_tree_dynamic_colored_field/i18n/it.po | 0 .../i18n/nl_NL.po | 23 + .../web_tree_dynamic_colored_field/i18n/sl.po | 23 + .../i18n/web_tree_dynamic_colored_field.pot | 13 + .../i18n/zh_CN.po | 0 .../pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 7 + .../readme/CREDITS.md | 4 + .../readme/DESCRIPTION.md | 9 + .../readme/ROADMAP.md | 7 + .../readme/USAGE.md | 70 ++ .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 535 ++++++++++++++ .../static/src/js/list_renderer.esm.js | 45 ++ .../static/src/xml/list.xml | 20 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_tree_many2one_clickable/README.rst | 104 +++ .../web_tree_many2one_clickable/__init__.py | 1 + .../__manifest__.py | 44 ++ .../web_tree_many2one_clickable/i18n/it.po | 14 + .../i18n/web_tree_many2one_clickable.pot | 13 + .../web_tree_many2one_clickable/i18n/zh_CN.po | 0 .../readme/CONFIGURATION.rst | 1 + .../readme/CONTRIBUTORS.rst | 8 + .../readme/DESCRIPTION.rst | 3 + .../readme/ROADMAP.rst | 5 + .../readme/USAGE.rst | 3 + .../static/description/icon.png | Bin 0 -> 7939 bytes .../static/description/index.html | 449 ++++++++++++ .../static/img/clickable.gif | Bin 0 -> 526238 bytes .../many2one_button/many2one_button.esm.js | 33 + .../many2one_button/many2one_button.scss | 10 + .../many2one_button/many2one_button.xml | 21 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_widget_bokeh_chart/README.rst | 203 ++++++ .../web_widget_bokeh_chart/__init__.py | 1 + .../web_widget_bokeh_chart/__manifest__.py | 25 + .../web_widget_bokeh_chart/i18n/it.po | 14 + .../i18n/web_widget_bokeh_chart.pot | 13 + .../web_widget_bokeh_chart/i18n/zh_CN.po | 0 .../readme/CONTRIBUTORS.rst | 7 + .../web_widget_bokeh_chart/readme/CREDITS.rst | 4 + .../readme/DESCRIPTION.rst | 16 + .../web_widget_bokeh_chart/readme/INSTALL.rst | 3 + .../web_widget_bokeh_chart/readme/ROADMAP.rst | 1 + .../web_widget_bokeh_chart/readme/USAGE.rst | 70 ++ .../static/description/example.png | Bin 0 -> 155417 bytes .../static/description/icon.png | Bin 0 -> 2474 bytes .../static/description/index.html | 553 +++++++++++++++ .../src/js/web_widget_bokeh_chart.esm.js | 44 ++ .../src/js/web_widget_bokeh_json_chart.esm.js | 40 ++ .../static/src/xml/bokeh.xml | 9 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_widget_char_size/README.rst | 79 +++ .../web_widget_char_size/__init__.py | 1 + .../web_widget_char_size/__manifest__.py | 17 + .../web_widget_char_size/i18n/it.po | 14 + .../i18n/web_widget_char_size.pot | 13 + .../readme/CONTRIBUTERS.rst | 1 + .../readme/DESCRIPTION.rst | 9 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 421 +++++++++++ .../static/src/js/char_widget.esm.js | 10 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../README.rst | 85 +++ .../__init__.py | 1 + .../__manifest__.py | 20 + .../i18n/it.po | 14 + .../i18n/pt_BR.po | 0 .../i18n/tr.po | 14 + .../web_widget_datepicker_fulloptions.pot | 13 + .../readme/CONTRIBUTORS.rst | 3 + .../readme/DESCRIPTION.rst | 8 + .../static/description/change.png | Bin 0 -> 31877 bytes .../static/description/icon.png | Bin 0 -> 16484 bytes .../static/description/index.html | 431 ++++++++++++ .../web_widget_datepicker_fulloptions.esm.js | 11 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../README.rst | 113 +++ .../__init__.py | 0 .../__manifest__.py | 18 + .../i18n/bs.po | 28 + .../i18n/es.po | 34 + .../i18n/it.po | 31 + .../i18n/web_widget_domain_editor_dialog.pot | 28 + .../i18n/zh_CN.po | 34 + .../readme/CONTRIBUTORS.rst | 9 + .../readme/DESCRIPTION.rst | 5 + .../readme/USAGE.rst | 21 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 459 ++++++++++++ .../static/src/img/behaviour.gif | Bin 0 -> 1172376 bytes .../static/src/js/domain_field.esm.js | 39 ++ .../src/js/widget_domain_editor_dialog.esm.js | 81 +++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_widget_dropdown_dynamic/README.rst | 128 ++++ .../web_widget_dropdown_dynamic/__init__.py | 1 + .../__manifest__.py | 19 + .../web_widget_dropdown_dynamic/i18n/bs.po | 21 + .../web_widget_dropdown_dynamic/i18n/de.po | 24 + .../web_widget_dropdown_dynamic/i18n/es.po | 24 + .../web_widget_dropdown_dynamic/i18n/it.po | 24 + .../i18n/web_widget_dropdown_dynamic.pot | 21 + .../readme/CONTRIBUTORS.rst | 12 + .../readme/CREDITS.rst | 1 + .../readme/DESCRIPTION.rst | 9 + .../readme/USAGE.rst | 24 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 483 +++++++++++++ .../static/src/js/basic_model.esm.js | 50 ++ .../src/js/field_dynamic_dropdown.esm.js | 88 +++ .../web_widget_dropdown_dynamic_tests.esm.js | 182 +++++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_widget_image_download/README.rst | 98 +++ .../web_widget_image_download/__init__.py | 0 .../web_widget_image_download/__manifest__.py | 20 + .../web_widget_image_download/i18n/bs.po | 22 + .../web_widget_image_download/i18n/es.po | 24 + .../web_widget_image_download/i18n/hr.po | 27 + .../web_widget_image_download/i18n/it.po | 24 + .../web_widget_image_download/i18n/lt.po | 27 + .../web_widget_image_download/i18n/nl_NL.po | 27 + .../web_widget_image_download/i18n/pt.po | 24 + .../i18n/web_widget_image_download.pot | 22 + .../web_widget_image_download/i18n/zh_CN.po | 24 + .../readme/CONTRIBUTORS.rst | 11 + .../readme/DESCRIPTION.rst | 2 + .../readme/USAGE.rst | 6 + .../static/description/icon.png | Bin 0 -> 17095 bytes .../static/description/index.html | 446 ++++++++++++ .../static/src/components/image_field.esm.js | 21 + .../src/xml/web_widget_image_download.xml | 29 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_widget_image_webcam/README.rst | 99 +++ .../web_widget_image_webcam/__init__.py | 1 + .../web_widget_image_webcam/__manifest__.py | 24 + .../web_widget_image_webcam/i18n/bs.po | 55 ++ .../web_widget_image_webcam/i18n/es.po | 57 ++ .../web_widget_image_webcam/i18n/it.po | 57 ++ .../i18n/web_widget_image_webcam.pot | 55 ++ .../models/__init__.py | 1 + .../models/ir_config_parameter.py | 15 + .../readme/CONFIGURE.rst | 13 + .../readme/CONTRIBUTORS.rst | 6 + .../readme/DESCRIPTION.rst | 1 + .../static/description/icon.png | Bin 0 -> 15416 bytes .../static/description/index.html | 438 ++++++++++++ .../src/css/web_widget_image_webcam.css | 35 + .../static/src/img/webcam_placeholder.png | Bin 0 -> 7223 bytes .../static/src/js/webcam_widget.js | 132 ++++ .../src/xml/web_widget_image_webcam.xml | 35 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_widget_mpld3_chart/README.rst | 148 ++++ .../web_widget_mpld3_chart/__init__.py | 2 + .../web_widget_mpld3_chart/__manifest__.py | 24 + .../web_widget_mpld3_chart/i18n/bs.po | 19 + .../web_widget_mpld3_chart/i18n/es.po | 22 + .../web_widget_mpld3_chart/i18n/it.po | 23 + .../i18n/web_widget_mpld3_chart.pot | 19 + .../web_widget_mpld3_chart/models/__init__.py | 1 + .../models/abstract_mpld3_parser.py | 31 + .../readme/CONTRIBUTORS.rst | 2 + .../web_widget_mpld3_chart/readme/CREDITS.rst | 8 + .../readme/DESCRIPTION.rst | 5 + .../web_widget_mpld3_chart/readme/INSTALL.rst | 3 + .../web_widget_mpld3_chart/readme/USAGE.rst | 33 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 491 +++++++++++++ .../src/js/web_widget_mpld3_chart.esm.js | 37 + .../static/src/xml/web_widget_mpld3_chart.xml | 6 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_widget_numeric_step/README.rst | 142 ++++ .../web_widget_numeric_step/__init__.py | 0 .../web_widget_numeric_step/__manifest__.py | 21 + .../web_widget_numeric_step/i18n/bs.po | 37 + .../web_widget_numeric_step/i18n/de.po | 42 ++ .../web_widget_numeric_step/i18n/es.po | 42 ++ .../web_widget_numeric_step/i18n/fr.po | 38 + .../web_widget_numeric_step/i18n/it.po | 42 ++ .../i18n/web_widget_numeric_step.pot | 37 + .../readme/CONTRIBUTORS.rst | 12 + .../readme/DESCRIPTION.rst | 4 + .../web_widget_numeric_step/readme/USAGE.rst | 36 + .../static/description/add_two_buttons.png | Bin 0 -> 3166 bytes .../static/description/icon.png | Bin 0 -> 961 bytes .../static/description/index.html | 473 +++++++++++++ .../static/description/step0,25andlimits.gif | Bin 0 -> 147710 bytes ...0_limit15_placeholder117_with_onchange.gif | Bin 0 -> 110592 bytes .../static/src/numeric_step.esm.js | 90 +++ .../static/src/numeric_step.scss | 22 + .../static/src/numeric_step.xml | 47 ++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../README.rst | 99 +++ .../__init__.py | 1 + .../__manifest__.py | 25 + .../i18n/bs.po | 21 + .../i18n/it.po | 24 + ...eb_widget_one2many_tree_line_duplicate.pot | 21 + .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 1 + .../readme/ROADMAP.rst | 1 + .../readme/USAGE.rst | 11 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 448 ++++++++++++ .../basic_relational_model.esm.js | 22 + .../src/legacy/basic_model/basic_model.js | 453 ++++++++++++ .../static/src/list/list_renderer.esm.js | 38 + .../static/src/list/list_renderer.xml | 43 ++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 13 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../web_widget_open_tab/README.rst | 103 +++ .../web_widget_open_tab/__init__.py | 1 + .../web_widget_open_tab/__manifest__.py | 23 + .../demo/res_users_view.xml | 12 + .../web_widget_open_tab/i18n/bs.po | 48 ++ .../web_widget_open_tab/i18n/ca.po | 59 ++ .../web_widget_open_tab/i18n/de.po | 59 ++ .../web_widget_open_tab/i18n/es.po | 59 ++ .../web_widget_open_tab/i18n/it.po | 51 ++ .../web_widget_open_tab/i18n/ja.po | 51 ++ .../web_widget_open_tab/i18n/pt_BR.po | 52 ++ .../i18n/web_widget_open_tab.pot | 48 ++ .../web_widget_open_tab/models/__init__.py | 2 + .../web_widget_open_tab/models/ir_model.py | 10 + .../web_widget_open_tab/models/ir_ui_view.py | 25 + .../readme/CONTRIBUTORS.rst | 6 + .../readme/DESCRIPTION.rst | 3 + .../web_widget_open_tab/readme/ROADMAP.rst | 1 + .../web_widget_open_tab/readme/USAGE.rst | 11 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 449 ++++++++++++ .../static/src/js/open_tab_widget.esm.js | 45 ++ .../static/src/xml/open_tab_widget.xml | 14 + .../views/ir_model_views.xml | 13 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_widget_pattern/README.rst | 118 ++++ .../web_widget_pattern/__init__.py | 1 + .../web_widget_pattern/__manifest__.py | 27 + .../demo/res_partner_views.xml | 14 + .../web_widget_pattern/i18n/bs.po | 19 + .../web_widget_pattern/i18n/it.po | 22 + .../i18n/web_widget_pattern.pot | 19 + .../web_widget_pattern/models/__init__.py | 1 + .../web_widget_pattern/models/base.py | 28 + .../web_widget_pattern/readme/CONTRIBUTORS.md | 1 + .../web_widget_pattern/readme/DESCRIPTION.md | 1 + .../web_widget_pattern/readme/ROADMAP.md | 3 + .../web_widget_pattern/readme/USAGE.md | 13 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 456 ++++++++++++ .../static/src/autocomplete.esm.js | 15 + .../static/src/autocomplete.xml | 10 + .../static/src/char_field.esm.js | 37 + .../static/src/char_field.xml | 9 + .../web_widget_pattern/tests/__init__.py | 1 + .../tests/test_web_widget_pattern.py | 14 + .../README.md | 47 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 6 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 12 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../README.rst | 91 +++ .../__init__.py | 1 + .../__manifest__.py | 28 + .../demo/res_partner_views.xml | 14 + .../i18n/bs.po | 19 + .../i18n/it.po | 22 + ...eb_widget_pattern_partner_autocomplete.pot | 19 + .../models/__init__.py | 1 + .../models/base.py | 28 + .../readme/CONTRIBUTORS.md | 1 + .../readme/DESCRIPTION.md | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 431 ++++++++++++ .../static/src/autocomplete.xml | 14 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_widget_plotly_chart/README.rst | 141 ++++ .../web_widget_plotly_chart/__init__.py | 0 .../web_widget_plotly_chart/__manifest__.py | 21 + .../web_widget_plotly_chart/i18n/ca.po | 0 .../web_widget_plotly_chart/i18n/da.po | 0 .../web_widget_plotly_chart/i18n/es.po | 0 .../web_widget_plotly_chart/i18n/it.po | 14 + .../web_widget_plotly_chart/i18n/pt_BR.po | 0 .../i18n/web_widget_plotly_chart.pot | 13 + .../readme/CONTRIBUTORS.rst | 2 + .../readme/CREDITS.rst | 4 + .../readme/DESCRIPTION.rst | 14 + .../readme/INSTALL.rst | 3 + .../web_widget_plotly_chart/readme/USAGE.rst | 24 + .../static/description/example.png | Bin 0 -> 26648 bytes .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 482 +++++++++++++ .../static/src/js/widget_plotly.esm.js | 42 ++ .../static/src/js/widget_plotly.xml | 8 + .../README.md | 47 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 6 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 43 ++ .../README.rst | 110 +++ .../__init__.py | 0 .../__manifest__.py | 23 + .../i18n/bs.po | 63 ++ .../i18n/it.po | 67 ++ ..._widget_product_label_section_and_note.pot | 63 ++ .../readme/CONFIGURE.rst | 8 + .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 1 + .../readme/ROADMAP.rst | 3 + .../readme/USAGE.rst | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 466 ++++++++++++ ...roduct_label_section_and_note_field.esm.js | 305 ++++++++ .../product_label_section_and_note_field.scss | 5 + .../product_label_section_and_note_field.xml | 219 ++++++ .../static/src/core/utils/autoresize.esm.js | 111 +++ .../utils/product_and_label_autoresize.esm.js | 41 ++ .../views/account_move_views.xml | 25 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../README.rst | 113 +++ .../__init__.py | 0 .../__manifest__.py | 20 + .../i18n/it.po | 14 + .../i18n/web_widget_progressbar_gradient.pot | 13 + .../readme/CONTRIBUTORS.md | 3 + .../readme/DESCRIPTION.md | 11 + .../readme/ROADMAP.md | 1 + .../readme/USAGE.md | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 455 ++++++++++++ .../description/progressbar_gradient.png | Bin 0 -> 9061 bytes .../progressbar_gradient_inverse.png | Bin 0 -> 9152 bytes .../static/src/js/progressbar.esm.js | 39 ++ .../static/src/scss/progressbar.scss | 24 + .../static/src/xml/progressbar.xml | 13 + .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../README.rst | 105 +++ .../__init__.py | 0 .../__manifest__.py | 20 + .../i18n/it.po | 14 + .../web_widget_remaining_days_exact_date.pot | 13 + .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 1 + .../readme/USAGE.rst | 9 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 446 ++++++++++++ .../src/remaining_days/remaining_days.esm.js | 42 ++ .../README.md | 46 ++ .../doc/ARCHITECTURE.md | 32 + .../doc/CONFIGURATION.md | 3 + .../doc/CONTROLLERS.md | 3 + .../doc/DEPENDENCIES.md | 5 + .../doc/FAQ.md | 4 + .../doc/INSTALL.md | 7 + .../doc/MODELS.md | 11 + .../doc/OVERVIEW.md | 6 + .../doc/REPORTS.md | 3 + .../doc/SECURITY.md | 8 + .../doc/TROUBLESHOOTING.md | 5 + .../doc/USAGE.md | 7 + .../doc/WIZARDS.md | 3 + .../pyproject.toml | 42 ++ .../web_widget_x2many_2d_matrix/README.rst | 249 +++++++ .../web_widget_x2many_2d_matrix/__init__.py | 1 + .../__manifest__.py | 41 ++ .../web_widget_x2many_2d_matrix/i18n/ar.po | 32 + .../web_widget_x2many_2d_matrix/i18n/bs.po | 21 + .../web_widget_x2many_2d_matrix/i18n/de.po | 40 ++ .../web_widget_x2many_2d_matrix/i18n/es.po | 31 + .../web_widget_x2many_2d_matrix/i18n/fi.po | 31 + .../web_widget_x2many_2d_matrix/i18n/fr.po | 39 ++ .../web_widget_x2many_2d_matrix/i18n/hr.po | 41 ++ .../web_widget_x2many_2d_matrix/i18n/it.po | 39 ++ .../web_widget_x2many_2d_matrix/i18n/lt.po | 31 + .../web_widget_x2many_2d_matrix/i18n/nl.po | 36 + .../web_widget_x2many_2d_matrix/i18n/nl_NL.po | 32 + .../web_widget_x2many_2d_matrix/i18n/pt_BR.po | 40 ++ .../web_widget_x2many_2d_matrix/i18n/sl.po | 31 + .../web_widget_x2many_2d_matrix/i18n/tr.po | 31 + .../i18n/web_widget_x2many_2d_matrix.pot | 21 + .../web_widget_x2many_2d_matrix/i18n/zh_CN.po | 36 + .../readme/CONTRIBUTORS.rst | 13 + .../readme/DESCRIPTION.rst | 23 + .../readme/HISTORY.rst | 11 + .../readme/ROADMAP.rst | 16 + .../readme/USAGE.rst | 88 +++ .../static/description/icon.png | Bin 0 -> 2477 bytes .../static/description/index.html | 599 ++++++++++++++++ .../static/description/screenshot.png | Bin 0 -> 24402 bytes .../x2many_2d_matrix_field.esm.js | 100 +++ .../x2many_2d_matrix_field.scss | 73 ++ .../x2many_2d_matrix_field.xml | 16 + .../x2many_2d_matrix_renderer.esm.js | 179 +++++ .../x2many_2d_matrix_renderer.xml | 69 ++ .../views/fields/boolean/boolean_field.esm.js | 13 + 2469 files changed, 101716 insertions(+) create mode 100644 odoo-bringout-oca-web-web_action_conditionable/README.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_action_conditionable/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/README.rst create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/__init__.py create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/web_action_conditionable.pot create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/CREDITS.rst create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/static/src/components/field_one2many.esm.js create mode 100644 odoo-bringout-oca-web-web_advanced_search/README.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_advanced_search/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/README.rst create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/__init__.py create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/da.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/nl.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/nl_NL.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/pl.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/pt.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/web_advanced_search.pot create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/HISTORY.rst create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/img/debug_mode.png create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/DomainSelector.esm.js create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/RecordPicker.esm.js create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/dropdown.esm.js create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/utils.esm.js create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/legacy/js/control_panel/advanced_filter_item.esm.js create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/legacy/js/control_panel/custom_filter_item.esm.js create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/legacy/js/control_panel/filter_menu.esm.js create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.esm.js create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/custom_filter_item.esm.js create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/custom_filter_item.xml create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/filter_menu.esm.js create mode 100644 odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/filter_menu.xml create mode 100644 odoo-bringout-oca-web-web_apply_field_style/README.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_apply_field_style/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/README.rst create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/__init__.py create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/demo/__init__.py create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/demo/base.py create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/web_apply_field_style.pot create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/models/base.py create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/readme/CONFIGURE.rst create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/static/description/demo.png create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/tests/test_module.py create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/README.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/README.rst create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/__init__.py create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/web_calendar_slot_duration.pot create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/CONFIGURE.rst create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/src/js/calendar_common_renderer.esm.js create mode 100644 odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/src/js/calendar_model.esm.js create mode 100644 odoo-bringout-oca-web-web_chatter_position/README.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_chatter_position/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/README.rst create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/__init__.py create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/ca.po create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/nl.po create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/web_chatter_position.pot create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/migrations/16.0.1.0.3/post-migration.py create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/models/res_users.py create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/static/src/js/web_chatter_position.esm.js create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/views/res_users.xml create mode 100644 odoo-bringout-oca-web-web_chatter_position/web_chatter_position/views/web.xml create mode 100644 odoo-bringout-oca-web-web_company_color/README.md create mode 100644 odoo-bringout-oca-web-web_company_color/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_company_color/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_company_color/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_company_color/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_company_color/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_company_color/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_company_color/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_company_color/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_company_color/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_company_color/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_company_color/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_company_color/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_company_color/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_company_color/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/README.rst create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/__init__.py create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/hooks.py create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/i18n/ca.po create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/i18n/nl.po create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/i18n/pt.po create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/i18n/web_company_color.pot create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/migrations/16.0.1.2.1/post-migration.py create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/models/assetsbundle.py create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/models/ir_qweb.py create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/models/res_company.py create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/tests/test_res_company.py create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/utils.py create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/view/assets.xml create mode 100644 odoo-bringout-oca-web-web_company_color/web_company_color/view/res_company.xml create mode 100644 odoo-bringout-oca-web-web_copy_confirm/README.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_copy_confirm/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/README.rst create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/__init__.py create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/i18n/web_copy_confirm.pot create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/readme/HISTORY.rst create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/static/src/js/web_copy_confirm.esm.js create mode 100644 odoo-bringout-oca-web-web_copy_confirm/web_copy_confirm/static/tests/confirm_tests.js create mode 100644 odoo-bringout-oca-web-web_dark_mode/README.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_dark_mode/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/README.rst create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/__init__.py create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/i18n/es_AR.po create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/i18n/web_dark_mode.pot create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/i18n/zh.po create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/models/ir_http.py create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/models/res_users.py create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/static/src/js/switch_item.esm.js create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/static/src/scss/variables.scss create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/tests/test_dark_mode.py create mode 100644 odoo-bringout-oca-web-web_dark_mode/web_dark_mode/views/res_users_views.xml create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/README.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/README.rst create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/__init__.py create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/demo/tile_category.xml create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/demo/tile_tile.xml create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/i18n/web_dashboard_tile.pot create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/models/tile_category.py create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/models/tile_tile.py create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/readme/CONFIGURE.rst create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/security/ir_rule.xml create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/static/description/tile_category_form.png create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/static/description/tile_tile_2_tree_view.png create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/static/description/tile_tile_form.png create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/static/description/tile_tile_form_secondary_value.png create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/static/description/tile_tile_kanban.png create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/static/src/css/web_dashboard_tile.css create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/tests/test_tile.py create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/views/menu.xml create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/views/tile_category.xml create mode 100644 odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/views/tile_tile.xml create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/README.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/README.rst create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/__init__.py create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/i18n/web_datetime_picker_default_time.pot create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/CONTRIBUTORS.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/DESCRIPTION.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/ROADMAP.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/USAGE.md create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/src/js/datepicker.esm.js create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/src/js/datetime_field.esm.js create mode 100644 odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/src/xml/datetime_field.xml create mode 100644 odoo-bringout-oca-web-web_dialog_size/README.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_dialog_size/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/README.rst create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/__init__.py create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/nl.po create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/web_dialog_size.pot create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/models/ir_config_parameter.py create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/CONFIGURE.rst create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/js/web_dialog_draggable.esm.js create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/js/web_dialog_size.esm.js create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/js/web_dialog_size.js create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/scss/web_dialog_size.scss create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/xml/DialogDraggable.xml create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/xml/ExpandButton.xml create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/xml/web_dialog_size.xml create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_dialog_size/web_dialog_size/tests/test_web_dialog_size.py create mode 100644 odoo-bringout-oca-web-web_disable_export_group/README.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_disable_export_group/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/README.rst create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/__init__.py create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/pt.po create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/web_disable_export_group.pot create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/models/ir_http.py create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/models/models.py create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/CONFIGURE.rst create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/security/groups.xml create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/src/js/abstract_controller.esm.js create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/src/js/list_controller.esm.js create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/src/xml/export_xls_views.xml create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/tests/web_disable_export_group_tour.esm.js create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/tests/test_tour.py create mode 100644 odoo-bringout-oca-web-web_domain_field/README.md create mode 100644 odoo-bringout-oca-web-web_domain_field/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_domain_field/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_domain_field/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_domain_field/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_domain_field/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_domain_field/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_domain_field/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_domain_field/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_domain_field/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_domain_field/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_domain_field/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_domain_field/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_domain_field/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_domain_field/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_domain_field/web_domain_field/README.rst create mode 100644 odoo-bringout-oca-web-web_domain_field/web_domain_field/__init__.py create mode 100644 odoo-bringout-oca-web-web_domain_field/web_domain_field/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_domain_field/web_domain_field/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_domain_field/web_domain_field/i18n/web_domain_field.pot create mode 100644 odoo-bringout-oca-web-web_domain_field/web_domain_field/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_domain_field/web_domain_field/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_domain_field/web_domain_field/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_domain_field/web_domain_field/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_domain_field/web_domain_field/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_domain_field/web_domain_field/static/tests/test_qunit.js create mode 100644 odoo-bringout-oca-web-web_domain_field/web_domain_field/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_domain_field/web_domain_field/tests/test_qunit.py create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/README.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/README.rst create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/__init__.py create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/demo/web_editor_class_demo.xml create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/i18n/web_editor_class_selector.pot create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/models/web_editor_class.py create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/backend/html_field.esm.js create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/odoo-editor/OdooEditor.esm.js create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/odoo-editor/commands.esm.js create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/odoo-editor/utils.esm.js create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/wysiwyg/wysiwyg.esm.js create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/scss/demo_styles.scss create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/xml/web_editor.xml create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/views/menus.xml create mode 100644 odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/views/web_editor_class_views.xml create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/README.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/README.rst create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/__init__.py create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/data/ribbon_data.xml create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/ca.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/nl.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/nl_NL.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/pt.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/sl.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/web_environment_ribbon.pot create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/zh.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/models/web_environment_ribbon_backend.py create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/CONFIGURE.rst create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/description/screenshot.png create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/src/css/ribbon.css create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/src/js/ribbon.js create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/tests/test_environment_ribbon_data.py create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/README.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/web_field_numeric_formatting/README.rst create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/web_field_numeric_formatting/__init__.py create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/web_field_numeric_formatting/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/web_field_numeric_formatting/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/web_field_numeric_formatting/i18n/web_field_numeric_formatting.pot create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/web_field_numeric_formatting/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/web_field_numeric_formatting/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/web_field_numeric_formatting/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/web_field_numeric_formatting/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/web_field_numeric_formatting/static/src/components/float_field.esm.js create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/web_field_numeric_formatting/static/src/components/integer_field.esm.js create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/web_field_numeric_formatting/static/src/components/list_renderer.esm.js create mode 100644 odoo-bringout-oca-web-web_field_numeric_formatting/web_field_numeric_formatting/static/tests/field_tests.esm.js create mode 100644 odoo-bringout-oca-web-web_field_tooltip/README.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_field_tooltip/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/README.rst create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/__init__.py create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/i18n/web_field_tooltip.pot create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/models/base.py create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/models/ir_http.py create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/models/ir_model_fields_tooltip.py create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/models/res_users.py create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/security/ir_model_access.xml create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/security/res_groups.xml create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/static/src/components/field_tooltip/field_tooltip.esm.js create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/static/src/components/field_tooltip/field_tooltip.scss create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/static/src/components/field_tooltip/field_tooltip.xml create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/static/src/views/form/form_controller.esm.js create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/static/src/views/form/form_label.esm.js create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/static/src/views/form/form_label.xml create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/static/src/views/list/list_renderer.esm.js create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/static/src/views/list/list_renderer.xml create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/tests/test_web_field_tooltip.py create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/views/ir_model_fields_tooltip.xml create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/views/res_users.xml create mode 100644 odoo-bringout-oca-web-web_field_tooltip/web_field_tooltip/views/template.xml create mode 100644 odoo-bringout-oca-web-web_group_expand/README.md create mode 100644 odoo-bringout-oca-web-web_group_expand/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_group_expand/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_group_expand/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_group_expand/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_group_expand/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_group_expand/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_group_expand/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_group_expand/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_group_expand/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_group_expand/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_group_expand/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_group_expand/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_group_expand/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_group_expand/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/README.rst create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/__init__.py create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/i18n/ca.po create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/i18n/nl.po create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/i18n/web_group_expand.pot create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/static/src/js/list_controller.esm.js create mode 100644 odoo-bringout-oca-web-web_group_expand/web_group_expand/static/src/xml/list_controller.xml create mode 100644 odoo-bringout-oca-web-web_help/README.md create mode 100644 odoo-bringout-oca-web-web_help/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_help/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_help/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_help/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_help/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_help/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_help/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_help/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_help/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_help/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_help/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_help/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_help/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_help/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_help/web_help/README.rst create mode 100644 odoo-bringout-oca-web-web_help/web_help/__init__.py create mode 100644 odoo-bringout-oca-web-web_help/web_help/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_help/web_help/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_help/web_help/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_help/web_help/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_help/web_help/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_help/web_help/i18n/web_help.pot create mode 100644 odoo-bringout-oca-web-web_help/web_help/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_help/web_help/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_help/web_help/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_help/web_help/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/description/changepassword.png create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/description/demo.gif create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/description/viewswitcher.png create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/src/change_password_trip.esm.js create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/src/components/help_button/help_button.esm.js create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/src/components/help_button/help_button.xml create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/src/components/highlighter/highlighter.esm.js create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/src/components/highlighter/highlighter.scss create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/src/components/highlighter/highlighter.xml create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/src/helpers.esm.js create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/src/trip.esm.js create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/src/trip.xml create mode 100644 odoo-bringout-oca-web-web_help/web_help/static/src/user_trip.esm.js create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/README.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/web_hide_field_with_key/README.rst create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/web_hide_field_with_key/__init__.py create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/web_hide_field_with_key/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/web_hide_field_with_key/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/web_hide_field_with_key/i18n/web_hide_field_with_key.pot create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/web_hide_field_with_key/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/web_hide_field_with_key/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/web_hide_field_with_key/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/web_hide_field_with_key/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/web_hide_field_with_key/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_hide_field_with_key/web_hide_field_with_key/static/src/js/hide_custom_hidden_fields.js create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/README.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/README.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/__init__.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/i18n/web_ir_actions_act_multi.pot create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/models/ir_actions.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/models/ir_model.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_multi/web_ir_actions_act_multi/static/src/js/web_ir_actions_act_multi.esm.js create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/README.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/README.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/__init__.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/ar.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/eu.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/fi.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/nl.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/nl_NL.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/pt.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/ro.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/sl.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/i18n/web_ir_actions_act_window_message.pot create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/models/ir_actions.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/static/src/js/web_ir_actions_act_window_message.esm.js create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_message/web_ir_actions_act_window_message/static/src/xml/web_ir_actions_act_window_message.xml create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/README.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/README.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/__init__.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/demo/demo_action.xml create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/i18n/web_ir_actions_act_window_page.pot create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/models/ir_actions_act_window_page.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_ir_actions_act_window_page/web_ir_actions_act_window_page/static/src/web_ir_actions_act_window_page.esm.js create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/README.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/README.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/__init__.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/i18n/web_ir_actions_close_wizard_refresh_view.pot create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/models/ir_actions.py create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_ir_actions_close_wizard_refresh_view/web_ir_actions_close_wizard_refresh_view/static/src/js/web_ir_actions_close_wizard_refresh_view.esm.js create mode 100644 odoo-bringout-oca-web-web_listview_range_select/README.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_listview_range_select/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/README.rst create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/__init__.py create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/i18n/web_listview_range_select.pot create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/static/src/js/web_listview_range_select.esm.js create mode 100644 odoo-bringout-oca-web-web_listview_range_select/web_listview_range_select/static/src/xml/web_listview_range_select.xml create mode 100644 odoo-bringout-oca-web-web_m2x_options/README.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_m2x_options/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/README.rst create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/__init__.py create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/ar.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/es_BO.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/fi.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/nl.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/nl_NL.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/sl.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/web_m2x_options.pot create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/models/ir_config_parameter.py create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/models/ir_http.py create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/readme/CREDITS.rst create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/static/src/components/base.xml create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/static/src/components/form.esm.js create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/static/src/components/relational_utils.esm.js create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_m2x_options/web_m2x_options/tests/test_ir_config_parameter.py create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/README.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/README.rst create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/__init__.py create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/demo/res_partner_demo_view.xml create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/i18n/web_m2x_options_manager.pot create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/models/ir_model.py create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/models/ir_ui_view.py create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/models/m2x_create_edit_option.py create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/tests/test_m2x_create_edit_option.py create mode 100644 odoo-bringout-oca-web-web_m2x_options_manager/web_m2x_options_manager/views/ir_model.xml create mode 100644 odoo-bringout-oca-web-web_no_bubble/README.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_no_bubble/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/README.rst create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/__init__.py create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/i18n/fr_FR.po create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/i18n/web_no_bubble.pot create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_no_bubble/web_no_bubble/static/src/css/web_no_bubble.scss create mode 100644 odoo-bringout-oca-web-web_notify/README.md create mode 100644 odoo-bringout-oca-web-web_notify/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_notify/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_notify/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_notify/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_notify/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_notify/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_notify/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_notify/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_notify/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_notify/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_notify/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_notify/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_notify/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_notify/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/README.rst create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/__init__.py create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/i18n/da.po create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/i18n/nl.po create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/i18n/nl_NL.po create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/i18n/web_notify.pot create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/models/res_users.py create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/readme/INSTALL.rst create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/static/img/notifications_screenshot.gif create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/static/img/test_notifications_demo.png create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/static/src/components/audio_player.esm.js create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/static/src/components/audio_player.xml create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/static/src/js/services/notification.esm.js create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/static/src/js/services/notification_services.esm.js create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/static/src/services/effect_service.esm.js create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/static/src/services/notification_sound_service.esm.js create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/tests/test_res_users.py create mode 100644 odoo-bringout-oca-web-web_notify/web_notify/views/res_users_demo.xml create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/README.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/README.rst create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/__init__.py create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/i18n/web_notify_channel_message.pot create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/models/mail_channel.py create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_notify_channel_message/web_notify_channel_message/tests/test_notify_channel_message.py create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/README.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/README.rst create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/__init__.py create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/i18n/web_notify_upgrade.pot create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/models/ir_model.py create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_notify_upgrade/web_notify_upgrade/static/description/notify.png create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/README.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/README.rst create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/__init__.py create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/i18n/ca.po create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/i18n/web_pivot_computed_measure.pot create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/static/src/dropdown_item_custom_measure/dropdown_item_custom_measure.esm.js create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/static/src/dropdown_item_custom_measure/dropdown_item_custom_measure.scss create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/static/src/dropdown_item_custom_measure/dropdown_item_custom_measure.xml create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/static/src/helpers/utils.esm.js create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/static/src/pivot/pivot_controller.esm.js create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/static/src/pivot/pivot_model.esm.js create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/static/src/pivot/pivot_renderer.esm.js create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/static/src/pivot/pivot_view.xml create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/static/src/test/test.esm.js create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/static/src/view.xml create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/tests/res_users_fake.py create mode 100644 odoo-bringout-oca-web-web_pivot_computed_measure/web_pivot_computed_measure/tests/test_ui_pivot.py create mode 100644 odoo-bringout-oca-web-web_pwa_oca/README.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_pwa_oca/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/README.rst create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/__init__.py create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/controllers/__init__.py create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/controllers/main.py create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/controllers/service_worker.py create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/i18n/es_AR.po create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/i18n/web_pwa_oca.pot create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/models/res_config_settings.py create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/readme/CONFIGURE.rst create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/readme/INSTALL.rst create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/description/pwa.png create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/img/icons/icon-128x128.png create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/img/icons/icon-144x144.png create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/img/icons/icon-152x152.png create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/img/icons/icon-192x192.png create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/img/icons/icon-256x256.png create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/img/icons/icon-512x512.png create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/img/icons/odoo_logo.svg create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/src/js/pwa_manager.js create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/src/js/webclient.js create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/src/js/worker/jquery-sw-compat.js create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/static/src/js/worker/pwa.js create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/templates/assets.xml create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/tests/test_web_pwa_oca_controller.py create mode 100644 odoo-bringout-oca-web-web_pwa_oca/web_pwa_oca/views/res_config_settings_views.xml create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/README.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/README.rst create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/__init__.py create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/demo/quick_screen_action_demo_data.xml create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/i18n/web_quick_start_screen.pot create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/models/quick_start_screen.py create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/models/quick_start_screen_action.py create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/models/res_users.py create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/readme/CONFIGURE.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/readme/CONTEXT.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/readme/CONTRIBUTORS.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/readme/DESCRIPTION.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/readme/ROADMAP.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/readme/USAGE.md create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/security/ir.model.access.csv create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/security/security.xml create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/static/description/icon.svg create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/static/src/js/kanban_controller.esm.js create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/static/src/scss/quick_start_screen.scss create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/tests/test_web_quick_start_screen.py create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/views/quick_screen_action_view.xml create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/views/quick_start_screen_views.xml create mode 100644 odoo-bringout-oca-web-web_quick_start_screen/web_quick_start_screen/views/res_users_views.xml create mode 100644 odoo-bringout-oca-web-web_refresher/README.md create mode 100644 odoo-bringout-oca-web-web_refresher/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_refresher/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_refresher/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_refresher/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_refresher/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_refresher/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_refresher/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_refresher/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_refresher/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_refresher/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_refresher/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_refresher/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_refresher/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_refresher/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/README.rst create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/__init__.py create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/i18n/ca.po create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/i18n/web_refresher.pot create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/static/description/refresh.png create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/static/src/js/control_panel.esm.js create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/static/src/js/refresher.esm.js create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/static/src/scss/refresher.scss create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/static/src/xml/control_panel.xml create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/static/src/xml/form_control_panel.xml create mode 100644 odoo-bringout-oca-web-web_refresher/web_refresher/static/src/xml/refresher.xml create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/README.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/web_remember_tree_column_width/README.rst create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/web_remember_tree_column_width/__init__.py create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/web_remember_tree_column_width/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/web_remember_tree_column_width/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/web_remember_tree_column_width/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/web_remember_tree_column_width/i18n/web_remember_tree_column_width.pot create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/web_remember_tree_column_width/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/web_remember_tree_column_width/readme/CREDITS.rst create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/web_remember_tree_column_width/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/web_remember_tree_column_width/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/web_remember_tree_column_width/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/web_remember_tree_column_width/static/src/js/list_renderer.esm.js create mode 100644 odoo-bringout-oca-web-web_remember_tree_column_width/web_remember_tree_column_width/static/src/scss/main.scss create mode 100644 odoo-bringout-oca-web-web_responsive/README.md create mode 100644 odoo-bringout-oca-web-web_responsive/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_responsive/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_responsive/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_responsive/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_responsive/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_responsive/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_responsive/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_responsive/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_responsive/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_responsive/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_responsive/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_responsive/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_responsive/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_responsive/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/README.rst create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/__init__.py create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/ar.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/ca.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/da.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/fr_FR.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/nl.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/pl.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/pt.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/ru.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/web_responsive.pot create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/appmenu.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/appsearch.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/breadcrumbs.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/calendar.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/chatter-colors.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/chatter.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/chatter_sided.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/chatter_topbar.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/default_icon_app.png create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/device_rotation.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/document_viewer.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/dropdown_scroll.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/form_buttons.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/formview.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/hamburger.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/kanban.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/label_size_large.png create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/label_size_small.png create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/listview.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/mobile_search.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/navbar.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/search_panel.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/shortcuts.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/usermenu.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/img/viewtype.gif create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/apps_menu/apps_menu.esm.js create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/apps_menu/apps_menu.scss create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/apps_menu/apps_menu.xml create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/attachment_viewer/attachment_viewer.esm.js create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/attachment_viewer/attachment_viewer.scss create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/attachment_viewer/attachment_viewer.xml create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/chatter_topbar/chatter_topbar.esm.js create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/chatter_topbar/chatter_topbar.scss create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/chatter_topbar/chatter_topbar.xml create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/control_panel/control_panel.esm.js create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/control_panel/control_panel.scss create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/control_panel/control_panel.xml create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/hotkey/hotkey.scss create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/hotkey/hotkey.xml create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/search_panel/search_panel.esm.js create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/search_panel/search_panel.scss create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/search_panel/search_panel.xml create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/components/ui_context.esm.js create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/img/home-menu-bg-overlay.svg create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/legacy/js/web_responsive.js create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/legacy/scss/web_responsive.scss create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/legacy/xml/form_buttons.xml create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/views/form/form_controller.esm.js create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/src/views/form/form_controller.scss create mode 100644 odoo-bringout-oca-web-web_responsive/web_responsive/static/tests/test_patch.js create mode 100644 odoo-bringout-oca-web-web_save_discard_button/README.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/README.md create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/README.rst create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/__init__.py create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/i18n/web_save_discard_button.pot create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/models/ir_http.py create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/static/description/save_button.png create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/static/src/scss/indicator_button.scss create mode 100644 odoo-bringout-oca-web-web_save_discard_button/web_save_discard_button/static/src/xml/template.xml create mode 100644 odoo-bringout-oca-web-web_search_with_and/README.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_search_with_and/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/README.rst create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/__init__.py create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/i18n/pt.po create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/i18n/web_search_with_and.pot create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/static/src/js/search_bar.esm.js create mode 100644 odoo-bringout-oca-web-web_search_with_and/web_search_with_and/static/src/js/search_model.esm.js create mode 100644 odoo-bringout-oca-web-web_select_all_companies/README.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_select_all_companies/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/README.rst create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/__init__.py create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/i18n/web_select_all_companies.pot create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/static/description/select_all_companies.gif create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/static/src/js/switch_all_company_menu.esm.js create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/static/src/scss/switch_all_company_menu.scss create mode 100644 odoo-bringout-oca-web-web_select_all_companies/web_select_all_companies/static/src/xml/switch_all_company_menu.xml create mode 100644 odoo-bringout-oca-web-web_send_message_popup/README.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_send_message_popup/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_send_message_popup/web_send_message_popup/README.rst create mode 100644 odoo-bringout-oca-web-web_send_message_popup/web_send_message_popup/__init__.py create mode 100644 odoo-bringout-oca-web-web_send_message_popup/web_send_message_popup/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_send_message_popup/web_send_message_popup/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_send_message_popup/web_send_message_popup/i18n/fa.po create mode 100644 odoo-bringout-oca-web-web_send_message_popup/web_send_message_popup/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_send_message_popup/web_send_message_popup/i18n/web_send_message_popup.pot create mode 100644 odoo-bringout-oca-web-web_send_message_popup/web_send_message_popup/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_send_message_popup/web_send_message_popup/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_send_message_popup/web_send_message_popup/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_send_message_popup/web_send_message_popup/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_send_message_popup/web_send_message_popup/static/src/models/chatter/chatter.esm.js create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/README.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/web_sheet_full_width/README.rst create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/web_sheet_full_width/__init__.py create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/web_sheet_full_width/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/web_sheet_full_width/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/web_sheet_full_width/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/web_sheet_full_width/i18n/web_sheet_full_width.pot create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/web_sheet_full_width/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/web_sheet_full_width/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/web_sheet_full_width/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/web_sheet_full_width/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_sheet_full_width/web_sheet_full_width/static/src/scss/web_sheet_full_width.scss create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/README.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/README.rst create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/__init__.py create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/i18n/web_systray_button_init_action.pot create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/readme/CONFIGURE.rst create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/static/src/button/button.esm.js create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/static/src/button/button.xml create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/static/src/tours/tour.esm.js create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_systray_button_init_action/web_systray_button_init_action/tests/test_web_systray_button_init_action.py create mode 100644 odoo-bringout-oca-web-web_theme_classic/README.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_theme_classic/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/README.rst create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/__init__.py create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/i18n/web_theme_classic.pot create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/static/description/product_template_form_with_module.png create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/static/description/product_template_form_without_module.png create mode 100644 odoo-bringout-oca-web-web_theme_classic/web_theme_classic/static/src/scss/web_theme_classic.scss create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/README.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/README.rst create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/__init__.py create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/i18n/web_time_range_menu_custom.pot create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/static/description/custom_period_option.png create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/static/src/js/comparison_menu.esm.js create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/static/src/js/date_selector.esm.js create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/static/src/js/dates.esm.js create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/static/src/js/filter_menu.esm.js create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/static/src/scss/web_time_range_menu_custom.scss create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/static/src/xml/comparison_menu.xml create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/static/src/xml/date_selector.xml create mode 100644 odoo-bringout-oca-web-web_time_range_menu_custom/web_time_range_menu_custom/static/src/xml/filter_menu.xml create mode 100644 odoo-bringout-oca-web-web_timeline/README.md create mode 100644 odoo-bringout-oca-web-web_timeline/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_timeline/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_timeline/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_timeline/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_timeline/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_timeline/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_timeline/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_timeline/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_timeline/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_timeline/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_timeline/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_timeline/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_timeline/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_timeline/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/README.rst create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/__init__.py create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/demo/ir_cron_view.xml create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/fa.po create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/he.po create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/nl_NL.po create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/pt.po create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/web_timeline.pot create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/models/ir_ui_view.py create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/readme/CONFIGURE.rst create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/static/src/js/timeline_canvas.js create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/static/src/js/timeline_controller.esm.js create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/static/src/js/timeline_model.js create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/static/src/js/timeline_renderer.js create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/static/src/js/timeline_view.js create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/static/src/scss/web_timeline.scss create mode 100644 odoo-bringout-oca-web-web_timeline/web_timeline/static/src/xml/web_timeline.xml create mode 100644 odoo-bringout-oca-web-web_touchscreen/README.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/README.rst create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/__init__.py create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/i18n/web_touchscreen.pot create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/readme/CONTEXT.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/readme/CONTRIBUTORS.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/readme/CREDITS.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/readme/DESCRIPTION.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/readme/ROADMAP.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/readme/USAGE.md create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_touchscreen/web_touchscreen/static/src/form_controller.esm.js create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/README.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/README.rst create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/__init__.py create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/i18n/ca.po create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/i18n/he_IL.po create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/i18n/pt.po create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/i18n/web_tree_duplicate.pot create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/readme/CONFIGURE.rst create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/static/description/screenshot-duplicate.png create mode 100644 odoo-bringout-oca-web-web_tree_duplicate/web_tree_duplicate/static/src/web_tree_duplicate.esm.js create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/README.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/README.rst create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/__init__.py create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/demo/res_users.xml create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/i18n/fi.po create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/i18n/nl_NL.po create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/i18n/sl.po create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/i18n/web_tree_dynamic_colored_field.pot create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/readme/CONTRIBUTORS.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/readme/CREDITS.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/readme/DESCRIPTION.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/readme/ROADMAP.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/readme/USAGE.md create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/static/src/js/list_renderer.esm.js create mode 100644 odoo-bringout-oca-web-web_tree_dynamic_colored_field/web_tree_dynamic_colored_field/static/src/xml/list.xml create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/README.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/README.rst create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/__init__.py create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/i18n/web_tree_many2one_clickable.pot create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/readme/CONFIGURATION.rst create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/static/img/clickable.gif create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/static/src/components/many2one_button/many2one_button.esm.js create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/static/src/components/many2one_button/many2one_button.scss create mode 100644 odoo-bringout-oca-web-web_tree_many2one_clickable/web_tree_many2one_clickable/static/src/components/many2one_button/many2one_button.xml create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/README.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/i18n/web_widget_bokeh_chart.pot create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/readme/CREDITS.rst create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/readme/INSTALL.rst create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/static/description/example.png create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/static/src/js/web_widget_bokeh_chart.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/static/src/js/web_widget_bokeh_json_chart.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_bokeh_chart/web_widget_bokeh_chart/static/src/xml/bokeh.xml create mode 100644 odoo-bringout-oca-web-web_widget_char_size/README.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_char_size/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_char_size/web_widget_char_size/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_char_size/web_widget_char_size/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_char_size/web_widget_char_size/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_char_size/web_widget_char_size/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_char_size/web_widget_char_size/i18n/web_widget_char_size.pot create mode 100644 odoo-bringout-oca-web-web_widget_char_size/web_widget_char_size/readme/CONTRIBUTERS.rst create mode 100644 odoo-bringout-oca-web-web_widget_char_size/web_widget_char_size/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_char_size/web_widget_char_size/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_char_size/web_widget_char_size/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_char_size/web_widget_char_size/static/src/js/char_widget.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/README.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/web_widget_datepicker_fulloptions/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/web_widget_datepicker_fulloptions/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/web_widget_datepicker_fulloptions/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/web_widget_datepicker_fulloptions/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/web_widget_datepicker_fulloptions/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/web_widget_datepicker_fulloptions/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/web_widget_datepicker_fulloptions/i18n/web_widget_datepicker_fulloptions.pot create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/web_widget_datepicker_fulloptions/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/web_widget_datepicker_fulloptions/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/web_widget_datepicker_fulloptions/static/description/change.png create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/web_widget_datepicker_fulloptions/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/web_widget_datepicker_fulloptions/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_datepicker_fulloptions/web_widget_datepicker_fulloptions/static/src/js/web_widget_datepicker_fulloptions.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/README.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/i18n/web_widget_domain_editor_dialog.pot create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/static/src/img/behaviour.gif create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/static/src/js/domain_field.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_domain_editor_dialog/web_widget_domain_editor_dialog/static/src/js/widget_domain_editor_dialog.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/README.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/i18n/web_widget_dropdown_dynamic.pot create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/readme/CREDITS.rst create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/static/src/js/basic_model.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/static/src/js/field_dynamic_dropdown.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_dropdown_dynamic/web_widget_dropdown_dynamic/static/tests/web_widget_dropdown_dynamic_tests.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_image_download/README.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_image_download/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/i18n/lt.po create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/i18n/nl_NL.po create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/i18n/pt.po create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/i18n/web_widget_image_download.pot create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/static/src/components/image_field.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_image_download/web_widget_image_download/static/src/xml/web_widget_image_download.xml create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/README.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/i18n/web_widget_image_webcam.pot create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/models/ir_config_parameter.py create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/readme/CONFIGURE.rst create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/static/src/css/web_widget_image_webcam.css create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/static/src/img/webcam_placeholder.png create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/static/src/js/webcam_widget.js create mode 100644 odoo-bringout-oca-web-web_widget_image_webcam/web_widget_image_webcam/static/src/xml/web_widget_image_webcam.xml create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/README.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/i18n/web_widget_mpld3_chart.pot create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/models/abstract_mpld3_parser.py create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/readme/CREDITS.rst create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/readme/INSTALL.rst create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/static/src/js/web_widget_mpld3_chart.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_mpld3_chart/web_widget_mpld3_chart/static/src/xml/web_widget_mpld3_chart.xml create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/README.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/i18n/web_widget_numeric_step.pot create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/static/description/add_two_buttons.png create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/static/description/step0,25andlimits.gif create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/static/description/step10_limit15_placeholder117_with_onchange.gif create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/static/src/numeric_step.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/static/src/numeric_step.scss create mode 100644 odoo-bringout-oca-web-web_widget_numeric_step/web_widget_numeric_step/static/src/numeric_step.xml create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/README.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/i18n/web_widget_one2many_tree_line_duplicate.pot create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/static/src/basic_relational_model/basic_relational_model.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/static/src/legacy/basic_model/basic_model.js create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/static/src/list/list_renderer.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_one2many_tree_line_duplicate/web_widget_one2many_tree_line_duplicate/static/src/list/list_renderer.xml create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/README.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/demo/res_users_view.xml create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/i18n/ca.po create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/i18n/ja.po create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/i18n/web_widget_open_tab.pot create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/models/ir_model.py create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/models/ir_ui_view.py create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/static/src/js/open_tab_widget.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/static/src/xml/open_tab_widget.xml create mode 100644 odoo-bringout-oca-web-web_widget_open_tab/web_widget_open_tab/views/ir_model_views.xml create mode 100644 odoo-bringout-oca-web-web_widget_pattern/README.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/demo/res_partner_views.xml create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/i18n/web_widget_pattern.pot create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/models/base.py create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/readme/CONTRIBUTORS.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/readme/DESCRIPTION.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/readme/ROADMAP.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/readme/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/static/src/autocomplete.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/static/src/autocomplete.xml create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/static/src/char_field.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/static/src/char_field.xml create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/tests/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_pattern/web_widget_pattern/tests/test_web_widget_pattern.py create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/README.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/demo/res_partner_views.xml create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/i18n/web_widget_pattern_partner_autocomplete.pot create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/models/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/models/base.py create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/readme/CONTRIBUTORS.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/readme/DESCRIPTION.md create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_pattern_partner_autocomplete/web_widget_pattern_partner_autocomplete/static/src/autocomplete.xml create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/README.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/i18n/ca.po create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/i18n/da.po create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/i18n/web_widget_plotly_chart.pot create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/readme/CREDITS.rst create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/readme/INSTALL.rst create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/static/description/example.png create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/static/src/js/widget_plotly.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_plotly_chart/web_widget_plotly_chart/static/src/js/widget_plotly.xml create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/README.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/i18n/web_widget_product_label_section_and_note.pot create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/readme/CONFIGURE.rst create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/static/src/components/product_label_section_and_note_field/product_label_section_and_note_field.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/static/src/components/product_label_section_and_note_field/product_label_section_and_note_field.scss create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/static/src/components/product_label_section_and_note_field/product_label_section_and_note_field.xml create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/static/src/core/utils/autoresize.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/static/src/core/utils/product_and_label_autoresize.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_product_label_section_and_note/web_widget_product_label_section_and_note/views/account_move_views.xml create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/README.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/i18n/web_widget_progressbar_gradient.pot create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/readme/CONTRIBUTORS.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/readme/DESCRIPTION.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/readme/ROADMAP.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/readme/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/static/description/progressbar_gradient.png create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/static/description/progressbar_gradient_inverse.png create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/static/src/js/progressbar.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/static/src/scss/progressbar.scss create mode 100644 odoo-bringout-oca-web-web_widget_progressbar_gradient/web_widget_progressbar_gradient/static/src/xml/progressbar.xml create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/README.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/web_widget_remaining_days_exact_date/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/web_widget_remaining_days_exact_date/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/web_widget_remaining_days_exact_date/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/web_widget_remaining_days_exact_date/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/web_widget_remaining_days_exact_date/i18n/web_widget_remaining_days_exact_date.pot create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/web_widget_remaining_days_exact_date/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/web_widget_remaining_days_exact_date/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/web_widget_remaining_days_exact_date/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/web_widget_remaining_days_exact_date/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/web_widget_remaining_days_exact_date/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_remaining_days_exact_date/web_widget_remaining_days_exact_date/static/src/remaining_days/remaining_days.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/README.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/doc/ARCHITECTURE.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/doc/CONFIGURATION.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/doc/CONTROLLERS.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/doc/DEPENDENCIES.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/doc/FAQ.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/doc/INSTALL.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/doc/MODELS.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/doc/OVERVIEW.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/doc/REPORTS.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/doc/SECURITY.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/doc/TROUBLESHOOTING.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/doc/USAGE.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/doc/WIZARDS.md create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/pyproject.toml create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/README.rst create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/__init__.py create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/__manifest__.py create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/ar.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/bs.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/de.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/es.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/fi.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/fr.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/hr.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/it.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/lt.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/nl.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/nl_NL.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/pt_BR.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/sl.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/tr.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/web_widget_x2many_2d_matrix.pot create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/i18n/zh_CN.po create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/readme/CONTRIBUTORS.rst create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/readme/DESCRIPTION.rst create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/readme/HISTORY.rst create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/readme/ROADMAP.rst create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/readme/USAGE.rst create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/static/description/icon.png create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/static/description/index.html create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/static/description/screenshot.png create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/static/src/components/x2many_2d_matrix_field/x2many_2d_matrix_field.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/static/src/components/x2many_2d_matrix_field/x2many_2d_matrix_field.scss create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/static/src/components/x2many_2d_matrix_field/x2many_2d_matrix_field.xml create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/static/src/components/x2many_2d_matrix_renderer/x2many_2d_matrix_renderer.esm.js create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/static/src/components/x2many_2d_matrix_renderer/x2many_2d_matrix_renderer.xml create mode 100644 odoo-bringout-oca-web-web_widget_x2many_2d_matrix/web_widget_x2many_2d_matrix/static/src/views/fields/boolean/boolean_field.esm.js diff --git a/odoo-bringout-oca-web-web_action_conditionable/README.md b/odoo-bringout-oca-web-web_action_conditionable/README.md new file mode 100644 index 0000000..d189879 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/README.md @@ -0,0 +1,47 @@ +# web_action_conditionable + +Odoo addon: web_action_conditionable + +## Installation + +```bash +pip install odoo-bringout-oca-web-web_action_conditionable +``` + +## Dependencies + +This addon depends on: +- base +- web + +## Manifest Information + +- **Name**: web_action_conditionable +- **Version**: 16.0.1.0.0 +- **Category**: N/A +- **License**: AGPL-3 +- **Installable**: True + +## Source + +Based on [OCA/web](https://github.com/OCA/web) branch 16.0, addon `web_action_conditionable`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Reports: doc/REPORTS.md +- Security: doc/SECURITY.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-web-web_action_conditionable/doc/ARCHITECTURE.md b/odoo-bringout-oca-web-web_action_conditionable/doc/ARCHITECTURE.md new file mode 100644 index 0000000..6f261d0 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Web_action_conditionable Module - web_action_conditionable + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-web-web_action_conditionable/doc/CONFIGURATION.md b/odoo-bringout-oca-web-web_action_conditionable/doc/CONFIGURATION.md new file mode 100644 index 0000000..d58c35e --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for web_action_conditionable. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-web-web_action_conditionable/doc/CONTROLLERS.md b/odoo-bringout-oca-web-web_action_conditionable/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-web-web_action_conditionable/doc/DEPENDENCIES.md b/odoo-bringout-oca-web-web_action_conditionable/doc/DEPENDENCIES.md new file mode 100644 index 0000000..17a01ac --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/doc/DEPENDENCIES.md @@ -0,0 +1,6 @@ +# Dependencies + +This addon depends on: + +- base +- [web](https://github.com/bringout/oca-ocb-core/tree/b3e6fb998e53b9eb1bc9669d992017616c2bd7b3/odoo-bringout-oca-ocb-web) diff --git a/odoo-bringout-oca-web-web_action_conditionable/doc/FAQ.md b/odoo-bringout-oca-web-web_action_conditionable/doc/FAQ.md new file mode 100644 index 0000000..aaeaa70 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon web_action_conditionable or install in UI. diff --git a/odoo-bringout-oca-web-web_action_conditionable/doc/INSTALL.md b/odoo-bringout-oca-web-web_action_conditionable/doc/INSTALL.md new file mode 100644 index 0000000..0cb88ed --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-web-web_action_conditionable" +# or +uv pip install odoo-bringout-oca-web-web_action_conditionable" +``` diff --git a/odoo-bringout-oca-web-web_action_conditionable/doc/MODELS.md b/odoo-bringout-oca-web-web_action_conditionable/doc/MODELS.md new file mode 100644 index 0000000..9346e5e --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/doc/MODELS.md @@ -0,0 +1,11 @@ +# Models + +Detected core models and extensions in web_action_conditionable. + +```mermaid +classDiagram +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-web-web_action_conditionable/doc/OVERVIEW.md b/odoo-bringout-oca-web-web_action_conditionable/doc/OVERVIEW.md new file mode 100644 index 0000000..b6f1e66 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: web_action_conditionable. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon web_action_conditionable +- License: LGPL-3 diff --git a/odoo-bringout-oca-web-web_action_conditionable/doc/REPORTS.md b/odoo-bringout-oca-web-web_action_conditionable/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-web-web_action_conditionable/doc/SECURITY.md b/odoo-bringout-oca-web-web_action_conditionable/doc/SECURITY.md new file mode 100644 index 0000000..e07da9d --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/doc/SECURITY.md @@ -0,0 +1,8 @@ +# Security + +This module does not define custom security rules or access controls beyond Odoo defaults. + +Default Odoo security applies: +- Base user access through standard groups +- Model access inherited from dependencies +- No custom row-level security rules diff --git a/odoo-bringout-oca-web-web_action_conditionable/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-web-web_action_conditionable/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-web-web_action_conditionable/doc/USAGE.md b/odoo-bringout-oca-web-web_action_conditionable/doc/USAGE.md new file mode 100644 index 0000000..afe7c60 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon web_action_conditionable +``` diff --git a/odoo-bringout-oca-web-web_action_conditionable/doc/WIZARDS.md b/odoo-bringout-oca-web-web_action_conditionable/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-web-web_action_conditionable/pyproject.toml b/odoo-bringout-oca-web-web_action_conditionable/pyproject.toml new file mode 100644 index 0000000..fa0656e --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/pyproject.toml @@ -0,0 +1,43 @@ +[project] +name = "odoo-bringout-oca-web-web_action_conditionable" +version = "16.0.0" +description = "web_action_conditionable - Odoo addon" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-ocb-base>=16.0.0", + "odoo-bringout-oca-ocb-web>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["web_action_conditionable"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/README.rst b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/README.rst new file mode 100644 index 0000000..e939676 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/README.rst @@ -0,0 +1,104 @@ +======================== +web_action_conditionable +======================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:4bc330cf2cd18ff1c39c729eeae66a68dde8f3252b6825de70919e0f45dcc9fc + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_action_conditionable + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_action_conditionable + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Add support for conditions on create and delete actions on One2Many fields. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Odoo by default support: + +:: + + + +with this module you can: + +:: + + + +It works in any tree view, so you can use it in One2many. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Cristian Salamea + +Contributors +~~~~~~~~~~~~ + +* Cristian Salamea +* André Paramés (https://www.acsone.eu/) +* Alexandre Díaz +* Sudhir Arya +* Jasper Jumelet +* `Trobz `_: + * Nguyễn Minh Chiến + +Other credits +~~~~~~~~~~~~~ + +The migration of this module from 15.0 to 16.0 was financially supported by Camptocamp + +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/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/__init__.py b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/__manifest__.py b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/__manifest__.py new file mode 100644 index 0000000..1eee3d4 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/__manifest__.py @@ -0,0 +1,16 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "web_action_conditionable", + "version": "16.0.1.0.0", + "depends": ["base", "web"], + "data": [], + "author": "Cristian Salamea,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "license": "AGPL-3", + "assets": { + "web.assets_backend": [ + "web_action_conditionable/static/src/components/*", + ], + }, + "installable": True, +} diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/es.po b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/es.po new file mode 100644 index 0000000..e69de29 diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/hr.po b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/hr.po new file mode 100644 index 0000000..e69de29 diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/it.po b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/it.po new file mode 100644 index 0000000..7338855 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/it.po @@ -0,0 +1,14 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/web_action_conditionable.pot b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/web_action_conditionable.pot new file mode 100644 index 0000000..78d58d5 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/web_action_conditionable.pot @@ -0,0 +1,13 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/zh_CN.po b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/i18n/zh_CN.po new file mode 100644 index 0000000..e69de29 diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..2006ed4 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/CONTRIBUTORS.rst @@ -0,0 +1,7 @@ +* Cristian Salamea +* André Paramés (https://www.acsone.eu/) +* Alexandre Díaz +* Sudhir Arya +* Jasper Jumelet +* `Trobz `_: + * Nguyễn Minh Chiến diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/CREDITS.rst b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/CREDITS.rst new file mode 100644 index 0000000..70bc307 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/CREDITS.rst @@ -0,0 +1 @@ +The migration of this module from 15.0 to 16.0 was financially supported by Camptocamp diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/DESCRIPTION.rst b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/DESCRIPTION.rst new file mode 100644 index 0000000..c788d29 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Add support for conditions on create and delete actions on One2Many fields. diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/USAGE.rst b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/USAGE.rst new file mode 100644 index 0000000..8c56b16 --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/readme/USAGE.rst @@ -0,0 +1,13 @@ +Odoo by default support: + +:: + + + +with this module you can: + +:: + + + +It works in any tree view, so you can use it in One2many. diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/static/description/icon.png b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 Q3=9kmp00i_>zopr09!l7U;qFB literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/static/description/index.html b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/static/description/index.html new file mode 100644 index 0000000..ba26bcb --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/static/description/index.html @@ -0,0 +1,451 @@ + + + + + + +web_action_conditionable + + + +
+

web_action_conditionable

+ + +

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

+

Add support for conditions on create and delete actions on One2Many fields.

+

Table of contents

+ +
+

Usage

+

Odoo by default support:

+
+<tree delete="false" create="false">
+
+

with this module you can:

+
+<tree delete="state=='draft'" create="state!='sent'">
+
+

It works in any tree view, so you can use it in One2many.

+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Cristian Salamea
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The migration of this module from 15.0 to 16.0 was financially supported by Camptocamp

+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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

+

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

+

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

+
+
+
+ + diff --git a/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/static/src/components/field_one2many.esm.js b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/static/src/components/field_one2many.esm.js new file mode 100644 index 0000000..4d5da3a --- /dev/null +++ b/odoo-bringout-oca-web-web_action_conditionable/web_action_conditionable/static/src/components/field_one2many.esm.js @@ -0,0 +1,37 @@ +/** @odoo-module **/ +import {X2ManyField} from "@web/views/fields/x2many/x2many_field"; +import {XMLParser} from "@web/core/utils/xml"; +import {evaluateExpr} from "@web/core/py_js/py"; +import {patch} from "@web/core/utils/patch"; + +patch(X2ManyField.prototype, "web_action_conditionable_FieldOne2Many", { + get rendererProps() { + this.updateActiveActions(); + return this._super(...arguments); + }, + updateActiveActions() { + if (this.viewMode === "list" && this.activeActions.type === "one2many") { + const self = this; + const parser = new XMLParser(); + const archInfo = this.activeField.views[this.viewMode]; + const xmlDoc = parser.parseXML(archInfo.__rawArch); + ["create", "delete"].forEach(function (item) { + if (self.activeActions[item] && _.has(xmlDoc.attributes, item)) { + const expr = xmlDoc.getAttribute(item); + try { + self.activeActions[item] = evaluateExpr( + expr, + self.props.record.data + ); + } catch (ignored) { + console.log( + "[web_action_conditionable] unrecognized expr '" + + expr + + "', ignoring" + ); + } + } + }); + } + }, +}); diff --git a/odoo-bringout-oca-web-web_advanced_search/README.md b/odoo-bringout-oca-web-web_advanced_search/README.md new file mode 100644 index 0000000..eb90fbc --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/README.md @@ -0,0 +1,46 @@ +# Advanced search + +Odoo addon: web_advanced_search + +## Installation + +```bash +pip install odoo-bringout-oca-web-web_advanced_search +``` + +## Dependencies + +This addon depends on: +- web + +## Manifest Information + +- **Name**: Advanced search +- **Version**: 16.0.1.0.6 +- **Category**: Usability +- **License**: AGPL-3 +- **Installable**: False + +## Source + +Based on [OCA/web](https://github.com/OCA/web) branch 16.0, addon `web_advanced_search`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Reports: doc/REPORTS.md +- Security: doc/SECURITY.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-web-web_advanced_search/doc/ARCHITECTURE.md b/odoo-bringout-oca-web-web_advanced_search/doc/ARCHITECTURE.md new file mode 100644 index 0000000..769d1cd --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Web_advanced_search Module - web_advanced_search + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-web-web_advanced_search/doc/CONFIGURATION.md b/odoo-bringout-oca-web-web_advanced_search/doc/CONFIGURATION.md new file mode 100644 index 0000000..2202440 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for web_advanced_search. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-web-web_advanced_search/doc/CONTROLLERS.md b/odoo-bringout-oca-web-web_advanced_search/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-web-web_advanced_search/doc/DEPENDENCIES.md b/odoo-bringout-oca-web-web_advanced_search/doc/DEPENDENCIES.md new file mode 100644 index 0000000..b3b749a --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/doc/DEPENDENCIES.md @@ -0,0 +1,5 @@ +# Dependencies + +This addon depends on: + +- [web](https://github.com/bringout/oca-ocb-core/tree/b3e6fb998e53b9eb1bc9669d992017616c2bd7b3/odoo-bringout-oca-ocb-web) diff --git a/odoo-bringout-oca-web-web_advanced_search/doc/FAQ.md b/odoo-bringout-oca-web-web_advanced_search/doc/FAQ.md new file mode 100644 index 0000000..19e468f --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon web_advanced_search or install in UI. diff --git a/odoo-bringout-oca-web-web_advanced_search/doc/INSTALL.md b/odoo-bringout-oca-web-web_advanced_search/doc/INSTALL.md new file mode 100644 index 0000000..e5e53e6 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-web-web_advanced_search" +# or +uv pip install odoo-bringout-oca-web-web_advanced_search" +``` diff --git a/odoo-bringout-oca-web-web_advanced_search/doc/MODELS.md b/odoo-bringout-oca-web-web_advanced_search/doc/MODELS.md new file mode 100644 index 0000000..9a50cf7 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/doc/MODELS.md @@ -0,0 +1,11 @@ +# Models + +Detected core models and extensions in web_advanced_search. + +```mermaid +classDiagram +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-web-web_advanced_search/doc/OVERVIEW.md b/odoo-bringout-oca-web-web_advanced_search/doc/OVERVIEW.md new file mode 100644 index 0000000..baf0534 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: web_advanced_search. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon web_advanced_search +- License: LGPL-3 diff --git a/odoo-bringout-oca-web-web_advanced_search/doc/REPORTS.md b/odoo-bringout-oca-web-web_advanced_search/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-web-web_advanced_search/doc/SECURITY.md b/odoo-bringout-oca-web-web_advanced_search/doc/SECURITY.md new file mode 100644 index 0000000..e07da9d --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/doc/SECURITY.md @@ -0,0 +1,8 @@ +# Security + +This module does not define custom security rules or access controls beyond Odoo defaults. + +Default Odoo security applies: +- Base user access through standard groups +- Model access inherited from dependencies +- No custom row-level security rules diff --git a/odoo-bringout-oca-web-web_advanced_search/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-web-web_advanced_search/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-web-web_advanced_search/doc/USAGE.md b/odoo-bringout-oca-web-web_advanced_search/doc/USAGE.md new file mode 100644 index 0000000..da3c454 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon web_advanced_search +``` diff --git a/odoo-bringout-oca-web-web_advanced_search/doc/WIZARDS.md b/odoo-bringout-oca-web-web_advanced_search/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-web-web_advanced_search/pyproject.toml b/odoo-bringout-oca-web-web_advanced_search/pyproject.toml new file mode 100644 index 0000000..205e7a3 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/pyproject.toml @@ -0,0 +1,42 @@ +[project] +name = "odoo-bringout-oca-web-web_advanced_search" +version = "16.0.0" +description = "Advanced search - Easier and more powerful searching tools" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-ocb-web>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["web_advanced_search"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/README.rst b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/README.rst new file mode 100644 index 0000000..c0d8bcb --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/README.rst @@ -0,0 +1,193 @@ +=============== +Advanced search +=============== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:65c79a6f6afe59fa74b84abd881a95cb2ab25a8f4adcbf84af205873d9302d23 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_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-16-0/web-16-0-web_advanced_search + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|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/16.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 to smash 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 +* Camptocamp + +Contributors +~~~~~~~~~~~~ + +* Holger Brunn +* Rami Alwafaie +* Jose Mª Bernet +* Simone Orsi +* Dennis Sluijk +* `Tecnativa `_: + + * Vicent Cubells + * Jairo Llopis + * Alexandre Díaz + +* `DynApps NV `_: + + * Raf Ven + +* `Camptocamp `_ + + * Iván Todorovich + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-ivantodorovich| image:: https://github.com/ivantodorovich.png?size=40px + :target: https://github.com/ivantodorovich + :alt: ivantodorovich + +Current `maintainer `__: + +|maintainer-ivantodorovich| + +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/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/__init__.py b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/__manifest__.py b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/__manifest__.py new file mode 100644 index 0000000..09b8772 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/__manifest__.py @@ -0,0 +1,23 @@ +# 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", + "summary": "Easier and more powerful searching tools", + "version": "16.0.1.0.6", + "author": "Therp BV, Tecnativa, Camptocamp, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "maintainers": ["ivantodorovich"], + "license": "AGPL-3", + "category": "Usability", + "depends": ["web"], + "assets": { + "web.assets_backend": [ + "web_advanced_search/static/src/js/**/*", + "web_advanced_search/static/src/legacy/**/*", + "web_advanced_search/static/src/search/**/*", + ] + }, +} diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/bs.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/bs.po new file mode 100644 index 0000000..fbb6ecf --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/bs.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr " i " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr " nije " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr " ili " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Dodaj napredni filter" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "Domena nije postavljena ispravno" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "Greška sintakse" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/da.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/da.po new file mode 100644 index 0000000..83bdff0 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/da.po @@ -0,0 +1,59 @@ +# 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 +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Tilføj avanceret filter" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/de.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/de.po new file mode 100644 index 0000000..0787652 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/de.po @@ -0,0 +1,65 @@ +# 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: 2023-06-20 11:09+0000\n" +"Last-Translator: Nils Coenen \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 4.17\n" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr " und " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr " ist nicht " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr " oder " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Erweitertes Filter hinzufügen" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "" + +#~ msgid "is in selection" +#~ msgstr "Ist in Auswahl" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/es.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/es.po new file mode 100644 index 0000000..911dd33 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/es.po @@ -0,0 +1,65 @@ +# 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: 2023-09-02 20:35+0000\n" +"Last-Translator: Ivorra78 \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 4.17\n" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr " y " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr " no es " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr " o " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Añadir un Filtro Avanzado" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "" + +#~ msgid "is in selection" +#~ msgstr "está en la selección" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/fr.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/fr.po new file mode 100644 index 0000000..4546a73 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/fr.po @@ -0,0 +1,65 @@ +# 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: 2023-11-06 17:37+0000\n" +"Last-Translator: Rémi \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 4.17\n" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr " et " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr " n'est pas " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr " ou " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Ajouter un filtre avancé" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "" + +#~ msgid "is in selection" +#~ msgstr "parmi la sélection" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/hr.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/hr.po new file mode 100644 index 0000000..264805b --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/hr.po @@ -0,0 +1,66 @@ +# 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: 2024-12-12 11:06+0000\n" +"Last-Translator: vladimiruvid \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 5.6.2\n" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr " i " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr " nije " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr " ili " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Dodaj napredni filter" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "Domena nije postavljena ispravno" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "Greška sintakse" + +#~ msgid "is in selection" +#~ msgstr "je u odabiru" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/it.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/it.po new file mode 100644 index 0000000..6ca474b --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/it.po @@ -0,0 +1,59 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-10-17 15:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr " e " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr " non è " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr " o " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Aggiungi Filtro Avanzato" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "Dominio formattato non correttamente" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "Errore di sintassi" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/nl.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/nl.po new file mode 100644 index 0000000..e068732 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/nl.po @@ -0,0 +1,65 @@ +# 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: 2023-08-07 16:10+0000\n" +"Last-Translator: \"Jan Tapper [Onestein]\" \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 4.17\n" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr " en " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr " is niet " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr " of " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Voeg Geavanceerde Filter Toe" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "" + +#~ msgid "is in selection" +#~ msgstr "is in selectie" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/nl_NL.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/nl_NL.po new file mode 100644 index 0000000..8adcefc --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/nl_NL.po @@ -0,0 +1,66 @@ +# 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: 2023-05-05 11:22+0000\n" +"Last-Translator: Bosd \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 4.14.1\n" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr " en " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr " is niet " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr " of " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Voeg geavanceerde filter toe" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "" + +#~ msgid "is in selection" +#~ msgstr "Is in selectie" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/pl.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/pl.po new file mode 100644 index 0000000..657f9f7 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/pl.po @@ -0,0 +1,60 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2022-08-11 13:07+0000\n" +"Last-Translator: Jacek Michalski \n" +"Language-Team: none\n" +"Language: pl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr " oraz " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr " nie jest " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr " lub " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Dodaj Filtr Zaawansowany" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/pt.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/pt.po new file mode 100644 index 0000000..4c604b4 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/pt.po @@ -0,0 +1,59 @@ +# 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 +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Adicionar Filtro Avançado" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/pt_BR.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/pt_BR.po new file mode 100644 index 0000000..972672a --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/pt_BR.po @@ -0,0 +1,67 @@ +# 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: 2024-11-13 17:06+0000\n" +"Last-Translator: Rodrigo Sottomaior 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 5.6.2\n" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr " e " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr " não é " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr " ou " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Adicionar filtro avançado" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "Domínio não formado corretamente" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "Erro de sintaxe" + +#~ msgid "is in selection" +#~ msgstr "Está em seleção" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/tr.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/tr.po new file mode 100644 index 0000000..1317e59 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/tr.po @@ -0,0 +1,59 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-01-29 22:06+0000\n" +"Last-Translator: Ahmet Yiğit Budak \n" +"Language-Team: none\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr " ve " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr " değildir " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr " veya " + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "Gelişmiş Filtre Ekle" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "Filtre düzgün şekilde yazılmadı" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "Sözdizimi hatası" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/web_advanced_search.pot b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/web_advanced_search.pot new file mode 100644 index 0000000..3f892bc --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/web_advanced_search.pot @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_advanced_search +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/zh_CN.po b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/zh_CN.po new file mode 100644 index 0000000..352e965 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/i18n/zh_CN.po @@ -0,0 +1,59 @@ +# 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 +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " and " +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " is not " +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/utils.esm.js:0 +#, python-format +msgid " or " +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml:0 +#, python-format +msgid "Add Advanced Filter" +msgstr "添加高级过滤器" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Domain not properly formed" +msgstr "" + +#. module: web_advanced_search +#. odoo-javascript +#: code:addons/web_advanced_search/static/src/js/DomainSelector.esm.js:0 +#, python-format +msgid "Syntax error" +msgstr "" diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..07528e2 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/CONTRIBUTORS.rst @@ -0,0 +1,18 @@ +* Holger Brunn +* Rami Alwafaie +* Jose Mª Bernet +* Simone Orsi +* Dennis Sluijk +* `Tecnativa `_: + + * Vicent Cubells + * Jairo Llopis + * Alexandre Díaz + +* `DynApps NV `_: + + * Raf Ven + +* `Camptocamp `_ + + * Iván Todorovich diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/DESCRIPTION.rst b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/DESCRIPTION.rst new file mode 100644 index 0000000..bd4c29f --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +More powerful and easy to use search, especially for related fields. diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/HISTORY.rst b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/HISTORY.rst new file mode 100644 index 0000000..7b791ed --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/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/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/ROADMAP.rst b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/ROADMAP.rst new file mode 100644 index 0000000..b71b3c3 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/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/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/USAGE.rst b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/readme/USAGE.rst new file mode 100644 index 0000000..76f224a --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/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/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/description/icon.png b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1ab5d1e101731ea66677d2dcf278b4c9dbd8ea43 GIT binary patch literal 2053 zcmeAS@N?(olHy`uVBq!ia0y~yU`PRB4kiW$hW`yr%nS?+oCO|{#S9GG!XV7ZFl&wk z0|NtliKnkC`+Zh6er;<$f%Y~A1_sFz*N775{M_8syb=cIqSVBa)D(sC%#sWRcTeAd z@J2py1_t(ePZ!6Kid%2zWeap9Vw49?c6ve`Y)MM7p{#PrkavXti|NSqsiK7p4%kRS--uz-~5G=04-qPTR6XRCPCji5%+X_MDCw=wrK`f#*5H8(eR zEmBFBmh|@aK7IZ?dxLoLi&t~S(w9em^3de4GYNYyI*q$W_eyd~3d>}zO*;E)ehLNt zd~JT}#tv~o!Ko^*F5mlm%(yYp@|5nniy4zr!`}BvoMUceU?||*fBFPh`_p&t>eaj@ zBORArJXUg8ga5=Px5Yo7em+_&Bj_3!B3p2CQz|#JjZ$B4@6u(A_6cQGR?JKHs|$LhxO&s(=|-@bM0-QDH-*L2vLAKu)YzEOmOt@(3W{Ew&{ zrSPP+8n4(^$3H(@_2B^{!CsL7 zeV=}&?O#)SLZUf*ecZ`UyED{0gEBKUmE`Q}YD!8<@^Z5C^5)H)xpLJiDLFYYS3$w* z>grrGX{B8;dZlNM969pu?{C44D_44MU32oJ=l=Ws9eLZO1+%lVR6L7z-_@Gf@#X7R zMXl}oLTijCX?W#rkN$gxTU^h_*Z1bzGMAjp%$alMxE%TT@#D_(_x4tc3x-C&d-En_ z`RiA&gj_f7-!CtCey+8+`kd}XKfb&SX0RxEA)wTj`t;rYef2;8{%87QFULQ3^}pL^ zd^`fDypY^;_~D5&XV$D)(-X1&V8Vkr^X=>71Xvh2+7G|VV`#Ylo}FRy%{5oEp64n& zk15T%ddu>8$Bx|F+t#gH_kEcN!-krlMSJ7&H{WD9khQhwT>kxivR4ZwlA9FX+}nHm z^;f(4e=>qwqt?!vctm_{*zVNR)4smGzJ1FU7ugSwLkyIi#b-?w5T9cG>eTDkueG(b zzP-J@T&uUEZvXxzOHxu&RLsq{uUYfv;$ruxwbydY-rw4qosz=B&?jdb6&V>B6Juj# zWo2vI+tIV}%$YNnm;3kk_gCAr!q{+N=n|`+fy|JO6E-m$zm6eq?%ek?ywmLa^ z@vgeBD|+?i`qiUM819E$FgB^Xv~BOghl0=T%MW`zn(SeB>Hhuo8t;V`oiP8XdTm2x z-i>S5zBTT=w5Rjl>bR5xPUby#LPef%E6YFU486WOeEq!Vrkzh-zu$Y#^8TL6&+X!D zooA$z8Qk`smf%*W_MZdgo-0S?Qh%r{bsKJ`B~onXG$s8 zw!i!S?Xoui&aZhzlb3~w%{h$gpXdBV8chmk&b0+`OuIGH^X5FGMVqEnec0%?u)o>D zi*5caBWvsE@bKf7{h_a?OrL)IeXGu@vl9Zk)lyxTU$(9Lvt!k&uHw9n5vNX{7IiJ$ z8Izity4-JW)$ea_FI)&nPgiH?Sd?Kl+wyt&yE_l(#P2LRnzhwxt{=mWnxCH2d(CE_&D$QWGwscrH%FH-dLQ0&WmC*o zi^UgrWL{o2XU?3->i%M4VykR9x4yL49`pHU4a0*HD{d~XuI_Hegr}#bT3TA_>gr1M zx~;$dKkaUSK+CFCT9Z$v7|lF&>XeR{w}s5R*ROByEKV;gGh>jkE<2NBwp#i0>C?Vy zmtS9B&-mcq-`}mRt<~S(u{MOR4igm>UAh0%uheuV?}?YC1o!`bS6Wu)S5*}i@;;!~ zJ8;So?VBC8bw4!k-2MCI^ZEZUoB)v0u! zW1(J`((@P(S$%JRe|d=?<@xVFi}Wx^n?EaDm$)*xuhnVc%$YMC6eeVeE>hsA+8ek2 zy78~$wjvKWNv^IywVI*=xQYW;WQ+%uB2G@5&%m(s|FuIU>4zB@7#KWV{an^LB{Ts5 DoIlM} literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/description/index.html b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/description/index.html new file mode 100644 index 0000000..5408f24 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/description/index.html @@ -0,0 +1,551 @@ + + + + + +Advanced search + + + + + + diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/img/debug_mode.png b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/img/debug_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..e9a4b46ff2941fc052709a8ac99c658559b5854a GIT binary patch literal 16604 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 literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/DomainSelector.esm.js b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/DomainSelector.esm.js new file mode 100644 index 0000000..1cf9ed9 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/DomainSelector.esm.js @@ -0,0 +1,57 @@ +/** @odoo-module **/ + +import {patch} from "@web/core/utils/patch"; +import {_t} from "web.core"; +import Domain from "web.Domain"; +import DomainSelector from "web.DomainSelector"; +import basic_fields from "web.basic_fields"; +/** + * The redraw in the Debug Field does not trigger correctly + * so we overwrite it with the v14 Version + * + */ +patch(DomainSelector.prototype, "web.DomainSelector", { + /** + * @override + */ + _onDebugInputChange(e) { + if (!$(".o_add_advanced_search").length) { + return this._super(...arguments); + } + const rawDomain = e.currentTarget.value; + try { + Domain.prototype.stringToArray(rawDomain); + } catch (err) { + // If there is a syntax error, just ignore the change + this.displayNotification({ + title: _t("Syntax error"), + message: _t("Domain not properly formed"), + type: "danger", + }); + return; + } + this._redraw(Domain.prototype.stringToArray(rawDomain)).then( + function () { + this.trigger_up("domain_changed", { + child: this, + alreadyRedrawn: true, + }); + }.bind(this) + ); + }, +}); + +patch(basic_fields.FieldDomain.prototype, "web.basic_fields", { + /** + * Odoo restricts re-rendering the domain from the debug editor for supposedly + * performance reasons. We didn't ever came up with those and in v17 it's supported + * in the new advanced search. + * @override + */ + // eslint-disable-next-line + _onDomainSelectorValueChange(event) { + this._super(...arguments); + // Deactivate all debug conditions that cripple the functionality + this.debugEdition = false; + }, +}); diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/RecordPicker.esm.js b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/RecordPicker.esm.js new file mode 100644 index 0000000..fa725f6 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/RecordPicker.esm.js @@ -0,0 +1,202 @@ +/** @odoo-module **/ + +import BasicModel from "web.BasicModel"; +import {ComponentAdapter} from "web.OwlCompatibility"; +import {Dropdown} from "@web/core/dropdown/dropdown"; +import FieldManagerMixin from "web.FieldManagerMixin"; +import {FieldMany2One} from "web.relational_fields"; +import {SelectCreateDialog} from "web.view_dialogs"; +import {patch} from "@web/core/utils/patch"; +import {session} from "@web/session"; + +const {Component, xml} = owl; + +patch(Dropdown.prototype, "dropdown", { + onWindowClicked(ev) { + // This patch is created to prevent the closing of the Filter menu + // when a selection is made in the RecordPicker + if ($(ev.target.closest("ul.dropdown-menu")).attr("id") !== undefined) { + const dropdown = $("body > ul.dropdown-menu"); + for (let i = 0; i < dropdown.length; i++) { + if ( + $(ev.target.closest("ul.dropdown-menu")).attr("id") === + $(dropdown[i]).attr("id") + ) { + return; + } + } + } + this._super(ev); + }, +}); + +export const FakeMany2oneFieldWidget = FieldMany2One.extend(FieldManagerMixin, { + supportedFieldTypes: ["many2many", "many2one", "one2many"], + /** + * @override + */ + init: function (parent) { + this.componentAdapter = parent; + const options = this.componentAdapter.props.attrs; + // Create a dummy record with only a dummy m2o field to search on + const model = new BasicModel("dummy"); + const params = { + fieldNames: ["dummy"], + modelName: "dummy", + context: {}, + type: "record", + viewType: "default", + fieldsInfo: {default: {dummy: {}}}, + fields: { + dummy: { + string: options.string, + relation: options.model, + context: options.context, + domain: options.domain, + type: "many2one", + }, + }, + }; + // Emulate `model.load()`, without RPC-calling `default_get()` + this.dataPointID = model._makeDataPoint(params).id; + model.generateDefaultValues(this.dataPointID, {}); + this._super(this.componentAdapter, "dummy", this._get_record(model), { + mode: "edit", + attrs: { + options: { + no_create_edit: true, + no_create: true, + no_open: true, + no_quick_create: true, + }, + }, + }); + FieldManagerMixin.init.call(this, model); + }, + /** + * Get record + * + * @param {BasicModel} model + * @returns {String} + */ + _get_record: function (model) { + return model.get(this.dataPointID); + }, + /** + * @override + */ + _confirmChange: function (id, fields, event) { + this.componentAdapter.trigger("change", event.data.changes[fields[0]]); + this.dataPointID = id; + return this.reset(this._get_record(this.model), event); + }, + /** + * Stop propagation of the 'Search more..' dialog click event. + * Otherwise, the filter's dropdown will be closed after a selection. + * + * @override + */ + _searchCreatePopup: function (view, ids, context, dynamicFilters) { + const options = this._getSearchCreatePopupOptions( + view, + ids, + context, + dynamicFilters + ); + const dialog = new SelectCreateDialog( + this, + _.extend({}, this.nodeOptions, options) + ); + // Hack to stop click event propagation + dialog._opened.then(() => + dialog.$el + .get(0) + .addEventListener("click", (event) => event.stopPropagation()) + ); + return dialog.open(); + }, + _onFieldChanged: function (event) { + const self = this; + event.stopPropagation(); + if (event.data.changes.dummy.display_name === undefined) { + return this._rpc({ + model: this.field.relation, + method: "name_get", + args: [event.data.changes.dummy.id], + context: session.user_context, + }).then(function (result) { + event.data.changes.dummy.display_name = result[0][1]; + return ( + self + ._applyChanges( + event.data.dataPointID, + event.data.changes, + event + ) + // eslint-disable-next-line no-empty-function + .then(event.data.onSuccess || function () {}) + // eslint-disable-next-line no-empty-function + .guardedCatch(event.data.onFailure || function () {}) + ); + }); + } + return ( + this._applyChanges(event.data.dataPointID, event.data.changes, event) + // eslint-disable-next-line no-empty-function + .then(event.data.onSuccess || function () {}) + // eslint-disable-next-line no-empty-function + .guardedCatch(event.data.onFailure || function () {}) + ); + }, +}); + +export class FakeMany2oneFieldWidgetAdapter extends ComponentAdapter { + constructor() { + super(...arguments); + this.env = Component.env; + } + + renderWidget() { + this.widget._render(); + } + + get widgetArgs() { + if (this.props.widgetArgs) { + return this.props.widgetArgs; + } + return [this.props.attrs]; + } +} + +/** + * A record selector widget. + * + * Underneath, 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. + * + * @extends Component + */ +export class RecordPicker extends Component { + setup() { + this.attrs = { + string: this.props.string, + model: this.props.model, + domain: this.props.domain, + context: this.props.context, + }; + this.FakeMany2oneFieldWidget = FakeMany2oneFieldWidget; + } +} + +RecordPicker.template = xml` +
+ +
`; +RecordPicker.components = {FakeMany2oneFieldWidgetAdapter}; diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/dropdown.esm.js b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/dropdown.esm.js new file mode 100644 index 0000000..61758cf --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/dropdown.esm.js @@ -0,0 +1,21 @@ +/** @odoo-module **/ + +import {Dropdown} from "@web/core/dropdown/dropdown"; +import {patch} from "web.utils"; + +patch(Dropdown.prototype, "web.Dropdown", { + /** + * Our many2one widget in the filter menus has a dropdown that propagates some + * custom events through the bus to the search more pop-up. This is not replicable + * in core but we can simply cut it here + * @override + */ + onDropdownStateChanged(args) { + const direct_siblings = + args.emitter.rootRef.el.parentElement === this.rootRef.el.parentElement; + if (!direct_siblings && args.emitter.myActiveEl !== this.myActiveEl) { + return; + } + return this._super(...arguments); + }, +}); diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/utils.esm.js b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/utils.esm.js new file mode 100644 index 0000000..f3f3d88 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/js/utils.esm.js @@ -0,0 +1,58 @@ +/** @odoo-module **/ +/* + Copyright 2018 Tecnativa - Jairo Llopis + Copyright 2020 Tecnativa - Alexandre Díaz + Copyright 2022 Camptocamp SA - Iván Todorovich + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +*/ + +import {_t} from "web.core"; +const JOIN_MAPPING = { + "&": _t(" and "), + "|": _t(" or "), + "!": _t(" 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.popover.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(); + }, +}; + +export function getHumanDomain(domainSelector) { + return HUMAN_DOMAIN_METHODS.DomainSelector.apply(domainSelector); +} diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/legacy/js/control_panel/advanced_filter_item.esm.js b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/legacy/js/control_panel/advanced_filter_item.esm.js new file mode 100644 index 0000000..6dee0fc --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/legacy/js/control_panel/advanced_filter_item.esm.js @@ -0,0 +1,59 @@ +/** @odoo-module **/ + +import Domain from "web.Domain"; +import DomainSelectorDialog from "web.DomainSelectorDialog"; +import config from "web.config"; +import {getHumanDomain} from "../../../js/utils.esm"; +import {standaloneAdapter} from "web.OwlCompatibility"; +import {useModel} from "web.Model"; +const {Component, useRef} = owl; + +class AdvancedFilterItem extends Component { + setup() { + this.itemRef = useRef("dropdown-item"); + this.model = useModel("searchModel"); + } + /** + * Prevent propagation of dropdown-item-selected event, so that it + * doesn't reach the FilterMenu onFilterSelected event handler. + */ + mounted() { + $(this.itemRef.el).on("dropdown-item-selected", (event) => + event.stopPropagation() + ); + } + /** + * Open advanced search dialog + * + * @returns {DomainSelectorDialog} The opened dialog itself. + */ + onClick() { + const adapterParent = standaloneAdapter({Component}); + const dialog = new DomainSelectorDialog( + adapterParent, + this.model.config.modelName, + "[]", + { + debugMode: config.isDebug(), + readonly: false, + } + ); + // Add 1st domain node by default + dialog.opened(() => dialog.domainSelector._onAddFirstButtonClick()); + // Configure handler + dialog.on("domain_selected", this, function (e) { + const preFilter = { + description: getHumanDomain(dialog.domainSelector), + domain: Domain.prototype.arrayToString(e.data.domain), + type: "filter", + }; + this.model.dispatch("createNewFilters", [preFilter]); + }); + return dialog.open(); + } +} + +AdvancedFilterItem.components = {AdvancedFilterItem}; + +AdvancedFilterItem.template = "web_advanced_search.AdvancedFilterItem"; +export default AdvancedFilterItem; diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/legacy/js/control_panel/custom_filter_item.esm.js b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/legacy/js/control_panel/custom_filter_item.esm.js new file mode 100644 index 0000000..2fb42f8 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/legacy/js/control_panel/custom_filter_item.esm.js @@ -0,0 +1,95 @@ +/** @odoo-module **/ + +import CustomFilterItem from "web.CustomFilterItem"; +import {RecordPicker} from "../../../js/RecordPicker.esm"; +import {patch} from "@web/core/utils/patch"; + +/** + * Patches the CustomFilterItem for legacy widgets. + * + * Tree views still use this old legacy widget, so we need to patch it. + * This is likely to disappear in 17.0 + */ +patch(CustomFilterItem.prototype, "web_advanced_search.legacy.CustomFilterItem", { + /** + * Ideally we'd want this in setup, but CustomFilterItem does its initialization + * in the constructor, which can't be patched. + * + * Doing it here works just as well. + * + * @override + */ + async willStart() { + this.OPERATORS.relational = this.OPERATORS.char; + this.FIELD_TYPES.many2one = "relational"; + this.FIELD_TYPES.many2many = "relational"; + this.FIELD_TYPES.one2many = "relational"; + return this._super(...arguments); + }, + /** + * @override + */ + _setDefaultValue(condition) { + const res = this._super(...arguments); + const fieldType = this.fields[condition.field].type; + const genericType = this.FIELD_TYPES[fieldType]; + if (genericType === "relational") { + condition.value = 0; + condition.displayedValue = ""; + } + return res; + }, + /** + * Add displayed value to preFilters for "relational" types. + * + * @override + */ + onApply() { + // To avoid the complete override, we patch this.conditions.map() + const originalMapFn = this.conditions.map; + const self = this; + this.conditions.map = function () { + const preFilters = originalMapFn.apply(this, arguments); + for (const condition of this) { + const field = self.fields[condition.field]; + const type = self.FIELD_TYPES[field.type]; + if (type === "relational") { + const idx = this.indexOf(condition); + const preFilter = preFilters[idx]; + const operator = self.OPERATORS[type][condition.operator]; + const descriptionArray = [ + field.string, + operator.description, + `"${condition.displayedValue}"`, + ]; + preFilter.description = descriptionArray.join(" "); + } + } + return preFilters; + }; + const res = this._super(...arguments); + // Restore original map() + this.conditions.map = originalMapFn; + return res; + }, + /** + * @private + * @param {Object} condition + * @param {OwlEvent} ev + */ + onRelationalChanged(condition, ev) { + if (ev.detail) { + condition.value = ev.detail.id; + condition.displayedValue = ev.detail.display_name; + } + }, +}); + +patch(CustomFilterItem, "web_advanced_search.legacy.CustomFilterItem", { + components: { + ...CustomFilterItem.components, + RecordPicker, + }, +}); + +export default CustomFilterItem; diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/legacy/js/control_panel/filter_menu.esm.js b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/legacy/js/control_panel/filter_menu.esm.js new file mode 100644 index 0000000..e5b5a99 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/legacy/js/control_panel/filter_menu.esm.js @@ -0,0 +1,20 @@ +/** @odoo-module **/ + +import AdvancedFilterItem from "./advanced_filter_item.esm"; +import FilterMenu from "web.FilterMenu"; +import {patch} from "@web/core/utils/patch"; + +/** + * Patches the FilterMenu for legacy widgets. + * + * Tree views still use this old legacy widget, so we need to patch it. + * This is likely to disappear in 17.0 + */ +patch(FilterMenu, "web_advanced_search.legacy.FilterMenu", { + components: { + ...FilterMenu.components, + AdvancedFilterItem, + }, +}); + +export default FilterMenu; diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.esm.js b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.esm.js new file mode 100644 index 0000000..510ae0e --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.esm.js @@ -0,0 +1,57 @@ +/** @odoo-module **/ + +import Domain from "web.Domain"; +import DomainSelectorDialog from "web.DomainSelectorDialog"; +import config from "web.config"; +import {getHumanDomain} from "../../js/utils.esm"; +import {standaloneAdapter} from "web.OwlCompatibility"; +const {Component, useRef} = owl; + +class AdvancedFilterItem extends Component { + setup() { + this.itemRef = useRef("dropdown-item"); + } + /** + * Prevent propagation of dropdown-item-selected event, so that it + * doesn't reach the FilterMenu onFilterSelected event handler. + */ + mounted() { + $(this.itemRef.el).on("dropdown-item-selected", (event) => + event.stopPropagation() + ); + } + /** + * Open advanced search dialog + * + * @returns {DomainSelectorDialog} The opened dialog itself. + */ + onClick() { + const adapterParent = standaloneAdapter({Component}); + const dialog = new DomainSelectorDialog( + adapterParent, + this.env.searchModel.resModel, + "[]", + { + debugMode: config.isDebug(), + readonly: false, + } + ); + // Add 1st domain node by default + dialog.opened(() => dialog.domainSelector._onAddFirstButtonClick()); + // Configure handler + dialog.on("domain_selected", this, function (e) { + const preFilter = { + description: getHumanDomain(dialog.domainSelector), + domain: Domain.prototype.arrayToString(e.data.domain), + type: "filter", + }; + this.env.searchModel.createNewFilters([preFilter]); + }); + return dialog.open(); + } +} + +AdvancedFilterItem.components = {AdvancedFilterItem}; + +AdvancedFilterItem.template = "web_advanced_search.AdvancedFilterItem"; +export default AdvancedFilterItem; diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml new file mode 100644 index 0000000..86559e7 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/advanced_filter_item.xml @@ -0,0 +1,15 @@ + + + + + Add Advanced Filter + + diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/custom_filter_item.esm.js b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/custom_filter_item.esm.js new file mode 100644 index 0000000..5049a23 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/custom_filter_item.esm.js @@ -0,0 +1,105 @@ +/** @odoo-module **/ + +import {CustomFilterItem} from "@web/search/filter_menu/custom_filter_item"; +import {RecordPicker} from "../../js/RecordPicker.esm"; +import {patch} from "@web/core/utils/patch"; + +/** + * Patches the CustomFilterItem for owl widgets. + */ +patch(CustomFilterItem.prototype, "web_advanced_search.CustomFilterItem", { + /** + * @override + */ + setup() { + this._super.apply(this, arguments); + this.OPERATORS.relational = this.OPERATORS.char; + this.FIELD_TYPES.many2one = "relational"; + this.FIELD_TYPES.many2many = "relational"; + this.FIELD_TYPES.one2many = "relational"; + }, + /** + * @override + */ + setDefaultValue(condition) { + const fieldType = this.fields[condition.field].type; + const genericType = this.FIELD_TYPES[fieldType]; + if (genericType === "relational") { + condition.value = 0; + condition.displayedValue = ""; + return; + } + return this._super.apply(this, arguments); + }, + /** + * Add displayed value to preFilters for "relational" types. + * + * @override + */ + onApply() { + // To avoid the complete override, we patch this.conditions.map() + const originalMapFn = this.conditions.map; + const self = this; + this.conditions.map = function () { + const preFilters = originalMapFn.apply(this, arguments); + for (const condition of this) { + const field = self.fields[condition.field]; + const type = self.FIELD_TYPES[field.type]; + if (type === "relational") { + const idx = this.indexOf(condition); + const preFilter = preFilters[idx]; + const operator = self.OPERATORS[type][condition.operator]; + if ( + ["=", "!="].includes(operator.symbol) && + operator.value === undefined + ) { + const descriptionArray = [ + field.string, + operator.description, + `"${condition.displayedValue}"`, + ]; + preFilter.description = descriptionArray.join(" "); + } + } + } + return preFilters; + }; + const res = this._super.apply(this, arguments); + // Restore original map() + this.conditions.map = originalMapFn; + return res; + }, + /** + * @private + * @param {Object} condition + * @param {OwlEvent} ev + */ + onRelationalChanged(condition, ev) { + if (ev.detail) { + condition.value = ev.detail.id; + condition.displayedValue = ev.detail.display_name; + } + }, + onValueChange(condition, ev) { + if (!ev.target.value) { + return this.setDefaultValue(condition); + } + const field = this.fields[condition.field]; + const type = this.FIELD_TYPES[field.type]; + if (type === "relational") { + condition.value = ev.target.value; + condition.displayedValue = ev.target.value; + } else { + this._super.apply(this, arguments); + } + }, +}); + +patch(CustomFilterItem, "web_advanced_search.CustomFilterItem", { + components: { + ...CustomFilterItem.components, + RecordPicker, + }, +}); + +export default CustomFilterItem; diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/custom_filter_item.xml b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/custom_filter_item.xml new file mode 100644 index 0000000..285d6f8 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/custom_filter_item.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/filter_menu.esm.js b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/filter_menu.esm.js new file mode 100644 index 0000000..ea6d9bf --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/filter_menu.esm.js @@ -0,0 +1,16 @@ +/** @odoo-module **/ + +import AdvancedFilterItem from "./advanced_filter_item.esm"; +import {FilterMenu} from "@web/search/filter_menu/filter_menu"; +import {patch} from "@web/core/utils/patch"; +/** + * Patches the FilterMenu for owl widgets. + */ +patch(FilterMenu, "web_advanced_search.FilterMenu", { + components: { + ...FilterMenu.components, + AdvancedFilterItem, + }, +}); + +export default FilterMenu; diff --git a/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/filter_menu.xml b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/filter_menu.xml new file mode 100644 index 0000000..058a9b1 --- /dev/null +++ b/odoo-bringout-oca-web-web_advanced_search/web_advanced_search/static/src/search/filter_menu/filter_menu.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/odoo-bringout-oca-web-web_apply_field_style/README.md b/odoo-bringout-oca-web-web_apply_field_style/README.md new file mode 100644 index 0000000..514ecc5 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/README.md @@ -0,0 +1,46 @@ +# Apply Field Style + +Odoo addon: web_apply_field_style + +## Installation + +```bash +pip install odoo-bringout-oca-web-web_apply_field_style +``` + +## Dependencies + +This addon depends on: +- base + +## Manifest Information + +- **Name**: Apply Field Style +- **Version**: 16.0.1.0.1 +- **Category**: web +- **License**: AGPL-3 +- **Installable**: True + +## Source + +Based on [OCA/web](https://github.com/OCA/web) branch 16.0, addon `web_apply_field_style`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Reports: doc/REPORTS.md +- Security: doc/SECURITY.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-web-web_apply_field_style/doc/ARCHITECTURE.md b/odoo-bringout-oca-web-web_apply_field_style/doc/ARCHITECTURE.md new file mode 100644 index 0000000..11e1f34 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Web_apply_field_style Module - web_apply_field_style + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-web-web_apply_field_style/doc/CONFIGURATION.md b/odoo-bringout-oca-web-web_apply_field_style/doc/CONFIGURATION.md new file mode 100644 index 0000000..154967d --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for web_apply_field_style. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-web-web_apply_field_style/doc/CONTROLLERS.md b/odoo-bringout-oca-web-web_apply_field_style/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-web-web_apply_field_style/doc/DEPENDENCIES.md b/odoo-bringout-oca-web-web_apply_field_style/doc/DEPENDENCIES.md new file mode 100644 index 0000000..e3a0a5c --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/doc/DEPENDENCIES.md @@ -0,0 +1,5 @@ +# Dependencies + +This addon depends on: + +- base diff --git a/odoo-bringout-oca-web-web_apply_field_style/doc/FAQ.md b/odoo-bringout-oca-web-web_apply_field_style/doc/FAQ.md new file mode 100644 index 0000000..03a7d95 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon web_apply_field_style or install in UI. diff --git a/odoo-bringout-oca-web-web_apply_field_style/doc/INSTALL.md b/odoo-bringout-oca-web-web_apply_field_style/doc/INSTALL.md new file mode 100644 index 0000000..42259c0 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-web-web_apply_field_style" +# or +uv pip install odoo-bringout-oca-web-web_apply_field_style" +``` diff --git a/odoo-bringout-oca-web-web_apply_field_style/doc/MODELS.md b/odoo-bringout-oca-web-web_apply_field_style/doc/MODELS.md new file mode 100644 index 0000000..1750061 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/doc/MODELS.md @@ -0,0 +1,12 @@ +# Models + +Detected core models and extensions in web_apply_field_style. + +```mermaid +classDiagram + class base +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-web-web_apply_field_style/doc/OVERVIEW.md b/odoo-bringout-oca-web-web_apply_field_style/doc/OVERVIEW.md new file mode 100644 index 0000000..f51c361 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: web_apply_field_style. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon web_apply_field_style +- License: LGPL-3 diff --git a/odoo-bringout-oca-web-web_apply_field_style/doc/REPORTS.md b/odoo-bringout-oca-web-web_apply_field_style/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-web-web_apply_field_style/doc/SECURITY.md b/odoo-bringout-oca-web-web_apply_field_style/doc/SECURITY.md new file mode 100644 index 0000000..e07da9d --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/doc/SECURITY.md @@ -0,0 +1,8 @@ +# Security + +This module does not define custom security rules or access controls beyond Odoo defaults. + +Default Odoo security applies: +- Base user access through standard groups +- Model access inherited from dependencies +- No custom row-level security rules diff --git a/odoo-bringout-oca-web-web_apply_field_style/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-web-web_apply_field_style/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-web-web_apply_field_style/doc/USAGE.md b/odoo-bringout-oca-web-web_apply_field_style/doc/USAGE.md new file mode 100644 index 0000000..de9f22c --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon web_apply_field_style +``` diff --git a/odoo-bringout-oca-web-web_apply_field_style/doc/WIZARDS.md b/odoo-bringout-oca-web-web_apply_field_style/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-web-web_apply_field_style/pyproject.toml b/odoo-bringout-oca-web-web_apply_field_style/pyproject.toml new file mode 100644 index 0000000..a0c9dbb --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/pyproject.toml @@ -0,0 +1,42 @@ +[project] +name = "odoo-bringout-oca-web-web_apply_field_style" +version = "16.0.0" +description = "Apply Field Style - Apply css class style to fields from a dict parameters" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-ocb-base>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["web_apply_field_style"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/README.rst b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/README.rst new file mode 100644 index 0000000..069d871 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/README.rst @@ -0,0 +1,101 @@ +================= +Apply Field Style +================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:38a4bb4c2b2b17a0055b08a8a192ba970bcc84eff7632e722687545c75251d72 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_apply_field_style + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_apply_field_style + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Allow to set an additional css class to fields in form view. + +Use case : you may highlight some fields for training purpose + +.. figure:: https://raw.githubusercontent.com/OCA/web/16.0/web_apply_field_style/static/description/demo.png + :alt: Colored fields + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Override _get_field_styles() with a dict of fields list per model + + +.. code-block:: python + + class Base(models.AbstractModel): + _inherit = "base" + + def _get_field_styles(self): + res = super()._get_field_styles() + res["product.product"] = { + "my-css-class1": ["field1", "field2"], + "my-css-class2": ["field3"], + } + return res + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Akretion + +Contributors +~~~~~~~~~~~~ + +* `Akretion `_: + * David BEAL + +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/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/__init__.py b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/__init__.py new file mode 100644 index 0000000..ede0a44 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/__init__.py @@ -0,0 +1,6 @@ +from odoo.tools import config + +from . import models + +if not config.get("without_demo"): + from . import demo diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/__manifest__.py b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/__manifest__.py new file mode 100644 index 0000000..8fc1f04 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/__manifest__.py @@ -0,0 +1,15 @@ +{ + "name": "Apply Field Style", + "author": "Akretion,Odoo Community Association (OCA)", + "summary": "Apply css class style to fields from a dict parameters", + "version": "16.0.1.0.1", + "license": "AGPL-3", + "maintainer": ["bealdav"], + "website": "https://github.com/OCA/web", + "category": "web", + "depends": [ + "base", + ], + "data": [], + "installable": True, +} diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/demo/__init__.py b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/demo/__init__.py new file mode 100644 index 0000000..0e44449 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/demo/__init__.py @@ -0,0 +1 @@ +from . import base diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/demo/base.py b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/demo/base.py new file mode 100644 index 0000000..d334d21 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/demo/base.py @@ -0,0 +1,30 @@ +# © 2023 David BEAL @ Akretion +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import models + +# R8180 rule asks for merging demo/base.py and models/base.py content +# We need to keep these class separated because of demo mode. +# pylint: disable=R8180 + + +class Base(models.AbstractModel): + _inherit = "base" + + def _get_field_styles(self): + res = super()._get_field_styles() + style = self.env.context.get("style") + if style == "nice": + # only this entry is correct + res["res.users"] = { + "bg-info": ["login", "type"], + "bg-warning": ["partner_id"], + } + elif style == "no_dict": + res = "any" + elif style == "no_field_list": + res["res.users"] = {"bg-info": "any"} + elif style == "empty_dict": + res["res.users"] = {} + elif style == "no_style": + res["res.users"] = False + return res diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/bs.po b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/bs.po new file mode 100644 index 0000000..52e7b30 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/bs.po @@ -0,0 +1,19 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_apply_field_style +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_apply_field_style +#: model:ir.model,name:web_apply_field_style.model_base +msgid "Base" +msgstr "Osnova" diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/es.po b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/es.po new file mode 100644 index 0000000..5a4421f --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/es.po @@ -0,0 +1,22 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_apply_field_style +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-12-07 22:34+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\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 4.17\n" + +#. module: web_apply_field_style +#: model:ir.model,name:web_apply_field_style.model_base +msgid "Base" +msgstr "Base" diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/it.po b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/it.po new file mode 100644 index 0000000..507670e --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/it.po @@ -0,0 +1,22 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_apply_field_style +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-27 11:37+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: web_apply_field_style +#: model:ir.model,name:web_apply_field_style.model_base +msgid "Base" +msgstr "Base" diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/web_apply_field_style.pot b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/web_apply_field_style.pot new file mode 100644 index 0000000..5ed225b --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/i18n/web_apply_field_style.pot @@ -0,0 +1,19 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_apply_field_style +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_apply_field_style +#: model:ir.model,name:web_apply_field_style.model_base +msgid "Base" +msgstr "" diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/models/__init__.py b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/models/__init__.py new file mode 100644 index 0000000..0e44449 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/models/__init__.py @@ -0,0 +1 @@ +from . import base diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/models/base.py b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/models/base.py new file mode 100644 index 0000000..9c6cf43 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/models/base.py @@ -0,0 +1,55 @@ +# © 2023 David BEAL @ Akretion +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import logging + +from odoo import api, exceptions, models + +logger = logging.getLogger(__name__) + + +class Base(models.AbstractModel): + _inherit = "base" + + @api.model + def _get_view(self, view_id=None, view_type="form", **options): + arch, view = super()._get_view(view_id, view_type, **options) + if view_type == "form": + self._update_css_class(arch) + return arch, view + + def _update_css_class(self, arch): + css = self._get_field_styles() + if css: + self._check_css_dict(css) + for style in css.get(self._name): + for field_name in css[self._name][style]: + for field in arch.xpath(f"//field[@name='{field_name}']"): + field.attrib[ + "class" + ] = f"{style} {field.attrib.get('class') or ''}".strip() + + def _get_field_styles(self): + """Inherit me with: + + res = super()._get_field_styles() + res.append({'my_model': {"css_class": ['field1', 'field2'], "bg-info": [...] }}) + return res + """ + return {} + + def _check_css_dict(self, css): + rtfm = "\n\nPlease have a look to the readme.\n\nThe rtfm team." + if not isinstance(css, dict): + raise exceptions.ValidationError( + f"_get_field_styles() should return a dict{rtfm}" + ) + model = self._name + if model in css: + if not isinstance(css[model], dict): + raise exceptions.ValidationError(f"{css[model]} should be a dict{rtfm}") + for vals in css[model].values(): + if not isinstance(vals, list): + raise exceptions.ValidationError( + f"{vals} should be a list of fields !{rtfm}" + ) diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/readme/CONFIGURE.rst b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/readme/CONFIGURE.rst new file mode 100644 index 0000000..675b211 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/readme/CONFIGURE.rst @@ -0,0 +1,15 @@ +Override _get_field_styles() with a dict of fields list per model + + +.. code-block:: python + + class Base(models.AbstractModel): + _inherit = "base" + + def _get_field_styles(self): + res = super()._get_field_styles() + res["product.product"] = { + "my-css-class1": ["field1", "field2"], + "my-css-class2": ["field3"], + } + return res diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..957db5f --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* `Akretion `_: + * David BEAL diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/readme/DESCRIPTION.rst b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/readme/DESCRIPTION.rst new file mode 100644 index 0000000..7145b7c --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/readme/DESCRIPTION.rst @@ -0,0 +1,6 @@ +Allow to set an additional css class to fields in form view. + +Use case : you may highlight some fields for training purpose + +.. figure:: ../static/description/demo.png + :alt: Colored fields diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/static/description/demo.png b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/static/description/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..27c2aaa454fd3cd3d54bd7a47c35184ef280f2f4 GIT binary patch literal 48605 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 literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/static/description/icon.png b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 Q3=9kmp00i_>zopr09!l7U;qFB literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/static/description/index.html b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/static/description/index.html new file mode 100644 index 0000000..3957d11 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/static/description/index.html @@ -0,0 +1,449 @@ + + + + + + +Apply Field Style + + + + + + diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/tests/__init__.py b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/tests/__init__.py new file mode 100644 index 0000000..d9b96c4 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/tests/__init__.py @@ -0,0 +1 @@ +from . import test_module diff --git a/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/tests/test_module.py b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/tests/test_module.py new file mode 100644 index 0000000..1785212 --- /dev/null +++ b/odoo-bringout-oca-web-web_apply_field_style/web_apply_field_style/tests/test_module.py @@ -0,0 +1,54 @@ +# © 2023 David BEAL @ Akretion +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo.exceptions import ValidationError +from odoo.tests import common + + +class Test(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.user_view = cls.env.ref("base.view_users_form") + + def test_nice(self): + arch, view = ( + self.env["res.users"] + .with_context(style="nice") + ._get_view(view_id=self.user_view.id) + ) + for field in arch.xpath("//field[@name='partner_id']"): + self.assertEqual(field.attrib.get("class"), "bg-warning") + + def test_no_dict(self): + with self.assertRaisesRegex(ValidationError, "_get_field_styles().*"): + arch, view = ( + self.env["res.users"] + .with_context(style="no_dict") + ._get_view(view_id=self.user_view.id) + ) + + def test_no_field_list(self): + with self.assertRaisesRegex(ValidationError, ".*should be a list of fields.*"): + arch, view = ( + self.env["res.users"] + .with_context(style="no_field_list") + ._get_view(view_id=self.user_view.id) + ) + + def test_empty_dict(self): + # No effect but no broken code + arch, view = ( + self.env["res.users"] + .with_context(style="empty_dict") + ._get_view(view_id=self.user_view.id) + ) + + def test_no_style(self): + with self.assertRaisesRegex(ValidationError, ".*should be a dict.*"): + arch, view = ( + self.env["res.users"] + .with_context(style="no_style") + ._get_view(view_id=self.user_view.id) + ) diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/README.md b/odoo-bringout-oca-web-web_calendar_slot_duration/README.md new file mode 100644 index 0000000..b5a70dd --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/README.md @@ -0,0 +1,46 @@ +# Calendar slot duration + +Odoo addon: web_calendar_slot_duration + +## Installation + +```bash +pip install odoo-bringout-oca-web-web_calendar_slot_duration +``` + +## Dependencies + +This addon depends on: +- web + +## Manifest Information + +- **Name**: Calendar slot duration +- **Version**: 16.0.1.1.0 +- **Category**: Extra Tools +- **License**: LGPL-3 +- **Installable**: True + +## Source + +Based on [OCA/web](https://github.com/OCA/web) branch 16.0, addon `web_calendar_slot_duration`. + +## License + +This package maintains the original LGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Reports: doc/REPORTS.md +- Security: doc/SECURITY.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/doc/ARCHITECTURE.md b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/ARCHITECTURE.md new file mode 100644 index 0000000..458d516 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Web_calendar_slot_duration Module - web_calendar_slot_duration + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/doc/CONFIGURATION.md b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/CONFIGURATION.md new file mode 100644 index 0000000..4524a6f --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for web_calendar_slot_duration. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/doc/CONTROLLERS.md b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/doc/DEPENDENCIES.md b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/DEPENDENCIES.md new file mode 100644 index 0000000..b3b749a --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/DEPENDENCIES.md @@ -0,0 +1,5 @@ +# Dependencies + +This addon depends on: + +- [web](https://github.com/bringout/oca-ocb-core/tree/b3e6fb998e53b9eb1bc9669d992017616c2bd7b3/odoo-bringout-oca-ocb-web) diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/doc/FAQ.md b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/FAQ.md new file mode 100644 index 0000000..b8a1ea7 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon web_calendar_slot_duration or install in UI. diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/doc/INSTALL.md b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/INSTALL.md new file mode 100644 index 0000000..b019310 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-web-web_calendar_slot_duration" +# or +uv pip install odoo-bringout-oca-web-web_calendar_slot_duration" +``` diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/doc/MODELS.md b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/MODELS.md new file mode 100644 index 0000000..df5029f --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/MODELS.md @@ -0,0 +1,11 @@ +# Models + +Detected core models and extensions in web_calendar_slot_duration. + +```mermaid +classDiagram +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/doc/OVERVIEW.md b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/OVERVIEW.md new file mode 100644 index 0000000..195d9df --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: web_calendar_slot_duration. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon web_calendar_slot_duration +- License: LGPL-3 diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/doc/REPORTS.md b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/doc/SECURITY.md b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/SECURITY.md new file mode 100644 index 0000000..e07da9d --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/SECURITY.md @@ -0,0 +1,8 @@ +# Security + +This module does not define custom security rules or access controls beyond Odoo defaults. + +Default Odoo security applies: +- Base user access through standard groups +- Model access inherited from dependencies +- No custom row-level security rules diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/doc/USAGE.md b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/USAGE.md new file mode 100644 index 0000000..4a1c17d --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon web_calendar_slot_duration +``` diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/doc/WIZARDS.md b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/pyproject.toml b/odoo-bringout-oca-web-web_calendar_slot_duration/pyproject.toml new file mode 100644 index 0000000..cf377c8 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/pyproject.toml @@ -0,0 +1,42 @@ +[project] +name = "odoo-bringout-oca-web-web_calendar_slot_duration" +version = "16.0.0" +description = "Calendar slot duration - Customizable calendar slot durations" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-ocb-web>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["web_calendar_slot_duration"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/README.rst b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/README.rst new file mode 100644 index 0000000..3619975 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/README.rst @@ -0,0 +1,124 @@ +====================== +Calendar slot duration +====================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:3a39a33ad7a9a5a3673b1461fb0f8651e690a8437512f2a9c58b6614319fe3af + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_calendar_slot_duration + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_calendar_slot_duration + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the functionality of backend calendars to support custom +slot durations and to allow you to provide more specific UX regarding event +duration and snapping. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +This documentation is for developers. + +If you want to configure your calendar view's snap duration, make sure that you +action includes a context similar to this (example is the default value):: + + {"calendar_slot_duration": "00:30:00"} + +In addition, you can also configure the calendar view's default mode by adding:: + + {"calendar_slot_duration": "00:30:00", "keep_default_view_slot_duration": True} + +The ``keep_default_view_slot_duration`` key is optional and defaults to ``False``. +When set to ``True``, the calendar view will not adapt its view to the slot size. + +For example, if you want to set the default slot duration to 1 hour and 30 minutes, +by default the calendar view will adapt its view to show slots of 1 hour and 30 minutes. +Sometimes this is not desired, for example when you want to show every time slots by hour. + +It can be added in actions defined on python or as ``ir.actions.act_window`` +records. + +Usage +===== + +To use this module, you need to install some other addon that uses it, as it +doesn't provide any end-user functionality. + +Known issues / Roadmap +====================== + +* Drop module if/when https://github.com/odoo/odoo/pull/66739 is merged. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* `Tecnativa `_: + + * Jairo Llopis + * Stefan Ungureanu + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-Yajo| image:: https://github.com/Yajo.png?size=40px + :target: https://github.com/Yajo + :alt: Yajo + +Current `maintainer `__: + +|maintainer-Yajo| + +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/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/__init__.py b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/__manifest__.py b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/__manifest__.py new file mode 100644 index 0000000..ec43d98 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/__manifest__.py @@ -0,0 +1,22 @@ +# Copyright 2021 Tecnativa - Jairo Llopis +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). +{ + "name": "Calendar slot duration", + "summary": "Customizable calendar slot durations", + "version": "16.0.1.1.0", + "development_status": "Production/Stable", + "category": "Extra Tools", + "website": "https://github.com/OCA/web", + "author": "Tecnativa, Odoo Community Association (OCA)", + "maintainers": ["Yajo"], + "license": "LGPL-3", + "application": False, + "installable": True, + "assets": { + "web.assets_backend": [ + "web_calendar_slot_duration/static/src/js/calendar_common_renderer.esm.js", + "web_calendar_slot_duration/static/src/js/calendar_model.esm.js", + ] + }, + "depends": ["web"], +} diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/de.po b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/de.po new file mode 100644 index 0000000..e69de29 diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/it.po b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/it.po new file mode 100644 index 0000000..7338855 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/it.po @@ -0,0 +1,14 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/pt_BR.po b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/pt_BR.po new file mode 100644 index 0000000..e69de29 diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/web_calendar_slot_duration.pot b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/web_calendar_slot_duration.pot new file mode 100644 index 0000000..78d58d5 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/i18n/web_calendar_slot_duration.pot @@ -0,0 +1,13 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/CONFIGURE.rst b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/CONFIGURE.rst new file mode 100644 index 0000000..afb1c2d --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/CONFIGURE.rst @@ -0,0 +1,20 @@ +This documentation is for developers. + +If you want to configure your calendar view's snap duration, make sure that you +action includes a context similar to this (example is the default value):: + + {"calendar_slot_duration": "00:30:00"} + +In addition, you can also configure the calendar view's default mode by adding:: + + {"calendar_slot_duration": "00:30:00", "keep_default_view_slot_duration": True} + +The ``keep_default_view_slot_duration`` key is optional and defaults to ``False``. +When set to ``True``, the calendar view will not adapt its view to the slot size. + +For example, if you want to set the default slot duration to 1 hour and 30 minutes, +by default the calendar view will adapt its view to show slots of 1 hour and 30 minutes. +Sometimes this is not desired, for example when you want to show every time slots by hour. + +It can be added in actions defined on python or as ``ir.actions.act_window`` +records. diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..bdf9d22 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* `Tecnativa `_: + + * Jairo Llopis + * Stefan Ungureanu diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/DESCRIPTION.rst b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/DESCRIPTION.rst new file mode 100644 index 0000000..e0bcd77 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +This module extends the functionality of backend calendars to support custom +slot durations and to allow you to provide more specific UX regarding event +duration and snapping. diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/ROADMAP.rst b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/ROADMAP.rst new file mode 100644 index 0000000..da9d2d7 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/ROADMAP.rst @@ -0,0 +1 @@ +* Drop module if/when https://github.com/odoo/odoo/pull/66739 is merged. diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/USAGE.rst b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/USAGE.rst new file mode 100644 index 0000000..f8d0bc6 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/readme/USAGE.rst @@ -0,0 +1,2 @@ +To use this module, you need to install some other addon that uses it, as it +doesn't provide any end-user functionality. diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/description/icon.png b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 Q3=9kmp00i_>zopr09!l7U;qFB literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/description/index.html b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/description/index.html new file mode 100644 index 0000000..d6072c9 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/description/index.html @@ -0,0 +1,465 @@ + + + + + +Calendar slot duration + + + +
+

Calendar slot duration

+ + +

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

+

This module extends the functionality of backend calendars to support custom +slot durations and to allow you to provide more specific UX regarding event +duration and snapping.

+

Table of contents

+ +
+

Configuration

+

This documentation is for developers.

+

If you want to configure your calendar view’s snap duration, make sure that you +action includes a context similar to this (example is the default value):

+
+{"calendar_slot_duration": "00:30:00"}
+
+

In addition, you can also configure the calendar view’s default mode by adding:

+
+{"calendar_slot_duration": "00:30:00", "keep_default_view_slot_duration": True}
+
+

The keep_default_view_slot_duration key is optional and defaults to False. +When set to True, the calendar view will not adapt its view to the slot size.

+

For example, if you want to set the default slot duration to 1 hour and 30 minutes, +by default the calendar view will adapt its view to show slots of 1 hour and 30 minutes. +Sometimes this is not desired, for example when you want to show every time slots by hour.

+

It can be added in actions defined on python or as ir.actions.act_window +records.

+
+
+

Usage

+

To use this module, you need to install some other addon that uses it, as it +doesn’t provide any end-user functionality.

+
+
+

Known issues / Roadmap

+ +
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Tecnativa:
      +
    • Jairo Llopis
    • +
    • Stefan Ungureanu
    • +
    +
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

Current maintainer:

+

Yajo

+

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/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/src/js/calendar_common_renderer.esm.js b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/src/js/calendar_common_renderer.esm.js new file mode 100644 index 0000000..23ff9b0 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/src/js/calendar_common_renderer.esm.js @@ -0,0 +1,24 @@ +/** @odoo-module **/ +/* Copyright 2023 Tecnativa - Stefan Ungureanu + * License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). */ + +import {CalendarCommonRenderer} from "@web/views/calendar/calendar_common/calendar_common_renderer"; +import {patch} from "@web/core/utils/patch"; + +patch( + CalendarCommonRenderer.prototype, + "WebCalendarSlotDurationCalendarCommonRenderer", + { + get options() { + const options = this._super(...arguments); + if ( + this.env.searchModel.context.calendar_slot_duration && + !this.env.searchModel.context.keep_default_view_slot_duration + ) { + options.slotDuration = + this.env.searchModel.context.calendar_slot_duration; + } + return options; + }, + } +); diff --git a/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/src/js/calendar_model.esm.js b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/src/js/calendar_model.esm.js new file mode 100644 index 0000000..b8c5bf5 --- /dev/null +++ b/odoo-bringout-oca-web-web_calendar_slot_duration/web_calendar_slot_duration/static/src/js/calendar_model.esm.js @@ -0,0 +1,32 @@ +/** @odoo-module **/ +/* Copyright 2023 Tecnativa - Stefan Ungureanu + + * License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). */ + +import {CalendarModel} from "@web/views/calendar/calendar_model"; +import {patch} from "@web/core/utils/patch"; + +patch(CalendarModel.prototype, "WebCalendarSlotDurationCalendarModel", { + buildRawRecord(partialRecord, options = {}) { + if ( + !partialRecord.end && + this.env.searchModel.context.calendar_slot_duration && + !partialRecord.isAllDay + ) { + const slot_duration = this.env.searchModel.context.calendar_slot_duration; + const [hours, minutes, seconds] = slot_duration + .match(/(\d+):(\d+):(\d+)/) + .slice(1, 4); + // Convert all to float + // if we use a context like {'calendar_slot_duration': '01:30:00'} + // we will have on the backend a duration of 10 hour and 30 minutes + // instead of 1 hour and 30 minutes + const durationFloat = + parseFloat(hours) + + parseFloat(minutes) / 60 + + parseFloat(seconds) / 3600; + partialRecord.end = partialRecord.start.plus({hours: durationFloat}); + } + return this._super(partialRecord, options); + }, +}); diff --git a/odoo-bringout-oca-web-web_chatter_position/README.md b/odoo-bringout-oca-web-web_chatter_position/README.md new file mode 100644 index 0000000..2416b33 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/README.md @@ -0,0 +1,47 @@ +# Chatter Position + +Odoo addon: web_chatter_position + +## Installation + +```bash +pip install odoo-bringout-oca-web-web_chatter_position +``` + +## Dependencies + +This addon depends on: +- web +- mail + +## Manifest Information + +- **Name**: Chatter Position +- **Version**: 16.0.1.0.3 +- **Category**: Extra Tools +- **License**: LGPL-3 +- **Installable**: False + +## Source + +Based on [OCA/web](https://github.com/OCA/web) branch 16.0, addon `web_chatter_position`. + +## License + +This package maintains the original LGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Reports: doc/REPORTS.md +- Security: doc/SECURITY.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-web-web_chatter_position/doc/ARCHITECTURE.md b/odoo-bringout-oca-web-web_chatter_position/doc/ARCHITECTURE.md new file mode 100644 index 0000000..c86008a --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Web_chatter_position Module - web_chatter_position + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-web-web_chatter_position/doc/CONFIGURATION.md b/odoo-bringout-oca-web-web_chatter_position/doc/CONFIGURATION.md new file mode 100644 index 0000000..fe7ac78 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for web_chatter_position. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-web-web_chatter_position/doc/CONTROLLERS.md b/odoo-bringout-oca-web-web_chatter_position/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-web-web_chatter_position/doc/DEPENDENCIES.md b/odoo-bringout-oca-web-web_chatter_position/doc/DEPENDENCIES.md new file mode 100644 index 0000000..ff56486 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/doc/DEPENDENCIES.md @@ -0,0 +1,6 @@ +# Dependencies + +This addon depends on: + +- [web](https://github.com/bringout/oca-ocb-core/tree/b3e6fb998e53b9eb1bc9669d992017616c2bd7b3/odoo-bringout-oca-ocb-web) +- [mail](https://github.com/bringout/oca-ocb-core/tree/b3e6fb998e53b9eb1bc9669d992017616c2bd7b3/odoo-bringout-oca-ocb-mail) diff --git a/odoo-bringout-oca-web-web_chatter_position/doc/FAQ.md b/odoo-bringout-oca-web-web_chatter_position/doc/FAQ.md new file mode 100644 index 0000000..f51c5d6 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon web_chatter_position or install in UI. diff --git a/odoo-bringout-oca-web-web_chatter_position/doc/INSTALL.md b/odoo-bringout-oca-web-web_chatter_position/doc/INSTALL.md new file mode 100644 index 0000000..8435483 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-web-web_chatter_position" +# or +uv pip install odoo-bringout-oca-web-web_chatter_position" +``` diff --git a/odoo-bringout-oca-web-web_chatter_position/doc/MODELS.md b/odoo-bringout-oca-web-web_chatter_position/doc/MODELS.md new file mode 100644 index 0000000..8f58149 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/doc/MODELS.md @@ -0,0 +1,12 @@ +# Models + +Detected core models and extensions in web_chatter_position. + +```mermaid +classDiagram + class res_users +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-web-web_chatter_position/doc/OVERVIEW.md b/odoo-bringout-oca-web-web_chatter_position/doc/OVERVIEW.md new file mode 100644 index 0000000..3aa5e68 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: web_chatter_position. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon web_chatter_position +- License: LGPL-3 diff --git a/odoo-bringout-oca-web-web_chatter_position/doc/REPORTS.md b/odoo-bringout-oca-web-web_chatter_position/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-web-web_chatter_position/doc/SECURITY.md b/odoo-bringout-oca-web-web_chatter_position/doc/SECURITY.md new file mode 100644 index 0000000..e07da9d --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/doc/SECURITY.md @@ -0,0 +1,8 @@ +# Security + +This module does not define custom security rules or access controls beyond Odoo defaults. + +Default Odoo security applies: +- Base user access through standard groups +- Model access inherited from dependencies +- No custom row-level security rules diff --git a/odoo-bringout-oca-web-web_chatter_position/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-web-web_chatter_position/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-web-web_chatter_position/doc/USAGE.md b/odoo-bringout-oca-web-web_chatter_position/doc/USAGE.md new file mode 100644 index 0000000..812f8a8 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon web_chatter_position +``` diff --git a/odoo-bringout-oca-web-web_chatter_position/doc/WIZARDS.md b/odoo-bringout-oca-web-web_chatter_position/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-web-web_chatter_position/pyproject.toml b/odoo-bringout-oca-web-web_chatter_position/pyproject.toml new file mode 100644 index 0000000..510ce90 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/pyproject.toml @@ -0,0 +1,43 @@ +[project] +name = "odoo-bringout-oca-web-web_chatter_position" +version = "16.0.0" +description = "Chatter Position - Add an option to change the chatter position" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-ocb-web>=16.0.0", + "odoo-bringout-oca-ocb-mail>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["web_chatter_position"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/README.rst b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/README.rst new file mode 100644 index 0000000..07a5af3 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/README.rst @@ -0,0 +1,89 @@ +================ +Chatter Position +================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:c91e4b816e6e16e912ca30c77aa434f57365780718ca011c8753d734d75a923b + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_chatter_position + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_chatter_position + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Configurable chatter position from the user preferences. + +Supports Both Community & Enterprise Edition. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +#. There's a **Chatter Position** option in **User Preferences**, where you can +choose between ``auto``, ``bottom`` and ``sided``. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Hynsys Technologies +* Camptocamp + +Contributors +~~~~~~~~~~~~ + +* Hynsys Technologies +* Juan Miguel Sánchez Arce +* `Camptocamp `_ + + * Iván Todorovich + +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/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/__init__.py b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/__manifest__.py b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/__manifest__.py new file mode 100644 index 0000000..8a7f4c0 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2022 Hynsys Technologies +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +{ + "name": "Chatter Position", + "summary": "Add an option to change the chatter position", + "version": "16.0.1.0.3", + "author": "Hynsys Technologies, Camptocamp, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "license": "LGPL-3", + "category": "Extra Tools", + "depends": ["web", "mail"], + "data": ["views/res_users.xml", "views/web.xml"], + "assets": { + "web.assets_backend": [ + "/web_chatter_position/static/src/**/*.js", + ], + }, +} diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/bs.po b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/bs.po new file mode 100644 index 0000000..96ec57f --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/bs.po @@ -0,0 +1,39 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_chatter_position +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__bottom +msgid "Bottom" +msgstr "Na dnu" + +#. module: web_chatter_position +#: model:ir.model.fields,field_description:web_chatter_position.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Pozicija razgovora" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__auto +msgid "Responsive" +msgstr "Responzivno" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__sided +msgid "Sided" +msgstr "Sa strane" + +#. module: web_chatter_position +#: model:ir.model,name:web_chatter_position.model_res_users +msgid "User" +msgstr "Korisnik" diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/ca.po b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/ca.po new file mode 100644 index 0000000..32b1409 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/ca.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_chatter_position +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-20 12:34+0000\n" +"Last-Translator: pere-aquarian \n" +"Language-Team: none\n" +"Language: ca\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 4.17\n" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__bottom +msgid "Bottom" +msgstr "Abaix" + +#. module: web_chatter_position +#: model:ir.model.fields,field_description:web_chatter_position.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Posició del chatter" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__auto +msgid "Responsive" +msgstr "Responsiu" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__sided +msgid "Sided" +msgstr "Al costat" + +#. module: web_chatter_position +#: model:ir.model,name:web_chatter_position.model_res_users +msgid "User" +msgstr "Usuari/ària" diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/de.po b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/de.po new file mode 100644 index 0000000..2e8b93f --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/de.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_chatter_position +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-12-20 02:38+0000\n" +"Last-Translator: jappi00 \n" +"Language-Team: none\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 4.17\n" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__bottom +msgid "Bottom" +msgstr "Unten" + +#. module: web_chatter_position +#: model:ir.model.fields,field_description:web_chatter_position.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Chatter-Position" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__auto +msgid "Responsive" +msgstr "Responsiv" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__sided +msgid "Sided" +msgstr "Seitlich" + +#. module: web_chatter_position +#: model:ir.model,name:web_chatter_position.model_res_users +msgid "User" +msgstr "Benutzer" diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/es.po b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/es.po new file mode 100644 index 0000000..b617d11 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/es.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_chatter_position +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-07-20 10:15+0000\n" +"Last-Translator: kikopeiro \n" +"Language-Team: none\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 4.17\n" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__bottom +msgid "Bottom" +msgstr "Abajo" + +#. module: web_chatter_position +#: model:ir.model.fields,field_description:web_chatter_position.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Posición del historial de comunicación" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__auto +msgid "Responsive" +msgstr "Adaptativo" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__sided +msgid "Sided" +msgstr "Lateral" + +#. module: web_chatter_position +#: model:ir.model,name:web_chatter_position.model_res_users +msgid "User" +msgstr "Usuario" diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/fr.po b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/fr.po new file mode 100644 index 0000000..3e1076c --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/fr.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_chatter_position +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-03-13 14:23+0000\n" +"Last-Translator: Rémi \n" +"Language-Team: none\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 4.14.1\n" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__bottom +msgid "Bottom" +msgstr "En bas" + +#. module: web_chatter_position +#: model:ir.model.fields,field_description:web_chatter_position.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Position du Chatter" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__auto +msgid "Responsive" +msgstr "Automatique" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__sided +msgid "Sided" +msgstr "A droite" + +#. module: web_chatter_position +#: model:ir.model,name:web_chatter_position.model_res_users +msgid "User" +msgstr "Utilisateur" diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/hr.po b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/hr.po new file mode 100644 index 0000000..1cd0413 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/hr.po @@ -0,0 +1,43 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_chatter_position +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-04-03 13:22+0000\n" +"Last-Translator: Bole \n" +"Language-Team: none\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 4.14.1\n" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__bottom +msgid "Bottom" +msgstr "Na dnu" + +#. module: web_chatter_position +#: model:ir.model.fields,field_description:web_chatter_position.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Pozicija razgovora" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__auto +msgid "Responsive" +msgstr "Responzivno" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__sided +msgid "Sided" +msgstr "Sa strane" + +#. module: web_chatter_position +#: model:ir.model,name:web_chatter_position.model_res_users +msgid "User" +msgstr "Korisnik" diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/it.po b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/it.po new file mode 100644 index 0000000..512ec51 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/it.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_chatter_position +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-27 11:34+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__bottom +msgid "Bottom" +msgstr "In basso" + +#. module: web_chatter_position +#: model:ir.model.fields,field_description:web_chatter_position.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Posizione conversazione" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__auto +msgid "Responsive" +msgstr "Responsive" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__sided +msgid "Sided" +msgstr "Laterale" + +#. module: web_chatter_position +#: model:ir.model,name:web_chatter_position.model_res_users +msgid "User" +msgstr "Utente" diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/nl.po b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/nl.po new file mode 100644 index 0000000..4754101 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/nl.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_chatter_position +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-08-07 16:10+0000\n" +"Last-Translator: \"Jan Tapper [Onestein]\" \n" +"Language-Team: none\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 4.17\n" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__bottom +msgid "Bottom" +msgstr "Onderkant" + +#. module: web_chatter_position +#: model:ir.model.fields,field_description:web_chatter_position.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Chatter-positie" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__auto +msgid "Responsive" +msgstr "Snel reagerend" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__sided +msgid "Sided" +msgstr "Zijdelings" + +#. module: web_chatter_position +#: model:ir.model,name:web_chatter_position.model_res_users +msgid "User" +msgstr "Gebruiker" diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/pt_BR.po b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/pt_BR.po new file mode 100644 index 0000000..ac311ba --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/pt_BR.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_chatter_position +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-10-11 14:37+0000\n" +"Last-Translator: Adriano Prado \n" +"Language-Team: none\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 4.17\n" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__bottom +msgid "Bottom" +msgstr "Em Baixo" + +#. module: web_chatter_position +#: model:ir.model.fields,field_description:web_chatter_position.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Posição da Conversa" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__auto +msgid "Responsive" +msgstr "Responsivo" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__sided +msgid "Sided" +msgstr "Lateral" + +#. module: web_chatter_position +#: model:ir.model,name:web_chatter_position.model_res_users +msgid "User" +msgstr "Usuário" diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/tr.po b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/tr.po new file mode 100644 index 0000000..82517e2 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/tr.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_chatter_position +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-03-06 20:08+0000\n" +"Last-Translator: Ediz Duman \n" +"Language-Team: none\n" +"Language: tr\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 4.14.1\n" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__bottom +msgid "Bottom" +msgstr "Alt" + +#. module: web_chatter_position +#: model:ir.model.fields,field_description:web_chatter_position.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Sohbet Pozisyonu" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__auto +msgid "Responsive" +msgstr "Esnek" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__sided +msgid "Sided" +msgstr "" + +#. module: web_chatter_position +#: model:ir.model,name:web_chatter_position.model_res_users +msgid "User" +msgstr "Kullanıcı" diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/web_chatter_position.pot b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/web_chatter_position.pot new file mode 100644 index 0000000..4937f1d --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/i18n/web_chatter_position.pot @@ -0,0 +1,39 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_chatter_position +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__bottom +msgid "Bottom" +msgstr "" + +#. module: web_chatter_position +#: model:ir.model.fields,field_description:web_chatter_position.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__auto +msgid "Responsive" +msgstr "" + +#. module: web_chatter_position +#: model:ir.model.fields.selection,name:web_chatter_position.selection__res_users__chatter_position__sided +msgid "Sided" +msgstr "" + +#. module: web_chatter_position +#: model:ir.model,name:web_chatter_position.model_res_users +msgid "User" +msgstr "" diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/migrations/16.0.1.0.3/post-migration.py b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/migrations/16.0.1.0.3/post-migration.py new file mode 100644 index 0000000..7faaafb --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/migrations/16.0.1.0.3/post-migration.py @@ -0,0 +1,21 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from openupgradelib import openupgrade + + +@openupgrade.migrate() +def migrate(env, version): + # Field 'chatter_position' was defined in module 'web_responsive' before it was + # moved to 'web_chatter_position'. In 'web_responsive' the allowed values have + # been ['normal', 'sided']. + # In case users installed 'web_chatter_position' along with 'web_responsive' field + # 'chatter_position' potentially was already in the db with old values, which are + # not supported. + # This migration covers this scenario by correcting unsupported values. + openupgrade.logged_query( + env.cr, + """ + UPDATE res_users + SET chatter_position = 'auto' + WHERE chatter_position = 'normal' + """, + ) diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/models/__init__.py b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/models/__init__.py new file mode 100644 index 0000000..8835165 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/models/__init__.py @@ -0,0 +1 @@ +from . import res_users diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/models/res_users.py b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/models/res_users.py new file mode 100644 index 0000000..3cfb7b7 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/models/res_users.py @@ -0,0 +1,25 @@ +# Copyright 2022 Hynsys Technologies +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import fields, models + + +class ResUsers(models.Model): + _inherit = "res.users" + + chatter_position = fields.Selection( + [ + ("auto", "Responsive"), + ("bottom", "Bottom"), + ("sided", "Sided"), + ], + default="auto", + ) + + @property + def SELF_READABLE_FIELDS(self): + return super().SELF_READABLE_FIELDS + ["chatter_position"] + + @property + def SELF_WRITEABLE_FIELDS(self): + return super().SELF_WRITEABLE_FIELDS + ["chatter_position"] diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..e0a264e --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/readme/CONTRIBUTORS.rst @@ -0,0 +1,5 @@ +* Hynsys Technologies +* Juan Miguel Sánchez Arce +* `Camptocamp `_ + + * Iván Todorovich diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/readme/DESCRIPTION.rst b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/readme/DESCRIPTION.rst new file mode 100644 index 0000000..9c874e1 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +Configurable chatter position from the user preferences. + +Supports Both Community & Enterprise Edition. diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/readme/USAGE.rst b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/readme/USAGE.rst new file mode 100644 index 0000000..dd82654 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/readme/USAGE.rst @@ -0,0 +1,2 @@ +#. There's a **Chatter Position** option in **User Preferences**, where you can +choose between ``auto``, ``bottom`` and ``sided``. diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/static/description/icon.png b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4mJh`hQoG=rx_R+Sc;uILpV4%IBGajIv5xj zI14-?iy0VruY)k7lg8`{1_lPn64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xh zq!<_!7(87ZLn`LHt*tDHIlA-t`n>mR!&YzIGHsf8<B$$Um>gET_{naxk1`20D+ zGK1xw!NbPN2|bO89~+N%pEppq=(kLCGSX2uHprJ_E^{*IKIp)+&2id6vuztyvNuL$ zdA^-?<<(!k&+e;bY|S+1xq)99o0@Rk`trRhp89;eyjLw{_#}Fd?PYlPp~B|v=eA_19fIY=^}d z`Y&%tFz9&nD2bzqq3^N7Y3E5x%2bvfyytoH4a>tliVpGd_uqPi)yOgkI3;YpnXolV zu}g_VQNUGDSy{Q`_+thJ&q)fNm%Ljh{I-=l|6ob#z6OiuoDV+#yjCpp-J;>E$(bCp z!w(A@1ehEJBp7+vm>Cp=Iu%5?97SBcnhpjE?J=>;544!GndL*(UcJdDzeqD|zicr1 zB+Kr*e2YIu-<|%v(v6{Vhej6%TXV!XHp{%V<0*k8n&wuV=P@CM@diu2MB$aErCl1|Wb=;ABZB1k~ z_h&QV=Hey>W@hHnmI>mVimzY(p5dc*Bgd>DX4lfyQy6T{FBf#s-KW4IAt~voG%?}2 zOJGfAO3IUeZEbCtD^>imnJV_iO~0CT*NLN2#v@Eb^n2E$n76T&^VrXSeqiAj%%pL6 z(M63z4-G;E6g@93Q1QH-c5cqkoO^M3O$ND~1>fG>yv?b&U$JF}iYJpIOWNj{Uq6e? zyyrh@i3rn-v(L8ti2Ck5sU^Xn!$s-fqmD&8!UbA>zkc3 ziU$rHaF}~BqejMP^SKO@Lpf%~zhzJ8?7BL^L&eC8!E}XZr-w?DhsvZ!o>NpZPic2v zZennDcJ}v}bmWYc6NiqNx0n6;?MJl_Ph~m5wzO2CU4et6)k)K9kpf4)o6aPU zSLF3*ii(4Q#G1(}FI}BZR4GKRa9b>>Ho0?V>CUiyVM|Y{I+(E#x-H9v*zSvrgWYDY;)+L z0gK}V;lyYYskuU4kESR(7)UJnwx_#orq8lHUp~)#q$k=wg@|In{oEpvuoF`&Aya(%9u-w zvFYG~(+LKD+8*z?eUsUJd0b}i`QV<=&F8<_oqGLAPeEKYKzH7~F#Rs2V7sTu99b{D zCVfe>k=wt2;lhQskGp#XStm1G%qZ!;m|>&4zNY!$gk^WN7ha9pa%gH{(ZPx-wzK4a zs^6~dbYXf}Ah9rj<6}ikcpayr`AnZ>&w`ixLS?`q;$0^Y1a_@mf z-`D7@M|C=DD|DVsySJlicSFw06WZP9jHlfG9aUJY*r4LM;bsm;tJ8U|rVYFd$5v}R zo64{;qDS>uVa%*Z_7~UB86Q0#DtKm!oGQatmNYNz;MYqppMI*`m{quW>Edrbo|6*H zW(UT_ojaz@#?Jno$sscGrsypFbe^h=j6G3~$4&#>dorqjo!*2RH}>j&R| z8x}wFiC7!vG3kg}43o$2X~}DTIjWtwe8pKww|8!s(b|H_sxQ&`|B4&WrZt~_np7-W zU0r?g>eZ=gsmGf4tmo@LaD zn!M^+c;6^|ZJtJ_!~f?_0!|#KPM=QPew$I{?$xzx*Gfo9ow8h;b3&W($;?kbYdBb# zW>^-hb#--JdURp>i7T=hGrO~{U;P!l^~=+#UhL^k3k7CpEUM{ua`5D;Y!wq1U%X^V z%h~D|@7^7oX`CMN{w(_^J;o=J-YP;F+1bvnuB@w8t-9pnC>0+0z^f=FXxf*o^HJv) z-v6?A%><{8GSeA8YCB@|(mGk19ZSl}ltj3m?!EL>LxWM{Po4c_wxdUnW{S>VJHdGC zjG8Cr)0@tg$653>AAXqNHBW)#L)G3FZ{Mb#pR9b}WyS_sCzn7McX#$Ve(GswW=yl9))tt96$K7#7I?tqQ`>OtGSz-n^)=DOg?8EC*s3-h3Rg`!tL9| z4<-m~-MZCarVnf4cDW0RFP(%O{2XSVZJRVn$ZglZe{~gm~^x#st$phB>A=9iiSO6EXp3PI@wy_#!?q(vZ^qd)0Vjb@mkW3A_D-BQam%S|K`u`d zv%2GsH#LiBqm@+k$s*3kLWXafa;HYui`TE6 z{r&sj*@&ECVo-Br%82bhnq*P?%S1~{D%|2UTHTTSZ0j|~y zH*a=U*sNQ*J7Zx$+RG(nj9C&A5(h3^5Xj2Py7Ayl#b@J-TnfhvHMF#n_zVI?9)7J7 zZ_-w*eGP) z3RLx9tMoLWtTt-KH6exRO>%N_$4;E!Shad}@ST%CUF=jC-a5_kQ;$xV<)QN6Yn7pq z(V<5x9M>*Q-}FCoj^=8XXTftWO@H_DrDI^A;GMkfuVk8QY|?FhZoBjvk$H8{E>N^^@;Gp0FH?sEUBrf8k(9Xqjx=CS+n>esJ&%&-cYRj;OnnSLY*t@ z*iYP@c3sJ7pH!41M}Wp;*GVcr{?@fPDekzNcUALgvg^9aG7FgvH*?NxS-dt*S9hz| zmF!z-MV!x>gLiRXa59l{4G$Oh^7j6$#9K6xNo_Lc(W6J#XiG^-HlBZ;{I8m8tyhpV z=he?Sy7y0180PL`FlAwCoU`;`gs-DjmizN3f#usSO`h&~B)x0;$vfIdBp8lvdByZ( z0jpsD@r!rw@-Dy3IsNof%{t>=tF+VWuV%I0%}by4{lNo;KXvxElgy&!u6|mgdh6<= z)pyNR*D~l9PUCk<`8Rc5rJo&D3tgEOU+h@4Na@+h$CYw+^Z6eZSR}`7`8023 z($ni(OBkPStx34$!C`FMEY~_FTTjpe)!-$MXBCJ>(~2-o(#6L z4)>2!>$R7jxNME6LEwpHiNTXECT&cSjaf8r&!R<(L{#+!I1(~4JU&-uoeynG-DN&| zsY3m9pL>TsCV2I+rZ_DV56{-z7{OCpTdSd`=O_5GC}M5cvy;q|q|Lv4|DL{PLCmk> zwSP1(Ul#ftrE-FuYY|J@sRX^5*Ntu#^=f+xwY9ek_PPbe#LU^GX>#>L;}SkY1A~SP z6RTx^Rz3AxUvGbV#eAc@eYQ%=@cZwZ8KoF< zKB!6XELy%?ed(v;v-EeyE&LX(&HL2!SG3%^J>`2eGQ*;2T?H9B-P`ZT<1nDK4Dd+|<V8ya+Ae>& zc#)%f88(!>yrf;Sw}Fi-o7Lk0&wl3fIdwd2%O!X3yV;z3dt0MGQ}+73V%*|-XKpY4 za^p@_)UAjK-Rl z9%!O5PluQzSVfB)i*i?=s7i(|vdj3b|(p1xVM%W1-b1ijsj`sWlBRr{lg zD^G3wG(9}|9e?FxO-k6KF+(V#G*kB0Ju9Zk2RWLJzpC(^=NCIw=Wbh;#%&5lgX(40^uYHXSwpdfHypTB+U$&^D~PftHA z+wJIaslI5%PD{(%83_%%rO&HP4Au)dy!-G_Monb)TMl(4k1y^)66XtLPD$Bn#04}O zw?_$D+s+9VU*K*d-Rm}G%9IV6(VZ?#O$r;9Mn=61+-`99rixg%q72{WwTVS1owt3L zkdr&Me10w4}9`wIcoZ)cW1*E6cydfF|(NKC&9zkv8W?LhpqYG1hs$06OTVE*uW*g!uYUY#@ZJr z-8?FHe2SKPe)+tev(m%^uHvy%HhEk9oin{)aQoEyEzi+<9L?fx`Yd^dU(y?NZ=|8U6r4;<>im~PTom=eeOYyZbZ`Q_YiriU$Fxw3O++Tp{8GjelXBO@il*2bLF z3S0Z&shr0yWA)sRS!-o3q~E{1^8UpPk&O{Ob9vG>MwpzJn6&)o*N=~1ym@h;z<`5c z#rpNfA93p)_$aK-;CYC(TWn+Xlb~_%Do@PJ#jpLJvO6$r{ztN z8<#nq8U-0xI0GHlpFdvqX3_4>&o=%4{?*m|J1V}4*;K5XRaI3rr=PLPL-_7Oli=$U zecw;;X5M{wo)Yh(iy60C0#c94SX2nO_sgYD_1`_+!=!6-`uR<=P8v_v?q9sPxpj4< z-p@lVJ{&9mw{PY6d-=CT@dD9>4gycTR|RffD7Sb0e1{4JjtMD>eEj^(3_LRJrPE{C zrk`$2Fz5(gyY@v!{_)0U_Koj0osMw4m17oWQSv$U=d~?ae>YyMH`RDN!$-|xu3wpy zgso4MCa=;&j(^+o<^R;#uL;u@(}`g45OUyoi z98Ay7&OW~GVvX-f&xImct-BvRTwVAk-p=ts3xE3lm(JJM33q%vY3HZZFwyvcRa8f5 z@iT+X$6uBtJ^l2wKt%N6jg83`1s@dF?fT?(Z9R8WgNqVl^T7#08Z$i>Ea$%P>AkR1 zKu8G7=9_1}G-jA|xhOI2zRMRV@ZsO@_sJ?Ehk7K93tp;DU$R8gQ>f*lUS2{1sAo}{ z`}gnP47(bMg#jGXW2-cs77Ao#X9w?U*R&O5$k=X@q!6*|X;I0ZN|Cp__q+A!&XXRCcrrm|)vvB${*gtao7f=b$h9YPmjU$fT`iJ^K0dftfrr%=6{;{duKb zGS{+ssrU4{*(WbPj#;c0VYw669(X;9$9M`Ev8CRa$FecZY4gWYOoGnySjf#%!!_ZDoCPYq$O` zj;mL%W>$tvr<`KvTE?7mI^pYg@g=Q=GVPl-8O^b+7Gtin*Seb*p(B>o?>(vIwEq4% zU%$q!pWf*+`)=RP;%5mbA03_bZAX;cSFt4;T@_Czx(o2NU%Ygwsa?KKBK!Kf)a%|} zULQWH&u@5ap%b-5!_|C&%7SOfnVFi`)<(DY+y9fWIe$27>!G)0$zNB6&ic9J#C8#l z6_OtRpErqWhdtQ){odh|lhqBEuj||TDME*hK{NZ)x4JKaw_~-%x*rB8G&r~OJ?#4W zIxswZ`ON)3|F?d4)UE&Mtoi*T-TyzapAov-!GGl9*5@i|u~!*5h4$Fmg38M^k((bB zSX?S$X87@BvVXv%qQuB#Wv#n;e?Cl$p5UR9U?O!{tvTZ?!>miO3`Z-D1V?6Sis?l( z1ncVl_|vVwq3WvEhnk|0z;#dNS{AqU-jd{DtFV#d;p0=1;CXa-Z?$3hyO@}Ld9l}Q zQctbc=(@2zUmn!3ICsu3C-##u&%PqAW((6Q;|KpY$e#ZH(rVl0bWcxCFE1|vzV_gf z=EL!IopJN|Mf1u}89#}B!uTq9zfmdc@6S|>{r~s<=Gj-sr?6UZcab^_~V24|8MVq`1bDZj-ShB2gJqA`xax$-nS_L)K=T`DL&pIDO{h& za6!>Yo-_Xs8VM|Cy|=%n_uSw64ihF>_et}xeX!}@oPOSDW1i8>3necEs;a6IOr$m@ z9p!2{oH*m`Gm-BmwcDarU;i~<-{;jK0jEie^RM(QKE9ICGbm&{o(okKdip(d=F>wN?-bw)R8-W5 zo5A%*Z$>a|zHYMMqr6_~_1Nz*O#eIOc;?GC-PwEd?bk>D_kLtsVP{Z86JrO2YaQhb9)`^h2O#+EN###s?n^D(1Bxe|(UC-Try9zm??IFHr8ec`E32 zy`90sZ026KECVQA&#-?bmAhj7adBVYjI69fy8>JN z;~Y*)NngBkr{{1xzxv&cU0bGpeA>aT^yAb28m{k)qD=lh7S+72;>l#uv@d^;fdtQt zotc6iiZ`dtnmwD5A$020jEoG2)Kt~o{dq=${l{`_UzbyQSz;XzjM1GcLYPjg>*S#s$8_ruRWFI=@s>+P;v z#wwnN7CyIQVbJ;c@YR+sMuz{-V+C9Uw`xCcGFI!1-d~{jN?gy!@cEPbUv6$;ys-Gm zN|D9Jldq=PhYCFocCHvj#--njYty&g*! z|7Q77V|R7S6$RIdFS6c#Nt&5!{7wrivbg{M&REcL_|NQV8-H80a!0?OeN0zNE2&s; zrAdd2l4R-Rn#Bu*oqF7q-;`NPzgcj2h0XcZe0MbJwJ!%Nciet^?AF$7!T#eP&so1; zuzY!YY`=?=#oddHo|7g>d{s?(_5J1Y;_rnXlUPLFHZ~iQHU^mPglHh9-?gUyrJV#2Sj%#+NMk9wGj#uk^6# zawhTr&tG3I;oSQ!dTrg@bFMuuN^gEdS}k20uzTH;xeP_cy;_w~!JDs4=#;qmZvD!Y z2j6bL+xF~Pnv883j}SxS^P4s{wq46qJPjt~@9lHH_fIB%Z>>N|NpJAiNi%o+xY)~Z zGH1KCDg*E7Yeg$fJXC~o%7jh(pL$)aW>xm5`@qN}&BW|+jcBy@FH z;?-553M~o$|NZ^(Y4!S&`~DmU??_8O{Jn_#-ZVc4r%j(Y3l5%L9k9Q$G^}v_)Ou4* zhr?4Z9Z4}dm|(EsBg-q5#fMLL$tJEjp$(ea*|mFjU{utpX$gTn?pI!~wb=Uq^Ru&u zFD4&1ab2PHP{%Fi&l5Kuleq^U%w&|XV19OQlTL0C+g^L|@40$^%@sY!^oOnVGzt!KWSS@-}L8$qPFjIod70ylQ2U%f4{7t;{ERe%IKQl$WQ^xxFs!TB>pW zm38SxZ=WQdxuYR$x{ay9{zu(uZKHkFm zS&NZF@s9QTJ)7^oEV1)A+~cOKrKNR4<$R9RUbkJzT$j6)r!!`4fiYlX>gj2(&GYX3m~r^w z3~MRA-FN#|ty(puS9{qE-G78GXK-_x^Y@0Uy7*7NHB{hZ6N zYhrttzWY5+1_Pl2hE;Wc9?QoU-Ok-^`>JT?v`f=B-OO3BZk^xl1(|C^SDE)D6%+_K zZ2EAwOEbzO=I7j%la4E~KDo}~=wKk>llj%=e0x+>RN3Db?)Ja(8Tyz!6#Uo5^)(4J zsLor%s@=fqZ~OHM|Mj)e-y3e`q%F6fI(_I~pAxoamFao>%+#>-BO*i*BY68&^k8h9zFjS67GY*MGU_{@*(_ z_36+7x8>vq3mTzxglvWi!4I``G9S7%w5_HMm& z_0cI+2UpkDRqFov`{!z|6Ju;TsL-^S+f8%V?%m&Q{(Lz6fA7wnKb;v4Yb30mo_vUd z!9YlWAyqqk-JTx@+2#NIoMTy>x8(ZSG~=wSEF-H4Dw^B({=IT3z>8t$aX)>=DG#eS z1Y~1Hb?p80ggU>xy|c6U_+@|lzg7)qJ`Ss=Cp&Q-kegLgt=w=ldVAj9XRlVT|5u%5 z#ME&5Y18q?o;OXCdCp(>{_V)Jw@Z#dn?k5&! zPUlu@WpL;+(O}*1<>~bJeXIBFt25r4XCn3RV?{tz)T-GmRi$jIj8_(1-F0Z{j> z9~RvD=>&>`?Dc!U9S^*`j=RC4>U~T2u_b~HsSlzvH#}Ik``xZb)1vc!R!={DG^{P? zuEOP$@;kM1(*(UYsz?{+*EWr%0!NEC|ND>K=TpI(@BY`A&c@fy zymjl=Rn|4noj5AR9kypIFNKgL4(&He%5F*C)k{C|MuqQ z=H%Dc)><>xbTV0%9P83_Wl(UH5@GytZ?eB#<(}0yUl#_f zc)ND{yWB7Fa^tKZG??(8_4v~j~zv#C?3 zeyFgKWS>6eVG-v7H-*%hE5813QrNIK`Kd+SpC7BY->Z79%`l7Mhaqe9UYX!o3?fEK zXCikNJv{{~$kdCUo!QwKXFmJv4AX3}IeyF68M5s9xkSaYz(PiH{@Spg&d$ytcilW$ zTu|@oXWOeV zzDn^0ZVZ((TbvYs)a;wG@mGe)t?k*@*U8@Ap8sFE;V^^K47as$eVLvhgVGoxe*O7; z{{EhdkB`oloNGLo02-FMUDlgaQ86QQ)2#N1v&yzyJw2~|+qP}7{`P;rtUi18?0lvd zjzw+fwq$)R^2ugm&{Q#CjM$ucd0A!o-O}rGKUuQ#wKE&1pK}QeEYjn;J1K0^k}bUR z8=ojn+PinJX1Bi6!hqZJ|9x40f8U2g-13j3FXu&VtFl~X%czm!vVwKPmy_!A_k1~} zy?)R643kZg9;T+IE7q>{Rct6?Tz&qzx8zn~7R8b$Cnkc!_CNOnhDl!crd)sb_0b$f zh6!rCVfxYAa*hf6+Y~Op)0na`A|NK_%rS-+o8CAmfEHkwTzyx**j9JL<~ zvRlhlKAG5Gz_+c+@|-6VLuOrb_cYz;u)hbG`R{1VFJACW<5Sh%YEX^W{_NQ^X9mCI zkdw^k_MT!tmk0{12MkvjGXC5=U$^bSwdnl4;qM%nCM~-goxgW$^6zhN=QCPxC^QxC zc%*qQlPN&s58Ga* Q3=9kmp00i_>zopr09!l7U;qFB literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/static/description/index.html b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/static/description/index.html new file mode 100644 index 0000000..45f1716 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/static/description/index.html @@ -0,0 +1,436 @@ + + + + + +Chatter Position + + + +
+

Chatter Position

+ + +

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

+

Configurable chatter position from the user preferences.

+

Supports Both Community & Enterprise Edition.

+

Table of contents

+ +
+

Usage

+

#. There’s a Chatter Position option in User Preferences, where you can +choose between auto, bottom and sided.

+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Hynsys Technologies
  • +
  • Camptocamp
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

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

+

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

+
+
+
+ + diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/static/src/js/web_chatter_position.esm.js b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/static/src/js/web_chatter_position.esm.js new file mode 100644 index 0000000..43425c1 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/static/src/js/web_chatter_position.esm.js @@ -0,0 +1,165 @@ +/** @odoo-module **/ +/* + Copyright 2023 Camptocamp SA (https://www.camptocamp.com). + License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). +*/ + +import {FormCompiler} from "@web/views/form/form_compiler"; +import {FormController} from "@web/views/form/form_controller"; +import {MailFormCompiler} from "@mail/views/form/form_compiler"; +import {append} from "@web/core/utils/xml"; +import {patch} from "@web/core/utils/patch"; + +/** + * So, you've landed here and you have no idea what this is about. Don't worry, you're + * not the only one. Here's a quick summary of what's going on: + * + * In core, the chatter position depends on the size of the screen and wether there is + * an attachment viewer or not. There are 3 possible positions, and for each position a + * different chatter instance is displayed. + * + * So, in fact, we have 3 chatter instances running, and we switch their visibility + * depending on the desired position. + * + * A) Bottom position + * https://github.com/odoo/odoo/blob/2ef010907/addons/mail/static/src/views/form/form_compiler.js#L160 + * Condition: `!this.props.hasAttachmentViewer and uiService.size < ${SIZES.XXL}` + * + * This is the bottom position you would except. However it can only be there until + * XXL screen sizes, because the container is a flexbox and changes from row to + * column display. It's hidden in the presence of an attachment viewer. + * + * B) Bottom In-sheet position + * https://github.com/odoo/odoo/blob/2ef010907/addons/mail/static/src/views/form/form_compiler.js#L181 + * Condition: `this.props.hasAttachmentViewer` + * + * This is the bottom position that's used when there's an attachment viewer in place. + * It's rendered within the form sheet, possibly to by-pass the flexbox issue + * beforementioned. It's only instanciated when there's an attachment viewer. + * + * C) Sided position + * https://github.com/odoo/odoo/blob/2ef010907/addons/mail/static/src/views/form/form_compiler.js#L83 + * Condition: `!hasAttachmentViewer() and uiService.size >= ${SIZES.XXL}` + * + * This is the sided position, hidden in the presence of an attachment viewer. + * It's the better half of `A`. + * + * The patches and overrides you see below are here to alter these conditions to force + * a specific position regardless of the screen size, depending on an user setting. + */ + +patch(MailFormCompiler.prototype, "web_chatter_position", { + /** + * Patch the visibility of the Sided chatter (`C` above). + * + * @override + */ + compile() { + const res = this._super.apply(this, arguments); + const chatterContainerHookXml = res.querySelector( + ".o_FormRenderer_chatterContainer" + ); + if (!chatterContainerHookXml) { + return res; + } + // Don't patch anything if the setting is "auto": this is the core behaviour + if (odoo.web_chatter_position === "auto") { + return res; + } else if (odoo.web_chatter_position === "sided") { + chatterContainerHookXml.setAttribute("t-if", "!hasAttachmentViewer()"); + } else if (odoo.web_chatter_position === "bottom") { + chatterContainerHookXml.setAttribute("t-if", false); + } + return res; + }, +}); + +patch(FormCompiler.prototype, "web_chatter_position", { + /** + * Patch the css classes of the `Form`, to include an extra `h-100` class. + * Without it, the form sheet will not be full height in some situations, + * looking a bit weird. + * + * @override + */ + compileForm() { + const res = this._super.apply(this, arguments); + if (odoo.web_chatter_position === "sided") { + const classes = res.getAttribute("t-attf-class"); + res.setAttribute("t-attf-class", `${classes} h-100`); + } + return res; + }, + /** + * Patch the visibility of bottom chatters (`A` and `B` above). + * `B` may not exist in some situations, so we ensure it does by creating it. + * + * @override + */ + compile(node, params) { + const res = this._super.apply(this, arguments); + const chatterContainerHookXml = res.querySelector( + ".o_FormRenderer_chatterContainer:not(.o-isInFormSheetBg)" + ); + if (!chatterContainerHookXml) { + return res; + } + if (chatterContainerHookXml.parentNode.classList.contains("o_form_sheet")) { + return res; + } + // Don't patch anything if the setting is "auto": this is the core behaviour + if (odoo.web_chatter_position === "auto") { + return res; + // For "sided", we have to remote the bottom chatter + // (except if there is an attachment viewer, as we have to force bottom) + } else if (odoo.web_chatter_position === "sided") { + const formSheetBgXml = res.querySelector(".o_form_sheet_bg"); + if (!formSheetBgXml) { + return res; + } + chatterContainerHookXml.setAttribute("t-if", false); + // For "bottom", we keep the chatter in the form sheet + // (the one used for the attachment viewer case) + // If it's not there, we create it. + } else if (odoo.web_chatter_position === "bottom") { + if (params.hasAttachmentViewerInArch) { + const sheetBgChatterContainerHookXml = res.querySelector( + ".o_FormRenderer_chatterContainer.o-isInFormSheetBg" + ); + sheetBgChatterContainerHookXml.setAttribute("t-if", true); + chatterContainerHookXml.setAttribute("t-if", false); + } else { + const formSheetBgXml = res.querySelector(".o_form_sheet_bg"); + if (!formSheetBgXml) { + return res; + } + const sheetBgChatterContainerHookXml = + chatterContainerHookXml.cloneNode(true); + sheetBgChatterContainerHookXml.classList.add("o-isInFormSheetBg"); + sheetBgChatterContainerHookXml.setAttribute("t-if", true); + append(formSheetBgXml, sheetBgChatterContainerHookXml); + const sheetBgChatterContainerXml = + sheetBgChatterContainerHookXml.querySelector("ChatterContainer"); + sheetBgChatterContainerXml.setAttribute("isInFormSheetBg", "true"); + chatterContainerHookXml.setAttribute("t-if", false); + } + } + return res; + }, +}); + +patch(FormController.prototype, "web_chatter_position", { + /** + * Patch the css classes of the form container, to include an extra `flex-row` class. + * Without it, it'd go for flex columns direction and it won't look good. + * + * @override + */ + get className() { + const result = this._super(); + if (odoo.web_chatter_position === "sided") { + result["flex-row"] = true; + } + return result; + }, +}); diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/views/res_users.xml b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/views/res_users.xml new file mode 100644 index 0000000..0cf19ea --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/views/res_users.xml @@ -0,0 +1,12 @@ + + + + res.users + + + + + + + + diff --git a/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/views/web.xml b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/views/web.xml new file mode 100644 index 0000000..b65b4e1 --- /dev/null +++ b/odoo-bringout-oca-web-web_chatter_position/web_chatter_position/views/web.xml @@ -0,0 +1,12 @@ + + + + diff --git a/odoo-bringout-oca-web-web_company_color/README.md b/odoo-bringout-oca-web-web_company_color/README.md new file mode 100644 index 0000000..97b3a60 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/README.md @@ -0,0 +1,47 @@ +# Web Company Color + +Odoo addon: web_company_color + +## Installation + +```bash +pip install odoo-bringout-oca-web-web_company_color +``` + +## Dependencies + +This addon depends on: +- web +- base_sparse_field + +## Manifest Information + +- **Name**: Web Company Color +- **Version**: 16.0.1.2.3 +- **Category**: web +- **License**: AGPL-3 +- **Installable**: True + +## Source + +Based on [OCA/web](https://github.com/OCA/web) branch 16.0, addon `web_company_color`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Reports: doc/REPORTS.md +- Security: doc/SECURITY.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-web-web_company_color/doc/ARCHITECTURE.md b/odoo-bringout-oca-web-web_company_color/doc/ARCHITECTURE.md new file mode 100644 index 0000000..8425043 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Web_company_color Module - web_company_color + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-web-web_company_color/doc/CONFIGURATION.md b/odoo-bringout-oca-web-web_company_color/doc/CONFIGURATION.md new file mode 100644 index 0000000..3608f9e --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for web_company_color. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-web-web_company_color/doc/CONTROLLERS.md b/odoo-bringout-oca-web-web_company_color/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-web-web_company_color/doc/DEPENDENCIES.md b/odoo-bringout-oca-web-web_company_color/doc/DEPENDENCIES.md new file mode 100644 index 0000000..699a647 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/doc/DEPENDENCIES.md @@ -0,0 +1,6 @@ +# Dependencies + +This addon depends on: + +- [web](https://github.com/bringout/oca-ocb-core/tree/b3e6fb998e53b9eb1bc9669d992017616c2bd7b3/odoo-bringout-oca-ocb-web) +- [base_sparse_field](https://github.com/bringout/oca-ocb-core/tree/b3e6fb998e53b9eb1bc9669d992017616c2bd7b3/odoo-bringout-oca-ocb-base_sparse_field) diff --git a/odoo-bringout-oca-web-web_company_color/doc/FAQ.md b/odoo-bringout-oca-web-web_company_color/doc/FAQ.md new file mode 100644 index 0000000..53606ec --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon web_company_color or install in UI. diff --git a/odoo-bringout-oca-web-web_company_color/doc/INSTALL.md b/odoo-bringout-oca-web-web_company_color/doc/INSTALL.md new file mode 100644 index 0000000..1788e3c --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-web-web_company_color" +# or +uv pip install odoo-bringout-oca-web-web_company_color" +``` diff --git a/odoo-bringout-oca-web-web_company_color/doc/MODELS.md b/odoo-bringout-oca-web-web_company_color/doc/MODELS.md new file mode 100644 index 0000000..a4a118e --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/doc/MODELS.md @@ -0,0 +1,13 @@ +# Models + +Detected core models and extensions in web_company_color. + +```mermaid +classDiagram + class ir_qweb + class res_company +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-web-web_company_color/doc/OVERVIEW.md b/odoo-bringout-oca-web-web_company_color/doc/OVERVIEW.md new file mode 100644 index 0000000..33b9d91 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: web_company_color. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon web_company_color +- License: LGPL-3 diff --git a/odoo-bringout-oca-web-web_company_color/doc/REPORTS.md b/odoo-bringout-oca-web-web_company_color/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-web-web_company_color/doc/SECURITY.md b/odoo-bringout-oca-web-web_company_color/doc/SECURITY.md new file mode 100644 index 0000000..e07da9d --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/doc/SECURITY.md @@ -0,0 +1,8 @@ +# Security + +This module does not define custom security rules or access controls beyond Odoo defaults. + +Default Odoo security applies: +- Base user access through standard groups +- Model access inherited from dependencies +- No custom row-level security rules diff --git a/odoo-bringout-oca-web-web_company_color/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-web-web_company_color/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-web-web_company_color/doc/USAGE.md b/odoo-bringout-oca-web-web_company_color/doc/USAGE.md new file mode 100644 index 0000000..000d359 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon web_company_color +``` diff --git a/odoo-bringout-oca-web-web_company_color/doc/WIZARDS.md b/odoo-bringout-oca-web-web_company_color/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-web-web_company_color/pyproject.toml b/odoo-bringout-oca-web-web_company_color/pyproject.toml new file mode 100644 index 0000000..a7c5bdb --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/pyproject.toml @@ -0,0 +1,43 @@ +[project] +name = "odoo-bringout-oca-web-web_company_color" +version = "16.0.0" +description = "Web Company Color - Odoo addon" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-ocb-web>=16.0.0", + "odoo-bringout-oca-web-base_sparse_field>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["web_company_color"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/README.rst b/odoo-bringout-oca-web-web_company_color/web_company_color/README.rst new file mode 100644 index 0000000..85b13a6 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/README.rst @@ -0,0 +1,98 @@ +================= +Web Company Color +================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:8a814ac88491029ca65ef378be730bd05a762604c5913f24f9cf1c6ea5b160cb + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_company_color + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_company_color + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module change navbar colors based in the company logo colors. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Go to company record and set a logo. Can see/modify applied colors on the "Navbar" section. + +For optimal results use images with alpha channel. + +Known issues / Roadmap +====================== + +White color is omitted in the addition operation to support images without alpha channel. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Alexandre Díaz + +Contributors +~~~~~~~~~~~~ + +* Jordi Ballester Alomar (ForgeFlow) +* Lois Rilo (ForgeFlow) +* Simone Orsi +* Iván Antón +* Bernat Puig (ForgeFlow) +* Dhara Solanki +* `Tecnativa `_: + + * Jairo Llopis + * Alexandre Díaz + * Carlos Roca + +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/odoo-bringout-oca-web-web_company_color/web_company_color/__init__.py b/odoo-bringout-oca-web-web_company_color/web_company_color/__init__.py new file mode 100644 index 0000000..62048b1 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/__init__.py @@ -0,0 +1,5 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models +from .hooks import post_init_hook, uninstall_hook +from . import utils diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/__manifest__.py b/odoo-bringout-oca-web-web_company_color/web_company_color/__manifest__.py new file mode 100644 index 0000000..9b50bee --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/__manifest__.py @@ -0,0 +1,18 @@ +# Odoo, Open Source Web Company Color +# Copyright (C) 2019 Alexandre Díaz +# +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).# +{ + "name": "Web Company Color", + "category": "web", + "version": "16.0.1.2.3", + "author": "Alexandre Díaz, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "depends": ["web", "base_sparse_field"], + "data": ["view/assets.xml", "view/res_company.xml"], + "uninstall_hook": "uninstall_hook", + "post_init_hook": "post_init_hook", + "license": "AGPL-3", + "auto_install": False, + "installable": True, +} diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/hooks.py b/odoo-bringout-oca-web-web_company_color/web_company_color/hooks.py new file mode 100644 index 0000000..ca23677 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/hooks.py @@ -0,0 +1,15 @@ +# Copyright 2019 Alexandre Díaz +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import SUPERUSER_ID, api + +from .models.res_company import URL_BASE + + +def uninstall_hook(cr, registry): + env = api.Environment(cr, SUPERUSER_ID, {}) + env["ir.attachment"].search([("url", "=like", "%s%%" % URL_BASE)]).unlink() + + +def post_init_hook(cr, registry): + env = api.Environment(cr, SUPERUSER_ID, {}) + env["res.company"].search([]).scss_create_or_update_attachment() diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/bs.po b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/bs.po new file mode 100644 index 0000000..61a7706 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/bs.po @@ -0,0 +1,97 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_company_color +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "" +"\n" +" In order for the changes to take effect, please refresh\n" +" the page." +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg +msgid "Button Background Color" +msgstr "Boja Pozadine Dugmeta" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg_hover +msgid "Button Background Color Hover" +msgstr "Boja Pozadine Dugmeta Hover" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_text +msgid "Button Text Color" +msgstr "Boja Teksta Dugmeta" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Colors" +msgstr "Boje" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_res_company +msgid "Companies" +msgstr "Tvrtke" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__company_colors +msgid "Company Colors" +msgstr "Boje tvrtke" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Company Styles" +msgstr "Stilovi tvrtke" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Compute colors from logo" +msgstr "Izračunaj boje iz loga" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text +msgid "Link Text Color" +msgstr "Boja Teksta Linka" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text_hover +msgid "Link Text Color Hover" +msgstr "Boja Teksta Linka Hover" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg +msgid "Navbar Background Color" +msgstr "Boja pozadine Navigacijske trake" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg_hover +msgid "Navbar Background Color Hover" +msgstr "Poja pozadine navigacijske trake (hoover)" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_text +msgid "Navbar Text Color" +msgstr "Boja teksta navigacijske trake" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_ir_qweb +msgid "Qweb" +msgstr "Qweb" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__scss_modif_timestamp +msgid "SCSS Modif. Timestamp" +msgstr "SCSS Modif. Vremenski žig" diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/ca.po b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/ca.po new file mode 100644 index 0000000..6ab993f --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/ca.po @@ -0,0 +1,101 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_company_color +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-11-18 17:36+0000\n" +"Last-Translator: Dept. Técnico \n" +"Language-Team: none\n" +"Language: ca\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 4.3.2\n" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "" +"\n" +" In order for the changes to take effect, please " +"refresh\n" +" the page." +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg +msgid "Button Background Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg_hover +msgid "Button Background Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_text +msgid "Button Text Color" +msgstr "" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Colors" +msgstr "" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_res_company +msgid "Companies" +msgstr "Companyies" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__company_colors +msgid "Company Colors" +msgstr "" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Company Styles" +msgstr "" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Compute colors from logo" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text +msgid "Link Text Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text_hover +msgid "Link Text Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg +msgid "Navbar Background Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg_hover +msgid "Navbar Background Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_text +msgid "Navbar Text Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_ir_qweb +msgid "Qweb" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__scss_modif_timestamp +msgid "SCSS Modif. Timestamp" +msgstr "" diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/de.po b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/de.po new file mode 100644 index 0000000..e73a298 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/de.po @@ -0,0 +1,128 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_company_color +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-06-20 11:09+0000\n" +"Last-Translator: Nils Coenen \n" +"Language-Team: none\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 4.17\n" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "" +"\n" +" In order for the changes to take effect, please " +"refresh\n" +" the page." +msgstr "" +"\n" +" Damit die Änderungen wirksam werden, aktualisieren " +"Sie bitte\n" +" die Seite." + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg +msgid "Button Background Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg_hover +msgid "Button Background Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_text +msgid "Button Text Color" +msgstr "" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Colors" +msgstr "" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_res_company +msgid "Companies" +msgstr "Unternehmen" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__company_colors +msgid "Company Colors" +msgstr "Unternehmensfarben" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Company Styles" +msgstr "Unternehmensstile" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Compute colors from logo" +msgstr "Farben aus Logo generieren" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text +msgid "Link Text Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text_hover +msgid "Link Text Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg +msgid "Navbar Background Color" +msgstr "Navbar-Hintergrundfarbe" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg_hover +msgid "Navbar Background Color Hover" +msgstr "Navbar Hintergrundfarbe Hover" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_text +msgid "Navbar Text Color" +msgstr "Navbar Textfarbe" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_ir_qweb +msgid "Qweb" +msgstr "Qweb" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__scss_modif_timestamp +msgid "SCSS Modif. Timestamp" +msgstr "" + +#~ msgid "Navbar Colors" +#~ msgstr "Navbar-Farben" + +#~ msgid "" +#~ "\n" +#~ " In order for the changes to take effect, please " +#~ "refresh\n" +#~ " the page." +#~ msgstr "" +#~ "\n" +#~ " Damit die Änderungen wirksam werden, " +#~ "aktualisieren Sie bitte\n" +#~ " Sie die Seite." + +#~ msgid "Display Name" +#~ msgstr "Anzeigename" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Zuletzt bearbeitet am" diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/es.po b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/es.po new file mode 100644 index 0000000..b4c7302 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/es.po @@ -0,0 +1,118 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_company_color +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-03-02 15:55+0000\n" +"PO-Revision-Date: 2023-11-07 22:38+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "" +"\n" +" In order for the changes to take effect, please " +"refresh\n" +" the page." +msgstr "" +"\n" +" Para que los cambios surtan efecto, actualice\n" +" la página." + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg +msgid "Button Background Color" +msgstr "Color de Fondo del Botón" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg_hover +msgid "Button Background Color Hover" +msgstr "Color de fondo del Botón Hover" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_text +msgid "Button Text Color" +msgstr "Color del Texto del Botón" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Colors" +msgstr "Colores" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_res_company +msgid "Companies" +msgstr "Compañías" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__company_colors +msgid "Company Colors" +msgstr "Colores de la compañía" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Company Styles" +msgstr "Estilos de compañía" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Compute colors from logo" +msgstr "Calcular colores a partir del logo" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text +msgid "Link Text Color" +msgstr "Color del Texto del Enlace" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text_hover +msgid "Link Text Color Hover" +msgstr "Color del Texto del Enlace Hover" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg +msgid "Navbar Background Color" +msgstr "Color de fondo de la barra de navegación" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg_hover +msgid "Navbar Background Color Hover" +msgstr "Desplazamiento del color de fondo de la barra de navegación" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_text +msgid "Navbar Text Color" +msgstr "Color de texto de la barra de navegación" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_ir_qweb +msgid "Qweb" +msgstr "Qweb" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__scss_modif_timestamp +msgid "SCSS Modif. Timestamp" +msgstr "SCSS Modif. Marca de tiempo" + +#~ msgid "Navbar Colors" +#~ msgstr "Colores de la barra de navegación" + +#~ msgid "" +#~ "\n" +#~ " In order for the changes to take effect, please " +#~ "refresh\n" +#~ " the page." +#~ msgstr "" +#~ "\n" +#~ " Para que los cambios surtan efecto, actualice\n" +#~ " la página." diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/fr.po b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/fr.po new file mode 100644 index 0000000..2cc3062 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/fr.po @@ -0,0 +1,104 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_company_color +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-06 17:37+0000\n" +"Last-Translator: Rémi \n" +"Language-Team: none\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 4.17\n" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "" +"\n" +" In order for the changes to take effect, please refresh\n" +" the page." +msgstr "" +"\n" +" Pour que les modifications soient effectives, merci " +"d'actualiser\n" +" la page." + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg +msgid "Button Background Color" +msgstr "Couleur d'arrière-plan de bouton" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg_hover +msgid "Button Background Color Hover" +msgstr "Couleur d'arrière plan de bouton (survol)" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_text +msgid "Button Text Color" +msgstr "Couleur du texte de bouton" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Colors" +msgstr "Couleurs" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_res_company +msgid "Companies" +msgstr "Sociétés" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__company_colors +msgid "Company Colors" +msgstr "Couleurs de la société" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Company Styles" +msgstr "Styles de la société" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Compute colors from logo" +msgstr "Déterminer les couleurs à partir du logo" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text +msgid "Link Text Color" +msgstr "Couleur du texte des liens" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text_hover +msgid "Link Text Color Hover" +msgstr "Couleur du texte des liens (survol)" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg +msgid "Navbar Background Color" +msgstr "Couleur de fond de la barre de navigation" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg_hover +msgid "Navbar Background Color Hover" +msgstr "Couleur de fond de la barre de navigation (survol)" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_text +msgid "Navbar Text Color" +msgstr "Couleur du texte de la barre de navigation" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_ir_qweb +msgid "Qweb" +msgstr "Qweb" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__scss_modif_timestamp +msgid "SCSS Modif. Timestamp" +msgstr "Heure de modification du SCSS" diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/hr.po b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/hr.po new file mode 100644 index 0000000..a0f2a81 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/hr.po @@ -0,0 +1,115 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_company_color +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-11-18 14:34+0000\n" +"Last-Translator: Bole \n" +"Language-Team: none\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_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "" +"\n" +" In order for the changes to take effect, please " +"refresh\n" +" the page." +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg +msgid "Button Background Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg_hover +msgid "Button Background Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_text +msgid "Button Text Color" +msgstr "" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Colors" +msgstr "" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_res_company +msgid "Companies" +msgstr "Tvrtke" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__company_colors +msgid "Company Colors" +msgstr "Boje tvrtke" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Company Styles" +msgstr "Stilovi tvrtke" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Compute colors from logo" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text +msgid "Link Text Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text_hover +msgid "Link Text Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg +msgid "Navbar Background Color" +msgstr "Boja pozadine Navigacijske trake" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg_hover +msgid "Navbar Background Color Hover" +msgstr "Poja pozadine navigacijske trake (hoover)" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_text +msgid "Navbar Text Color" +msgstr "Boja teksta navigacijske trake" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_ir_qweb +msgid "Qweb" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__scss_modif_timestamp +msgid "SCSS Modif. Timestamp" +msgstr "SCSS Modif. Vremenski žig" + +#~ msgid "Navbar Colors" +#~ msgstr "Boje navigacijske trake" + +#~ msgid "" +#~ "\n" +#~ " In order for the changes to take effect, please " +#~ "refresh\n" +#~ " the page." +#~ msgstr "" +#~ "\n" +#~ " Kako bi promjene postale vidljive, molimo \n" +#~ " učitajte ponovo ovu stranicu." diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/it.po b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/it.po new file mode 100644 index 0000000..d5ce4ad --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/it.po @@ -0,0 +1,117 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_company_color +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-27 11:33+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "" +"\n" +" In order for the changes to take effect, please " +"refresh\n" +" the page." +msgstr "" +"\n" +" Affinché la modifica abbia effetto, ricaricare\n" +" la pagina." + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg +msgid "Button Background Color" +msgstr "Colore sfondo pulsante" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg_hover +msgid "Button Background Color Hover" +msgstr "Colore hover sfondo pulsante" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_text +msgid "Button Text Color" +msgstr "Colore testo pulsante" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Colors" +msgstr "Colori" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__company_colors +msgid "Company Colors" +msgstr "Colori Aziendali" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Company Styles" +msgstr "Stili Aziendali" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Compute colors from logo" +msgstr "Calcola colori dal logo" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text +msgid "Link Text Color" +msgstr "Colore testo collegamento" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text_hover +msgid "Link Text Color Hover" +msgstr "Colore hover testo collegamento" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg +msgid "Navbar Background Color" +msgstr "Sfondo Barra Navigazione" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg_hover +msgid "Navbar Background Color Hover" +msgstr "Colore Hover Sfondo Barra Navigazione" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_text +msgid "Navbar Text Color" +msgstr "Colori Testo Barra Navigazione" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_ir_qweb +msgid "Qweb" +msgstr "Qweb" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__scss_modif_timestamp +msgid "SCSS Modif. Timestamp" +msgstr "Timestamp modifica SCSS" + +#~ msgid "Navbar Colors" +#~ msgstr "Colori Barra Navigazione" + +#~ msgid "" +#~ "\n" +#~ " In order for the changes to take effect, please " +#~ "refresh\n" +#~ " the page." +#~ msgstr "" +#~ "\n" +#~ " Perché i cambiamenti abbiano effetto, prego " +#~ "aggiornare la pagina." diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/nl.po b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/nl.po new file mode 100644 index 0000000..74af7db --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/nl.po @@ -0,0 +1,118 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_company_color +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-08-07 16:10+0000\n" +"Last-Translator: \"Jan Tapper [Onestein]\" \n" +"Language-Team: none\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 4.17\n" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "" +"\n" +" In order for the changes to take effect, please " +"refresh\n" +" the page." +msgstr "" +"\n" +" Om de aanpassingen actief te maken, ververs " +"alstublieft\n" +" de pagina." + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg +msgid "Button Background Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg_hover +msgid "Button Background Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_text +msgid "Button Text Color" +msgstr "" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Colors" +msgstr "" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_res_company +msgid "Companies" +msgstr "Bedrijven" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__company_colors +msgid "Company Colors" +msgstr "Bedrijfskleuren" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Company Styles" +msgstr "Bedrijfsstijlen" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Compute colors from logo" +msgstr "Genereer kleuren vanuit het logo" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text +msgid "Link Text Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text_hover +msgid "Link Text Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg +msgid "Navbar Background Color" +msgstr "Navigatiebalk Achtergrondkleur" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg_hover +msgid "Navbar Background Color Hover" +msgstr "Navigatiebalk Achtergrondkleur (als je de muis er overheen beweegt)" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_text +msgid "Navbar Text Color" +msgstr "Navigatiebalk Tekstkleuren" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_ir_qweb +msgid "Qweb" +msgstr "Qweb" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__scss_modif_timestamp +msgid "SCSS Modif. Timestamp" +msgstr "" + +#~ msgid "Navbar Colors" +#~ msgstr "Navigatiebalk Kleuren" + +#~ msgid "" +#~ "\n" +#~ " In order for the changes to take effect, please " +#~ "refresh\n" +#~ " the page." +#~ msgstr "" +#~ "\n" +#~ " Ververs de pagina om de wijzigingen door te " +#~ "voeren." diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/pt.po b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/pt.po new file mode 100644 index 0000000..29faae2 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/pt.po @@ -0,0 +1,103 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_company_color +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-01-29 19:37+0000\n" +"Last-Translator: Peter Romão \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 4.17\n" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "" +"\n" +" In order for the changes to take effect, please refresh\n" +" the page." +msgstr "" +"\n" +" Para que as alterações entrem em vigor, atualize\n" +" a página." + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg +msgid "Button Background Color" +msgstr "Cor de Fundo dos Botões" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg_hover +msgid "Button Background Color Hover" +msgstr "Cor de Fundo de Botões com Foco" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_text +msgid "Button Text Color" +msgstr "Cor do Texto do Botão" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Colors" +msgstr "Cores" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_res_company +msgid "Companies" +msgstr "Empresas" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__company_colors +msgid "Company Colors" +msgstr "Cores da Empresa" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Company Styles" +msgstr "Estilos da Empresa" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Compute colors from logo" +msgstr "Calcular cores a partir do logotipo" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text +msgid "Link Text Color" +msgstr "Cor do Texto das Ligações" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text_hover +msgid "Link Text Color Hover" +msgstr "Cor do Texto das Ligações com Foco" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg +msgid "Navbar Background Color" +msgstr "Cor de Fundo da Barra de Navegação" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg_hover +msgid "Navbar Background Color Hover" +msgstr "Cor de Fundo da Barra de Navegação com Foco" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_text +msgid "Navbar Text Color" +msgstr "Cor do Texto da Barra de Navegação" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_ir_qweb +msgid "Qweb" +msgstr "QWeb" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__scss_modif_timestamp +msgid "SCSS Modif. Timestamp" +msgstr "SCSS Modif. Timestamp" diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/web_company_color.pot b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/web_company_color.pot new file mode 100644 index 0000000..1cd32a3 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/web_company_color.pot @@ -0,0 +1,97 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_company_color +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "" +"\n" +" In order for the changes to take effect, please refresh\n" +" the page." +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg +msgid "Button Background Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg_hover +msgid "Button Background Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_text +msgid "Button Text Color" +msgstr "" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Colors" +msgstr "" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_res_company +msgid "Companies" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__company_colors +msgid "Company Colors" +msgstr "" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Company Styles" +msgstr "" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Compute colors from logo" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text +msgid "Link Text Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text_hover +msgid "Link Text Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg +msgid "Navbar Background Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg_hover +msgid "Navbar Background Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_text +msgid "Navbar Text Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_ir_qweb +msgid "Qweb" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__scss_modif_timestamp +msgid "SCSS Modif. Timestamp" +msgstr "" diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/zh_CN.po b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/zh_CN.po new file mode 100644 index 0000000..e0a98ca --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/i18n/zh_CN.po @@ -0,0 +1,114 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_company_color +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-07-08 05:19+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.10\n" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "" +"\n" +" In order for the changes to take effect, please " +"refresh\n" +" the page." +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg +msgid "Button Background Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_bg_hover +msgid "Button Background Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_button_text +msgid "Button Text Color" +msgstr "" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Colors" +msgstr "" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_res_company +msgid "Companies" +msgstr "公司" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__company_colors +msgid "Company Colors" +msgstr "公司颜色" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Company Styles" +msgstr "公司风格" + +#. module: web_company_color +#: model_terms:ir.ui.view,arch_db:web_company_color.view_company_form +msgid "Compute colors from logo" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text +msgid "Link Text Color" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_link_text_hover +msgid "Link Text Color Hover" +msgstr "" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg +msgid "Navbar Background Color" +msgstr "导航栏背景颜色" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_bg_hover +msgid "Navbar Background Color Hover" +msgstr "导航栏鼠标悬停背景颜色" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__color_navbar_text +msgid "Navbar Text Color" +msgstr "导航栏文字颜色" + +#. module: web_company_color +#: model:ir.model,name:web_company_color.model_ir_qweb +msgid "Qweb" +msgstr "Qweb" + +#. module: web_company_color +#: model:ir.model.fields,field_description:web_company_color.field_res_company__scss_modif_timestamp +msgid "SCSS Modif. Timestamp" +msgstr "SCSS修改时间戳" + +#~ msgid "Navbar Colors" +#~ msgstr "导航栏颜色" + +#~ msgid "" +#~ "\n" +#~ " In order for the changes to take effect, please " +#~ "refresh\n" +#~ " the page." +#~ msgstr "" +#~ "\n" +#~ " 为了使更改生效,请刷新\n" +#~ " 这个页面。" diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/migrations/16.0.1.2.1/post-migration.py b/odoo-bringout-oca-web-web_company_color/web_company_color/migrations/16.0.1.2.1/post-migration.py new file mode 100644 index 0000000..73b0a47 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/migrations/16.0.1.2.1/post-migration.py @@ -0,0 +1,9 @@ +# Copyright 2024 Tecnativa - Carlos Roca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from openupgradelib import openupgrade + + +@openupgrade.migrate() +def migrate(env, version): + companies = env["res.company"].search([("company_colors", "!=", False)]) + companies.scss_create_or_update_attachment() diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/models/__init__.py b/odoo-bringout-oca-web-web_company_color/web_company_color/models/__init__.py new file mode 100644 index 0000000..8677b09 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/models/__init__.py @@ -0,0 +1,5 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import assetsbundle +from . import res_company +from . import ir_qweb diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/models/assetsbundle.py b/odoo-bringout-oca-web-web_company_color/web_company_color/models/assetsbundle.py new file mode 100644 index 0000000..aec3073 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/models/assetsbundle.py @@ -0,0 +1,22 @@ +# Copyright 2020 Alexandre Díaz +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo.http import request + +from odoo.addons.base.models.assetsbundle import AssetsBundle, ScssStylesheetAsset + + +class AssetsBundleCompanyColor(AssetsBundle): + def get_company_color_asset_node(self): + """Process the user active company scss and returns the node to inject""" + try: + active_company_id = int( + request.httprequest.cookies.get("cids", "").split(",")[0] + ) + except Exception: + active_company_id = False + company_id = ( + self.env["res.company"].browse(active_company_id) or self.env.company + ) + asset = ScssStylesheetAsset(self, url=company_id.scss_get_url()) + compiled = self.compile_css(asset.compile, asset.get_source()) + return "style", {}, compiled diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/models/ir_qweb.py b/odoo-bringout-oca-web-web_company_color/web_company_color/models/ir_qweb.py new file mode 100644 index 0000000..944288c --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/models/ir_qweb.py @@ -0,0 +1,38 @@ +# Copyright 2020 Alexandre Díaz +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import models + +from .assetsbundle import AssetsBundleCompanyColor + + +class QWeb(models.AbstractModel): + _inherit = "ir.qweb" + + def _generate_asset_nodes_cache( + self, + bundle, + css=True, + js=True, + debug=False, + async_load=False, + defer_load=False, + lazy_load=False, + media=None, + ): + res = super()._generate_asset_nodes( + bundle, css, js, debug, async_load, defer_load, lazy_load, media + ) + if bundle == "web_company_color.company_color_assets": + asset = AssetsBundleCompanyColor( + bundle, [], env=self.env, css=True, js=True + ) + res += [asset.get_company_color_asset_node()] + return res + + def _get_asset_content(self, bundle, defer_load=False, lazy_load=False, media=None): + """Handle 'special' web_company_color bundle""" + if bundle == "web_company_color.company_color_assets": + return [], [] + return super()._get_asset_content( + bundle, defer_load=defer_load, lazy_load=lazy_load, media=media + ) diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/models/res_company.py b/odoo-bringout-oca-web-web_company_color/web_company_color/models/res_company.py new file mode 100644 index 0000000..278e832 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/models/res_company.py @@ -0,0 +1,231 @@ +# Copyright 2019 Alexandre Díaz +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import base64 +from colorsys import hls_to_rgb, rgb_to_hls + +from odoo import api, fields, models + +from ..utils import convert_to_image, image_to_rgb, n_rgb_to_hex + +URL_BASE = "/web_company_color/static/src/scss/" +URL_SCSS_GEN_TEMPLATE = URL_BASE + "custom_colors.%d.gen.scss" + + +class ResCompany(models.Model): + _inherit = "res.company" + + SCSS_TEMPLATE = """ + .o_main_navbar { + background: %(color_navbar_bg)s !important; + background-color: %(color_navbar_bg)s !important; + color: %(color_navbar_text)s !important; + + > .o_menu_brand { + color: %(color_navbar_text)s !important; + &:hover, &:focus, &:active, &:focus:active { + background-color: %(color_navbar_bg_hover)s !important; + } + } + + .show { + .dropdown-toggle { + background-color: %(color_navbar_bg_hover)s !important; + } + } + + > ul { + > li { + > a, > label { + color: %(color_navbar_text)s !important; + + &:hover, &:focus, &:active, &:focus:active { + background-color: %(color_navbar_bg_hover)s !important; + } + } + } + } + } + + a[href], + a[tabindex], + .btn-link, + .o_external_button { + color: %(color_link_text)s; + .o_main_navbar { + color: none; + } + } + a:hover, + .btn-link:hover { + color: %(color_link_text_hover)s; + .o_main_navbar { + color: none; + } + } + .btn-primary:not(.disabled), + .ui-autocomplete .ui-menu-item > a.ui-state-active { + color: %(color_button_text)s !important; + background-color: %(color_button_bg)s !important; + border-color: %(color_button_bg)s !important; + } + .btn-primary:hover:not(.disabled), + .ui-autocomplete .ui-menu-item > a.ui-state-active:hover { + color: %(color_button_text)s !important; + background-color: %(color_button_bg_hover)s !important; + border-color: %(color_button_bg_hover)s !important; + } + .o_searchview .o_searchview_facet .o_searchview_facet_label { + color: %(color_button_text)s !important; + background-color: %(color_button_bg)s !important; + } + .o_form_view .o_horizontal_separator { + color: %(color_link_text)s !important; + } + .o_form_view .oe_button_box .oe_stat_button .o_button_icon, + .o_form_view .oe_button_box .oe_stat_button .o_stat_info .o_stat_value, + .o_form_view .oe_button_box .oe_stat_button > span .o_stat_value { + color: %(color_link_text)s !important; + } + .o_form_view .o_form_statusbar > .o_statusbar_status > + .o_arrow_button.btn-primary.disabled { + color: %(color_link_text)s !important; + } + .o_required_modifier{ + :focus-within { + --o-input-border-color: %(color_button_bg)s !important; + --o-caret-color: %(color_button_bg)s !important; + } + input:hover, .o_field_many2one_selection:hover { + --o-input-border-color: %(color_button_bg)s !important; + --o-caret-color: %(color_button_bg)s !important; + } + } + """ + + company_colors = fields.Serialized() + color_navbar_bg = fields.Char("Navbar Background Color", sparse="company_colors") + color_navbar_bg_hover = fields.Char( + "Navbar Background Color Hover", sparse="company_colors" + ) + color_navbar_text = fields.Char("Navbar Text Color", sparse="company_colors") + color_button_text = fields.Char("Button Text Color", sparse="company_colors") + color_button_bg = fields.Char("Button Background Color", sparse="company_colors") + color_button_bg_hover = fields.Char( + "Button Background Color Hover", sparse="company_colors" + ) + color_link_text = fields.Char("Link Text Color", sparse="company_colors") + color_link_text_hover = fields.Char( + "Link Text Color Hover", sparse="company_colors" + ) + scss_modif_timestamp = fields.Char("SCSS Modif. Timestamp") + + @api.model_create_multi + def create(self, vals_list): + records = super().create(vals_list) + records.scss_create_or_update_attachment() + return records + + def unlink(self): + IrAttachmentObj = self.env["ir.attachment"] + for record in self: + IrAttachmentObj.sudo().search( + [("url", "=", record.scss_get_url()), ("company_id", "=", record.id)] + ).sudo().unlink() + return super().unlink() + + def write(self, values): + if not self.env.context.get("ignore_company_color", False): + fields_to_check = ( + "color_navbar_bg", + "color_navbar_bg_hover", + "color_navbar_text", + "color_button_bg", + "color_button_bg_hover", + "color_button_text", + "color_link_text", + "color_link_text_hover", + ) + result = super().write(values) + if any([field in values for field in fields_to_check]): + self.scss_create_or_update_attachment() + else: + result = super().write(values) + return result + + def button_compute_color(self): + self.ensure_one() + values = self.default_get( + ["color_navbar_bg", "color_navbar_bg_hover", "color_navbar_text"] + ) + if self.logo: + _r, _g, _b = image_to_rgb(convert_to_image(self.logo)) + # Make color 10% darker + _h, _l, _s = rgb_to_hls(_r, _g, _b) + _l = max(0, _l - 0.1) + _rd, _gd, _bd = hls_to_rgb(_h, _l, _s) + # Calc. optimal text color (b/w) + # Grayscale human vision perception (Rec. 709 values) + _a = 1 - (0.2126 * _r + 0.7152 * _g + 0.0722 * _b) + values.update( + { + "color_navbar_bg": n_rgb_to_hex(_r, _g, _b), + "color_navbar_bg_hover": n_rgb_to_hex(_rd, _gd, _bd), + "color_navbar_text": "#000" if _a < 0.5 else "#fff", + } + ) + self.write(values) + + def _scss_get_sanitized_values(self): + self.ensure_one() + # Clone company_color as dictionary to avoid ORM operations + # This allow extend company_colors and only sanitize selected fields + # or add custom values + values = dict(self.company_colors or {}) + values.update( + { + "color_navbar_bg": (values.get("color_navbar_bg") or "$o-brand-odoo"), + "color_navbar_bg_hover": (values.get("color_navbar_bg_hover")), + "color_navbar_text": (values.get("color_navbar_text") or "#FFF"), + "color_button_bg": values.get("color_button_bg") or "#71639e", + "color_button_bg_hover": values.get("color_button_bg_hover") + or "darken(#71639e, 10%)", + "color_button_text": values.get("color_button_text") or "#FFF", + "color_link_text": values.get("color_link_text") or "#71639e", + "color_link_text_hover": values.get("color_link_text_hover") + or "darken(#71639e, 10%)", + } + ) + return values + + def _scss_generate_content(self): + self.ensure_one() + # ir.attachment need files with content to work + if not self.company_colors: + return "// No Web Company Color SCSS Content\n" + return self.SCSS_TEMPLATE % self._scss_get_sanitized_values() + + def scss_get_url(self): + self.ensure_one() + return URL_SCSS_GEN_TEMPLATE % self.id + + def scss_create_or_update_attachment(self): + IrAttachmentObj = self.env["ir.attachment"] + for record in self: + datas = base64.b64encode(record._scss_generate_content().encode("utf-8")) + custom_url = record.scss_get_url() + custom_attachment = IrAttachmentObj.sudo().search( + [("url", "=", custom_url), ("company_id", "=", record.id)] + ) + values = { + "datas": datas, + "db_datas": datas, + "url": custom_url, + "name": custom_url, + "company_id": record.id, + } + if custom_attachment: + custom_attachment.sudo().write(values) + else: + values.update({"type": "binary", "mimetype": "text/scss"}) + IrAttachmentObj.sudo().create(values) + self.env["ir.qweb"].sudo().clear_caches() diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-web-web_company_color/web_company_color/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..180a4a0 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/readme/CONTRIBUTORS.rst @@ -0,0 +1,11 @@ +* Jordi Ballester Alomar (ForgeFlow) +* Lois Rilo (ForgeFlow) +* Simone Orsi +* Iván Antón +* Bernat Puig (ForgeFlow) +* Dhara Solanki +* `Tecnativa `_: + + * Jairo Llopis + * Alexandre Díaz + * Carlos Roca diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/readme/DESCRIPTION.rst b/odoo-bringout-oca-web-web_company_color/web_company_color/readme/DESCRIPTION.rst new file mode 100644 index 0000000..b164fc0 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module change navbar colors based in the company logo colors. diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/readme/ROADMAP.rst b/odoo-bringout-oca-web-web_company_color/web_company_color/readme/ROADMAP.rst new file mode 100644 index 0000000..2b66937 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/readme/ROADMAP.rst @@ -0,0 +1 @@ +White color is omitted in the addition operation to support images without alpha channel. diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/readme/USAGE.rst b/odoo-bringout-oca-web-web_company_color/web_company_color/readme/USAGE.rst new file mode 100644 index 0000000..0143fee --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/readme/USAGE.rst @@ -0,0 +1,3 @@ +Go to company record and set a logo. Can see/modify applied colors on the "Navbar" section. + +For optimal results use images with alpha channel. diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/static/description/icon.png b/odoo-bringout-oca-web-web_company_color/web_company_color/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 Q3=9kmp00i_>zopr09!l7U;qFB literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/static/description/index.html b/odoo-bringout-oca-web-web_company_color/web_company_color/static/description/index.html new file mode 100644 index 0000000..d248396 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/static/description/index.html @@ -0,0 +1,445 @@ + + + + + +Web Company Color + + + +
+

Web Company Color

+ + +

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

+

This module change navbar colors based in the company logo colors.

+

Table of contents

+ +
+

Usage

+

Go to company record and set a logo. Can see/modify applied colors on the “Navbar” section.

+

For optimal results use images with alpha channel.

+
+
+

Known issues / Roadmap

+

White color is omitted in the addition operation to support images without alpha channel.

+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Alexandre Díaz
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

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

+

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

+
+
+
+ + diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/tests/__init__.py b/odoo-bringout-oca-web-web_company_color/web_company_color/tests/__init__.py new file mode 100644 index 0000000..2c9568e --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/tests/__init__.py @@ -0,0 +1 @@ +from . import test_res_company diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/tests/test_res_company.py b/odoo-bringout-oca-web-web_company_color/web_company_color/tests/test_res_company.py new file mode 100644 index 0000000..06a780c --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/tests/test_res_company.py @@ -0,0 +1,77 @@ +# Copyright 2019 Alexandre Díaz +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo.tests import common + +from ..models.res_company import URL_BASE + + +class TestResCompany(common.TransactionCase): + IMG_GREEN = ( + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUl" + + "EQVR42mNk+M/wHwAEBgIApD5fRAAAAABJRU5ErkJggg==" + ) + + def _test_scss_attachment(self): + num_scss = self.env["ir.attachment"].search_count( + [("url", "ilike", "%s%%" % URL_BASE)] + ) + num_companies = self.env["res.company"].search_count([]) + self.assertEqual(num_scss, num_companies, "Invalid scss attachments") + + def test_create_unlink_company(self): + company_id = self.env["res.company"].create({"name": "Company Test"}) + self.assertEqual( + company_id.color_navbar_bg, False, "Invalid Navbar Background Color" + ) + self._test_scss_attachment() + company_id.sudo().write({"logo": self.IMG_GREEN}) + company_id.button_compute_color() + self.assertEqual( + company_id.color_navbar_bg, "#00ff00", "Invalid Navbar Background Color" + ) + # TODO: We can't remove companies if they have attached data, like + # warehouse when we have stock module installed + # company_id.sudo().unlink() + # self._test_scss_attachment() + + def test_change_logo(self): + company_id = self.env["res.company"].search([], limit=1) + company_id.sudo().write({"logo": self.IMG_GREEN}) + company_id.button_compute_color() + self.assertEqual( + company_id.color_navbar_bg, "#00ff00", "Invalid Navbar Background Color" + ) + + def test_scss_sanitized_values(self): + company_id = self.env["res.company"].search([], limit=1) + company_id.sudo().write({"color_navbar_bg": False}) + values = company_id.sudo()._scss_get_sanitized_values() + self.assertEqual( + values["color_navbar_bg"], + "$o-brand-odoo", + "Invalid Navbar Background Color", + ) + company_id.sudo().write({"color_navbar_bg": "#DEAD00"}) + values = company_id.sudo()._scss_get_sanitized_values() + self.assertEqual( + values["color_navbar_bg"], "#DEAD00", "Invalid Navbar Background Color" + ) + + def test_change_color(self): + company_id = self.env["res.company"].search([], limit=1) + company_id.sudo().write({"color_navbar_bg": "#DEAD00"}) + self.assertEqual( + company_id.color_navbar_bg, "#DEAD00", "Invalid Navbar Background Color" + ) + self.assertEqual( + company_id.company_colors["color_navbar_bg"], + "#DEAD00", + "Invalid Navbar Background Color", + ) + company_id.sudo().write({"color_navbar_bg": False}) + self.assertFalse(company_id.color_navbar_bg, "Invalid Navbar Background Color") + self.assertNotIn( + "color_navbar_bg", + company_id.company_colors, + "Invalid Navbar Background Color", + ) diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/utils.py b/odoo-bringout-oca-web-web_company_color/web_company_color/utils.py new file mode 100644 index 0000000..118ceb2 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/utils.py @@ -0,0 +1,40 @@ +# Copyright 2019 Alexandre Díaz +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import base64 +import math +from io import BytesIO + +from PIL import Image + + +def n_rgb_to_hex(_r, _g, _b): + return "#{:02x}{:02x}{:02x}".format(int(255 * _r), int(255 * _g), int(255 * _b)) + + +def convert_to_image(field_binary): + return Image.open(BytesIO(base64.b64decode(field_binary))) + + +def image_to_rgb(img): + def normalize_vec3(vec3): + _l = 1.0 / math.sqrt(vec3[0] * vec3[0] + vec3[1] * vec3[1] + vec3[2] * vec3[2]) + return (vec3[0] * _l, vec3[1] * _l, vec3[2] * _l) + + # Force Alpha Channel + if img.mode != "RGBA": + img = img.convert("RGBA") + width, height = img.size + # Reduce pixels + width, height = (max(1, int(width / 4)), max(1, int(height / 4))) + img = img.resize((width, height)) + rgb_sum = [0, 0, 0] + # Mix. image colors using addition method + RGBA_WHITE = (255, 255, 255, 255) + for i in range(0, height * width): + rgba = img.getpixel((i % width, i / width)) + if rgba[3] > 128 and rgba != RGBA_WHITE: + rgb_sum[0] += rgba[0] + rgb_sum[1] += rgba[1] + rgb_sum[2] += rgba[2] + _r, _g, _b = normalize_vec3(rgb_sum) + return (_r, _g, _b) diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/view/assets.xml b/odoo-bringout-oca-web-web_company_color/web_company_color/view/assets.xml new file mode 100644 index 0000000..94b3baf --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/view/assets.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/odoo-bringout-oca-web-web_company_color/web_company_color/view/res_company.xml b/odoo-bringout-oca-web-web_company_color/web_company_color/view/res_company.xml new file mode 100644 index 0000000..45dd794 --- /dev/null +++ b/odoo-bringout-oca-web-web_company_color/web_company_color/view/res_company.xml @@ -0,0 +1,46 @@ + + + + + res.company + + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
+ + + tile.category + + + + + + + + + + + + Dashboard Categories + tile.category + tree,kanban,form + {'active_test': False} + + + + +
diff --git a/odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/views/tile_tile.xml b/odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/views/tile_tile.xml new file mode 100644 index 0000000..eb00f15 --- /dev/null +++ b/odoo-bringout-oca-web-web_dashboard_tile/web_dashboard_tile/views/tile_tile.xml @@ -0,0 +1,231 @@ + + + + + tile.tile + + + + + + + + + + + tile.tile + + + + + + + + + + + + + + + + + + + tile.tile + +
+ + +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + tile.tile + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + + + Dashboard Items + tile.tile + tree,form,kanban + + + + + + + + diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/README.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/README.md new file mode 100644 index 0000000..1009a7f --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/README.md @@ -0,0 +1,46 @@ +# Web Datetime Picker Default Time + +Odoo addon: web_datetime_picker_default_time + +## Installation + +```bash +pip install odoo-bringout-oca-web-web_datetime_picker_default_time +``` + +## Dependencies + +This addon depends on: +- web + +## Manifest Information + +- **Name**: Web Datetime Picker Default Time +- **Version**: 16.0.1.0.0 +- **Category**: web +- **License**: AGPL-3 +- **Installable**: False + +## Source + +Based on [OCA/web](https://github.com/OCA/web) branch 16.0, addon `web_datetime_picker_default_time`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Reports: doc/REPORTS.md +- Security: doc/SECURITY.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/ARCHITECTURE.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/ARCHITECTURE.md new file mode 100644 index 0000000..2c636a7 --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Web_datetime_picker_default_time Module - web_datetime_picker_default_time + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/CONFIGURATION.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/CONFIGURATION.md new file mode 100644 index 0000000..ffdacad --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for web_datetime_picker_default_time. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/CONTROLLERS.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/DEPENDENCIES.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/DEPENDENCIES.md new file mode 100644 index 0000000..b3b749a --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/DEPENDENCIES.md @@ -0,0 +1,5 @@ +# Dependencies + +This addon depends on: + +- [web](https://github.com/bringout/oca-ocb-core/tree/b3e6fb998e53b9eb1bc9669d992017616c2bd7b3/odoo-bringout-oca-ocb-web) diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/FAQ.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/FAQ.md new file mode 100644 index 0000000..2a309a0 --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon web_datetime_picker_default_time or install in UI. diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/INSTALL.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/INSTALL.md new file mode 100644 index 0000000..3c787f1 --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-web-web_datetime_picker_default_time" +# or +uv pip install odoo-bringout-oca-web-web_datetime_picker_default_time" +``` diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/MODELS.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/MODELS.md new file mode 100644 index 0000000..28289c7 --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/MODELS.md @@ -0,0 +1,11 @@ +# Models + +Detected core models and extensions in web_datetime_picker_default_time. + +```mermaid +classDiagram +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/OVERVIEW.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/OVERVIEW.md new file mode 100644 index 0000000..71e617f --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: web_datetime_picker_default_time. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon web_datetime_picker_default_time +- License: LGPL-3 diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/REPORTS.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/SECURITY.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/SECURITY.md new file mode 100644 index 0000000..e07da9d --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/SECURITY.md @@ -0,0 +1,8 @@ +# Security + +This module does not define custom security rules or access controls beyond Odoo defaults. + +Default Odoo security applies: +- Base user access through standard groups +- Model access inherited from dependencies +- No custom row-level security rules diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/USAGE.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/USAGE.md new file mode 100644 index 0000000..23f7916 --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon web_datetime_picker_default_time +``` diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/WIZARDS.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/pyproject.toml b/odoo-bringout-oca-web-web_datetime_picker_default_time/pyproject.toml new file mode 100644 index 0000000..1a7912e --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/pyproject.toml @@ -0,0 +1,42 @@ +[project] +name = "odoo-bringout-oca-web-web_datetime_picker_default_time" +version = "16.0.0" +description = "Web Datetime Picker Default Time - Allows to define a default time on datetime picker" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-ocb-web>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["web_datetime_picker_default_time"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/README.rst b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/README.rst new file mode 100644 index 0000000..c86cd7a --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/README.rst @@ -0,0 +1,122 @@ +================================ +Web Datetime Picker Default Time +================================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:a5ffb697bdf4c26817212f783a9d4d617e91fcdc912a7750382d3eddaff05f7b + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_datetime_picker_default_time + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_datetime_picker_default_time + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module customizes the datetime picker widget and allows to define a +default time to be applied in case the user selects only a Date. + +For example, if a user wants to define a commitment date without having +to specify the time on that date, setting the default time value on the +field in the Form view allows to ensure the commitment date will be set +to this time instead of the time when the page was loaded by the +browser. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +You can define the default time as follows for a static value: + +.. code:: xml + + + +Otherwise you can also use a JSON field to make it dynamic through a +compute function, and reference this field in the view: + +.. code:: python + + start_time = field.Json(compute="_compute_start_time") + + def _compute_start_time(self): + for rec in self: + rec.start_time = {'hour': 8, 'minute': 30, 'second': 15 } + +.. code:: xml + + + + +Known issues / Roadmap +====================== + +- Handle Timezone related to the default time + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Camptocamp + +Contributors +------------ + +- Akim Juillerat akim.juillerat@camptocamp.com +- Iván Todorovich ivan.todorovich@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. + +.. |maintainer-grindtildeath| image:: https://github.com/grindtildeath.png?size=40px + :target: https://github.com/grindtildeath + :alt: grindtildeath + +Current `maintainer `__: + +|maintainer-grindtildeath| + +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/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/__init__.py b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/__manifest__.py b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/__manifest__.py new file mode 100644 index 0000000..98d289a --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright 2024 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +{ + "name": "Web Datetime Picker Default Time", + "summary": "Allows to define a default time on datetime picker", + "version": "16.0.1.0.0", + "category": "web", + "website": "https://github.com/OCA/web", + "author": "Camptocamp, Odoo Community Association (OCA)", + "maintainers": ["grindtildeath"], + "license": "AGPL-3", + "depends": [ + "web", + ], + "assets": { + "web.assets_backend": [ + "/web_datetime_picker_default_time/static/src/js/*.js", + "/web_datetime_picker_default_time/static/src/xml/*.xml", + ], + }, +} diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/i18n/it.po b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/i18n/it.po new file mode 100644 index 0000000..7338855 --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/i18n/it.po @@ -0,0 +1,14 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/i18n/web_datetime_picker_default_time.pot b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/i18n/web_datetime_picker_default_time.pot new file mode 100644 index 0000000..78d58d5 --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/i18n/web_datetime_picker_default_time.pot @@ -0,0 +1,13 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/CONTRIBUTORS.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/CONTRIBUTORS.md new file mode 100644 index 0000000..6168e90 --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +* Akim Juillerat +* Iván Todorovich diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/DESCRIPTION.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/DESCRIPTION.md new file mode 100644 index 0000000..4e15c7e --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/DESCRIPTION.md @@ -0,0 +1,7 @@ +This module customizes the datetime picker widget and allows to define a default +time to be applied in case the user selects only a Date. + +For example, if a user wants to define a commitment date without having to specify +the time on that date, setting the default time value on the field in the Form view +allows to ensure the commitment date will be set to this time instead of the time +when the page was loaded by the browser. diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/ROADMAP.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/ROADMAP.md new file mode 100644 index 0000000..53bc263 --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/ROADMAP.md @@ -0,0 +1 @@ +* Handle Timezone related to the default time diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/USAGE.md b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/USAGE.md new file mode 100644 index 0000000..03e2fc1 --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/readme/USAGE.md @@ -0,0 +1,21 @@ +You can define the default time as follows for a static value: + +```xml + +``` + +Otherwise you can also use a JSON field to make it dynamic through a compute function, +and reference this field in the view: + +```python + start_time = field.Json(compute="_compute_start_time") + + def _compute_start_time(self): + for rec in self: + rec.start_time = {'hour': 8, 'minute': 30, 'second': 15 } +``` + +```xml + + +``` diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/description/icon.png b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 Q3=9kmp00i_>zopr09!l7U;qFB literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/description/index.html b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/description/index.html new file mode 100644 index 0000000..8ff4371 --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/description/index.html @@ -0,0 +1,460 @@ + + + + + +Web Datetime Picker Default Time + + + +
+

Web Datetime Picker Default Time

+ + +

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

+

This module customizes the datetime picker widget and allows to define a +default time to be applied in case the user selects only a Date.

+

For example, if a user wants to define a commitment date without having +to specify the time on that date, setting the default time value on the +field in the Form view allows to ensure the commitment date will be set +to this time instead of the time when the page was loaded by the +browser.

+

Table of contents

+ +
+

Usage

+

You can define the default time as follows for a static value:

+
+<field name="your_datetime_field" options="{'defaultTime': {'hour': 8, 'minute': 30, 'second': 15 }}"/>
+
+

Otherwise you can also use a JSON field to make it dynamic through a +compute function, and reference this field in the view:

+
+start_time = field.Json(compute="_compute_start_time")
+
+def _compute_start_time(self):
+    for rec in self:
+        rec.start_time = {'hour': 8, 'minute': 30, 'second': 15 }
+
+
+<field name="start_time" invisible="1" />
+<field name="your_datetime_field" options="{'defaultTime': 'start_time'}"/>
+
+
+
+

Known issues / Roadmap

+
    +
  • Handle Timezone related to the default time
  • +
+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+ +
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

Current maintainer:

+

grindtildeath

+

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/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/src/js/datepicker.esm.js b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/src/js/datepicker.esm.js new file mode 100644 index 0000000..f453cbf --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/src/js/datepicker.esm.js @@ -0,0 +1,58 @@ +/** @odoo-module **/ +/* Copyright 2024 Camptocamp + * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) */ + +import {DateTimePicker} from "@web/core/datepicker/datepicker"; +import {patch} from "@web/core/utils/patch"; +import {localization} from "@web/core/l10n/localization"; + +patch(DateTimePicker.prototype, "DateTimePickerDefaultTime", { + onMounted() { + this._super.apply(this, arguments); + this.addPickerListener("change", ({date, oldDate}) => { + const default_time = this.props.defaultTime; + if (date && !oldDate && default_time) { + // FIXME: Consider TZ + date.set({ + hour: default_time.hour, + minute: default_time.minute, + second: default_time.second, + }); + window.$(this.rootRef.el).datetimepicker("date", date); + } + }); + }, + isStrDate(input_string) { + return input_string.trim().length == localization.dateFormat.length; + }, + customParseValue(input_value, options) { + const default_time = this.props.defaultTime; + let [res, error] = this.parseValueOriginal(input_value, options); + if (default_time && this.isStrDate(input_value)) { + const new_value = res.set({ + hour: default_time.hour, + minute: default_time.minute, + second: default_time.second, + }); + res = new_value; + } + return [res, error]; + }, + initFormat() { + this._super.apply(this, arguments); + this.parseValueOriginal = this.parseValue; + this.parseValue = this.customParseValue; + }, +}); + +DateTimePicker.props = _.extend({}, DateTimePicker.props, { + defaultTime: { + type: Object, + shape: { + hour: Number, + minute: Number, + second: Number, + }, + optional: true, + }, +}); diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/src/js/datetime_field.esm.js b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/src/js/datetime_field.esm.js new file mode 100644 index 0000000..58f4660 --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/src/js/datetime_field.esm.js @@ -0,0 +1,42 @@ +/** @odoo-module **/ +/* Copyright 2024 Camptocamp + * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) */ + +import {DateTimeField} from "@web/views/fields/datetime/datetime_field"; +import {patch} from "@web/core/utils/patch"; + +patch(DateTimeField.prototype, "DateTimeFieldDefaultTime", { + get defaultTime() { + if (typeof this.props.defaultTime === "string") { + return this.props.record.data[this.props.defaultTime]; + } + return this.props.defaultTime; + }, +}); + +DateTimeField.props = _.extend({}, DateTimeField.props, { + defaultTime: { + type: [ + String, + { + type: Object, + shape: { + hour: Number, + minute: Number, + second: Number, + }, + optional: true, + }, + ], + optional: true, + }, +}); + +const super_extractProps = DateTimeField.extractProps; + +DateTimeField.extractProps = ({attrs}) => { + return { + ...super_extractProps({attrs}), + defaultTime: attrs.options.defaultTime, + }; +}; diff --git a/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/src/xml/datetime_field.xml b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/src/xml/datetime_field.xml new file mode 100644 index 0000000..df9affa --- /dev/null +++ b/odoo-bringout-oca-web-web_datetime_picker_default_time/web_datetime_picker_default_time/static/src/xml/datetime_field.xml @@ -0,0 +1,8 @@ + + + + + defaultTime + + + diff --git a/odoo-bringout-oca-web-web_dialog_size/README.md b/odoo-bringout-oca-web-web_dialog_size/README.md new file mode 100644 index 0000000..f3796ec --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/README.md @@ -0,0 +1,46 @@ +# Web Dialog Size + +Odoo addon: web_dialog_size + +## Installation + +```bash +pip install odoo-bringout-oca-web-web_dialog_size +``` + +## Dependencies + +This addon depends on: +- web + +## Manifest Information + +- **Name**: Web Dialog Size +- **Version**: 16.0.1.0.2 +- **Category**: web +- **License**: AGPL-3 +- **Installable**: True + +## Source + +Based on [OCA/web](https://github.com/OCA/web) branch 16.0, addon `web_dialog_size`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Reports: doc/REPORTS.md +- Security: doc/SECURITY.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-web-web_dialog_size/doc/ARCHITECTURE.md b/odoo-bringout-oca-web-web_dialog_size/doc/ARCHITECTURE.md new file mode 100644 index 0000000..c968cf8 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Web_dialog_size Module - web_dialog_size + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-web-web_dialog_size/doc/CONFIGURATION.md b/odoo-bringout-oca-web-web_dialog_size/doc/CONFIGURATION.md new file mode 100644 index 0000000..44e1e37 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for web_dialog_size. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-web-web_dialog_size/doc/CONTROLLERS.md b/odoo-bringout-oca-web-web_dialog_size/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-web-web_dialog_size/doc/DEPENDENCIES.md b/odoo-bringout-oca-web-web_dialog_size/doc/DEPENDENCIES.md new file mode 100644 index 0000000..b3b749a --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/doc/DEPENDENCIES.md @@ -0,0 +1,5 @@ +# Dependencies + +This addon depends on: + +- [web](https://github.com/bringout/oca-ocb-core/tree/b3e6fb998e53b9eb1bc9669d992017616c2bd7b3/odoo-bringout-oca-ocb-web) diff --git a/odoo-bringout-oca-web-web_dialog_size/doc/FAQ.md b/odoo-bringout-oca-web-web_dialog_size/doc/FAQ.md new file mode 100644 index 0000000..19f84dc --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon web_dialog_size or install in UI. diff --git a/odoo-bringout-oca-web-web_dialog_size/doc/INSTALL.md b/odoo-bringout-oca-web-web_dialog_size/doc/INSTALL.md new file mode 100644 index 0000000..72733ab --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-web-web_dialog_size" +# or +uv pip install odoo-bringout-oca-web-web_dialog_size" +``` diff --git a/odoo-bringout-oca-web-web_dialog_size/doc/MODELS.md b/odoo-bringout-oca-web-web_dialog_size/doc/MODELS.md new file mode 100644 index 0000000..9acb49a --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/doc/MODELS.md @@ -0,0 +1,12 @@ +# Models + +Detected core models and extensions in web_dialog_size. + +```mermaid +classDiagram + class ir_config_parameter +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-web-web_dialog_size/doc/OVERVIEW.md b/odoo-bringout-oca-web-web_dialog_size/doc/OVERVIEW.md new file mode 100644 index 0000000..a5fd6e0 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: web_dialog_size. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon web_dialog_size +- License: LGPL-3 diff --git a/odoo-bringout-oca-web-web_dialog_size/doc/REPORTS.md b/odoo-bringout-oca-web-web_dialog_size/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-web-web_dialog_size/doc/SECURITY.md b/odoo-bringout-oca-web-web_dialog_size/doc/SECURITY.md new file mode 100644 index 0000000..e07da9d --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/doc/SECURITY.md @@ -0,0 +1,8 @@ +# Security + +This module does not define custom security rules or access controls beyond Odoo defaults. + +Default Odoo security applies: +- Base user access through standard groups +- Model access inherited from dependencies +- No custom row-level security rules diff --git a/odoo-bringout-oca-web-web_dialog_size/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-web-web_dialog_size/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-web-web_dialog_size/doc/USAGE.md b/odoo-bringout-oca-web-web_dialog_size/doc/USAGE.md new file mode 100644 index 0000000..f07253e --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon web_dialog_size +``` diff --git a/odoo-bringout-oca-web-web_dialog_size/doc/WIZARDS.md b/odoo-bringout-oca-web-web_dialog_size/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-web-web_dialog_size/pyproject.toml b/odoo-bringout-oca-web-web_dialog_size/pyproject.toml new file mode 100644 index 0000000..a983fa0 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/pyproject.toml @@ -0,0 +1,44 @@ +[project] +name = "odoo-bringout-oca-web-web_dialog_size" +version = "16.0.0" +description = "Web Dialog Size - + A module that lets the user expand a + dialog box to the full screen width." +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-ocb-web>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["web_dialog_size"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/README.rst b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/README.rst new file mode 100644 index 0000000..97ee688 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/README.rst @@ -0,0 +1,112 @@ +=============== +Web Dialog Size +=============== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:214939c5a8aeb84d5fb1f5bacae73d4d4d4a81d59c9e2af6e0ea600a6c4c90c5 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_dialog_size + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_dialog_size + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +A module that lets the user expand/restore the dialog box size through a button +in the upper right corner (imitating most windows managers). +It also adds draggable support to the dialogs. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +By default, the module respects the caller's ``dialog_size`` option. +If you want to set dialog boxes maximized by default, you need to: + +#. Go to *Settings -> Technical -> Parameters -> System Parameters* +#. Add a new record with the text *web_dialog_size.default_maximize* in + the *Key* field and the text *True* in the *Value* field + +Known issues / Roadmap +====================== + +* Allow setting default dialog size per user. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* ACSONE SA/NV +* Therp BV +* Siddharth Bhalgami +* Tecnativa +* Amaris + +Contributors +~~~~~~~~~~~~ + +* Anthony Muschang +* Stéphane Bidoul +* Holger Brunn +* Siddharth Bhalgami +* Wolfgang Pichler +* David Vidal +* Quentin Theuret +* `Tecnativa `_: + + * Pedro M. Baeza + * Jairo Llopis + * Ernesto Tejeda + +* Sudhir Arya +* Pierre Pizzetta +* Mantas Šniukas + +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/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/__init__.py b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/__manifest__.py b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/__manifest__.py new file mode 100644 index 0000000..4ac4809 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/__manifest__.py @@ -0,0 +1,33 @@ +# Copyright 2015 ACSONE SA/NV +# Copyright 2018 Amaris +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Web Dialog Size", + "summary": """ + A module that lets the user expand a + dialog box to the full screen width.""", + "author": "ACSONE SA/NV, " + "Therp BV, " + "Siddharth Bhalgami," + "Tecnativa, " + "Amaris, " + "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "category": "web", + "version": "16.0.1.0.2", + "license": "AGPL-3", + "depends": ["web"], + "installable": True, + "assets": { + "web.assets_backend": [ + "/web_dialog_size/static/src/js/web_dialog_size.js", + "/web_dialog_size/static/src/js/web_dialog_size.esm.js", + "/web_dialog_size/static/src/js/web_dialog_draggable.esm.js", + "/web_dialog_size/static/src/scss/web_dialog_size.scss", + "/web_dialog_size/static/src/xml/web_dialog_size.xml", + "/web_dialog_size/static/src/xml/ExpandButton.xml", + "/web_dialog_size/static/src/xml/DialogDraggable.xml", + ], + }, +} diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/bs.po b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/bs.po new file mode 100644 index 0000000..8820076 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/bs.po @@ -0,0 +1,19 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_dialog_size +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_dialog_size +#: model:ir.model,name:web_dialog_size.model_ir_config_parameter +msgid "System Parameter" +msgstr "Sistemski parametar" diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/de.po b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/de.po new file mode 100644 index 0000000..3a7e405 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/de.po @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_dialog_size +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-10-13 20:46+0000\n" +"Last-Translator: Corneliuus \n" +"Language-Team: none\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 4.3.2\n" + +#. module: web_dialog_size +#: model:ir.model,name:web_dialog_size.model_ir_config_parameter +msgid "System Parameter" +msgstr "Systemparameter" + +#~ msgid "Display Name" +#~ msgstr "Anzeigename" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Zuletzt bearbeitet am" diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/es.po b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/es.po new file mode 100644 index 0000000..a3647c3 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/es.po @@ -0,0 +1,25 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_dialog_size +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-05-25 11:47+0000\n" +"Last-Translator: Valentin Vinagre \n" +"Language-Team: none\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 4.3.2\n" + +#. module: web_dialog_size +#: model:ir.model,name:web_dialog_size.model_ir_config_parameter +msgid "System Parameter" +msgstr "Parámetro del sistema" + +#~ msgid "ID" +#~ msgstr "ID" diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/fr.po b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/fr.po new file mode 100644 index 0000000..d3a0bde --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/fr.po @@ -0,0 +1,25 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_dialog_size +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-05-14 20:47+0000\n" +"Last-Translator: Yves Le Doeuff \n" +"Language-Team: none\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 4.3.2\n" + +#. module: web_dialog_size +#: model:ir.model,name:web_dialog_size.model_ir_config_parameter +msgid "System Parameter" +msgstr "Paramètre système" + +#~ msgid "Display Name" +#~ msgstr "Nom affiché" diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/hr.po b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/hr.po new file mode 100644 index 0000000..a6ff78c --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/hr.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_dialog_size +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-11-13 17:06+0000\n" +"Last-Translator: vladimiruvid \n" +"Language-Team: none\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 5.6.2\n" + +#. module: web_dialog_size +#: model:ir.model,name:web_dialog_size.model_ir_config_parameter +msgid "System Parameter" +msgstr "Sistemski parametar" diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/it.po b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/it.po new file mode 100644 index 0000000..b54cc33 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/it.po @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_dialog_size +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-27 11:33+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: web_dialog_size +#: model:ir.model,name:web_dialog_size.model_ir_config_parameter +msgid "System Parameter" +msgstr "Parametro di sistema" + +#~ msgid "Display Name" +#~ msgstr "Nome Visualizzato" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima Modifica il" diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/nl.po b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/nl.po new file mode 100644 index 0000000..d90fc96 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/nl.po @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_dialog_size +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-05-17 20:47+0000\n" +"Last-Translator: Bosd \n" +"Language-Team: none\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 4.3.2\n" + +#. module: web_dialog_size +#: model:ir.model,name:web_dialog_size.model_ir_config_parameter +msgid "System Parameter" +msgstr "Systeem Parameter" + +#~ msgid "Display Name" +#~ msgstr "Weergavenaam" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Laatst Gewijzigd op" diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/tr.po b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/tr.po new file mode 100644 index 0000000..fcf4787 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/tr.po @@ -0,0 +1,22 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_dialog_size +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-04-15 10:24+0000\n" +"Last-Translator: Betül Öğmen \n" +"Language-Team: none\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: web_dialog_size +#: model:ir.model,name:web_dialog_size.model_ir_config_parameter +msgid "System Parameter" +msgstr "Sistem Parametresi" diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/web_dialog_size.pot b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/web_dialog_size.pot new file mode 100644 index 0000000..a59c772 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/web_dialog_size.pot @@ -0,0 +1,19 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_dialog_size +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_dialog_size +#: model:ir.model,name:web_dialog_size.model_ir_config_parameter +msgid "System Parameter" +msgstr "" diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/zh_CN.po b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/zh_CN.po new file mode 100644 index 0000000..8a3c411 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/i18n/zh_CN.po @@ -0,0 +1,22 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_dialog_size +# +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_dialog_size +#: model:ir.model,name:web_dialog_size.model_ir_config_parameter +msgid "System Parameter" +msgstr "系统参数" diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/models/__init__.py b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/models/__init__.py new file mode 100644 index 0000000..bd3aa9f --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/models/__init__.py @@ -0,0 +1 @@ +from . import ir_config_parameter diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/models/ir_config_parameter.py b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/models/ir_config_parameter.py new file mode 100644 index 0000000..493a4f6 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/models/ir_config_parameter.py @@ -0,0 +1,18 @@ +# Copyright 2018 Tecnativa - Jairo Llopis +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.models import Model, api +from odoo.tools.safe_eval import const_eval + + +class IrConfigParameter(Model): + _inherit = "ir.config_parameter" + + @api.model + def get_web_dialog_size_config(self): + get_param = self.sudo().get_param + return { + "default_maximize": const_eval( + get_param("web_dialog_size.default_maximize", "False") + ) + } diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/CONFIGURE.rst b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/CONFIGURE.rst new file mode 100644 index 0000000..243ecce --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/CONFIGURE.rst @@ -0,0 +1,6 @@ +By default, the module respects the caller's ``dialog_size`` option. +If you want to set dialog boxes maximized by default, you need to: + +#. Go to *Settings -> Technical -> Parameters -> System Parameters* +#. Add a new record with the text *web_dialog_size.default_maximize* in + the *Key* field and the text *True* in the *Value* field diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..5f67550 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/CONTRIBUTORS.rst @@ -0,0 +1,16 @@ +* Anthony Muschang +* Stéphane Bidoul +* Holger Brunn +* Siddharth Bhalgami +* Wolfgang Pichler +* David Vidal +* Quentin Theuret +* `Tecnativa `_: + + * Pedro M. Baeza + * Jairo Llopis + * Ernesto Tejeda + +* Sudhir Arya +* Pierre Pizzetta +* Mantas Šniukas diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/DESCRIPTION.rst b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/DESCRIPTION.rst new file mode 100644 index 0000000..398e72f --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +A module that lets the user expand/restore the dialog box size through a button +in the upper right corner (imitating most windows managers). +It also adds draggable support to the dialogs. diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/ROADMAP.rst b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/ROADMAP.rst new file mode 100644 index 0000000..8667f3e --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/readme/ROADMAP.rst @@ -0,0 +1 @@ +* Allow setting default dialog size per user. diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/description/icon.png b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 Q3=9kmp00i_>zopr09!l7U;qFB literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/description/index.html b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/description/index.html new file mode 100644 index 0000000..ac2c633 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/description/index.html @@ -0,0 +1,465 @@ + + + + + +Web Dialog Size + + + +
+

Web Dialog Size

+ + +

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

+

A module that lets the user expand/restore the dialog box size through a button +in the upper right corner (imitating most windows managers). +It also adds draggable support to the dialogs.

+

Table of contents

+ +
+

Configuration

+

By default, the module respects the caller’s dialog_size option. +If you want to set dialog boxes maximized by default, you need to:

+
    +
  1. Go to Settings -> Technical -> Parameters -> System Parameters
  2. +
  3. +
    Add a new record with the text web_dialog_size.default_maximize in
    +
    the Key field and the text True in the Value field
    +
    +
  4. +
+
+
+

Known issues / Roadmap

+
    +
  • Allow setting default dialog size per user.
  • +
+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
  • Therp BV
  • +
  • Siddharth Bhalgami
  • +
  • Tecnativa
  • +
  • Amaris
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

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

+

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

+
+
+
+ + diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/js/web_dialog_draggable.esm.js b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/js/web_dialog_draggable.esm.js new file mode 100644 index 0000000..92ea85a --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/js/web_dialog_draggable.esm.js @@ -0,0 +1,50 @@ +/** @odoo-module **/ + +import {ActionDialog} from "@web/webclient/actions/action_dialog"; +import {onMounted, useExternalListener} from "@odoo/owl"; +import {useListener} from "@web/core/utils/hooks"; +import {LegacyComponent} from "@web/legacy/legacy_component"; +import {Dialog} from "@web/core/dialog/dialog"; + +export class DialogDraggable extends LegacyComponent { + setup() { + this.element_position = {x: 0, y: 0}; + this.mouse_to_element_ratio = {x: 0, y: 0}; + const bound_onDrag = this.onDrag.bind(this); + useListener("mousedown", "header.modal-header", (event) => { + const y = parseInt(this.el.querySelector(".modal-content").offsetTop, 10); + const x = parseInt(this.el.querySelector(".modal-content").offsetLeft, 10); + this.mouse_to_element_ratio = {x: event.x - x, y: event.y - y}; + this.element_position = { + x: event.x - this.mouse_to_element_ratio.x - x, + y: event.y - this.mouse_to_element_ratio.y - y, + }; + document.addEventListener("mousemove", bound_onDrag); + }); + useExternalListener(document, "mouseup", () => + document.removeEventListener("mousemove", bound_onDrag) + ); + onMounted(() => { + this.el.querySelector(".modal-content").classList.add("position-absolute"); + this.el.parentNode.classList.add("position-relative"); + }); + } + + getMovePosition({x, y}) { + return { + x: x - this.mouse_to_element_ratio.x - this.element_position.x, + y: y - this.mouse_to_element_ratio.y - this.element_position.y, + }; + } + onDrag(event) { + const {x, y} = this.getMovePosition(event); + const el = this.el.querySelector(".modal-content"); + el.style.left = `${x}px`; + el.style.top = `${y}px`; + } +} + +DialogDraggable.template = "DialogDraggable"; + +Dialog.components = Object.assign(Dialog.components || {}, {DialogDraggable}); +Object.assign(ActionDialog.components, {DialogDraggable}); diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/js/web_dialog_size.esm.js b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/js/web_dialog_size.esm.js new file mode 100644 index 0000000..594408e --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/js/web_dialog_size.esm.js @@ -0,0 +1,96 @@ +/** @odoo-module **/ + +import {ActionDialog} from "@web/webclient/actions/action_dialog"; +import {patch} from "@web/core/utils/patch"; +import rpc from "web.rpc"; +import {Component, onWillRender} from "@odoo/owl"; +import {Dialog} from "@web/core/dialog/dialog"; +import {SelectCreateDialog} from "@web/views/view_dialogs/select_create_dialog"; + +export class ExpandButton extends Component { + setup() { + this.lastSize = this.currentSize = this.props.getsize(); + this.sizeRestored = false; + this.config = rpc.query({ + model: "ir.config_parameter", + method: "get_web_dialog_size_config", + }); + + onWillRender(() => { + var self = this; + // If the form lost its current state, we need to set it again + if (this.props.getsize() !== this.currentSize) { + this.props.setsize(this.currentSize); + } + // Check if we already are in full screen or if the form was restored. + // If so we don't need to check the default maximize + if (this.props.getsize() !== "dialog_full_screen" && !this.sizeRestored) { + this.config.then(function (r) { + if (r.default_maximize && stop) { + self.dialog_button_extend(); + } + }); + } + }); + } + + dialog_button_extend() { + this.lastSize = this.props.getsize(); + this.props.setsize("dialog_full_screen"); + this.currentSize = "dialog_full_screen"; + this.sizeRestored = false; + this.render(); + } + + dialog_button_restore() { + this.props.setsize(this.lastSize); + this.currentSize = this.lastSize; + this.sizeRestored = true; + this.render(); + } +} + +ExpandButton.template = "web_dialog_size.ExpandButton"; + +patch(Dialog.prototype, "web_dialog_size.Dialog", { + setup() { + this._super(...arguments); + this.setSize = this.setSize.bind(this); + this.getSize = this.getSize.bind(this); + }, + + setSize(size) { + this.props.size = size; + this.render(); + }, + + getSize() { + return this.props.size; + }, +}); + +patch(SelectCreateDialog.prototype, "web_dialog_size.SelectCreateDialog", { + setup() { + this._super(...arguments); + this.setSize = this.setSize.bind(this); + this.getSize = this.getSize.bind(this); + }, + + setSize(size) { + this.props.size = size; + this.render(); + }, + + getSize() { + return this.props.size; + }, +}); + +Object.assign(ActionDialog.components, {ExpandButton}); +SelectCreateDialog.components = Object.assign(SelectCreateDialog.components || {}, { + ExpandButton, +}); +Dialog.components = Object.assign(Dialog.components || {}, {ExpandButton}); +// Patch annoying validation method +Dialog.props.size.validate = (s) => + ["sm", "md", "lg", "xl", "dialog_full_screen"].includes(s); diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/js/web_dialog_size.js b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/js/web_dialog_size.js new file mode 100644 index 0000000..0afabcc --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/js/web_dialog_size.js @@ -0,0 +1,50 @@ +odoo.define("web_dialog_size.web_dialog_size", function (require) { + "use strict"; + + var rpc = require("web.rpc"); + var Dialog = require("web.Dialog"); + + var config = rpc.query({ + model: "ir.config_parameter", + method: "get_web_dialog_size_config", + }); + + Dialog.include({ + willStart: function () { + var self = this; + return this._super.apply(this, arguments).then(function () { + self.$modal + .find(".dialog_button_extend") + .on("click", self.proxy("_extending")); + self.$modal + .find(".dialog_button_restore") + .on("click", self.proxy("_restore")); + self.$modal.find(">:first-child").draggable({ + handle: ".modal-header", + helper: false, + }); + return config.then(function (r) { + if (r.default_maximize) { + self._extending(); + } else { + self._restore(); + } + }); + }); + }, + + _extending: function () { + var dialog = this.$modal.find(".modal-dialog"); + dialog.addClass("modal-dialog_full_screen"); + dialog.find(".dialog_button_extend").hide(); + dialog.find(".dialog_button_restore").show(); + }, + + _restore: function () { + var dialog = this.$modal.find(".modal-dialog"); + dialog.removeClass("modal-dialog_full_screen"); + dialog.find(".dialog_button_restore").hide(); + dialog.find(".dialog_button_extend").show(); + }, + }); +}); diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/scss/web_dialog_size.scss b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/scss/web_dialog_size.scss new file mode 100644 index 0000000..44e2066 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/scss/web_dialog_size.scss @@ -0,0 +1,16 @@ +.modal { + .modal-dialog_full_screen { + @include media-breakpoint-up(sm) { + max-width: 100%; + width: calc(100% - 50px); + } + } + + .dialog_button_restore, + .dialog_button_extend { + margin-left: auto; + + .btn-close { + margin: -8px -8px -8px 0px; + } + } +} diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/xml/DialogDraggable.xml b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/xml/DialogDraggable.xml new file mode 100644 index 0000000..bc30ace --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/xml/DialogDraggable.xml @@ -0,0 +1,8 @@ + + + +
+ +
+
+
diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/xml/ExpandButton.xml b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/xml/ExpandButton.xml new file mode 100644 index 0000000..9544445 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/xml/ExpandButton.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/xml/web_dialog_size.xml b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/xml/web_dialog_size.xml new file mode 100644 index 0000000..e160bed --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/static/src/xml/web_dialog_size.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + props.size + + + + diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/tests/__init__.py b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/tests/__init__.py new file mode 100644 index 0000000..79d0263 --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/tests/__init__.py @@ -0,0 +1 @@ +from . import test_web_dialog_size diff --git a/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/tests/test_web_dialog_size.py b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/tests/test_web_dialog_size.py new file mode 100644 index 0000000..53e916d --- /dev/null +++ b/odoo-bringout-oca-web-web_dialog_size/web_dialog_size/tests/test_web_dialog_size.py @@ -0,0 +1,20 @@ +# Copyright 2018 Tecnativa - Ernesto Tejeda +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0 + +from odoo.tests.common import TransactionCase + + +class TestWebDialogSize(TransactionCase): + def setUp(self): + super(TestWebDialogSize, self).setUp() + + def test_get_web_dialog_size_config(self): + obj = self.env["ir.config_parameter"] + + self.assertFalse(obj.get_web_dialog_size_config()["default_maximize"]) + + obj.set_param("web_dialog_size.default_maximize", "True") + self.assertTrue(obj.get_web_dialog_size_config()["default_maximize"]) + + obj.set_param("web_dialog_size.default_maximize", "False") + self.assertFalse(obj.get_web_dialog_size_config()["default_maximize"]) diff --git a/odoo-bringout-oca-web-web_disable_export_group/README.md b/odoo-bringout-oca-web-web_disable_export_group/README.md new file mode 100644 index 0000000..cec7061 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/README.md @@ -0,0 +1,46 @@ +# Web Disable Export Group + +Odoo addon: web_disable_export_group + +## Installation + +```bash +pip install odoo-bringout-oca-web-web_disable_export_group +``` + +## Dependencies + +This addon depends on: +- web + +## Manifest Information + +- **Name**: Web Disable Export Group +- **Version**: 16.0.1.0.0 +- **Category**: Web +- **License**: AGPL-3 +- **Installable**: True + +## Source + +Based on [OCA/web](https://github.com/OCA/web) branch 16.0, addon `web_disable_export_group`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Reports: doc/REPORTS.md +- Security: doc/SECURITY.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-web-web_disable_export_group/doc/ARCHITECTURE.md b/odoo-bringout-oca-web-web_disable_export_group/doc/ARCHITECTURE.md new file mode 100644 index 0000000..33851f9 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Web_disable_export_group Module - web_disable_export_group + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-web-web_disable_export_group/doc/CONFIGURATION.md b/odoo-bringout-oca-web-web_disable_export_group/doc/CONFIGURATION.md new file mode 100644 index 0000000..88f92e1 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for web_disable_export_group. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-web-web_disable_export_group/doc/CONTROLLERS.md b/odoo-bringout-oca-web-web_disable_export_group/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-web-web_disable_export_group/doc/DEPENDENCIES.md b/odoo-bringout-oca-web-web_disable_export_group/doc/DEPENDENCIES.md new file mode 100644 index 0000000..b3b749a --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/doc/DEPENDENCIES.md @@ -0,0 +1,5 @@ +# Dependencies + +This addon depends on: + +- [web](https://github.com/bringout/oca-ocb-core/tree/b3e6fb998e53b9eb1bc9669d992017616c2bd7b3/odoo-bringout-oca-ocb-web) diff --git a/odoo-bringout-oca-web-web_disable_export_group/doc/FAQ.md b/odoo-bringout-oca-web-web_disable_export_group/doc/FAQ.md new file mode 100644 index 0000000..ef5b0d8 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon web_disable_export_group or install in UI. diff --git a/odoo-bringout-oca-web-web_disable_export_group/doc/INSTALL.md b/odoo-bringout-oca-web-web_disable_export_group/doc/INSTALL.md new file mode 100644 index 0000000..7fa703c --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-web-web_disable_export_group" +# or +uv pip install odoo-bringout-oca-web-web_disable_export_group" +``` diff --git a/odoo-bringout-oca-web-web_disable_export_group/doc/MODELS.md b/odoo-bringout-oca-web-web_disable_export_group/doc/MODELS.md new file mode 100644 index 0000000..445aa50 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/doc/MODELS.md @@ -0,0 +1,13 @@ +# Models + +Detected core models and extensions in web_disable_export_group. + +```mermaid +classDiagram + class base + class ir_http +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-web-web_disable_export_group/doc/OVERVIEW.md b/odoo-bringout-oca-web-web_disable_export_group/doc/OVERVIEW.md new file mode 100644 index 0000000..336da28 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: web_disable_export_group. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon web_disable_export_group +- License: LGPL-3 diff --git a/odoo-bringout-oca-web-web_disable_export_group/doc/REPORTS.md b/odoo-bringout-oca-web-web_disable_export_group/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-web-web_disable_export_group/doc/SECURITY.md b/odoo-bringout-oca-web-web_disable_export_group/doc/SECURITY.md new file mode 100644 index 0000000..08c85bc --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/doc/SECURITY.md @@ -0,0 +1,42 @@ +# Security + +Access control and security definitions in web_disable_export_group. + +## Access Control Lists (ACLs) + +Model access permissions defined in: +- **[ir.model.access.csv](../web_disable_export_group/security/ir.model.access.csv)** + - 1 model access rules + +## Record Rules + +Row-level security rules defined in: + +## Security Groups & Configuration + +Security groups and permissions defined in: +- **[groups.xml](../web_disable_export_group/security/groups.xml)** + - 2 security groups defined + +```mermaid +graph TB + subgraph "Security Layers" + A[Users] --> B[Groups] + B --> C[Access Control Lists] + C --> D[Models] + B --> E[Record Rules] + E --> F[Individual Records] + end +``` + +Security files overview: +- **[groups.xml](../web_disable_export_group/security/groups.xml)** + - Security groups, categories, and XML-based rules +- **[ir.model.access.csv](../web_disable_export_group/security/ir.model.access.csv)** + - Model access permissions (CRUD rights) + +Notes +- Access Control Lists define which groups can access which models +- Record Rules provide row-level security (filter records by user/group) +- Security groups organize users and define permission sets +- All security is enforced at the ORM level by Odoo diff --git a/odoo-bringout-oca-web-web_disable_export_group/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-web-web_disable_export_group/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-web-web_disable_export_group/doc/USAGE.md b/odoo-bringout-oca-web-web_disable_export_group/doc/USAGE.md new file mode 100644 index 0000000..1b9b515 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon web_disable_export_group +``` diff --git a/odoo-bringout-oca-web-web_disable_export_group/doc/WIZARDS.md b/odoo-bringout-oca-web-web_disable_export_group/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-web-web_disable_export_group/pyproject.toml b/odoo-bringout-oca-web-web_disable_export_group/pyproject.toml new file mode 100644 index 0000000..b698773 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/pyproject.toml @@ -0,0 +1,42 @@ +[project] +name = "odoo-bringout-oca-web-web_disable_export_group" +version = "16.0.0" +description = "Web Disable Export Group - Odoo addon" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-ocb-web>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["web_disable_export_group"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/README.rst b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/README.rst new file mode 100644 index 0000000..3a562de --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/README.rst @@ -0,0 +1,107 @@ +======================== +Web Disable Export Group +======================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:53eeef451e7dbe8a9904efe9a17051a08f19242c695fd057ea6cde108866f101 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_disable_export_group + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_disable_export_group + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +The standard grants/prevents access to any UI export via *Access to export feature* +group. + +This module adds a new group for the 'Direct Export (xlsx)' feature, leaving the +standard one for only the 'Export All' feature. + +Admin users can always use the export option. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Enable the group *Direct Export* to the users who are allowed to make use of the option +'Export xlsx' from the list view. + +Usage +===== + +- Users in the *Access to export feature* group or admins can export in any way. +- Users in the *Direct Export (xlsx)* group can only use the default export feature + from the list view. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Onestein +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* `Onestein `_: + + * Dennis Sluijk + * Andrea Stirpe + +* `Tecnativa `_: + + * David Vidal + * João Marques + * Alexandre Díaz + * Víctor Martínez + * David Vidal + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/__init__.py b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/__manifest__.py b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/__manifest__.py new file mode 100644 index 0000000..f086e83 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2016 Onestein () +# Copyright 2018 Tecnativa - David Vidal +# Copyright 2018 Tecnativa - João Marques +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + "name": "Web Disable Export Group", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "author": "Onestein, Tecnativa, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "category": "Web", + "depends": ["web"], + "data": [ + "security/groups.xml", + "security/ir.model.access.csv", + ], + "installable": True, + "assets": { + "web.assets_backend": [ + "/web_disable_export_group/static/src/**/*", + ], + "web.assets_tests": ["/web_disable_export_group/static/tests/*.js"], + }, +} diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/bs.po b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/bs.po new file mode 100644 index 0000000..64a0896 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/bs.po @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_disable_export_group +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_base +msgid "Base" +msgstr "Osnova" + +#. module: web_disable_export_group +#: model:res.groups,name:web_disable_export_group.group_export_xlsx_data +msgid "Direct Export (xlsx)" +msgstr "Direktni Izvoz (xlsx)" + +#. module: web_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_ir_http +msgid "HTTP Routing" +msgstr "HTTP usmjeravanje" diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/es.po b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/es.po new file mode 100644 index 0000000..0ccd2db --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/es.po @@ -0,0 +1,43 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_disable_export_group +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-19 19:33+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\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 4.17\n" + +#. module: web_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_base +msgid "Base" +msgstr "Base" + +#. module: web_disable_export_group +#: model:res.groups,name:web_disable_export_group.group_export_xlsx_data +msgid "Direct Export (xlsx)" +msgstr "Exportación directa (xlsx)" + +#. module: web_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_ir_http +msgid "HTTP Routing" +msgstr "Ruta HTTP" + +#, python-format +#~ msgid "widget.is_action_enabled('export_xlsx') and widget.isExportXlsEnable" +#~ msgstr "widget.is_action_enabled('export_xlsx') y widget.isExportXlsEnable" + +#, python-format +#~ msgid "Export" +#~ msgstr "Exportar" + +#~ msgid "Export Data" +#~ msgstr "Exportar datos" diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/hr.po b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/hr.po new file mode 100644 index 0000000..adfd1c4 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/hr.po @@ -0,0 +1,47 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_disable_export_group +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-12-02 16:35+0000\n" +"Last-Translator: Bole \n" +"Language-Team: none\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.9.1\n" + +#. module: web_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_base +msgid "Base" +msgstr "" + +#. module: web_disable_export_group +#: model:res.groups,name:web_disable_export_group.group_export_xlsx_data +msgid "Direct Export (xlsx)" +msgstr "" + +#. module: web_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_ir_http +msgid "HTTP Routing" +msgstr "HTTP usmjeravanje" + +#. module: web_disable_export_group +#. openerp-web +#: code:addons/web_disable_export_group/static/src/xml/export_xls_views.xml:0 +#, python-format +msgid "widget.is_action_enabled('export_xlsx') and widget.isExportXlsEnable" +msgstr "" + +#, python-format +#~ msgid "Export" +#~ msgstr "Izvoz" + +#~ msgid "Export Data" +#~ msgstr "Izvoz podataka" diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/it.po b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/it.po new file mode 100644 index 0000000..abae925 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/it.po @@ -0,0 +1,32 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_disable_export_group +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-03-05 14:40+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: web_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_base +msgid "Base" +msgstr "Base" + +#. module: web_disable_export_group +#: model:res.groups,name:web_disable_export_group.group_export_xlsx_data +msgid "Direct Export (xlsx)" +msgstr "Esportazione diretta (xlsx)" + +#. module: web_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_ir_http +msgid "HTTP Routing" +msgstr "Instradamento HTTP" diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/pt.po b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/pt.po new file mode 100644 index 0000000..5011adc --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/pt.po @@ -0,0 +1,46 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_disable_export_group +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-10-16 12:08+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.10\n" + +#. module: web_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_base +msgid "Base" +msgstr "" + +#. module: web_disable_export_group +#: model:res.groups,name:web_disable_export_group.group_export_xlsx_data +msgid "Direct Export (xlsx)" +msgstr "" + +#. module: web_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_ir_http +msgid "HTTP Routing" +msgstr "Encaminhamento HTTP" + +#. module: web_disable_export_group +#. openerp-web +#: code:addons/web_disable_export_group/static/src/xml/export_xls_views.xml:0 +#, python-format +msgid "widget.is_action_enabled('export_xlsx') and widget.isExportXlsEnable" +msgstr "" + +#, python-format +#~ msgid "Export" +#~ msgstr "Exportar" + +#~ msgid "Export Data" +#~ msgstr "Exportar Dados" diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/web_disable_export_group.pot b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/web_disable_export_group.pot new file mode 100644 index 0000000..cb0bde9 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/web_disable_export_group.pot @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_disable_export_group +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_base +msgid "Base" +msgstr "" + +#. module: web_disable_export_group +#: model:res.groups,name:web_disable_export_group.group_export_xlsx_data +msgid "Direct Export (xlsx)" +msgstr "" + +#. module: web_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_ir_http +msgid "HTTP Routing" +msgstr "" diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/zh_CN.po b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/zh_CN.po new file mode 100644 index 0000000..52029f5 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/i18n/zh_CN.po @@ -0,0 +1,46 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_disable_export_group +# +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_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_base +msgid "Base" +msgstr "" + +#. module: web_disable_export_group +#: model:res.groups,name:web_disable_export_group.group_export_xlsx_data +msgid "Direct Export (xlsx)" +msgstr "" + +#. module: web_disable_export_group +#: model:ir.model,name:web_disable_export_group.model_ir_http +msgid "HTTP Routing" +msgstr "HTTP路由" + +#. module: web_disable_export_group +#. openerp-web +#: code:addons/web_disable_export_group/static/src/xml/export_xls_views.xml:0 +#, python-format +msgid "widget.is_action_enabled('export_xlsx') and widget.isExportXlsEnable" +msgstr "" + +#, python-format +#~ msgid "Export" +#~ msgstr "导出" + +#~ msgid "Export Data" +#~ msgstr "导出数据" diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/models/__init__.py b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/models/__init__.py new file mode 100644 index 0000000..ea997b3 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/models/__init__.py @@ -0,0 +1,2 @@ +from . import ir_http +from . import models diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/models/ir_http.py b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/models/ir_http.py new file mode 100644 index 0000000..562ff40 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/models/ir_http.py @@ -0,0 +1,20 @@ +# Copyright 2018 Tecnativa - David Vidal +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import models +from odoo.http import request + + +class Http(models.AbstractModel): + _inherit = "ir.http" + + def session_info(self): + res = super().session_info() + user = request.env.user + res.update( + { + "group_xlsx_export_data": user + and user.has_group("web_disable_export_group.group_export_xlsx_data"), + } + ) + return res diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/models/models.py b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/models/models.py new file mode 100644 index 0000000..63a911d --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/models/models.py @@ -0,0 +1,23 @@ +# Copyright 2023 Tecnativa - David Vidal +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). +from odoo import models + + +class Base(models.AbstractModel): + _inherit = "base" + + def export_data(self, fields_to_export): + """Export fields for selected objects + + :param fields_to_export: list of fields + :param raw_data: True to return value in native Python type + :rtype: dictionary with a *datas* matrix + + This method is used when exporting data via client menu + """ + if self.env.user.has_group("web_disable_export_group.group_export_xlsx_data"): + fields_to_export = [ + models.fix_import_export_id_paths(f) for f in fields_to_export + ] + return {"datas": self._export_rows(fields_to_export)} + return super().export_data(fields_to_export) diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/CONFIGURE.rst b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/CONFIGURE.rst new file mode 100644 index 0000000..e1c825c --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/CONFIGURE.rst @@ -0,0 +1,2 @@ +Enable the group *Direct Export* to the users who are allowed to make use of the option +'Export xlsx' from the list view. diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..fa58464 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/CONTRIBUTORS.rst @@ -0,0 +1,12 @@ +* `Onestein `_: + + * Dennis Sluijk + * Andrea Stirpe + +* `Tecnativa `_: + + * David Vidal + * João Marques + * Alexandre Díaz + * Víctor Martínez + * David Vidal diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/DESCRIPTION.rst b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/DESCRIPTION.rst new file mode 100644 index 0000000..8e9916e --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/DESCRIPTION.rst @@ -0,0 +1,7 @@ +The standard grants/prevents access to any UI export via *Access to export feature* +group. + +This module adds a new group for the 'Direct Export (xlsx)' feature, leaving the +standard one for only the 'Export All' feature. + +Admin users can always use the export option. diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/USAGE.rst b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/USAGE.rst new file mode 100644 index 0000000..e35c9bd --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/readme/USAGE.rst @@ -0,0 +1,3 @@ +- Users in the *Access to export feature* group or admins can export in any way. +- Users in the *Direct Export (xlsx)* group can only use the default export feature + from the list view. diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/security/groups.xml b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/security/groups.xml new file mode 100644 index 0000000..cdcf4e0 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/security/groups.xml @@ -0,0 +1,19 @@ + + + + + Direct Export (xlsx) + + + + + + + diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/security/ir.model.access.csv b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/security/ir.model.access.csv new file mode 100644 index 0000000..589bcc4 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/security/ir.model.access.csv @@ -0,0 +1,2 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"access_ir_exports_group_xls","ir_exports group_xls","base.model_ir_exports","web_disable_export_group.group_export_xlsx_data",1,0,0,0 diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/description/icon.png b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 Q3=9kmp00i_>zopr09!l7U;qFB literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/description/index.html b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/description/index.html new file mode 100644 index 0000000..349bcf0 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/description/index.html @@ -0,0 +1,453 @@ + + + + + + +Web Disable Export Group + + + +
+

Web Disable Export Group

+ + +

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

+

The standard grants/prevents access to any UI export via Access to export feature +group.

+

This module adds a new group for the ‘Direct Export (xlsx)’ feature, leaving the +standard one for only the ‘Export All’ feature.

+

Admin users can always use the export option.

+

Table of contents

+ +
+

Configuration

+

Enable the group Direct Export to the users who are allowed to make use of the option +‘Export xlsx’ from the list view.

+
+
+

Usage

+
    +
  • Users in the Access to export feature group or admins can export in any way.
  • +
  • Users in the Direct Export (xlsx) group can only use the default export feature +from the list view.
  • +
+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Onestein
  • +
  • Tecnativa
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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

+

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

+

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

+
+
+
+ + diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/src/js/abstract_controller.esm.js b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/src/js/abstract_controller.esm.js new file mode 100644 index 0000000..8576a18 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/src/js/abstract_controller.esm.js @@ -0,0 +1,26 @@ +/** @odoo-module **/ +/* Copyright 2016 Onestein + Copyright 2018 Tecnativa - David Vidal + Copyright 2021 Tecnativa - Alexandre Díaz + Copyright 2022 Tecnativa - Víctor Martínez + License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). */ +import AbstractController from "web.AbstractController"; +import session from "web.session"; + +AbstractController.include({ + /** + * @override + */ + is_action_enabled: function (action) { + if ( + !session.is_superuser && + action && + action === "export_xlsx" && + !session.group_xlsx_export_data + ) { + return false; + } + + return this._super.apply(this, arguments); + }, +}); diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/src/js/list_controller.esm.js b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/src/js/list_controller.esm.js new file mode 100644 index 0000000..8e99b91 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/src/js/list_controller.esm.js @@ -0,0 +1,20 @@ +/** @odoo-module **/ +/* Copyright 2018 Tecnativa - David Vidal + License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). */ +import {ListController} from "@web/views/list/list_controller"; +import {onWillStart} from "@odoo/owl"; +import {patch} from "@web/core/utils/patch"; + +patch(ListController.prototype, "disable_export_group", { + setup() { + this._super(...arguments); + onWillStart(async () => { + this.isExportEnable = await this.userService.hasGroup( + "base.group_allow_export" + ); + this.isExportXlsEnable = await this.userService.hasGroup( + "web_disable_export_group.group_export_xlsx_data" + ); + }); + }, +}); diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/src/xml/export_xls_views.xml b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/src/xml/export_xls_views.xml new file mode 100644 index 0000000..236efcb --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/src/xml/export_xls_views.xml @@ -0,0 +1,17 @@ + + + + + + nbTotal and !nbSelected and activeActions.exportXlsx and isExportXlsEnable and !env.isSmall + + + + diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/tests/web_disable_export_group_tour.esm.js b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/tests/web_disable_export_group_tour.esm.js new file mode 100644 index 0000000..1702df8 --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/static/tests/web_disable_export_group_tour.esm.js @@ -0,0 +1,33 @@ +/** @odoo-module **/ +/* Copyright 2020 Tecnativa - João Marques + Copyright 2022 Tecnativa - Víctor Martínez + License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). */ + +import tour from "web_tour.tour"; + +tour.register( + "export_tour_xlsx_button_ok", + { + test: true, + url: "/web#model=ir.ui.view&view_type=list&cids=&action=base.action_ui_view", + }, + [ + { + content: "Check if 'Export all' button exists", + trigger: ".o_list_buttons:has(.o_list_export_xlsx)", + }, + ] +); +tour.register( + "export_tour_xlsx_button_ko", + { + test: true, + url: "/web#model=ir.ui.view&view_type=list&cids=&action=base.action_ui_view", + }, + [ + { + content: "Check if 'Export all' button exists", + trigger: ".o_list_buttons:not(:has(.o_list_export_xlsx))", + }, + ] +); diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/tests/__init__.py b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/tests/__init__.py new file mode 100644 index 0000000..f49429e --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/tests/__init__.py @@ -0,0 +1 @@ +from . import test_tour diff --git a/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/tests/test_tour.py b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/tests/test_tour.py new file mode 100644 index 0000000..854eb9b --- /dev/null +++ b/odoo-bringout-oca-web-web_disable_export_group/web_disable_export_group/tests/test_tour.py @@ -0,0 +1,35 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +# Copyright 2020 Tecnativa - João Marques +# Copyright 2022 Tecnativa - Víctor Martínez +import odoo.tests +from odoo.tests import new_test_user + + +@odoo.tests.tagged("post_install", "-at_install") +class TestTour(odoo.tests.HttpCase): + def setUp(self): + super().setUp() + new_test_user( + self.env, + login="user_not_export", + password="user_not_export", + groups="base.group_user,base.group_system", + ) + new_test_user( + self.env, + login="user_export_xlsx", + password="user_export_xlsx", + groups=( + "base.group_user,base.group_system," + "web_disable_export_group.group_export_xlsx_data" + ), + ) + + def test_admin(self): + self.start_tour("/web", "export_tour_xlsx_button_ok", login="admin") + + def test_user_not_export(self): + self.start_tour("/web", "export_tour_xlsx_button_ko", login="user_not_export") + + def test_user_export_xlsx(self): + self.start_tour("/web", "export_tour_xlsx_button_ok", login="user_export_xlsx") diff --git a/odoo-bringout-oca-web-web_domain_field/README.md b/odoo-bringout-oca-web-web_domain_field/README.md new file mode 100644 index 0000000..53fa637 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/README.md @@ -0,0 +1,46 @@ +# Web Domain Field + +Odoo addon: web_domain_field + +## Installation + +```bash +pip install odoo-bringout-oca-web-web_domain_field +``` + +## Dependencies + +This addon depends on: +- web + +## Manifest Information + +- **Name**: Web Domain Field +- **Version**: 16.0.1.0.1 +- **Category**: N/A +- **License**: AGPL-3 +- **Installable**: True + +## Source + +Based on [OCA/web](https://github.com/OCA/web) branch 16.0, addon `web_domain_field`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Reports: doc/REPORTS.md +- Security: doc/SECURITY.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-web-web_domain_field/doc/ARCHITECTURE.md b/odoo-bringout-oca-web-web_domain_field/doc/ARCHITECTURE.md new file mode 100644 index 0000000..41faa34 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Web_domain_field Module - web_domain_field + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-web-web_domain_field/doc/CONFIGURATION.md b/odoo-bringout-oca-web-web_domain_field/doc/CONFIGURATION.md new file mode 100644 index 0000000..918ccf3 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for web_domain_field. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-web-web_domain_field/doc/CONTROLLERS.md b/odoo-bringout-oca-web-web_domain_field/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-web-web_domain_field/doc/DEPENDENCIES.md b/odoo-bringout-oca-web-web_domain_field/doc/DEPENDENCIES.md new file mode 100644 index 0000000..b3b749a --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/doc/DEPENDENCIES.md @@ -0,0 +1,5 @@ +# Dependencies + +This addon depends on: + +- [web](https://github.com/bringout/oca-ocb-core/tree/b3e6fb998e53b9eb1bc9669d992017616c2bd7b3/odoo-bringout-oca-ocb-web) diff --git a/odoo-bringout-oca-web-web_domain_field/doc/FAQ.md b/odoo-bringout-oca-web-web_domain_field/doc/FAQ.md new file mode 100644 index 0000000..7e6b38d --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon web_domain_field or install in UI. diff --git a/odoo-bringout-oca-web-web_domain_field/doc/INSTALL.md b/odoo-bringout-oca-web-web_domain_field/doc/INSTALL.md new file mode 100644 index 0000000..7676b3a --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-web-web_domain_field" +# or +uv pip install odoo-bringout-oca-web-web_domain_field" +``` diff --git a/odoo-bringout-oca-web-web_domain_field/doc/MODELS.md b/odoo-bringout-oca-web-web_domain_field/doc/MODELS.md new file mode 100644 index 0000000..820e140 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/doc/MODELS.md @@ -0,0 +1,11 @@ +# Models + +Detected core models and extensions in web_domain_field. + +```mermaid +classDiagram +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-web-web_domain_field/doc/OVERVIEW.md b/odoo-bringout-oca-web-web_domain_field/doc/OVERVIEW.md new file mode 100644 index 0000000..a0d3fde --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: web_domain_field. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon web_domain_field +- License: LGPL-3 diff --git a/odoo-bringout-oca-web-web_domain_field/doc/REPORTS.md b/odoo-bringout-oca-web-web_domain_field/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-web-web_domain_field/doc/SECURITY.md b/odoo-bringout-oca-web-web_domain_field/doc/SECURITY.md new file mode 100644 index 0000000..e07da9d --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/doc/SECURITY.md @@ -0,0 +1,8 @@ +# Security + +This module does not define custom security rules or access controls beyond Odoo defaults. + +Default Odoo security applies: +- Base user access through standard groups +- Model access inherited from dependencies +- No custom row-level security rules diff --git a/odoo-bringout-oca-web-web_domain_field/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-web-web_domain_field/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-web-web_domain_field/doc/USAGE.md b/odoo-bringout-oca-web-web_domain_field/doc/USAGE.md new file mode 100644 index 0000000..cc3db5f --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon web_domain_field +``` diff --git a/odoo-bringout-oca-web-web_domain_field/doc/WIZARDS.md b/odoo-bringout-oca-web-web_domain_field/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-web-web_domain_field/pyproject.toml b/odoo-bringout-oca-web-web_domain_field/pyproject.toml new file mode 100644 index 0000000..649ab5f --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/pyproject.toml @@ -0,0 +1,43 @@ +[project] +name = "odoo-bringout-oca-web-web_domain_field" +version = "16.0.0" +description = "Web Domain Field - + Use computed field as domain" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-ocb-web>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["web_domain_field"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-web-web_domain_field/web_domain_field/README.rst b/odoo-bringout-oca-web-web_domain_field/web_domain_field/README.rst new file mode 100644 index 0000000..5ad21b8 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/web_domain_field/README.rst @@ -0,0 +1,157 @@ +================ +Web Domain Field +================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:38caddd3efd0bf3c90c5b3a84068ef6e757e1bb72698ee16451a62c210e7a154 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_domain_field + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_domain_field + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +.. warning:: + This module is deprecated. + If you want to use this functionality you can assign a unserialised + domain to a fields.Binary, `example `_ + +This technical addon allows developers to specify a field domain in a view +using the value of another field in that view, rather than as a static +XML attribute. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +When you define a view you can specify on the relational fields a domain +attribute. This attribute is evaluated as filter to apply when displaying +existing records for selection. + +.. code-block:: xml + + + +The value provided for the domain attribute must be a string representing a +valid Odoo domain. This string is evaluated on the client side in a +restricted context where we can reference as right operand the values of +fields present into the form and a limited set of functions. + +In this context it's hard to build complex domain and we are facing to some +limitations as: + + * The syntax to include in your domain a criteria involving values from a + x2many field is complex. + * The right side of domain in case of x2many can involve huge amount of ids + (performance problem). + * Domains computed by an onchange on an other field are not recomputed when + you modify the form and don't modify the field triggering the onchange. + * It's not possible to extend an existing domain. You must completely redefine + the domain in your specialized addon + * etc... + +In order to mitigate these limitations this new addon allows you to use the +value of a field as domain of an other field in the xml definition of your +view. + +.. code-block:: xml + + + + +The field used as domain must provide the domain as a JSON encoded string. + +.. code-block:: python + + product_id_domain = fields.Char( + compute="_compute_product_id_domain", + readonly=True, + store=False, + ) + + @api.depends('name') + def _compute_product_id_domain(self): + for rec in self: + rec.product_id_domain = json.dumps( + [('type', '=', 'product'), ('name', 'like', rec.name)] + ) + +.. note:: + You do not actually need this module to craft a dynamic domain. Odoo comes + with its own `py.js `_ + web library to parse expressions such as domains. `py.js` supports more + complex expressions than just static lists. + + Here is an example of a conditional domain based on the value of another + field: + + .. code-block:: python + + (order_id or partner_id) and [('id', 'in', allowed_picking_ids)] + or [('state', '=', 'done'), ('picking_type_id.code', '=', 'outgoing')] + + For OCA modules, this method is preferred over adding this module as an + additional dependency. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* ACSONE SA/NV + +Contributors +~~~~~~~~~~~~ + +* Laurent Mignon +* Denis Roussel +* 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/odoo-bringout-oca-web-web_domain_field/web_domain_field/__init__.py b/odoo-bringout-oca-web-web_domain_field/web_domain_field/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/odoo-bringout-oca-web-web_domain_field/web_domain_field/__manifest__.py b/odoo-bringout-oca-web-web_domain_field/web_domain_field/__manifest__.py new file mode 100644 index 0000000..9d0c346 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/web_domain_field/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2017 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Web Domain Field", + "summary": """ + Use computed field as domain""", + "version": "16.0.1.0.1", + "license": "AGPL-3", + "author": "ACSONE SA/NV,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "depends": ["web"], + "data": [], + "assets": { + "web.assets_backend": [ + "/web_domain_field/static/lib/js/*.js", + ], + "web.qunit_suite_tests": [ + "/web_domain_field/static/tests/**/*.js", + ], + }, + "installable": True, +} diff --git a/odoo-bringout-oca-web-web_domain_field/web_domain_field/i18n/it.po b/odoo-bringout-oca-web-web_domain_field/web_domain_field/i18n/it.po new file mode 100644 index 0000000..7338855 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/web_domain_field/i18n/it.po @@ -0,0 +1,14 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" diff --git a/odoo-bringout-oca-web-web_domain_field/web_domain_field/i18n/web_domain_field.pot b/odoo-bringout-oca-web-web_domain_field/web_domain_field/i18n/web_domain_field.pot new file mode 100644 index 0000000..78d58d5 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/web_domain_field/i18n/web_domain_field.pot @@ -0,0 +1,13 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" diff --git a/odoo-bringout-oca-web-web_domain_field/web_domain_field/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-web-web_domain_field/web_domain_field/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..1294ec2 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/web_domain_field/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* Laurent Mignon +* Denis Roussel +* Raf Ven diff --git a/odoo-bringout-oca-web-web_domain_field/web_domain_field/readme/DESCRIPTION.rst b/odoo-bringout-oca-web-web_domain_field/web_domain_field/readme/DESCRIPTION.rst new file mode 100644 index 0000000..830f5b5 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/web_domain_field/readme/DESCRIPTION.rst @@ -0,0 +1,8 @@ +.. warning:: + This module is deprecated. + If you want to use this functionality you can assign a unserialised + domain to a fields.Binary, `example `_ + +This technical addon allows developers to specify a field domain in a view +using the value of another field in that view, rather than as a static +XML attribute. diff --git a/odoo-bringout-oca-web-web_domain_field/web_domain_field/readme/USAGE.rst b/odoo-bringout-oca-web-web_domain_field/web_domain_field/readme/USAGE.rst new file mode 100644 index 0000000..e32b3b7 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/web_domain_field/readme/USAGE.rst @@ -0,0 +1,68 @@ +When you define a view you can specify on the relational fields a domain +attribute. This attribute is evaluated as filter to apply when displaying +existing records for selection. + +.. code-block:: xml + + + +The value provided for the domain attribute must be a string representing a +valid Odoo domain. This string is evaluated on the client side in a +restricted context where we can reference as right operand the values of +fields present into the form and a limited set of functions. + +In this context it's hard to build complex domain and we are facing to some +limitations as: + + * The syntax to include in your domain a criteria involving values from a + x2many field is complex. + * The right side of domain in case of x2many can involve huge amount of ids + (performance problem). + * Domains computed by an onchange on an other field are not recomputed when + you modify the form and don't modify the field triggering the onchange. + * It's not possible to extend an existing domain. You must completely redefine + the domain in your specialized addon + * etc... + +In order to mitigate these limitations this new addon allows you to use the +value of a field as domain of an other field in the xml definition of your +view. + +.. code-block:: xml + + + + +The field used as domain must provide the domain as a JSON encoded string. + +.. code-block:: python + + product_id_domain = fields.Char( + compute="_compute_product_id_domain", + readonly=True, + store=False, + ) + + @api.depends('name') + def _compute_product_id_domain(self): + for rec in self: + rec.product_id_domain = json.dumps( + [('type', '=', 'product'), ('name', 'like', rec.name)] + ) + +.. note:: + You do not actually need this module to craft a dynamic domain. Odoo comes + with its own `py.js `_ + web library to parse expressions such as domains. `py.js` supports more + complex expressions than just static lists. + + Here is an example of a conditional domain based on the value of another + field: + + .. code-block:: python + + (order_id or partner_id) and [('id', 'in', allowed_picking_ids)] + or [('state', '=', 'done'), ('picking_type_id.code', '=', 'outgoing')] + + For OCA modules, this method is preferred over adding this module as an + additional dependency. diff --git a/odoo-bringout-oca-web-web_domain_field/web_domain_field/static/description/icon.png b/odoo-bringout-oca-web-web_domain_field/web_domain_field/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 Q3=9kmp00i_>zopr09!l7U;qFB literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_domain_field/web_domain_field/static/description/index.html b/odoo-bringout-oca-web-web_domain_field/web_domain_field/static/description/index.html new file mode 100644 index 0000000..7d766b3 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/web_domain_field/static/description/index.html @@ -0,0 +1,497 @@ + + + + + + +Web Domain Field + + + +
+

Web Domain Field

+ + +

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

+
+

Warning

+

This module is deprecated. +If you want to use this functionality you can assign a unserialised +domain to a fields.Binary, example

+
+

This technical addon allows developers to specify a field domain in a view +using the value of another field in that view, rather than as a static +XML attribute.

+

Table of contents

+ +
+

Usage

+

When you define a view you can specify on the relational fields a domain +attribute. This attribute is evaluated as filter to apply when displaying +existing records for selection.

+
+<field name="product_id" domain="[('type','=','product')]"/>
+
+

The value provided for the domain attribute must be a string representing a +valid Odoo domain. This string is evaluated on the client side in a +restricted context where we can reference as right operand the values of +fields present into the form and a limited set of functions.

+

In this context it’s hard to build complex domain and we are facing to some +limitations as:

+
+
    +
  • The syntax to include in your domain a criteria involving values from a +x2many field is complex.
  • +
  • The right side of domain in case of x2many can involve huge amount of ids +(performance problem).
  • +
  • Domains computed by an onchange on an other field are not recomputed when +you modify the form and don’t modify the field triggering the onchange.
  • +
  • It’s not possible to extend an existing domain. You must completely redefine +the domain in your specialized addon
  • +
  • etc…
  • +
+
+

In order to mitigate these limitations this new addon allows you to use the +value of a field as domain of an other field in the xml definition of your +view.

+
+<field name="product_id_domain" invisible="1"/>
+<field name="product_id" domain="product_id_domain"/>
+
+

The field used as domain must provide the domain as a JSON encoded string.

+
+product_id_domain = fields.Char(
+    compute="_compute_product_id_domain",
+    readonly=True,
+    store=False,
+)
+
+@api.depends('name')
+def _compute_product_id_domain(self):
+    for rec in self:
+        rec.product_id_domain = json.dumps(
+            [('type', '=', 'product'), ('name', 'like', rec.name)]
+        )
+
+
+

Note

+

You do not actually need this module to craft a dynamic domain. Odoo comes +with its own py.js +web library to parse expressions such as domains. py.js supports more +complex expressions than just static lists.

+

Here is an example of a conditional domain based on the value of another +field:

+
+(order_id or partner_id) and [('id', 'in', allowed_picking_ids)]
+or [('state', '=', 'done'), ('picking_type_id.code', '=', 'outgoing')]
+
+

For OCA modules, this method is preferred over adding this module as an +additional dependency.

+
+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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

+

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

+

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

+
+
+
+ + diff --git a/odoo-bringout-oca-web-web_domain_field/web_domain_field/static/tests/test_qunit.js b/odoo-bringout-oca-web-web_domain_field/web_domain_field/static/tests/test_qunit.js new file mode 100644 index 0000000..27a9fdf --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/web_domain_field/static/tests/test_qunit.js @@ -0,0 +1,129 @@ +odoo.define("web_domain_field.tests", function (require) { + "use strict"; + + const FormView = require("web.FormView"); + const testUtils = require("web.test_utils"); + const {createView} = testUtils; + const {QUnit} = window; + + QUnit.module( + "web_domain_field", + { + beforeEach: function () { + this.data = { + "res.partner": { + fields: { + name: { + string: "Name", + type: "char", + searchable: true, + }, + type: { + string: "Type", + type: "selection", + selection: [ + ["person", "Person"], + ["company", "Company"], + ], + searchable: true, + }, + parent_id: { + string: "Parent", + type: "many2one", + relation: "res.partner", + }, + parent_domain: { + string: "Parent Domain", + type: "char", + }, + }, + records: [ + { + id: 1, + name: "John Doe", + type: "person", + parent_id: 2, + parent_domain: "[]", + }, + { + id: 2, + name: "ACME inc.", + type: "company", + parent_id: false, + parent_domain: `[["type", "=", "company"]]`, + }, + ], + onchanges: {}, + }, + }; + }, + }, + function () { + QUnit.test( + "one2many: field as domain attribute value", + async function (assert) { + assert.expect(2); + + async function testPartnerFormDomain(data, resId, expectedDomain) { + const form = await createView({ + View: FormView, + model: "res.partner", + data: data, + arch: ` +
+ + + + `, + mockRPC: function (route, args) { + if (args.method === "name_search") { + assert.deepEqual(args.kwargs.args, expectedDomain); + } + return this._super.apply(this, arguments); + }, + res_id: resId, + viewOptions: {mode: "edit"}, + }); + form.$el.find(".o_field_widget[name=parent_id] input").click(); + form.destroy(); + } + + await testPartnerFormDomain(this.data, 1, []); + await testPartnerFormDomain(this.data, 2, [ + ["type", "=", "company"], + ]); + } + ); + + QUnit.test( + "one2many: field with default behaviour", + async function (assert) { + assert.expect(1); + const form = await createView({ + View: FormView, + model: "res.partner", + data: this.data, + arch: ` +
+ + + + `, + mockRPC: function (route, args) { + if (args.method === "name_search") { + assert.deepEqual(args.kwargs.args, [ + ["name", "=", "John"], + ]); + } + return this._super.apply(this, arguments); + }, + res_id: 1, + viewOptions: {mode: "edit"}, + }); + form.$el.find(".o_field_widget[name=parent_id] input").click(); + form.destroy(); + } + ); + } + ); +}); diff --git a/odoo-bringout-oca-web-web_domain_field/web_domain_field/tests/__init__.py b/odoo-bringout-oca-web-web_domain_field/web_domain_field/tests/__init__.py new file mode 100644 index 0000000..d20d305 --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/web_domain_field/tests/__init__.py @@ -0,0 +1 @@ +from . import test_qunit diff --git a/odoo-bringout-oca-web-web_domain_field/web_domain_field/tests/test_qunit.py b/odoo-bringout-oca-web-web_domain_field/web_domain_field/tests/test_qunit.py new file mode 100644 index 0000000..7e206dd --- /dev/null +++ b/odoo-bringout-oca-web-web_domain_field/web_domain_field/tests/test_qunit.py @@ -0,0 +1,16 @@ +# Copyright 2022 Camptocamp SA (https://www.camptocamp.com). +# @author Iván Todorovich +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests import HttpCase, tagged + + +@tagged("-at_install", "post_install") +class TestQunit(HttpCase): + def test_qunit(self): + self.browser_js( + "/web/tests?module=web_domain_field&failfast", + "", + "", + login="admin", + ) diff --git a/odoo-bringout-oca-web-web_editor_class_selector/README.md b/odoo-bringout-oca-web-web_editor_class_selector/README.md new file mode 100644 index 0000000..d370e48 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/README.md @@ -0,0 +1,46 @@ +# Web editor class selector + +Odoo addon: web_editor_class_selector + +## Installation + +```bash +pip install odoo-bringout-oca-web-web_editor_class_selector +``` + +## Dependencies + +This addon depends on: +- web_editor + +## Manifest Information + +- **Name**: Web editor class selector +- **Version**: 16.0.1.1.0 +- **Category**: N/A +- **License**: AGPL-3 +- **Installable**: True + +## Source + +Based on [OCA/web](https://github.com/OCA/web) branch 16.0, addon `web_editor_class_selector`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Reports: doc/REPORTS.md +- Security: doc/SECURITY.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-web-web_editor_class_selector/doc/ARCHITECTURE.md b/odoo-bringout-oca-web-web_editor_class_selector/doc/ARCHITECTURE.md new file mode 100644 index 0000000..7851349 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Web_editor_class_selector Module - web_editor_class_selector + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-web-web_editor_class_selector/doc/CONFIGURATION.md b/odoo-bringout-oca-web-web_editor_class_selector/doc/CONFIGURATION.md new file mode 100644 index 0000000..ff6610a --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for web_editor_class_selector. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-web-web_editor_class_selector/doc/CONTROLLERS.md b/odoo-bringout-oca-web-web_editor_class_selector/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-web-web_editor_class_selector/doc/DEPENDENCIES.md b/odoo-bringout-oca-web-web_editor_class_selector/doc/DEPENDENCIES.md new file mode 100644 index 0000000..d52e80a --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/doc/DEPENDENCIES.md @@ -0,0 +1,5 @@ +# Dependencies + +This addon depends on: + +- [web_editor](https://github.com/bringout/oca-ocb-web/tree/d140f04bde3a5b47e6ea0c4ecae4f3d4bcd940cb/odoo-bringout-oca-ocb-web_editor) diff --git a/odoo-bringout-oca-web-web_editor_class_selector/doc/FAQ.md b/odoo-bringout-oca-web-web_editor_class_selector/doc/FAQ.md new file mode 100644 index 0000000..85b3c2e --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon web_editor_class_selector or install in UI. diff --git a/odoo-bringout-oca-web-web_editor_class_selector/doc/INSTALL.md b/odoo-bringout-oca-web-web_editor_class_selector/doc/INSTALL.md new file mode 100644 index 0000000..63c06b9 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-web-web_editor_class_selector" +# or +uv pip install odoo-bringout-oca-web-web_editor_class_selector" +``` diff --git a/odoo-bringout-oca-web-web_editor_class_selector/doc/MODELS.md b/odoo-bringout-oca-web-web_editor_class_selector/doc/MODELS.md new file mode 100644 index 0000000..007f210 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/doc/MODELS.md @@ -0,0 +1,12 @@ +# Models + +Detected core models and extensions in web_editor_class_selector. + +```mermaid +classDiagram + class web_editor_class +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-web-web_editor_class_selector/doc/OVERVIEW.md b/odoo-bringout-oca-web-web_editor_class_selector/doc/OVERVIEW.md new file mode 100644 index 0000000..250bb61 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: web_editor_class_selector. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon web_editor_class_selector +- License: LGPL-3 diff --git a/odoo-bringout-oca-web-web_editor_class_selector/doc/REPORTS.md b/odoo-bringout-oca-web-web_editor_class_selector/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-web-web_editor_class_selector/doc/SECURITY.md b/odoo-bringout-oca-web-web_editor_class_selector/doc/SECURITY.md new file mode 100644 index 0000000..5fe5433 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/doc/SECURITY.md @@ -0,0 +1,34 @@ +# Security + +Access control and security definitions in web_editor_class_selector. + +## Access Control Lists (ACLs) + +Model access permissions defined in: +- **[ir.model.access.csv](../web_editor_class_selector/security/ir.model.access.csv)** + - 2 model access rules + +## Record Rules + +Row-level security rules defined in: + +```mermaid +graph TB + subgraph "Security Layers" + A[Users] --> B[Groups] + B --> C[Access Control Lists] + C --> D[Models] + B --> E[Record Rules] + E --> F[Individual Records] + end +``` + +Security files overview: +- **[ir.model.access.csv](../web_editor_class_selector/security/ir.model.access.csv)** + - Model access permissions (CRUD rights) + +Notes +- Access Control Lists define which groups can access which models +- Record Rules provide row-level security (filter records by user/group) +- Security groups organize users and define permission sets +- All security is enforced at the ORM level by Odoo diff --git a/odoo-bringout-oca-web-web_editor_class_selector/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-web-web_editor_class_selector/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-web-web_editor_class_selector/doc/USAGE.md b/odoo-bringout-oca-web-web_editor_class_selector/doc/USAGE.md new file mode 100644 index 0000000..4bbdfd2 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon web_editor_class_selector +``` diff --git a/odoo-bringout-oca-web-web_editor_class_selector/doc/WIZARDS.md b/odoo-bringout-oca-web-web_editor_class_selector/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-web-web_editor_class_selector/pyproject.toml b/odoo-bringout-oca-web-web_editor_class_selector/pyproject.toml new file mode 100644 index 0000000..e5424b5 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/pyproject.toml @@ -0,0 +1,42 @@ +[project] +name = "odoo-bringout-oca-web-web_editor_class_selector" +version = "16.0.0" +description = "Web editor class selector - " +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-ocb-web_editor>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["web_editor_class_selector"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/README.rst b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/README.rst new file mode 100644 index 0000000..15b00d7 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/README.rst @@ -0,0 +1,86 @@ +========================= +Web editor class selector +========================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:c6c160e786b66249a4c30d19eb0204a20ee62766b8197957e1425967cdcc72d6 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_editor_class_selector + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_editor_class_selector + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows users to create custom CSS class records, which can then be selected and applied directly in the HTML editor. +Note: The actual CSS file containing the class definitions is not provided by this module and must be loaded in a custom module. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +* Go to `Settings` > `Technical` > `User Interface` > `Web editor Class`. +* Create and name your custom CSS classes. +* Go to any model with an HTML field (e.g., `Settings` > `Users` > `Preferences` > `Signature`). +* In the HTML editor, select any content block. +* Choose from the available CSS classes to apply the desired styling. + +Known issues / Roadmap +====================== + +Add support to apply class to any element (currently, only `span` is supported) + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Tecnativa + +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/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/__init__.py b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/__manifest__.py b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/__manifest__.py new file mode 100644 index 0000000..2b37b6f --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/__manifest__.py @@ -0,0 +1,32 @@ +{ + "name": "Web editor class selector", + "version": "16.0.1.1.0", + "summary": "", + "author": "Tecnativa, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "depends": [ + "web_editor", + ], + "data": [ + "security/ir.model.access.csv", + "views/web_editor_class_views.xml", + "views/menus.xml", + ], + "demo": [ + "demo/web_editor_class_demo.xml", + ], + "assets": { + "web.assets_backend": [ + "web_editor_class_selector/static/src/js/backend/**/*", + "web_editor_class_selector/static/src/xml/**/", + ], + "web_editor.assets_wysiwyg": [ + "web_editor_class_selector/static/src/js/odoo-editor/**/*", + "web_editor_class_selector/static/src/js/wysiwyg/**/*", + "web_editor_class_selector/static/src/scss/demo_styles.scss", + ], + }, + "installable": True, + "auto_install": False, + "license": "AGPL-3", +} diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/demo/web_editor_class_demo.xml b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/demo/web_editor_class_demo.xml new file mode 100644 index 0000000..a210e93 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/demo/web_editor_class_demo.xml @@ -0,0 +1,17 @@ + + + + + Button + demo_button + + + Menu + demo_menu + + + Field + demo_field + + + diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/i18n/bs.po b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/i18n/bs.po new file mode 100644 index 0000000..ee0436b --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/i18n/bs.po @@ -0,0 +1,115 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_editor_class_selector +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__active +msgid "Active" +msgstr "Aktivan" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__class_name +msgid "Class Name" +msgstr "Naziv klase" + +#. module: web_editor_class_selector +#: model:ir.model.constraint,message:web_editor_class_selector.constraint_web_editor_class_class_name_uniq +msgid "Class name must be unique" +msgstr "Naziv klase mora biti jedinstven" + +#. module: web_editor_class_selector +#: model_terms:ir.actions.act_window,help:web_editor_class_selector.action_web_editor_class +msgid "Click here to add new Web Editor Class." +msgstr "Kliknite ovdje da dodate novu Web Editor klasu." + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__create_date +msgid "Created on" +msgstr "Kreirano" + +#. module: web_editor_class_selector +#. odoo-javascript +#: code:addons/web_editor_class_selector/static/src/js/odoo-editor/OdooEditor.esm.js:0 +#: code:addons/web_editor_class_selector/static/src/xml/web_editor.xml:0 +#: code:addons/web_editor_class_selector/static/src/xml/web_editor.xml:0 +#, python-format +msgid "Custom CSS" +msgstr "Prilagođeni CSS" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__display_name +msgid "Display Name" +msgstr "Prikazani naziv" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__id +msgid "ID" +msgstr "ID" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class____last_update +msgid "Last Modified on" +msgstr "Zadnje mijenjano" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__write_uid +msgid "Last Updated by" +msgstr "Zadnji ažurirao" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__write_date +msgid "Last Updated on" +msgstr "Zadnje ažurirano" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__name +msgid "Name" +msgstr "Naziv:" + +#. module: web_editor_class_selector +#: model_terms:ir.ui.view,arch_db:web_editor_class_selector.view_web_editor_class_form +msgid "Name..." +msgstr "Naziv..." + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__sequence +msgid "Sequence" +msgstr "Sekvenca" + +#. module: web_editor_class_selector +#: model_terms:ir.ui.view,arch_db:web_editor_class_selector.view_web_editor_class_form +msgid "Some CSS class" +msgstr "Neka CSS klasa" + +#. module: web_editor_class_selector +#: model:ir.model.fields,help:web_editor_class_selector.field_web_editor_class__class_name +msgid "" +"The class name to be added to the tag. It must be created in the CSS file." +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.actions.act_window,name:web_editor_class_selector.action_web_editor_class +#: model:ir.ui.menu,name:web_editor_class_selector.web_editor_class_menu +msgid "Web Editor Class" +msgstr "Web Editor klasa" + +#. module: web_editor_class_selector +#: model:ir.model,name:web_editor_class_selector.model_web_editor_class +msgid "Web editor class selector" +msgstr "Web editor selektor klase" diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/i18n/it.po b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/i18n/it.po new file mode 100644 index 0000000..54fd913 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/i18n/it.po @@ -0,0 +1,118 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_editor_class_selector +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-02-20 10:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__active +msgid "Active" +msgstr "Attiva" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__class_name +msgid "Class Name" +msgstr "Nome classe" + +#. module: web_editor_class_selector +#: model:ir.model.constraint,message:web_editor_class_selector.constraint_web_editor_class_class_name_uniq +msgid "Class name must be unique" +msgstr "Il nome della classe deve essere univoco" + +#. module: web_editor_class_selector +#: model_terms:ir.actions.act_window,help:web_editor_class_selector.action_web_editor_class +msgid "Click here to add new Web Editor Class." +msgstr "Fare clic qui per aggiungere una nuova classe editor web." + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: web_editor_class_selector +#. odoo-javascript +#: code:addons/web_editor_class_selector/static/src/js/odoo-editor/OdooEditor.esm.js:0 +#: code:addons/web_editor_class_selector/static/src/xml/web_editor.xml:0 +#, python-format +msgid "Custom CSS" +msgstr "CSS personalizzato" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__id +msgid "ID" +msgstr "ID" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__name +msgid "Name" +msgstr "Nome" + +#. module: web_editor_class_selector +#: model_terms:ir.ui.view,arch_db:web_editor_class_selector.view_web_editor_class_form +msgid "Name..." +msgstr "Nome..." + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__sequence +msgid "Sequence" +msgstr "Sequenza" + +#. module: web_editor_class_selector +#: model_terms:ir.ui.view,arch_db:web_editor_class_selector.view_web_editor_class_form +msgid "Some CSS class" +msgstr "Qualche classe CSS" + +#. module: web_editor_class_selector +#: model:ir.model.fields,help:web_editor_class_selector.field_web_editor_class__class_name +msgid "" +"The class name to be added to the tag. It must be created in the CSS file." +msgstr "" +"Il nome della classe da aggiungere al tag. Deve essere creata nel file CSS." + +#. module: web_editor_class_selector +#: model:ir.actions.act_window,name:web_editor_class_selector.action_web_editor_class +#: model:ir.ui.menu,name:web_editor_class_selector.web_editor_class_menu +msgid "Web Editor Class" +msgstr "Classe editor web" + +#. module: web_editor_class_selector +#: model:ir.model,name:web_editor_class_selector.model_web_editor_class +msgid "Web editor class selector" +msgstr "Selettore classe editore web" diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/i18n/web_editor_class_selector.pot b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/i18n/web_editor_class_selector.pot new file mode 100644 index 0000000..ef8f07e --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/i18n/web_editor_class_selector.pot @@ -0,0 +1,115 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_editor_class_selector +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__active +msgid "Active" +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__class_name +msgid "Class Name" +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.model.constraint,message:web_editor_class_selector.constraint_web_editor_class_class_name_uniq +msgid "Class name must be unique" +msgstr "" + +#. module: web_editor_class_selector +#: model_terms:ir.actions.act_window,help:web_editor_class_selector.action_web_editor_class +msgid "Click here to add new Web Editor Class." +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__create_uid +msgid "Created by" +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__create_date +msgid "Created on" +msgstr "" + +#. module: web_editor_class_selector +#. odoo-javascript +#: code:addons/web_editor_class_selector/static/src/js/odoo-editor/OdooEditor.esm.js:0 +#: code:addons/web_editor_class_selector/static/src/xml/web_editor.xml:0 +#: code:addons/web_editor_class_selector/static/src/xml/web_editor.xml:0 +#, python-format +msgid "Custom CSS" +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__display_name +msgid "Display Name" +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__id +msgid "ID" +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class____last_update +msgid "Last Modified on" +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__write_date +msgid "Last Updated on" +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__name +msgid "Name" +msgstr "" + +#. module: web_editor_class_selector +#: model_terms:ir.ui.view,arch_db:web_editor_class_selector.view_web_editor_class_form +msgid "Name..." +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.model.fields,field_description:web_editor_class_selector.field_web_editor_class__sequence +msgid "Sequence" +msgstr "" + +#. module: web_editor_class_selector +#: model_terms:ir.ui.view,arch_db:web_editor_class_selector.view_web_editor_class_form +msgid "Some CSS class" +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.model.fields,help:web_editor_class_selector.field_web_editor_class__class_name +msgid "" +"The class name to be added to the tag. It must be created in the CSS file." +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.actions.act_window,name:web_editor_class_selector.action_web_editor_class +#: model:ir.ui.menu,name:web_editor_class_selector.web_editor_class_menu +msgid "Web Editor Class" +msgstr "" + +#. module: web_editor_class_selector +#: model:ir.model,name:web_editor_class_selector.model_web_editor_class +msgid "Web editor class selector" +msgstr "" diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/models/__init__.py b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/models/__init__.py new file mode 100644 index 0000000..5b89093 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/models/__init__.py @@ -0,0 +1 @@ +from . import web_editor_class diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/models/web_editor_class.py b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/models/web_editor_class.py new file mode 100644 index 0000000..e7f890b --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/models/web_editor_class.py @@ -0,0 +1,19 @@ +from odoo import fields, models + + +class WebEditorClass(models.Model): + _name = "web.editor.class" + _description = "Web editor class selector" + _order = "sequence,id" + + name = fields.Char(required=True) + sequence = fields.Integer(default=10) + class_name = fields.Char( + required=True, + help="The class name to be added to the tag. It must be created in the CSS file.", + ) + active = fields.Boolean(default=True) + + _sql_constraints = [ + ("class_name_uniq", "unique(class_name)", "Class name must be unique") + ] diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/readme/DESCRIPTION.rst b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/readme/DESCRIPTION.rst new file mode 100644 index 0000000..72f02ec --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module allows users to create custom CSS class records, which can then be selected and applied directly in the HTML editor. +Note: The actual CSS file containing the class definitions is not provided by this module and must be loaded in a custom module. \ No newline at end of file diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/readme/ROADMAP.rst b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/readme/ROADMAP.rst new file mode 100644 index 0000000..ef40b9a --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/readme/ROADMAP.rst @@ -0,0 +1 @@ +Add support to apply class to any element (currently, only `span` is supported) \ No newline at end of file diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/readme/USAGE.rst b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/readme/USAGE.rst new file mode 100644 index 0000000..d924287 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/readme/USAGE.rst @@ -0,0 +1,5 @@ +* Go to `Settings` > `Technical` > `User Interface` > `Web editor Class`. +* Create and name your custom CSS classes. +* Go to any model with an HTML field (e.g., `Settings` > `Users` > `Preferences` > `Signature`). +* In the HTML editor, select any content block. +* Choose from the available CSS classes to apply the desired styling. diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/security/ir.model.access.csv b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/security/ir.model.access.csv new file mode 100644 index 0000000..373bd04 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_web_editor_class_group_user,access_web_editor_class_group_user,model_web_editor_class,base.group_user,1,0,0,0 +access_web_editor_class_group_no_one,access_web_editor_class_group_no_one,model_web_editor_class,base.group_no_one,1,1,1,1 diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/description/icon.png b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 Q3=9kmp00i_>zopr09!l7U;qFB literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/description/index.html b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/description/index.html new file mode 100644 index 0000000..e55819c --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/description/index.html @@ -0,0 +1,433 @@ + + + + + +Web editor class selector + + + +
+

Web editor class selector

+ + +

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

+

This module allows users to create custom CSS class records, which can then be selected and applied directly in the HTML editor. +Note: The actual CSS file containing the class definitions is not provided by this module and must be loaded in a custom module.

+

Table of contents

+ +
+

Usage

+
    +
  • Go to Settings > Technical > User Interface > Web editor Class.
  • +
  • Create and name your custom CSS classes.
  • +
  • Go to any model with an HTML field (e.g., Settings > Users > Preferences > Signature).
  • +
  • In the HTML editor, select any content block.
  • +
  • Choose from the available CSS classes to apply the desired styling.
  • +
+
+
+

Known issues / Roadmap

+

Add support to apply class to any element (currently, only span is supported)

+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

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

+

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

+
+
+
+ + diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/backend/html_field.esm.js b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/backend/html_field.esm.js new file mode 100644 index 0000000..7bbbb3d --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/backend/html_field.esm.js @@ -0,0 +1,27 @@ +/** @odoo-module **/ +import {HtmlField} from "@web_editor/js/backend/html_field"; +import {patch} from "@web/core/utils/patch"; +import {useService} from "@web/core/utils/hooks"; + +const {onWillStart} = owl; + +patch(HtmlField.prototype, "web_editor_class_selector.HtmlField", { + setup() { + this._super(...arguments); + this.orm = useService("orm"); + this.custom_class_css = []; + onWillStart(async () => { + this.custom_class_css = await this.orm.searchRead( + "web.editor.class", + [], + ["name", "class_name"] + ); + }); + }, + async startWysiwyg(wysiwyg) { + // Provide the custom class css to the wysiwyg editor + // to render the custom class css in the toolbar + wysiwyg.options.custom_class_css = this.custom_class_css; + return this._super(wysiwyg); + }, +}); diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/odoo-editor/OdooEditor.esm.js b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/odoo-editor/OdooEditor.esm.js new file mode 100644 index 0000000..b7cf068 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/odoo-editor/OdooEditor.esm.js @@ -0,0 +1,68 @@ +/** @odoo-module **/ +import {_t} from "web.core"; +import {patch} from "web.utils"; +import { + closestElement, + getSelectedNodes, + isVisibleTextNode, +} from "@web_editor/js/editor/odoo-editor/src/utils/utils"; +import {OdooEditor} from "@web_editor/js/editor/odoo-editor/src/OdooEditor"; + +patch(OdooEditor.prototype, "web_editor_class_selector.OdooEditor", { + _updateToolbar(show) { + const res = this._super(show); + if (!this.toolbar || !this.custom_class_css) { + return res; + } + const sel = this.document.getSelection(); + if (!this.isSelectionInEditable(sel)) { + return res; + } + // Get selected nodes within td to handle non-p elements like h1, h2... + // Targeting
to ensure span stays inside its corresponding block node. + const selectedNodesInTds = [ + ...this.editable.querySelectorAll(".o_selected_td"), + ].map((node) => closestElement(node).querySelector("br")); + const selectedNodes = getSelectedNodes(this.editable).filter( + (n) => + n.nodeType === Node.TEXT_NODE && + closestElement(n).isContentEditable && + isVisibleTextNode(n) + ); + const selectedTextNodes = selectedNodes.length + ? selectedNodes + : selectedNodesInTds; + let activeLabel = ""; + for (const selectedTextNode of selectedTextNodes) { + const parentNode = selectedTextNode.parentElement; + for (const customCss of this.custom_class_css) { + const button = this.toolbar.querySelector("#" + customCss.class_name); + if (button) { + const isActive = parentNode.classList.contains( + customCss.class_name + ); + button.classList.toggle("active", isActive); + + if (isActive) { + activeLabel = button.textContent; + } + } + } + } + // Show current class active in the toolbar + // or remove active class if nothing is selected + const styleSection = this.toolbar.querySelector("#custom_class"); + if (styleSection) { + if (!activeLabel) { + const css_selectors = this.toolbar.querySelectorAll(".css_selector"); + for (const node of css_selectors) { + node.classList.toggle("active", false); + } + } + styleSection.querySelector("button span").textContent = activeLabel + ? activeLabel + : _t("Custom CSS"); + } + return res; + }, +}); diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/odoo-editor/commands.esm.js b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/odoo-editor/commands.esm.js new file mode 100644 index 0000000..e04641b --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/odoo-editor/commands.esm.js @@ -0,0 +1,12 @@ +/** @odoo-module **/ +import {editorCommands} from "@web_editor/js/editor/odoo-editor/src/commands/commands"; +import {formatSelection} from "@web_editor/js/editor/odoo-editor/src/utils/utils"; + +const newCommands = { + setCustomCss: (editor, ...args) => { + const selectedId = parseInt(args[0], 10); + const record = editor.custom_class_css.find((item) => item.id === selectedId); + formatSelection(editor, record.class_name); + }, +}; +Object.assign(editorCommands, newCommands); diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/odoo-editor/utils.esm.js b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/odoo-editor/utils.esm.js new file mode 100644 index 0000000..706df13 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/odoo-editor/utils.esm.js @@ -0,0 +1,37 @@ +/** @odoo-module **/ +import { + closestElement, + formatsSpecs, +} from "@web_editor/js/editor/odoo-editor/src/utils/utils"; + +// This function is called in the _configureToolbar method of the Wysiwyg class +// It generates the new formatsSpecs object with the custom CSS class +export function createCustomCssFormats(custom_class_css) { + const newformatsSpecs = {}; + const class_names = custom_class_css.map((customCss) => customCss.class_name); + const removeCustomClass = (node) => { + for (const class_name of class_names) { + node.classList.remove(class_name); + if (node.parentElement) { + node.parentElement.classList.remove(class_name); + } + } + }; + for (const customCss of custom_class_css) { + const className = customCss.class_name; + newformatsSpecs[className] = { + tagName: "span", + isFormatted: (node) => closestElement(node).classList.contains(className), + isTag: (node) => + ["SPAN"].includes(node.tagName) && node.classList.contains(className), + hasStyle: (node) => closestElement(node).classList.contains(className), + addStyle: (node) => { + removeCustomClass(node); + node.classList.add(className); + }, + addNeutralStyle: (node) => removeCustomClass(node), + removeStyle: (node) => removeCustomClass(node), + }; + } + Object.assign(formatsSpecs, newformatsSpecs); +} diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/wysiwyg/wysiwyg.esm.js b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/wysiwyg/wysiwyg.esm.js new file mode 100644 index 0000000..7fa75f0 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/js/wysiwyg/wysiwyg.esm.js @@ -0,0 +1,25 @@ +/** @odoo-module **/ +import Wysiwyg from "web_editor.wysiwyg"; +import core from "web.core"; +import {createCustomCssFormats} from "../odoo-editor/utils.esm"; + +const Qweb = core.qweb; + +Wysiwyg.include({ + _configureToolbar: function (options) { + this._super(options); + if (options.custom_class_css && options.custom_class_css.length > 0) { + const $dialogContent = $( + Qweb.render("web_editor_class_selector.custom_class_css", { + custom_class_css: options.custom_class_css, + }) + ); + $dialogContent.appendTo(this.toolbar.$el); + // Binding the new commands to the editor + // to react to the click on the new options + this.odooEditor.bindExecCommand($dialogContent[0]); + this.odooEditor.custom_class_css = options.custom_class_css; + createCustomCssFormats(options.custom_class_css); + } + }, +}); diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/scss/demo_styles.scss b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/scss/demo_styles.scss new file mode 100644 index 0000000..e0cac6b --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/scss/demo_styles.scss @@ -0,0 +1,21 @@ +.demo_menu { + font-weight: bold; + font-style: italic; + color: #714b67; +} + +.demo_button { + border: 1px solid #71639e; + border-radius: 0.25rem; + padding: 0.25rem 0.7rem; + font-weight: bold; + color: #343a40; + background-color: #dee2e6; + border-color: #dee2e6 !important; +} + +.demo_field { + border-top: 1px solid grey; + border-bottom: 1px solid grey; + font-weight: bold; +} diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/xml/web_editor.xml b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/xml/web_editor.xml new file mode 100644 index 0000000..d930766 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/static/src/xml/web_editor.xml @@ -0,0 +1,33 @@ + + + + + + + + + + diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/views/menus.xml b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/views/menus.xml new file mode 100644 index 0000000..3681b31 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/views/menus.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/views/web_editor_class_views.xml b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/views/web_editor_class_views.xml new file mode 100644 index 0000000..3ff6643 --- /dev/null +++ b/odoo-bringout-oca-web-web_editor_class_selector/web_editor_class_selector/views/web_editor_class_views.xml @@ -0,0 +1,62 @@ + + + + + view.web.editor.class.tree + web.editor.class + + + + + + + + + + + view.web.editor.class.form + web.editor.class + +
+ +
+
+ + + + +
+
+
+
+ + + view.web.editor.class.search + web.editor.class + + + + + + + + + Web Editor Class + ir.actions.act_window + web.editor.class + tree,form + +

+ Click here to add new Web Editor Class. +

+
+
+ +
diff --git a/odoo-bringout-oca-web-web_environment_ribbon/README.md b/odoo-bringout-oca-web-web_environment_ribbon/README.md new file mode 100644 index 0000000..8c0b365 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/README.md @@ -0,0 +1,46 @@ +# Web Environment Ribbon + +Odoo addon: web_environment_ribbon + +## Installation + +```bash +pip install odoo-bringout-oca-web-web_environment_ribbon +``` + +## Dependencies + +This addon depends on: +- web + +## Manifest Information + +- **Name**: Web Environment Ribbon +- **Version**: 16.0.1.0.0 +- **Category**: Web +- **License**: AGPL-3 +- **Installable**: True + +## Source + +Based on [OCA/web](https://github.com/OCA/web) branch 16.0, addon `web_environment_ribbon`. + +## License + +This package maintains the original AGPL-3 license from the upstream Odoo project. + +## Documentation + +- Overview: doc/OVERVIEW.md +- Architecture: doc/ARCHITECTURE.md +- Models: doc/MODELS.md +- Controllers: doc/CONTROLLERS.md +- Wizards: doc/WIZARDS.md +- Reports: doc/REPORTS.md +- Security: doc/SECURITY.md +- Install: doc/INSTALL.md +- Usage: doc/USAGE.md +- Configuration: doc/CONFIGURATION.md +- Dependencies: doc/DEPENDENCIES.md +- Troubleshooting: doc/TROUBLESHOOTING.md +- FAQ: doc/FAQ.md diff --git a/odoo-bringout-oca-web-web_environment_ribbon/doc/ARCHITECTURE.md b/odoo-bringout-oca-web-web_environment_ribbon/doc/ARCHITECTURE.md new file mode 100644 index 0000000..43ddc08 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/doc/ARCHITECTURE.md @@ -0,0 +1,32 @@ +# Architecture + +```mermaid +flowchart TD + U[Users] -->|HTTP| V[Views and QWeb Templates] + V --> C[Controllers] + V --> W[Wizards – Transient Models] + C --> M[Models and ORM] + W --> M + M --> R[Reports] + DX[Data XML] --> M + S[Security – ACLs and Groups] -. enforces .-> M + + subgraph Web_environment_ribbon Module - web_environment_ribbon + direction LR + M:::layer + W:::layer + C:::layer + V:::layer + R:::layer + S:::layer + DX:::layer + end + + classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px +``` + +Notes +- Views include tree/form/kanban templates and report templates. +- Controllers provide website/portal routes when present. +- Wizards are UI flows implemented with `models.TransientModel`. +- Data XML loads data/demo records; Security defines groups and access. diff --git a/odoo-bringout-oca-web-web_environment_ribbon/doc/CONFIGURATION.md b/odoo-bringout-oca-web-web_environment_ribbon/doc/CONFIGURATION.md new file mode 100644 index 0000000..7811b7f --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/doc/CONFIGURATION.md @@ -0,0 +1,3 @@ +# Configuration + +Refer to Odoo settings for web_environment_ribbon. Configure related models, access rights, and options as needed. diff --git a/odoo-bringout-oca-web-web_environment_ribbon/doc/CONTROLLERS.md b/odoo-bringout-oca-web-web_environment_ribbon/doc/CONTROLLERS.md new file mode 100644 index 0000000..f628e77 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/doc/CONTROLLERS.md @@ -0,0 +1,3 @@ +# Controllers + +This module does not define custom HTTP controllers. diff --git a/odoo-bringout-oca-web-web_environment_ribbon/doc/DEPENDENCIES.md b/odoo-bringout-oca-web-web_environment_ribbon/doc/DEPENDENCIES.md new file mode 100644 index 0000000..b3b749a --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/doc/DEPENDENCIES.md @@ -0,0 +1,5 @@ +# Dependencies + +This addon depends on: + +- [web](https://github.com/bringout/oca-ocb-core/tree/b3e6fb998e53b9eb1bc9669d992017616c2bd7b3/odoo-bringout-oca-ocb-web) diff --git a/odoo-bringout-oca-web-web_environment_ribbon/doc/FAQ.md b/odoo-bringout-oca-web-web_environment_ribbon/doc/FAQ.md new file mode 100644 index 0000000..e3ddd4c --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/doc/FAQ.md @@ -0,0 +1,4 @@ +# FAQ + +- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged). +- Q: How to enable? A: Start server with --addon web_environment_ribbon or install in UI. diff --git a/odoo-bringout-oca-web-web_environment_ribbon/doc/INSTALL.md b/odoo-bringout-oca-web-web_environment_ribbon/doc/INSTALL.md new file mode 100644 index 0000000..dd55b1a --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/doc/INSTALL.md @@ -0,0 +1,7 @@ +# Install + +```bash +pip install odoo-bringout-oca-web-web_environment_ribbon" +# or +uv pip install odoo-bringout-oca-web-web_environment_ribbon" +``` diff --git a/odoo-bringout-oca-web-web_environment_ribbon/doc/MODELS.md b/odoo-bringout-oca-web-web_environment_ribbon/doc/MODELS.md new file mode 100644 index 0000000..1383ac6 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/doc/MODELS.md @@ -0,0 +1,12 @@ +# Models + +Detected core models and extensions in web_environment_ribbon. + +```mermaid +classDiagram + class web_environment_ribbon_backend +``` + +Notes +- Classes show model technical names; fields omitted for brevity. +- Items listed under _inherit are extensions of existing models. diff --git a/odoo-bringout-oca-web-web_environment_ribbon/doc/OVERVIEW.md b/odoo-bringout-oca-web-web_environment_ribbon/doc/OVERVIEW.md new file mode 100644 index 0000000..af5313a --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/doc/OVERVIEW.md @@ -0,0 +1,6 @@ +# Overview + +Packaged Odoo addon: web_environment_ribbon. Provides features documented in upstream Odoo 16 under this addon. + +- Source: OCA/OCB 16.0, addon web_environment_ribbon +- License: LGPL-3 diff --git a/odoo-bringout-oca-web-web_environment_ribbon/doc/REPORTS.md b/odoo-bringout-oca-web-web_environment_ribbon/doc/REPORTS.md new file mode 100644 index 0000000..e0ea35f --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/doc/REPORTS.md @@ -0,0 +1,3 @@ +# Reports + +This module does not define custom reports. diff --git a/odoo-bringout-oca-web-web_environment_ribbon/doc/SECURITY.md b/odoo-bringout-oca-web-web_environment_ribbon/doc/SECURITY.md new file mode 100644 index 0000000..e07da9d --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/doc/SECURITY.md @@ -0,0 +1,8 @@ +# Security + +This module does not define custom security rules or access controls beyond Odoo defaults. + +Default Odoo security applies: +- Base user access through standard groups +- Model access inherited from dependencies +- No custom row-level security rules diff --git a/odoo-bringout-oca-web-web_environment_ribbon/doc/TROUBLESHOOTING.md b/odoo-bringout-oca-web-web_environment_ribbon/doc/TROUBLESHOOTING.md new file mode 100644 index 0000000..56853cb --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/doc/TROUBLESHOOTING.md @@ -0,0 +1,5 @@ +# Troubleshooting + +- Ensure Python and Odoo environment matches repo guidance. +- Check database connectivity and logs if startup fails. +- Validate that dependent addons listed in DEPENDENCIES.md are installed. diff --git a/odoo-bringout-oca-web-web_environment_ribbon/doc/USAGE.md b/odoo-bringout-oca-web-web_environment_ribbon/doc/USAGE.md new file mode 100644 index 0000000..8c58ffd --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/doc/USAGE.md @@ -0,0 +1,7 @@ +# Usage + +Start Odoo including this addon (from repo root): + +```bash +python3 scripts/nix_odoo_web_server.py --db-name mydb --addon web_environment_ribbon +``` diff --git a/odoo-bringout-oca-web-web_environment_ribbon/doc/WIZARDS.md b/odoo-bringout-oca-web-web_environment_ribbon/doc/WIZARDS.md new file mode 100644 index 0000000..48e790d --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/doc/WIZARDS.md @@ -0,0 +1,3 @@ +# Wizards + +This module does not include UI wizards. diff --git a/odoo-bringout-oca-web-web_environment_ribbon/pyproject.toml b/odoo-bringout-oca-web-web_environment_ribbon/pyproject.toml new file mode 100644 index 0000000..51e91af --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/pyproject.toml @@ -0,0 +1,42 @@ +[project] +name = "odoo-bringout-oca-web-web_environment_ribbon" +version = "16.0.0" +description = "Web Environment Ribbon - Odoo addon" +authors = [ + { name = "Ernad Husremovic", email = "hernad@bring.out.ba" } +] +dependencies = [ + "odoo-bringout-oca-ocb-web>=16.0.0", + "requests>=2.25.1" +] +readme = "README.md" +requires-python = ">= 3.11" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Office/Business", +] + +[project.urls] +homepage = "https://github.com/bringout/0" +repository = "https://github.com/bringout/0" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["web_environment_ribbon"] + +[tool.rye] +managed = true +dev-dependencies = [ + "pytest>=8.4.1", +] diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/README.rst b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/README.rst new file mode 100644 index 0000000..9d86098 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/README.rst @@ -0,0 +1,101 @@ +====================== +Web Environment Ribbon +====================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:f15d70ea4272155560e696d4677c06aac24b47b303f75ea305d9c4e5a3991476 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/16.0/web_environment_ribbon + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_environment_ribbon + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Mark a Test Environment with a red ribbon on the top left corner in every page + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +* You can change the ribbon's name ("TEST") by editing the default system + parameter "ribbon.name" (in the menu Settings > Parameters > System + Parameters) To hide the ribbon, set this parameter to "False" or delete it. +* You can customize the ribbon color and background color through system + parameters: "ribbon.color", "ribbon.background.color". Fill with valid CSS + colors or just set to "False" to use default values. +* You can add the database name in the ribbon by adding "{db_name}" in the + system parameter "ribbon.name". + +Usage +===== + +To use this module, you need only to install it. After installation, a red +ribbon will be visible on top left corner of every Odoo backend page + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Francesco OpenCode Apruzzese +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* Francesco Apruzzese +* Javi Melendez +* Antonio Espinosa +* Thomas Binsfeld +* Xavier Jiménez +* Dennis Sluijk +* Eric Lembregts + +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/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/__init__.py b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/__manifest__.py b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/__manifest__.py new file mode 100644 index 0000000..9d99f18 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/__manifest__.py @@ -0,0 +1,27 @@ +# Copyright 2015 Francesco OpenCode Apruzzese +# Copyright 2016 Antonio Espinosa +# Copyright 2017 Thomas Binsfeld +# Copyright 2017 Xavier Jiménez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Web Environment Ribbon", + "version": "16.0.1.0.0", + "category": "Web", + "author": "Francesco OpenCode Apruzzese, " + "Tecnativa, " + "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "license": "AGPL-3", + "depends": ["web"], + "data": [ + "data/ribbon_data.xml", + ], + "auto_install": False, + "installable": True, + "assets": { + "web.assets_common": [ + "web_environment_ribbon/static/**/*", + ], + }, +} diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/data/ribbon_data.xml b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/data/ribbon_data.xml new file mode 100644 index 0000000..72a5024 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/data/ribbon_data.xml @@ -0,0 +1,20 @@ + + + + + + ribbon.name + ({db_name})]]> + + + + ribbon.color + #f0f0f0 + + + + ribbon.background.color + rgba(255,0,0,.6) + + diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/bs.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/bs.po new file mode 100644 index 0000000..2377695 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/bs.po @@ -0,0 +1,19 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "Pozadina trake okoline" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/ca.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/ca.po new file mode 100644 index 0000000..57a4eb2 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/ca.po @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-02-02 22:13+0000\n" +"Last-Translator: eduardgm \n" +"Language-Team: none\n" +"Language: ca\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_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "Backend \"Web Environment Ribbon\"" + +#~ msgid "Display Name" +#~ msgstr "Nom mostrat" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificació el" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/de.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/de.po new file mode 100644 index 0000000..f89b15d --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/de.po @@ -0,0 +1,34 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +# Translators: +# Niki Waibel , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-13 16:06+0000\n" +"PO-Revision-Date: 2020-07-22 12: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_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "Web-Umgebung Ribbon-Backend" + +#~ msgid "Display Name" +#~ msgstr "Anzeigename" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Zuletzt geändert am" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/es.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/es.po new file mode 100644 index 0000000..39ffdbe --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/es.po @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-08-04 17:44+0000\n" +"Last-Translator: eduardgm \n" +"Language-Team: none\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_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "Backend \"Web Environment Ribbon\"" + +#~ msgid "Display Name" +#~ msgstr "Nombre mostrado" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación el" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/fr.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/fr.po new file mode 100644 index 0000000..905b8dc --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/fr.po @@ -0,0 +1,34 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +# Translators: +# OCA Transbot , 2017 +# Quentin THEURET , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-26 02:44+0000\n" +"PO-Revision-Date: 2017-07-26 02:44+0000\n" +"Last-Translator: Quentin THEURET , 2017\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" + +#. module: web_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "Backend du bandeau de l'environnement Web" + +#~ msgid "Display Name" +#~ msgstr "Nom affiché" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Dernière modification le" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/hr.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/hr.po new file mode 100644 index 0000000..25ce1d7 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/hr.po @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +# Translators: +# Bole , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-13 16:06+0000\n" +"PO-Revision-Date: 2023-01-04 02:41+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 4.14.1\n" + +#. module: web_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "Pozadina trake okoline" + +#~ msgid "Display Name" +#~ msgstr "Naziv za prikaz" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Zadnje modificirano" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/it.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/it.po new file mode 100644 index 0000000..7dda6ec --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/it.po @@ -0,0 +1,22 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-27 11:34+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: web_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "Nastro ambiente web backend" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/nl.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/nl.po new file mode 100644 index 0000000..16b808e --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/nl.po @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-05-17 20:47+0000\n" +"Last-Translator: Bosd \n" +"Language-Team: none\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 4.3.2\n" + +#. module: web_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "Web Environment Ribbon Backend" + +#~ msgid "Display Name" +#~ msgstr "Weergavenaam" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Laatst Gewijzigd op" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/nl_NL.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/nl_NL.po new file mode 100644 index 0000000..4db8e2b --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/nl_NL.po @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +# Translators: +# Peter Hageman , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-13 16:06+0000\n" +"PO-Revision-Date: 2021-04-22 15:47+0000\n" +"Last-Translator: Bosd \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 4.3.2\n" + +#. module: web_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "" + +#~ msgid "Display Name" +#~ msgstr "Weergavenaam" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Laatst bijgewerkt op" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/pt.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/pt.po new file mode 100644 index 0000000..9a8c210 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/pt.po @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +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_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "" + +#~ msgid "Display Name" +#~ msgstr "Nome a Exibir" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificação em" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/pt_BR.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/pt_BR.po new file mode 100644 index 0000000..5af7c82 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/pt_BR.po @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +# 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: 2017-07-13 16:06+0000\n" +"PO-Revision-Date: 2018-08-03 12:34+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.1.1\n" + +#. module: web_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "Back-end da fita do ambiente da Web" + +#~ msgid "Display Name" +#~ msgstr "Exibir Nome" + +#~ msgid "ID" +#~ msgstr "Identificação" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificação em" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/sl.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/sl.po new file mode 100644 index 0000000..59a7d9f --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/sl.po @@ -0,0 +1,28 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-13 16:06+0000\n" +"PO-Revision-Date: 2017-07-13 16:06+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" +"%100==4 ? 2 : 3);\n" + +#. module: web_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "" + +#~ msgid "ID" +#~ msgstr "ID" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/web_environment_ribbon.pot b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/web_environment_ribbon.pot new file mode 100644 index 0000000..57b0824 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/web_environment_ribbon.pot @@ -0,0 +1,19 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/zh.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/zh.po new file mode 100644 index 0000000..0a6c105 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/zh.po @@ -0,0 +1,20 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: zh\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" + +#. module: web_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/zh_CN.po b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/zh_CN.po new file mode 100644 index 0000000..f5a4fd3 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/i18n/zh_CN.po @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_environment_ribbon +# +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_environment_ribbon +#: model:ir.model,name:web_environment_ribbon.model_web_environment_ribbon_backend +msgid "Web Environment Ribbon Backend" +msgstr "Web环境功能区后台" + +#~ msgid "Display Name" +#~ msgstr "显示名称" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "最后修改时间" diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/models/__init__.py b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/models/__init__.py new file mode 100644 index 0000000..18368b4 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/models/__init__.py @@ -0,0 +1 @@ +from . import web_environment_ribbon_backend diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/models/web_environment_ribbon_backend.py b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/models/web_environment_ribbon_backend.py new file mode 100644 index 0000000..5932d7b --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/models/web_environment_ribbon_backend.py @@ -0,0 +1,36 @@ +# Copyright 2017 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class WebEnvironmentRibbonBackend(models.AbstractModel): + + _name = "web.environment.ribbon.backend" + _description = "Web Environment Ribbon Backend" + + @api.model + def _prepare_ribbon_format_vals(self): + return {"db_name": self.env.cr.dbname} + + @api.model + def _prepare_ribbon_name(self): + name_tmpl = self.env["ir.config_parameter"].sudo().get_param("ribbon.name") + vals = self._prepare_ribbon_format_vals() + return name_tmpl and name_tmpl.format(**vals) or name_tmpl + + @api.model + def get_environment_ribbon(self): + """ + This method returns the ribbon data from ir config parameters + :return: dictionary + """ + ir_config_model = self.env["ir.config_parameter"] + name = self._prepare_ribbon_name() + return { + "name": name, + "color": ir_config_model.sudo().get_param("ribbon.color"), + "background_color": ir_config_model.sudo().get_param( + "ribbon.background.color" + ), + } diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/CONFIGURE.rst b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/CONFIGURE.rst new file mode 100644 index 0000000..8542c72 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/CONFIGURE.rst @@ -0,0 +1,8 @@ +* You can change the ribbon's name ("TEST") by editing the default system + parameter "ribbon.name" (in the menu Settings > Parameters > System + Parameters) To hide the ribbon, set this parameter to "False" or delete it. +* You can customize the ribbon color and background color through system + parameters: "ribbon.color", "ribbon.background.color". Fill with valid CSS + colors or just set to "False" to use default values. +* You can add the database name in the ribbon by adding "{db_name}" in the + system parameter "ribbon.name". diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/CONTRIBUTORS.rst b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..257e450 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/CONTRIBUTORS.rst @@ -0,0 +1,7 @@ +* Francesco Apruzzese +* Javi Melendez +* Antonio Espinosa +* Thomas Binsfeld +* Xavier Jiménez +* Dennis Sluijk +* Eric Lembregts diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/DESCRIPTION.rst b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/DESCRIPTION.rst new file mode 100644 index 0000000..c52ab9b --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Mark a Test Environment with a red ribbon on the top left corner in every page diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/USAGE.rst b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/USAGE.rst new file mode 100644 index 0000000..408d88c --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/readme/USAGE.rst @@ -0,0 +1,2 @@ +To use this module, you need only to install it. After installation, a red +ribbon will be visible on top left corner of every Odoo backend page diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/description/icon.png b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..78b52ae920d68bd0149fa4d8d73b1383e785357e GIT binary patch literal 9272 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 literal 0 HcmV?d00001 diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/description/index.html b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/description/index.html new file mode 100644 index 0000000..66bc30b --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/description/index.html @@ -0,0 +1,448 @@ + + + + + + +Web Environment Ribbon + + + +
+

Web Environment Ribbon

+ + +

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

+

Mark a Test Environment with a red ribbon on the top left corner in every page

+

Table of contents

+ +
+

Configuration

+
    +
  • You can change the ribbon’s name (“TEST”) by editing the default system +parameter “ribbon.name” (in the menu Settings > Parameters > System +Parameters) To hide the ribbon, set this parameter to “False” or delete it.
  • +
  • You can customize the ribbon color and background color through system +parameters: “ribbon.color”, “ribbon.background.color”. Fill with valid CSS +colors or just set to “False” to use default values.
  • +
  • You can add the database name in the ribbon by adding “{db_name}” in the +system parameter “ribbon.name”.
  • +
+
+
+

Usage

+

To use this module, you need only to install it. After installation, a red +ribbon will be visible on top left corner of every Odoo backend page

+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Francesco OpenCode Apruzzese
  • +
  • Tecnativa
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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

+

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

+

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

+
+
+
+ + diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/description/screenshot.png b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/description/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..30245656d1b2aa1e605cb393ee0aefe4f2b6472a GIT binary patch literal 43941 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 z zgcDDT=2+Lug@%TTP3KJDJPN%hyD1Zri;3%#0~BifnRob0fB72#V=OwM?5P zW@Z!`8JVdNf7jA3*E3i{Pfttt+wwZ=bZ2)r_pMvEHk7;!3fs5kwVA1{^p?7BZz8|d zo}RAX9-!e;RJ5tDqtJC<&(`4man;q<)@|Cx#=@XM#*Im=w{G1kdD4BeUGwXkW|%xGnM;4e=jj*%bCz2t{ft+AL~@$!C|v^&x5CLdG+)2E2=6L6$}L0`Q_Ud zEj;*WlH(WspGmufDsAMty1Q?dhOdvi`f^%!cJ|?GYol-KZ8&wxYg=AWkkGexce~&3 z|1WoYTW<3G@UXD9zCOM!+qP}Gn|@v!6tWXeKYj4=%FlfjHga`;KDuw&y0x&YU-P)S z0LO#Jj}PzLSMpLQ`u)GZzpXYM&Y3Q$v%lnJ(A;lEO<8X&Zr{39@Z&?`HygW(4-EbC z_SYU>TsWz73>Se3AigwEE+qdt-hc7ML`}z0O);xIlk~7{;p2^-mWZKl1d)i;v zf0%9B>WLsNXPnez#mhPw&{<+uJ|>d_I4(ppn~!3Y)JFe!O~>#lpr`#O34vR9jV*)#l#jo?eA&*{VCIr9yYSa!gk5*(1ZWa6)f|;isoBpR(?A zVAvPXv1yXfr1f=OD?fdGaIo1gGcV8V1jqTKQ?xf@O-s-2 zsr)=)_U!HzD>Rx*xyAL4JUZHa^Ey}Sp#^i#o;|B3>+kK&EhQyYvaSC6yIAIvnR#K) zzZ*UMaqHHt3)il(>Fet+KE7-(s0Y{5+A4YFvcLDiD^I&lu(GmlJS`(56CwHdV+AN^ z&zI-qthu=D{A_dnmoHz!lX6ne^h?jDKNs3?P$|ypQ)m=dW55Zwy%LPcPrMyIU0we& z`{%B*w^DL;HPb$rC@O+xK5~REfy%byYzohv7u>R((~_d3P^m24`n$PntY=WAbsnntwl^&oIxI1I;|v z{{E(@t<9~gs|%0Jt7pD$zSs2Wi{ZJ0Uv0%U-1TdA+r#tZ^!ffL*$qj0KeMv3oT{s> zf5((t$rJp+4$JLO_i0EU2~xz_xzQ|k5^s4c(L)@x3am(iLZ<|T?>s(ew%b; z)#~DNq5l8pME_EA5OBF~yyiM<+O_C_Q$ObTn||{+z&5dBVhyjH&(!tz>;LZ!ma_@y zZuutM@yozG=kNDS`(uATJalfh;yLrJ_v+QS^|o$~`}ch_O8)(5Rr;$<^JL`1ZQovx zm0ezU_uQ?e``2wYD=j_8*(4G5WnWFHs>R=s1HZHywN74ta3BWUyWy$R(To2Zc;J^& zvF*w04;r3yD{wR!Os!Ll|Lb|+jAGoG-WyXYB|Z1Cu`fF%9)3y$)Hu($nE#|Z_&}M( zx9X2cc{}dz49vd1eM*ht?SvG^+5eQvZ$00(f7?W`NiX#NdhOf7y2gHa#iUSo2IyLV z$p&gMr;fQ@xq5BUqBT5ARaG@~H60^8IkQ%;woG-bwtl*Fslc~QHHN>9zW$vyVa_`j z-rd2|A?E3SvHlt4^Phc+wEg?*kCxVMUcYLEgP$LtUd)b$6DK@=bh>=_`1Puzl9;lM z5|gK=r-!$Z!W&m((=UFb8e1~j9y*c z7XyM9Z=SzTKzd!R$+hc?7wwVx{{F6WoFCt&&6_9Ao!tDJl~qGu*EPAecKYoX`Ja}C zXmK_vbSV1mpR)d+PTZOMnlWw}^k~}KvMcL@gF{P}kAAV_^K4I?Mv)k5hf8rL;w_00!;_S)IN0z9_@bI@g zXtX$JxOBv<%S-p*a7i-UQ(FVFYsu#HiSwtoTj?flaZ%|3ho-?)Mcw#iUDLny?pd-! z!o6R%dA`OC&eMpILBM|c3k zK8FMA>g9f3dZ)KWL;LX5)!~A2f{dL$Y%6`(Izv_&Po3DlTpd(RzI@6mA0Pjt(`7=| zE4KEQ2bZ3n*3j3z+UYUVIc&>rM{h5$f{%w-PdGb2lovR#?eg^V>9?2N_nR1TW}C5z z4$t-V@$X9`RlvQxdD9iO$*>bi`7wp#qfyaq)%7xc7(fDTJpKNZ=NXe_QkYqAv2ry^%&m1)aUXwWZ#UZGb1A> zw6{2DO_tnpeTIOPu*WjqeKq^64vEP1{b_1SKXmY7-#V4npVe=Fm9ns~y*jbR@aC&k zbI0;u_j~+OB zq#7|>UJz$`d)?=|#Pood-YsR*Q~aNL-@L(*T5GGPqONSA!ot+JAlTDH&Fol$l8@3x z3CDv6J$!vlJCbH<#r1yuYEk#cf{BUw>fLQJhf;mE^lXicPP5&+S8?h|P*d&G=TE;} z4nUT^1WN{e3jJ{OxyFf;u5o32UR_F0;) zLXIk8&MIPu{Z*Ru=bv9^t}1m+_UEO2FXvlTi#>Xfz+7plR)6eP@|xNnm8#!A9welw z1g(oVkIb221!^?*bvM^1BrN~5O201VznNN=k2R~4V$+kNl(f{ZyBcO{f!cN8fvEHo zC&I7wuuk~6@37!|gDGO-i+3&BblDI*2-Vx2tQ;2;sGaLL=~T)q6X6=WCMISpT7IBk7(aJmwi)udp-7*a0;yyvD>%LZMWps#YOk*?AB=f`uWpw!9q?DkfAMC6fW2=t|oj0oYpJ&s_u(o6R#<$fKRZcn+H}ETVs0y*Lu_|h4 za44N^W>z|TdD*R%mOY#^0w&*Dyh!{w+*2=}YG=2(?XkPZ{IaK(W9C+Q^=WJiK9wn^ zi_h~~=uj6Y$JE?p)yq^_RjKHpcKG28i6>8=%&2KTck{3C>IHoJ*Py?PZ88`-(%PRtzZa=u1K#|ect zjVtwio$T#pdO9wg+qPfb-d zGBTP_@Py+?lA%ga=JbokD}CBpl-+N9PRnC74&5guCB*?M+s`eSwtkHyx5BUQWJz4oPK`M!iSOTw307> ze6fD@`n5+lPF7d^{QbSjt}CHWRxez~SGaMbK&DdWFMrLd%Id?HZ%Zew6!~-^U`fpW zd#PM(X_cv|s^{k0b}x94VD^_ee9Ni3hnX229e32do#ptY`)*jJ<)OoeZyx*_bNtQ2 zmzAJ;mGS=8cX&e`<~#JL;%2@qoK_DBE>rfuNZ@*dU1O56Z24h-6{C)-%<|-) zoh}|b3!R@YyFGXI7O#a4$+5CRj~|t=tl7={?)|-exgQJ~9KX*E={o%Jqt*LRGc%{F zH&%R(+FczGEpqwtr7QmaT&;7GPfBd$=I>DcOju0c{=M}bh>CAeK}cu zezugfntfPutgPQ$8_tO#r)C~HG^1vv2$xBQ>x&-OvnoQIj~+jcT=?>w%gtNI%k=H# z7bYft5bo@8d;W)+so>k6%I5E3VIdBB(>MP-w!%e)HGqzq@-^zrmy@I8Xxa3z~abL$Tq*`?cKJfJ27{x>R1Cm*9sWD4re+0OZ4Gp z+j%Fa&$V`Xdq>djwybD4_YLWc)KpcMq>UHf8SZmv*wD;gy2$u^@#ZkiE0_Pbw6<=X zxYX~dw{gN8K_xqP6R+wwAsHDOt4uDx{SqNGv#{Xj&pCIO+%i&~=oJ_kw{G+Po*teb z>?{S#UV-{=A!>&wCLg~L@V_Q`O{dw9-;T88d_jJs#WIB<)^L0n~kDT(BTa^z!#Mm$SIWIkb!OloatJuC@{(nxU z7~Q$nBUv@?WvRrB+&g~0PkRzxo(^9b_T=@SR_<5J8Mp4bv1K=7v$NBL#gzgNDsP|K z^Z(P+(`?PRw@y5jvSZ;@+0{WB1wT#*cBlw7ml#|R{@W+*7Ma?0Df zE8=$c3k51?shgZ-Jt+>FQqXF4+gGxT=aNdmTHUpWR(@6Nc=j`E$!TZzeUG01dU)rV zhDpdO_Jzyu?P@*nAc2`N$wkpZrKNV&`55z@sZNcvR%xAZcII6sVRY^7jezj>=7|&6 zY$$vxV_o`cN}tG##dAYNMLDLPzR7vu>upV;Zb4!B^L*3vbu}Fw5)`WWz83fXWM_HM zwv79NjM3?Uvj28W{4xeN)|ZKAemdICcIleJk<`jxP7wZrKhS;NY*a7&6_s~ zs7x>JJNW78XT`7I({~q~z3I2qsqx5-h~|yex0v56FJ2T7ADw;g?<8=Qq-OBo>FFCP zH{X<)?R?5H_jO}|HUHih)7hQg@;x|V!>Kj->f?Pv!orF|-KF!UCI4e%Wmi_WzWpXp zDlK}arRAG_y(hyxGgt1)%UkEy6qv6oD9q6cs%kd1H(%d9Y5k%@PG*Pq)LmcGzh1wl zrZ#Ye;Qra>`I~-T`f|L>Gu23Co^5v6$4hqeXPW0plsq+h-k~qxpdd6e^^F`jmM_M# zZK;tI)}QLc7`ph`vWVdR;@gV^?630|?Pj+6q`JNM_`^!2DJm<1{pMKIP4Z<~CGY#` zD`n%al2 zUv~@nZjaA**>}p@Tk*r^$1;nT+<#l~`gluu_>0Wg&$LiLX`{r{S%zLQ6ZPHpRat*pnvvn~=iy<2?4?B) z`fE}%l;S--J*RcoT)pC;GEt)BY1ZlR!oa}!r^9`Hc_D4^fKOLtKL+_PT>P*6Rk?aW z$~=~$-GAqN3YD18Hr1)|Ny=eEuUpLT^0SH}W=5xlaFwppcgy&)I8te&grcJ2iuHlZ zcb+(L;(^TPqbL0H`+kBZB?A%^(p@@bKTn;?I@PJsJA9pl>}OFCiH_{>_1|XIgif1& zI9%a^=Zw|%&sK-z?^1)5oB9$4pRTU$nC^7YZ&qx0MC0Q5Cj~O!rz*rREPLlML*41< zQKqnlCX>p2UzEKdtrdgJL(k{k+0sAXBC#Y&xznYoCHeS`+UF_hhwtCte|foVwNDGsyRV;edXT>yW_EhGD8#Sxlzd^$?s86 z^H15@+Q1c(^Opo^TnLEo@95y*`1{8qIM^fANXE}2q4iiyQgC>1bF-kJK+y?t?e<^x`5b=s#@7>W&%L|^L?ljF&NSbA|FgK>jIVbf^PtNvt$(_D`JG-oq4HwCP!?79+jSz)eyy`0h6^cC|TcX#qU%MyAviyNE( z4~6_%U-S0vwap#V)7FHCmTCIc3ifEs>#tffUG1=~a>By0cO0|dHgfrvRj2O#Rr{Tr z>xy~S-p2R0{7?S;{rh#w?)QBr2Id)4of@0|)U>p;9h!dr`4n4!eSMF=e8_Z!j^R_}Z_~%SOP*@ytz&pThkxP5O<~W~)?{Qj z_|({_1g%Vb;;rnmug0#)*}3#ssHUmVu~OsbQS&BGZa%O;VcY8o*$ei1=(we%s65|z z{o1uh0Vz*5e=qKs9iilylcSThdUdsm)GdELIhzUrrHwOW`IqaP3au1LKR3s)B0tiT zlgZ@q%`f+lZwXcsdwgc5@teYLE*YU*te?2K1cbzvO^fW?SR8ln9tR)av8~zH&nPW{ zl*#@t%0Es0elkfWO83CrBhs%r!c#?GWo0j1k)QCiYiXeD%b?{`FZk3?4)5#MGqkV? zKT&3$<*zA{_Pp;xB)foldw;e2`%RCQ)Eb{Vck0s1ZALGyT`rl~dg7@?@h_9C?5v(s zz5jNszV#|gMO977!eWMOblRHN0di7ZIlT`u^JmNcse8<(5~OMKRZif7n9TnMh9k$1 zE_4!ReC>7Ui|fWED>w`d4RcO$Br}Ohh#Yx#_R{_1KcA$WU}ENFyZ74V?4Q3AOP-zC zd~#iHhtB5Q+QL&OPdOEMaLisYZS~xmMg~yn`EFs)Ea!b%+S<_3uu0$^(~k=M6ytA- zWt|MyorD5|W6s^{DOHN;-DUo>?NwFEvHQnn>N^)!%=7qLvUpp?&6Voc`L^;2EAY?oAEV4&4S<8>Z$U6dSMTv+mA_Me;C)b#rP z*R5N3OqtVjVS~Y3ov*(xs+9Bd|6pf%pmdy}>}{nOGc$9q-Pw~a@0R@g*U{PMmgdNq z?!~|Eb3kNV-{s|giXO_F=W;Hp*H>Gh3hs^gEWHmNb`bbmt^Y&*ePhKhyOwje`d?V? zv)CHf7xJ@o%3Up&*vQ^ ze)%-^MSrgC^~*o>b?a6O8Ts>R8P9huH0JpGM`4E*Vp3*)uuYSr8y1Ak0mNuNBa z;K>cc6Q<4omr8kl`S9h*xyogNs>^myIGM5j#gf}w7p~)T?~`k_cQ0SJ@nfFSMu~g- z_H}f19lE&Kz3|l&&m%{VIX!#N&p3bmKW%{xZ!ex#J@(-Ab7d199@Vrtek+!L3JnYd zEz{yD)X|HNG!}RG@KLU`{P7ogK~T3m-F9|!VBU85#LagE)86;Zu-w-%Upu99=Ht~b zy-Kc6((6yxRNbN!x3G-8;EH3@?k4WJUDNlOh=__g$q6Q2_?qT($Y$>zi%^Mx!kr4!ycDN-C`|Nvs4jHy_HF5Tu^vjF^H=(` zc~93b*ED%^;BOaKOKZEc&cu>iX6MSXT*8#5zH)iIWw+$cTPK%nK5@n8+g<5LuHdPJ z687#>;TJ!hSDgP!DT)duT}y zUhS+X-M;r}YHCMsXCr8o@A-u*Wv{%|jE`xn=wWU!6zNGnGnGeR`L92YPRln4x#S@VOPRq@dS$0r%LZeMO$q1F1Uv2C-b zC#ahjq1C!O&HmV}n==;}*3Zlc4@gi*N=^z047;WdOCIfZ)AiqKHhXn-1q4TSw(YXI z@-+O>x%KGrb^WB8oJC#eOS!;(bob~1lPtoqb9CJ$d z{&sIc$vg@7=iU?FluB%EooZ!%{Q2IUMvn@VRaqU2EM0;$ml#R1C<)fo)J7&=YPdxZ9s+WLjl0X=y-10wkMq3X=NAlKT6#etyS{?)y z8U1cqVkx{5(vg0)!2jv#7csq2mjdSobzF(}fBa(kzmA7Ll@iyEY$& zR8e68>O-D>?yMkk$X_Mt<3%4m*~$+J=jPdVS4UN@snWhL^4Ut=TH0Mm=)vR1%o8Jc zR{F5nZk6O7kE?03Jm=pYIg$S34nTf*JYr02{ z9Y5@@5Wv0m86!iy-TeiJ5YcdfK|KX>M%i)Knh^l$ab*609*1w9H*1#Q7*GxzNy3((>lb6_=j8 zf2F(d;<<-c1LFICx3+qCdmo;8#6_m3Cxm;(G|()=iro&WMlyZ<$FF)%FWA4JL013z z^-IvAY`WdV_3Ms!v-eg0onrcR#o6@^zEPa3g1ZB!M)kb9l62*suA^_BrATPiNe}7W z_Vx+>fhEBUX3Q>$?{mI%KioN1R!dteATX@$(j=j2pDqQ36xW#bgnapSx#`#GSJ~Nt zabaymd&|P6OkKEZlTdHf`-i8x?uWzr7q35E)%|F+<6-&S{_drL#_q}dY*%J~W;^52 z)%U~1tStJ{8DD?()!SUI$JXbkr{})++UMo%4QY9;KNaqO^fbfSn!aB_ho8OPw4i|3 zWyiVXc-O~gu7;(}U3z=@eLqMMs9oi|?~Ga;iy;GK^`y_z@F(3zx+St^XvM3ls)C0$ zj=updW9D%M*W4VzhO28PRtP$a>ix`Gu{!xFXkp02i66!O9};G96qt5A2dp@Ci#*$f z>Fc9(e`@LJsew~R+C+UJ{iGGiT{W(*vfF-$&r{%N+F)}Yv>TZvF=pSZ?Ch(bLSucw zb;yDpKP;biAL&+@m*}%^MqzwApX!1YD>}g4*Dn$KJoa!nO+UwW_j*{kvehi`9OjFK zAXl|09(&T=S?B65zY%7^-D&zl`b`hovhPga)^PNQ%+a&6%^{(*9pqDmp2hm{zb>wy zF=O!pr&caetq>ouh8MHWvFMmhd(sUOS}{W-UL}qtQR>#GrT70zNLQb^biZ6HWJSQj zOZ;BbK^_*k+pPTyG+GgJr_j6p{>p%bPOV<{8goyHcZxfH;aSHKQS*lrNx}{6yQ;o@ zHJZ}Wp8HmS)N?T?gN=ID2(|TvI5TKdImc(GPp)96Z8>cqq~G*H+5@U#0ccY=%f;O? zb~Tp}E;@y(h=E7>qf*Dd#wXkrzrJYBv#ae=@0Wjk^6~KlmzTeK8ufafU1ihqSx-Y& z1W4{#x@#qm`00L!S^LDR*XbR7_E|o;_L51>)E{Ek<_2#5c4l@&^)KI=%2&Q?EPt|H zn^VIaKj(*fn0)x>pBw8F3jes&)SltfQ@3xvz4B^-^;Riszxu}f^J@;CJEH&bt)#AB zeW&d5YYE3srtg>=)BIL_YRC~b*jj*n2fjUyKk!xJaMli)*xp?Cu#Gvs0gr2b6k8m( zKdhOjIwvVSsk`m0q4q}0G*&a$^#_(YXUQzKYfiqBexoKsHRkcPLSQx z{G@Q$ig`>Gf1Vgd&6@pjw^L(V7gxwL(FGP?^}6)pop1JrtT?6p@yW+zAp@-tw#3R$ zUpS?rvjwaDc@lq#d2GJsJmaI}o%d&sp5JbFu-|<7<96x)$M`knAOD`xzw!Go_Z!u3 zo!{*IrC1jKS77(LKit;(^$q#@`}wbTzfZcn^ZSRtN4Iu(@*djxW%7<0m2BZf=O4N~ zR9zw#e{}Ap*E^!8HSJE-^w8elxaE`dj_9)H*k$ME2Ia1MT-GUf^!mi88rhXcuWt#^ zuixh9JaJaE>-B=wFQk6|DhuRln^+;}a^GOZlh-eUZ4#A2e7<;j@0fA@ZNJ>ZMz7Xg zn~J6^Nmuw@W0dE5T=}Md*XI2d4}M(B7u@?vyXDg~g(uF{GIL%wJdU?o^xzKbX<2De zt&pmvHg5tH_x_XW6YKnV`|Z;o51*A(EW6n_Kasz#&9>%Jq&MSZOu<*8= z-1hXtf4}9(c+Bl(-u`BTeyY{J{im8A95b8a)9;q%DCOnl6%ZNO`RiBJpMSsKXXNF% zWoK(c7B01Y`}QsG^0jNrHuqk;7ABS!S-$OTPBJ9Ym;?7o>`dClIp3}_X-i&qwe^&* zUp3C2bp6(v5@TP%;rY(aVq2|xUtWRRolmA6GafShzkaX%{OQRB5B?u}H2we9WBvNK zlJ09i{&@MsM+<{0A(pVo3YEE1T$?w4{QZ9awkLm~Sc&5Z(LL8UG zn&)qm__MqFVRgBoP0;g)&tG#N@W0vB9l5;leH|kxtU^OsTb&x)`Q;Zu)?!xt`C&NE zrt(mdiPL$W&I_x4KRGFEQ~8IbU*7iE*Z~aEq3q!_~N3nP1P5Vy?Z9tO60sh zDQr{sN8+%@9*#x%FV25jde`-Y*R(K}*B>7ruefrr@7px7Ep`BQ- zJ@#NuJAYr!-A3p6wVf*}PZt#IVs5(kM?z_K{ejQ*xgTG1FaB`(f5gM~|C^893(wh@ ze#PRAq^+E_d+*`x%DEdKr|y%)mAB%<1IF88#nasT z+T7XNY5i4?v!B!}K7HYov#)IFbAOxh zI>R-)+BoXg>?>PL7jIq5n)`Nb#`_HC5l z@{?L?mVI9hRf3l}CVaNCiIeNU|1V#s?w`H%8|lRE_wM_;_Ab7HaV zimlV{Z$0gO?Z&rBrrY`?n3oG)E08l}yB#mpZJVr?@SnTBG3BS%lV{IBi^_RHifMBAMM%|ATpth&8+t*pg{|0-qgyAB_2U(0Yn)Bo#N{teaPGEGeS8%w|a zFJr1MJFfgTPm@7G(~$e!yX7AHR`9(1v>~=t_~^eI<)`CxV`ui1=(g3L^J00v&b8oN zI7i}7DMd?ZlbYrUbMgh|>}70>j6eMRoL5E6{f?F`0Z;CqHx^jm*T=^!cuD`*lh+?7 zAJ2H1(Y9%;U?~5o39-|=yi<=CKB|*=^qE;;{`>yLtcn)VBJEdBrA*O!xA2{#Xzd|dw5|WL9l!Bt-}KxKf1hqFsLfmxwJmN_ z+hq>z9LdC9UH!g;&%}=(C~Pq`+i$@Z?H-YQ{6zT2%iik`6*uXwi}P`FPG;89*1mY@ zQqs52qH<-tyUUL*-1e<}?o(gi+yJdvA74z|HM{itI*Xd^-wkT^2tRy0mm`0@@sEGI zS^j)`T_|#Ied_BU73zolEBM^|RxD0yY@9Ao`$Fxc_*BK%zB~L)$LEHA@OkVw!&1C1 z^0VUEe?a40_Pn_6)xXd)meb0_1?)z<`m;dY3`TJMy+!U9?_K(#&-oI=5^3KmAXuESk zGPljTy4HC8^@sdVYHxV|DE&tHN8>*;_6Y5d{UtOn-0aZrUt&M*++n+T*Vban^Y%Hn ztSc_8IkdR%c+Pf}@M@2J9E;e$i2tnmK>FI=W{)#d;YkZB~&M8 z%xNF#dt~25;g5T-R=kllm8*8^JH9SF?&!Jc@kh^1&)x7iReHzX9OmoOk01J)njN-d zj(f!6%p(#x7dKRbA}yoWS3l}-VT-9u{FYsVQ-9DV$_wczporH%*u4^3A0-}t^= z*~3#)<>w-!6z}A0T^Gr9KOR2Q;V_a_I8o4GkC0T@AU5Yy<4#Of3%C} z4ke}gl8HNK3r^eZ>f0ymR6IxF^be`u`RiPs$SS^ja@WOkV^zUkr-c_@X1$5ocICB| zT={}+JB7?wpI2U~!X#C-dM z@9g{mp`pER&iFi0jX!v|BSYo?v);$Ew<+hn6z_Pb>-go%PLBF?HYT-w%oDGQ{Mci{ zH&4I!aAUaIg99&4S|r%A?(du1GJmc5BlXvwH_X$N_DS2yRlD~cem8ObD&;6;aCClL zo3>_}wD8?a4?dlW*jixt=GfspjA9kMm)YNqU<9~mnwrne7FnCi|^W_C+ z-f}Teg>}Mt-HR(H&uAQ}~3aO=buGuCr~K$@k%O zOhdz*P>YiDtnJ+29~C?-@7TSc-SE4~r>W0-KHSmeIA7>g(I|Gch%NSz`K1eD1;b{_`C!Mzzmr3z?(C)9Sy$u-k^O_?*6=)yxWb-3T$nK^_Hg{_<3ai#-~5rZ5 zR@^?vIO*qU!LRq!IqKfldK}-&x$tUA#eN&PdFy-Hf3M)QNHFExAL)NcKUwYJb3@^e zi>J<#ck@5+eev_@X(vY(#_zj|?Pc-+zL`ukT&D&#MosJFG^<%#R3lOKNC6t!!P zyFsA7cIlDVp!h62WBl=#eRhtFA)9pkmP5zHj~{sHn*Bz?mhbmJJFZFR!xW$XDh&w@ zTeM=ui8smn^x{t)e-~S5AyYs5Zdr6RyUiW{#PjbgwrnXlExw@7>fJq2_Jt4D_|3gv zpP$J7=>LxQ9MSzxx=#h@7_ug@q^xf?xXgIShuve-G$oUK=A{4j)$b)mQ@5>sc+c?N z%i41{cQ-Fe;p*aIwgoVDp&W$oiYOW{su% z`{v6Z@13!^#QpoQ?S|fWeP0*qow2yln)%z>sItCVhi|6Q-xU5u#brg$fAVT&pIR!o z>wb&AXGQJPPr@NnI`36~TjKGn?!l}b`gIMg>jXs?)xG=oKK^}wTzuNh{a4N|c=cjq z|Do#-mEHfB{K(45S+Z%@tPbY(!WnN5Klm8@@>0Hro9(aU3w!0OVt+5Vy;1$Y!K)*C zg{va_Y*-g%OlR45C$zL+@|B8}S&tX3>fOA`OmEes zj_DkGWR8}FUKCp@XZn@%&F$u3L&GO`_nuxGz5U;pUF&!4V!Otw_TaU0mh{H__pV`U zdk$V#pY{0odhhSQMQncla@m~tcP0O~$lYpk@$)kdl`Y*?vB$^g@AB-+rT%93H;5d( z-h1)Q4$IEka$Ad<^V5~T|LxrO{J3M`mF)X(Bjp>{N3z7sbbH|HpZEOfr2h)@pP!!} z92$Cbwt2qYij`HMWvo|BuYB6^%8pylC)x9sO4w50MAucVS5BYvOYrRC*!Smr&q4i6 zm3_+Q#!~Ke^Wi|jnwu`A$6qCgFOz?9=E`5$nKC!! zPS-B;xs!hAi}T%&e%l^|#EIx<#dZ9u`FqWIS!S*C!DjW4Y150}X5G8bv`^`K?1Lj4 zSJ(e+j(GO}|4z*i*7kS5G-^O(@Wa<{Z*RYH{d)0>2p;BRzOF}iNZ*pJQZRYhbYX|_ zEVbARCNF#XJj4GjOm7Np&s&psy>qD(^E8gz8zVB#C@mE1HsOt2k*UzCYtLKQ;>{GR zduaMTk$unVME1D6JQjKO)gG4*SGOGV=89Y8d%!zV*ge&EPUx1IYuB`{?_<=qk`R)W z^E>wS^__jSv%9)Z+1vj5`YKe`y+2K0huJ*Wf9^MTC{En6#YRf%-dB@s&V4HH&HvV4 zS*ZQvm&@cib8bKSXms++{B=)X8b_4Z%FNE|N%H*E2o?9CjICVs7_ucdVAfur!Lp(-re8tpP0CC%emKoXZ8x2wr<>X{b)?htOL(_ zEOq?mo;YRV9k$$8QK8gG`&{&fKXX{URX>!b>2ObW{qS_M#hl9JZI7lJwCw!Y{Gmtm z;Pl@o|LvG3aQON~J5cu9eb{zG9#{NC*_m6`+lp2D7~ao4^5d>s#Jl$g=Cpj2Idjji zu=3*bgV#?zRsZnW_Dt)Q7_HN%Ei3iRq_MXkMnus&v$iwjN2mA zc(eaS>8s8QON3v!$p)IgYS^_<@)g@#L8&dz<*SbM7`!~e_1I5G=+)+c%MGow7I9o> zTByj~!uBIm;(>O}^X~_<>x@5Ch2MXwtGlY6J$5szRYh0!Zk4id!JEFJU)HZ)#jjTwBy}&2gVvOO- zHogC4mC645(W6KG%cSiy7GA#LQJTvtKJUopue-#%gU?157iwke`J|TK5()Esn62b} z-Y=o>l*OO(J&B2zUX*{BY9O-yhvJz|=_7A$#DBD~WY{kJx6tyRvET7u4+@r;e`~K! zl)lUS+WGEL&Ew~M1P@<7V!OXK{34 zv-nCKeRU0unR|B!&pvqmYfrUOKy=}x$H&)gsGF+IQ98qz`dGp_h+8IcYE`Z3s2QP`Ial?RS6VcZZ4fZ z*J9$<_9pgz4IP~&ixxFqUmw5SV)Mt`$I-8(vUdKmXp85a&-tZzo~jU=E7@NENkUAe_t^I@9?#}W^_3qA*z<_ZSUpc*b5i}$zfbgc z$i44By>Wh_)h+h+!+SSc-{GFULM}r7)v+Gt*cnncJ5NrO-FWA=+-KWmJ^cnrIT6-w z?=PjhbjT?m{xYLz$?fNduRmN-a&3M0@;zI6T>rUSPM&j@r|wYM+@sgkXWg089x`qE z=Or6DSnJv&w})-9wRt16&+g)rJ14|*>;KGQt!q#Hp!#|L(*InbitWk8$4)VO#TKO9 z63xA=w?cA@``rUPrp(4HRm(WO_y(FAxQ5>6QDqjcxmA8N{_+CPBi>JzJy31c>-`?o zoAe_~>g}Y8yvdQhn_1=A^#iRr-+ot$dw;c}Gq_ji$1F`Y1NBs2n~<#$3$zlhZaC=T z?mBVu61LPY@#)W#I`-O4>yM@%dpzG}TB~RB2WwlY`$s08u{M=i|6}2qUguHI-*(YQ`!pZu-#NRof`ney32dNC~V zi=Dno3a&Z5VeTy+?rZ;Qet7M#khZ^{vFWJbnmyM2vksm=#=A(>%B$OZ>G5?@l|uhp z-J|a4HS5p(FZ(xqscg5m*N6CxY&*-8egsW-+jl0wIHP~oJkC{C$1+|>f1cYXxcPQ@ z>clc@v5YOkOQl-b&T_q;EqdKM%EP2_edYUu)2Gi`XL9$&O1-xA%N|^1*%x#4!_zfd zFCQ<}?JYCytvDMZ<~aR?Q<@fMVZfy$zOJ)>W@W8;b$xozm(y3ST?>kh_07$FD=+0f zGiB1t*Pbl#$u1vC56^ipJM7KQr*2Q?TE5x+SkupRU-l9yJ+}1|a>So4l~uw8ingQ7R-bNauDE|;lJR&QG`$-djrbdz!L zx6-6b_xgP9T%N}%sMf=qe|$#lTM5xc=RYLGw!OQM_JQy0`S$gP+!vXiDr;S`q2glT zDeu!!JvFwvBCgx+-LEtL%{cYxQ;|BQPg`?d7HXY3rJ<{r`f<@>qaTxg=D*y}wQp7S zs>uDN?Dkt;H}!d@3s$_Gt$4xQ(f7QFscmw|*WL@4%%8>YQoAv`G;!m)jT&b)OhgV( zcl;dLDPsCpNQMU7Fb|ced;GQQJLB1od+Zw|Iv<|GF{bx{s>w8&T5@ z!qv+bv7I~R^h_)Jq5hTUAt5G5Rgdne`8jF2e*C|Mg;PKk!#uHNk(<<#d89YHZT#A1 zX^(Zwpievc#{}_fb{w75N%fcrIv8kx6>srwTE(-qeFH4S%ThCH-3| zSfS37ocBk-=BTE7|77Mu+k5iQlkFc@EYas{uTGY~%YA!=T!ieab6=QaXG-0idGfba z;?CvF&vu`ckk8Zcvy?J2a+#lKT`IZ9x!dt}>wNzBsZXD-;S*R}F1F|K8TQ*o>-Mhx zX;t{<)$UpAkLYNfKE1QdbxYf=uGHh5eO~GXzHit~<0n~dxbQ&4EZ64iY|}(gl&t?0 z&lb|= zxlMRxx$gd>a$#xWkB4iHsl8R%v*cRtw5%y6fwj{?WNuKz`c=)FSDBsjT^##}kF`bK8FIU?tZ;{cc-XgMNe5m>Gu2Wm}U=RwybreU;ed-0tWY#dBxb$KMaMi}I!R z*2<|sOL+FB{9FAe{NVL&as3+`bUW7lZC{*rgR!zUxbA|X zQ{Z`)Qf6b8U&}bY^j^GR?i_c1O5L%!AIx7g%-^+RL)_-d-s^w9AIRS4aLLbUy=0B4 z?z-Q%1Z;Mt>cQBPITc&f>al}j4eF0wM~l8Vsg*cf`@ zfTJgKxvA{4)7#S~&y~GtX`_4J^tm3?H?BG(EoOE??&4z+^?H$XB0YwyjSh2DouIx?wb#X zd1}rK!^O_G4YiI;cxe4qLTJh1^|wtWH+(gI;GH%z_1}ef>3vet(ks`me|~j!I7=Sy zp(Xbdo|O6+yuBc6ym{RVsTrSoXNj%7S{iuS)M-I}*Q|Y#YHzI`q~GC;FRlG!7nETC ze{t=eS?98@WV6Kv{g_m;F8uOA=LOBX+wAh3nD3bI6og(s9O*0aHH&jknil8A@GBFR zN#}}~ZU_`eTDzceYtxHb@lf48x3(o_uD6?GU*6Z$#KgtTy>k8f|H|i?LBXt@d9ac@ zEMEF>m0=BQs=u-ePyFtpIX9+0)+x>CGhTR8uO-D=c+yk1H@zN3pNuMhebJmcb?W|` zXa9xX_13euJ$h$~;+nk{&0mE+>@sL>xRS|Y(pjbJyD{OTWU<)XnHN-EnR>Cre>^-> z*nG-O!{(0`KegYfvpp*NBc6GxFs(%X%_5f%sihy>m%V>~?8*r}pIf&%yKQ9+`!mk} zCYnUsB0ca_?-;l?z9mgW1a$^5tnc#YC@s_-C)ux%=7=@3_gPm*&pd z`layNg@b{v-XZs|E}478N42na`Xsipu2(m-Rwb`p&^Wb8K%2F6jmVXa!2*v~sHF65 z605s^y70>Z$4~E`O`Jdf{A~05CCSQ@eT@FrZhf$al`-6X^S@sjX6aoIwU773TJk0R zsA5l8cvI>9nIe@JyR_5uj}`u|(>p)UcJZ!Vzb5;Js_qJ(=$!J-N^HKo{{vU;!d-=I ztAm#dPOzF9x-$5_>)s;|p3b+K$GZG@*W$RvANu4E-r13Orc+j_X}$2G71K{|j4!bI zWz6S(ufM7^{no!cpPScNPut3Fym5IV=fk&>;%TR51PIpf@|z{R;EQF;y`J_U%=g!6 zP*UE1CSG{otJkkIDgq9CJggqEv&7WSt~+8&ifZfcqjSuXDVa;d$nZ10y!xjwkMrSnxzqu%B#rG>%5kM4vqitCoz z>@GR*{<)owbo#lhX!fwko0}?*6g>O(vUBrB#WJr`XF|db2QKJso+Q9tSUY|1B!OsE z-W<`^M;+6xu5mG~5xFvR;evBKtc=&Vn9{UXJYKl&_@DRx53XxqFj^O{Zf+ia?Y+0! z%zwTrjq6LVyKmGiX1bm4qik`!?}7}wQ?U%^*+LbS+np1n-|w+4R+C%1Pdl<}wH(V5U(xN;W*mIAByc_B4w<+8mnY75 z)jYo9-VK>ItzR4EeD2?$yK-Xe%stzUr&U`e$z5#Ze3;gAH}%Yl3uQe#W(ha=YTH;| zetK<|%a$W}sebb=o_#6PetQ2geXx4t#))mes`8#c5!zxa6289G;_TPsx%ZONs?Mao zIkNK0-<9%zfAKGf|Ihg4tvN$uo0`w1;+L#Xk332W)HliV{F zDje{OlNE2&`@HWzd*ijTIkwf)=FE|iv#~Q=qPtnQ`5gK zpF_jKCQX>&;NrrvyZpVHqGIEzQ>X0T{+Yjcx_?ydY|(VX`Zg~%Czk#=i(XS z_Dt)++40ny$<7}v3^}$xW-hcfV|cFox4`DlWRs^EwHwsKe%Gf&rIasw^ZL}1y>mC- z(Cw<~DqR=5Pls*eZky_FJ&ztGadB~Z*v~)Z#c!_m=XL!|%?k(ptTqRB z^e)mks^MkXb-#wcS$-CcsLs+r+-ocpx2 zv^aQqRc&qOe)?2&>h$TIB`<{*E?gKA67om$`VX1EGv|96RW4duEC!0z=h-MyZ~&5>)*eO?(G%aO=;^Fca#ws5Dj<-u)G>@N^`m-mHE#Bz#AJ>0UA3|ee4}UV9Es<#{`#H1h z&AsY|U%#xlxVR*&4>C1wv-4u|ozhaZ;>8wc-{rDeR&N8Y8oMPVbUEB_F{?WE#r$Q* z{zUg@D_@ztj73NdAtAGd<7j^C&y> zIq~NW&NHuXN&CkJ+uSNW@_YJ0ma21V4?iSw$=NMgvZTemUtV}q8E^2^DH}pB3%TwQ zX^GJ0IGX7exT#D zYFfWN|9;WON3KdrN*w(B&mSG_zSLgs=*W2S;>DJhmJQY4^YZTOV05UhwS9hmzPgRg zoD(NJHf`QK+tz`bi_4V(h+}&MX{O}O#%WVr5D1er_?5q8~ zByfps^*082r$fKjH#ap^e0d=V(yycAV-@E6y}P3$qwL(YV?VyX2)_S*`M%rV-~SE% zUHhi4KKqZI8JlkHx&GM2OXr{5zqsbSZ_3lD7g^$@Pqy(0*0A2)kocUpx+(um%Jbft zZ_dm*c}|DDEX{I*^5w>}l4fiCwhJ8$Z{*l#w{=NC@DHzwiiV%h)%VQ4dxK@qw55Br zH+`S(w%6r@>HjG!u6c`ml{)rj#ZQ*US8NdzoK&Cw-v8Et7>L;-1eQJWRTInXP)NW z+ocJOp5l8#x46o_VP!ib{-XZE>D8H6yr*PcIq2)zyz_2#;hzJJayAtX@6OJi!*Tzt zRkvov*4GWI=h*latu4q}-L`m-zPOy)t`&|=Ee%a zu&AgT99uR_6L;O4cEbCC_teZ!Ov_Gj&$tuzul*@vnsH73SC2s|}qe72Ubb zdiw6771w`!;OpTwPA*x&soZ?qu%?~Sx#^4Kme}cy(ML6p_rCgaR{@-$lt2k;_VnWm z44?h6Dqwki*G9AM)0DRD`I#9R2~TI0{;|o?aeAzmAzA8_kEH12BT$h-r7#JA1r}p=>RjagKy?$N!`$tbsvBgh{ z(&l8?SMhO?>yNC=p89^f(lg-F=yCD)-*Z0xz9F&Yi={nV{QO<>_ph!wH*2#}tx5L! zzLeTy728t$604_~I!11Lb7D)f`!ZX{ncrAqw9!aS9<-e;(uvO-{tP* z8ot#CRZf{6la{{B{$Kj>ji3HZQG1Yja+0x_@1@?yAH8L|->)=0<1f)${>S6lF}~x* zX%d_L_)@QR9^4`OTXgzj<^n5F3H5h|hs!YSho5sBo1{U?ZoB4fuM85p#r~RQez?rWSbJ^t$NwI?PMp@+ zd}jXp^^?oiq*We>T6U%+_1K4xI`b@=dH;Fe+?HwV*LRL*u0iWIx7Z(UmnY=6u>Em9 zJ;7|3+KQL67cI;0a=6cvS{uCOi|>r93$5*#0%v`!{gAaSZ1Ik%M`Uu9WkjNc_oRUe zhdX;pyFa*|{&3AiOjmlzvgXwn7~E4sm;L=Leh7AS}WIIe-cbz)r)zsV^ zedpV+udn^{CieuFmYROJy&*I>_%mb8)hky_s{clRV4W`qDt2T)uYCXQ@9!UX{@SI( zDzRQqZ~Mvh?wt>^MY7lRrQF^6F=wA$>)V-OEU7nzrewMYEMwXA=0@4wzFf&~IXlx% zPs`?;vrF*kT=tz)ru{LiF*P#_`twNh#!1A398DZxh~7$$q=JDRN(i2sADzntBJfD3-lR!coxvaEOWEImCZ**EnW&BfFEa$c=b1%J`1SciOiXK3PFV=jYo_UibBzdvL$5?S=1eZaRmCPW@7vo2xr@ z>Qqp9G+}~3W{bB_VAaP*tP>|rJo{?LEVq64_SI^)uKo3^%E-uwgP$LqY|dUk+AY4+ zG=7rO=VceyHZ?IRDJw_cQR}>8(z^S*viYRKUm`W0S^ZsIU3LxYmnHw%IdQ#z@5lES zm-qd=QvUm2ZOyy7{po*Z?aO;vT*tEyTvwg-H%zbmr4be{>-k`7Va~Z3XSSV@%sIbB zQRDKox7TxzUQqpXjmO$7eskjKt215VZu@-O%j4DMUGekN)BHo>wY9d9{+DM=wuuq> zIBDC|2}`6^UB4xN^c2`S?L*gOm%T18-S|DPyuP7tA^WobaAM(=*9r24yEdv{R<2LU zy1XLX#r;@oX+q8l$;C~*l7e^o60Lb8_r&(cZ+~Twu-WXd8TZf3#a6Y~xL-(WK&z^? zH~Sb=RhQ23-tAG7WRxiQ`@{F>Gdk|(HMY+mzkhq2YyVM}AG&ErW90AXq+f8nKS4ff ztJ7tNEzcfr-*wE#uibsZ{Q3Tok&(t7KZ5q!OZz1?Y}sNmY0{*MudhT!MMY(7tEODJ z67uTx>zf;s+56?~mn~e__~lDUQ&ZE5HEW)nnyP&^YhRy?E1nmKlJlCpM;xBC$hvyIzG6%G3V5bBiCLV-r|o_nL_YFlr3PDFL0*!1^vmM>ZHWOD63m8_hcC%K2C-%U#sE;u>!>2o!6 zM*YBDg%4kT4Eiuj-k$6IkBN&`gr6}e%r2FH9dJ4ms$Y9z`jhECwY9R>_2QF#53oI}`u+In_8wPlX3jf8N2bk9Y+T(gBPHQj7zr)x#PxJmu3BwyJZ2z^%&RD(b?44z%aY-L$EmezJTsUo) z+`8N+Gp$Q3%=7O(x%k-qP25JV{%u}6IKCE!1*R|S6T3Z4NA>$NUoS7Oice2CC0|bW zw5aH~!OX6qRpnP2D!M)Ye%eEq;$^E>B(A^ASA2Ba9A7W7t?oMt8a9GR}Ju8MDOZpzPl`L&MAJxRb3 zbhvn8Vq!~sd-1n7kuRGKtgUBn*kJJO-Cb`#Kfcb+&Nuh>&u?pMOWQ1~%6diU?*97u zwZFd!%E+8q=-giM?M>w7>Yr;*_+7S(fB5j>k)uZgqoTC#>Uq{befA7A=#yqF6@80s zziqUCQGRc4uZ(@&p2%I=#>SI3Y%ow#R<8W;;NbhV_5E`{2Pgm8nSAw99jH~^zUutl z_uqT&|6XtZ)zaQfP4}dJliJvE1UhD=_AD=?;6oi+?xt|KhyeT)WZk z#%#&o)keCX+?TzX>ay1=S?*qE;chDfwJSY=2i1CRWFFZd`)JDJFk7~qi_7k-`PSWA zpx9eg8oyQrnySw7eb1McI@p9W^>$hbkmyM5|Ut%1Wwd;)N`s*(=^)}33sus66Fm!gL z)UO*`Gkq^~JrxlZpE!H&;VwnyfYw*QMjv+WuD>T8MR3qa>v;pmc0p&>E}K2@`S#H z+xNqEULs#NS>9-uWUuO46jxoJ@@ZaP#JhJ*l@;o09*g1>m-XDqJhMR|aN*wtxxaYs zEYj|)%KUVhjkoZMw<~y*XX(GF%;U$7xoz6CDRNhluCsb%;_GK;-_-_&OqrgXo!vgG zO-;&4(aNeSBlGp5HOm^Cx&%~tWv7((1Y9;<*1JtG%IfV0v)8Bg^ov|SFQh-|?YdR1 z?W@GTtqtw46>&{XRn0tkvZ6e%zk8XTpVY1$rEky7JmR9It)-!*^{C*2-=15NNy}9Z zIGz{yE_ZiF(MzGJQ$_FWt)AXGP0S}W@Nks#bkF;LCp*Z;&$F-h``66=!*Bk%maw%m z)+{->uX5}-Xn3iaoqyKZ zKflVueSFTy+Z{hWUEiKFLO1t!`Q`bBVMc%NXNNs9i1DBOVA7IS_af^(K~|5;_wjdM zX4~}VQ9)Ro)Y(A)9FmSz5_iLWFMtz#?r8h4A`ST4G&Zf`}X zbJ4%RY0Gatnrh)B^HHkX|Byss<6e$EE-#NQte7Lwbo-;@4msJ5&ledjv!d>X ztkCr;*%xQO{I#9A?Y;Z5H*e1^xf?rE;^IusMA@T(>%U!Eas7gVb6bvi!UZ!>K3rID z{2^%B>nzq?Ys02M$6?uOO!w4!7kX-b7F)mQ{fCb|Gc9^2Z~VBY>MK{nfl_IMcQ<%d zd1FPcmIhq8;23$CK~&c{q=YB%s;OAy@fr1;Ukl7%p0eSseYWDI!RnJrH|4UdcC3E& zVBMF`?RH__S~ZXKM-{_`iO*)XwgrYkeMVX$ZG z%&c2CxJwJ(-J5z^Tz_Blde3P-fq_T8VyA2V|26HYv25k1C!DOT{SgV-$9I4ta7AZo zw&xaaUT#a%GfzWiDl9+Ma!qT-_MpV1Y|&*~!wv>Ia_S#0lex8b_UoB5@9Zx3w_^5J zo2at)SlxTGnJK^aPdL6ZamO69gFm;3z4L54V|#gGW%};N#oN^F(yJd=Z{x3fUYB<8 zX8Z?x^Nyp>+c%k%s%T$2woxh9X7%Mc9y=s`3j+;JO-*&beV^>IKkIeY$`yL)`QO;Y zmiQd|eZ}Kh_rcTFc~d0z%vvJt&r>%&&*l?1U*Mt@)88K47a{+m_v*hmpZ+(Ry;YGe zB?oQx7(Z5hAeyA*WzHsPR59Cbf8JD=JuP2i^%sOM(7JnFSNd!!UU+`N#T&jed_q%Ox3oPua#Es-U!tom(ESRpPvFJO_DyBhpuBd` z&?)q~glKFs%dTU8rnl*t9h3cd%_wEttZgegvy4AnI^^rho!)3QZ~vFa$G-Z2hK7WM zx;D2-<-PTpsd&H3Sx|7wlqmsmfd?;kaL9yQ-4K59NL*yc+yM6Dd9fb;yB$(fRmY ze_lXj5DC^ zc$u3@X3oyggw|`kKUS?@|NP@)C!1&I(vPTUr+t$>^76x8n`$jBqy5tg=PD-aTzG$j zIrniN$5-Er0*9x~S|_pZ%b9@d#*d{J>LvG{nXx?kjE-q;=BmI+c_qPDkGb;1$2r%l znyb&=^r>i3`MV>Yv8>z6)O^CHsjF&se)?3@)z!@zw{enW(b}0Sm-WuwBoJMi8&maF z;qj|bEp2Vr&9b_>GuN!?nz~F*xbDZaw~W~udU|T=*3!%G)z19!w>&~CE8(V_@0`34 zQP;gutBv+;<$4^o(qP$Cp~q30$v3?ur7Icr*6vS#>Qn7E*YDAro16Eq_MZk?%vkz# zq5;oz7vVWVriHe-2i`pSRx$TwTluN}iuo@)zt4=TnE$f3yhwk~X~cP+F0 zs{Hzr&5nZaJtkj&L|@eRyxlonKmNml7kYs=tvB@j6$Guys;g1RJI>ZIjo0cH|MJ83 zj|J|A-`X2@>3FtRO1RqFw=GBC@%eC=Cxa%LS|yBXmfJZul}PT1ogKeD)6ij0T=ITj zreAp>i@#fmR;>+wblkyp*V>88y&a;h*taZwtYyj8F15kpW}|fZy8o3QSOqp{eOqnw zgDI?2E=l*UcVVGv-M+K;zklvswqwVxqsjZf%-UaWKlA_Izoy*pg#FYXzTD1Iy?tke z&x})RID8=@4I^8>3k`xEuya$uF37_>J!Yea{J?a zd&0h7Y89_%KDw#%Xle8AF1~eIQ9D*-JXQ%vf46|~NlJQfVBo=zAMRRYXFgb!f21VT z^^$%ZXwBzyS63F@*h5#$l70kTJrd#W^0 zwFSx_v8bx5svJ9J^tArzhMd)XOZV*9v2QEavm&h?@oFFK)MH!1(tNa4k8KG$v}dZ( z@S_)~hdbDFdy!i+K0)z>&LY zJ{<;$F*^j4%eN+ntY8GKD%uu2UD45s=hnKT2XbdE+A3wf`txTs##-|gm#X)2?5SeW zx>VcC6dSgEX|aQJRbE)qt;V_>o81#OTXNpnU;f`-d|y`f>zmt5ci#LRyu7~{T7*yXvm==n zGyIR0O|caI&AV)JoORuV?Cwbc;-Rt0x3ac6d*5d8Z~k^BNcd{`&eg9TEK}OFc~u|B zzAG#{zQ1yOwlzB>BxFK~5u16iatv?p%w>xlZv70=($?10)lI#>E!SsScI)0Yy>GMF zBDVbNyTB`5`R$FQe%zi1H#eu}eEO6$XA{@seZR%#OJ3et``fItvNGpe?13Zyf3k6> zDvIU0T-5t~ZI#l8thGw5>n{4*teYw{`Syy0`zz*76oah=SY4<8ee7}mZ&E(w%<~yz9PTCupuWY|k?Dt*7a-;gZS0mIeuAp7K_$1%Hq zHB8sfUb(K$H!4c*A9w$zf`fwR=I(Va{hFPX6<7T6k*(NI`KfZ-t(AJ0`)jXQoxNb! zFVl^Nkw1Rb$kn9ARG&E7{e9Nn`O~JkAKTh~w(swiy}F<5Pd)uo6Sr^8(luM!W=xK} z^!VQXy35z!=SS~&!14V2{ijE}&G%G%Z2SEDJ;=6~&$YEyE!y`_S5@_@OUv?qPXiP` zKmVESwohe$#5{4)$)(EewblF^iZU5KKmYZ>IA76wI@^ZK$7W@%Ey8kA2Y*e?o?(%t z^Z)bx|Gf_0;*IkRvu?T7tWRyo-p!}msY^vT8v;t3aj#m*{p(iT0ompyKAl&0aP zsY=OFnu#}~IHOq^{r>;bPvVnZv}H}tr%#{K{w`0MQnQJ>&I1A{$I6vwXo^FwJV-|YA$w(iEgi-WZHMUF7eety@)r) zhilHeAJ7i@AA97r?T25fr>#G{QtqwNyqvw)$UaxlKjL)T{jD+0zdn z5*hos<%5HQK9xRred{Xwlc%=o386aK*N+89MEDg2=`9y3($LXKKMUGm;IU-Kj#OkRHu++sAAiluF}?AAVpdk%X6-LE zo0IKJ^V5U#KEH`nmA*D#$-tmd-Ct|T@xO9EygJUSX}=cKo;E+_?=BWD?$egl-^~7T z_XmVucet`pTPLnQoADC1T&tXVP0rcmpn8b9Y`Yd!LJUL-zG~kxaIC zLR~LBRob|U@7$_e7OP(y`ug>)h~2$n)w*YKadM~K{0}&Wa?cL?pR)SDlGo`|OSq%w z+esd_l8-NAS@Z1GQ|(1;i)L>xdiuyU>-8%QZQZ3GJ|@qzt8{ue+3B3xytJ1;PDX4C zOIx(ZLF!{w_~Wm7XMgbRart2Sie2?geL&K#O>AZV|Fp?^PXi6)1qM!B^CC`d=D%e{ z!iTS)sZjLe+_ht_S>m;qerN3Nw%%O6+vs;mc-q`o*Urds-u>9|zOTBb{LZ6YkHv1w zw$ISJq4q`TX&H}ym)yri&sa-KOXt7&%_{G9AZ~9JsAqW8RW;@A{!@M0r)N&JVB5Xe z-mtXZT4?JH6)%Dpv8_UwQh1>?A4u!Xw$;Y=5_{`20DIvDSR$#q!Bg z_W9Qm4w%WhwaiK?T_c|z^nAh`;lqpn9DmYXEo4{wYs#igMsa&8KGyTc*X?UxxjsMP zahuD_>cqsAQ>I=E2nuq(v9A2$Jl)xoIXErb*Y|TwV`3JLcv3%wwXS{X1(6L}-!?zc zP6*ZMm!G~l{X6SL)AFT35fS&^+?e)m?V>-bf)6t_S-F#Qc3f-Cq6w^-TKT{r|u8MM7CLR%S0=lG?GW&+z~1g~wf-gVR<@KTu=U+Zei~ zFzDJb&shG|W<_gCN|!F#GG);srEl!)#*5$bTS!SgzP48T`sK@&KVONikK4Ow&z?D; z&2=FmE{TbXobLUPZY~wxe7r}|R=1b^=TDo84-IE}corQx^ikflQFATpjP0SxN!g-m z+r+j`o^U2h=Caq$$W?_`_`7<3I8GG2uWj(Dn)O)i`V%6ojAj3Sv3tAqKdm}e>gDC7 zp`-KX(Z;EsYBT@6eAKp5tGwS^@^*M1(B3D# zuJCR_@7q3aAM-iM)ej~cb!Pv}3<2zF`n-9$E)|ntE(>; zh@YRaE?q>R*l6?3jk@=5M_)7DxxKWJ6IA#7d)457IK1|6`&Nzh@z)=|7CzgzK%}U6 zeo**zhq!yiO-<+iK>U%6r` z$gx!*BWtnR6}P|ztxXQns=l>Tw(M|amZ>mNZEk9oRsyNl|| zT-`Er<%%ObwYBTwce{m#nwoFgRPgpPw{#<$S+Si1 zoBuO(AD@xDbk*4-*Vb-)e`Vs*%gZ;Os$#P{+@82TzvXCo?h#`t*P~ybCB2yBvge+^ zX`e{*^^W&XCI9WUN!}NJWK%Dfnf;d3b-Tn)F8BNRW8(|`)4O)<5(^eEI;nE``tRRqPW! z$G`08OBZvQr0NZ(cl%fK2d`ZB>+PfJ48BBOUfwI$u6=rSReROy)tb7x3qRaU&a*x9 z?9yBjp-ue7FQN=~>#=Qm`$y>7@-ykBo7A-@+e8%JY7SkVzESOFH?Jo5jfuM^?R^<- zId5aX@y(4fduu0Jf6trvUt#|7e)-RDZW?=ec`bQevaj;98&`L{?x(GZe>I^+$le8e z{;)1w_8n>#H)JQO^>TTx`?wRFl(Mp4b4G}seto@kO-$jZ z#S_=}-;IvE*_~z@@i0-|ZJ*c=*<;t$XDxV}Zg)e?a^0#|qK(;)m#&|#XL)Yd0TwYm zi$i@2L~3dmMecba(Yd^+;^U*U@qD62_4D?ByVWPX?cIX!6AF3clMfzjz6jcw6CQs4 zsP{`ANlUg+S>-7$yEM4I&W`lFEugB)9I};nLh$vai>KMi-Ey_9^G5ZEuD5g^?X}z3+tM+wY|#o z(qv~Uu0J?s8hbg_m`&+YPe1<%jPo;rOx^@HkUpL*k+ zNB9!c<_K;plseOM`Jm-O*>#+0J5);!*e(>#F~FJ<}-J&WTVwVSy8)OSCq zSj5eD+&Z~@kFp$RGso_2UD2(PSFT(Mh>rdp`8D2`am~Jc`y^XJr-TQE1^He4oFr$n z@BCTz$do&~k1XAt?zy*iR`GVf!gtp+&)xTWa_DV}-hE5|w0oj?&!2z#@Q|5H-u|KI z!{B*#wO)aNf~l#gA)%okKRxxnx2MuMHa2#1^`GE}*^k>?rs-MUJG0O3V$AMu6ZY&r zAGy`2ZEN=9%1=w0o;-;;H)rS3#qOzVB6U~&)Y4j|WcYEJh=-K4^v$iWZT@lh7rlEU z%W!SI_m7+(pT2fJyS8@ull%J5&dq)P<5vxb`}{rIpG4bKhn@UYx;$dH**y3DQ%jEP zM%M5&yjZaswAn&BvVZCAd-nfZxxb${RdwW)sCwl7cOtB;OJjDG#B)s-e7I64vZiOp z4(Tb=_x^x3TH5sW>53lk4>!nX5*ohRQ`EG`P|mLT}j;W*Ef${Qp-jSq2vFW!ZDDef`Ay+D4D8UEAuHD}3VT>iOZ=Sa|=W zv2SQc?d$xT+b+ys9ln0j{Q2i6tNYh||KSx99PI4m)Kud5Bzk+E=XP1^vYs<%d=@QQ zw4>sqQfFsp%+8`#VRgR^+1K@igoQQr^q&3r__(F5ZPJt}UygoPob2;Iv#3+DsdkOv zwvAFZj%PlW$nWspqq&arZDH^GhU^;mm`6wY-gXq{sLx5VdRVeaxKG{sVZ|b0K6R^y z1$%^z|L^~H&U)7=qu00ZN4@WvFmKL1?^~Yj9adUmSzH29RsJ5VEgKV5vhIEV^Cv2fAA(b!{5|%3`?aln?Jbknq)d#- zeqZ~3_bT?vP}>u$UY+ZH@4ETpX;m5f(jM>WdZn}e?~1fK6@EM{C0g}N*49fmZk#yU zEpA!=&nErcoQGdtUjFv#-&%{xPb$m(<}O;eu(A00xx$BsSoPxf^<2$bx^w5uY171_ zqND50W|z4?eVsPb!g0m7nr}D1+gk@(q!y{l*Otuip1$tFl`CiN`R_|U^@QtpcHXML zla?(@J2yXn(XwapHCx}i`_13?W%iTRxdHW$kNMBAc=){Ni}(E7^K9K)F88JDZC>}{ zvETo^*Voo(WbHb2Q~F-njvehPLW}D032mbCn_vn%B9NX%d)23z5 zu_&B(C{_MW=}Lj0rGGAd3XR@9^U0ctOO7u6=;fp~``ViH_s6Sm?5nl@nLKY%_4$7* z&N6D$GEJb)vtx0J~_XA+J7tOV8XTu`J9PcZXL;3E53MZTu%`9A=9AT zv?Zr}_FdA55npoUW77RNnLlav;`%WQ)~)LkU4K^XXpWNeGPTRMotE{t`uKB8y2)SK znif<#Z^;WA&q*&kN=ub~?vp!H@z7Q1i`1hfS&x>!eI$Co~FBa=gyhg*Vln=1J26I+EMV3iNV#?^~#kiASJcGOjuc2bMEdEU47N7 zw$_%FmGztUf+HP2H$Uf`U6Yz`G-3PA?!f3j6-n6~$=k}3&rHkfxp`->tXRk6lm z^H!r(W>Y5SUTK*WU#njky6{P8>!fH=FTbaIpMYMniM7L=csEmM<{mfl(N@{;b(nx96!y}c1@!`8*@{M3EutNcWL z!HM?5^A^jA&Nu%U z>>3xoIJ57>7B>+$`GvnyKRIW9QM{|)a#5;ydDryVJt1kILexHqxPAIMFGcgoo>@~5 zAI$$&{O(U>pS=CKZL_479pO>lethqenLH}HygT1N@>;aIMP=`_FAEsvRlE^=w$G&V z`}Vzur~lrU^6f~cOX*MTk6FSS-(@9EzwYa2%2&2IbWhAvmz`R<9FI&7xSn$mw``7m za%890i7BfqA1?g8a_y=o_v7o&KA&G-7d<_v{?Etbb6164Umu_T|KDE|bMxY7XC%3} zxi?0wWiT-{-I#OJ=-hmJ{)VersW&&JmfZxc3s}4T-lJPvv$ucUE2jKxzpj6dl*7Aa z4x7v*PuzTR@`P?(&n=-NFLV`cHZGN3Y|h(1Q3*}IH4ZL|Jq%2auE;ghg(_3f*y zEvGWw6uoi^@nY}1wDc>ko|?rp{2U!`lpw5#p@&ROOAJ|Jvw=g!aKMoPBbZ>H$XllrOR z-~Y#2_?X?{BZmH;&ve*4`t6!@?ZpI*D;c#-0ki*3l&b02#$xF9UU`eS>AY{N!uOqW z*>}ogU9Zg2Mw#ADpQV#N)>eN$FKgX8xp%o=;fveNZ*J|IJ4sYqV~$yK>-oOL39qz8 zbafNFLrv$uy?c71^8LaeCj`s>K9)aIUuUyXPv}v~uK8P~ZfnKm8pknlEsB}S^GYEu z*TwR5XW5iVi>?`)9XRw#)w}Zj-tRXzr=Qo4vo2aaWy+L-H#auU-k1CT-`^|OuHBk1 zZ(Y_iY0@OW^QTYU(*Ez>FSm5jqDSVnHHJz5W*e7%R&d;x#rxz+)uinw51lyM*mFzf z%!;#$J$FP7owz0NDckA9`j=_dJc{dgN$(83dtxPz;%=jsH(dgow00RT(rG!fNxOgVWb{O6m? z{y$f)>$}XmJToKXK}xOd*RNl%%omcYU-i4wxt(w0>t@+CGd{DO|K6qG_(*ZhL z-@Eo)(d|rq^06E#55HUn<*Y9$*Jqqu`&G3*nBnK_rW5x?eCl!yDoqbQ3FUqg#y&Y( zG->*}HC+jtw3;LX<$Tg+I#gvEWIk2g^CgaJzU+;&8|C*szq7OWoA>tjZgnrWJUx5Q zeTu%|#M=+@PKJM;s{QBn<@1%r2aSs6*ECMl-*cu|f4|$i8-*_F%Py_1SK+t6HhlwQ z^UJ&XJaf-ATuX4v-L$~u_rttx9~Ss4B-=8d2$!(xp6(^EK4&W~dcu!qg)ixzXvnXcKr4Dp6^>(X=z>lZpqG_GY_}(Z?5@S^!xRcsZ&c=b>-gNwDhvUzh`G>TNXTM z_*$sG58+EMdQg91lnHZV3Sf``slENkLW)E#nrL8tCp6{1`e0uQwkB>k2 z%VYP|`Mz0u_H}u|)s~JE^E-E6EZbA|R_gb+zq4nqKdWw*ZDQ%~yP)7|71zC}#_jn6 zdh7BmtSq@Lc0YLWrfGFZqffR=<`>7*Z_ZiY7SEn8pIp;?B3$C_rK!tJCapHQp%tgL zNyKfF2%DQmPfvivi7ApN0;En}sGg`5Eb#uF-=f{tGuiS#IXg?1-e-Qo+B#w3H?^Ct zPJ6n!3-#6=IkDx)sgk$Vdu;M=n}dR~)K ziiVf}%__pEjmUVVx8wNn*(0@oR}i@M2fj+E@$hx7N2ydybo@f-<%V_ zIVWv;koisZzJ5#1(up=pFY3kL^lIi^9J|X+gC|9cC*=h1l9RkkPJLaX(X(Wgjc4F2 zk7-#Rle9gjXnRgM={Y6KbAoh7_>0cTFI$3p-)Swfwc@|dpBt^3=zim|=?UMH4&ggv z_uY!>op{ddW6>mmhboB+CbulqGZI>2G_Pujy8PQaCr|#Wl9H0j$jTBbuk954ykBMU zD&-TazNzo^@=x2^xh5-r)9Tuj>$XjZed=B|)&6Gazm(8l#)}TkKT}k1bo$Rp9d3oi zIt^cf>Mwcy@znjOUYg8sQu>c)+D`uX0H ztxH>^y;|AIPH=O)0oUSw-ux$3#zoEMT+JJ5Li08$nEza4P%-JD{2`6mB~MrO zJh^rB^o5;|Qia!t>~xHnr*(O<&c(@Z604`Y@SG&!G3k}Zl&lukRYJF!LOp-0-pqY_ zY~edEYuV?!7sWjN)^+{t5$_55opU|ZIh*IE9@$+zK{YrabW2~d{htFbgO~5DdHL!6 z&z+iXJu|Fl1cnNxg#Mfyw^DiUC6~0N>dLEXBmz?tU6wkewYHuq;+A|WW^_tt$@EAM z?XSvfuQ+9Owod64n`9p0aVtS_{*Oy1)~4xp`rM*_nG!E!BQ*S@SKs z>$`r^qu)1=tbcj5dHqb+pF)B=W#6^c)K4r-WiZ9J&-q(DtTVj8L+si#I!o9i7-@5pUsG1!DeL-p3Z@9WU8i#LV&l@w%L^ae&bO@lWAXLt*Z-@Z+a2lnX`Gsp%A&mLkLT(u z6T=c!7GLslTWUUY>b{h)ACm$fdb{m(sG6ytxm0X+$27 zcvrcG{f;?Jw(E@wFKa9cw>$E;*tEjG%+2_n+`scbH>V2<3jWN!)4T2Q(_?O8db%p# zPd=9ro`3Sp#QOAyJ&``uKT{XA@hnY`5D7Z(VB@oI$LyMq233z&eRWy&S%~G#lkQU~ z2R)yAF7a3JpP`eY`Q=d0^h+Moobp#!ZS4+^YVQhP72>~X%i@}s9#c53v#NS*`F8fJ zp%CxIcXP#8+%ms@`&)(UP7dR^x1X*S9$Q_z!|svz6YWcZhXTq~H|m}9Ie8}G{k^?1 zmPIX(kN01`_3N{B=+O?r&&SpG8#SHrst?lMvLsBxW3|D=xQDK8t>!PE+AW#>dqUVV z@2HvlE0^vod+DY5QL(a_-&4BALr2Ub;=OatME*k8drv~_Pc6DT`RBhEhJN$bY>$ts zUHDRm{rsQqPk-}2KDl;~C;IjA1}9-bRyQRs9v2;Bp{rtpvQzIFenp%&dvcr`}x1@|iB}G5xjm z7HQsZUE!0~K1$uMay!;}&Jne^ZC&A8s;gIT{4A&6`gWZgYjaNSvG~hbJq42l-o0?# zvDo@ypPY+DmB3Ri^+PV|7Zz$;}b?uP|mOl8(|M|zi7vHb6k34^~I6Y%WL6?91t%KU~&x}g;>Q6k) z>!N4OaVa!GA!p^hI`1!EB9|=v&Sbh*Y}L!HF23)bcmuQlc<9&nEZ=_Apfud>^Y?uR zKGhmW{y*z`M5=eig3UUz-Fsh4rA^OLGlQS=?&pG=Mi)?Cw;v8b5v$~QV< zLxJXHb^r83J2-9rU*Yzt_@|n7wqkDUXR%MmRslMkBb zUz{CicQEC2@3zUkxu2Gbx2$$vZRmQdaG$sTq_t;fBq;kW5?seqbX_1)Tn;?E^E|CTkzar=IW%UO0l$-he9?DG#NW!vYkf8LJa z{eCV)$jI00LJ0q#GTC@P$USpU@#$)fUStfoCt=>e(CXVp$K#-jUD=HQaJK zeun*9QM-G84dZJ*vM%?ZzmIvp*^v&x&()Ko6;Ff*&1_o|Bztmc)gbO)t8iE%dJT>f8(AcVF6F?#(m4%Q5q%(+3{$re)T`AG(C=g6Dpi`=;Z( z3j3b;q668BnCA)082A?)u(`*0xtmWSS5*J+=h%xkwc=i-?^;k5H3w9s>%Lo76FGa$ zn|ogkg_oUCsr|CKXRg8Ao7`NU96H5BBbhz0LXh(J=*nRp(uQT0gFQ znR9bftE_eTpJln<%RhNd{6Ak%`I-I1J6#2rPW|=JxjG?YmFh|t_n^*sON5v`rF&KK z3??Qhue;%Lr%Jf+wa<|?#zMgK>lRi5LwcJ1L7qQIZ z)|1nM@2AV$e!ALsPmZqp-{QB$ak-zC)_8&YuaDm4>}a1hP3+&s$MbvY(wGhhZIb-@ zg=Jgr{iFV+>K(n_4ofd9PdzzNGt^@#SIpg|J5Gmsn5Lyv$v<)9_L|)KKXA6htGE7r z*Sfcu{d{#JYft9U)v$G)l=t8>=UZ4 z-njPCRkfJfUAr#c{&r)1xAeqwL2c!G+y5L0$XdPX$H(LH^;a{G_o+|0rFZPF>GT)> z%rAa)N(el3Ry7Pw^U|6WIJ9v88!&WL4OJEyn(^EUYs zy=d9_B+CUjKaeAD=xT{`Zx^y{Mw?Z0}zC%}F`K9sI&vr;*Y5(T$zO z;%Cnus<~XOzo+Bo?IxFXhnyEWF1n_CamIvKXHI;%ccORSiLZ7mzU=$s`r1=}v%V!; z{H5GaQ?<k%CDbYqWy^N<*Vl}{Nmlq ze_8FgxSV%(LFo~_ct1H8Ym3k2d(G#+zxR2y$|B!gvu4k}xha*q_}Q7nS65cndp$cd z^YFE`(bjK0gp{B8sczSqbH#|8Q~K(W{0jox9i3w~PTP^ByYcnbBkQgUZuax`nb=oOlIKo3x0o zc)35scfV@ZFTJpf=@Yx+xTo6eb2ylse+m@9?$5LvvtOUB-PkZO4rxtM@($gejJML*&HT}`a{av3_ zm5QwItlcg9UEac@=$!DEE}3&PeuPNr$3DvX9J(%k|G8DB*_>Q^<8Nf-f7*I-ntsq; z@u0oxL3`DW7MpV|)~~->CAj9h%IOTn*k$Uz*X$l&U3p3M>O_sJLie{>Ty<8s<$U+& ztOaHti-K>h=a9OxaIeLIYjHgr&X%=WZ|4rLmrm@H`%+%8yuWuJ-`v%)vM+DD3atMZ zdq?7hlJd2U+`)(0H~hc<|KHX4)6=GjmA$#)SXpTanj<+iRlDBn+#E}1(BMnin*~dk zx=ztIEH~Mi`f$m#sE+$9)bg5V-ALlycvLFs8n?^(%L1`W5`RST9=?_(vCHl7g{x6* z>#iB4Or3Uc^%j@4SBx@R+Z?q`cxs{#H$0V6nx5TJ;qB|PaMp&@tY7+}7xO#2_IZbV ziCwekyOL_Ze#oaAOsxI;G@noWStK`4{qaKcB{mk}N+G+`stf+Ve)na@Q@0nZ*X`Gc z`=@Wcz5DtSzDK5kGd>Hky^(#RF8x*3&n)ZM%_Fa0>S@f|#lBM`UP)>D@w=;P=GsJ_ zZ_!*YFni|l6O9+A?B6(}zIIFd-}w5&yB2-5xwG0n>b}5~xPK>j?Lf%t#PlltwH&^)A=KT};Lf1DnF@cWFIod70v*6*O`IEe->jlQg`#U-|M*I~jK0Y~E z%FV0us9Ky>(zVqcaqH85SeYK~zQUs&WL&cLzy#B*wl&ubDyFs_Tz$o5?Ufr#yw4uk zewC*p+INZXjziN|a>g%HTI1lle`!<6*T^+Xz9+Hn71O-6IyV2*3(NRphd-y-{Ag?0 zfA-@8#@Quzzt4(J|2XTV(+M8&rsdp^QuEFCy=l2GqOLP}?uWTo^y254hwXjy=<3d^ zE9#aluDIL$=KUhjD6d%g>Q7fMT{`v7cD_O0q0=_TbzGN^`=K>@ z;O)A^8M9|C%+qSyu~OoVo$t8P=6>f#`tSReUL55Uh2ANt zUUEI-sQ%`dEqd77jg#{@~&P^8CpZBM>g6G=l>Gh$fH*Vc3y87y= zJ3EVaR(w=SKR0LL!i5k0PtG(>2Thk2KRRuJG(lzPiYa? z;*4Ilq`q-d9jn(b-M|a!orlz7i{#=p9&cndlB*4NJO49CZl3zXh2| + Copyright 2017 Thomas Binsfeld + Copyright 2021 Andreas Perhab + * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ + +.test-ribbon { + width: 300px; + top: 25px; + left: -100px; + text-align: center; + padding: 10px; + line-height: 20px; + letter-spacing: 1px; + color: #f0f0f0; + -webkit-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + -moz-transform: rotate(-45deg); + -o-transform: rotate(-45deg); + transform: rotate(-45deg); + z-index: 9999; + position: fixed; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); + background: rgba(255, 0, 0, 0.6); + pointer-events: none; +} + +.test-ribbon b { + font-size: 20px; +} + +header:hover ~ .test-ribbon, +nav:hover ~ .test-ribbon { + /* Ease out ribbon when user is using the navigation in Odoo */ + opacity: 0; + transition: 0.2s ease; +} diff --git a/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/src/js/ribbon.js b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/src/js/ribbon.js new file mode 100644 index 0000000..67a4571 --- /dev/null +++ b/odoo-bringout-oca-web-web_environment_ribbon/web_environment_ribbon/static/src/js/ribbon.js @@ -0,0 +1,62 @@ +/* Copyright 2015 Sylvain Calador + Copyright 2015 Javi Melendez + Copyright 2016 Antonio Espinosa + Copyright 2017 Thomas Binsfeld + Copyright 2017 Xavier Jiménez + License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ + +odoo.define("web_environment_ribbon.ribbon", function (require) { + "use strict"; + var rpc = require("web.rpc"); + var core = require("web.core"); + + // Code from: http://jsfiddle.net/WK_of_Angmar/xgA5C/ + function validStrColour(strToTest) { + if (strToTest === "") { + return false; + } + if (strToTest === "inherit") { + return true; + } + if (strToTest === "transparent") { + return true; + } + var image = document.createElement("img"); + image.style.color = "rgb(0, 0, 0)"; + image.style.color = strToTest; + if (image.style.color !== "rgb(0, 0, 0)") { + return true; + } + image.style.color = "rgb(255, 255, 255)"; + image.style.color = strToTest; + return image.style.color !== "rgb(255, 255, 255)"; + } + + core.bus.on("web_client_ready", null, function () { + var ribbon = $('
+

Apply Field Style

+ + +

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

+

Allow to set an additional css class to fields in form view.

+

Use case : you may highlight some fields for training purpose

+
+Colored fields +
+

Table of contents

+ +
+

Configuration

+

Override _get_field_styles() with a dict of fields list per model

+
+class Base(models.AbstractModel):
+    _inherit = "base"
+
+    def _get_field_styles(self):
+        res = super()._get_field_styles()
+        res["product.product"] = {
+            "my-css-class1": ["field1", "field2"],
+            "my-css-class2": ["field3"],
+        }
+        return res
+
+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Akretion
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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

+

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

+

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

+
+
+