diff --git a/README.md b/README.md index c92ff0ec..ac55c5a7 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,10 @@ Available addons ---------------- addon | version | maintainers | summary --- | --- | --- | --- +[spreadsheet_dashboard_oca](spreadsheet_dashboard_oca/) | 18.0.1.1.0 | | Use OCA Spreadsheets on dashboards configuration [spreadsheet_dashboard_purchase_oca](spreadsheet_dashboard_purchase_oca/) | 18.0.1.0.0 | | Spreadsheet dashboard for vendors [spreadsheet_dashboard_purchase_stock_oca](spreadsheet_dashboard_purchase_stock_oca/) | 18.0.1.0.0 | | Spreadsheet dashboard for purchases +[spreadsheet_oca](spreadsheet_oca/) | 18.0.1.0.4 | | Allow to edit spreadsheets [//]: # (end addons) diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index cd8deb1b..41755afb 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,9 +1,11 @@ [project] name = "odoo-addons-oca-spreadsheet" -version = "18.0.20250827.1" +version = "18.0.20251009.1" dependencies = [ + "odoo-addon-spreadsheet_dashboard_oca==18.0.*", "odoo-addon-spreadsheet_dashboard_purchase_oca==18.0.*", "odoo-addon-spreadsheet_dashboard_purchase_stock_oca==18.0.*", + "odoo-addon-spreadsheet_oca==18.0.*", ] classifiers=[ "Programming Language :: Python", diff --git a/spreadsheet_dashboard_oca/README.rst b/spreadsheet_dashboard_oca/README.rst new file mode 100644 index 00000000..e5cf0ed4 --- /dev/null +++ b/spreadsheet_dashboard_oca/README.rst @@ -0,0 +1,88 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +========================= +Spreadsheet Dashboard Oca +========================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:f2dd89e0742dd92768f13deebfcf0df75b55119ebe65a1c534295ed2382eee01 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fspreadsheet-lightgray.png?logo=github + :target: https://github.com/OCA/spreadsheet/tree/18.0/spreadsheet_dashboard_oca + :alt: OCA/spreadsheet +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/spreadsheet-18-0/spreadsheet-18-0-spreadsheet_dashboard_oca + :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/spreadsheet&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to edit spreadsheet dashboards using OCA Spreadsheet +editor. + +**Table of contents** + +.. contents:: + :local: + +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 +------- + +* CreuBlanca + +Contributors +------------ + +- Enric Tobella +- `Tecnativa `__: + + - Carlos Roca + +- `Open User Systems `__: + + - Chris Mann + +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/spreadsheet `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/spreadsheet_dashboard_oca/__init__.py b/spreadsheet_dashboard_oca/__init__.py new file mode 100644 index 00000000..aee8895e --- /dev/null +++ b/spreadsheet_dashboard_oca/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/spreadsheet_dashboard_oca/__manifest__.py b/spreadsheet_dashboard_oca/__manifest__.py new file mode 100644 index 00000000..f9ddc16d --- /dev/null +++ b/spreadsheet_dashboard_oca/__manifest__.py @@ -0,0 +1,33 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Spreadsheet Dashboard Oca", + "summary": """ + Use OCA Spreadsheets on dashboards configuration""", + "version": "18.0.1.1.0", + "license": "AGPL-3", + "author": "CreuBlanca,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/spreadsheet", + "depends": [ + "spreadsheet_dashboard", + "spreadsheet_oca", + ], + "data": [ + "security/ir.model.access.csv", + "wizards/spreadsheet_spreadsheet_import.xml", + "wizards/spreadsheet_to_dashboard.xml", + "views/spreadsheet_dashboard_group_views.xml", + "views/spreadsheet_dashboard.xml", + "data/spreadsheet_spreadsheet_import_mode.xml", + ], + "assets": { + "spreadsheet.o_spreadsheet": [ + ( + "after", + "spreadsheet/static/src/o_spreadsheet/o_spreadsheet.js", + "spreadsheet_dashboard_oca/static/src/bundle/*.js", + ), + ], + }, +} diff --git a/spreadsheet_dashboard_oca/data/spreadsheet_spreadsheet_import_mode.xml b/spreadsheet_dashboard_oca/data/spreadsheet_spreadsheet_import_mode.xml new file mode 100644 index 00000000..20522563 --- /dev/null +++ b/spreadsheet_dashboard_oca/data/spreadsheet_spreadsheet_import_mode.xml @@ -0,0 +1,21 @@ + + + + dashboard + To dashboard + + + + + dashboard_spreadsheet + New dashboard + + + + diff --git a/spreadsheet_dashboard_oca/i18n/es.po b/spreadsheet_dashboard_oca/i18n/es.po new file mode 100644 index 00000000..a642fa5d --- /dev/null +++ b/spreadsheet_dashboard_oca/i18n/es.po @@ -0,0 +1,174 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_dashboard_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-07-19 10:02+0000\n" +"PO-Revision-Date: 2024-07-19 12:03+0200\n" +"Last-Translator: \n" +"Language-Team: \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: Poedit 3.0.1\n" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__active +msgid "Active" +msgstr "Activo" + +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/spreadsheet_to_dashboard.esm.js:0 +msgid "Add to dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__can_edit +msgid "Can Edit" +msgstr "Se puede editar" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Cancel" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Copy" +msgstr "Copiar" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Create" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_to_dashboard +msgid "Create dashboard from spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_uid +msgid "Created by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_date +msgid "Created on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_id +msgid "Dashboard" +msgstr "Tablero" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_group_id +msgid "Dashboard Group" +msgstr "Tablero grupal" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__name +msgid "Dashboard Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__dashboard_group_id +msgid "Dashboard Section" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__display_name +msgid "Display Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Edit" +msgstr "Editar" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__id +msgid "ID" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "Importar datos a hoja de cálculo" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__name +msgid "Name" +msgstr "Nombre" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard_new_spreadsheet +msgid "New dashboard" +msgstr "Nuevo tablero" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "Search operation not supported" +msgstr "Operación de búsqueda no soportada" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__spreadsheet_id +msgid "Spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_dashboard +msgid "Spreadsheet Dashboard" +msgstr "Hoja de cálculo de tablero" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "Hoja de cálculo Raw" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "Revisión de hoja de cálculo" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "The value has to be a boolean" +msgstr "El valor tiene que ser un booleano" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard +msgid "To dashboard" +msgstr "A tablero" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__group_ids +msgid "User Groups" +msgstr "" + +#~ msgid "To dashboard new sheet" +#~ msgstr "A tablero en nueva hoja" diff --git a/spreadsheet_dashboard_oca/i18n/fr.po b/spreadsheet_dashboard_oca/i18n/fr.po new file mode 100644 index 00000000..df9cb4ad --- /dev/null +++ b/spreadsheet_dashboard_oca/i18n/fr.po @@ -0,0 +1,168 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_dashboard_oca +# +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: 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: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__active +msgid "Active" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/spreadsheet_to_dashboard.esm.js:0 +msgid "Add to dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__can_edit +msgid "Can Edit" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Cancel" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Copy" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Create" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_to_dashboard +msgid "Create dashboard from spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_uid +msgid "Created by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_date +msgid "Created on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_id +msgid "Dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_group_id +msgid "Dashboard Group" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__name +msgid "Dashboard Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__dashboard_group_id +msgid "Dashboard Section" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__display_name +msgid "Display Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Edit" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__id +msgid "ID" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__name +msgid "Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard_new_spreadsheet +msgid "New dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "Search operation not supported" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__spreadsheet_id +msgid "Spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_dashboard +msgid "Spreadsheet Dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "The value has to be a boolean" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard +msgid "To dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__group_ids +msgid "User Groups" +msgstr "" diff --git a/spreadsheet_dashboard_oca/i18n/fr_FR.po b/spreadsheet_dashboard_oca/i18n/fr_FR.po new file mode 100644 index 00000000..b3a88515 --- /dev/null +++ b/spreadsheet_dashboard_oca/i18n/fr_FR.po @@ -0,0 +1,173 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_dashboard_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-05-25 12:11+0000\n" +"Last-Translator: \"Sandrine (ACSONE)\" \n" +"Language-Team: none\n" +"Language: fr_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: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__active +msgid "Active" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/spreadsheet_to_dashboard.esm.js:0 +msgid "Add to dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__can_edit +msgid "Can Edit" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Cancel" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Copy" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Create" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_to_dashboard +msgid "Create dashboard from spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_uid +msgid "Created by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_date +msgid "Created on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_id +msgid "Dashboard" +msgstr "Tableau de bord" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_group_id +msgid "Dashboard Group" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__name +msgid "Dashboard Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__dashboard_group_id +msgid "Dashboard Section" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__display_name +msgid "Display Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Edit" +msgstr "Modifier" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__id +msgid "ID" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "Importer des données dans la feuille de calcul" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__name +msgid "Name" +msgstr "Nom" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard_new_spreadsheet +msgid "New dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "Search operation not supported" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__spreadsheet_id +msgid "Spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_dashboard +msgid "Spreadsheet Dashboard" +msgstr "Tableau de bord des feuilles de calcul" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "Feuille de calcul brute" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "Révision de la feuille de calcul" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "The value has to be a boolean" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard +msgid "To dashboard" +msgstr "Au tableau de bord" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__group_ids +msgid "User Groups" +msgstr "" + +#~ msgid "To dashboard new sheet" +#~ msgstr "Nouvelle feuille du tableau de bord" diff --git a/spreadsheet_dashboard_oca/i18n/it.po b/spreadsheet_dashboard_oca/i18n/it.po new file mode 100644 index 00000000..36459161 --- /dev/null +++ b/spreadsheet_dashboard_oca/i18n/it.po @@ -0,0 +1,173 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_dashboard_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-10-28 10:43+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.10.4\n" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__active +msgid "Active" +msgstr "Attiva" + +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/spreadsheet_to_dashboard.esm.js:0 +msgid "Add to dashboard" +msgstr "Aggiungi alla bacheca" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__can_edit +msgid "Can Edit" +msgstr "Può modificare" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Cancel" +msgstr "Annulla" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Copy" +msgstr "Copia" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Create" +msgstr "Crea" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_to_dashboard +msgid "Create dashboard from spreadsheet" +msgstr "Crea bacheca da foglio di calcolo" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_id +msgid "Dashboard" +msgstr "Bacheca" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_group_id +msgid "Dashboard Group" +msgstr "Gruppo cruscotto" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__name +msgid "Dashboard Name" +msgstr "Nome bacheca" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__dashboard_group_id +msgid "Dashboard Section" +msgstr "Sezione bacheca" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Edit" +msgstr "Modifica" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__id +msgid "ID" +msgstr "ID" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "Importa dati nel foglio di calcolo" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__name +msgid "Name" +msgstr "Nome" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard_new_spreadsheet +msgid "New dashboard" +msgstr "Nuovo cruscotto" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "Search operation not supported" +msgstr "Cerca operazioni non supportate" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__spreadsheet_id +msgid "Spreadsheet" +msgstr "Foglio di calcolo" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_dashboard +msgid "Spreadsheet Dashboard" +msgstr "Bacheca foglio di calcolo" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "Foglio di calcolo grezzo" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "Revisione foglio di calcolo" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "File foglio di calcolo" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "The value has to be a boolean" +msgstr "Il valore deve essere booleano" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard +msgid "To dashboard" +msgstr "Alla bacheca" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__group_ids +msgid "User Groups" +msgstr "Gruppi utente" + +#~ msgid "To dashboard new sheet" +#~ msgstr "Al nuovo foglio bacheca" diff --git a/spreadsheet_dashboard_oca/i18n/nl.po b/spreadsheet_dashboard_oca/i18n/nl.po new file mode 100644 index 00000000..17f9caa3 --- /dev/null +++ b/spreadsheet_dashboard_oca/i18n/nl.po @@ -0,0 +1,173 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_dashboard_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-10-09 08:25+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: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__active +msgid "Active" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/spreadsheet_to_dashboard.esm.js:0 +msgid "Add to dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__can_edit +msgid "Can Edit" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Cancel" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Copy" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Create" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_to_dashboard +msgid "Create dashboard from spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_uid +msgid "Created by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_date +msgid "Created on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_id +msgid "Dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_group_id +msgid "Dashboard Group" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__name +msgid "Dashboard Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__dashboard_group_id +msgid "Dashboard Section" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__display_name +msgid "Display Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Edit" +msgstr "Bewerken" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__id +msgid "ID" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "Importeer gegevens naar een spreadsheet" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__name +msgid "Name" +msgstr "Naam" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard_new_spreadsheet +msgid "New dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "Search operation not supported" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__spreadsheet_id +msgid "Spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_dashboard +msgid "Spreadsheet Dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "Spreadsheet onbewerkt" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "Revisie van spreadsheets" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "The value has to be a boolean" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard +msgid "To dashboard" +msgstr "Naar dashboard" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__group_ids +msgid "User Groups" +msgstr "" + +#~ msgid "To dashboard new sheet" +#~ msgstr "Naar dashboard van een nieuw blad" diff --git a/spreadsheet_dashboard_oca/i18n/pt.po b/spreadsheet_dashboard_oca/i18n/pt.po new file mode 100644 index 00000000..fd39c6ee --- /dev/null +++ b/spreadsheet_dashboard_oca/i18n/pt.po @@ -0,0 +1,173 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_dashboard_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-08-21 19:42+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 5.6.2\n" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__active +msgid "Active" +msgstr "Ativo" + +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/spreadsheet_to_dashboard.esm.js:0 +msgid "Add to dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__can_edit +msgid "Can Edit" +msgstr "Pode Editar" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Cancel" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Copy" +msgstr "Copiar" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Create" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_to_dashboard +msgid "Create dashboard from spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_uid +msgid "Created by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_date +msgid "Created on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_id +msgid "Dashboard" +msgstr "Painel" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_group_id +msgid "Dashboard Group" +msgstr "Grupo de Painel" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__name +msgid "Dashboard Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__dashboard_group_id +msgid "Dashboard Section" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__display_name +msgid "Display Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Edit" +msgstr "Editar" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__id +msgid "ID" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "Importar dados para a folha de cálculo" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__name +msgid "Name" +msgstr "Nome" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard_new_spreadsheet +msgid "New dashboard" +msgstr "Novo painel" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "Search operation not supported" +msgstr "Operação de pesquisa não suportada" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__spreadsheet_id +msgid "Spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_dashboard +msgid "Spreadsheet Dashboard" +msgstr "Painel de Folha de Cálculo" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "Folha de Cálculo em Bruto" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "Revisão da Folha de Cálculo" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "The value has to be a boolean" +msgstr "O valor deve ser um booleano" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard +msgid "To dashboard" +msgstr "Para painel" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__group_ids +msgid "User Groups" +msgstr "" + +#~ msgid "To dashboard new sheet" +#~ msgstr "Nova folha para painel" diff --git a/spreadsheet_dashboard_oca/i18n/spreadsheet_dashboard_oca.pot b/spreadsheet_dashboard_oca/i18n/spreadsheet_dashboard_oca.pot new file mode 100644 index 00000000..4d071936 --- /dev/null +++ b/spreadsheet_dashboard_oca/i18n/spreadsheet_dashboard_oca.pot @@ -0,0 +1,167 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_dashboard_oca +# +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" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__active +msgid "Active" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/spreadsheet_to_dashboard.esm.js:0 +msgid "Add to dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__can_edit +msgid "Can Edit" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Cancel" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Copy" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Create" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_to_dashboard +msgid "Create dashboard from spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_uid +msgid "Created by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_date +msgid "Created on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_id +msgid "Dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_group_id +msgid "Dashboard Group" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__name +msgid "Dashboard Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__dashboard_group_id +msgid "Dashboard Section" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__display_name +msgid "Display Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Edit" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__id +msgid "ID" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__name +msgid "Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard_new_spreadsheet +msgid "New dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "Search operation not supported" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__spreadsheet_id +msgid "Spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_dashboard +msgid "Spreadsheet Dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "The value has to be a boolean" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard +msgid "To dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__group_ids +msgid "User Groups" +msgstr "" diff --git a/spreadsheet_dashboard_oca/i18n/zh_CN.po b/spreadsheet_dashboard_oca/i18n/zh_CN.po new file mode 100644 index 00000000..d186fee0 --- /dev/null +++ b/spreadsheet_dashboard_oca/i18n/zh_CN.po @@ -0,0 +1,173 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_dashboard_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-04-17 10:23+0000\n" +"Last-Translator: 张飞虎 \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 5.10.4\n" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__active +msgid "Active" +msgstr "有效" + +#. module: spreadsheet_dashboard_oca +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_oca/static/src/bundle/spreadsheet_to_dashboard.esm.js:0 +msgid "Add to dashboard" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__can_edit +msgid "Can Edit" +msgstr "可编辑" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Cancel" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Copy" +msgstr "复制" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_to_dashboard_view_form +msgid "Create" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_to_dashboard +msgid "Create dashboard from spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_uid +msgid "Created by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__create_date +msgid "Created on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_id +msgid "Dashboard" +msgstr "仪表盘" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_spreadsheet_import__dashboard_group_id +msgid "Dashboard Group" +msgstr "仪表盘组" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__name +msgid "Dashboard Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__dashboard_group_id +msgid "Dashboard Section" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__display_name +msgid "Display Name" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_dashboard_oca.spreadsheet_dashboard_tree_view +msgid "Edit" +msgstr "编辑" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__id +msgid "ID" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "导入数据到电子表格" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__name +msgid "Name" +msgstr "名称" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard_new_spreadsheet +msgid "New dashboard" +msgstr "新建仪表盘" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "Search operation not supported" +msgstr "不支持搜索操作" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__spreadsheet_id +msgid "Spreadsheet" +msgstr "" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model,name:spreadsheet_dashboard_oca.model_spreadsheet_dashboard +msgid "Spreadsheet Dashboard" +msgstr "电子表格仪表盘" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "原始电子表格" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "电子表格修订" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_dashboard__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "电子表格文件" + +#. module: spreadsheet_dashboard_oca +#. odoo-python +#: code:addons/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py:0 +msgid "The value has to be a boolean" +msgstr "值必须为布尔型" + +#. module: spreadsheet_dashboard_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_dashboard_oca.spreadsheet_import_mode_dashboard +msgid "To dashboard" +msgstr "到仪表盘" + +#. module: spreadsheet_dashboard_oca +#: model:ir.model.fields,field_description:spreadsheet_dashboard_oca.field_spreadsheet_to_dashboard__group_ids +msgid "User Groups" +msgstr "" + +#~ msgid "To dashboard new sheet" +#~ msgstr "到仪表盘新工作表" diff --git a/spreadsheet_dashboard_oca/models/__init__.py b/spreadsheet_dashboard_oca/models/__init__.py new file mode 100644 index 00000000..c20895dc --- /dev/null +++ b/spreadsheet_dashboard_oca/models/__init__.py @@ -0,0 +1 @@ +from . import spreadsheet_dashboard diff --git a/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py b/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py new file mode 100644 index 00000000..fa1a492c --- /dev/null +++ b/spreadsheet_dashboard_oca/models/spreadsheet_dashboard.py @@ -0,0 +1,44 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class SpreadsheetDashboard(models.Model): + _name = "spreadsheet.dashboard" + _inherit = ["spreadsheet.dashboard", "spreadsheet.abstract"] + + active = fields.Boolean(default=True) + can_edit = fields.Boolean(compute="_compute_can_edit", search="_search_can_edit") + + def _compute_can_edit(self): + """We can edit if the record doesn't have XML-ID, or the XML-ID is noupdate=1""" + self.can_edit = True + for record in self.filtered("id"): + imd = self.env["ir.model.data"].search( + [("model", "=", record._name), ("res_id", "=", record.id)] + ) + if imd and imd.module != "__export__": + record.can_edit = imd.noupdate + + @api.model + def _search_can_edit(self, operator, value): + if operator != "=": + raise NotImplementedError(_("Search operation not supported")) + if not isinstance(value, bool): + raise ValidationError(_("The value has to be a boolean")) + no_edit_ids = ( + self.env["ir.model.data"] + .search( + [ + ("model", "=", self._name), + ("module", "!=", "__export__"), + ("noupdate", "=", 0), + ] + ) + .mapped("res_id") + ) + if value: + return [("id", "not in", no_edit_ids)] + return [("id", "in", no_edit_ids)] diff --git a/spreadsheet_dashboard_oca/pyproject.toml b/spreadsheet_dashboard_oca/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/spreadsheet_dashboard_oca/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/spreadsheet_dashboard_oca/readme/CONTRIBUTORS.md b/spreadsheet_dashboard_oca/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..b262cef9 --- /dev/null +++ b/spreadsheet_dashboard_oca/readme/CONTRIBUTORS.md @@ -0,0 +1,5 @@ +- Enric Tobella +- [Tecnativa](https://www.tecnativa.com): + - Carlos Roca +- [Open User Systems](https://www.openusersystems.com): + - Chris Mann \ No newline at end of file diff --git a/spreadsheet_dashboard_oca/readme/DESCRIPTION.md b/spreadsheet_dashboard_oca/readme/DESCRIPTION.md new file mode 100644 index 00000000..c230bab9 --- /dev/null +++ b/spreadsheet_dashboard_oca/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +This module allows to edit spreadsheet dashboards using OCA Spreadsheet +editor. diff --git a/spreadsheet_dashboard_oca/security/ir.model.access.csv b/spreadsheet_dashboard_oca/security/ir.model.access.csv new file mode 100644 index 00000000..28c5d5f9 --- /dev/null +++ b/spreadsheet_dashboard_oca/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_spreadsheet_to_dashboard_wizard,spreadsheet.to.dashboard.wizard.access,model_spreadsheet_to_dashboard,base.group_user,1,1,1,0 diff --git a/spreadsheet_dashboard_oca/static/description/icon.png b/spreadsheet_dashboard_oca/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/spreadsheet_dashboard_oca/static/description/icon.png differ diff --git a/spreadsheet_dashboard_oca/static/description/index.html b/spreadsheet_dashboard_oca/static/description/index.html new file mode 100644 index 00000000..6e9a9339 --- /dev/null +++ b/spreadsheet_dashboard_oca/static/description/index.html @@ -0,0 +1,438 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Spreadsheet Dashboard Oca

+ +

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

+

This module allows to edit spreadsheet dashboards using OCA Spreadsheet +editor.

+

Table of contents

+ +
+

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

+
    +
  • CreuBlanca
  • +
+
+
+

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/spreadsheet project on GitHub.

+

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

+
+
+
+
+ + diff --git a/spreadsheet_dashboard_oca/static/src/bundle/spreadsheet_to_dashboard.esm.js b/spreadsheet_dashboard_oca/static/src/bundle/spreadsheet_to_dashboard.esm.js new file mode 100644 index 00000000..f98c64d4 --- /dev/null +++ b/spreadsheet_dashboard_oca/static/src/bundle/spreadsheet_to_dashboard.esm.js @@ -0,0 +1,55 @@ +import * as spreadsheet from "@odoo/o-spreadsheet"; +import {useState, useSubEnv} from "@odoo/owl"; +import {SpreadsheetRenderer} from "@spreadsheet_oca/spreadsheet/bundle/spreadsheet_renderer.esm"; +import {_t} from "@web/core/l10n/translation"; +import {patch} from "@web/core/utils/patch"; +const {topbarMenuRegistry} = spreadsheet.registries; +import {user} from "@web/core/user"; + +topbarMenuRegistry.addChild("add_to_dashboard", ["file"], { + name: _t("Add to dashboard"), + sequence: 120, + execute: (env) => env.addToDashboard(), + isVisible: (env) => env.canAddToDashboard?.(), + icon: "o-spreadsheet-Icon.INSERT_CHART", +}); + +patch(SpreadsheetRenderer.prototype, { + setup() { + super.setup(); + this.state = useState({canAddToDashboard: false}); + this._checkDashboardPermission(); + useSubEnv({ + addToDashboard: this._addToDashboard.bind(this), + canAddToDashboard: () => this.state.canAddToDashboard, + }); + }, + async _checkDashboardPermission() { + const result = + (await user.hasGroup("base.group_system")) || + (await user.hasGroup("spreadsheet_dashboard.group_dashboard_manager")); + this.state.canAddToDashboard = result; + }, + async _addToDashboard() { + const record = this.props.record; + const resId = this.props.res_id; + const name = record.name; + this.onSpreadsheetSaved(); + this.env.services.action.doAction( + { + name: _t("Add to dashboard"), + type: "ir.actions.act_window", + view_mode: "form", + views: [[false, "form"]], + target: "new", + res_model: "spreadsheet.to.dashboard", + }, + { + additionalContext: { + default_spreadsheet_id: resId, + default_name: name, + }, + } + ); + }, +}); diff --git a/spreadsheet_dashboard_oca/views/spreadsheet_dashboard.xml b/spreadsheet_dashboard_oca/views/spreadsheet_dashboard.xml new file mode 100644 index 00000000..aee952cf --- /dev/null +++ b/spreadsheet_dashboard_oca/views/spreadsheet_dashboard.xml @@ -0,0 +1,56 @@ + + + + + spreadsheet.dashboard.tree (in spreadsheet_dashboard_oca) + spreadsheet.dashboard + + + + 1 + not active + + + + + + + + + +
+ Last updated at +
+ + + + + + + + + + +
+
+
List name
+ +
+
+
Model
+
()
+
+
+
Domain
+ + +
+
+ + +
+
+ + +
+
+ Last updated at +
+
+
+ +
+
+ +
+
+ + +
+
+
+ + + +
+
+ +
+
+ Label +
+
+ +
+
+
+
Time range
+
+ +
+
+
+
Default value
+
+ + +
+
+ +
+
+ +
+ +
+ +
+
Related model
+
+ +
+
+
+
+ - +
+
+
+ +
+
+ +
+ +
+
+
+ + + +
+
+ + + + + + + name is required + + + + + + + + + + + + + +
+ + + + + + + +
+
+ +
+ +
+
+ +
+
+ +
+ +
+ + + + + + + + + + +
+
+
+
+
+ + + +
+
+ + + +
+
+ +
+ + +
+
+ + + + + + + +
+ +
+ + +
+ +
+ + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
Link to Odoo menu
+
+ +
+
+
+ + +
+ +
+
+
+ + +
+
Link to Odoo menu
+
+ +
+
+
+
+ + +
+
Link to Odoo menu
+
+ +
+
+
+
+ + +
+
Link to Odoo menu
+
+ +
+
+
+
+ + +
+
Link to Odoo menu
+
+ +
+
+
+
+ + +
+
Link to Odoo menu
+
+ +
+
+
+
+ + diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js new file mode 100644 index 00000000..81de6fa6 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js @@ -0,0 +1,275 @@ +import * as spreadsheet from "@odoo/o-spreadsheet"; + +import {Domain} from "@web/core/domain"; +import {SpreadsheetControlPanel} from "./spreadsheet_controlpanel.esm"; +import {SpreadsheetRenderer} from "./spreadsheet_renderer.esm"; +import {deepCopy} from "@web/core/utils/objects"; +import {helpers} from "@odoo/o-spreadsheet"; +import {registry} from "@web/core/registry"; +import {standardActionServiceProps} from "@web/webclient/actions/action_service"; +import {useService} from "@web/core/utils/hooks"; + +const {load} = spreadsheet; + +const uuidGenerator = new spreadsheet.helpers.UuidGenerator(); +const actionRegistry = registry.category("actions"); +const {Component, onWillStart, useSubEnv} = owl; +const {parseDimension, isDateOrDatetimeField} = helpers; + +function normalizeGroupBys(dimensions, fields) { + return dimensions.map((dimension) => { + if ( + isDateOrDatetimeField(fields[dimension.fieldName]) && + !dimension.granularity + ) { + return {granularity: "month", ...dimension}; + } + return dimension; + }); +} + +export class ActionSpreadsheetOca extends Component { + setup() { + this.orm = useService("orm"); + this.notification = useService("notification"); + const params = this.props.action.params || this.props.action.context.params; + this.spreadsheetId = params.spreadsheet_id || params.active_id; + this.model = params.model || "spreadsheet.spreadsheet"; + this.import_data = params.import_data || {}; + onWillStart(async () => { + // We need to load in case the data comes from an XLSX + this.record = + load( + await this.orm.call( + this.model, + "get_spreadsheet_data", + [[this.spreadsheetId]], + {context: {bin_size: false}} + ) + ) || {}; + }); + useSubEnv({ + saveRecord: this.saveRecord.bind(this), + importData: this.importData.bind(this), + notifyUser: this.notifyUser.bind(this), + }); + } + + notifyUser(notification) { + this.notification.add(notification.text, { + type: notification.type, + sticky: notification.sticky, + }); + } + async saveRecord(data) { + if (this.record.mode === "readonly") { + return; + } + if (this.spreadsheetId) { + this.orm.call(this.model, "write", [this.spreadsheetId, data]); + } else { + this.spreadsheetId = await this.orm.call(this.model, "create", [data]); + } + } + /** + * Clean SearchParams of conflictive keys. + * + * 1. Removed from context pivot conflictive keys. + * 2. Removed from context graph conflictive keys. + * + * @returns {Object} Formated searchParams. + */ + cleanSearchParams() { + const searchParams = this.import_data.searchParams; + const context = {}; + for (var key of Object.keys(searchParams.context)) { + if (key.startsWith("pivot_") || key.startsWith("graph_")) { + continue; + } + context[key] = searchParams.context[key]; + } + return {...searchParams, context}; + } + async importDataGraph(spreadsheet_model) { + var sheetId = spreadsheet_model.getters.getActiveSheetId(); + if (this.import_data.new === undefined && this.import_data.new_sheet) { + sheetId = uuidGenerator.uuidv4(); + spreadsheet_model.dispatch("CREATE_SHEET", { + sheetId, + position: spreadsheet_model.getters.getSheetIds().length, + }); + // We want to open the new sheet + const sheetIdFrom = spreadsheet_model.getters.getActiveSheetId(); + spreadsheet_model.dispatch("ACTIVATE_SHEET", { + sheetIdFrom, + sheetIdTo: sheetId, + }); + } else if (this.import_data.new === undefined) { + // TODO: Add a way to detect the last row total height + } + const dataSourceId = uuidGenerator.uuidv4(); + const chartType = `odoo_${this.import_data.metaData.mode}`; + const definition = { + title: {text: this.import_data.name}, + type: chartType, + fillArea: chartType === "odoo_line", + background: "#FFFFFF", + stacked: this.import_data.metaData.stacked, + metaData: this.import_data.metaData, + searchParams: this.cleanSearchParams(), + dataSourceId: dataSourceId, + id: uuidGenerator.uuidv4(), + cumulative: this.import_data.metaData.cumulated, + cumulatedStart: this.import_data.metaData.cumulatedStart, + legendPosition: "top", + verticalAxisPosition: "left", + actionXmlId: this.import_data.actionXmlId, + }; + spreadsheet_model.dispatch("CREATE_CHART", { + sheetId, + id: dataSourceId, + position: { + x: 0, + y: 0, + }, + definition, + }); + } + importCreateOrReuseSheet(spreadsheet_model) { + var sheetId = spreadsheet_model.getters.getActiveSheetId(); + if (this.import_data.new === undefined) { + sheetId = uuidGenerator.uuidv4(); + spreadsheet_model.dispatch("CREATE_SHEET", { + sheetId, + position: spreadsheet_model.getters.getSheetIds().length, + }); + // We want to open the new sheet + const sheetIdFrom = spreadsheet_model.getters.getActiveSheetId(); + spreadsheet_model.dispatch("ACTIVATE_SHEET", { + sheetIdFrom, + sheetIdTo: sheetId, + }); + } + return sheetId; + } + async importDataList(spreadsheet_model) { + var sheetId = this.importCreateOrReuseSheet(spreadsheet_model); + if (!sheetId) { + const sheetIds = spreadsheet_model.getters.getSheetIds(); + sheetId = sheetIds.length ? sheetIds[0] : uuidGenerator.uuidv4(); + } + const listId = spreadsheet_model.getters.getNextListId(); + const list_info = { + metaData: { + resModel: this.import_data.metaData.model, + columns: this.import_data.metaData.columns.map((column) => column.name), + fields: this.import_data.metaData.fields, + }, + searchParams: { + domain: new Domain(this.import_data.metaData.domain).toJson(), + context: this.import_data.metaData.context, + orderBy: this.import_data.metaData.orderBy, + }, + name: this.import_data.name, + actionXmlId: this.import_data.actionXmlId, + }; + const columns = this.import_data.metaData.columns.map((c) => ({ + name: c.name, + type: this.import_data.metaData.fields[c.name].type, + })); + spreadsheet_model.dispatch("INSERT_ODOO_LIST_WITH_TABLE", { + sheetId, + col: 0, + row: 0, + id: listId, + definition: list_info, + linesNumber: this.import_data.dyn_number_of_rows, + columns: columns, + }); + const dataSource = spreadsheet_model.getters.getListDataSource(listId); + await dataSource.load(); + spreadsheet_model.dispatch("AUTORESIZE_COLUMNS", { + sheetId, + cols: Array.from({length: columns.length}, (_, i) => i), + }); + } + async importDataPivot(spreadsheet_model) { + var sheetId = this.importCreateOrReuseSheet(spreadsheet_model); + const pivotId = uuidGenerator.uuidv4(); + const fields = this.import_data.metaData.fields || {}; + const activeMeasures = this.import_data.metaData.activeMeasures; + const measures = activeMeasures.map((measure) => ({ + id: fields[measure]?.aggregator + ? `${measure}:${fields[measure].aggregator}` + : measure, + fieldName: measure, + aggregator: fields[measure]?.aggregator, + })); + const sortedMeasure = this.import_data.metaData.sortedColumn?.measure; + const sortedColumn = activeMeasures.includes(sortedMeasure) + ? this.import_data.metaData.sortedColumn + : null; + const colGroupBys = (this.import_data.metaData.colGroupBys || []).concat( + this.import_data.metaData.expandedColGroupBys || [] + ); + const rowGroupBys = (this.import_data.metaData.rowGroupBys || []).concat( + this.import_data.metaData.expandedRowGroupBys || [] + ); + const pivot_info = deepCopy({ + type: "ODOO", + domain: new Domain(this.import_data.searchParams.domain).toJson(), + context: this.import_data.searchParams.context, + sortedColumn, + measures, + model: this.import_data.metaData.resModel, + columns: normalizeGroupBys(colGroupBys.map(parseDimension), fields), + rows: normalizeGroupBys(rowGroupBys.map(parseDimension), fields), + name: this.import_data.name, + actionXmlId: this.import_data.actionXmlId, + }); + spreadsheet_model.dispatch("ADD_PIVOT", { + pivotId, + pivot: pivot_info, + }); + const ds = spreadsheet_model.getters.getPivot(pivotId); + await ds.load(); + const table = ds.getTableStructure(); + spreadsheet_model.dispatch("INSERT_PIVOT_WITH_TABLE", { + sheetId, + col: 0, + row: 0, + pivotId, + table: table.export(), + pivotMode: "dynamic", + }); + const columns = []; + for ( + let col = 0; + col <= table.columns[table.columns.length - 1].length; + col++ + ) { + columns.push(col); + } + spreadsheet_model.dispatch("AUTORESIZE_COLUMNS", {sheetId, cols: columns}); + } + async importData(spreadsheet_model) { + if (this.import_data.mode === "pivot") { + await this.importDataPivot(spreadsheet_model); + } + if (this.import_data.mode === "graph") { + await this.importDataGraph(spreadsheet_model); + } + if (this.import_data.mode === "list") { + await this.importDataList(spreadsheet_model); + } + } +} +ActionSpreadsheetOca.template = "spreadsheet_oca.ActionSpreadsheetOca"; +ActionSpreadsheetOca.components = { + SpreadsheetRenderer, + SpreadsheetControlPanel, +}; +ActionSpreadsheetOca.props = {...standardActionServiceProps}; +actionRegistry.add("action_spreadsheet_oca", ActionSpreadsheetOca, { + force: true, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js new file mode 100644 index 00000000..4b5d8647 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js @@ -0,0 +1,50 @@ +import {Component} from "@odoo/owl"; +import {ControlPanel} from "@web/search/control_panel/control_panel"; +import {useService} from "@web/core/utils/hooks"; + +const {useState} = owl; + +export class SpreadsheetName extends Component { + setup() { + this.state = useState({ + name: this.props.name, + }); + } + _onNameChanged(ev) { + if (this.props.isReadonly) { + return; + } + if (ev.target.value) { + this.env.saveRecord({name: ev.target.value}); + } + this.state.name = ev.target.value; + if (this.props.onChanged) { + this.props.onChanged(ev); + } + } +} +SpreadsheetName.template = "spreadsheet_oca.SpreadsheetName"; +SpreadsheetName.props = { + name: String, + isReadonly: Boolean, + onChanged: {type: Function, optional: true}, +}; + +export class SpreadsheetControlPanel extends ControlPanel { + setup() { + super.setup(); + this.actionService = useService("action"); + } + + onBreadcrumbClicked(jsId) { + this.actionService.restore(jsId); + } +} +SpreadsheetControlPanel.template = "spreadsheet_oca.SpreadsheetControlPanel"; +SpreadsheetControlPanel.props = { + ...ControlPanel.props, + record: Object, +}; +SpreadsheetControlPanel.components = { + SpreadsheetName, +}; diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js new file mode 100644 index 00000000..83aae8cf --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js @@ -0,0 +1,212 @@ +import * as spreadsheet from "@odoo/o-spreadsheet"; + +import {Component} from "@odoo/owl"; +import {ImageFileStore} from "./image_file_store.esm"; +import {OdooDataProvider} from "@spreadsheet/data_sources/odoo_data_provider"; +import {SpreadsheetComponent} from "@spreadsheet/actions/spreadsheet_component"; +import {_t} from "@web/core/l10n/translation"; +import {loadSpreadsheetDependencies} from "@spreadsheet/assets_backend/helpers"; +import {useService} from "@web/core/utils/hooks"; +import {useSetupAction} from "@web/search/action_hook"; +import {user} from "@web/core/user"; +import {waitForDataLoaded} from "@spreadsheet/helpers/model"; + +const {Model, load} = spreadsheet; + +const {useSubEnv, onWillStart} = owl; +const {useStoreProvider, ModelStore} = spreadsheet.stores; +const uuidGenerator = new spreadsheet.helpers.UuidGenerator(); + +class SpreadsheetTransportService { + constructor(orm, bus_service, model, res_id) { + this.orm = orm; + this.bus_service = bus_service; + this.model = model; + this.res_id = res_id; + this.channel = "spreadsheet_oca;" + this.model + ";" + this.res_id; + this.bus_service.addChannel(this.channel); + this.dialog = useService("dialog"); + this.bus_service.subscribe("notification", (payload) => { + if (payload.id === this.res_id) { + this._handleNotification(payload); + } + }); + this.listeners = []; + this._listener = null; + } + onNotification({detail: notifications}) { + for (const {payload, type} of notifications) { + if ( + type === "spreadsheet_oca" && + payload.res_model === this.model && + payload.res_id === this.res_id + ) { + // What shall we do if no callback is defined (empty until onNewMessage...) :/ + for (const {callback} of this.listeners) { + callback(payload); + } + } + } + } + async sendMessage(message) { + const isAccepted = await this.orm.call(this.model, "send_spreadsheet_message", [ + [this.res_id], + message, + this.accessToken, + ]); + if (isAccepted) { + this._handleNotification(message); + } + } + onNewMessage(id, callback) { + this._listener = callback; + for (const message of this.listeners) { + callback(message); + } + this.listeners = []; + } + leave(id) { + this.listeners = this.listeners.filter((listener) => listener.id !== id); + } + _handleNotification(payload) { + if (!this._listener) { + this.listeners.push(payload); + } else { + this._listener(payload); + } + } +} + +export class SpreadsheetRenderer extends Component { + createDefaultCurrency(currency) { + if (!currency) { + return undefined; + } + return { + symbol: currency.symbol, + position: currency.position, + decimalPlaces: currency.decimal_places, + }; + } + getLocales() { + const orm = useService("orm"); + return async () => { + return orm.call("res.lang", "get_locales_for_spreadsheet", []); + }; + } + getCurrencies() { + const orm = useService("orm"); + return async () => { + const odooCurrencies = await orm.searchRead( + "res.currency", + [], + ["symbol", "full_name", "position", "name", "decimal_places"], + { + order: "active DESC, full_name ASC", + context: {active_test: false}, + } + ); + return odooCurrencies.map((currency) => { + return { + code: currency.name, + symbol: currency.symbol, + position: currency.position || "after", + name: currency.full_name || _t("Currency"), + decimalPlaces: currency.decimal_places || 2, + }; + }); + }; + } + setup() { + this.orm = useService("orm"); + this.http = useService("http"); + this.bus_service = this.env.services.bus_service; + this.ui = useService("ui"); + this.action = useService("action"); + this.dialog = useService("dialog"); + this.notifications = useService("notification"); + const odooDataProvider = new OdooDataProvider(this.env); + this.loadCurrencies = this.getCurrencies(); + this.loadLocales = this.getLocales(); + const defaultCurrency = this.props.record.default_currency; + this.fileStore = new ImageFileStore( + this.props.model, + this.props.res_id, + this.http, + this.orm + ); + this.stores = useStoreProvider(); + // The o-spreadsheet Model handles currency formatting internally + this.spreadsheet_model = new Model( + load(this.props.record.spreadsheet_raw), + { + custom: {env: this.env, orm: this.orm, odooDataProvider}, + defaultCurrency: this.createDefaultCurrency(defaultCurrency), + external: { + loadCurrencies: this.loadCurrencies, + loadLocales: this.loadLocales, + fileStore: this.fileStore, + }, + transportService: new SpreadsheetTransportService( + this.orm, + this.bus_service, + this.props.model, + this.props.res_id + ), + client: { + id: uuidGenerator.uuidv4(), + name: user.name, + userId: user.userId, + }, + mode: this.props.record.mode, + }, + this.props.record.revisions + ); + useSubEnv({ + saveSpreadsheet: this.onSpreadsheetSaved.bind(this), + downloadAsXLXS: this.downloadAsXLXS.bind(this), + }); + onWillStart(async () => { + await loadSpreadsheetDependencies(); + await waitForDataLoaded(this.spreadsheet_model); + await this.env.importData(this.spreadsheet_model); + this.spreadsheet_model.joinSession(); + this.stores.inject(ModelStore, this.spreadsheet_model); + }); + useSetupAction({ + beforeLeave: this.onSpreadsheetSaved.bind(this), + }); + odooDataProvider.addEventListener("data-source-updated", () => { + const sheetId = this.spreadsheet_model.getters.getActiveSheetId(); + this.spreadsheet_model.dispatch("EVALUATE_CELLS", {sheetId}); + }); + } + async onSpreadsheetSaved() { + const data = this.spreadsheet_model.exportData(); + await this.env.saveRecord({spreadsheet_raw: data}); + await this.spreadsheet_model.leaveSession(); + this.spreadsheet_model.off("update", this); + } + async downloadAsXLXS() { + this.ui.block(); + await waitForDataLoaded(this.spreadsheet_model); + await this.action.doAction({ + type: "ir.actions.client", + tag: "action_download_spreadsheet", + params: { + name: this.props.record.name, + xlsxData: this.spreadsheet_model.exportXLSX(), + }, + }); + this.ui.unblock(); + } +} + +SpreadsheetRenderer.template = "spreadsheet_oca.SpreadsheetRenderer"; +SpreadsheetRenderer.components = {SpreadsheetComponent}; +SpreadsheetRenderer.props = { + record: Object, + res_id: Number, + model: String, + importData: Function, +}; diff --git a/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js b/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js new file mode 100644 index 00000000..04238fa6 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js @@ -0,0 +1,24 @@ +import {GraphRenderer} from "@web/views/graph/graph_renderer"; + +import {patch} from "@web/core/utils/patch"; + +patch(GraphRenderer.prototype, { + onSpreadsheetButtonClicked() { + this.actionService.doAction( + "spreadsheet_oca.spreadsheet_spreadsheet_import_act_window", + { + additionalContext: { + default_name: this.model.metaData.title, + default_datasource_name: this.model.metaData.title, + default_import_data: { + mode: "graph", + metaData: JSON.parse(JSON.stringify(this.model.metaData)), + searchParams: JSON.parse( + JSON.stringify(this.model.searchParams) + ), + }, + }, + } + ); + }, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml b/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml new file mode 100644 index 00000000..f5dc344d --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml @@ -0,0 +1,19 @@ + + + + + + + +
+ diff --git a/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js b/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js new file mode 100644 index 00000000..beccbe38 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js @@ -0,0 +1,63 @@ +import {useBus, useService} from "@web/core/utils/hooks"; + +import {HandleField} from "@web/views/fields/handle/handle_field"; +import {ListRenderer} from "@web/views/list/list_renderer"; +import {omit} from "@web/core/utils/objects"; +import {patch} from "@web/core/utils/patch"; +import {user} from "@web/core/user"; + +patch(ListRenderer.prototype, { + setup() { + super.setup(...arguments); + this.actionService = useService("action"); + useBus( + this.env.bus, + "addListOnSpreadsheet", + this.onAddListOnSpreadsheet.bind(this) + ); + }, + onAddListOnSpreadsheet() { + const model = this.env.model.root; + this.actionService.doAction( + "spreadsheet_oca.spreadsheet_spreadsheet_import_act_window", + { + additionalContext: { + default_name: this.env.config.getDisplayName(), + default_datasource_name: this.env.config.getDisplayName(), + default_can_be_dynamic: true, + default_dynamic: true, + default_is_tree: true, + default_number_of_rows: Math.min(model.count, model.limit), + default_import_data: { + mode: "list", + metaData: { + model: model.resModel, + domain: model.domain, + orderBy: model.orderBy, + context: omit( + model.searchParams?.context || {}, + ...Object.keys(user.context) + ), + columns: this.getSpreadsheetColumns(), + fields: model.fields, + name: this.env.config.getDisplayName(), + }, + }, + }, + } + ); + }, + getSpreadsheetColumns() { + const fields = this.env.model.root.fields; + return this.columns + .filter( + (col) => + col.type === "field" && + col.field.component !== HandleField && + !col.relatedPropertyField && + !["binary", "json"].includes(fields[col.name].type) + // We want to avoid binary or json fields + ) + .map((col) => ({name: col.name, type: fields[col.name].type})); + }, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js new file mode 100644 index 00000000..101544c9 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js @@ -0,0 +1,66 @@ +import {PivotRenderer} from "@web/views/pivot/pivot_renderer"; +import {_t} from "@web/core/l10n/translation"; +import {patch} from "@web/core/utils/patch"; + +patch(PivotRenderer.prototype, { + isComparingInfo() { + return Boolean(this.model.searchParams.comparison); + }, + containsDuplicatedGroupBys() { + const colGroupBys = new Set( + this.model.metaData.colGroupBys + .concat(this.model.metaData.expandedColGroupBys) + .map((el) => el.split(":")[0]) + ); + const rowGroupBys = new Set( + this.model.metaData.rowGroupBys + .concat(this.model.metaData.expandedRowGroupBys) + .map((el) => el.split(":")[0]) + ); + return Boolean(colGroupBys.intersection(rowGroupBys).size); + }, + containsColGroupBys() { + const colGroupBys = new Set( + this.model.metaData.colGroupBys + .concat(this.model.metaData.expandedColGroupBys) + .map((el) => el.split(":")[0]) + ); + return Boolean(colGroupBys.size); + }, + disableSpreadsheetInsertion() { + return ( + !this.model.hasData() || + !this.model.metaData.activeMeasures.length || + this.containsDuplicatedGroupBys() || + this.isComparingInfo() + ); + }, + getSpreadsheetInsertionTooltip() { + var message = _t("Add to spreadsheet"); + if (this.containsDuplicatedGroupBys()) { + message = _t("Duplicated groupbys in pivot are not supported"); + } else if (this.isComparingInfo()) { + message = _t("Comparisons in pivot are not supported"); + } + return message; + }, + onSpreadsheetButtonClicked() { + this.actionService.doAction( + "spreadsheet_oca.spreadsheet_spreadsheet_import_act_window", + { + additionalContext: { + default_name: this.model.metaData.title, + default_datasource_name: this.model.metaData.title, + default_can_be_dynamic: false, + default_import_data: { + mode: "pivot", + metaData: JSON.parse(JSON.stringify(this.model.metaData)), + searchParams: JSON.parse( + JSON.stringify(this.model.searchParams) + ), + }, + }, + } + ); + }, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml new file mode 100644 index 00000000..58969472 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml @@ -0,0 +1,19 @@ + + + + + + + + +
+ diff --git a/spreadsheet_oca/views/spreadsheet_spreadsheet.xml b/spreadsheet_oca/views/spreadsheet_spreadsheet.xml new file mode 100644 index 00000000..66dc4882 --- /dev/null +++ b/spreadsheet_oca/views/spreadsheet_spreadsheet.xml @@ -0,0 +1,96 @@ + + + + + spreadsheet.spreadsheet.search (in spreadsheet_oca) + spreadsheet.spreadsheet + + + + + + + spreadsheet.spreadsheet.tree (in spreadsheet_oca) + spreadsheet.spreadsheet + + + + +