diff --git a/README.md b/README.md index 58015aac5920..3b164140b410 100644 --- a/README.md +++ b/README.md @@ -33,9 +33,9 @@ addon | version | maintainers | summary [web_editor_disable_chatgpt](web_editor_disable_chatgpt/) | 18.0.1.0.0 | | Web Disable ChatGPT [web_environment_ribbon](web_environment_ribbon/) | 18.0.1.0.3 | | Web Environment Ribbon [web_excel_export_dynamic_expand](web_excel_export_dynamic_expand/) | 18.0.1.0.0 | | Export collapsed groups or the full tree, based on its view. -[web_favicon](web_favicon/) | 18.0.1.0.0 | | Allows to set a custom shortcut icon (aka favicon) +[web_favicon](web_favicon/) | 18.0.1.0.1 | | Allows to set a custom shortcut icon (aka favicon) [web_filter_header_button](web_filter_header_button/) | 18.0.1.0.0 | | Show selected filters as buttons in the control panel -[web_form_banner](web_form_banner/) | 18.0.1.0.1 | | Web Form Banner +[web_form_banner](web_form_banner/) | 18.0.1.1.0 | | Web Form Banner [web_group_expand](web_group_expand/) | 18.0.1.0.1 | | Group Expand Buttons [web_ir_actions_act_multi](web_ir_actions_act_multi/) | 18.0.1.0.0 | | Enables triggering of more than one action on ActionManager [web_ir_actions_act_window_message](web_ir_actions_act_window_message/) | 18.0.1.0.1 | | Show a message box to users @@ -70,6 +70,7 @@ addon | version | maintainers | summary [web_widget_dropdown_dynamic](web_widget_dropdown_dynamic/) | 18.0.2.0.0 | | This module adds support for dynamic dropdown widget [web_widget_mpld3_chart](web_widget_mpld3_chart/) | 18.0.1.0.0 | JordiBForgeFlow ThiagoMForgeFlow | This widget allows to display charts using MPLD3 library. [web_widget_numeric_step](web_widget_numeric_step/) | 18.0.1.0.2 | rafaelbn yajo | Web Widget Numeric Step +[web_widget_o2m_attachment_image_gallery](web_widget_o2m_attachment_image_gallery/) | 18.0.1.0.0 | victoralmau | Widget o2m Attachment Image Gallery Widget [web_widget_one2many_tree_line_duplicate](web_widget_one2many_tree_line_duplicate/) | 18.0.1.0.1 | | Web Widget One2many Tree Line Duplicate [web_widget_open_tab](web_widget_open_tab/) | 18.0.1.0.0 | | Allow to open record from trees on new tab from tree views [web_widget_popover](web_widget_popover/) | 18.0.1.0.0 | ivantodorovich | Render an icon that displays the field content in a popover diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index 3ec909679fff..763993242380 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "odoo-addons-oca-web" -version = "18.0.20260224.0" +version = "18.0.20260501.0" dependencies = [ "odoo-addon-web_calendar_slot_duration==18.0.*", "odoo-addon-web_chatter_position==18.0.*", @@ -51,6 +51,7 @@ dependencies = [ "odoo-addon-web_widget_dropdown_dynamic==18.0.*", "odoo-addon-web_widget_mpld3_chart==18.0.*", "odoo-addon-web_widget_numeric_step==18.0.*", + "odoo-addon-web_widget_o2m_attachment_image_gallery==18.0.*", "odoo-addon-web_widget_one2many_tree_line_duplicate==18.0.*", "odoo-addon-web_widget_open_tab==18.0.*", "odoo-addon-web_widget_popover==18.0.*", diff --git a/web_favicon/README.rst b/web_favicon/README.rst index 915a91a9a6f4..fdbc9b592c4a 100644 --- a/web_favicon/README.rst +++ b/web_favicon/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ==================== Custom shortcut icon ==================== @@ -7,13 +11,13 @@ Custom shortcut icon !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:fa990988a68288b8264800bce0451c78b1223106dbcd4996b260a5e9743fc460 + !! source digest: sha256:298837fb4ce178618580cba6cfa0f6d5e1d3c41ef4d05ab89807f73255c1fd26 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github diff --git a/web_favicon/__manifest__.py b/web_favicon/__manifest__.py index 4f55e4a7af8c..a0d7c9a31d57 100644 --- a/web_favicon/__manifest__.py +++ b/web_favicon/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Custom shortcut icon", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "author": "Therp BV, " "Tecnativa, " "OERP Canada," diff --git a/web_favicon/models/res_company.py b/web_favicon/models/res_company.py index f0f468ae53ed..f40eeb6f3ef4 100644 --- a/web_favicon/models/res_company.py +++ b/web_favicon/models/res_company.py @@ -72,9 +72,7 @@ def _get_favicon(self): website = self.env["website"].browse(self.env.context.get("website_id")) return website.image_url(website, "favicon") company_id = ( - request.httprequest.cookies.get("cids") - if request.httprequest.cookies.get("cids") - else False + request.cookies.get("cids") if request.cookies.get("cids") else False ) company = ( self.browse(int(company_id.split("-")[0])).sudo() diff --git a/web_favicon/static/description/index.html b/web_favicon/static/description/index.html index fa620bc65c68..f274f76d1a9d 100644 --- a/web_favicon/static/description/index.html +++ b/web_favicon/static/description/index.html @@ -3,7 +3,7 @@ -Custom shortcut icon +README.rst -
-

Custom shortcut icon

+
+ + +Odoo Community Association + +
+

Custom shortcut icon

-

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

+

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

This module was written to allow you to customize your Odoo instance’s shortcut icon (aka favicon). This is useful for branding purposes, but also for integrators who have many different Odoo instances running and @@ -392,7 +397,7 @@

Custom shortcut icon

-

Configuration

+

Configuration

Upload your favicon (16x16, 32x32, 64x64 or “as big as possible”) on the company form. The file format would be ico, gif or png with 16x16, 32x32 or 64x64 pixels and 16 colors. Highers resolutions or colors support @@ -408,7 +413,7 @@

Configuration

“Administration / Settings”.

-

Known issues / Roadmap

+

Known issues / Roadmap

  • Allow to upload some big icon (preferrably SVG or the like) and generate all the icons from it
  • @@ -421,7 +426,7 @@

    Known issues / Roadmap

-

Bug Tracker

+

Bug Tracker

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

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Therp BV
  • Tecnativa
  • @@ -439,7 +444,7 @@

    Authors

-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -461,5 +466,6 @@

Maintainers

+
diff --git a/web_favicon/tests/test_web_favicon.py b/web_favicon/tests/test_web_favicon.py index 387c53bbd66f..afc8eeb16c23 100644 --- a/web_favicon/tests/test_web_favicon.py +++ b/web_favicon/tests/test_web_favicon.py @@ -38,7 +38,7 @@ def test_01_web_favicon(self): self.assertEqual(image.size, (1920, 1080)) self.assertEqual(image.getpixel((0, 0)), bg_color) with MockRequest(self.env) as mock_request: - mock_request.httprequest.cookies = {"cids": str(company.id)} + mock_request.cookies = {"cids": str(company.id)} self.assertTrue(Company._get_favicon()) def test_02_default_favicon_creation(self): @@ -83,10 +83,13 @@ def test_04_favicon_multiple_companies(self): company_2 = Company.create( {"name": "Company 2", "favicon": Company._get_default_favicon()} ) + company_3 = Company.create( + {"name": "Company 3", "favicon": Company._get_default_favicon()} + ) with MockRequest(self.env) as mock_request: - mock_request.httprequest.cookies = { - "cids": f"{company_1.id}-{company_2.id}" + mock_request.cookies = { + "cids": f"{company_1.id}-{company_2.id}-{company_3.id}" } favicon_url = Company._get_favicon() diff --git a/web_form_banner/README.rst b/web_form_banner/README.rst index 0475d62dffa7..94b6c0ce6ec4 100644 --- a/web_form_banner/README.rst +++ b/web_form_banner/README.rst @@ -11,7 +11,7 @@ Web Form Banner !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:e717dbf8e121cc9ae1a93ad095f7d6a3d3a0219dbbb41e7292c39b58cb2eb653 + !! source digest: sha256:d5dd848e3f2205d7a480f4606bad02c27855e9a060c2593c209f79dbdfa14a0d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/web_form_banner/__manifest__.py b/web_form_banner/__manifest__.py index b3e4647c0d58..1b0c230ea546 100644 --- a/web_form_banner/__manifest__.py +++ b/web_form_banner/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Web Form Banner", - "version": "18.0.1.0.1", + "version": "18.0.1.1.0", "category": "Web", "author": "Quartile, Odoo Community Association (OCA)", "website": "https://github.com/OCA/web", diff --git a/web_form_banner/i18n/it.po b/web_form_banner/i18n/it.po index dacbb4b7fd3a..012f98d51ec8 100644 --- a/web_form_banner/i18n/it.po +++ b/web_form_banner/i18n/it.po @@ -33,21 +33,11 @@ msgstr "" #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form msgid "" -"ctx: Copy of the current context " -"(dict(env.context))." +"ctx: Copy of the current context (dict(env.context))." msgstr "" -"ctx: Copia del contesto attuale " -"(dict(env.context))." - -#. module: web_form_banner -#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form -msgid "" -"current_id: Integer id of the record being edited, or False if the form\n" -" is creating a new record." -msgstr "" -"current_id: ID intero del record in modifica o False se il modulo\n" -" sta creando un nuovo rerord." +"ctx: Copia del contesto attuale (dict(env.context))." #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form @@ -55,16 +45,20 @@ msgid "" "dateutil: { \"parser\": dateutil.parser, " "\"relativedelta\": dateutil.relativedelta }" msgstr "" -"dateutil: { \"parser\": dateutil.parser, \"relativedelta\"" -": dateutil.relativedelta }" +"dateutil: { \"parser\": dateutil.parser, " +"\"relativedelta\": dateutil.relativedelta }" #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form msgid "" -"draft: The persisted field values of the ORM record (before applying the current\n" -" form's unsaved changes) + the current unsaved changes on trigger fields.\n" -" Should be used instead of record when your rule is triggered dynamically by an\n" -" update to a trigger field. It doesn't include any values from complex fields\n" +"draft: The persisted field values of the ORM record (before " +"applying the current\n" +" form's unsaved changes) + the current " +"unsaved changes on trigger fields.\n" +" Should be used instead of record when your rule is triggered dynamically by an\n" +" update to a trigger field. It doesn't " +"include any values from complex fields\n" " (one2many/reference, etc)." msgstr "" "bozza: i valori dei campi persistenti del record ORM (prima " @@ -85,32 +79,39 @@ msgstr "env: ambiente Odoo per accesso ORM." #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form msgid "" -"float_compare, float_is_zero, " -"float_round: Odoo float utils for precision-safe " -"comparisons/rounding." +"float_compare, float_is_zero, float_round: Odoo float utils for precision-safe comparisons/rounding." msgstr "" -"float_compare, float_is_zero, " -"float_round: utilità decimali Odoo per comparazione sicura / " -"arrotondamento." +"float_compare, float_is_zero, float_round: utilità decimali Odoo per comparazione sicura / arrotondamento." #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form msgid "" -"model: Shortcut to the current model " -"(env[record._name])." +"model: Shortcut to the current model (env[record._name])." msgstr "" -"model: scorciatoia al modello attuale (env[record._name]" -")." +"model: scorciatoia al modello attuale (env[record._name])." #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form msgid "record: Current record (the form's record)." msgstr "record: record attuale (il record della maschera)." +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "" +"record_id: Integer id of the record being edited, or " +"False if the form\n" +" is creating a new record." +msgstr "" + #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form msgid "time, datetime: Standard Python time/datetime modules." -msgstr "time, datetime: moduli orario/dataoraraio Python standard." +msgstr "" +"time, datetime: moduli orario/dataoraraio Python standard." #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form @@ -150,7 +151,8 @@ msgstr "In archivio" #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form msgid "Available evaluation context variables are as follows:" -msgstr "Le valutazioni delle variabili di contesto disponibili sono come segue:" +msgstr "" +"Le valutazioni delle variabili di contesto disponibili sono come segue:" #. module: web_form_banner #: model:ir.model,name:web_form_banner.model_base @@ -316,12 +318,13 @@ msgstr "Posizione" #: model:ir.model.fields,help:web_form_banner.field_web_form_banner_rule__message_value_code msgid "" "Python expression evaluated server-side. Must return a dict.\n" -"Keys: visible(bool, default True), severity(str), values(dict for ${...} in \n" +"Keys: visible(bool, default True), severity(str), values(dict for ${...} " +"in \n" "message), and/or html(str) to override template rendering." msgstr "" "Espressione Python valutata lato server. Deve restituire un dizionario.\n" -"Chiavi: visible(bool, predefinito True), severity(str), values(dict per " -"${...} in\n" +"Chiavi: visible(bool, predefinito True), severity(str), values(dict per $" +"{...} in\n" "message) e/o html(str) per sovrascrivere il rendering del template." #. module: web_form_banner @@ -392,7 +395,8 @@ msgid "" " domain += [(\"id\", \"<\", record_id)]\n" "last = model.search(domain, order=\"date_order desc, id desc\", limit=1)\n" "if last:\n" -" html = \"<strong>Previous order:</strong> <a href='%s'>%s</a>\" % (url_for(last), last.name)\n" +" html = \"<strong>Previous order:</strong> <a href='%s'>" +"%s</a>\" % (url_for(last), last.name)\n" " result = {\"visible\": True, \"html\": html}\n" "else:\n" " result = {\"visible\": False}" @@ -417,3 +421,12 @@ msgstr "es. Attenzione su clienti pericolosi" #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_tree msgid "return {'visible': True, 'values': {'title': '...'}}" msgstr "return {'visible': True, 'values': {'title': '...'}}" + +#~ msgid "" +#~ "current_id: Integer id of the record being edited, or " +#~ "False if the form\n" +#~ " is creating a new record." +#~ msgstr "" +#~ "current_id: ID intero del record in modifica o False se il modulo\n" +#~ " sta creando un nuovo rerord." diff --git a/web_form_banner/i18n/ja.po b/web_form_banner/i18n/ja.po index 4e85c5bfbbbe..f40b8a47a29b 100644 --- a/web_form_banner/i18n/ja.po +++ b/web_form_banner/i18n/ja.po @@ -35,14 +35,6 @@ msgid "" "code>)." msgstr "" -#. module: web_form_banner -#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form -msgid "" -"current_id: Integer id of the record being edited, or " -"False if the form\n" -" is creating a new record." -msgstr "" - #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form msgid "" @@ -88,6 +80,14 @@ msgstr "" msgid "record: Current record (the form's record)." msgstr "" +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "" +"record_id: Integer id of the record being edited, or " +"False if the form\n" +" is creating a new record." +msgstr "" + #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form msgid "time, datetime: Standard Python time/datetime modules." diff --git a/web_form_banner/i18n/web_form_banner.pot b/web_form_banner/i18n/web_form_banner.pot index 86594a656c0c..77d0b123972e 100644 --- a/web_form_banner/i18n/web_form_banner.pot +++ b/web_form_banner/i18n/web_form_banner.pot @@ -32,13 +32,6 @@ msgid "" "(dict(env.context))." msgstr "" -#. module: web_form_banner -#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form -msgid "" -"current_id: Integer id of the record being edited, or False if the form\n" -" is creating a new record." -msgstr "" - #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form msgid "" @@ -81,6 +74,13 @@ msgstr "" msgid "record: Current record (the form's record)." msgstr "" +#. module: web_form_banner +#: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form +msgid "" +"record_id: Integer id of the record being edited, or False if the form\n" +" is creating a new record." +msgstr "" + #. module: web_form_banner #: model_terms:ir.ui.view,arch_db:web_form_banner.view_web_form_banner_rule_form msgid "time, datetime: Standard Python time/datetime modules." diff --git a/web_form_banner/static/description/index.html b/web_form_banner/static/description/index.html index 5cca12293168..ac269e13984c 100644 --- a/web_form_banner/static/description/index.html +++ b/web_form_banner/static/description/index.html @@ -372,7 +372,7 @@

Web Form Banner

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

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

The module adds configurable banners for backend form views. Define diff --git a/web_form_banner/views/web_form_banner_rule_views.xml b/web_form_banner/views/web_form_banner_rule_views.xml index 7db656156dfe..0697efc61f22 100644 --- a/web_form_banner/views/web_form_banner_rule_views.xml +++ b/web_form_banner/views/web_form_banner_rule_views.xml @@ -113,7 +113,7 @@ (one2many/reference, etc).

  • current_id: Integer id of the record being edited, or record_id: Integer id of the record being edited, or False if the form is creating a new record.
  • diff --git a/web_theme_classic/i18n/it.po b/web_theme_classic/i18n/it.po index ec4b00c38cfc..17739385a8f7 100644 --- a/web_theme_classic/i18n/it.po +++ b/web_theme_classic/i18n/it.po @@ -5,34 +5,36 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2026-04-30 09:36+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.15.2\n" #. module: web_theme_classic #. odoo-javascript #: code:addons/web_theme_classic/static/src/js/switch_theme.esm.js:0 msgid "Classic Theme" -msgstr "" +msgstr "Tema classico" #. module: web_theme_classic #: model:ir.model.fields,field_description:web_theme_classic.field_res_users__persistent_classic_theme msgid "Classic Theme Persistent" -msgstr "" +msgstr "Tema classico persistente" #. module: web_theme_classic #: model:ir.model,name:web_theme_classic.model_ir_http msgid "HTTP Routing" -msgstr "" +msgstr "Instradamento HTTP" #. module: web_theme_classic #: model:ir.model.fields,field_description:web_theme_classic.field_res_users_settings__persistent_classic_theme msgid "Persistent Classic Theme" -msgstr "" +msgstr "Tema classico persistente" #. module: web_theme_classic #: model:ir.model.fields,help:web_theme_classic.field_res_users__persistent_classic_theme @@ -42,13 +44,19 @@ msgid "" "menu in the navbar to enable Classic Mode on a specific session/device \n" "The toggle is not visible while Persistent Classic Theme is enabled" msgstr "" +"Questa opzione abilita il tema classico sull'account di questo utente su " +"tutti i dispositivi.\n" +"Disabilitandola, si potrà utilizzare l'interruttore nel pulsante menu " +"dell'utente nella barra di navigazione per abilitare la modalità classica su " +"una sessione/dispositivo specifici.\n" +"L'interruttore non è visibile quando il tema classico persistente è abilitato" #. module: web_theme_classic #: model:ir.model,name:web_theme_classic.model_res_users msgid "User" -msgstr "" +msgstr "Utente" #. module: web_theme_classic #: model:ir.model,name:web_theme_classic.model_res_users_settings msgid "User Settings" -msgstr "" +msgstr "Impostazioni utente" diff --git a/web_widget_o2m_attachment_image_gallery/README.rst b/web_widget_o2m_attachment_image_gallery/README.rst new file mode 100644 index 000000000000..09fbf93ca23f --- /dev/null +++ b/web_widget_o2m_attachment_image_gallery/README.rst @@ -0,0 +1,101 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +========================================== +Widget o2m Attachment Image Gallery Widget +========================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:ec29f4baf1de38486b9426d66744f784163b4682941a4b004ce9b33bc524ce29 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/18.0/web_widget_o2m_attachment_image_gallery + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-18-0/web-18-0-web_widget_o2m_attachment_image_gallery + :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=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows you to set up an image gallery in a view (such as a +Kanban view). + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Example: +-------- + +.. code:: xml + + + +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 `__: + + - Víctor Martínez + +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-victoralmau| image:: https://github.com/victoralmau.png?size=40px + :target: https://github.com/victoralmau + :alt: victoralmau + +Current `maintainer `__: + +|maintainer-victoralmau| + +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_widget_o2m_attachment_image_gallery/__init__.py b/web_widget_o2m_attachment_image_gallery/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/web_widget_o2m_attachment_image_gallery/__manifest__.py b/web_widget_o2m_attachment_image_gallery/__manifest__.py new file mode 100644 index 000000000000..212848bd2b65 --- /dev/null +++ b/web_widget_o2m_attachment_image_gallery/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2026 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Widget o2m Attachment Image Gallery Widget", + "version": "18.0.1.0.0", + "license": "AGPL-3", + "author": "Tecnativa, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "depends": ["web"], + "assets": { + "web.assets_backend": [ + "web_widget_o2m_attachment_image_gallery/static/src/**/*.js", + "web_widget_o2m_attachment_image_gallery/static/src/**/*.xml", + ], + }, + "installable": True, + "maintainers": ["victoralmau"], +} diff --git a/web_widget_o2m_attachment_image_gallery/i18n/it.po b/web_widget_o2m_attachment_image_gallery/i18n/it.po new file mode 100644 index 000000000000..c0d5085374bd --- /dev/null +++ b/web_widget_o2m_attachment_image_gallery/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 18.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/web_widget_o2m_attachment_image_gallery/i18n/web_widget_o2m_attachment_image_gallery.pot b/web_widget_o2m_attachment_image_gallery/i18n/web_widget_o2m_attachment_image_gallery.pot new file mode 100644 index 000000000000..aadee09bfeda --- /dev/null +++ b/web_widget_o2m_attachment_image_gallery/i18n/web_widget_o2m_attachment_image_gallery.pot @@ -0,0 +1,13 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" diff --git a/web_widget_o2m_attachment_image_gallery/pyproject.toml b/web_widget_o2m_attachment_image_gallery/pyproject.toml new file mode 100644 index 000000000000..4231d0cccb3d --- /dev/null +++ b/web_widget_o2m_attachment_image_gallery/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/web_widget_o2m_attachment_image_gallery/readme/CONTRIBUTORS.md b/web_widget_o2m_attachment_image_gallery/readme/CONTRIBUTORS.md new file mode 100644 index 000000000000..ed67b081ec18 --- /dev/null +++ b/web_widget_o2m_attachment_image_gallery/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- [Tecnativa](https://www.tecnativa.com): + - Víctor Martínez diff --git a/web_widget_o2m_attachment_image_gallery/readme/DESCRIPTION.md b/web_widget_o2m_attachment_image_gallery/readme/DESCRIPTION.md new file mode 100644 index 000000000000..cb8692db9746 --- /dev/null +++ b/web_widget_o2m_attachment_image_gallery/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module allows you to set up an image gallery in a view (such as a Kanban view). diff --git a/web_widget_o2m_attachment_image_gallery/readme/USAGE.md b/web_widget_o2m_attachment_image_gallery/readme/USAGE.md new file mode 100644 index 000000000000..0908cbd74a72 --- /dev/null +++ b/web_widget_o2m_attachment_image_gallery/readme/USAGE.md @@ -0,0 +1,5 @@ +## Example: + +``` xml + +``` diff --git a/web_widget_o2m_attachment_image_gallery/static/description/icon.png b/web_widget_o2m_attachment_image_gallery/static/description/icon.png new file mode 100644 index 000000000000..3a0328b516c4 Binary files /dev/null and b/web_widget_o2m_attachment_image_gallery/static/description/icon.png differ diff --git a/web_widget_o2m_attachment_image_gallery/static/description/index.html b/web_widget_o2m_attachment_image_gallery/static/description/index.html new file mode 100644 index 000000000000..8562ee564a65 --- /dev/null +++ b/web_widget_o2m_attachment_image_gallery/static/description/index.html @@ -0,0 +1,448 @@ + + + + + +README.rst + + + +
    + + + +Odoo Community Association + + +
    + + diff --git a/web_widget_o2m_attachment_image_gallery/static/src/js/o2m_attachment_image_gallery.esm.js b/web_widget_o2m_attachment_image_gallery/static/src/js/o2m_attachment_image_gallery.esm.js new file mode 100644 index 000000000000..a65b1264c96d --- /dev/null +++ b/web_widget_o2m_attachment_image_gallery/static/src/js/o2m_attachment_image_gallery.esm.js @@ -0,0 +1,54 @@ +import {Component, onWillStart, useState} from "@odoo/owl"; +import {registry} from "@web/core/registry"; +import {useFileViewer} from "@web/core/file_viewer/file_viewer_hook"; +import {useService} from "@web/core/utils/hooks"; + +export class O2mAttachmentImageGalleryField extends Component { + static template = + "web_widget_o2m_attachment_image_gallery.o2mAttachmentImageGalleryField"; + setup() { + this.orm = useService("orm"); + this.store = useService("mail.store"); + this.fileViewer = useFileViewer(); + this.state = useState({ + attachments: [], + }); + onWillStart(() => this._loadImages()); + } + + async _loadImages() { + const record = this.props.record; + if (!record || !record.data) { + this.state.attachments = []; + return; + } + const attachments = record.data[this.props.name].records; + this.state.attachments = attachments.map((att) => ({ + id: att.resId, + name: att.data.name, + mimetype: att.data.mimetype, + })); + } + openGallery = (index = 0) => { + this.state.index = index; + const files = this.state.attachments.map((att) => + this.store.Attachment.insert({ + id: att.id, + name: att.name, + filename: att.name, + mimetype: att.mimetype, + }) + ); + this.fileViewer.open(files[index], files); + }; +} +export const o2mAttachmentImageGalleryField = { + component: O2mAttachmentImageGalleryField, + relatedFields: [ + {name: "name", type: "char"}, + {name: "mimetype", type: "char"}, + ], +}; +registry + .category("fields") + .add("o2m_attachment_image_gallery", o2mAttachmentImageGalleryField); diff --git a/web_widget_o2m_attachment_image_gallery/static/src/xml/o2m_attachment_image_gallery.xml b/web_widget_o2m_attachment_image_gallery/static/src/xml/o2m_attachment_image_gallery.xml new file mode 100644 index 000000000000..7b383770cd1f --- /dev/null +++ b/web_widget_o2m_attachment_image_gallery/static/src/xml/o2m_attachment_image_gallery.xml @@ -0,0 +1,12 @@ + + +