From 06514c2d08ac78d1a98d3b875f59c838fa82da9a Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Wed, 28 Dec 2022 13:34:05 +0100 Subject: [PATCH 001/100] [ADD] spreadsheet_oca --- spreadsheet_oca/README.rst | 70 +++ spreadsheet_oca/__init__.py | 1 + spreadsheet_oca/__manifest__.py | 32 ++ spreadsheet_oca/i18n/spreadsheet_oca.pot | 217 +++++++++ spreadsheet_oca/models/__init__.py | 3 + .../models/spreadsheet_abstract.py | 76 ++++ .../models/spreadsheet_oca_revision.py | 18 + .../models/spreadsheet_spreadsheet.py | 57 +++ spreadsheet_oca/readme/CONTRIBUTORS.rst | 1 + spreadsheet_oca/readme/DESCRIPTION.rst | 1 + spreadsheet_oca/security/ir.model.access.csv | 3 + spreadsheet_oca/security/security.xml | 52 +++ spreadsheet_oca/static/description/icon.png | Bin 0 -> 4207 bytes spreadsheet_oca/static/description/icon.svg | 1 + spreadsheet_oca/static/description/index.html | 419 ++++++++++++++++++ .../src/spreadsheet/bundle/spreadsheet.xml | 110 +++++ .../bundle/spreadsheet_action.esm.js | 98 ++++ .../bundle/spreadsheet_controlpanel.esm.js | 41 ++ .../bundle/spreadsheet_renderer.esm.js | 113 +++++ .../src/spreadsheet/pivot_controller.esm.js | 27 ++ .../static/src/spreadsheet/spreadsheet.scss | 23 + .../static/src/spreadsheet/spreadsheet.xml | 17 + .../src/spreadsheet/spreadsheet_action.esm.js | 21 + .../views/spreadsheet_spreadsheet.xml | 78 ++++ 24 files changed, 1479 insertions(+) create mode 100644 spreadsheet_oca/README.rst create mode 100644 spreadsheet_oca/__init__.py create mode 100644 spreadsheet_oca/__manifest__.py create mode 100644 spreadsheet_oca/i18n/spreadsheet_oca.pot create mode 100644 spreadsheet_oca/models/__init__.py create mode 100644 spreadsheet_oca/models/spreadsheet_abstract.py create mode 100644 spreadsheet_oca/models/spreadsheet_oca_revision.py create mode 100644 spreadsheet_oca/models/spreadsheet_spreadsheet.py create mode 100644 spreadsheet_oca/readme/CONTRIBUTORS.rst create mode 100644 spreadsheet_oca/readme/DESCRIPTION.rst create mode 100644 spreadsheet_oca/security/ir.model.access.csv create mode 100644 spreadsheet_oca/security/security.xml create mode 100644 spreadsheet_oca/static/description/icon.png create mode 100644 spreadsheet_oca/static/description/icon.svg create mode 100644 spreadsheet_oca/static/description/index.html create mode 100644 spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml create mode 100644 spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js create mode 100644 spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js create mode 100644 spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js create mode 100644 spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js create mode 100644 spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss create mode 100644 spreadsheet_oca/static/src/spreadsheet/spreadsheet.xml create mode 100644 spreadsheet_oca/static/src/spreadsheet/spreadsheet_action.esm.js create mode 100644 spreadsheet_oca/views/spreadsheet_spreadsheet.xml diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst new file mode 100644 index 00000000..12ebd8ba --- /dev/null +++ b/spreadsheet_oca/README.rst @@ -0,0 +1,70 @@ +=============== +Spreadsheet Oca +=============== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fspreadsheet-lightgray.png?logo=github + :target: https://github.com/OCA/spreadsheet/tree/16.0/spreadsheet_oca + :alt: OCA/spreadsheet +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/spreadsheet-16-0/spreadsheet-16-0-spreadsheet_oca + :alt: Translate me on Weblate + +|badge1| |badge2| |badge3| |badge4| + +This module adds a functionality for adding and editing Spreadsheets using Odoo CE. + +**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 smashing 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 + +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_oca/__init__.py b/spreadsheet_oca/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/spreadsheet_oca/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py new file mode 100644 index 00000000..41b10bb1 --- /dev/null +++ b/spreadsheet_oca/__manifest__.py @@ -0,0 +1,32 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Spreadsheet Oca", + "summary": """ + Allow to edit spreadsheets""", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "author": "CreuBlanca,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/spreadsheet", + "depends": ["spreadsheet", "base_sparse_field", "bus"], + "data": [ + "security/security.xml", + "security/ir.model.access.csv", + "views/spreadsheet_spreadsheet.xml", + ], + "assets": { + "web.assets_backend": [ + "spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss", + "spreadsheet_oca/static/src/spreadsheet/spreadsheet.xml", + "spreadsheet_oca/static/src/spreadsheet/spreadsheet_action.esm.js", + "spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js", + ], + "spreadsheet.o_spreadsheet": [ + "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml", + "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js", + "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js", + "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js", + ], + }, +} diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot new file mode 100644 index 00000000..f269c9db --- /dev/null +++ b/spreadsheet_oca/i18n/spreadsheet_oca.pot @@ -0,0 +1,217 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Change name" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__client_id +msgid "Client" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands +msgid "Commands" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_ids +msgid "Contributors" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_uid +msgid "Created by" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_date +msgid "Created on" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__data +msgid "Data" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__display_name +msgid "Display Name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/spreadsheet.xml:0 +#, python-format +msgid "Download xlsx" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_tree_view +msgid "Edit" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js:0 +#, python-format +msgid "File" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__filename +msgid "Filename" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__id +msgid "ID" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision____last_update +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet____last_update +msgid "Last Modified on" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_date +msgid "Last Updated on" +msgstr "" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_manager +msgid "Manager" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__model +msgid "Model" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__name +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Name" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__next_revision_id +msgid "Next Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__owner_id +msgid "Owner" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_ids +msgid "Readers" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__res_id +msgid "Res" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js:0 +#, python-format +msgid "Save" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__server_revision_id +msgid "Server Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet +#: model:ir.module.category,name:spreadsheet_oca.module_category_spreedsheet +msgid "Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_oca_revision +msgid "Spreadsheet Oca Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_raw +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_revision_ids +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_abstract +msgid "Spreadsheet abstract for inheritance" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_act_window +#: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_menu +msgid "Spreadsheets" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type +msgid "Type" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Unnamed" +msgstr "" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_user +msgid "User" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "name is required" +msgstr "" diff --git a/spreadsheet_oca/models/__init__.py b/spreadsheet_oca/models/__init__.py new file mode 100644 index 00000000..ae532164 --- /dev/null +++ b/spreadsheet_oca/models/__init__.py @@ -0,0 +1,3 @@ +from . import spreadsheet_abstract +from . import spreadsheet_spreadsheet +from . import spreadsheet_oca_revision diff --git a/spreadsheet_oca/models/spreadsheet_abstract.py b/spreadsheet_oca/models/spreadsheet_abstract.py new file mode 100644 index 00000000..9f497c88 --- /dev/null +++ b/spreadsheet_oca/models/spreadsheet_abstract.py @@ -0,0 +1,76 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import json + +from odoo import fields, models +from odoo.exceptions import AccessError + + +class SpreadsheetAbstract(models.AbstractModel): + _name = "spreadsheet.abstract" + _description = "Spreadsheet abstract for inheritance" + + name = fields.Char(required=True) + spreadsheet_raw = fields.Serialized() + spreadsheet_revision_ids = fields.One2many( + "spreadsheet.oca.revision", + inverse_name="res_id", + domain=lambda r: [("model", "=", r._name)], + ) + + def get_spreadsheet_data(self): + self.ensure_one() + mode = "normal" + try: + self.check_access_rights("write") + self.check_access_rule("write") + except AccessError: + mode = "readonly" + return { + "name": self.name, + "spreadsheet_raw": self.spreadsheet_raw, + "revisions": [ + { + "type": revision.type, + "clientId": revision.client_id, + "nextRevisionId": revision.next_revision_id, + "serverRevisionId": revision.server_revision_id, + "commands": json.loads(revision.commands), + } + for revision in self.spreadsheet_revision_ids + ], + "mode": mode, + } + + def open_spreadsheet(self): + self.ensure_one() + return { + "type": "ir.actions.client", + "tag": "action_spreadsheet_oca", + "params": {"spreadsheet_id": self.id, "model": self._name}, + } + + def send_spreadsheet_message(self, message): + self.ensure_one() + channel = "spreadsheet_oca;%s;%s" % (self._name, self.id) + message.update({"res_model": self._name, "res_id": self.id}) + if message["type"] in ["REVISION_UNDONE", "REMOTE_REVISION", "REVISION_REDONE"]: + self.env["spreadsheet.oca.revision"].create( + { + "model": self._name, + "res_id": self.id, + "type": message["type"], + "client_id": message["clientId"], + "next_revision_id": message["nextRevisionId"], + "server_revision_id": message["serverRevisionId"], + "commands": json.dumps(message["commands"]), + } + ) + self.env["bus.bus"]._sendone(channel, "spreadsheet_oca", message) + return True + + def write(self, vals): + if "spreadsheet_raw" in vals: + self.spreadsheet_revision_ids.unlink() + return super().write(vals) diff --git a/spreadsheet_oca/models/spreadsheet_oca_revision.py b/spreadsheet_oca/models/spreadsheet_oca_revision.py new file mode 100644 index 00000000..66197d9b --- /dev/null +++ b/spreadsheet_oca/models/spreadsheet_oca_revision.py @@ -0,0 +1,18 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class SpreadsheetOcaRevision(models.Model): + + _name = "spreadsheet.oca.revision" + _description = "Spreadsheet Oca Revision" # TODO + + model = fields.Char(required=True) + res_id = fields.Integer(required=True, index=True) + type = fields.Char() + client_id = fields.Char() + server_revision_id = fields.Char() + next_revision_id = fields.Char() + commands = fields.Char() diff --git a/spreadsheet_oca/models/spreadsheet_spreadsheet.py b/spreadsheet_oca/models/spreadsheet_spreadsheet.py new file mode 100644 index 00000000..88b57380 --- /dev/null +++ b/spreadsheet_oca/models/spreadsheet_spreadsheet.py @@ -0,0 +1,57 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import base64 +import json + +from odoo import _, api, fields, models + + +class SpreadsheetSpreadsheet(models.Model): + _name = "spreadsheet.spreadsheet" + _inherit = "spreadsheet.abstract" + _description = "Spreadsheet" + + data = fields.Binary() + filename = fields.Char(compute="_compute_filename") + spreadsheet_raw = fields.Serialized( + compute="_compute_spreadsheet_raw", inverse="_inverse_spreadsheet_raw" + ) + owner_id = fields.Many2one( + "res.users", required=True, default=lambda r: r.env.user.id + ) + contributor_ids = fields.Many2many( + "res.users", + relation="spreadsheet_contributor", + column1="spreadsheet_id", + column2="user_id", + string="Contributors", + ) + reader_ids = fields.Many2many( + "res.users", + relation="spreadsheet_reader", + column1="spreadsheet_id", + column2="user_id", + string="Readers", + ) + + @api.depends("name") + def _compute_filename(self): + for record in self: + record.filename = "%s.json" % (self.name or _("Unnamed")) + + @api.depends("data") + def _compute_spreadsheet_raw(self): + for dashboard in self: + if dashboard.data: + dashboard.spreadsheet_raw = json.loads( + base64.decodebytes(dashboard.data).decode("UTF-8") + ) + else: + dashboard.spreadsheet_raw = {} + + def _inverse_spreadsheet_raw(self): + for record in self: + record.data = base64.encodebytes( + json.dumps(record.spreadsheet_raw).encode("UTF-8") + ) diff --git a/spreadsheet_oca/readme/CONTRIBUTORS.rst b/spreadsheet_oca/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..85004765 --- /dev/null +++ b/spreadsheet_oca/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Enric Tobella diff --git a/spreadsheet_oca/readme/DESCRIPTION.rst b/spreadsheet_oca/readme/DESCRIPTION.rst new file mode 100644 index 00000000..7fbd3af7 --- /dev/null +++ b/spreadsheet_oca/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module adds a functionality for adding and editing Spreadsheets using Odoo CE. diff --git a/spreadsheet_oca/security/ir.model.access.csv b/spreadsheet_oca/security/ir.model.access.csv new file mode 100644 index 00000000..40c44338 --- /dev/null +++ b/spreadsheet_oca/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_spreadsheet_spreadsheet,access_spreadsheet_spreadsheet,model_spreadsheet_spreadsheet,group_user,1,1,1,1 +access_spreadsheet_oca_revision,access_spreadsheet_oca_revision,model_spreadsheet_oca_revision,base.group_user,1,1,1,1 diff --git a/spreadsheet_oca/security/security.xml b/spreadsheet_oca/security/security.xml new file mode 100644 index 00000000..ef8d22a4 --- /dev/null +++ b/spreadsheet_oca/security/security.xml @@ -0,0 +1,52 @@ + + + + + + Spreadsheet + 99 + + + User + + + + Manager + + + + + + Spreadsheet Owner + + + [('owner_id','=', user.id)] + + + Spreadsheet Contributor + + + [('contributor_ids','=', user.id)] + + + + + Spreadsheet Reader + + + [('reader_ids','=', user.id)] + + + + + + Spreadsheet Manager + + + [(1,'=', 1)] + + diff --git a/spreadsheet_oca/static/description/icon.png b/spreadsheet_oca/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..34b37abace243eb7b653213f3035ed5669f9e592 GIT binary patch literal 4207 zcmV-#5RmVQP)7lIG~0Yfsui*3zDz}QD#Jz0HPrQB2kne z3P#Kjei#B#5+Vxza6zIZDnURQK*A;?Fbg>IX6C)=e*Io|*XECYy;Rq^-KV>%dU;dl z&&>PkoO5sW{p!}KbI+}kP$&29y8ZH~owzO{M~+owC2iZbRDT?j^G^V9BY;Hcd9v+B z8%*0l{0(GDvQ68{8n*tXDHpbF9lHGqNBehwyhYQDh0i1uZ4&_4wuO>if??~hV6|+N z{X>zq)Jah8g104qclLRBvGxBqkRU;oRH%qRkyM9P3B^BUCw5+N>#_%@RRBmDi+*dv zK4Zu9yBO2|hrBu2ywMOFI4mJ)$S8A=k>_Bpe8d+s!z-Q!uvxly*X@^&m&Skb-qhQG zWV;;o(@BJwKUhqPVYRv*Dx#Mu$9!Yek9SPJw+66x1KE%QlbT81=ftAr=S;=F0$Nu2HW$9Ads>vfQpw7dsbX zUBKj43Lyz*Hzv1I5MkZuT!;mavG4yO31%lIdvz3K=Rz!atnDB$B*E;$Itl_q63iZ~ z;~+33!R)|11%V+61|Rbr1coFSY|NJ+FeJg?V!j1|AqfT(^EC(zNicYr??GTlg2BQ9 z2?9eB3=S4p5EznRFt9*_z>oy}j|CnCh9u~3tSdoaNP_;w)XE=?<-?s|aa%*mP6MEK z*|bw~E^y$6$Q?esT|ey7YGxbl^v{q=$f^?n{QLbo!BoE-895W*S$PjmT(Z%1!lAfD zH%qwl!<+C)WEX(mk-(QAP|q1SussV+O}cbLp(Ub3q1q7#HjqJ}o-=T8dk&Uvfxgp+ zA`+YU#Re(}EM@iT-~#}xkOJ+9ZQ6qy1XiwmTequQnJvTFkYO5lXZPE##_NR+3*9m| zJr9fKEOz1V?tTY`sdwhIPL_|XL@JSTUs}*b@HeMgRa0U;lG_ z{@BwThjxwa#3lEh*TlAYpX=MW@tj+*b@TO<7XSkk1nM~h2Vc$B2EVH4GG$9Uc>;k4 z!j_{YP-L}0gJhq%ZS;E(sOJofZ_mNf>3dg5f{Ht4pP9BnVk&p4C}j;yyjC9kW_pd1 zSQG;wc>M}D!2&>uySNGfh>t{}Y4JLHsu?Ol)9|-U-!qa+;%=B!ZJrpCqx5<8^8PPL z5-$kUb0)@LD@Xf{C)$bx(K*#Hqm7K38xsA1k(7#9)cHK!(ff4--H6Un+1bHn?aC@m zV4$}oXt^9*KllLu*_9Hut=FeX?$pX`h;8fPcF?QG!KOi=o-=W9d$#tRU(xF`5_lPm z!<_`eAh2@f+qzAk6nBJ}wzHiCWRS{jquZIlQr4&qev{tLCKAy8c(!~JF#UBAbJYau zIkOz?mn@gj;Yb2cv&aCDz!3yi2Y=?u=MF|MNzjdZ^K2$Tl>kQ0tR{I{8TE_=B9|cv zyaj*#YasZTmEeyXX}PrdLY zzr?V~viM1BH)6wTI*{#U5UAGuIV+2SzVqJa$;AVeho>0hkySN_D$?< zYTF72fFl==x(Kj8JBArPB0`7^D;A|%WrAL`|mjo&`rF*#@G|JH01ORWFH~|TfA%*t8ERMoR zvZ*bJHco{KUDKCYr?s>#x6=F`A*yNYX%eVf6Br-~lt|r)drUM@B1dG%X6;}*whrAU z{{8rlAz5@fBfTU+Z8?~pk2p|IR{~kK0(XP75*Rb$Sf?L{Wu?_^+cv|TnZN-g0rx}) znFLnJLi9gFxO?hBVfC5QgKF7i8OwA-b3WEig2^HOH(UI`#Uy&4@I-sK^so=s0GKkR2B{|#`n*9pbej5 za8+iFuzzOJ#QuLBa$NbM71l=Si{)Su31X2LHjSRu@+7>-scXIvnD0~~h0~8bGcf-E zAn6hcZ&-+zG{j@><3*zY-O}9$>ck5P)CLW2BnYJ~u?!0%A1%X^mpv-fx$D{6@cfSF z9GIVL0=_N>hti(p{yPP8n%INcAVDq%%U#L;heC>N(mSz8UG~#P2SH#^%fW~8hj7ET zE!DrtVksuLX~Sk*aoW``{N_il!}#QQQ`=TG3jlD-h2O#nt2Q{WJqLE<&d0w^>T?3L zO6ve{;b$(!xhG%XI@lja`hQsbz%8J9xuH0w~lHI8#M9hbtjWY?3M)J-6H&XPhb~r2kbO2JIBDY z^}WWREua40D*cQJRF{H>nSc^GBC%f6CXy;+MHM@$3@IwN@6QPes(t_^DmwwnC*4p> zB{nSt_kTa01XM52`WzArttr<8($lhAUsNKd3TgtA%VS6t+N(Px2b-)31ky()T^J>; zO2pIz-G6?jlfIgLdQV`mBxuK0wC{i;e(Y#==}{PUHP^Ls{GtuG^ix*?b*ig|*D@Mx zU;GOK`e+1X(YKnwkOX}3T2$h<_*N6x?Lb5O)FIhzwu#t%mre1ATuc!W(68lSS0>Q! zN40J|UUDDRypTYaWGu-n6CO{;(zSNk;^9fhClYjJIk+2-mtJZN{eE<7#~uGx#Ix0xgdHDOy+sR|?N>quG_|sdSg=M#1F>{Nv&sxO24Se;&wfOUOFPF7jOcGab+=9za zx*7nW%8};EK1yFN2g{O-bUed8nNDOVmTIlkp(wI~bUe+{jj3_ORQLCVx*-F#92`n} zLjKl)W&-_A{e~hGe)^oU^(hm`&82fluPoB9S+kW>`0KhpL&&LDT{!FO* z<$KS^>mO`KYPE*B$s<^O6N%R#u=!`>y6~t*ntIC8dGXh|Z7;>kOwjtGn~ATq2XGR&{_^HL}1wZ@Q8Y-*c`(TS*vC@~q@vT`0kRKHk} z=$r^Nc+VO5L4uj(VA{D0^E*$_BU>+NW8cN&?ZxZuKsxHXOKV5S3yn9W_v&i)b0&}_ z8P9y}IhS7L*rN0j@)!Udnx4R9DF*;Zs2b)b=LvQ9<@Q3iN&tYU62r*Qe4*~a{C-Ru z1w`ctMp6s#)}A+USN4XM=fcGrmV@Ej?LYwal`VB{%~t%HNhUFjOk$X&J3qC6?YHqU z(X>oomxG-%Koxa&y%pCA?Fb*#gz@}g8&bGjF# zl`mR5@Ph=hP$48i&q$CS)yQd|60aoaU^$rCi9Q<0K_WqBeG=NzIC~I9c)-iS%ue*t zKn?;4Dudt5)^8FJyMsd#^nwJL(IgT?z!x+LWN!oM#Wo~CMJ+R0yYjtE=bhO5upI2g zHY7oMo#vSKMS4Mzpl)|C(@{tQ-$;-i)!GX9f*?V|w}Y9ELK1i;L1plp`RfJ=h?hk( z9fc(5m;`B$0iT~F5bO?SItoe9HVM+BNoY%BLfdYWK(6mxLyvimLK3h^kQ&vhgWt@y zn*(kOVDBkRB~B>~v$m+aUpCcQDUUNCGhlDudrluU8~+C4xc{c(ZLhx74VH z#A5fJf_@-@Z2_`A;rXdD`z?z}FJ9fdj8*VHK@^%W_J7r0|K3 z(pX3WKWx+MwY~`WM3`ByuO z=Zvg*%G9I@NPrxbAt^xpNO8Axv)}daWiUv0Ts;!)*dHW7TM|R={b}UhpBCDRHkEMN zZTlj!%O9MwbQ^ZVm&eqE@<%JBUF>qP{Od<-HL~Vbt6;CQ4O^pn!u(0tweS2dZ}o2* z@rAW*VeQ(M)dJpQAi5v>#-caMxwtw9C_LG%E{|9#BaE<9Z=wtu@002ovPDHLk FV1lYu>i7Tv literal 0 HcmV?d00001 diff --git a/spreadsheet_oca/static/description/icon.svg b/spreadsheet_oca/static/description/icon.svg new file mode 100644 index 00000000..ba496774 --- /dev/null +++ b/spreadsheet_oca/static/description/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html new file mode 100644 index 00000000..be8066a1 --- /dev/null +++ b/spreadsheet_oca/static/description/index.html @@ -0,0 +1,419 @@ + + + + + + +Spreadsheet Oca + + + +
+

Spreadsheet Oca

+ + +

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

+

This module adds a functionality for adding and editing Spreadsheets using Odoo CE.

+

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 smashing 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
  • +
+
+
+

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_oca/static/src/spreadsheet/bundle/spreadsheet.xml b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml new file mode 100644 index 00000000..a71c9910 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml @@ -0,0 +1,110 @@ + + + + +
+ + +
+
+ + + + + + + + name is required + + + + + + + + + + + + +
+
+
+ + + + + + + + + + +
+
+
+
+
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..663b4631 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js @@ -0,0 +1,98 @@ +/** @odoo-module **/ + +import PivotDataSource from "@spreadsheet/pivot/pivot_data_source"; +import {SpreadsheetControlPanel} from "./spreadsheet_controlpanel.esm"; +import {SpreadsheetRenderer} from "./spreadsheet_renderer.esm"; +import {registry} from "@web/core/registry"; +import spreadsheet from "@spreadsheet/o_spreadsheet/o_spreadsheet_extended"; +import {useService} from "@web/core/utils/hooks"; + +const uuidGenerator = new spreadsheet.helpers.UuidGenerator(); +const actionRegistry = registry.category("actions"); +const {Component, onMounted, onWillStart, useSubEnv} = owl; + +export class ActionSpreadsheetOca extends Component { + setup() { + this.router = useService("router"); + this.orm = useService("orm"); + const params = this.props.action.params || this.props.action.context.params; + this.spreadsheetId = params.spreadsheet_id; + this.model = params.model || "spreadsheet.spreadsheet"; + this.import_data = params.import_data || {}; + onMounted(() => { + this.router.pushState({ + spreadsheet_id: this.spreadsheetId, + model: this.model, + }); + }); + onWillStart(async () => { + this.record = + (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), + }); + } + 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]); + this.router.pushState({spreadsheet_id: this.spreadsheetId}); + } + } + async importDataPivot(spreadsheet_model) { + const sheetId = spreadsheet_model.getters.getActiveSheetId(); + const dataSourceId = uuidGenerator.uuidv4(); + const pivot_info = { + metaData: { + colGroupBys: this.import_data.metaData.colGroupBys, + rowGroupBys: this.import_data.metaData.rowGroupBys, + activeMeasures: this.import_data.metaData.activeMeasures, + resModel: this.import_data.metaData.resModel, + }, + searchParams: this.import_data.searchParams, + }; + const dataSource = spreadsheet_model.config.dataSources.add( + dataSourceId, + PivotDataSource, + pivot_info + ); + await dataSource.load(); + const {cols, rows, measures} = dataSource.getTableStructure().export(); + const table = { + cols, + rows, + measures, + }; + spreadsheet_model.dispatch("INSERT_PIVOT", { + sheetId, + col: 0, + row: 0, + id: spreadsheet_model.getters.getNextPivotId(), + table, + dataSourceId, + definition: pivot_info, + }); + } + async importData(spreadsheet_model) { + if (this.import_data.mode === "pivot") { + await this.importDataPivot(spreadsheet_model); + } + } +} +ActionSpreadsheetOca.template = "spreadsheet_oca.ActionSpreadsheetOca"; +ActionSpreadsheetOca.components = { + SpreadsheetRenderer, + SpreadsheetControlPanel, +}; +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..52d23556 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js @@ -0,0 +1,41 @@ +/** @odoo-module **/ + +import {_lt, _t} from "web.core"; +import {Component} from "@odoo/owl"; +import {ControlPanel} from "@web/search/control_panel/control_panel"; +import spreadsheet from "@spreadsheet/o_spreadsheet/o_spreadsheet_extended"; + +const {useState} = owl; +const {topbarMenuRegistry} = spreadsheet.registries; + +topbarMenuRegistry.add("file", {name: _t("File"), sequence: 10}); +topbarMenuRegistry.addChild("save", ["file"], { + name: _lt("Save"), + // Description: "Ctrl+S", // This is not working, so removing it from the view for now... + sequence: 10, + action: (env) => env.saveSpreadsheet(), +}); +export class SpreadsheetName extends Component { + setup() { + this.state = useState({ + name: this.props.name, + }); + } + _onNameChanged(ev) { + if (ev.target.value) { + this.env.saveRecord({name: ev.target.value}); + } + this.state.name = ev.target.value; + } +} +SpreadsheetName.template = "spreadsheet_oca.SpreadsheetName"; + +export class SpreadsheetControlPanel extends ControlPanel {} +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..6232ba2b --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js @@ -0,0 +1,113 @@ +/** @odoo-module **/ + +import {Component} from "@odoo/owl"; +import {DataSources} from "@spreadsheet/data_sources/data_sources"; +import {Field} from "@web/views/fields/field"; +import {loadSpreadsheetDependencies} from "@spreadsheet/helpers/helpers"; +import {migrate} from "@spreadsheet/o_spreadsheet/migration"; +import spreadsheet from "@spreadsheet/o_spreadsheet/o_spreadsheet_extended"; +import {useService} from "@web/core/utils/hooks"; +import {useSetupAction} from "@web/webclient/actions/action_hook"; + +const {Spreadsheet, Model} = spreadsheet; +const {useSubEnv, onWillStart} = owl; +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.bus_service.addEventListener( + "notification", + this.onNotification.bind(this) + ); + this.listeners = []; + } + 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); + } + } + } + } + sendMessage(message) { + this.orm.call(this.model, "send_spreadsheet_message", [[this.res_id], message]); + } + onNewMessage(id, callback) { + this.listeners.push({id, callback}); + } + leave(id) { + this.listeners = this.listeners.filter((listener) => listener.id !== id); + } +} + +export class SpreadsheetRenderer extends Component { + setup() { + this.orm = useService("orm"); + this.bus_service = useService("bus_service"); + this.user = useService("user"); + const dataSources = new DataSources(this.orm); + this.spreadsheet_model = new Model( + migrate(this.props.record.spreadsheet_raw), + { + evalContext: {env: this.env, orm: this.orm}, + transportService: new SpreadsheetTransportService( + this.orm, + this.bus_service, + this.props.model, + this.props.res_id + ), + client: { + id: uuidGenerator.uuidv4(), + name: this.user.name, + }, + mode: this.props.record.mode, + dataSources, + }, + this.props.record.revisions + ); + useSubEnv({ + saveSpreadsheet: this.onSpreadsheetSaved.bind(this), + }); + onWillStart(async () => { + await loadSpreadsheetDependencies(); + await dataSources.waitForAllLoaded(); + await this.env.importData(this.spreadsheet_model); + }); + useSetupAction({ + beforeLeave: () => this.onSpreadsheetSaved(), + }); + dataSources.addEventListener("data-source-updated", () => { + const sheetId = this.spreadsheet_model.getters.getActiveSheetId(); + this.spreadsheet_model.dispatch("EVALUATE_CELLS", {sheetId}); + }); + } + onSpreadsheetSaved() { + const data = this.spreadsheet_model.exportData(); + this.env.saveRecord({spreadsheet_raw: data}); + this.spreadsheet_model.leaveSession(); + } +} + +SpreadsheetRenderer.template = "spreadsheet_oca.SpreadsheetRenderer"; +SpreadsheetRenderer.components = { + Spreadsheet, + Field, +}; +SpreadsheetRenderer.props = { + record: Object, + res_id: {type: Number, optional: true}, + model: String, + importData: {type: Function, optional: true}, +}; 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..66b0310f --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js @@ -0,0 +1,27 @@ +/** @odoo-module **/ +import {PivotController} from "@web/views/pivot/pivot_controller"; + +import {patch} from "web.utils"; + +patch( + PivotController.prototype, + "spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js", + { + onSpreadsheetButtonClicked() { + this.actionService.doAction({ + type: "ir.actions.client", + tag: "action_spreadsheet_oca", + params: { + model: "spreadsheet.spreadsheet", + 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/spreadsheet.scss b/spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss new file mode 100644 index 00000000..33e55449 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss @@ -0,0 +1,23 @@ +.o_spreadsheet_oca_container { + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: flex; + flex-flow: column; + height: 100%; + .o_spreadsheet_oca_name { + border: none; + padding: 0px 5px 0px 2px; + color: $breadcrumb-active-color; + border-color: var(--o-input-border-color); + &:focus { + border: $input-border-width solid var(--o-input-border-color); + border-width: 0 0 $input-border-width 0; + @include print-variable(o-input-border-color, $o-brand-primary); + @include print-variable(o-caret-color, $o-brand-primary); + } + } + .o_spreadsheet_oca_name_warning { + font-size: 0.8em; + } +} diff --git a/spreadsheet_oca/static/src/spreadsheet/spreadsheet.xml b/spreadsheet_oca/static/src/spreadsheet/spreadsheet.xml new file mode 100644 index 00000000..fee6b44c --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/spreadsheet.xml @@ -0,0 +1,17 @@ + + + + + + + + + { await loadSpreadsheetDependencies(); @@ -93,17 +101,32 @@ export class SpreadsheetRenderer extends Component { this.spreadsheet_model.dispatch("EVALUATE_CELLS", {sheetId}); }); } + closeDialog() { + this.state.dialogDisplayed = false; + this.state.dialogTitle = "Spreadsheet"; + this.state.dialogContent = undefined; + } onSpreadsheetSaved() { const data = this.spreadsheet_model.exportData(); this.env.saveRecord({spreadsheet_raw: data}); this.spreadsheet_model.leaveSession(); } + editText(title, callback, options) { + this.state.dialogContent = options.placeholder; + this.state.dialogTitle = title; + this.state.dialogDisplayed = true; + this.confirmDialog = () => { + callback(this.state.dialogContent); + this.closeDialog(); + }; + } } SpreadsheetRenderer.template = "spreadsheet_oca.SpreadsheetRenderer"; SpreadsheetRenderer.components = { Spreadsheet, Field, + Dialog, }; SpreadsheetRenderer.props = { record: Object, From 92d850a67e143a0b80984d554c02265180aa273d Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Fri, 7 Apr 2023 15:25:10 +0200 Subject: [PATCH 010/100] [IMP] spreadsheet_oca: Allow to edit filters --- spreadsheet_oca/__manifest__.py | 1 + spreadsheet_oca/i18n/spreadsheet_oca.pot | 144 +++++++++++++- .../src/spreadsheet/bundle/filter.esm.js | 175 ++++++++++++++++++ .../src/spreadsheet/bundle/spreadsheet.xml | 157 ++++++++++++++++ .../bundle/spreadsheet_controlpanel.esm.js | 10 - .../static/src/spreadsheet/spreadsheet.scss | 24 +++ 6 files changed, 498 insertions(+), 13 deletions(-) create mode 100644 spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index faec7004..4793ca98 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -27,6 +27,7 @@ ], "spreadsheet.o_spreadsheet": [ "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml", + "spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js", "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js", "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js", "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js", diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index 4d95a921..c23fa6c2 100644 --- a/spreadsheet_oca/i18n/spreadsheet_oca.pot +++ b/spreadsheet_oca/i18n/spreadsheet_oca.pot @@ -13,11 +13,32 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add date" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add relation" +msgstr "" + #. module: spreadsheet_oca #: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add_sheet msgid "Add sheet to spreadsheet" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add text" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/spreadsheet.xml:0 @@ -28,7 +49,32 @@ msgid "Add to spreadsheet" msgstr "" #. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "After next" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Automatically filter on the current period" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Before Previous" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +#, python-format msgid "Cancel" msgstr "" @@ -55,6 +101,13 @@ msgstr "" msgid "Commands" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Confirm" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_ids msgid "Contributors" @@ -86,6 +139,13 @@ msgstr "" msgid "Data" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Default value" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__display_name @@ -102,7 +162,7 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 #, python-format msgid "File" msgstr "" @@ -112,6 +172,13 @@ msgstr "" msgid "Filename" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Filters" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__group_ids msgid "Group" @@ -145,6 +212,13 @@ msgstr "" msgid "Import data to spreadsheet" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Label" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision____last_update #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet____last_update @@ -184,6 +258,13 @@ msgstr "" msgid "Model" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Month" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__name #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__name @@ -193,6 +274,13 @@ msgstr "" msgid "Name" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Next" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__next_revision_id msgid "Next Revision" @@ -208,11 +296,46 @@ msgstr "" msgid "Owner" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Previous" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Quarter" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_ids msgid "Readers" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Related model" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Relative Period" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Remove" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__res_id msgid "Res" @@ -220,7 +343,8 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 #, python-format msgid "Save" msgstr "" @@ -270,14 +394,21 @@ msgstr "" msgid "Spreadsheets" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Time range" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type msgid "Type" msgstr "" #. module: spreadsheet_oca -#. odoo-javascript #. odoo-python +#. odoo-javascript #: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 #, python-format @@ -289,6 +420,13 @@ msgstr "" msgid "User" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Year" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js new file mode 100644 index 00000000..f7bb6e3d --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js @@ -0,0 +1,175 @@ +/** @odoo-module **/ + +import {Component, onWillStart, useState} from "@odoo/owl"; +import {_lt, _t} from "web.core"; + +import {FilterValue} from "@spreadsheet/global_filters/components/filter_value/filter_value"; +import {ModelFieldSelector} from "@web/core/model_field_selector/model_field_selector"; +import {ModelSelector} from "@web/core/model_selector/model_selector"; +import {RELATIVE_DATE_RANGE_TYPES} from "@spreadsheet/helpers/constants"; +import {globalFiltersFieldMatchers} from "@spreadsheet/global_filters/plugins/global_filters_core_plugin"; +import spreadsheet from "@spreadsheet/o_spreadsheet/o_spreadsheet_extended"; +import {useService} from "@web/core/utils/hooks"; + +const {topbarMenuRegistry} = spreadsheet.registries; +const uuidGenerator = new spreadsheet.helpers.UuidGenerator(); + +topbarMenuRegistry.add("file", {name: _t("File"), sequence: 10}); +topbarMenuRegistry.addChild("filters", ["file"], { + name: _t("Filters"), + sequence: 70, + action: (env) => env.openSidePanel("FilterPanel", {}), +}); +topbarMenuRegistry.addChild("save", ["file"], { + name: _t("Save"), + // Description: "Ctrl+S", // This is not working, so removing it from the view for now... + sequence: 10, + action: (env) => env.saveSpreadsheet(), +}); + +const {sidePanelRegistry} = spreadsheet.registries; + +export class FilterPanel extends Component { + onEditFilter(filter) { + this.env.openSidePanel("EditFilterPanel", {filter}); + } + onAddFilter(type) { + this.env.openSidePanel("EditFilterPanel", {filter: {type: type}}); + } +} + +FilterPanel.template = "spreadsheet_oca.FilterPanel"; +FilterPanel.components = { + FilterValue, +}; + +sidePanelRegistry.add("FilterPanel", { + title: "Filters", + Body: FilterPanel, +}); + +export class EditFilterPanel extends Component { + setup() { + this.filterId = this.props.filter; + this.orm = useService("orm"); + this.state = useState({ + label: this.props.filter.label, + type: this.props.filter.type, + defaultValue: this.props.filter.defaultValue, + defaultsToCurrentPeriod: this.props.filter.defaultsToCurrentPeriod, + rangeType: this.props.filter.rangeType || "year", + modelName: {technical: this.props.filter.modelName, label: null}, + objects: {}, + }); + this.relativeDateRangeTypes = RELATIVE_DATE_RANGE_TYPES; + onWillStart(this.willStart.bind(this)); + } + async willStart() { + if (this.state.modelName.technical !== undefined) { + const modelLabel = await this.orm.call("ir.model", "display_name_for", [ + [this.state.modelName.technical], + ]); + this.state.modelName.label = modelLabel[0] && modelLabel[0].display_name; + } + var ModelFields = []; + for (var [objectType, objectClass] of Object.entries( + globalFiltersFieldMatchers + )) { + for (const objectId of objectClass.geIds()) { + var fields = objectClass.getFields(objectId); + this.state.objects[objectType + "_" + objectId] = { + id: objectType + "_" + objectId, + objectId: objectId, + name: objectClass.getDisplayName(objectId), + tag: await objectClass.getTag(objectId), + fieldMatch: + objectClass.getFieldMatching(objectId, this.props.filter.id) || + {}, + fields: fields, + model: objectClass.getModel(objectId), + }; + ModelFields.push(fields); + } + } + console.log(this.state.objects); + this.models = [ + ...new Set( + ModelFields.map((field_items) => Object.values(field_items)) + .flat() + .filter((field) => field.relation) + .map((field) => field.relation) + ), + ]; + } + get dateRangeTypes() { + return [ + {type: "year", description: _t("Year")}, + {type: "quarter", description: _t("Quarter")}, + {type: "month", description: _t("Month")}, + {type: "relative", description: _t("Relative Period")}, + ]; + } + get dateOffset() { + return [ + {value: 0, name: ""}, + {value: -1, name: _lt("Previous")}, + {value: -2, name: _lt("Before Previous")}, + {value: 1, name: _lt("Next")}, + {value: 2, name: _lt("After next")}, + ]; + } + onChangeFieldMatchOffset(object, ev) { + this.state.objects[object.id].fieldMatch.offset = parseInt(ev.target.value, 10); + } + onModelSelected(ev) { + this.state.modelName.technical = ev.technical; + this.state.modelName.label = ev.label; + } + onDateRangeChange(ev) { + this.state.rangeType = ev.target.value; + } + onSave() { + const action = this.props.filter.id + ? "EDIT_GLOBAL_FILTER" + : "ADD_GLOBAL_FILTER"; + this.env.openSidePanel("FilterPanel", {}); + + var filter = { + id: this.props.filter.id || uuidGenerator.uuidv4(), + type: this.state.type, + label: this.state.label, + defaultValue: this.state.defaultValue, + rangeType: this.state.rangeType, + defaultsToCurrentPeriod: this.state.defaultsToCurrentPeriod, + modelName: this.state.modelName.technical, + }; + var filterMatching = {}; + Object.values(this.state.objects).forEach((object) => { + filterMatching[object.type] = filterMatching[object.type] || {}; + filterMatching[object.type][object.id] = {...object.fieldMatch}; + }); + this.env.model.dispatch(action, {id: filter.id, filter, ...filterMatching}); + + this.env.openSidePanel("FilterPanel", {}); + } + onCancel() { + this.env.openSidePanel("FilterPanel", {}); + } + onRemove() { + if (this.props.filter.id) { + this.env.model.dispatch("REMOVE_GLOBAL_FILTER", {id: this.props.filter.id}); + } + this.env.openSidePanel("FilterPanel", {}); + } + onFieldMatchUpdate(object, name) { + this.state.objects[object.id].fieldMatch.chain = name.chain; + } +} + +EditFilterPanel.template = "spreadsheet_oca.EditFilterPanel"; +EditFilterPanel.components = {ModelSelector, ModelFieldSelector}; + +sidePanelRegistry.add("EditFilterPanel", { + title: "Edit Filter", + Body: EditFilterPanel, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml index 62433e08..bb6d1cfe 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml @@ -12,7 +12,164 @@ /> + +
+
+ +
+
+ + +
+
+
+ + + +
+
+ +
+
+ Label +
+
+ +
+
+
+
Time range
+
+ +
+
+
+
Default value
+
+ + +
+
+ +
+ +
+
+
Related model
+
+ +
+
+
+
+ - +
+
+ +
+ +
+ +
+
+
+ + + +
+
env.saveSpreadsheet(), -}); export class SpreadsheetName extends Component { setup() { this.state = useState({ diff --git a/spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss b/spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss index 33e55449..a36e2732 100644 --- a/spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss +++ b/spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss @@ -20,4 +20,28 @@ .o_spreadsheet_oca_name_warning { font-size: 0.8em; } + .o_spreadsheet_oca_filter { + padding: 16px; + .spreadsheet_oca_filter_label { + font-weight: bold; + } + .spreadsheet_oca_filter_value { + display: flex; + .o_field_widget { + width: 100%; + .o_field_tags { + width: 100%; + } + } + .o_field_selector { + width: 100%; + } + .spreadsheet_oca_filter_value_edit { + width: 15px; + margin-left: 1rem; + padding: 0; + cursor: pointer; + } + } + } } From 77a70a7c3aa032bb791ea04dcd6895fe1907a261 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 9 May 2023 22:41:37 +0000 Subject: [PATCH 011/100] spreadsheet_oca 16.0.1.1.1 --- spreadsheet_oca/__manifest__.py | 2 +- spreadsheet_oca/i18n/spreadsheet_oca.pot | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index 4793ca98..0469625d 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "16.0.1.1.0", + "version": "16.0.1.1.1", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index c23fa6c2..a033ba85 100644 --- a/spreadsheet_oca/i18n/spreadsheet_oca.pot +++ b/spreadsheet_oca/i18n/spreadsheet_oca.pot @@ -407,8 +407,8 @@ msgid "Type" msgstr "" #. module: spreadsheet_oca -#. odoo-python #. odoo-javascript +#. odoo-python #: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 #, python-format From 424d7ba478b963522157bcc6a7a44d90923c447c Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Tue, 6 Jun 2023 18:06:10 +0200 Subject: [PATCH 012/100] [FIX] spreadsheet_oca: Filters where failing --- spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js | 3 +-- spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js index f7bb6e3d..954f0f83 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js @@ -91,7 +91,6 @@ export class EditFilterPanel extends Component { ModelFields.push(fields); } } - console.log(this.state.objects); this.models = [ ...new Set( ModelFields.map((field_items) => Object.values(field_items)) @@ -162,7 +161,7 @@ export class EditFilterPanel extends Component { this.env.openSidePanel("FilterPanel", {}); } onFieldMatchUpdate(object, name) { - this.state.objects[object.id].fieldMatch.chain = name.chain; + this.state.objects[object.id].fieldMatch.chain = name; } } diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml index bb6d1cfe..13444b02 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml @@ -143,6 +143,7 @@ resModel="object.model" readonly="false" isDebugMode="!!env.debug" + t-on-change="() => this.onChangeFieldSelector(ev)" update="(name) => this.onFieldMatchUpdate(object, name)" /> From 0236dbee10ca64c950db6d9e57b216253ac4eb49 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Wed, 7 Jun 2023 15:08:49 +0200 Subject: [PATCH 013/100] [IMP] spreadsheet_oca: Alloe to edit Pivot data --- spreadsheet_oca/__manifest__.py | 1 + .../bundle/filter_panel_datasources.esm.js | 123 ++++++++++++++++++ .../src/spreadsheet/bundle/spreadsheet.xml | 55 ++++++++ .../static/src/spreadsheet/spreadsheet.scss | 13 ++ 4 files changed, 192 insertions(+) create mode 100644 spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index 0469625d..a683edc9 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -28,6 +28,7 @@ "spreadsheet.o_spreadsheet": [ "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml", "spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js", + "spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js", "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js", "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js", "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js", diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js new file mode 100644 index 00000000..ebe46d56 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js @@ -0,0 +1,123 @@ +/** @odoo-module **/ + +import {Component, onWillStart, onWillUpdateProps} from "@odoo/owl"; +import {Domain} from "@web/core/domain"; +import {DomainSelector} from "@web/core/domain_selector/domain_selector"; +import {DomainSelectorDialog} from "@web/core/domain_selector_dialog/domain_selector_dialog"; +import {_t} from "web.core"; +import spreadsheet from "@spreadsheet/o_spreadsheet/o_spreadsheet_extended"; +import {time_to_str} from "web.time"; +import {useService} from "@web/core/utils/hooks"; + +const {sidePanelRegistry, topbarMenuRegistry} = spreadsheet.registries; +const {createFullMenuItem} = spreadsheet.helpers; + +topbarMenuRegistry.addChild("data_sources", ["data"], (env) => { + const children = env.model.getters.getPivotIds().map((pivotId, index) => + createFullMenuItem(`data_source_pivot_ ${pivotId}`, { + name: env.model.getters.getPivotDisplayName(pivotId), + sequence: 100, + action: (child_env) => { + child_env.model.dispatch("SELECT_PIVOT", { + pivotId: pivotId, + }); + child_env.openSidePanel("PivotPanel", {}); + }, + icon: "fa fa-table", + separator: index === env.model.getters.getPivotIds().length - 1, + }) + ); + return children.concat([ + createFullMenuItem(`refresh_all_data`, { + name: _t("Refresh all data"), + sequence: 110, + action: (child_env) => { + child_env.model.dispatch("REFRESH_ALL_DATA_SOURCES"); + }, + separator: true, + }), + ]); +}); + +export class PivotPanelDisplay extends Component { + setup() { + this.dialog = useService("dialog"); + onWillStart(this.modelData.bind(this)); + onWillUpdateProps(this.modelData.bind(this)); + } + async modelData() { + this.PivotDataSource = await this.env.model.getters.getAsyncPivotDataSource( + this.props.pivotId + ); + this.modelLabel = await this.PivotDataSource.getModelLabel(); + } + get domain() { + return new Domain(this.props.pivotDefinition.domain).toString(); + } + get pivotDimensions() { + return [ + ...this.props.pivotDefinition.rowGroupBys, + ...this.props.pivotDefinition.colGroupBys, + ].map((fieldName) => this.PivotDataSource.getFormattedGroupBy(fieldName)); + } + get sortInformation() { + const sortedColumn = this.props.pivotDefinition.sortedColumn; + const orderTranslate = + sortedColumn.order === "asc" ? _t("ascending") : _t("descending"); + const GroupByDisplayLabel = this.PivotDataSource.getGroupByDisplayLabel( + "measure", + sortedColumn.measure + ); + return `${GroupByDisplayLabel} (${orderTranslate})`; + } + get lastUpdate() { + const lastUpdate = this.PivotDataSource.lastUpdate; + if (lastUpdate) { + return time_to_str(new Date(lastUpdate)); + } + return _t("not updated"); + } + editDomain() { + this.dialog.add(DomainSelectorDialog, { + resModel: this.props.pivotDefinition.model, + initialValue: this.domain, + readonly: false, + isDebugMode: Boolean(this.env.debug), + onSelected: this.onSelectDomain.bind(this), + }); + } + onSelectDomain(domain) { + this.env.model.dispatch("UPDATE_ODOO_PIVOT_DOMAIN", { + pivotId: this.props.pivotId, + domain: new Domain(domain).toList(), + }); + } +} + +PivotPanelDisplay.template = "spreadsheet_oca.PivotPanelDisplay"; +PivotPanelDisplay.components = { + DomainSelector, +}; +PivotPanelDisplay.properties = { + pivotId: String, + pivotDefinition: Object, +}; + +export class PivotPanel extends Component { + get pivotId() { + return this.env.model.getters.getSelectedPivotId(); + } + get pivotDefinition() { + return this.env.model.getters.getPivotDefinition(this.pivotId); + } +} + +PivotPanel.template = "spreadsheet_oca.PivotPanel"; +PivotPanel.components = { + PivotPanelDisplay, +}; + +sidePanelRegistry.add("PivotPanel", { + title: "Pivot table", + Body: PivotPanel, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml index 13444b02..e7df314b 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml @@ -12,6 +12,61 @@ /> + + + + +
+
+
Pivot name
+ +
+
+
Model
+
()
+
+
+
Domain
+ + +
+
+
Dimensions
+ +
+ +
+
+
Sorting
+
+
+
+
Measures
+ +
+ +
+
+ Last updated at +
+
+ +
Date: Sat, 10 Jun 2023 15:46:20 +0200 Subject: [PATCH 014/100] [IMP] spreadsheet_oca: Allow to import lists --- spreadsheet_oca/__manifest__.py | 2 + .../bundle/spreadsheet_action.esm.js | 48 ++++++++++++++- .../src/spreadsheet/list_controller.esm.js | 14 +++++ .../src/spreadsheet/list_renderer.esm.js | 58 +++++++++++++++++++ .../static/src/spreadsheet/spreadsheet.xml | 15 +++++ 5 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 spreadsheet_oca/static/src/spreadsheet/list_controller.esm.js create mode 100644 spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index a683edc9..ca7f90ab 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -24,6 +24,8 @@ "spreadsheet_oca/static/src/spreadsheet/spreadsheet_action.esm.js", "spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js", "spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js", + "spreadsheet_oca/static/src/spreadsheet/list_controller.esm.js", + "spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js", ], "spreadsheet.o_spreadsheet": [ "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml", diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js index 8b461110..71805fc1 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js @@ -1,5 +1,6 @@ /** @odoo-module **/ +import ListDataSource from "@spreadsheet/list/list_data_source"; import PivotDataSource from "@spreadsheet/pivot/pivot_data_source"; import {SpreadsheetControlPanel} from "./spreadsheet_controlpanel.esm"; import {SpreadsheetRenderer} from "./spreadsheet_renderer.esm"; @@ -91,7 +92,7 @@ export class ActionSpreadsheetOca extends Component { definition, }); } - async importDataPivot(spreadsheet_model) { + importCreateOrReuseSheet(spreadsheet_model) { var sheetId = spreadsheet_model.getters.getActiveSheetId(); var row = 0; if (this.import_data.new === undefined && this.import_data.new_sheet) { @@ -128,6 +129,48 @@ export class ActionSpreadsheetOca extends Component { } row += 1; } + return {sheetId, row}; + } + async importDataList(spreadsheet_model) { + var {sheetId, row} = this.importCreateOrReuseSheet(spreadsheet_model); + const dataSourceId = uuidGenerator.uuidv4(); + var 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: this.import_data.metaData.domain, + context: this.import_data.metaData.context, + orderBy: this.import_data.metaData.orderBy, + }, + name: this.import_data.metaData.name, + }; + const dataSource = spreadsheet_model.config.dataSources.add( + dataSourceId, + ListDataSource, + list_info + ); + await dataSource.load(); + spreadsheet_model.dispatch("INSERT_ODOO_LIST", { + sheetId, + col: 0, + row: row, + id: spreadsheet_model.getters.getNextListId(), + dataSourceId, + definition: list_info, + linesNumber: this.import_data.metaData.threshold, + columns: this.import_data.metaData.columns, + }); + const columns = []; + for (let col = 0; col < this.import_data.metaData.columns.length; col++) { + columns.push(col); + } + spreadsheet_model.dispatch("AUTORESIZE_COLUMNS", {sheetId, cols: columns}); + } + async importDataPivot(spreadsheet_model) { + var {sheetId, row} = this.importCreateOrReuseSheet(spreadsheet_model); const dataSourceId = uuidGenerator.uuidv4(); const pivot_info = { metaData: { @@ -167,6 +210,9 @@ export class ActionSpreadsheetOca extends Component { 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"; diff --git a/spreadsheet_oca/static/src/spreadsheet/list_controller.esm.js b/spreadsheet_oca/static/src/spreadsheet/list_controller.esm.js new file mode 100644 index 00000000..0229b2dc --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/list_controller.esm.js @@ -0,0 +1,14 @@ +/** @odoo-module **/ +import {ListController} from "@web/views/list/list_controller"; + +import {patch} from "web.utils"; + +patch( + ListController.prototype, + "spreadsheet_oca/static/src/spreadsheet/list_controller.esm.js", + { + onSpreadsheetButtonClicked() { + this.env.bus.trigger("addListOnSpreadsheet"); + }, + } +); 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..b123e8f7 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js @@ -0,0 +1,58 @@ +/** @odoo-module **/ +import {useBus, useService} from "@web/core/utils/hooks"; +import {ListRenderer} from "@web/views/list/list_renderer"; +import {omit} from "@web/core/utils/objects"; +import {patch} from "web.utils"; + +patch( + ListRenderer.prototype, + "spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js", + { + setup() { + this._super(...arguments); + this.userService = useService("user"); + 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_import_data: { + mode: "list", + metaData: { + model: model.resModel, + domain: model.domain, + orderBy: model.orderBy, + context: omit( + model.context, + ...Object.keys(this.userService.context) + ), + columns: this.getSpreadsheetColumns(), + fields: model.fields, + name: this.env.config.getDisplayName(), + threshold: Math.min(model.count, model.limit), + }, + }, + }, + } + ); + }, + getSpreadsheetColumns() { + const fields = this.env.model.root.fields; + return this.state.columns + .filter( + (col) => col.type === "field" && fields[col.name].type !== "binary" + // We want to avoid binary fields + ) + .map((col) => ({name: col.name, type: fields[col.name].type})); + }, + } +); diff --git a/spreadsheet_oca/static/src/spreadsheet/spreadsheet.xml b/spreadsheet_oca/static/src/spreadsheet/spreadsheet.xml index 92f977c6..04f3d337 100644 --- a/spreadsheet_oca/static/src/spreadsheet/spreadsheet.xml +++ b/spreadsheet_oca/static/src/spreadsheet/spreadsheet.xml @@ -14,6 +14,21 @@ + + + + +
From 2f24b9a029b72389e3f71c9f3593ff953a31c8f0 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Sun, 9 Jul 2023 18:42:08 +0200 Subject: [PATCH 017/100] [FIX] spreadsheet_oca: Fix filters --- spreadsheet_oca/i18n/spreadsheet_oca.pot | 106 ++++++++++++++++++ .../src/spreadsheet/bundle/filter.esm.js | 4 +- 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index a033ba85..775069a5 100644 --- a/spreadsheet_oca/i18n/spreadsheet_oca.pot +++ b/spreadsheet_oca/i18n/spreadsheet_oca.pot @@ -39,6 +39,13 @@ msgstr "" msgid "Add text" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/spreadsheet.xml:0 +#, python-format +msgid "Add to spreadesheet" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/spreadsheet.xml:0 @@ -146,6 +153,13 @@ msgstr "" msgid "Default value" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Dimensions" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__display_name @@ -154,12 +168,28 @@ msgstr "" msgid "Display Name" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Domain" +msgstr "" + #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_tree_view msgid "Edit" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Edit domain" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -212,6 +242,13 @@ msgstr "" msgid "Import data to spreadsheet" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert pivot" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -243,18 +280,44 @@ msgstr "" msgid "Last Updated on" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Last updated at" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "List name" +msgstr "" + #. module: spreadsheet_oca #: model:res.groups,name:spreadsheet_oca.group_manager msgid "Manager" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Measures" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode_id msgid "Mode" msgstr "" #. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__model +#, python-format msgid "Model" msgstr "" @@ -296,6 +359,13 @@ msgstr "" msgid "Owner" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Pivot name" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -315,6 +385,13 @@ msgstr "" msgid "Readers" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Refresh all data" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -359,6 +436,13 @@ msgstr "" msgid "Server Revision" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Sorting" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__spreadsheet_id @@ -427,6 +511,20 @@ msgstr "" msgid "Year" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "ascending" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "descending" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -434,6 +532,14 @@ msgstr "" msgid "name is required" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "not updated" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_ir_websocket msgid "websocket message handling" diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js index 954f0f83..c4e41e2c 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js @@ -86,6 +86,7 @@ export class EditFilterPanel extends Component { objectClass.getFieldMatching(objectId, this.props.filter.id) || {}, fields: fields, + type: objectType, model: objectClass.getModel(objectId), }; ModelFields.push(fields); @@ -132,7 +133,6 @@ export class EditFilterPanel extends Component { ? "EDIT_GLOBAL_FILTER" : "ADD_GLOBAL_FILTER"; this.env.openSidePanel("FilterPanel", {}); - var filter = { id: this.props.filter.id || uuidGenerator.uuidv4(), type: this.state.type, @@ -145,7 +145,7 @@ export class EditFilterPanel extends Component { var filterMatching = {}; Object.values(this.state.objects).forEach((object) => { filterMatching[object.type] = filterMatching[object.type] || {}; - filterMatching[object.type][object.id] = {...object.fieldMatch}; + filterMatching[object.type][object.objectId] = {...object.fieldMatch}; }); this.env.model.dispatch(action, {id: filter.id, filter, ...filterMatching}); From b78bc7356d75464ecf19406724e0dee82abb18f4 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 9 Jul 2023 17:32:31 +0000 Subject: [PATCH 018/100] spreadsheet_oca 16.0.1.1.2 --- spreadsheet_oca/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index ca7f90ab..0fa2033c 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "16.0.1.1.1", + "version": "16.0.1.1.2", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", From 880f3c6a222d3d04a8752c03399e4978e8aa4852 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Sun, 9 Jul 2023 23:57:36 +0200 Subject: [PATCH 019/100] [IMP] spreadsheet_oca: Allow to edit Odoo graphs properly Fixes #9 --- spreadsheet_oca/__manifest__.py | 1 + spreadsheet_oca/i18n/spreadsheet_oca.pot | 14 ++++ .../src/spreadsheet/bundle/odoo_panels.esm.js | 76 +++++++++++++++++++ .../src/spreadsheet/bundle/spreadsheet.xml | 36 +++++++++ .../static/src/spreadsheet/spreadsheet.scss | 5 ++ 5 files changed, 132 insertions(+) create mode 100644 spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index 0fa2033c..73b8c97a 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -34,6 +34,7 @@ "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js", "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js", "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js", + "spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js", ], }, } diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index 775069a5..1dc4bcd7 100644 --- a/spreadsheet_oca/i18n/spreadsheet_oca.pot +++ b/spreadsheet_oca/i18n/spreadsheet_oca.pot @@ -288,6 +288,13 @@ msgstr "" msgid "Last updated at" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Link to Odoo menu" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -478,6 +485,13 @@ msgstr "" msgid "Spreadsheets" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Stacked" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js new file mode 100644 index 00000000..970ef04e --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js @@ -0,0 +1,76 @@ +/** @odoo-module */ + +import {Domain} from "@web/core/domain"; +import {Many2OneField} from "@web/views/fields/many2one/many2one_field"; +import spreadsheet from "@spreadsheet/o_spreadsheet/o_spreadsheet_extended"; +import {useService} from "@web/core/utils/hooks"; + +const {chartSidePanelComponentRegistry} = spreadsheet.registries; +const {LineBarPieDesignPanel} = spreadsheet.components; +const {Component} = owl; + +export class OdooPanel extends Component { + setup() { + this.menus = useService("menu"); + } + get menuId() { + const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); + if (menu) { + return [menu.id, menu.name]; + } + return undefined; + } + updateMenu(menuId) { + if (!menuId) { + this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { + chartId: this.props.figureId, + odooMenuId: undefined, + }); + return; + } + const menu = this.env.model.getters.getIrMenu(menuId[0]); + this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { + chartId: this.props.figureId, + odooMenuId: menu.xmlid || menu.id, + }); + } + get record() { + const menus = this.menus + .getAll() + .map((menu) => menu.id) + .filter((menuId) => menuId !== "root"); + return { + getFieldDomain: function () { + return new Domain([["id", "in", menus]]); + }, + getFieldContext: function () { + return {}; + }, + }; + } +} +OdooPanel.template = "spreadsheet_oca.OdooPanel"; +OdooPanel.components = {Many2OneField}; + +class OdooStackablePanel extends OdooPanel { + onChangeStacked(ev) { + this.props.updateChart(this.props.figureId, { + stacked: ev.target.checked, + }); + } +} +OdooStackablePanel.template = "spreadsheet_oca.OdooStackablePanel"; + +chartSidePanelComponentRegistry + .add("odoo_line", { + configuration: OdooStackablePanel, + design: LineBarPieDesignPanel, + }) + .add("odoo_bar", { + configuration: OdooStackablePanel, + design: LineBarPieDesignPanel, + }) + .add("odoo_pie", { + configuration: OdooPanel, + design: LineBarPieDesignPanel, + }); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml index 9bd67783..09784535 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml @@ -386,4 +386,40 @@
+ +
+
Link to Odoo menu
+
+ +
+
+
+ + +
+ +
+
+
diff --git a/spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss b/spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss index eecba723..aae0756b 100644 --- a/spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss +++ b/spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss @@ -57,4 +57,9 @@ } } } + .o-section-value { + .o_field_many2one_selection { + width: 100%; + } + } } From 2418f6c7dffa05e2a6ef197ab04774367b5361af Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 12 Jul 2023 08:13:02 +0000 Subject: [PATCH 020/100] spreadsheet_oca 16.0.1.1.3 --- spreadsheet_oca/__manifest__.py | 2 +- spreadsheet_oca/i18n/spreadsheet_oca.pot | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index 73b8c97a..d70b5248 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "16.0.1.1.2", + "version": "16.0.1.1.3", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index 1dc4bcd7..2ea87c75 100644 --- a/spreadsheet_oca/i18n/spreadsheet_oca.pot +++ b/spreadsheet_oca/i18n/spreadsheet_oca.pot @@ -505,8 +505,8 @@ msgid "Type" msgstr "" #. module: spreadsheet_oca -#. odoo-javascript #. odoo-python +#. odoo-javascript #: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 #, python-format From 519f36067fabbb5107c637bbdc63f95e13e48617 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Sat, 19 Aug 2023 23:44:19 +0200 Subject: [PATCH 021/100] [IMP] spreadsheet_oca: Add roadmap for specific questions --- spreadsheet_oca/README.rst | 22 ++++++++-- spreadsheet_oca/readme/ROADMAP.rst | 6 +++ spreadsheet_oca/static/description/index.html | 40 +++++++++++++------ 3 files changed, 52 insertions(+), 16 deletions(-) create mode 100644 spreadsheet_oca/readme/ROADMAP.rst diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index 12ebd8ba..e0676273 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/README.rst @@ -2,10 +2,13 @@ Spreadsheet Oca =============== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:32b5b0c526375df2a635235ae4b4204334012bc326b4741f499614faaa7c6697 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,8 +22,11 @@ Spreadsheet Oca .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/spreadsheet-16-0/spreadsheet-16-0-spreadsheet_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=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| +|badge1| |badge2| |badge3| |badge4| |badge5| This module adds a functionality for adding and editing Spreadsheets using Odoo CE. @@ -29,12 +35,22 @@ This module adds a functionality for adding and editing Spreadsheets using Odoo .. contents:: :local: +Usage +===== + +Adding new lines on pivot tables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When we add a pivot table, the number of rows is predefined according to the current data. + +In order to add new rows, we need to reinsert the pivot table. + Bug Tracker =========== Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed +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. diff --git a/spreadsheet_oca/readme/ROADMAP.rst b/spreadsheet_oca/readme/ROADMAP.rst new file mode 100644 index 00000000..5db690b8 --- /dev/null +++ b/spreadsheet_oca/readme/ROADMAP.rst @@ -0,0 +1,6 @@ +Adding new lines on pivot tables +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When we add a pivot table, the number of rows is predefined according to the current data. + +In order to add new rows, we need to reinsert the pivot table. diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html index be8066a1..15c2004c 100644 --- a/spreadsheet_oca/static/description/index.html +++ b/spreadsheet_oca/static/description/index.html @@ -3,7 +3,7 @@ - + Spreadsheet Oca -
-

Spreadsheet Oca

+
+ + +Odoo Community Association + +
+

Spreadsheet Oca

-

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

+

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

This module adds a functionality for adding and editing Spreadsheets using Odoo CE.

It is an alternative to the proprietary module spreadsheet_edition @@ -397,9 +402,9 @@

Spreadsheet Oca

-

Usage

+

Usage

-

Create a new spreadsheet

+

Create a new spreadsheet

-

Development

+

Development

If you want to develop custom business functions, you can add others, based on the file https://github.com/odoo/odoo/blob/16.0/addons/spreadsheet_account/static/src/accounting_functions.js

-

Known issues / Roadmap

+

Known issues / Roadmap

-

Adding new lines on pivot tables

+

Adding new lines on pivot tables

When we add a pivot table, the number of rows is predefined according to the current data.

In order to add new rows, we need to reinsert the pivot table.

-

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 @@ -510,15 +515,15 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • CreuBlanca
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -545,5 +550,6 @@

Maintainers

+
diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js index 2d9bd56c..5e764e1a 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js @@ -81,8 +81,7 @@ export class PivotPanelDisplay extends Component { const sortedColumn = this.props.pivotDefinition.sortedColumn; const orderTranslate = sortedColumn.order === "asc" ? _t("ascending") : _t("descending"); - const GroupByDisplayLabel = this.PivotDataSource.getGroupByDisplayLabel( - "measure", + const GroupByDisplayLabel = this.PivotDataSource.getMeasureDisplayName( sortedColumn.measure ); return `${GroupByDisplayLabel} (${orderTranslate})`; From b898120cb6c5eb48d0098a56e22ab77fe927cd3a Mon Sep 17 00:00:00 2001 From: CarlosRoca13 Date: Wed, 17 Sep 2025 12:52:50 +0200 Subject: [PATCH 069/100] [FIX] spreadsheet_oca: Make use of _zip_xslx_files that spreadsheet module offers Reduce the logic of the controller by using the function that spreadsheet module offers and avoid error when rendering images on the xlsx file. --- spreadsheet_oca/README.rst | 2 +- spreadsheet_oca/__manifest__.py | 2 +- spreadsheet_oca/controllers/main.py | 10 ++-------- spreadsheet_oca/static/description/index.html | 2 +- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index e6b74834..869c655f 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/README.rst @@ -11,7 +11,7 @@ Spreadsheet Oca !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:97d72e6ea5d8c3d2efea4dc8febd611db0fa13076f55d7eb9298216ded7aae92 + !! source digest: sha256:53f2ac387d2b0a0a0d10edfbb2702f176f39205810a3eff890d1bb146bf33829 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index 0515c56b..9a892368 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "17.0.1.0.1", + "version": "17.0.1.0.2", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", diff --git a/spreadsheet_oca/controllers/main.py b/spreadsheet_oca/controllers/main.py index ef77af1d..dcc35bc7 100644 --- a/spreadsheet_oca/controllers/main.py +++ b/spreadsheet_oca/controllers/main.py @@ -1,8 +1,6 @@ # Copyright 2024 Tecnativa - Carlos Roca # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). import json -from io import BytesIO -from zipfile import ZipFile from odoo.http import Controller, content_disposition, request, route @@ -13,13 +11,9 @@ def download_spreadsheet_xlsx(self, zip_name, files, **kw): if hasattr(files, "read"): files = files.read().decode("utf-8") files = json.loads(files) - file_bytes = BytesIO() - with ZipFile(file_bytes, "w") as zip_file: - for file in files: - zip_file.writestr(file["path"], file["content"]) - file_content = file_bytes.getvalue() + file_content = request.env["spreadsheet.mixin"]._zip_xslx_files(files) return request.make_response( - file_bytes.getvalue(), + file_content, [ ("Content-Length", len(file_content)), ("Content-Type", "application/vnd.ms-excel"), diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html index f4a54955..8d8a205c 100644 --- a/spreadsheet_oca/static/description/index.html +++ b/spreadsheet_oca/static/description/index.html @@ -372,7 +372,7 @@

Spreadsheet Oca

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:97d72e6ea5d8c3d2efea4dc8febd611db0fa13076f55d7eb9298216ded7aae92 +!! source digest: sha256:53f2ac387d2b0a0a0d10edfbb2702f176f39205810a3eff890d1bb146bf33829 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module adds a functionality for adding and editing Spreadsheets From f96236417cf4ef7cc8599a3627a9590d490292a0 Mon Sep 17 00:00:00 2001 From: CarlosRoca13 Date: Thu, 18 Sep 2025 10:35:55 +0200 Subject: [PATCH 070/100] [FIX] spreadsheet_oca: Filters don't take care about field type --- spreadsheet_oca/README.rst | 2 +- spreadsheet_oca/__manifest__.py | 2 +- spreadsheet_oca/static/description/index.html | 2 +- spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index 869c655f..a0cab53c 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/README.rst @@ -11,7 +11,7 @@ Spreadsheet Oca !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:53f2ac387d2b0a0a0d10edfbb2702f176f39205810a3eff890d1bb146bf33829 + !! source digest: sha256:2e54effb5771467ddab39e872bcddddc5e7a900f7afb88dd3bb87ac26d195ca5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index 9a892368..553f0364 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "17.0.1.0.2", + "version": "17.0.1.0.3", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html index 8d8a205c..7bae2017 100644 --- a/spreadsheet_oca/static/description/index.html +++ b/spreadsheet_oca/static/description/index.html @@ -372,7 +372,7 @@

Spreadsheet Oca

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:53f2ac387d2b0a0a0d10edfbb2702f176f39205810a3eff890d1bb146bf33829 +!! source digest: sha256:2e54effb5771467ddab39e872bcddddc5e7a900f7afb88dd3bb87ac26d195ca5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module adds a functionality for adding and editing Spreadsheets diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js index a6d1723b..99f9677d 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js @@ -181,6 +181,7 @@ export class EditFilterPanel extends Component { } onFieldMatchUpdate(object, name) { this.state.objects[object.id].fieldMatch.chain = name; + this.state.objects[object.id].fieldMatch.type = object.fields[name]?.type; } toggleDateDefaultValue(ev) { this.state.defaultValue = ev.target.checked ? "this_month" : undefined; From 5a3769638d61053b4909133fc3f04a90309b3a94 Mon Sep 17 00:00:00 2001 From: Chris Mann Date: Wed, 24 Sep 2025 14:12:27 +0100 Subject: [PATCH 071/100] [IMP] spreadsheet_oca: pre-commit auto fixes --- spreadsheet_oca/README.rst | 134 ++-- .../spreadsheet_spreadsheet_import_mode.xml | 33 +- spreadsheet_oca/demo/demo_spreadsheet.json | 30 +- .../demo/spreadsheet_spreadsheet.xml | 9 +- spreadsheet_oca/security/security.xml | 33 +- .../static/src/pivot/pivot_table.esm.js | 120 ++-- .../src/spreadsheet/bundle/chart_panel.esm.js | 66 +- .../spreadsheet/bundle/chart_panels.esm.js | 153 ++-- .../src/spreadsheet/bundle/filter.esm.js | 318 +++++---- .../bundle/filter_panel_datasources.esm.js | 501 +++++++------ .../src/spreadsheet/bundle/odoo_panels.esm.js | 164 ++--- .../src/spreadsheet/bundle/spreadsheet.xml | 659 ++++++++---------- .../bundle/spreadsheet_action.esm.js | 535 +++++++------- .../bundle/spreadsheet_controlpanel.esm.js | 32 +- .../bundle/spreadsheet_renderer.esm.js | 333 +++++---- .../src/spreadsheet/graph_controller.esm.js | 38 +- .../src/spreadsheet/graph_controller.xml | 13 +- .../src/spreadsheet/list_controller.esm.js | 10 +- .../src/spreadsheet/list_controller.xml | 23 +- .../src/spreadsheet/list_renderer.esm.js | 108 +-- .../src/spreadsheet/pivot_controller.esm.js | 126 ++-- .../src/spreadsheet/pivot_controller.xml | 12 +- .../static/src/spreadsheet/spreadsheet.scss | 112 +-- .../src/spreadsheet/spreadsheet_action.esm.js | 26 +- .../utils/dynamic_generators.esm.js | 98 ++- .../spreadsheet_tree_view.esm.js | 122 ++-- .../spreadsheet_tree_view.xml | 36 +- .../views/spreadsheet_spreadsheet.xml | 88 +-- .../wizards/spreadsheet_select_row_number.xml | 18 +- .../spreadsheet_spreadsheet_import.xml | 83 +-- 30 files changed, 1947 insertions(+), 2086 deletions(-) diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index a0cab53c..8ddb4f8f 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - =============== Spreadsheet Oca =============== @@ -17,17 +13,17 @@ Spreadsheet Oca .. |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 +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fspreadsheet-lightgray.png?logo=github - :target: https://github.com/OCA/spreadsheet/tree/17.0/spreadsheet_oca + :target: https://github.com/OCA/spreadsheet/tree/18.0/spreadsheet_oca :alt: OCA/spreadsheet .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/spreadsheet-17-0/spreadsheet-17-0-spreadsheet_oca + :target: https://translation.odoo-community.org/projects/spreadsheet-18-0/spreadsheet-18-0-spreadsheet_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=17.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/spreadsheet&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -49,86 +45,86 @@ Usage **Create a new spreadsheet** ---------------------------- -- Go to 'Spreadsheet' menu -- Click on 'Create' -- Put a name, then click on the "Edit" button +- Go to 'Spreadsheet' menu +- Click on 'Create' +- Put a name, then click on the "Edit" button |image1| -- At this point you switch to spreadsheet editing mode. The editor is - named ``o-spreadsheet`` and looks like another common spreadsheet web - editors. (OnlyOffice, Ethercalc, Google Sheets (non-free)). +- At this point you switch to spreadsheet editing mode. The editor is + named ``o-spreadsheet`` and looks like another common spreadsheet web + editors. (OnlyOffice, Ethercalc, Google Sheets (non-free)). |image2| -- You can use common functions ``SUM()``, ``AVERAGE()``, etc. in the - cells. For a complete list of functions and their syntax, Refer to the - documentation https://github.com/odoo/o-spreadsheet/ or go to - https://odoo.github.io/o-spreadsheet/ and click on "Insert > - Function". +- You can use common functions ``SUM()``, ``AVERAGE()``, etc. in the + cells. For a complete list of functions and their syntax, Refer to + the documentation https://github.com/odoo/o-spreadsheet/ or go to + https://odoo.github.io/o-spreadsheet/ and click on "Insert > + Function". |image3| -- Note: Business Odoo module can add "business functions". This is - currently the case for the accounting module, which adds the following - features: - - - ``ODOO.CREDIT(account_codes, date_range)``: Get the total credit - for the specified account(s) and period. - - ``ODOO.DEBIT(account_codes, date_range)``: Get the total debit - for the specified account(s) and period. - - ``ODOO.BALANCE(account_codes, date_range)``: Get the total - balance for the specified account(s) and period. - - ``ODOO.FISCALYEAR.START(day)``: Returns the starting date of the - fiscal year encompassing the provided date. - - ``ODOO.FISCALYEAR.END(day)``: Returns the ending date of the - fiscal year encompassing the provided date. - - ``ODOO.ACCOUNT.GROUP(type)``: Returns the account ids of a given - group where type should be a value of the ``account_type`` field - of ``account.account`` model. (``income``, ``asset_receivable``, - etc.) +- Note: Business Odoo module can add "business functions". This is + currently the case for the accounting module, which adds the + following features: + + - ``ODOO.CREDIT(account_codes, date_range)``: Get the total + credit for the specified account(s) and period. + - ``ODOO.DEBIT(account_codes, date_range)``: Get the total debit + for the specified account(s) and period. + - ``ODOO.BALANCE(account_codes, date_range)``: Get the total + balance for the specified account(s) and period. + - ``ODOO.FISCALYEAR.START(day)``: Returns the starting date of + the fiscal year encompassing the provided date. + - ``ODOO.FISCALYEAR.END(day)``: Returns the ending date of the + fiscal year encompassing the provided date. + - ``ODOO.ACCOUNT.GROUP(type)``: Returns the account ids of a + given group where type should be a value of the + ``account_type`` field of ``account.account`` model. + (``income``, ``asset_receivable``, etc.) **Create a new dynamic spreadsheet from pivot** ----------------------------------------------- -- Go to any pivot -- Press on insert button -- Select the dynamic rows or dynamic columns option and set a number of - rows/columns +- Go to any pivot +- Press on insert button +- Select the dynamic rows or dynamic columns option and set a number of + rows/columns A new table that will be updated with the actual or filtered values will be added. -- Note: When a pivot has multiple levels of aggrupations in the rows or - the columns, the number of rows/columns selected will be transfered to - each level. +- Note: When a pivot has multiple levels of aggrupations in the rows or + the columns, the number of rows/columns selected will be transfered + to each level. - Example: number of groups -> 2 number of rows -> 3 + Example: number of groups -> 2 number of rows -> 3 - - val1 + - val1 - - subval1.1 - - subval1.2 - - subval1.3 + - subval1.1 + - subval1.2 + - subval1.3 - - val2 + - val2 - - subval2.1 - - subval2.2 - - subval2.3 + - subval2.1 + - subval2.2 + - subval2.3 - - val3 + - val3 - - subval3.1 - - subval3.2 - - subval3.3 + - subval3.1 + - subval3.2 + - subval3.3 -https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/Hhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/vhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/xhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/phttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ohttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ghttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ -https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/../static/description/spreadsheetdynamic_table.gif +https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/Hhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/vhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/xhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/phttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ohttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ghttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ +https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/../static/description/spreadsheetdynamic_table.gif -.. |image1| image:: https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/static/description/spreadsheet_create.png -.. |image2| image:: https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/static/description/spreadsheet_edit.png -.. |image3| image:: https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/static/description/o-spreadsheet.png +.. |image1| image:: https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/static/description/spreadsheet_create.png +.. |image2| image:: https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/static/description/spreadsheet_edit.png +.. |image3| image:: https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/static/description/o-spreadsheet.png Development =========== @@ -154,7 +150,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -169,14 +165,14 @@ Authors Contributors ------------ -- Enric Tobella -- `Tecnativa `__: +- Enric Tobella +- `Tecnativa `__: - - Carlos Roca + - Carlos Roca -- `Open User Systems `__: +- `Open User Systems `__: - - Chris Mann + - Chris Mann Maintainers ----------- @@ -191,6 +187,6 @@ 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. +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_oca/data/spreadsheet_spreadsheet_import_mode.xml b/spreadsheet_oca/data/spreadsheet_spreadsheet_import_mode.xml index 14335c7f..1ee1db44 100644 --- a/spreadsheet_oca/data/spreadsheet_spreadsheet_import_mode.xml +++ b/spreadsheet_oca/data/spreadsheet_spreadsheet_import_mode.xml @@ -1,39 +1,30 @@ + id="spreadsheet_import_mode_new" + model="spreadsheet.spreadsheet.import.mode" + > new Create spreadsheet - + + id="spreadsheet_import_mode_add" + model="spreadsheet.spreadsheet.import.mode" + > add Add to spreadsheet - + + id="spreadsheet_import_mode_add_sheet" + model="spreadsheet.spreadsheet.import.mode" + > add_sheet Add sheet to spreadsheet - + diff --git a/spreadsheet_oca/demo/demo_spreadsheet.json b/spreadsheet_oca/demo/demo_spreadsheet.json index fde6c594..79a0811d 100644 --- a/spreadsheet_oca/demo/demo_spreadsheet.json +++ b/spreadsheet_oca/demo/demo_spreadsheet.json @@ -10,17 +10,17 @@ "cols": {}, "merges": [], "cells": { - "A1": { "style": 1, "content": "First Value", "border": 1 }, - "A2": { "format": 1, "content": "30.55", "border": 1 }, - "B1": { "style": 1, "content": "Second Value", "border": 1 }, - "B2": { "format": 1, "content": "50", "border": 1 }, - "C1": { "style": 1, "content": "Total", "border": 1 }, - "C2": { "format": 1, "content": "=sum(A2:B2)", "border": 1 }, - "A3": { "border": 2 }, - "B3": { "border": 2 }, - "C3": { "border": 2 }, - "D1": { "border": 3 }, - "D2": { "border": 3 } + "A1": {"style": 1, "content": "First Value", "border": 1}, + "A2": {"format": 1, "content": "30.55", "border": 1}, + "B1": {"style": 1, "content": "Second Value", "border": 1}, + "B2": {"format": 1, "content": "50", "border": 1}, + "C1": {"style": 1, "content": "Total", "border": 1}, + "C2": {"format": 1, "content": "=sum(A2:B2)", "border": 1}, + "A3": {"border": 2}, + "B3": {"border": 2}, + "C3": {"border": 2}, + "D1": {"border": 3}, + "D2": {"border": 3} }, "conditionalFormats": [], "figures": [], @@ -30,8 +30,8 @@ } ], "entities": {}, - "styles": { "1": { "bold": true, "align": "center" } }, - "formats": { "1": "[$$]#,##0.00" }, + "styles": {"1": {"bold": true, "align": "center"}}, + "formats": {"1": "[$$]#,##0.00"}, "borders": { "1": { "top": ["thin", "#000"], @@ -39,8 +39,8 @@ "left": ["thin", "#000"], "right": ["thin", "#000"] }, - "2": { "top": ["thin", "#000"] }, - "3": { "left": ["thin", "#000"] } + "2": {"top": ["thin", "#000"]}, + "3": {"left": ["thin", "#000"]} }, "revisionId": "START_REVISION", "uniqueFigureIds": true, diff --git a/spreadsheet_oca/demo/spreadsheet_spreadsheet.xml b/spreadsheet_oca/demo/spreadsheet_spreadsheet.xml index 798da876..11222ed5 100644 --- a/spreadsheet_oca/demo/spreadsheet_spreadsheet.xml +++ b/spreadsheet_oca/demo/spreadsheet_spreadsheet.xml @@ -3,10 +3,9 @@ Demo spreadsheet - + name="spreadsheet_binary_data" + type="base64" + file="spreadsheet_oca/demo/demo_spreadsheet.json" + /> diff --git a/spreadsheet_oca/security/security.xml b/spreadsheet_oca/security/security.xml index 2f37faa8..aa94100a 100644 --- a/spreadsheet_oca/security/security.xml +++ b/spreadsheet_oca/security/security.xml @@ -2,7 +2,6 @@ - Spreadsheet 99 @@ -16,16 +15,14 @@ + name="users" + eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]" + /> Spreadsheet Company Rule - [('company_id', 'in', company_ids + [False])] + [('company_id', 'in', company_ids + [False])] Spreadsheet Owner @@ -38,8 +35,8 @@ ['|', ('contributor_ids','=', user.id), ('contributor_group_ids','in', user.groups_id.ids)] + name="domain_force" + >['|', ('contributor_ids','=', user.id), ('contributor_group_ids','in', user.groups_id.ids)] @@ -48,8 +45,8 @@ ['|', ('reader_ids','=', user.id), ('reader_group_ids','in', user.groups_id.ids)] + name="domain_force" + >['|', ('reader_ids','=', user.id), ('reader_group_ids','in', user.groups_id.ids)] @@ -57,20 +54,12 @@ Spreadsheet Manager - + [(1,'=', 1)] Spreadsheet Import mode - - [('group_ids','in', user.groups_id.ids)] + + [('group_ids','in', user.groups_id.ids)] diff --git a/spreadsheet_oca/static/src/pivot/pivot_table.esm.js b/spreadsheet_oca/static/src/pivot/pivot_table.esm.js index 7dc50bd8..3202d542 100644 --- a/spreadsheet_oca/static/src/pivot/pivot_table.esm.js +++ b/spreadsheet_oca/static/src/pivot/pivot_table.esm.js @@ -1,67 +1,67 @@ /** @odoo-module */ /* Copyright 2024 Tecnativa - Carlos Roca * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ -import { SpreadsheetPivotTable } from "@spreadsheet/pivot/pivot_table"; -import { patch } from "@web/core/utils/patch"; +import {SpreadsheetPivotTable} from "@spreadsheet/pivot/pivot_table"; +import {patch} from "@web/core/utils/patch"; patch(SpreadsheetPivotTable.prototype, { - get _dynamic_cols() { - return this._cols[this._cols.length - 1] === "dynamic_cols"; - }, - getNumberOfMeasures() { - if (this._dynamic_cols) { - // We have disabled the computation of the last column to prevent showing - // the totalization of the columns when they are of a dynamic type. If - // shown, it would display the total of all records corresponding to the - // row, rather than what is being displayed on the screen. - return 1; - } - return this._super(...arguments); - }, - getColHeaders() { - if (this._dynamic_cols) { - // We return a copy of this._cols without the last entry of the array, - // which indicates that these are dynamic columns. - var cols = [...this._cols]; - cols.pop(); - return cols; - } - return this._super(...arguments); - }, - getMeasureHeaders() { - if (this._dynamic_cols) { - return this._cols[this._cols.length - 2]; - } - return this._super(...arguments); - }, - getColWidth() { - if (this._dynamic_cols) { - return this._cols[this._cols.length - 2].length; - } - return this._super(...arguments); - }, - getColHeight() { - if (this._dynamic_cols) { - return this._cols.length - 1; - } - return this._super(...arguments); - }, - getColMeasureIndex(values) { - if (this._dynamic_cols) { - var cols = [...this._cols]; - cols.pop(); - const vals = JSON.stringify(values); - const maxLength = Math.max(...cols.map((col) => col.length)); - for (let i = 0; i < maxLength; i++) { - const cellValues = cols.map((col) => - JSON.stringify((col[i] || {}).values) - ); - if (cellValues.includes(vals)) { - return i; + get _dynamic_cols() { + return this._cols[this._cols.length - 1] === "dynamic_cols"; + }, + getNumberOfMeasures() { + if (this._dynamic_cols) { + // We have disabled the computation of the last column to prevent showing + // the totalization of the columns when they are of a dynamic type. If + // shown, it would display the total of all records corresponding to the + // row, rather than what is being displayed on the screen. + return 1; } - } - return -1; - } - return this._super(...arguments); - }, + return this._super(...arguments); + }, + getColHeaders() { + if (this._dynamic_cols) { + // We return a copy of this._cols without the last entry of the array, + // which indicates that these are dynamic columns. + var cols = [...this._cols]; + cols.pop(); + return cols; + } + return this._super(...arguments); + }, + getMeasureHeaders() { + if (this._dynamic_cols) { + return this._cols[this._cols.length - 2]; + } + return this._super(...arguments); + }, + getColWidth() { + if (this._dynamic_cols) { + return this._cols[this._cols.length - 2].length; + } + return this._super(...arguments); + }, + getColHeight() { + if (this._dynamic_cols) { + return this._cols.length - 1; + } + return this._super(...arguments); + }, + getColMeasureIndex(values) { + if (this._dynamic_cols) { + var cols = [...this._cols]; + cols.pop(); + const vals = JSON.stringify(values); + const maxLength = Math.max(...cols.map((col) => col.length)); + for (let i = 0; i < maxLength; i++) { + const cellValues = cols.map((col) => + JSON.stringify((col[i] || {}).values) + ); + if (cellValues.includes(vals)) { + return i; + } + } + return -1; + } + return this._super(...arguments); + }, }); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js index c4c8b689..a98cf157 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js @@ -1,43 +1,43 @@ /** @odoo-module */ import * as spreadsheet from "@odoo/o-spreadsheet"; -import { patch } from "@web/core/utils/patch"; +import {patch} from "@web/core/utils/patch"; -const { chartRegistry } = spreadsheet.registries; -const { ChartPanel } = spreadsheet.components; +const {chartRegistry} = spreadsheet.registries; +const {ChartPanel} = spreadsheet.components; export function isOdooKey(code) { - return code.startsWith("odoo_"); + return code.startsWith("odoo_"); } patch(ChartPanel.prototype, { - get chartTypes() { - return this.filterChartTypes(isOdooKey(this.getChartDefinition().type)); - }, + get chartTypes() { + return this.filterChartTypes(isOdooKey(this.getChartDefinition().type)); + }, - filterChartTypes(isOdoo) { - var result = {}; - for (const key of chartRegistry.getKeys()) { - if ((isOdoo && isOdooKey(key)) || (!isOdoo && !isOdooKey(key))) { - result[key] = chartRegistry.get(key).name; - } - } - return result; - }, - onTypeChange(type) { - if (isOdooKey(this.getChartDefinition().type)) { - const definition = { - stacked: false, - verticalAxisPosition: "left", - ...this.env.model.getters.getChartDefinition(this.figureId), - type, - }; - this.env.model.dispatch("UPDATE_CHART", { - definition, - id: this.figureId, - sheetId: this.env.model.getters.getActiveSheetId(), - }); - } else { - super.onTypeChange(type); - } - }, + filterChartTypes(isOdoo) { + var result = {}; + for (const key of chartRegistry.getKeys()) { + if ((isOdoo && isOdooKey(key)) || (!isOdoo && !isOdooKey(key))) { + result[key] = chartRegistry.get(key).name; + } + } + return result; + }, + onTypeChange(type) { + if (isOdooKey(this.getChartDefinition().type)) { + const definition = { + stacked: false, + verticalAxisPosition: "left", + ...this.env.model.getters.getChartDefinition(this.figureId), + type, + }; + this.env.model.dispatch("UPDATE_CHART", { + definition, + id: this.figureId, + sheetId: this.env.model.getters.getActiveSheetId(), + }); + } else { + super.onTypeChange(type); + } + }, }); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js index 47f60691..8bda4972 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js @@ -1,99 +1,96 @@ /** @odoo-module */ import * as spreadsheet from "@odoo/o-spreadsheet"; -import { Domain } from "@web/core/domain"; +import {Domain} from "@web/core/domain"; -import { Many2XAutocomplete } from "@web/views/fields/relational_utils"; -import { patch } from "@web/core/utils/patch"; -import { useService } from "@web/core/utils/hooks"; -import { _t } from "@web/core/l10n/translation"; +import {Many2XAutocomplete} from "@web/views/fields/relational_utils"; +import {patch} from "@web/core/utils/patch"; +import {useService} from "@web/core/utils/hooks"; +import {_t} from "@web/core/l10n/translation"; -const { - LineBarPieConfigPanel, - ScorecardChartConfigPanel, - GaugeChartConfigPanel, -} = spreadsheet.components; +const {LineBarPieConfigPanel, ScorecardChartConfigPanel, GaugeChartConfigPanel} = + spreadsheet.components; const menuChartProps = { - setup() { - super.setup(...arguments); - this.menus = useService("menu"); - }, - get menuProps() { - const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); - var result = { - fieldString: _t("Menu Items"), - resModel: "ir.ui.menu", - update: this.updateMenu.bind(this), - activeActions: {}, - getDomain: this.getDomain.bind(this), - }; - if (menu) { - result.value = menu.name; - result.id = menu.id; - } - return result; - }, + setup() { + super.setup(...arguments); + this.menus = useService("menu"); + }, + get menuProps() { + const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); + var result = { + fieldString: _t("Menu Items"), + resModel: "ir.ui.menu", + update: this.updateMenu.bind(this), + activeActions: {}, + getDomain: this.getDomain.bind(this), + }; + if (menu) { + result.value = menu.name; + result.id = menu.id; + } + return result; + }, - getDomain() { - const menus = this.menus - .getAll() - .map((menu) => menu.id) - .filter((menuId) => menuId !== "root"); - return [["id", "in", menus]]; - }, - get menuId() { - const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); - if (menu) { - return [menu.id, menu.name]; - } - return false; - }, - updateMenu(menuId) { - if (!menuId) { - this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { - chartId: this.props.figureId, - odooMenuId: false, - }); - return; - } - const menu = this.env.model.getters.getIrMenu(menuId[0].id); - console.log(menu); - this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { - chartId: this.props.figureId, - odooMenuId: menu.xmlid || menu.id, - }); - }, - get record() { - const menus = this.menus - .getAll() - .map((menu) => menu.id) - .filter((menuId) => menuId !== "root"); - return { - getFieldDomain: function () { - return new Domain([["id", "in", menus]]); - }, - getFieldContext: function () { - return {}; - }, - }; - }, + getDomain() { + const menus = this.menus + .getAll() + .map((menu) => menu.id) + .filter((menuId) => menuId !== "root"); + return [["id", "in", menus]]; + }, + get menuId() { + const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); + if (menu) { + return [menu.id, menu.name]; + } + return false; + }, + updateMenu(menuId) { + if (!menuId) { + this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { + chartId: this.props.figureId, + odooMenuId: false, + }); + return; + } + const menu = this.env.model.getters.getIrMenu(menuId[0].id); + console.log(menu); + this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { + chartId: this.props.figureId, + odooMenuId: menu.xmlid || menu.id, + }); + }, + get record() { + const menus = this.menus + .getAll() + .map((menu) => menu.id) + .filter((menuId) => menuId !== "root"); + return { + getFieldDomain: function () { + return new Domain([["id", "in", menus]]); + }, + getFieldContext: function () { + return {}; + }, + }; + }, }; patch(LineBarPieConfigPanel.prototype, menuChartProps); LineBarPieConfigPanel.components = { - ...LineBarPieConfigPanel.components, - Many2XAutocomplete, + ...LineBarPieConfigPanel.components, + Many2XAutocomplete, }; patch(ScorecardChartConfigPanel.prototype, menuChartProps); ScorecardChartConfigPanel.components = { - ...ScorecardChartConfigPanel.components, - Many2XAutocomplete, + ...ScorecardChartConfigPanel.components, + Many2XAutocomplete, }; patch(GaugeChartConfigPanel.prototype, menuChartProps); GaugeChartConfigPanel.components = { - ...GaugeChartConfigPanel.components, - Many2XAutocomplete, + ...GaugeChartConfigPanel.components, + Many2XAutocomplete, }; diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js index 99f9677d..7076f88f 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js @@ -1,197 +1,195 @@ /** @odoo-module **/ import * as spreadsheet from "@odoo/o-spreadsheet"; -import { Component, onWillStart, useState } from "@odoo/owl"; -import { _lt, _t } from "@web/core/l10n/translation"; -import { FilterValue } from "@spreadsheet/global_filters/components/filter_value/filter_value"; -import { ModelFieldSelector } from "@web/core/model_field_selector/model_field_selector"; -import { ModelSelector } from "@web/core/model_selector/model_selector"; -import { RELATIVE_DATE_RANGE_TYPES } from "@spreadsheet/helpers/constants"; -import { globalFiltersFieldMatchers } from "@spreadsheet/global_filters/plugins/global_filters_core_plugin"; -import { useService } from "@web/core/utils/hooks"; +import {Component, onWillStart, useState} from "@odoo/owl"; +import {_lt, _t} from "@web/core/l10n/translation"; +import {FilterValue} from "@spreadsheet/global_filters/components/filter_value/filter_value"; +import {ModelFieldSelector} from "@web/core/model_field_selector/model_field_selector"; +import {ModelSelector} from "@web/core/model_selector/model_selector"; +import {RELATIVE_DATE_RANGE_TYPES} from "@spreadsheet/helpers/constants"; +import {globalFiltersFieldMatchers} from "@spreadsheet/global_filters/plugins/global_filters_core_plugin"; +import {useService} from "@web/core/utils/hooks"; -const { topbarMenuRegistry } = spreadsheet.registries; +const {topbarMenuRegistry} = spreadsheet.registries; const uuidGenerator = new spreadsheet.helpers.UuidGenerator(); -topbarMenuRegistry.add("file", { name: _t("File"), sequence: 10 }); +topbarMenuRegistry.add("file", {name: _t("File"), sequence: 10}); topbarMenuRegistry.addChild("filters", ["file"], { - name: _t("Filters"), - sequence: 70, - execute: (env) => env.openSidePanel("FilterPanel", {}), - icon: "o-spreadsheet-Icon.GLOBAL_FILTERS", + name: _t("Filters"), + sequence: 70, + execute: (env) => env.openSidePanel("FilterPanel", {}), + icon: "o-spreadsheet-Icon.GLOBAL_FILTERS", }); topbarMenuRegistry.addChild("save", ["file"], { - name: _t("Save"), - // Description: "Ctrl+S", // This is not working, so removing it from the view for now... - sequence: 10, - execute: (env) => env.saveSpreadsheet(), - icon: "o-spreadsheet-Icon.DOWNLOAD", + name: _t("Save"), + // Description: "Ctrl+S", // This is not working, so removing it from the view for now... + sequence: 10, + execute: (env) => env.saveSpreadsheet(), + icon: "o-spreadsheet-Icon.DOWNLOAD", }); topbarMenuRegistry.addChild("download", ["file"], { - name: _t("Download XLSX"), - sequence: 20, - execute: (env) => env.downloadAsXLXS(), - icon: "o-spreadsheet-Icon.EXPORT_XLSX", + name: _t("Download XLSX"), + sequence: 20, + execute: (env) => env.downloadAsXLXS(), + icon: "o-spreadsheet-Icon.EXPORT_XLSX", }); topbarMenuRegistry.addChild("settings", ["file"], { - name: _t("Settings"), - sequence: 100, - execute: (env) => env.openSidePanel("Settings"), - icon: "o-spreadsheet-Icon.COG", + name: _t("Settings"), + sequence: 100, + execute: (env) => env.openSidePanel("Settings"), + icon: "o-spreadsheet-Icon.COG", }); -const { sidePanelRegistry } = spreadsheet.registries; +const {sidePanelRegistry} = spreadsheet.registries; export class FilterPanel extends Component { - onEditFilter(filter) { - this.env.openSidePanel("EditFilterPanel", { filter }); - } - onAddFilter(type) { - this.env.openSidePanel("EditFilterPanel", { filter: { type: type } }); - } + onEditFilter(filter) { + this.env.openSidePanel("EditFilterPanel", {filter}); + } + onAddFilter(type) { + this.env.openSidePanel("EditFilterPanel", {filter: {type: type}}); + } } FilterPanel.template = "spreadsheet_oca.FilterPanel"; FilterPanel.components = { - FilterValue, + FilterValue, }; sidePanelRegistry.add("FilterPanel", { - title: "Filters", - Body: FilterPanel, + title: "Filters", + Body: FilterPanel, }); export class EditFilterPanel extends Component { - setup() { - this.filterId = this.props.filter; - this.orm = useService("orm"); - this.state = useState({ - label: this.props.filter.label, - type: this.props.filter.type, - defaultValue: this.props.filter.defaultValue, - rangeType: this.props.filter.rangeType || "year", - modelName: { technical: this.props.filter.modelName, label: null }, - objects: {}, - }); - this.relativeDateRangeTypes = RELATIVE_DATE_RANGE_TYPES; - onWillStart(this.willStart.bind(this)); - } - async willStart() { - if (this.state.modelName.technical !== undefined) { - const modelLabel = await this.orm.call("ir.model", "display_name_for", [ - [this.state.modelName.technical], - ]); - this.state.modelName.label = modelLabel[0] && modelLabel[0].display_name; + setup() { + this.filterId = this.props.filter; + this.orm = useService("orm"); + this.state = useState({ + label: this.props.filter.label, + type: this.props.filter.type, + defaultValue: this.props.filter.defaultValue, + rangeType: this.props.filter.rangeType || "year", + modelName: {technical: this.props.filter.modelName, label: null}, + objects: {}, + }); + this.relativeDateRangeTypes = RELATIVE_DATE_RANGE_TYPES; + onWillStart(this.willStart.bind(this)); } - var ModelFields = []; - for (var [objectType, objectClass] of Object.entries( - globalFiltersFieldMatchers - )) { - for (const objectId of objectClass.getIds()) { - var fields = objectClass.getFields(objectId); - this.state.objects[objectType + "_" + objectId] = { - id: objectType + "_" + objectId, - objectId: objectId, - name: objectClass.getDisplayName(objectId), - tag: await objectClass.getTag(objectId), - fieldMatch: - objectClass.getFieldMatching(objectId, this.props.filter.id) || {}, - fields: fields, - type: objectType, - model: objectClass.getModel(objectId), - }; - ModelFields.push(fields); - } + async willStart() { + if (this.state.modelName.technical !== undefined) { + const modelLabel = await this.orm.call("ir.model", "display_name_for", [ + [this.state.modelName.technical], + ]); + this.state.modelName.label = modelLabel[0] && modelLabel[0].display_name; + } + var ModelFields = []; + for (var [objectType, objectClass] of Object.entries( + globalFiltersFieldMatchers + )) { + for (const objectId of objectClass.getIds()) { + var fields = objectClass.getFields(objectId); + this.state.objects[objectType + "_" + objectId] = { + id: objectType + "_" + objectId, + objectId: objectId, + name: objectClass.getDisplayName(objectId), + tag: await objectClass.getTag(objectId), + fieldMatch: + objectClass.getFieldMatching(objectId, this.props.filter.id) || + {}, + fields: fields, + type: objectType, + model: objectClass.getModel(objectId), + }; + ModelFields.push(fields); + } + } + this.models = [ + ...new Set( + ModelFields.map((field_items) => Object.values(field_items)) + .flat() + .filter((field) => field.relation) + .map((field) => field.relation) + ), + ]; + } + get dateRangeTypes() { + return [ + {type: "fixedPeriod", description: _t("Month / Quarter")}, + {type: "relative", description: _t("Relative Period")}, + {type: "from_to", description: _t("From / To")}, + ]; + } + get dateOffset() { + return [ + {value: 0, name: ""}, + {value: -1, name: _lt("Previous")}, + {value: -2, name: _lt("Before Previous")}, + {value: 1, name: _lt("Next")}, + {value: 2, name: _lt("After next")}, + ]; + } + onChangeFieldMatchOffset(object, ev) { + this.state.objects[object.id].fieldMatch.offset = parseInt(ev.target.value, 10); + } + onModelSelected(ev) { + this.state.modelName.technical = ev.technical; + this.state.modelName.label = ev.label; } - this.models = [ - ...new Set( - ModelFields.map((field_items) => Object.values(field_items)) - .flat() - .filter((field) => field.relation) - .map((field) => field.relation) - ), - ]; - } - get dateRangeTypes() { - return [ - { type: "fixedPeriod", description: _t("Month / Quarter") }, - { type: "relative", description: _t("Relative Period") }, - { type: "from_to", description: _t("From / To") }, - ]; - } - get dateOffset() { - return [ - { value: 0, name: "" }, - { value: -1, name: _lt("Previous") }, - { value: -2, name: _lt("Before Previous") }, - { value: 1, name: _lt("Next") }, - { value: 2, name: _lt("After next") }, - ]; - } - onChangeFieldMatchOffset(object, ev) { - this.state.objects[object.id].fieldMatch.offset = parseInt( - ev.target.value, - 10 - ); - } - onModelSelected(ev) { - this.state.modelName.technical = ev.technical; - this.state.modelName.label = ev.label; - } - onDateRangeChange(ev) { - this.state.rangeType = ev.target.value; - this.state.defaultValue = undefined; - } - onSave() { - const action = this.props.filter.id - ? "EDIT_GLOBAL_FILTER" - : "ADD_GLOBAL_FILTER"; - this.env.openSidePanel("FilterPanel", {}); - var filter = { - id: this.props.filter.id || uuidGenerator.uuidv4(), - type: this.state.type, - label: this.state.label, - defaultValue: this.state.defaultValue, - rangeType: this.state.rangeType, - modelName: this.state.modelName.technical, - }; - var filterMatching = {}; - Object.values(this.state.objects).forEach((object) => { - filterMatching[object.type] = filterMatching[object.type] || {}; - filterMatching[object.type][object.objectId] = { ...object.fieldMatch }; - }); - this.env.model.dispatch(action, { - id: filter.id, - filter, - ...filterMatching, - }); + onDateRangeChange(ev) { + this.state.rangeType = ev.target.value; + this.state.defaultValue = undefined; + } + onSave() { + const action = this.props.filter.id + ? "EDIT_GLOBAL_FILTER" + : "ADD_GLOBAL_FILTER"; + this.env.openSidePanel("FilterPanel", {}); + var filter = { + id: this.props.filter.id || uuidGenerator.uuidv4(), + type: this.state.type, + label: this.state.label, + defaultValue: this.state.defaultValue, + rangeType: this.state.rangeType, + modelName: this.state.modelName.technical, + }; + var filterMatching = {}; + Object.values(this.state.objects).forEach((object) => { + filterMatching[object.type] = filterMatching[object.type] || {}; + filterMatching[object.type][object.objectId] = {...object.fieldMatch}; + }); + this.env.model.dispatch(action, { + id: filter.id, + filter, + ...filterMatching, + }); - this.env.openSidePanel("FilterPanel", {}); - } - onCancel() { - this.env.openSidePanel("FilterPanel", {}); - } - onRemove() { - if (this.props.filter.id) { - this.env.model.dispatch("REMOVE_GLOBAL_FILTER", { - id: this.props.filter.id, - }); + this.env.openSidePanel("FilterPanel", {}); + } + onCancel() { + this.env.openSidePanel("FilterPanel", {}); + } + onRemove() { + if (this.props.filter.id) { + this.env.model.dispatch("REMOVE_GLOBAL_FILTER", { + id: this.props.filter.id, + }); + } + this.env.openSidePanel("FilterPanel", {}); + } + onFieldMatchUpdate(object, name) { + this.state.objects[object.id].fieldMatch.chain = name; + this.state.objects[object.id].fieldMatch.type = object.fields[name]?.type; + } + toggleDateDefaultValue(ev) { + this.state.defaultValue = ev.target.checked ? "this_month" : undefined; } - this.env.openSidePanel("FilterPanel", {}); - } - onFieldMatchUpdate(object, name) { - this.state.objects[object.id].fieldMatch.chain = name; - this.state.objects[object.id].fieldMatch.type = object.fields[name]?.type; - } - toggleDateDefaultValue(ev) { - this.state.defaultValue = ev.target.checked ? "this_month" : undefined; - } } EditFilterPanel.template = "spreadsheet_oca.EditFilterPanel"; -EditFilterPanel.components = { ModelSelector, ModelFieldSelector }; +EditFilterPanel.components = {ModelSelector, ModelFieldSelector}; sidePanelRegistry.add("EditFilterPanel", { - title: "Edit Filter", - Body: EditFilterPanel, + title: "Edit Filter", + Body: EditFilterPanel, }); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js index 5e764e1a..26844d77 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js @@ -1,304 +1,303 @@ /** @odoo-module **/ import * as spreadsheet from "@odoo/o-spreadsheet"; -import { Component, onWillStart, onWillUpdateProps } from "@odoo/owl"; -import { - makeDynamicCols, - makeDynamicRows, -} from "../utils/dynamic_generators.esm"; -import { Domain } from "@web/core/domain"; -import { DomainSelector } from "@web/core/domain_selector/domain_selector"; -import { DomainSelectorDialog } from "@web/core/domain_selector_dialog/domain_selector_dialog"; -import { FormViewDialog } from "@web/views/view_dialogs/form_view_dialog"; -import { _t } from "@web/core/l10n/translation"; -import { formatDate } from "@web/core/l10n/dates"; -import { useService } from "@web/core/utils/hooks"; +import {Component, onWillStart, onWillUpdateProps} from "@odoo/owl"; +import {makeDynamicCols, makeDynamicRows} from "../utils/dynamic_generators.esm"; +import {Domain} from "@web/core/domain"; +import {DomainSelector} from "@web/core/domain_selector/domain_selector"; +import {DomainSelectorDialog} from "@web/core/domain_selector_dialog/domain_selector_dialog"; +import {FormViewDialog} from "@web/views/view_dialogs/form_view_dialog"; +import {_t} from "@web/core/l10n/translation"; +import {formatDate} from "@web/core/l10n/dates"; +import {useService} from "@web/core/utils/hooks"; -const { DateTime } = luxon; -const { sidePanelRegistry, topbarMenuRegistry } = spreadsheet.registries; +const {DateTime} = luxon; +const {sidePanelRegistry, topbarMenuRegistry} = spreadsheet.registries; topbarMenuRegistry.addChild("data_sources", ["data"], (env) => { - let sequence = 100; - const children = env.model.getters.getPivotIds().map((pivotId, index) => ({ - id: `data_source_pivot_ ${pivotId}`, - name: env.model.getters.getPivotDisplayName(pivotId), - sequence: sequence++, - execute: (child_env) => { - child_env.model.dispatch("SELECT_PIVOT", { - pivotId: pivotId, - }); - child_env.openSidePanel("PivotPanel", {}); - }, - icon: "spreadsheet_oca.PivotIcon", - separator: index === env.model.getters.getPivotIds().length - 1, - })); - const lists = env.model.getters.getListIds().map((listId, index) => ({ - id: `data_source_list_${listId}`, - name: env.model.getters.getListDisplayName(listId), - sequence: sequence++, - execute: (child_env) => { - child_env.model.dispatch("SELECT_ODOO_LIST", { listId: listId }); - child_env.openSidePanel("ListPanel", {}); - }, - icon: "spreadsheet_oca.ListIcon", - separator: index === env.model.getters.getListIds().length - 1, - })); - return children.concat(lists).concat([ - { - id: "refresh_all_data", - name: _t("Refresh all data"), - sequence: 110, - execute: (child_env) => { - child_env.model.dispatch("REFRESH_ALL_DATA_SOURCES"); - }, - separator: true, - }, - ]); + let sequence = 100; + const children = env.model.getters.getPivotIds().map((pivotId, index) => ({ + id: `data_source_pivot_ ${pivotId}`, + name: env.model.getters.getPivotDisplayName(pivotId), + sequence: sequence++, + execute: (child_env) => { + child_env.model.dispatch("SELECT_PIVOT", { + pivotId: pivotId, + }); + child_env.openSidePanel("PivotPanel", {}); + }, + icon: "spreadsheet_oca.PivotIcon", + separator: index === env.model.getters.getPivotIds().length - 1, + })); + const lists = env.model.getters.getListIds().map((listId, index) => ({ + id: `data_source_list_${listId}`, + name: env.model.getters.getListDisplayName(listId), + sequence: sequence++, + execute: (child_env) => { + child_env.model.dispatch("SELECT_ODOO_LIST", {listId: listId}); + child_env.openSidePanel("ListPanel", {}); + }, + icon: "spreadsheet_oca.ListIcon", + separator: index === env.model.getters.getListIds().length - 1, + })); + return children.concat(lists).concat([ + { + id: "refresh_all_data", + name: _t("Refresh all data"), + sequence: 110, + execute: (child_env) => { + child_env.model.dispatch("REFRESH_ALL_DATA_SOURCES"); + }, + separator: true, + }, + ]); }); export class PivotPanelDisplay extends Component { - setup() { - this.dialog = useService("dialog"); - onWillStart(this.modelData.bind(this)); - onWillUpdateProps(this.modelData.bind(this)); - } - async modelData() { - this.PivotDataSource = await this.env.model.getters.getAsyncPivotDataSource( - this.props.pivotId - ); - this.modelLabel = await this.PivotDataSource.getModelLabel(); - } - get domain() { - return new Domain(this.props.pivotDefinition.domain).toString(); - } - get pivotDimensions() { - return [ - ...this.props.pivotDefinition.rowGroupBys, - ...this.props.pivotDefinition.colGroupBys, - ].map((fieldName) => this.PivotDataSource.getFormattedGroupBy(fieldName)); - } - get sortInformation() { - const sortedColumn = this.props.pivotDefinition.sortedColumn; - const orderTranslate = - sortedColumn.order === "asc" ? _t("ascending") : _t("descending"); - const GroupByDisplayLabel = this.PivotDataSource.getMeasureDisplayName( - sortedColumn.measure - ); - return `${GroupByDisplayLabel} (${orderTranslate})`; - } - get lastUpdate() { - const lastUpdate = this.PivotDataSource.lastUpdate; - if (lastUpdate) { - return formatDate(DateTime.fromMillis(lastUpdate)); + setup() { + this.dialog = useService("dialog"); + onWillStart(this.modelData.bind(this)); + onWillUpdateProps(this.modelData.bind(this)); } - return _t("not updated"); - } - editDomain() { - this.dialog.add(DomainSelectorDialog, { - resModel: this.props.pivotDefinition.model, - domain: this.domain, - readonly: false, - isDebugMode: Boolean(this.env.debug), - onConfirm: this.onSelectDomain.bind(this), - }); - } - onSelectDomain(domain) { - this.env.model.dispatch("UPDATE_ODOO_PIVOT_DOMAIN", { - pivotId: this.props.pivotId, - domain: new Domain(domain).toList(), - }); - } - async insertPivot() { - const datasourceModel = await this.env.model.getters - .getPivotDataSource(this.props.pivotId) - .copyModelWithOriginalDomain(); - const tableStructure = datasourceModel.getTableStructure().export(); - const selectedZone = this.env.model.getters.getSelectedZone(); - this.env.model.dispatch("RE_INSERT_PIVOT", { - id: this.props.pivotId, - col: selectedZone.left, - row: selectedZone.top, - sheetId: this.env.model.getters.getActiveSheetId(), - table: tableStructure, - }); - this.env.model.dispatch("REFRESH_PIVOT", { id: this.props.pivotId }); - } - - async insertDynamicPivot() { - const datasourceModel = await this.env.model.getters - .getPivotDataSource(this.props.pivotId) - .copyModelWithOriginalDomain(); - var { cols, rows, measures } = datasourceModel.getTableStructure().export(); - const { dynamic_rows, number_of_rows, dynamic_cols, number_of_cols } = - await new Promise((resolve) => { - this.dialog.add( - FormViewDialog, - { - title: _t("Select the quantity of rows"), - resModel: "spreadsheet.select.row.number", - context: { - default_can_have_dynamic_cols: Boolean(cols[0][0].fields.length), - }, - onRecordSaved: async (record) => { - resolve({ - dynamic_rows: record.data.dynamic_rows, - number_of_rows: record.data.number_of_rows, - dynamic_cols: record.data.dynamic_cols, - number_of_cols: record.data.number_of_cols, - }); - }, - }, - { onClose: () => resolve(false) } + async modelData() { + this.PivotDataSource = await this.env.model.getters.getAsyncPivotDataSource( + this.props.pivotId ); - }); - if (!dynamic_rows && !dynamic_cols) { - return; + this.modelLabel = await this.PivotDataSource.getModelLabel(); } - if (dynamic_rows) { - const indentations = rows.map((r) => r.indent); - const max_indentation = Math.max(...indentations); - rows = makeDynamicRows( - this.props.pivotDefinition.rowGroupBys, - number_of_rows, - 1, - max_indentation - ); + get domain() { + return new Domain(this.props.pivotDefinition.domain).toString(); } - if (dynamic_cols) { - cols = makeDynamicCols( - this.props.pivotDefinition.colGroupBys, - number_of_cols, - this.props.pivotDefinition.measures - ); + get pivotDimensions() { + return [ + ...this.props.pivotDefinition.rowGroupBys, + ...this.props.pivotDefinition.colGroupBys, + ].map((fieldName) => this.PivotDataSource.getFormattedGroupBy(fieldName)); } - const table = { - cols, - rows, - measures, - }; - const selectedZone = this.env.model.getters.getSelectedZone(); - this.env.model.dispatch("RE_INSERT_PIVOT", { - id: this.props.pivotId, - col: selectedZone.left, - row: selectedZone.top, - sheetId: this.env.model.getters.getActiveSheetId(), - table, - }); - this.env.model.dispatch("REFRESH_PIVOT", { id: this.props.pivotId }); - } - delete() { - this.env.askConfirmation( - _t("Are you sure you want to delete this pivot?"), - () => { - this.env.model.dispatch("REMOVE_PIVOT", { - pivotId: this.props.pivotId, + get sortInformation() { + const sortedColumn = this.props.pivotDefinition.sortedColumn; + const orderTranslate = + sortedColumn.order === "asc" ? _t("ascending") : _t("descending"); + const GroupByDisplayLabel = this.PivotDataSource.getMeasureDisplayName( + sortedColumn.measure + ); + return `${GroupByDisplayLabel} (${orderTranslate})`; + } + get lastUpdate() { + const lastUpdate = this.PivotDataSource.lastUpdate; + if (lastUpdate) { + return formatDate(DateTime.fromMillis(lastUpdate)); + } + return _t("not updated"); + } + editDomain() { + this.dialog.add(DomainSelectorDialog, { + resModel: this.props.pivotDefinition.model, + domain: this.domain, + readonly: false, + isDebugMode: Boolean(this.env.debug), + onConfirm: this.onSelectDomain.bind(this), }); - } - ); - } + } + onSelectDomain(domain) { + this.env.model.dispatch("UPDATE_ODOO_PIVOT_DOMAIN", { + pivotId: this.props.pivotId, + domain: new Domain(domain).toList(), + }); + } + async insertPivot() { + const datasourceModel = await this.env.model.getters + .getPivotDataSource(this.props.pivotId) + .copyModelWithOriginalDomain(); + const tableStructure = datasourceModel.getTableStructure().export(); + const selectedZone = this.env.model.getters.getSelectedZone(); + this.env.model.dispatch("RE_INSERT_PIVOT", { + id: this.props.pivotId, + col: selectedZone.left, + row: selectedZone.top, + sheetId: this.env.model.getters.getActiveSheetId(), + table: tableStructure, + }); + this.env.model.dispatch("REFRESH_PIVOT", {id: this.props.pivotId}); + } + + async insertDynamicPivot() { + const datasourceModel = await this.env.model.getters + .getPivotDataSource(this.props.pivotId) + .copyModelWithOriginalDomain(); + var {cols, rows, measures} = datasourceModel.getTableStructure().export(); + const {dynamic_rows, number_of_rows, dynamic_cols, number_of_cols} = + await new Promise((resolve) => { + this.dialog.add( + FormViewDialog, + { + title: _t("Select the quantity of rows"), + resModel: "spreadsheet.select.row.number", + context: { + default_can_have_dynamic_cols: Boolean( + cols[0][0].fields.length + ), + }, + onRecordSaved: async (record) => { + resolve({ + dynamic_rows: record.data.dynamic_rows, + number_of_rows: record.data.number_of_rows, + dynamic_cols: record.data.dynamic_cols, + number_of_cols: record.data.number_of_cols, + }); + }, + }, + {onClose: () => resolve(false)} + ); + }); + if (!dynamic_rows && !dynamic_cols) { + return; + } + if (dynamic_rows) { + const indentations = rows.map((r) => r.indent); + const max_indentation = Math.max(...indentations); + rows = makeDynamicRows( + this.props.pivotDefinition.rowGroupBys, + number_of_rows, + 1, + max_indentation + ); + } + if (dynamic_cols) { + cols = makeDynamicCols( + this.props.pivotDefinition.colGroupBys, + number_of_cols, + this.props.pivotDefinition.measures + ); + } + const table = { + cols, + rows, + measures, + }; + const selectedZone = this.env.model.getters.getSelectedZone(); + this.env.model.dispatch("RE_INSERT_PIVOT", { + id: this.props.pivotId, + col: selectedZone.left, + row: selectedZone.top, + sheetId: this.env.model.getters.getActiveSheetId(), + table, + }); + this.env.model.dispatch("REFRESH_PIVOT", {id: this.props.pivotId}); + } + delete() { + this.env.askConfirmation( + _t("Are you sure you want to delete this pivot?"), + () => { + this.env.model.dispatch("REMOVE_PIVOT", { + pivotId: this.props.pivotId, + }); + } + ); + } } PivotPanelDisplay.template = "spreadsheet_oca.PivotPanelDisplay"; PivotPanelDisplay.components = { - DomainSelector, + DomainSelector, }; PivotPanelDisplay.properties = { - pivotId: String, - pivotDefinition: Object, + pivotId: String, + pivotDefinition: Object, }; export class PivotPanel extends Component { - get pivotId() { - return this.env.model.getters.getSelectedPivotId(); - } - get pivotDefinition() { - return this.env.model.getters.getPivotDefinition(this.pivotId); - } + get pivotId() { + return this.env.model.getters.getSelectedPivotId(); + } + get pivotDefinition() { + return this.env.model.getters.getPivotDefinition(this.pivotId); + } } PivotPanel.template = "spreadsheet_oca.PivotPanel"; PivotPanel.components = { - PivotPanelDisplay, + PivotPanelDisplay, }; sidePanelRegistry.add("PivotPanel", { - title: "Pivot table information", - Body: PivotPanel, + title: "Pivot table information", + Body: PivotPanel, }); export class ListPanelDisplay extends Component { - setup() { - this.dialog = useService("dialog"); - onWillStart(this.modelData.bind(this)); - onWillUpdateProps(this.modelData.bind(this)); - } - async modelData() { - this.ListDataSource = await this.env.model.getters.getAsyncListDataSource( - this.props.listId - ); - this.modelLabel = await this.ListDataSource.getModelLabel(); - } - get domain() { - return new Domain(this.props.listDefinition.domain).toString(); - } - get lastUpdate() { - const lastUpdate = this.ListDataSource.lastUpdate; - if (lastUpdate) { - return formatDate(DateTime.fromMillis(lastUpdate)); + setup() { + this.dialog = useService("dialog"); + onWillStart(this.modelData.bind(this)); + onWillUpdateProps(this.modelData.bind(this)); + } + async modelData() { + this.ListDataSource = await this.env.model.getters.getAsyncListDataSource( + this.props.listId + ); + this.modelLabel = await this.ListDataSource.getModelLabel(); + } + get domain() { + return new Domain(this.props.listDefinition.domain).toString(); + } + get lastUpdate() { + const lastUpdate = this.ListDataSource.lastUpdate; + if (lastUpdate) { + return formatDate(DateTime.fromMillis(lastUpdate)); + } + return _t("not updated"); } - return _t("not updated"); - } - editDomain() { - this.dialog.add(DomainSelectorDialog, { - resModel: this.props.listDefinition.model, - domain: this.domain, - readonly: false, - isDebugMode: Boolean(this.env.debug), - onConfirm: this.onSelectDomain.bind(this), - }); - } - onSelectDomain(domain) { - this.env.model.dispatch("UPDATE_ODOO_LIST_DOMAIN", { - listId: this.props.listId, - domain: new Domain(domain).toList(), - }); - } - delete() { - this.env.askConfirmation( - _t("Are you sure you want to delete this list?"), - () => { - this.env.model.dispatch("REMOVE_ODOO_LIST", { - listId: this.props.listId, + editDomain() { + this.dialog.add(DomainSelectorDialog, { + resModel: this.props.listDefinition.model, + domain: this.domain, + readonly: false, + isDebugMode: Boolean(this.env.debug), + onConfirm: this.onSelectDomain.bind(this), }); - } - ); - } + } + onSelectDomain(domain) { + this.env.model.dispatch("UPDATE_ODOO_LIST_DOMAIN", { + listId: this.props.listId, + domain: new Domain(domain).toList(), + }); + } + delete() { + this.env.askConfirmation( + _t("Are you sure you want to delete this list?"), + () => { + this.env.model.dispatch("REMOVE_ODOO_LIST", { + listId: this.props.listId, + }); + } + ); + } } ListPanelDisplay.template = "spreadsheet_oca.ListPanelDisplay"; ListPanelDisplay.components = { - DomainSelector, + DomainSelector, }; ListPanelDisplay.properties = { - listId: String, - listDefinition: Object, + listId: String, + listDefinition: Object, }; export class ListPanel extends Component { - get listId() { - return this.env.model.getters.getSelectedListId(); - } - get listDefinition() { - return this.env.model.getters.getListDefinition(this.listId); - } + get listId() { + return this.env.model.getters.getSelectedListId(); + } + get listDefinition() { + return this.env.model.getters.getListDefinition(this.listId); + } } ListPanel.template = "spreadsheet_oca.ListPanel"; ListPanel.components = { - ListPanelDisplay, + ListPanelDisplay, }; sidePanelRegistry.add("ListPanel", { - title: "List information", - Body: ListPanel, + title: "List information", + Body: ListPanel, }); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js index 7bb60767..92785576 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js @@ -1,99 +1,99 @@ /** @odoo-module */ import * as spreadsheet from "@odoo/o-spreadsheet"; -import { Domain } from "@web/core/domain"; -import { Many2XAutocomplete } from "@web/views/fields/relational_utils"; -import { useService } from "@web/core/utils/hooks"; -import { _t } from "@web/core/l10n/translation"; +import {Domain} from "@web/core/domain"; +import {Many2XAutocomplete} from "@web/views/fields/relational_utils"; +import {useService} from "@web/core/utils/hooks"; +import {_t} from "@web/core/l10n/translation"; -const { chartSidePanelComponentRegistry } = spreadsheet.registries; -const { LineBarPieDesignPanel } = spreadsheet.components; -const { Component } = owl; +const {chartSidePanelComponentRegistry} = spreadsheet.registries; +const {LineBarPieDesignPanel} = spreadsheet.components; +const {Component} = owl; export class OdooPanel extends Component { - setup() { - this.menus = useService("menu"); - } - get menuProps() { - const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); - var result = { - fieldString: _t("Menu Items"), - resModel: "ir.ui.menu", - update: this.updateMenu.bind(this), - activeActions: {}, - getDomain: this.getDomain.bind(this), - }; - if (menu) { - result.value = menu.name; - result.id = menu.id; + setup() { + this.menus = useService("menu"); } - return result; - } - getDomain() { - const menus = this.menus - .getAll() - .map((menu) => menu.id) - .filter((menuId) => menuId !== "root"); - return [["id", "in", menus]]; - } - get menuId() { - const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); - if (menu) { - return [menu.id, menu.name]; + get menuProps() { + const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); + var result = { + fieldString: _t("Menu Items"), + resModel: "ir.ui.menu", + update: this.updateMenu.bind(this), + activeActions: {}, + getDomain: this.getDomain.bind(this), + }; + if (menu) { + result.value = menu.name; + result.id = menu.id; + } + return result; } - return false; - } - updateMenu(menuId) { - if (!menuId) { - this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { - chartId: this.props.figureId, - odooMenuId: false, - }); - return; + getDomain() { + const menus = this.menus + .getAll() + .map((menu) => menu.id) + .filter((menuId) => menuId !== "root"); + return [["id", "in", menus]]; + } + get menuId() { + const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); + if (menu) { + return [menu.id, menu.name]; + } + return false; + } + updateMenu(menuId) { + if (!menuId) { + this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { + chartId: this.props.figureId, + odooMenuId: false, + }); + return; + } + const menu = this.env.model.getters.getIrMenu(menuId[0].id); + this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { + chartId: this.props.figureId, + odooMenuId: menu.xmlid || menu.id, + }); + } + get record() { + const menus = this.menus + .getAll() + .map((menu) => menu.id) + .filter((menuId) => menuId !== "root"); + return { + getFieldDomain: function () { + return new Domain([["id", "in", menus]]); + }, + getFieldContext: function () { + return {}; + }, + }; } - const menu = this.env.model.getters.getIrMenu(menuId[0].id); - this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { - chartId: this.props.figureId, - odooMenuId: menu.xmlid || menu.id, - }); - } - get record() { - const menus = this.menus - .getAll() - .map((menu) => menu.id) - .filter((menuId) => menuId !== "root"); - return { - getFieldDomain: function () { - return new Domain([["id", "in", menus]]); - }, - getFieldContext: function () { - return {}; - }, - }; - } } OdooPanel.template = "spreadsheet_oca.OdooPanel"; -OdooPanel.components = { Many2XAutocomplete }; +OdooPanel.components = {Many2XAutocomplete}; class OdooStackablePanel extends OdooPanel { - onChangeStacked(ev) { - this.props.updateChart(this.props.figureId, { - stacked: ev.target.checked, - }); - } + onChangeStacked(ev) { + this.props.updateChart(this.props.figureId, { + stacked: ev.target.checked, + }); + } } OdooStackablePanel.template = "spreadsheet_oca.OdooStackablePanel"; chartSidePanelComponentRegistry - .add("odoo_line", { - configuration: OdooStackablePanel, - design: LineBarPieDesignPanel, - }) - .add("odoo_bar", { - configuration: OdooStackablePanel, - design: LineBarPieDesignPanel, - }) - .add("odoo_pie", { - configuration: OdooPanel, - design: LineBarPieDesignPanel, - }); + .add("odoo_line", { + configuration: OdooStackablePanel, + design: LineBarPieDesignPanel, + }) + .add("odoo_bar", { + configuration: OdooStackablePanel, + design: LineBarPieDesignPanel, + }) + .add("odoo_pie", { + configuration: OdooPanel, + design: LineBarPieDesignPanel, + }); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml index 5b15b9e1..45549754 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml @@ -3,146 +3,122 @@

- - + +
- - - + +
Pivot name
- + class="o_spreadsheet_oca_datasource_panel_field_title" + >Pivot name
+
-
Model
+
Model
()
+ t-esc="props.pivotDefinition.model" + />)
-
Domain
+
Domain
+ resModel="props.pivotDefinition.model" + domain="domain" + t-key="'pivot_' + props.pivotId" + />
Dimensions
- + class="o_spreadsheet_oca_datasource_panel_field_title" + >Dimensions
+
+ class="o_spreadsheet_oca_datasource_panel_field" + t-if="props.pivotDefinition.sortedColumn" + >
Sorting
+ class="o_spreadsheet_oca_datasource_panel_field_title" + >Sorting
Measures
+ class="o_spreadsheet_oca_datasource_panel_field_title" + >Measures
+ t-foreach="props.pivotDefinition.measures" + t-as="measure" + t-key="measure" + >
Last updated at
-
+
+ t-on-click="insertPivot" + class="btn btn-info" + >Insert pivot - + t-on-click="insertDynamicPivot" + class="btn btn-success" + >Insert dynamic pivot +
-
- - +
List name
- + class="o_spreadsheet_oca_datasource_panel_field_title" + >List name
+
-
Model
+
Model
()
+ t-esc="props.listDefinition.model" + />)
-
Domain
+
Domain
+ resModel="props.listDefinition.model" + domain="domain" + t-key="'list_' + props.listId" + /> @@ -150,48 +126,45 @@
Last updated at
-
+
+ t-on-click="() => this.delete()" + class="btn btn-danger" + >Delete
-
+ t-foreach="env.model.getters.getGlobalFilters()" + t-as="filter" + t-key="filter.id" + class="o_spreadsheet_oca_filter" + >
+ class="fa fa-cog btn btn-link text-muted spreadsheet_oca_filter_value_edit" + t-on-click="() => this.onEditFilter(filter)" + />
+ t-on-click="() => this.onAddFilter('date')" + class="btn" + >Add date + t-on-click="() => this.onAddFilter('relation')" + class="btn" + >Add relation + t-on-click="() => this.onAddFilter('text')" + class="btn" + >Add text
@@ -207,19 +180,15 @@
Time range
+ type="checkbox" + class="me-2" + id="default_to_current_period" + t-att-checked="state.defaultValue" + t-on-change="toggleDateDefaultValue" + /> + for="default_to_current_period" + > Automatically filter on the current period
+ class="pt-3" + t-if="state.defaultValue and state.type === 'date' and state.rangeType !== 'relative'" + >
+ t-if="state.type === 'date' and state.rangeType === 'relative'" + class="spreadsheet_oca_filter_value" + >
+ t-if="state.type === 'text'" + type="text" + class="o_input o_global_filter_default_value" + t-model="state.defaultValue" + />
Related model
+ value="state.modelName.label or ''" + models="models" + onModelSelected.bind="onModelSelected" + />
+ class="o_spreadsheet_oca_filter" + t-foreach="Object.values(state.objects)" + t-as="object" + t-key="object.id" + t-if="object.model" + >
-
-
+
+ path="object.fieldMatch.chain || ''" + resModel="object.model" + readonly="false" + allowEmpty="true" + isDebugMode="!!env.debug" + update="(name) => this.onFieldMatchUpdate(object, name)" + t-key="object_index" + />
-
+
+ type="text" + class="o_spreadsheet_oca_name" + title="Change name" + t-ref="spreadsheetName" + t-att-value="state.name" + t-on-change="_onNameChanged" + /> name is required + class="text-danger o_spreadsheet_oca_name_warning" + t-if="! state.name" + > name is required @@ -398,82 +352,79 @@ - +
+ t-if="collapsedBreadcrumbs.length || visiblePathBreadcrumbs.length" + class="o_breadcrumb d-flex flex-row flex-md-column align-self-stretch justify-content-between min-w-0" + > + t-set="previousBreadcrumb" + t-value="visiblePathBreadcrumbs.slice(-1)" + />
+ class="o_last_breadcrumb_item active d-flex gap-2 align-items-center min-w-0 lh-sm" + > + name="props.record.name" + isReadonly="false" + onChanged="onSpreadsheetNameChanged" + />
@@ -481,13 +432,13 @@
+ class="o_last_breadcrumb_item active d-flex fs-4 min-w-0 align-items-center" + > + name="props.record.name" + isReadonly="false" + onChanged="onSpreadsheetNameChanged" + />
@@ -530,39 +481,35 @@
+ class="o_control_panel d-flex flex-column gap-3 gap-lg-1 px-3 pt-2 pb-3" + t-ref="root" + data-command-category="actions" + >
+ class="o_control_panel_main d-flex flex-wrap flex-lg-nowrap justify-content-between align-items-lg-start gap-3 flex-grow-1" + >
+ class="o_control_panel_breadcrumbs d-flex align-items-center gap-1 order-0 h-lg-100" + >
+ class="o_control_panel_main_buttons d-flex gap-1 d-empty-none d-print-none" + t-ref="mainButtons" + t-on-keydown="onMainButtonsKeydown" + >
+ class="btn-group d-xl-none o_control_panel_collapsed_create" + > -
-
+
@@ -586,70 +531,68 @@ - + +
+ class="o_control_panel_actions d-empty-none d-flex align-items-center justify-content-start justify-content-lg-around order-2 order-lg-1 w-100 w-lg-auto" + >
+ class="o_control_panel_navigation d-flex flex-wrap flex-md-nowrap justify-content-end gap-3 gap-lg-1 gap-xl-3 order-1 order-lg-2 flex-grow-1" + > + class="'o_cp_switch_buttons d-xl-none btn-group'" + togglerClass="'btn btn-secondary'" + showCaret="true" + > - + t-set="activeView" + t-value="env.config.viewSwitcherEntries.find((view) => view.active)" + /> + + t-foreach="env.config.viewSwitcherEntries" + t-as="view" + t-key="view.type" + > + onSelected="() => this.onViewClicked(view.type)" + class="view.active ? 'selected' : ''" + >
+ t-name="spreadsheet_oca.OdooStackablePanel" + t-inherit="spreadsheet_oca.OdooPanel" + t-inherit-mode="primary" + owl="1" + >
@@ -691,10 +634,10 @@ + t-inherit="spreadsheet.o-spreadsheet-BarConfigPanel" + t-inherit-mode="extension" + owl="1" + >
Link to Odoo menu
@@ -705,10 +648,10 @@ + t-inherit="spreadsheet.o-spreadsheet-LineConfigPanel" + t-inherit-mode="extension" + owl="1" + >
Link to Odoo menu
@@ -719,10 +662,10 @@ + t-inherit="spreadsheet.o-spreadsheet-LineBarPieConfigPanel" + t-inherit-mode="extension" + owl="1" + >
Link to Odoo menu
@@ -733,10 +676,10 @@ + t-inherit="spreadsheet.o-spreadsheet-GaugeChartConfigPanel" + t-inherit-mode="extension" + owl="1" + >
Link to Odoo menu
@@ -747,10 +690,10 @@ + t-inherit="spreadsheet.o-spreadsheet-ScorecardChartConfigPanel" + t-inherit-mode="extension" + owl="1" + >
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 index b91f92d1..d14d7b36 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js @@ -1,294 +1,291 @@ /** @odoo-module **/ import * as spreadsheet from "@odoo/o-spreadsheet"; -import { - makeDynamicCols, - makeDynamicRows, -} from "../utils/dynamic_generators.esm"; -import { ListDataSource } from "@spreadsheet/list/list_data_source"; -import { PivotDataSource } from "@spreadsheet/pivot/pivot_data_source"; -import { SpreadsheetControlPanel } from "./spreadsheet_controlpanel.esm"; -import { SpreadsheetRenderer } from "./spreadsheet_renderer.esm"; -import { registry } from "@web/core/registry"; -import { useService } from "@web/core/utils/hooks"; +import {makeDynamicCols, makeDynamicRows} from "../utils/dynamic_generators.esm"; +import {ListDataSource} from "@spreadsheet/list/list_data_source"; +import {PivotDataSource} from "@spreadsheet/pivot/pivot_data_source"; +import {SpreadsheetControlPanel} from "./spreadsheet_controlpanel.esm"; +import {SpreadsheetRenderer} from "./spreadsheet_renderer.esm"; +import {registry} from "@web/core/registry"; +import {useService} from "@web/core/utils/hooks"; const uuidGenerator = new spreadsheet.helpers.UuidGenerator(); const actionRegistry = registry.category("actions"); -const { Component, onMounted, onWillStart, useSubEnv } = owl; +const {Component, onMounted, onWillStart, useSubEnv} = owl; export class ActionSpreadsheetOca extends Component { - setup() { - this.router = useService("router"); - this.orm = useService("orm"); - this.notification = useService("notification"); - const params = this.props.action.params || this.props.action.context.params; - this.spreadsheetId = params.spreadsheet_id; - this.model = params.model || "spreadsheet.spreadsheet"; - this.import_data = params.import_data || {}; - onMounted(() => { - this.router.pushState({ - spreadsheet_id: this.spreadsheetId, - model: this.model, - }); - }); - onWillStart(async () => { - // We need to load in case the data comes from an XLSX - this.record = - spreadsheet.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; + setup() { + this.router = useService("router"); + this.orm = useService("orm"); + this.notification = useService("notification"); + const params = this.props.action.params || this.props.action.context.params; + this.spreadsheetId = params.spreadsheet_id; + this.model = params.model || "spreadsheet.spreadsheet"; + this.import_data = params.import_data || {}; + onMounted(() => { + this.router.pushState({ + spreadsheet_id: this.spreadsheetId, + model: this.model, + }); + }); + onWillStart(async () => { + // We need to load in case the data comes from an XLSX + this.record = + spreadsheet.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), + }); } - if (this.spreadsheetId) { - this.orm.call(this.model, "write", [this.spreadsheetId, data]); - } else { - this.spreadsheetId = await this.orm.call(this.model, "create", [data]); - this.router.pushState({ spreadsheet_id: this.spreadsheetId }); + notifyUser(notification) { + this.notification.add(notification.text, { + type: notification.type, + sticky: notification.sticky, + }); } - } - /** - * 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(); - var y = 0; - 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 definition = { - title: this.import_data.name, - type: "odoo_" + this.import_data.metaData.mode, - background: "#FFFFFF", - stacked: this.import_data.metaData.stacked, - metaData: this.import_data.metaData, - searchParams: this.cleanSearchParams(), - dataSourceId: dataSourceId, - legendPosition: "top", - verticalAxisPosition: "left", - }; - spreadsheet_model.dispatch("CREATE_CHART", { - sheetId, - id: dataSourceId, - position: { - x: 0, - y: y, - }, - definition, - }); - } - importCreateOrReuseSheet(spreadsheet_model) { - var sheetId = spreadsheet_model.getters.getActiveSheetId(); - var row = 0; - 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) { - row = spreadsheet_model.getters.getNumberRows(sheetId); - var maxcols = spreadsheet_model.getters.getNumberCols(sheetId); - var filled = false; - while (row >= 0) { - for (var col = maxcols; col >= 0; col--) { - if ( - spreadsheet_model.getters.getCell(sheetId, col, row) !== - undefined && - !spreadsheet_model.getters.getCell(sheetId, col, row).isEmpty() - ) { - filled = true; - break; - } + async saveRecord(data) { + if (this.record.mode === "readonly") { + return; } - if (filled) { - break; + if (this.spreadsheetId) { + this.orm.call(this.model, "write", [this.spreadsheetId, data]); + } else { + this.spreadsheetId = await this.orm.call(this.model, "create", [data]); + this.router.pushState({spreadsheet_id: this.spreadsheetId}); } - row -= 1; - } - row += 1; } - return { sheetId, row }; - } - async importDataList(spreadsheet_model) { - var { sheetId, row } = this.importCreateOrReuseSheet(spreadsheet_model); - const dataSourceId = uuidGenerator.uuidv4(); - var 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: this.import_data.metaData.domain, - context: this.import_data.metaData.context, - orderBy: this.import_data.metaData.orderBy, - }, - name: this.import_data.name, - }; - const dataSource = spreadsheet_model.config.custom.dataSources.add( - dataSourceId, - ListDataSource, - list_info - ); - await dataSource.load(); - spreadsheet_model.dispatch("INSERT_ODOO_LIST", { - sheetId, - col: 0, - row: row, - id: spreadsheet_model.getters.getNextListId(), - dataSourceId, - definition: list_info, - linesNumber: this.import_data.dyn_number_of_rows, - columns: this.import_data.metaData.columns, - }); - const columns = []; - for (let col = 0; col < this.import_data.metaData.columns.length; col++) { - columns.push(col); - } - spreadsheet_model.dispatch("AUTORESIZE_COLUMNS", { - sheetId, - cols: columns, - }); - } - async importDataPivot(spreadsheet_model) { - var { sheetId, row } = this.importCreateOrReuseSheet(spreadsheet_model); - const dataSourceId = uuidGenerator.uuidv4(); - 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 = { - metaData: { - colGroupBys, - rowGroupBys, - activeMeasures: this.import_data.metaData.activeMeasures, - resModel: this.import_data.metaData.resModel, - sortedColumn: this.import_data.metaData.sortedColumn, - }, - searchParams: this.cleanSearchParams(), - name: this.import_data.name, - }; - const dataSource = spreadsheet_model.config.custom.dataSources.add( - dataSourceId, - PivotDataSource, - pivot_info - ); - await dataSource.load(); - var { cols, rows, measures } = dataSource.getTableStructure().export(); - if (this.import_data.dyn_number_of_rows) { - const indentations = rows.map((r) => r.indent); - const max_indentation = Math.max(...indentations); - rows = makeDynamicRows( - rowGroupBys, - this.import_data.dyn_number_of_rows, - 1, - max_indentation - ); + /** + * 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}; } - if (this.import_data.dyn_number_of_cols) { - cols = makeDynamicCols( - colGroupBys, - this.import_data.dyn_number_of_cols, - this.import_data.metaData.activeMeasures - ); + async importDataGraph(spreadsheet_model) { + var sheetId = spreadsheet_model.getters.getActiveSheetId(); + var y = 0; + 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 definition = { + title: this.import_data.name, + type: "odoo_" + this.import_data.metaData.mode, + background: "#FFFFFF", + stacked: this.import_data.metaData.stacked, + metaData: this.import_data.metaData, + searchParams: this.cleanSearchParams(), + dataSourceId: dataSourceId, + legendPosition: "top", + verticalAxisPosition: "left", + }; + spreadsheet_model.dispatch("CREATE_CHART", { + sheetId, + id: dataSourceId, + position: { + x: 0, + y: y, + }, + definition, + }); } - const table = { - cols, - rows, - measures, - }; - spreadsheet_model.dispatch("INSERT_PIVOT", { - sheetId, - col: 0, - row: row, - id: spreadsheet_model.getters.getNextPivotId(), - table, - dataSourceId, - definition: pivot_info, - }); - const columns = []; - for (let col = 0; col < table.cols[table.cols.length - 1].length; col++) { - columns.push(col); + importCreateOrReuseSheet(spreadsheet_model) { + var sheetId = spreadsheet_model.getters.getActiveSheetId(); + var row = 0; + 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) { + row = spreadsheet_model.getters.getNumberRows(sheetId); + var maxcols = spreadsheet_model.getters.getNumberCols(sheetId); + var filled = false; + while (row >= 0) { + for (var col = maxcols; col >= 0; col--) { + if ( + spreadsheet_model.getters.getCell(sheetId, col, row) !== + undefined && + !spreadsheet_model.getters.getCell(sheetId, col, row).isEmpty() + ) { + filled = true; + break; + } + } + if (filled) { + break; + } + row -= 1; + } + row += 1; + } + return {sheetId, row}; } - spreadsheet_model.dispatch("AUTORESIZE_COLUMNS", { - sheetId, - cols: columns, - }); - } - async importData(spreadsheet_model) { - if (this.import_data.mode === "pivot") { - await this.importDataPivot(spreadsheet_model); + async importDataList(spreadsheet_model) { + var {sheetId, row} = this.importCreateOrReuseSheet(spreadsheet_model); + const dataSourceId = uuidGenerator.uuidv4(); + var 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: this.import_data.metaData.domain, + context: this.import_data.metaData.context, + orderBy: this.import_data.metaData.orderBy, + }, + name: this.import_data.name, + }; + const dataSource = spreadsheet_model.config.custom.dataSources.add( + dataSourceId, + ListDataSource, + list_info + ); + await dataSource.load(); + spreadsheet_model.dispatch("INSERT_ODOO_LIST", { + sheetId, + col: 0, + row: row, + id: spreadsheet_model.getters.getNextListId(), + dataSourceId, + definition: list_info, + linesNumber: this.import_data.dyn_number_of_rows, + columns: this.import_data.metaData.columns, + }); + const columns = []; + for (let col = 0; col < this.import_data.metaData.columns.length; col++) { + columns.push(col); + } + spreadsheet_model.dispatch("AUTORESIZE_COLUMNS", { + sheetId, + cols: columns, + }); } - if (this.import_data.mode === "graph") { - await this.importDataGraph(spreadsheet_model); + async importDataPivot(spreadsheet_model) { + var {sheetId, row} = this.importCreateOrReuseSheet(spreadsheet_model); + const dataSourceId = uuidGenerator.uuidv4(); + 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 = { + metaData: { + colGroupBys, + rowGroupBys, + activeMeasures: this.import_data.metaData.activeMeasures, + resModel: this.import_data.metaData.resModel, + sortedColumn: this.import_data.metaData.sortedColumn, + }, + searchParams: this.cleanSearchParams(), + name: this.import_data.name, + }; + const dataSource = spreadsheet_model.config.custom.dataSources.add( + dataSourceId, + PivotDataSource, + pivot_info + ); + await dataSource.load(); + var {cols, rows, measures} = dataSource.getTableStructure().export(); + if (this.import_data.dyn_number_of_rows) { + const indentations = rows.map((r) => r.indent); + const max_indentation = Math.max(...indentations); + rows = makeDynamicRows( + rowGroupBys, + this.import_data.dyn_number_of_rows, + 1, + max_indentation + ); + } + if (this.import_data.dyn_number_of_cols) { + cols = makeDynamicCols( + colGroupBys, + this.import_data.dyn_number_of_cols, + this.import_data.metaData.activeMeasures + ); + } + const table = { + cols, + rows, + measures, + }; + spreadsheet_model.dispatch("INSERT_PIVOT", { + sheetId, + col: 0, + row: row, + id: spreadsheet_model.getters.getNextPivotId(), + table, + dataSourceId, + definition: pivot_info, + }); + const columns = []; + for (let col = 0; col < table.cols[table.cols.length - 1].length; col++) { + columns.push(col); + } + spreadsheet_model.dispatch("AUTORESIZE_COLUMNS", { + sheetId, + cols: columns, + }); } - if (this.import_data.mode === "list") { - await this.importDataList(spreadsheet_model); + 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, + SpreadsheetRenderer, + SpreadsheetControlPanel, }; actionRegistry.add("action_spreadsheet_oca", ActionSpreadsheetOca, { - force: true, + 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 index 37a92b5b..9a3cecd1 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js @@ -1,31 +1,31 @@ /** @odoo-module **/ -import { Component } from "@odoo/owl"; -import { ControlPanel } from "@web/search/control_panel/control_panel"; +import {Component} from "@odoo/owl"; +import {ControlPanel} from "@web/search/control_panel/control_panel"; -const { useState } = owl; +const {useState} = owl; export class SpreadsheetName extends Component { - setup() { - this.state = useState({ - name: this.props.name, - }); - } - _onNameChanged(ev) { - if (ev.target.value) { - this.env.saveRecord({ name: ev.target.value }); + setup() { + this.state = useState({ + name: this.props.name, + }); + } + _onNameChanged(ev) { + if (ev.target.value) { + this.env.saveRecord({name: ev.target.value}); + } + this.state.name = ev.target.value; } - this.state.name = ev.target.value; - } } SpreadsheetName.template = "spreadsheet_oca.SpreadsheetName"; export class SpreadsheetControlPanel extends ControlPanel {} SpreadsheetControlPanel.template = "spreadsheet_oca.SpreadsheetControlPanel"; SpreadsheetControlPanel.props = { - ...ControlPanel.props, - record: Object, + ...ControlPanel.props, + record: Object, }; SpreadsheetControlPanel.components = { - SpreadsheetName, + 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 index bf586890..1627274e 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js @@ -1,188 +1,185 @@ /** @odoo-module **/ import * as spreadsheet from "@odoo/o-spreadsheet"; -import { Component } from "@odoo/owl"; -import { ConfirmationDialog } from "@web/core/confirmation_dialog/confirmation_dialog"; -import { DataSources } from "@spreadsheet/data_sources/data_sources"; -import { Dialog } from "@web/core/dialog/dialog"; -import { Field } from "@web/views/fields/field"; -import { _t } from "@web/core/l10n/translation"; -import { loadSpreadsheetDependencies } from "@spreadsheet/assets_backend/helpers"; -import { migrate } from "@spreadsheet/o_spreadsheet/migration"; -import { useService } from "@web/core/utils/hooks"; -import { useSetupAction } from "@web/webclient/actions/action_hook"; -import { waitForDataLoaded } from "@spreadsheet/helpers/model"; -import { createDefaultCurrencyFormat } from "@spreadsheet/currency/helpers"; +import {Component} from "@odoo/owl"; +import {ConfirmationDialog} from "@web/core/confirmation_dialog/confirmation_dialog"; +import {DataSources} from "@spreadsheet/data_sources/data_sources"; +import {Dialog} from "@web/core/dialog/dialog"; +import {Field} from "@web/views/fields/field"; +import {_t} from "@web/core/l10n/translation"; +import {loadSpreadsheetDependencies} from "@spreadsheet/assets_backend/helpers"; +import {migrate} from "@spreadsheet/o_spreadsheet/migration"; +import {useService} from "@web/core/utils/hooks"; +import {useSetupAction} from "@web/webclient/actions/action_hook"; +import {waitForDataLoaded} from "@spreadsheet/helpers/model"; +import {createDefaultCurrencyFormat} from "@spreadsheet/currency/helpers"; -const { Spreadsheet, Model } = spreadsheet; -const { useSubEnv, onWillStart } = owl; +const {Spreadsheet, Model} = spreadsheet; +const {useSubEnv, onWillStart} = owl; 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.bus_service.addEventListener( - "notification", - this.onNotification.bind(this) - ); - this.listeners = []; - } - 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); + 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.bus_service.addEventListener( + "notification", + this.onNotification.bind(this) + ); + this.listeners = []; + } + 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); + } + } } - } } - } - sendMessage(message) { - this.orm.call(this.model, "send_spreadsheet_message", [ - [this.res_id], - message, - ]); - } - onNewMessage(id, callback) { - this.listeners.push({ id, callback }); - } - leave(id) { - this.listeners = this.listeners.filter((listener) => listener.id !== id); - } + sendMessage(message) { + this.orm.call(this.model, "send_spreadsheet_message", [[this.res_id], message]); + } + onNewMessage(id, callback) { + this.listeners.push({id, callback}); + } + leave(id) { + this.listeners = this.listeners.filter((listener) => listener.id !== id); + } } export class SpreadsheetRenderer extends Component { - 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, + 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.bus_service = this.env.services.bus_service; - this.user = useService("user"); - this.ui = useService("ui"); - this.action = useService("action"); - this.dialog = useService("dialog"); - const dataSources = new DataSources(this.env); - this.confirmDialog = this.closeDialog; - this.loadCurrencies = this.getCurrencies(); - this.loadLocales = this.getLocales(); - const defaultCurrency = this.props.record.default_currency; - const defaultCurrencyFormat = defaultCurrency - ? createDefaultCurrencyFormat(defaultCurrency) - : undefined; - this.spreadsheet_model = new Model( - migrate(this.props.record.spreadsheet_raw), - { - custom: { env: this.env, orm: this.orm, dataSources }, - defaultCurrencyFormat, - external: { - loadCurrencies: this.loadCurrencies, - loadLocales: this.loadLocales, - }, - transportService: new SpreadsheetTransportService( - this.orm, - this.bus_service, - this.props.model, - this.props.res_id - ), - client: { - id: uuidGenerator.uuidv4(), - name: this.user.name, - }, - mode: this.props.record.mode, - }, - this.props.record.revisions - ); - useSubEnv({ - saveSpreadsheet: this.onSpreadsheetSaved.bind(this), - askConfirmation: this.askConfirmation.bind(this), - downloadAsXLXS: this.downloadAsXLXS.bind(this), - }); - onWillStart(async () => { - await loadSpreadsheetDependencies(); - await dataSources.waitForAllLoaded(); - await this.env.importData(this.spreadsheet_model); - }); - useSetupAction({ - beforeLeave: () => this.onSpreadsheetSaved(), - }); - dataSources.addEventListener("data-source-updated", () => { - const sheetId = this.spreadsheet_model.getters.getActiveSheetId(); - this.spreadsheet_model.dispatch("EVALUATE_CELLS", { sheetId }); - }); - } - onSpreadsheetSaved() { - const data = this.spreadsheet_model.exportData(); - this.env.saveRecord({ spreadsheet_raw: data }); - this.spreadsheet_model.leaveSession(); - } - askConfirmation(content, confirm) { - this.dialog.add(ConfirmationDialog, { - title: _t("Odoo Spreadsheet"), - body: content, - confirm, - confirmLabel: _t("Confirm"), - }); - } - 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(); - } + } + setup() { + this.orm = useService("orm"); + this.bus_service = this.env.services.bus_service; + this.user = useService("user"); + this.ui = useService("ui"); + this.action = useService("action"); + this.dialog = useService("dialog"); + const dataSources = new DataSources(this.env); + this.confirmDialog = this.closeDialog; + this.loadCurrencies = this.getCurrencies(); + this.loadLocales = this.getLocales(); + const defaultCurrency = this.props.record.default_currency; + const defaultCurrencyFormat = defaultCurrency + ? createDefaultCurrencyFormat(defaultCurrency) + : undefined; + this.spreadsheet_model = new Model( + migrate(this.props.record.spreadsheet_raw), + { + custom: {env: this.env, orm: this.orm, dataSources}, + defaultCurrencyFormat, + external: { + loadCurrencies: this.loadCurrencies, + loadLocales: this.loadLocales, + }, + transportService: new SpreadsheetTransportService( + this.orm, + this.bus_service, + this.props.model, + this.props.res_id + ), + client: { + id: uuidGenerator.uuidv4(), + name: this.user.name, + }, + mode: this.props.record.mode, + }, + this.props.record.revisions + ); + useSubEnv({ + saveSpreadsheet: this.onSpreadsheetSaved.bind(this), + askConfirmation: this.askConfirmation.bind(this), + downloadAsXLXS: this.downloadAsXLXS.bind(this), + }); + onWillStart(async () => { + await loadSpreadsheetDependencies(); + await dataSources.waitForAllLoaded(); + await this.env.importData(this.spreadsheet_model); + }); + useSetupAction({ + beforeLeave: () => this.onSpreadsheetSaved(), + }); + dataSources.addEventListener("data-source-updated", () => { + const sheetId = this.spreadsheet_model.getters.getActiveSheetId(); + this.spreadsheet_model.dispatch("EVALUATE_CELLS", {sheetId}); + }); + } + onSpreadsheetSaved() { + const data = this.spreadsheet_model.exportData(); + this.env.saveRecord({spreadsheet_raw: data}); + this.spreadsheet_model.leaveSession(); + } + askConfirmation(content, confirm) { + this.dialog.add(ConfirmationDialog, { + title: _t("Odoo Spreadsheet"), + body: content, + confirm, + confirmLabel: _t("Confirm"), + }); + } + 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 = { - Spreadsheet, - Field, - Dialog, + Spreadsheet, + Field, + Dialog, }; SpreadsheetRenderer.props = { - record: Object, - res_id: { type: Number, optional: true }, - model: String, - importData: { type: Function, optional: true }, + record: Object, + res_id: {type: Number, optional: true}, + model: String, + importData: {type: Function, optional: true}, }; diff --git a/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js b/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js index e0de39dc..fac9eeaa 100644 --- a/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js @@ -1,23 +1,25 @@ /** @odoo-module **/ -import { GraphRenderer } from "@web/views/graph/graph_renderer"; +import {GraphRenderer} from "@web/views/graph/graph_renderer"; -import { patch } from "@web/core/utils/patch"; +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)), - }, - }, - } - ); - }, + 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 index 553bae42..37b6e49a 100644 --- a/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml +++ b/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml @@ -3,13 +3,12 @@ diff --git a/spreadsheet_oca/views/spreadsheet_spreadsheet.xml b/spreadsheet_oca/views/spreadsheet_spreadsheet.xml index 56571699..52e7d30f 100644 --- a/spreadsheet_oca/views/spreadsheet_spreadsheet.xml +++ b/spreadsheet_oca/views/spreadsheet_spreadsheet.xml @@ -2,58 +2,45 @@ - - spreadsheet.spreadsheet.search (in spreadsheet_oca) + spreadsheet.spreadsheet.search (in spreadsheet_oca) spreadsheet.spreadsheet - - - + - spreadsheet.spreadsheet.tree (in spreadsheet_oca) + spreadsheet.spreadsheet.tree (in spreadsheet_oca) spreadsheet.spreadsheet

@@ -62,33 +49,27 @@ + name="company_id" + groups="base.group_multi_company" + /> + - + name="contributor_group_ids" + widget="many2many_tags" + /> - + + name="spreadsheet_binary_data" + filename="filename" + groups="base.group_no_one" + /> @@ -97,10 +78,7 @@ - + Spreadsheets spreadsheet.spreadsheet tree,form @@ -111,14 +89,8 @@ Spreadsheets - spreadsheet_oca,static/description/icon.png - + spreadsheet_oca,static/description/icon.png + - diff --git a/spreadsheet_oca/wizards/spreadsheet_select_row_number.xml b/spreadsheet_oca/wizards/spreadsheet_select_row_number.xml index 8c1d060f..538c0756 100644 --- a/spreadsheet_oca/wizards/spreadsheet_select_row_number.xml +++ b/spreadsheet_oca/wizards/spreadsheet_select_row_number.xml @@ -1,6 +1,5 @@ - spreadsheet.select.row.number.form spreadsheet.select.row.number @@ -9,23 +8,16 @@ - + - + name="dynamic_cols" + invisible='not can_have_dynamic_cols' + /> + - diff --git a/spreadsheet_oca/wizards/spreadsheet_spreadsheet_import.xml b/spreadsheet_oca/wizards/spreadsheet_spreadsheet_import.xml index 1f4fdf9c..a89c78ed 100644 --- a/spreadsheet_oca/wizards/spreadsheet_spreadsheet_import.xml +++ b/spreadsheet_oca/wizards/spreadsheet_spreadsheet_import.xml @@ -2,11 +2,10 @@ - spreadsheet.spreadsheet.import.form (in spreadsheet_oca) + name="name" + >spreadsheet.spreadsheet.import.form (in spreadsheet_oca) spreadsheet.spreadsheet.import
@@ -14,73 +13,67 @@ + name="name" + invisible="mode != 'new'" + required="mode == 'new'" + /> + name="spreadsheet_id" + domain="['|', ('owner_id', '=', uid), ('contributor_ids', '=', uid)]" + invisible="mode not in ['add', 'add_sheet']" + required="mode in ['add', 'add_sheet']" + options="{'no_create': True}" + /> + name="dynamic" + force_save="1" + invisible='not can_be_dynamic' + readonly='is_tree' + /> + name="number_of_rows" + invisible='not dynamic' + required='dynamic' + /> + name="dynamic_cols" + force_save="1" + invisible='not can_have_dynamic_cols or is_tree' + /> + name="number_of_cols" + invisible='not dynamic_cols' + required='dynamic_cols' + />
+ model="ir.actions.act_window" + id="spreadsheet_spreadsheet_import_act_window" + > Import Pivot spreadsheet.spreadsheet.import form {} new - -
From 4a9b5b931b7cea435c39792150e8f3d8ada091de Mon Sep 17 00:00:00 2001 From: Chris Mann Date: Wed, 24 Sep 2025 14:16:26 +0100 Subject: [PATCH 072/100] [MIG] spreadsheet_oca: Migration to 18.0 --- spreadsheet_oca/README.rst | 116 +++++----- spreadsheet_oca/__manifest__.py | 27 +-- spreadsheet_oca/i18n/spreadsheet_oca.pot | 155 ++++++------- .../migrations/17.0.1.0.0/pre-migrate.py | 17 -- spreadsheet_oca/models/ir_websocket.py | 2 +- .../models/spreadsheet_abstract.py | 48 +++- spreadsheet_oca/static/description/index.html | 18 +- .../static/src/pivot/pivot_table.esm.js | 3 +- .../src/spreadsheet/bundle/chart_panel.esm.js | 2 - .../spreadsheet/bundle/chart_panels.esm.js | 33 ++- .../src/spreadsheet/bundle/filter.esm.js | 72 ++++-- .../bundle/filter_panel_datasources.esm.js | 205 ++++++++---------- .../bundle/image_file_store.esm.js | 33 +++ .../src/spreadsheet/bundle/odoo_panels.esm.js | 81 ++++++- .../src/spreadsheet/bundle/spreadsheet.xml | 99 +++------ .../bundle/spreadsheet_action.esm.js | 200 ++++++++--------- .../bundle/spreadsheet_controlpanel.esm.js | 25 ++- .../bundle/spreadsheet_renderer.esm.js | 122 +++++++---- .../src/spreadsheet/graph_controller.esm.js | 1 - .../src/spreadsheet/graph_controller.xml | 7 +- .../src/spreadsheet/list_controller.esm.js | 1 - .../src/spreadsheet/list_controller.xml | 15 +- .../src/spreadsheet/list_renderer.esm.js | 19 +- .../src/spreadsheet/pivot_controller.esm.js | 16 +- .../src/spreadsheet/pivot_controller.xml | 7 +- .../src/spreadsheet/spreadsheet_action.esm.js | 22 +- .../utils/dynamic_generators.esm.js | 3 +- .../spreadsheet_tree_view.esm.js | 2 - .../views/spreadsheet_spreadsheet.xml | 6 +- .../wizards/spreadsheet_spreadsheet_import.py | 2 +- .../spreadsheet_spreadsheet_import.xml | 8 +- 31 files changed, 754 insertions(+), 613 deletions(-) delete mode 100644 spreadsheet_oca/migrations/17.0.1.0.0/pre-migrate.py create mode 100644 spreadsheet_oca/static/src/spreadsheet/bundle/image_file_store.esm.js diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index 8ddb4f8f..36feb648 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/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 + =============== Spreadsheet Oca =============== @@ -7,13 +11,13 @@ Spreadsheet Oca !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:2e54effb5771467ddab39e872bcddddc5e7a900f7afb88dd3bb87ac26d195ca5 + !! source digest: sha256:f2aa2497f6ba0d9673ccfa43a29e783d6c88fab814cb86eb40a1c2754b0eefe3 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |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%2Fspreadsheet-lightgray.png?logo=github @@ -45,79 +49,79 @@ Usage **Create a new spreadsheet** ---------------------------- -- Go to 'Spreadsheet' menu -- Click on 'Create' -- Put a name, then click on the "Edit" button +- Go to 'Spreadsheet' menu +- Click on 'Create' +- Put a name, then click on the "Edit" button |image1| -- At this point you switch to spreadsheet editing mode. The editor is - named ``o-spreadsheet`` and looks like another common spreadsheet web - editors. (OnlyOffice, Ethercalc, Google Sheets (non-free)). +- At this point you switch to spreadsheet editing mode. The editor is + named ``o-spreadsheet`` and looks like another common spreadsheet web + editors. (OnlyOffice, Ethercalc, Google Sheets (non-free)). |image2| -- You can use common functions ``SUM()``, ``AVERAGE()``, etc. in the - cells. For a complete list of functions and their syntax, Refer to - the documentation https://github.com/odoo/o-spreadsheet/ or go to - https://odoo.github.io/o-spreadsheet/ and click on "Insert > - Function". +- You can use common functions ``SUM()``, ``AVERAGE()``, etc. in the + cells. For a complete list of functions and their syntax, Refer to the + documentation https://github.com/odoo/o-spreadsheet/ or go to + https://odoo.github.io/o-spreadsheet/ and click on "Insert > + Function". |image3| -- Note: Business Odoo module can add "business functions". This is - currently the case for the accounting module, which adds the - following features: - - - ``ODOO.CREDIT(account_codes, date_range)``: Get the total - credit for the specified account(s) and period. - - ``ODOO.DEBIT(account_codes, date_range)``: Get the total debit - for the specified account(s) and period. - - ``ODOO.BALANCE(account_codes, date_range)``: Get the total - balance for the specified account(s) and period. - - ``ODOO.FISCALYEAR.START(day)``: Returns the starting date of - the fiscal year encompassing the provided date. - - ``ODOO.FISCALYEAR.END(day)``: Returns the ending date of the - fiscal year encompassing the provided date. - - ``ODOO.ACCOUNT.GROUP(type)``: Returns the account ids of a - given group where type should be a value of the - ``account_type`` field of ``account.account`` model. - (``income``, ``asset_receivable``, etc.) +- Note: Business Odoo module can add "business functions". This is + currently the case for the accounting module, which adds the following + features: + + - ``ODOO.CREDIT(account_codes, date_range)``: Get the total credit + for the specified account(s) and period. + - ``ODOO.DEBIT(account_codes, date_range)``: Get the total debit + for the specified account(s) and period. + - ``ODOO.BALANCE(account_codes, date_range)``: Get the total + balance for the specified account(s) and period. + - ``ODOO.FISCALYEAR.START(day)``: Returns the starting date of the + fiscal year encompassing the provided date. + - ``ODOO.FISCALYEAR.END(day)``: Returns the ending date of the + fiscal year encompassing the provided date. + - ``ODOO.ACCOUNT.GROUP(type)``: Returns the account ids of a given + group where type should be a value of the ``account_type`` field + of ``account.account`` model. (``income``, ``asset_receivable``, + etc.) **Create a new dynamic spreadsheet from pivot** ----------------------------------------------- -- Go to any pivot -- Press on insert button -- Select the dynamic rows or dynamic columns option and set a number of - rows/columns +- Go to any pivot +- Press on insert button +- Select the dynamic rows or dynamic columns option and set a number of + rows/columns A new table that will be updated with the actual or filtered values will be added. -- Note: When a pivot has multiple levels of aggrupations in the rows or - the columns, the number of rows/columns selected will be transfered - to each level. +- Note: When a pivot has multiple levels of aggrupations in the rows or + the columns, the number of rows/columns selected will be transfered to + each level. - Example: number of groups -> 2 number of rows -> 3 + Example: number of groups -> 2 number of rows -> 3 - - val1 + - val1 - - subval1.1 - - subval1.2 - - subval1.3 + - subval1.1 + - subval1.2 + - subval1.3 - - val2 + - val2 - - subval2.1 - - subval2.2 - - subval2.3 + - subval2.1 + - subval2.2 + - subval2.3 - - val3 + - val3 - - subval3.1 - - subval3.2 - - subval3.3 + - subval3.1 + - subval3.2 + - subval3.3 https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/Hhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/vhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/xhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/phttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ohttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ghttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/../static/description/spreadsheetdynamic_table.gif @@ -165,14 +169,14 @@ Authors Contributors ------------ -- Enric Tobella -- `Tecnativa `__: +- Enric Tobella +- `Tecnativa `__: - - Carlos Roca + - Carlos Roca -- `Open User Systems `__: +- `Open User Systems `__: - - Chris Mann + - Chris Mann Maintainers ----------- diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index 553f0364..f065bd7f 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "17.0.1.0.3", + "version": "18.0.1.0.0", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", @@ -25,28 +25,19 @@ "spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.xml", "spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss", "spreadsheet_oca/static/src/spreadsheet/spreadsheet_action.esm.js", - "spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js", - "spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js", "spreadsheet_oca/static/src/spreadsheet/list_controller.esm.js", "spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js", - ( - "after", - "web/static/src/views/graph/graph_controller.xml", - "spreadsheet_oca/static/src/spreadsheet/graph_controller.xml", - ), - ( - "after", - "web/static/src/views/list/list_controller.xml", - "spreadsheet_oca/static/src/spreadsheet/list_controller.xml", - ), - ( - "after", - "web/static/src/views/pivot/pivot_controller.xml", - "spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml", - ), + "spreadsheet_oca/static/src/spreadsheet/list_controller.xml", + ], + "web.assets_backend_lazy": [ + "spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js", + "spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js", + "spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml", + "spreadsheet_oca/static/src/spreadsheet/graph_controller.xml", ], "spreadsheet.o_spreadsheet": [ "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml", + "spreadsheet_oca/static/src/spreadsheet/bundle/image_file_store.esm.js", "spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js", "spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js", "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js", diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index a961e6cc..a644d9ee 100644 --- a/spreadsheet_oca/i18n/spreadsheet_oca.pot +++ b/spreadsheet_oca/i18n/spreadsheet_oca.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 17.0\n" +"Project-Id-Version: Odoo Server 18.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -16,14 +16,12 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Add date" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Add relation" msgstr "" @@ -35,61 +33,58 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Add text" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 -#, python-format msgid "Add to spreadesheet" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml:0 -#: code:addons/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml:0 #: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 #: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 #: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml:0 #: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add -#, python-format msgid "Add to spreadsheet" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -#, python-format msgid "After next" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -#, python-format msgid "Are you sure you want to delete this list?" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -#, python-format msgid "Are you sure you want to delete this pivot?" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Area" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Automatically filter on the current period" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -#, python-format msgid "Before Previous" msgstr "" @@ -108,14 +103,12 @@ msgstr "" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view -#, python-format msgid "Cancel" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Change name" msgstr "" @@ -130,6 +123,12 @@ msgstr "" msgid "Code" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Column" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -143,15 +142,7 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 -#, python-format -msgid "Comparisons in pivot are not supprted" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 -#, python-format -msgid "Confirm" +msgid "Comparisons in pivot are not supported" msgstr "" #. module: spreadsheet_oca @@ -190,7 +181,6 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 -#, python-format msgid "Currency" msgstr "" @@ -202,22 +192,18 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Default value" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Delete" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Dimensions" msgstr "" @@ -233,23 +219,19 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Domain" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -#, python-format msgid "Download XLSX" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 -#, python-format -msgid "Duplicated groupbys in pivot are not supprted" +msgid "Duplicated groupbys in pivot are not supported" msgstr "" #. module: spreadsheet_oca @@ -277,15 +259,12 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Edit domain" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -#, python-format msgid "File" msgstr "" @@ -297,14 +276,12 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -#, python-format msgid "Filters" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -#, python-format msgid "From / To" msgstr "" @@ -352,14 +329,18 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Insert dynamic pivot" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format +msgid "Insert list" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Insert pivot" msgstr "" @@ -371,7 +352,6 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Label" msgstr "" @@ -396,27 +376,24 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Last updated at" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Line" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Link to Odoo menu" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "List name" msgstr "" @@ -428,7 +405,6 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Measures" msgstr "" @@ -436,7 +412,6 @@ msgstr "" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -#, python-format msgid "Menu Items" msgstr "" @@ -448,23 +423,19 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__model -#, python-format msgid "Model" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Month" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -#, python-format msgid "Month / Quarter" msgstr "" @@ -480,7 +451,6 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -#, python-format msgid "Next" msgstr "" @@ -511,35 +481,31 @@ msgid "OK" msgstr "" #. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 -#, python-format -msgid "Odoo Spreadsheet" +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__owner_id +msgid "Owner" msgstr "" #. module: spreadsheet_oca -#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__owner_id -msgid "Owner" +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Pie" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Pivot name" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -#, python-format msgid "Previous" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Quarter" msgstr "" @@ -561,28 +527,24 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -#, python-format msgid "Refresh all data" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Related model" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -#, python-format msgid "Relative Period" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Remove" msgstr "" @@ -591,11 +553,16 @@ msgstr "" msgid "Res" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Rows:" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Save" msgstr "" @@ -604,13 +571,6 @@ msgstr "" msgid "Select number of rows to duplicate row" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -#, python-format -msgid "Select the quantity of rows" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__sequence msgid "Sequence" @@ -624,21 +584,18 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -#, python-format msgid "Settings" msgstr "" #. module: spreadsheet_oca #. odoo-python #: code:addons/spreadsheet_oca/models/spreadsheet_abstract.py:0 -#, python-format msgid "Sheet1" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Sorting" msgstr "" @@ -686,10 +643,27 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Stacked" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Area" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Column" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Line" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols msgid "" @@ -707,17 +681,21 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Time range" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Toggle Dropdown" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Total rows used when inserting list" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type msgid "Type" @@ -726,21 +704,18 @@ msgstr "" #. module: spreadsheet_oca #. odoo-python #: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 -#, python-format msgid "Unnamed" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.xml:0 -#, python-format msgid "Upload" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.esm.js:0 -#, python-format msgid "Upload a Spreadsheet" msgstr "" @@ -757,36 +732,30 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "Year" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -#, python-format msgid "ascending" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -#, python-format msgid "descending" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -#, python-format msgid "name is required" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -#, python-format msgid "not updated" msgstr "" diff --git a/spreadsheet_oca/migrations/17.0.1.0.0/pre-migrate.py b/spreadsheet_oca/migrations/17.0.1.0.0/pre-migrate.py deleted file mode 100644 index 8e329591..00000000 --- a/spreadsheet_oca/migrations/17.0.1.0.0/pre-migrate.py +++ /dev/null @@ -1,17 +0,0 @@ -from openupgradelib import openupgrade - - -@openupgrade.migrate() -def migrate(env, version): - # Renamed field data to spreadsheet_binary_data in V17 - openupgrade.rename_fields( - env, - [ - ( - "spreadsheet.spreadsheet", - "spreadsheet_spreadsheet", - "data", - "spreadsheet_binary_data", - ), - ], - ) diff --git a/spreadsheet_oca/models/ir_websocket.py b/spreadsheet_oca/models/ir_websocket.py index 1987b564..005f41c5 100644 --- a/spreadsheet_oca/models/ir_websocket.py +++ b/spreadsheet_oca/models/ir_websocket.py @@ -58,9 +58,9 @@ def _build_bus_channel_list(self, channels): channels.append( ( self.env.registry.db_name, - "spreadsheet_oca", model_name, res_id, + "spreadsheet_oca", ) ) return super()._build_bus_channel_list(channels) diff --git a/spreadsheet_oca/models/spreadsheet_abstract.py b/spreadsheet_oca/models/spreadsheet_abstract.py index 0e1280b5..c43be6bb 100644 --- a/spreadsheet_oca/models/spreadsheet_abstract.py +++ b/spreadsheet_oca/models/spreadsheet_abstract.py @@ -3,14 +3,18 @@ import base64 import json +from typing import Any from odoo import _, api, fields, models from odoo.exceptions import AccessError +CollaborationMessage = dict[str, Any] + class SpreadsheetAbstract(models.AbstractModel): _name = "spreadsheet.abstract" _description = "Spreadsheet abstract for inheritance" + _inherit = ["bus.listener.mixin"] name = fields.Char(required=True) spreadsheet_binary_data = fields.Binary( @@ -76,8 +80,7 @@ def get_spreadsheet_data(self): self.ensure_one() mode = "normal" try: - self.check_access_rights("write") - self.check_access_rule("write") + self.check_access("write") except AccessError: mode = "readonly" return { @@ -106,11 +109,31 @@ def open_spreadsheet(self): "params": {"spreadsheet_id": self.id, "model": self._name}, } - def send_spreadsheet_message(self, message): + def send_spreadsheet_message( + self, message: CollaborationMessage, access_token=None + ): self.ensure_one() - channel = (self.env.cr.dbname, "spreadsheet_oca", self._name, self.id) - message.update({"res_model": self._name, "res_id": self.id}) if message["type"] in ["REVISION_UNDONE", "REMOTE_REVISION", "REVISION_REDONE"]: + self._check_access_spreadsheet("write") + self.env["spreadsheet.oca.revision"].create( + { + "model": self._name, + "res_id": self.id, + "type": message["type"], + "client_id": message.get("clientId"), + "next_revision_id": message["nextRevisionId"], + "server_revision_id": message["serverRevisionId"], + "commands": json.dumps( + self._build_spreadsheet_revision_commands_data(message) + ), + } + ) + self._bus_send( + "notification", dict(message, id=self.id), subchannel="spreadsheet_oca" + ) + return True + elif message["type"] == "SNAPSHOT": + self._check_access_spreadsheet("write") self.env["spreadsheet.oca.revision"].create( { "model": self._name, @@ -124,7 +147,20 @@ def send_spreadsheet_message(self, message): ), } ) - self.env["bus.bus"]._sendone(channel, "spreadsheet_oca", message) + return True + elif message["type"] in ["CLIENT_JOINED", "CLIENT_LEFT", "CLIENT_MOVED"]: + self._check_access_spreadsheet("read") + self._bus_send( + "notification", dict(message, id=self.id), subchannel="spreadsheet_oca" + ) + return True + return False + + def _check_access_spreadsheet(self, operation: str): + try: + self.check_access(operation) + except AccessError as e: + raise e return True @api.model diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html index 7bae2017..ca5fc8fe 100644 --- a/spreadsheet_oca/static/description/index.html +++ b/spreadsheet_oca/static/description/index.html @@ -372,9 +372,9 @@

Spreadsheet Oca

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

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

+

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

This module adds a functionality for adding and editing Spreadsheets using Odoo CE.

It is an alternative to the proprietary module spreadsheet_edition @@ -410,13 +410,13 @@

Create a new spreadsheet<
  • Click on ‘Create’
  • Put a name, then click on the “Edit” button
  • -

    image1

    +

    image1

    • At this point you switch to spreadsheet editing mode. The editor is named o-spreadsheet and looks like another common spreadsheet web editors. (OnlyOffice, Ethercalc, Google Sheets (non-free)).
    -

    image2

    +

    image2

    -

    image3

    +

    image3

    • Note: Business Odoo module can add “business functions”. This is currently the case for the accounting module, which adds the following @@ -487,8 +487,8 @@

      Create a new dynamic spre

    -

    https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/Hhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/vhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/xhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/phttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ohttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ghttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/ -https://raw.githubusercontent.com/OCA/spreadsheet/17.0/spreadsheet_oca/../static/description/spreadsheetdynamic_table.gif

    +

    https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/Hhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/vhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/xhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/phttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ohttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ghttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ +https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/../static/description/spreadsheetdynamic_table.gif

    @@ -511,7 +511,7 @@

    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.

    +feedback.

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

    @@ -545,7 +545,7 @@

    Maintainers

    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.

    +

    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_oca/static/src/pivot/pivot_table.esm.js b/spreadsheet_oca/static/src/pivot/pivot_table.esm.js index 3202d542..0ce658c8 100644 --- a/spreadsheet_oca/static/src/pivot/pivot_table.esm.js +++ b/spreadsheet_oca/static/src/pivot/pivot_table.esm.js @@ -1,7 +1,6 @@ -/** @odoo-module */ /* Copyright 2024 Tecnativa - Carlos Roca * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ -import {SpreadsheetPivotTable} from "@spreadsheet/pivot/pivot_table"; +import {SpreadsheetPivotTable} from "@odoo/o-spreadsheet"; import {patch} from "@web/core/utils/patch"; patch(SpreadsheetPivotTable.prototype, { diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js index a98cf157..b6a1d23b 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js @@ -1,5 +1,3 @@ -/** @odoo-module */ - import * as spreadsheet from "@odoo/o-spreadsheet"; import {patch} from "@web/core/utils/patch"; diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js index 8bda4972..e42f6706 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js @@ -1,15 +1,17 @@ -/** @odoo-module */ - import * as spreadsheet from "@odoo/o-spreadsheet"; import {Domain} from "@web/core/domain"; - import {Many2XAutocomplete} from "@web/views/fields/relational_utils"; +import {_t} from "@web/core/l10n/translation"; import {patch} from "@web/core/utils/patch"; import {useService} from "@web/core/utils/hooks"; -import {_t} from "@web/core/l10n/translation"; -const {LineBarPieConfigPanel, ScorecardChartConfigPanel, GaugeChartConfigPanel} = - spreadsheet.components; +const { + GenericChartConfigPanel, + LineConfigPanel, + BarConfigPanel, + ScorecardChartConfigPanel, + GaugeChartConfigPanel, +} = spreadsheet.components; const menuChartProps = { setup() { @@ -55,7 +57,6 @@ const menuChartProps = { return; } const menu = this.env.model.getters.getIrMenu(menuId[0].id); - console.log(menu); this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { chartId: this.props.figureId, odooMenuId: menu.xmlid || menu.id, @@ -77,9 +78,21 @@ const menuChartProps = { }, }; -patch(LineBarPieConfigPanel.prototype, menuChartProps); -LineBarPieConfigPanel.components = { - ...LineBarPieConfigPanel.components, +patch(GenericChartConfigPanel.prototype, menuChartProps); +GenericChartConfigPanel.components = { + ...GenericChartConfigPanel.components, + Many2XAutocomplete, +}; + +patch(LineConfigPanel.prototype, menuChartProps); +LineConfigPanel.components = { + ...LineConfigPanel.components, + Many2XAutocomplete, +}; + +patch(BarConfigPanel.prototype, menuChartProps); +BarConfigPanel.components = { + ...BarConfigPanel.components, Many2XAutocomplete, }; diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js index 7076f88f..a5fabc63 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js @@ -1,12 +1,12 @@ -/** @odoo-module **/ - import * as spreadsheet from "@odoo/o-spreadsheet"; import {Component, onWillStart, useState} from "@odoo/owl"; -import {_lt, _t} from "@web/core/l10n/translation"; + import {FilterValue} from "@spreadsheet/global_filters/components/filter_value/filter_value"; import {ModelFieldSelector} from "@web/core/model_field_selector/model_field_selector"; import {ModelSelector} from "@web/core/model_selector/model_selector"; import {RELATIVE_DATE_RANGE_TYPES} from "@spreadsheet/helpers/constants"; + +import {_t} from "@web/core/l10n/translation"; import {globalFiltersFieldMatchers} from "@spreadsheet/global_filters/plugins/global_filters_core_plugin"; import {useService} from "@web/core/utils/hooks"; @@ -123,10 +123,10 @@ export class EditFilterPanel extends Component { get dateOffset() { return [ {value: 0, name: ""}, - {value: -1, name: _lt("Previous")}, - {value: -2, name: _lt("Before Previous")}, - {value: 1, name: _lt("Next")}, - {value: 2, name: _lt("After next")}, + {value: -1, name: _t("Previous")}, + {value: -2, name: _t("Before Previous")}, + {value: 1, name: _t("Next")}, + {value: 2, name: _t("After next")}, ]; } onChangeFieldMatchOffset(object, ev) { @@ -144,8 +144,8 @@ export class EditFilterPanel extends Component { const action = this.props.filter.id ? "EDIT_GLOBAL_FILTER" : "ADD_GLOBAL_FILTER"; - this.env.openSidePanel("FilterPanel", {}); - var filter = { + + const filter = { id: this.props.filter.id || uuidGenerator.uuidv4(), type: this.state.type, label: this.state.label, @@ -153,17 +153,16 @@ export class EditFilterPanel extends Component { rangeType: this.state.rangeType, modelName: this.state.modelName.technical, }; - var filterMatching = {}; + const filterMatching = {}; Object.values(this.state.objects).forEach((object) => { filterMatching[object.type] = filterMatching[object.type] || {}; - filterMatching[object.type][object.objectId] = {...object.fieldMatch}; + const fieldMatch = object.fieldMatch ? {...object.fieldMatch} : {}; + filterMatching[object.type][object.objectId] = fieldMatch; }); this.env.model.dispatch(action, { - id: filter.id, filter, ...filterMatching, }); - this.env.openSidePanel("FilterPanel", {}); } onCancel() { @@ -177,13 +176,54 @@ export class EditFilterPanel extends Component { } this.env.openSidePanel("FilterPanel", {}); } - onFieldMatchUpdate(object, name) { - this.state.objects[object.id].fieldMatch.chain = name; - this.state.objects[object.id].fieldMatch.type = object.fields[name]?.type; + onFieldMatchUpdate(object, path, fieldInfo) { + if (!path) { + // Clear the field match if no path selected + this.state.objects[object.id].fieldMatch = {}; + return; + } + // Extract field definition from fieldInfo (V18> structure) + const fieldDef = + fieldInfo && fieldInfo.fieldDef ? fieldInfo.fieldDef : fieldInfo; + this.state.objects[object.id].fieldMatch = { + chain: path, + type: fieldDef?.type || "", + }; } toggleDateDefaultValue(ev) { this.state.defaultValue = ev.target.checked ? "this_month" : undefined; } + getModelField(fieldMatch) { + if (!fieldMatch || !fieldMatch.chain) { + return ""; + } + return fieldMatch.chain; + } + filterModelFieldSelectorField(field, path, coModel) { + if (!field.searchable) { + return false; + } + + // TODO: Define allowed field types based on filter type + const ALLOWED_FIELD_TYPES = [ + "char", + "text", + "selection", + "many2one", + "date", + "datetime", + ]; + + if (field.name === "id" && this.state.type === "relation") { + const paths = path.split("."); + const lastField = paths.at(-2); + if (!lastField || (lastField.relation && lastField.relation === coModel)) { + return true; + } + return false; + } + return ALLOWED_FIELD_TYPES.includes(field.type) || Boolean(field.relation); + } } EditFilterPanel.template = "spreadsheet_oca.EditFilterPanel"; diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js index 26844d77..0706956c 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js @@ -1,46 +1,30 @@ -/** @odoo-module **/ - import * as spreadsheet from "@odoo/o-spreadsheet"; -import {Component, onWillStart, onWillUpdateProps} from "@odoo/owl"; -import {makeDynamicCols, makeDynamicRows} from "../utils/dynamic_generators.esm"; +import {Component, onWillStart, onWillUpdateProps, useState} from "@odoo/owl"; import {Domain} from "@web/core/domain"; import {DomainSelector} from "@web/core/domain_selector/domain_selector"; import {DomainSelectorDialog} from "@web/core/domain_selector_dialog/domain_selector_dialog"; -import {FormViewDialog} from "@web/views/view_dialogs/form_view_dialog"; import {_t} from "@web/core/l10n/translation"; import {formatDate} from "@web/core/l10n/dates"; import {useService} from "@web/core/utils/hooks"; const {DateTime} = luxon; -const {sidePanelRegistry, topbarMenuRegistry} = spreadsheet.registries; +const {sidePanelRegistry, topbarMenuRegistry, pivotSidePanelRegistry} = + spreadsheet.registries; topbarMenuRegistry.addChild("data_sources", ["data"], (env) => { - let sequence = 100; - const children = env.model.getters.getPivotIds().map((pivotId, index) => ({ - id: `data_source_pivot_ ${pivotId}`, - name: env.model.getters.getPivotDisplayName(pivotId), - sequence: sequence++, - execute: (child_env) => { - child_env.model.dispatch("SELECT_PIVOT", { - pivotId: pivotId, - }); - child_env.openSidePanel("PivotPanel", {}); - }, - icon: "spreadsheet_oca.PivotIcon", - separator: index === env.model.getters.getPivotIds().length - 1, - })); + let sequence = 53; const lists = env.model.getters.getListIds().map((listId, index) => ({ id: `data_source_list_${listId}`, name: env.model.getters.getListDisplayName(listId), sequence: sequence++, execute: (child_env) => { child_env.model.dispatch("SELECT_ODOO_LIST", {listId: listId}); - child_env.openSidePanel("ListPanel", {}); + child_env.openSidePanel("ListPanel", {listId}); }, icon: "spreadsheet_oca.ListIcon", separator: index === env.model.getters.getListIds().length - 1, })); - return children.concat(lists).concat([ + return lists.concat([ { id: "refresh_all_data", name: _t("Refresh all data"), @@ -60,28 +44,32 @@ export class PivotPanelDisplay extends Component { onWillUpdateProps(this.modelData.bind(this)); } async modelData() { - this.PivotDataSource = await this.env.model.getters.getAsyncPivotDataSource( - this.props.pivotId - ); + this.PivotDataSource = this.env.model.getters.getPivot(this.props.pivotId); this.modelLabel = await this.PivotDataSource.getModelLabel(); } get domain() { return new Domain(this.props.pivotDefinition.domain).toString(); } get pivotDimensions() { - return [ - ...this.props.pivotDefinition.rowGroupBys, - ...this.props.pivotDefinition.colGroupBys, - ].map((fieldName) => this.PivotDataSource.getFormattedGroupBy(fieldName)); + const {rows = [], columns = []} = this.props.pivotDefinition; + return [...rows, ...columns].map((dim) => { + const label = dim.displayName || dim.fieldName; + return dim.granularity ? `${label} (${dim.granularity})` : label; + }); } get sortInformation() { const sortedColumn = this.props.pivotDefinition.sortedColumn; const orderTranslate = sortedColumn.order === "asc" ? _t("ascending") : _t("descending"); - const GroupByDisplayLabel = this.PivotDataSource.getMeasureDisplayName( - sortedColumn.measure - ); - return `${GroupByDisplayLabel} (${orderTranslate})`; + + let label = null; + if (sortedColumn.measure) { + const measure = this.PivotDataSource.getMeasure(sortedColumn.measure); + label = measure ? measure.displayName : sortedColumn.measure; + } else if (sortedColumn.groupBy) { + label = this.PivotDataSource.getFormattedGroupBy(sortedColumn.groupBy); + } + return `${label} (${orderTranslate})`; } get lastUpdate() { const lastUpdate = this.PivotDataSource.lastUpdate; @@ -106,84 +94,50 @@ export class PivotPanelDisplay extends Component { }); } async insertPivot() { - const datasourceModel = await this.env.model.getters - .getPivotDataSource(this.props.pivotId) - .copyModelWithOriginalDomain(); - const tableStructure = datasourceModel.getTableStructure().export(); - const selectedZone = this.env.model.getters.getSelectedZone(); - this.env.model.dispatch("RE_INSERT_PIVOT", { - id: this.props.pivotId, - col: selectedZone.left, - row: selectedZone.top, - sheetId: this.env.model.getters.getActiveSheetId(), - table: tableStructure, + const pivotId = this.props.pivotId; + const {type} = this.env.model.getters.getPivotCoreDefinition(pivotId); + const position = this.env.model.getters.getActivePosition(); + let table = null; + if (type === "ODOO") { + const dataSource = this.env.model.getters.getPivot(pivotId); + const model = await dataSource.copyModelWithOriginalDomain(); + table = model.getTableStructure().export(); + } else { + table = this.env.model.getters + .getPivot(pivotId) + .getTableStructure() + .export(); + } + this.env.model.dispatch("INSERT_PIVOT_WITH_TABLE", { + ...position, + pivotId, + table, + pivotMode: "static", }); - this.env.model.dispatch("REFRESH_PIVOT", {id: this.props.pivotId}); + this.env.model.dispatch("REFRESH_PIVOT", {id: pivotId}); } - async insertDynamicPivot() { - const datasourceModel = await this.env.model.getters - .getPivotDataSource(this.props.pivotId) - .copyModelWithOriginalDomain(); - var {cols, rows, measures} = datasourceModel.getTableStructure().export(); - const {dynamic_rows, number_of_rows, dynamic_cols, number_of_cols} = - await new Promise((resolve) => { - this.dialog.add( - FormViewDialog, - { - title: _t("Select the quantity of rows"), - resModel: "spreadsheet.select.row.number", - context: { - default_can_have_dynamic_cols: Boolean( - cols[0][0].fields.length - ), - }, - onRecordSaved: async (record) => { - resolve({ - dynamic_rows: record.data.dynamic_rows, - number_of_rows: record.data.number_of_rows, - dynamic_cols: record.data.dynamic_cols, - number_of_cols: record.data.number_of_cols, - }); - }, - }, - {onClose: () => resolve(false)} - ); - }); - if (!dynamic_rows && !dynamic_cols) { - return; - } - if (dynamic_rows) { - const indentations = rows.map((r) => r.indent); - const max_indentation = Math.max(...indentations); - rows = makeDynamicRows( - this.props.pivotDefinition.rowGroupBys, - number_of_rows, - 1, - max_indentation - ); + const pivotId = this.props.pivotId; + const {type} = this.env.model.getters.getPivotCoreDefinition(pivotId); + const position = this.env.model.getters.getActivePosition(); + let table = null; + if (type === "ODOO") { + const dataSource = this.env.model.getters.getPivot(this.props.pivotId); + const model = await dataSource.copyModelWithOriginalDomain(); + table = model.getTableStructure().export(); + } else { + table = this.env.model.getters + .getPivot(this.props.pivotId) + .getTableStructure() + .export(); } - if (dynamic_cols) { - cols = makeDynamicCols( - this.props.pivotDefinition.colGroupBys, - number_of_cols, - this.props.pivotDefinition.measures - ); - } - const table = { - cols, - rows, - measures, - }; - const selectedZone = this.env.model.getters.getSelectedZone(); - this.env.model.dispatch("RE_INSERT_PIVOT", { - id: this.props.pivotId, - col: selectedZone.left, - row: selectedZone.top, - sheetId: this.env.model.getters.getActiveSheetId(), + this.env.model.dispatch("INSERT_PIVOT_WITH_TABLE", { + ...position, + pivotId, table, + pivotMode: "dynamic", }); - this.env.model.dispatch("REFRESH_PIVOT", {id: this.props.pivotId}); + this.env.model.dispatch("REFRESH_PIVOT", {id: pivotId}); } delete() { this.env.askConfirmation( @@ -208,10 +162,14 @@ PivotPanelDisplay.properties = { export class PivotPanel extends Component { get pivotId() { - return this.env.model.getters.getSelectedPivotId(); + return this.props.pivotId; + } + get pivotType() { + return this.env.model.getters.getPivotCoreDefinition(this.pivotId).type; } get pivotDefinition() { - return this.env.model.getters.getPivotDefinition(this.pivotId); + const dataSource = this.env.model.getters.getPivot(this.pivotId); + return dataSource ? dataSource.definition || {} : {}; } } @@ -220,13 +178,13 @@ PivotPanel.components = { PivotPanelDisplay, }; -sidePanelRegistry.add("PivotPanel", { - title: "Pivot table information", - Body: PivotPanel, +pivotSidePanelRegistry.add("ODOO", { + editor: PivotPanel, }); export class ListPanelDisplay extends Component { setup() { + this.state = useState({listRows: undefined}); this.dialog = useService("dialog"); onWillStart(this.modelData.bind(this)); onWillUpdateProps(this.modelData.bind(this)); @@ -262,6 +220,26 @@ export class ListPanelDisplay extends Component { domain: new Domain(domain).toList(), }); } + async insertList() { + const listId = this.props.listId; + const zone = this.env.model.getters.getSelectedZone(); + const dataSource = await this.env.model.getters.getAsyncListDataSource(listId); + const totalRows = parseInt(this.state.listRows, 10) || dataSource.maxPosition; + const list = this.env.model.getters.getListDefinition(listId); + const sheetId = this.env.model.getters.getActiveSheetId(); + const columns = list.columns.map((name) => ({ + name, + type: dataSource.getField(name).type, + })); + this.env.model.dispatch("RE_INSERT_ODOO_LIST_WITH_TABLE", { + sheetId: sheetId, + col: zone.left, + row: zone.top, + id: listId, + linesNumber: totalRows, + columns: columns, + }); + } delete() { this.env.askConfirmation( _t("Are you sure you want to delete this list?"), @@ -269,6 +247,7 @@ export class ListPanelDisplay extends Component { this.env.model.dispatch("REMOVE_ODOO_LIST", { listId: this.props.listId, }); + this.env.openSidePanel("ListPanel", {}); } ); } @@ -278,17 +257,17 @@ ListPanelDisplay.template = "spreadsheet_oca.ListPanelDisplay"; ListPanelDisplay.components = { DomainSelector, }; -ListPanelDisplay.properties = { +ListPanelDisplay.props = { listId: String, listDefinition: Object, }; export class ListPanel extends Component { get listId() { - return this.env.model.getters.getSelectedListId(); + return this.props.listId; } get listDefinition() { - return this.env.model.getters.getListDefinition(this.listId); + return this.env.model.getters.getListDefinition(this.listId) || {}; } } diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/image_file_store.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/image_file_store.esm.js new file mode 100644 index 00000000..919524e8 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/image_file_store.esm.js @@ -0,0 +1,33 @@ +export class ImageFileStore { + constructor(resModel, resId, http, orm) { + this.resModel = resModel; + this.resId = resId; + this.http = http; + this.orm = orm; + } + + async upload(file) { + const route = "/web/binary/upload_attachment"; + const params = { + ufile: [file], + csrf_token: odoo.csrf_token, + model: this.resModel, + id: this.resId, + }; + const fileData = JSON.parse(await this.http.post(route, params, "text"))[0]; + const [accessToken] = await this.orm.call( + "ir.attachment", + "generate_access_token", + [fileData.id] + ); + return `/web/image/${fileData.id}?access_token=${accessToken}`; + } + + async delete(path) { + const attachmentId = path.split("/").pop(); + if (Number.isNaN(attachmentId)) { + throw new Error("Invalid path: " + path); + } + await this.orm.unlink("ir.attachment", [parseInt(attachmentId, 10)]); + } +} diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js index 92785576..dfbe770a 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js @@ -1,13 +1,12 @@ -/** @odoo-module */ - import * as spreadsheet from "@odoo/o-spreadsheet"; + import {Domain} from "@web/core/domain"; import {Many2XAutocomplete} from "@web/views/fields/relational_utils"; -import {useService} from "@web/core/utils/hooks"; import {_t} from "@web/core/l10n/translation"; +import {useService} from "@web/core/utils/hooks"; -const {chartSidePanelComponentRegistry} = spreadsheet.registries; -const {LineBarPieDesignPanel} = spreadsheet.components; +const {chartSidePanelComponentRegistry, chartSubtypeRegistry} = spreadsheet.registries; +const {PieChartDesignPanel} = spreadsheet.components; const {Component} = owl; export class OdooPanel extends Component { @@ -87,13 +86,79 @@ OdooStackablePanel.template = "spreadsheet_oca.OdooStackablePanel"; chartSidePanelComponentRegistry .add("odoo_line", { configuration: OdooStackablePanel, - design: LineBarPieDesignPanel, + design: PieChartDesignPanel, }) .add("odoo_bar", { configuration: OdooStackablePanel, - design: LineBarPieDesignPanel, + design: PieChartDesignPanel, }) .add("odoo_pie", { configuration: OdooPanel, - design: LineBarPieDesignPanel, + design: PieChartDesignPanel, }); + +chartSubtypeRegistry.add("odoo_line", { + matcher: (definition) => + definition.type === "odoo_line" && !definition.stacked && !definition.fillArea, + subtypeDefinition: {stacked: false, fillArea: false}, + displayName: _t("Line"), + chartSubtype: "odoo_line", + chartType: "odoo_line", + category: "line", + preview: "o-spreadsheet-ChartPreview.LINE_CHART", +}); +chartSubtypeRegistry.add("odoo_stacked_line", { + matcher: (definition) => + definition.type === "odoo_line" && definition.stacked && !definition.fillArea, + subtypeDefinition: {stacked: true, fillArea: false}, + displayName: _t("Stacked Line"), + chartSubtype: "odoo_stacked_line", + chartType: "odoo_line", + category: "line", + preview: "o-spreadsheet-ChartPreview.STACKED_LINE_CHART", +}); +chartSubtypeRegistry.add("odoo_area", { + matcher: (definition) => + definition.type === "odoo_line" && !definition.stacked && definition.fillArea, + subtypeDefinition: {stacked: false, fillArea: true}, + displayName: _t("Area"), + chartSubtype: "odoo_area", + chartType: "odoo_line", + category: "area", + preview: "o-spreadsheet-ChartPreview.AREA_CHART", +}); +chartSubtypeRegistry.add("odoo_stacked_area", { + matcher: (definition) => + definition.type === "odoo_line" && definition.stacked && definition.fillArea, + subtypeDefinition: {stacked: true, fillArea: true}, + displayName: _t("Stacked Area"), + chartSubtype: "odoo_stacked_area", + chartType: "odoo_line", + category: "area", + preview: "o-spreadsheet-ChartPreview.STACKED_AREA_CHART", +}); +chartSubtypeRegistry.add("odoo_bar", { + matcher: (definition) => definition.type === "odoo_bar" && !definition.stacked, + subtypeDefinition: {stacked: false}, + displayName: _t("Column"), + chartSubtype: "odoo_bar", + chartType: "odoo_bar", + category: "column", + preview: "o-spreadsheet-ChartPreview.COLUMN_CHART", +}); +chartSubtypeRegistry.add("odoo_stacked_bar", { + matcher: (definition) => definition.type === "odoo_bar" && definition.stacked, + subtypeDefinition: {stacked: true}, + displayName: _t("Stacked Column"), + chartSubtype: "odoo_stacked_bar", + chartType: "odoo_bar", + category: "column", + preview: "o-spreadsheet-ChartPreview.STACKED_COLUMN_CHART", +}); +chartSubtypeRegistry.add("odoo_pie", { + displayName: _t("Pie"), + chartSubtype: "odoo_pie", + chartType: "odoo_pie", + category: "pie", + preview: "o-spreadsheet-ChartPreview.PIE_CHART", +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml index 45549754..242124ba 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml @@ -67,14 +67,11 @@ -
    +
    -
    - Last updated at -
    +
    + Last updated at +
    @@ -123,15 +123,32 @@ Edit domain
    -
    - Last updated at -
    +
    +
    + + +
    +
    + Last updated at +
    @@ -276,12 +293,13 @@
    @@ -311,7 +329,7 @@
    - + @@ -444,34 +463,6 @@
    - @@ -633,11 +624,7 @@
    - +
    Link to Odoo menu
    @@ -647,11 +634,7 @@
    - +
    Link to Odoo menu
    @@ -661,11 +644,7 @@
    - +
    Link to Odoo menu
    @@ -675,11 +654,7 @@
    - +
    Link to Odoo menu
    @@ -689,11 +664,7 @@
    - +
    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 index d14d7b36..5055a15c 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js @@ -1,37 +1,45 @@ -/** @odoo-module **/ - import * as spreadsheet from "@odoo/o-spreadsheet"; -import {makeDynamicCols, makeDynamicRows} from "../utils/dynamic_generators.esm"; -import {ListDataSource} from "@spreadsheet/list/list_data_source"; -import {PivotDataSource} from "@spreadsheet/pivot/pivot_data_source"; + +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, onMounted, onWillStart, useSubEnv} = owl; +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.router = useService("router"); this.orm = useService("orm"); this.notification = useService("notification"); const params = this.props.action.params || this.props.action.context.params; - this.spreadsheetId = params.spreadsheet_id; + this.spreadsheetId = params.spreadsheet_id || params.active_id; this.model = params.model || "spreadsheet.spreadsheet"; this.import_data = params.import_data || {}; - onMounted(() => { - this.router.pushState({ - spreadsheet_id: this.spreadsheetId, - model: this.model, - }); - }); onWillStart(async () => { // We need to load in case the data comes from an XLSX this.record = - spreadsheet.load( + load( await this.orm.call( this.model, "get_spreadsheet_data", @@ -46,6 +54,7 @@ export class ActionSpreadsheetOca extends Component { notifyUser: this.notifyUser.bind(this), }); } + notifyUser(notification) { this.notification.add(notification.text, { type: notification.type, @@ -60,7 +69,6 @@ export class ActionSpreadsheetOca extends Component { this.orm.call(this.model, "write", [this.spreadsheetId, data]); } else { this.spreadsheetId = await this.orm.call(this.model, "create", [data]); - this.router.pushState({spreadsheet_id: this.spreadsheetId}); } } /** @@ -84,7 +92,6 @@ export class ActionSpreadsheetOca extends Component { } async importDataGraph(spreadsheet_model) { var sheetId = spreadsheet_model.getters.getActiveSheetId(); - var y = 0; if (this.import_data.new === undefined && this.import_data.new_sheet) { sheetId = uuidGenerator.uuidv4(); spreadsheet_model.dispatch("CREATE_SHEET", { @@ -101,23 +108,29 @@ export class ActionSpreadsheetOca extends Component { // 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: this.import_data.name, - type: "odoo_" + this.import_data.metaData.mode, + 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: y, + y: 0, }, definition, }); @@ -159,115 +172,107 @@ export class ActionSpreadsheetOca extends Component { } row += 1; } - return {sheetId, row}; + return sheetId; } async importDataList(spreadsheet_model) { - var {sheetId, row} = this.importCreateOrReuseSheet(spreadsheet_model); - const dataSourceId = uuidGenerator.uuidv4(); - var list_info = { + 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: this.import_data.metaData.domain, + 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 dataSource = spreadsheet_model.config.custom.dataSources.add( - dataSourceId, - ListDataSource, - list_info - ); - await dataSource.load(); - spreadsheet_model.dispatch("INSERT_ODOO_LIST", { + 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: row, - id: spreadsheet_model.getters.getNextListId(), - dataSourceId, + row: 0, + id: listId, definition: list_info, linesNumber: this.import_data.dyn_number_of_rows, - columns: this.import_data.metaData.columns, + columns: columns, }); - const columns = []; - for (let col = 0; col < this.import_data.metaData.columns.length; col++) { - columns.push(col); - } + const dataSource = spreadsheet_model.getters.getListDataSource(listId); + await dataSource.load(); spreadsheet_model.dispatch("AUTORESIZE_COLUMNS", { sheetId, - cols: columns, + cols: Array.from({length: columns.length}, (_, i) => i), }); } async importDataPivot(spreadsheet_model) { - var {sheetId, row} = this.importCreateOrReuseSheet(spreadsheet_model); - const dataSourceId = uuidGenerator.uuidv4(); - const colGroupBys = this.import_data.metaData.colGroupBys.concat( - this.import_data.metaData.expandedColGroupBys + 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 rowGroupBys = (this.import_data.metaData.rowGroupBys || []).concat( + this.import_data.metaData.expandedRowGroupBys || [] ); - const pivot_info = { - metaData: { - colGroupBys, - rowGroupBys, - activeMeasures: this.import_data.metaData.activeMeasures, - resModel: this.import_data.metaData.resModel, - sortedColumn: this.import_data.metaData.sortedColumn, - }, - searchParams: this.cleanSearchParams(), - name: this.import_data.name, - }; - const dataSource = spreadsheet_model.config.custom.dataSources.add( - dataSourceId, - PivotDataSource, - pivot_info - ); - await dataSource.load(); - var {cols, rows, measures} = dataSource.getTableStructure().export(); - if (this.import_data.dyn_number_of_rows) { - const indentations = rows.map((r) => r.indent); - const max_indentation = Math.max(...indentations); - rows = makeDynamicRows( - rowGroupBys, - this.import_data.dyn_number_of_rows, - 1, - max_indentation - ); - } - if (this.import_data.dyn_number_of_cols) { - cols = makeDynamicCols( - colGroupBys, - this.import_data.dyn_number_of_cols, - this.import_data.metaData.activeMeasures - ); - } - const table = { - cols, - rows, + const pivot_info = deepCopy({ + type: "ODOO", + domain: new Domain(this.import_data.searchParams.domain).toJson(), + context: this.import_data.searchParams.context, + sortedColumn, measures, - }; - spreadsheet_model.dispatch("INSERT_PIVOT", { + 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: row, - id: spreadsheet_model.getters.getNextPivotId(), - table, - dataSourceId, - definition: pivot_info, + row: 0, + pivotId, + table: table.export(), + pivotMode: "dynamic", }); const columns = []; - for (let col = 0; col < table.cols[table.cols.length - 1].length; col++) { + for ( + let col = 0; + col <= table.columns[table.columns.length - 1].length; + col++ + ) { columns.push(col); } - spreadsheet_model.dispatch("AUTORESIZE_COLUMNS", { - sheetId, - cols: columns, - }); + spreadsheet_model.dispatch("AUTORESIZE_COLUMNS", {sheetId, cols: columns}); } async importData(spreadsheet_model) { if (this.import_data.mode === "pivot") { @@ -286,6 +291,7 @@ 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 index 9a3cecd1..4b5d8647 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js @@ -1,7 +1,6 @@ -/** @odoo-module **/ - import {Component} from "@odoo/owl"; import {ControlPanel} from "@web/search/control_panel/control_panel"; +import {useService} from "@web/core/utils/hooks"; const {useState} = owl; @@ -12,15 +11,35 @@ export class SpreadsheetName extends Component { }); } _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 {} +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, diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js index 1627274e..24cc65ed 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js @@ -1,21 +1,20 @@ -/** @odoo-module **/ - import * as spreadsheet from "@odoo/o-spreadsheet"; + import {Component} from "@odoo/owl"; -import {ConfirmationDialog} from "@web/core/confirmation_dialog/confirmation_dialog"; -import {DataSources} from "@spreadsheet/data_sources/data_sources"; -import {Dialog} from "@web/core/dialog/dialog"; -import {Field} from "@web/views/fields/field"; +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 {migrate} from "@spreadsheet/o_spreadsheet/migration"; import {useService} from "@web/core/utils/hooks"; -import {useSetupAction} from "@web/webclient/actions/action_hook"; +import {useSetupAction} from "@web/search/action_hook"; +import {user} from "@web/core/user"; import {waitForDataLoaded} from "@spreadsheet/helpers/model"; -import {createDefaultCurrencyFormat} from "@spreadsheet/currency/helpers"; -const {Spreadsheet, Model} = spreadsheet; +const {Model, load} = spreadsheet; + const {useSubEnv, onWillStart} = owl; +const {useStoreProvider, ModelStore} = spreadsheet.stores; const uuidGenerator = new spreadsheet.helpers.UuidGenerator(); class SpreadsheetTransportService { @@ -26,11 +25,14 @@ class SpreadsheetTransportService { this.res_id = res_id; this.channel = "spreadsheet_oca;" + this.model + ";" + this.res_id; this.bus_service.addChannel(this.channel); - this.bus_service.addEventListener( - "notification", - this.onNotification.bind(this) - ); + 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) { @@ -46,18 +48,46 @@ class SpreadsheetTransportService { } } } - sendMessage(message) { - this.orm.call(this.model, "send_spreadsheet_message", [[this.res_id], message]); + 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.listeners.push({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 () => { @@ -89,27 +119,33 @@ export class SpreadsheetRenderer extends Component { } setup() { this.orm = useService("orm"); + this.http = useService("http"); this.bus_service = this.env.services.bus_service; - this.user = useService("user"); this.ui = useService("ui"); this.action = useService("action"); this.dialog = useService("dialog"); - const dataSources = new DataSources(this.env); - this.confirmDialog = this.closeDialog; + 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; - const defaultCurrencyFormat = defaultCurrency - ? createDefaultCurrencyFormat(defaultCurrency) - : undefined; + 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( - migrate(this.props.record.spreadsheet_raw), + load(this.props.record.spreadsheet_raw), { - custom: {env: this.env, orm: this.orm, dataSources}, - defaultCurrencyFormat, + 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, @@ -119,7 +155,8 @@ export class SpreadsheetRenderer extends Component { ), client: { id: uuidGenerator.uuidv4(), - name: this.user.name, + name: user.name, + userId: user.userId, }, mode: this.props.record.mode, }, @@ -127,18 +164,22 @@ export class SpreadsheetRenderer extends Component { ); useSubEnv({ saveSpreadsheet: this.onSpreadsheetSaved.bind(this), - askConfirmation: this.askConfirmation.bind(this), downloadAsXLXS: this.downloadAsXLXS.bind(this), }); onWillStart(async () => { await loadSpreadsheetDependencies(); - await dataSources.waitForAllLoaded(); + 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(), + beforeLeave: () => { + this.onSpreadsheetSaved(); + return Promise.resolve(); + }, }); - dataSources.addEventListener("data-source-updated", () => { + odooDataProvider.addEventListener("data-source-updated", () => { const sheetId = this.spreadsheet_model.getters.getActiveSheetId(); this.spreadsheet_model.dispatch("EVALUATE_CELLS", {sheetId}); }); @@ -147,14 +188,7 @@ export class SpreadsheetRenderer extends Component { const data = this.spreadsheet_model.exportData(); this.env.saveRecord({spreadsheet_raw: data}); this.spreadsheet_model.leaveSession(); - } - askConfirmation(content, confirm) { - this.dialog.add(ConfirmationDialog, { - title: _t("Odoo Spreadsheet"), - body: content, - confirm, - confirmLabel: _t("Confirm"), - }); + this.spreadsheet_model.off("update", this); } async downloadAsXLXS() { this.ui.block(); @@ -172,14 +206,10 @@ export class SpreadsheetRenderer extends Component { } SpreadsheetRenderer.template = "spreadsheet_oca.SpreadsheetRenderer"; -SpreadsheetRenderer.components = { - Spreadsheet, - Field, - Dialog, -}; +SpreadsheetRenderer.components = {SpreadsheetComponent}; SpreadsheetRenderer.props = { record: Object, - res_id: {type: Number, optional: true}, + res_id: Number, model: String, - importData: {type: Function, optional: true}, + importData: Function, }; diff --git a/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js b/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js index fac9eeaa..04238fa6 100644 --- a/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js @@ -1,4 +1,3 @@ -/** @odoo-module **/ import {GraphRenderer} from "@web/views/graph/graph_renderer"; import {patch} from "@web/core/utils/patch"; diff --git a/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml b/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml index 37b6e49a..f54f8868 100644 --- a/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml +++ b/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml @@ -1,6 +1,10 @@ - + diff --git a/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js b/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js index 09fe11d1..beccbe38 100644 --- a/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js @@ -1,13 +1,14 @@ -/** @odoo-module **/ 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.userService = useService("user"); this.actionService = useService("action"); useBus( this.env.bus, @@ -34,8 +35,8 @@ patch(ListRenderer.prototype, { domain: model.domain, orderBy: model.orderBy, context: omit( - model.context, - ...Object.keys(this.userService.context) + model.searchParams?.context || {}, + ...Object.keys(user.context) ), columns: this.getSpreadsheetColumns(), fields: model.fields, @@ -48,10 +49,14 @@ patch(ListRenderer.prototype, { }, getSpreadsheetColumns() { const fields = this.env.model.root.fields; - return this.state.columns + return this.columns .filter( - (col) => col.type === "field" && fields[col.name].type !== "binary" - // We want to avoid binary fields + (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 index 3423a670..7b787a73 100644 --- a/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js @@ -1,7 +1,5 @@ -/** @odoo-module **/ - import {PivotRenderer} from "@web/views/pivot/pivot_renderer"; -import {_lt} from "@web/core/l10n/translation"; +import {_t} from "@web/core/l10n/translation"; import {patch} from "@web/core/utils/patch"; patch(PivotRenderer.prototype, { @@ -38,11 +36,11 @@ patch(PivotRenderer.prototype, { ); }, getSpreadsheetInsertionTooltip() { - var message = _lt("Add to spreadsheet"); + var message = _t("Add to spreadsheet"); if (this.containsDuplicatedGroupBys()) { - message = _lt("Duplicated groupbys in pivot are not supprted"); + message = _t("Duplicated groupbys in pivot are not supported"); } else if (this.isComparingInfo()) { - message = _lt("Comparisons in pivot are not supprted"); + message = _t("Comparisons in pivot are not supported"); } return message; }, @@ -53,8 +51,10 @@ patch(PivotRenderer.prototype, { additionalContext: { default_name: this.model.metaData.title, default_datasource_name: this.model.metaData.title, - default_can_be_dynamic: true, - default_can_have_dynamic_cols: this.containsColGroupBys(), + default_can_be_dynamic: false, + default_can_have_dynamic_cols: false, + // Default_can_be_dynamic: true, + // default_can_have_dynamic_cols: this.containsColGroupBys(), default_import_data: { mode: "pivot", metaData: JSON.parse(JSON.stringify(this.model.metaData)), diff --git a/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml index 8aa73c8a..2eebc450 100644 --- a/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml +++ b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml @@ -1,6 +1,10 @@ - + diff --git a/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml index 2eebc450..58969472 100644 --- a/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml +++ b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml @@ -12,7 +12,7 @@ t-on-click="onSpreadsheetButtonClicked" aria-label="Add to spreadsheet" t-att-disabled="disableSpreadsheetInsertion()" - data-hotkey="s" + data-hotkey="t" /> From fbec3b8b008e2757352252aa29c55f76d4e47204 Mon Sep 17 00:00:00 2001 From: mymage Date: Mon, 20 Oct 2025 06:30:16 +0000 Subject: [PATCH 077/100] Translated using Weblate (Italian) Currently translated at 100.0% (119 of 119 strings) Translation: spreadsheet-18.0/spreadsheet-18.0-spreadsheet_oca Translate-URL: https://translation.odoo-community.org/projects/spreadsheet-18-0/spreadsheet-18-0-spreadsheet_oca/it/ --- spreadsheet_oca/i18n/it.po | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/spreadsheet_oca/i18n/it.po b/spreadsheet_oca/i18n/it.po index fb0e3e42..885ac676 100644 --- a/spreadsheet_oca/i18n/it.po +++ b/spreadsheet_oca/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-06-24 09:25+0000\n" +"PO-Revision-Date: 2025-10-20 08:42+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -72,7 +72,7 @@ msgstr "Si è sicuri di voler cancellare questa pivot?" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Area" -msgstr "" +msgstr "Area" #. module: spreadsheet_oca #. odoo-javascript @@ -119,7 +119,7 @@ msgstr "Codice" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Column" -msgstr "" +msgstr "Colonna" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands @@ -135,7 +135,7 @@ msgstr "Azienda" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 msgid "Comparisons in pivot are not supported" -msgstr "" +msgstr "Il confronto nella pivot non è supportato" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_ids @@ -224,7 +224,7 @@ msgstr "Scarica XLSX" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 msgid "Duplicated groupbys in pivot are not supported" -msgstr "" +msgstr "Il raggruppamento nella pivot non è supportato" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_rows @@ -320,7 +320,7 @@ msgstr "Inserisci pivot dinamico" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Insert list" -msgstr "" +msgstr "Inserisci elenco" #. module: spreadsheet_oca #. odoo-javascript @@ -367,7 +367,7 @@ msgstr "Ultimo aggiornamento il" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Line" -msgstr "" +msgstr "Riga" #. module: spreadsheet_oca #. odoo-javascript @@ -463,7 +463,7 @@ msgstr "Proprietario" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Pie" -msgstr "" +msgstr "Torta" #. module: spreadsheet_oca #. odoo-javascript @@ -531,7 +531,7 @@ msgstr "Res" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Rows:" -msgstr "" +msgstr "Righe:" #. module: spreadsheet_oca #. odoo-javascript @@ -624,19 +624,19 @@ msgstr "In coda" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Stacked Area" -msgstr "" +msgstr "Area riempita" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Stacked Column" -msgstr "" +msgstr "Colonna riempita" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Stacked Line" -msgstr "" +msgstr "Riga riempita" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic @@ -663,7 +663,7 @@ msgstr "Attiva menu a tendina" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Total rows used when inserting list" -msgstr "" +msgstr "Righe usati totali nell'inserimento dell'elenco" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type From 0cc408e6717d67bf8f29863dc8bb4fd7572ab42f Mon Sep 17 00:00:00 2001 From: Florent THOMAS Date: Fri, 21 Nov 2025 01:22:04 +0100 Subject: [PATCH 078/100] [IMP] spreadsheet_oca: * Add Kanban views * Also add active option [IMP] spreadsheet_oca: * Simplify partner usage * Add tags * Improve kanban view [IMP] spreadsheet_oca: Improve form view [IMP] spreadhseet_oca: add tag menu [IMP] spreadhseet_oca: add default image IMP: Add tag on view [REF] spreadsheet_oca: no more partner [REF] spreadsheet_oca: no more partner [REF] spreadsheet_oca: no more partner [REF]rename file [ACL]Ad specific rule for manager --- spreadsheet_oca/README.rst | 10 +- spreadsheet_oca/models/__init__.py | 1 + .../models/spreadsheet_abstract.py | 1 + .../models/spreadsheet_spreadsheet.py | 7 +- .../models/spreadsheet_spreadsheet_tag.py | 24 +++ spreadsheet_oca/readme/CONTRIBUTORS.md | 4 +- spreadsheet_oca/security/ir.model.access.csv | 2 + spreadsheet_oca/static/description/index.html | 45 +++--- .../views/spreadsheet_spreadsheet.xml | 150 +++++++++++++++++- 9 files changed, 205 insertions(+), 39 deletions(-) create mode 100644 spreadsheet_oca/models/spreadsheet_spreadsheet_tag.py diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index b1adfc68..e62262cc 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - =============== Spreadsheet Oca =============== @@ -17,7 +13,7 @@ Spreadsheet Oca .. |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 +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fspreadsheet-lightgray.png?logo=github @@ -129,6 +125,10 @@ Contributors - Chris Mann +- `Mind And Go `__ + + - Florent THOMAS + Maintainers ----------- diff --git a/spreadsheet_oca/models/__init__.py b/spreadsheet_oca/models/__init__.py index 60d31886..c5ec2360 100644 --- a/spreadsheet_oca/models/__init__.py +++ b/spreadsheet_oca/models/__init__.py @@ -1,4 +1,5 @@ from . import spreadsheet_abstract +from . import spreadsheet_spreadsheet_tag from . import spreadsheet_spreadsheet from . import spreadsheet_oca_revision from . import ir_websocket diff --git a/spreadsheet_oca/models/spreadsheet_abstract.py b/spreadsheet_oca/models/spreadsheet_abstract.py index c43be6bb..86a1e317 100644 --- a/spreadsheet_oca/models/spreadsheet_abstract.py +++ b/spreadsheet_oca/models/spreadsheet_abstract.py @@ -17,6 +17,7 @@ class SpreadsheetAbstract(models.AbstractModel): _inherit = ["bus.listener.mixin"] name = fields.Char(required=True) + active = fields.Boolean(default=True) spreadsheet_binary_data = fields.Binary( string="Spreadsheet file", default=lambda self: self._empty_spreadsheet_data_base64(), diff --git a/spreadsheet_oca/models/spreadsheet_spreadsheet.py b/spreadsheet_oca/models/spreadsheet_spreadsheet.py index 86263f8d..55a9ae9f 100644 --- a/spreadsheet_oca/models/spreadsheet_spreadsheet.py +++ b/spreadsheet_oca/models/spreadsheet_spreadsheet.py @@ -10,10 +10,11 @@ class SpreadsheetSpreadsheet(models.Model): _name = "spreadsheet.spreadsheet" - _inherit = "spreadsheet.abstract" + _inherit = ["spreadsheet.abstract", "mail.thread", "mail.activity.mixin"] _description = "Spreadsheet" filename = fields.Char(compute="_compute_filename") + badge_image = fields.Image("Badge Background", max_width=1024, max_height=1024) owner_id = fields.Many2one( "res.users", required=True, default=lambda r: r.env.user.id ) @@ -51,6 +52,10 @@ class SpreadsheetSpreadsheet(models.Model): " if this company is in the current companies.", ) + spreadsheet_tag_ids = fields.Many2many( + string="Tags", comodel_name="spreadsheet.spreadsheet.tag" + ) + @api.depends("name") def _compute_filename(self): for record in self: diff --git a/spreadsheet_oca/models/spreadsheet_spreadsheet_tag.py b/spreadsheet_oca/models/spreadsheet_spreadsheet_tag.py new file mode 100644 index 00000000..29fc9593 --- /dev/null +++ b/spreadsheet_oca/models/spreadsheet_spreadsheet_tag.py @@ -0,0 +1,24 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from random import randint + +from odoo import fields, models + + +class SpreadsheetSpreadsheetTags(models.Model): + _name = "spreadsheet.spreadsheet.tag" + _description = "Spreadsheet Tag" + + def _get_default_color(self): + return randint(1, 11) + + name = fields.Char(required=True, translate=True) + color = fields.Integer( + default=_get_default_color, + help="Transparent tags are not visible in the kanban view", + ) + + _sql_constraints = [ + ("name_uniq", "unique (name)", "A tag with the same name already exists."), + ] diff --git a/spreadsheet_oca/readme/CONTRIBUTORS.md b/spreadsheet_oca/readme/CONTRIBUTORS.md index b262cef9..e5a41e3d 100644 --- a/spreadsheet_oca/readme/CONTRIBUTORS.md +++ b/spreadsheet_oca/readme/CONTRIBUTORS.md @@ -2,4 +2,6 @@ - [Tecnativa](https://www.tecnativa.com): - Carlos Roca - [Open User Systems](https://www.openusersystems.com): - - Chris Mann \ No newline at end of file + - Chris Mann +- [Mind And Go](https://mind-and-go.com) + - Florent THOMAS \ No newline at end of file diff --git a/spreadsheet_oca/security/ir.model.access.csv b/spreadsheet_oca/security/ir.model.access.csv index f25d2e12..9d6b9d8b 100644 --- a/spreadsheet_oca/security/ir.model.access.csv +++ b/spreadsheet_oca/security/ir.model.access.csv @@ -4,3 +4,5 @@ access_spreadsheet_oca_revision,access_spreadsheet_oca_revision,model_spreadshee spreadsheet_oca.access_spreadsheet_spreadsheet_import,access_spreadsheet_spreadsheet_import,spreadsheet_oca.model_spreadsheet_spreadsheet_import,base.group_user,1,1,1,1 access_spreadsheet_import_mode,access_spreadsheet_oca_revision,model_spreadsheet_spreadsheet_import_mode,base.group_user,1,0,0,0 access_spreadsheet_select_row_number,access_spreadsheet_select_row_number,model_spreadsheet_select_row_number,base.group_user,1,1,1,1 +access_spreadsheet_spreadsheet_tag,access_spreadsheet_spreadsheet_tag,model_spreadsheet_spreadsheet_tag,spreadsheet_oca.group_user,1,0,1,0 +access_spreadsheet_spreadsheet_manager_tag,access_spreadsheet_spreadsheet_manager_tag,model_spreadsheet_spreadsheet_tag,spreadsheet_oca.group_manager,1,1,1,1 diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html index 1245a2f4..8882acac 100644 --- a/spreadsheet_oca/static/description/index.html +++ b/spreadsheet_oca/static/description/index.html @@ -3,16 +3,15 @@ -README.rst +Spreadsheet Oca -
    +
    +

    Spreadsheet Oca

    - - -Odoo Community Association - -
    -

    Spreadsheet Oca

    -

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

    +

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

    This module adds a functionality for adding and editing Spreadsheets using Odoo CE.

    It is an alternative to the proprietary module spreadsheet_edition @@ -397,9 +391,9 @@

    Spreadsheet Oca

    -

    Usage

    +

    Usage

    -

    Create a new spreadsheet

    +

    Create a new spreadsheet

    -

    Development

    +

    Development

    If you want to develop custom business functions, you can add others, based on the file https://github.com/odoo/odoo/blob/16.0/addons/spreadsheet_account/static/src/accounting_functions.js

    -

    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 @@ -461,15 +455,15 @@

    Bug Tracker

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

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • CreuBlanca
    -

    Contributors

    +

    Contributors

    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    - -Odoo Community Association - +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.

    @@ -496,6 +492,5 @@

    Maintainers

    -
    diff --git a/spreadsheet_oca/views/spreadsheet_spreadsheet.xml b/spreadsheet_oca/views/spreadsheet_spreadsheet.xml index 66dc4882..60d1ea15 100644 --- a/spreadsheet_oca/views/spreadsheet_spreadsheet.xml +++ b/spreadsheet_oca/views/spreadsheet_spreadsheet.xml @@ -6,7 +6,26 @@ spreadsheet.spreadsheet.search (in spreadsheet_oca) spreadsheet.spreadsheet - + + + + + + + + + + + + @@ -42,17 +61,30 @@ icon="fa-pencil" />
    -

    - -

    + +
    +

    +
    + +
    +

    +
    + - + + + + + + spreadsheet.spreadsheet.kanban + spreadsheet.spreadsheet + + + + + Edit + Delete + + + + +
    +
    + + + +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    + + + Spreadsheets Tags + spreadsheet.spreadsheet.tag + list,form + [] + {} + + Spreadsheets spreadsheet.spreadsheet - list,form + kanban,list,form [] - {} + {'search_default_mysheets': 1} @@ -93,4 +214,19 @@ + + + Configuration + + + + + + + Spreadsheets Tags + + + + + From d972f81028ac4ad572591e778797a6b42d65eba1 Mon Sep 17 00:00:00 2001 From: Florent THOMAS Date: Fri, 12 Dec 2025 09:40:39 +0100 Subject: [PATCH 079/100] [IMP]Active ribbon and chatter on view --- spreadsheet_oca/views/spreadsheet_spreadsheet.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spreadsheet_oca/views/spreadsheet_spreadsheet.xml b/spreadsheet_oca/views/spreadsheet_spreadsheet.xml index 60d1ea15..b2684e67 100644 --- a/spreadsheet_oca/views/spreadsheet_spreadsheet.xml +++ b/spreadsheet_oca/views/spreadsheet_spreadsheet.xml @@ -53,6 +53,13 @@
    + +
    - - -
    -
    +
    Last updated at
    From f68a394588f755914a04d57fc84da361077cc169 Mon Sep 17 00:00:00 2001 From: Carlos Roca Date: Tue, 24 Feb 2026 14:20:50 +0100 Subject: [PATCH 085/100] [FIX] spreadsheet_oca: Remove duplicated charts that are throwing errors. --- spreadsheet_oca/README.rst | 2 +- spreadsheet_oca/__manifest__.py | 2 +- spreadsheet_oca/i18n/es.po | 103 ++++---------- spreadsheet_oca/i18n/fr.po | 98 +++----------- spreadsheet_oca/i18n/fr_FR.po | 80 +---------- spreadsheet_oca/i18n/it.po | 127 +++++++----------- spreadsheet_oca/i18n/nl.po | 97 +++---------- spreadsheet_oca/i18n/pt.po | 103 ++++---------- spreadsheet_oca/i18n/spreadsheet_oca.pot | 80 +---------- spreadsheet_oca/i18n/zh_CN.po | 80 +---------- spreadsheet_oca/static/description/index.html | 2 +- .../src/spreadsheet/bundle/odoo_panels.esm.js | 85 ------------ 12 files changed, 168 insertions(+), 691 deletions(-) diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index f5f24bfc..56c1beb0 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/README.rst @@ -11,7 +11,7 @@ Spreadsheet Oca !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:65bc318ca4bd4e29a941983b95b811a2ba7e83b816554ba06a37a7cd4ff0dd64 + !! source digest: sha256:c8a74e3809101635545a0644d7a03bdb4c4707494a3ee713763e8c4b71a167ab !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index b992d7e0..80e58fa6 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "18.0.1.1.1", + "version": "18.0.1.2.0", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", diff --git a/spreadsheet_oca/i18n/es.po b/spreadsheet_oca/i18n/es.po index f9a78f98..1c714dd7 100644 --- a/spreadsheet_oca/i18n/es.po +++ b/spreadsheet_oca/i18n/es.po @@ -106,18 +106,6 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -msgid "Are you sure you want to delete this pivot?" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Area" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -174,12 +162,6 @@ msgstr "Código" msgid "Color" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Column" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -265,12 +247,6 @@ msgstr "Valor por defecto" msgid "Delete" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Dimensions" -msgstr "Dimensiones" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name @@ -423,24 +399,12 @@ msgstr "Importar Pivot" msgid "Import data to spreadsheet" msgstr "Importar datos a hoja de cálculo" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert dynamic pivot" -msgstr "Insertar pivot dinámica" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Insert list" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert pivot" -msgstr "Insertar pivot" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_is_follower msgid "Is Follower" @@ -483,12 +447,6 @@ msgstr "Última actualización el" msgid "Last updated at" msgstr "Última Actualización el" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Line" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -506,12 +464,6 @@ msgstr "Lista de nombres" msgid "Manager" msgstr "Administrador" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Measures" -msgstr "Medidas" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 @@ -641,27 +593,27 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Pie" -msgstr "" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +msgid "Previous" +msgstr "Anterior" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Pivot name" -msgstr "Nombre de pivot" +msgid "Quarter" +msgstr "Trimestre" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -msgid "Previous" -msgstr "Anterior" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Dynamic" +msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Quarter" -msgstr "Trimestre" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Static" +msgstr "" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view @@ -821,24 +773,6 @@ msgstr "" msgid "Stacked" msgstr "Apilados" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Area" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Column" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Line" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" @@ -973,6 +907,21 @@ msgstr "no actualizado" msgid "websocket message handling" msgstr "gestión de mensajes websocket" +#~ msgid "Dimensions" +#~ msgstr "Dimensiones" + +#~ msgid "Insert dynamic pivot" +#~ msgstr "Insertar pivot dinámica" + +#~ msgid "Insert pivot" +#~ msgstr "Insertar pivot" + +#~ msgid "Measures" +#~ msgstr "Medidas" + +#~ msgid "Pivot name" +#~ msgstr "Nombre de pivot" + #~ msgid "Add sheet to spreadsheet" #~ msgstr "Añadir hoja a la hoja de cálculo" diff --git a/spreadsheet_oca/i18n/fr.po b/spreadsheet_oca/i18n/fr.po index 92144652..6ec9aa07 100644 --- a/spreadsheet_oca/i18n/fr.po +++ b/spreadsheet_oca/i18n/fr.po @@ -105,18 +105,6 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -msgid "Are you sure you want to delete this pivot?" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Area" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -173,12 +161,6 @@ msgstr "" msgid "Color" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Column" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -264,12 +246,6 @@ msgstr "" msgid "Delete" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Dimensions" -msgstr "Dimensions" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name @@ -422,24 +398,12 @@ msgstr "" msgid "Import data to spreadsheet" msgstr "Importer des données au tableur" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert dynamic pivot" -msgstr "Insérer un pivot dynamique" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Insert list" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert pivot" -msgstr "Insérer un pivot" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_is_follower msgid "Is Follower" @@ -482,12 +446,6 @@ msgstr "Dernière mise à jour le" msgid "Last updated at" msgstr "Dernière mise à jour à" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Line" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -505,12 +463,6 @@ msgstr "" msgid "Manager" msgstr "Gestionnaire" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Measures" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 @@ -640,26 +592,26 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Pie" -msgstr "" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +msgid "Previous" +msgstr "Précédent" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Pivot name" -msgstr "Nom du pivot" +msgid "Quarter" +msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -msgid "Previous" -msgstr "Précédent" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Dynamic" +msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Quarter" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Static" msgstr "" #. module: spreadsheet_oca @@ -820,24 +772,6 @@ msgstr "" msgid "Stacked" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Area" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Column" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Line" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" @@ -972,6 +906,18 @@ msgstr "" msgid "websocket message handling" msgstr "" +#~ msgid "Dimensions" +#~ msgstr "Dimensions" + +#~ msgid "Insert dynamic pivot" +#~ msgstr "Insérer un pivot dynamique" + +#~ msgid "Insert pivot" +#~ msgstr "Insérer un pivot" + +#~ msgid "Pivot name" +#~ msgstr "Nom du pivot" + #~ msgid "Add sheet to spreadsheet" #~ msgstr "Ajouter une feuille au tableur" diff --git a/spreadsheet_oca/i18n/fr_FR.po b/spreadsheet_oca/i18n/fr_FR.po index 15775d64..474db899 100644 --- a/spreadsheet_oca/i18n/fr_FR.po +++ b/spreadsheet_oca/i18n/fr_FR.po @@ -103,18 +103,6 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -msgid "Are you sure you want to delete this pivot?" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Area" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -171,12 +159,6 @@ msgstr "" msgid "Color" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Column" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -262,12 +244,6 @@ msgstr "" msgid "Delete" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Dimensions" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name @@ -420,24 +396,12 @@ msgstr "" msgid "Import data to spreadsheet" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert dynamic pivot" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Insert list" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert pivot" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_is_follower msgid "Is Follower" @@ -480,12 +444,6 @@ msgstr "" msgid "Last updated at" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Line" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -503,12 +461,6 @@ msgstr "" msgid "Manager" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Measures" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 @@ -638,26 +590,26 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Pie" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +msgid "Previous" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Pivot name" +msgid "Quarter" msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -msgid "Previous" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Dynamic" msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Quarter" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Static" msgstr "" #. module: spreadsheet_oca @@ -818,24 +770,6 @@ msgstr "" msgid "Stacked" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Area" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Column" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Line" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" diff --git a/spreadsheet_oca/i18n/it.po b/spreadsheet_oca/i18n/it.po index ca48e874..d14aa2f1 100644 --- a/spreadsheet_oca/i18n/it.po +++ b/spreadsheet_oca/i18n/it.po @@ -105,18 +105,6 @@ msgstr "In archivio" msgid "Are you sure you want to delete this list?" msgstr "Si è sicuri di voler cancellare questo elenco?" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -msgid "Are you sure you want to delete this pivot?" -msgstr "Si è sicuri di voler cancellare questa pivot?" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Area" -msgstr "Area" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -173,12 +161,6 @@ msgstr "Codice" msgid "Color" msgstr "Colore" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Column" -msgstr "Colonna" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -264,12 +246,6 @@ msgstr "Valore predefinito" msgid "Delete" msgstr "Cancella" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Dimensions" -msgstr "Dimensioni" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name @@ -424,24 +400,12 @@ msgstr "Importa pivot" msgid "Import data to spreadsheet" msgstr "Importa dati nel foglio di calcolo" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert dynamic pivot" -msgstr "Inserisci pivot dinamico" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Insert list" msgstr "Inserisci elenco" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert pivot" -msgstr "Inserisci pivot" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_is_follower msgid "Is Follower" @@ -484,12 +448,6 @@ msgstr "Ultimo aggiornamento il" msgid "Last updated at" msgstr "Ultimo aggiornamento il" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Line" -msgstr "Riga" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -507,12 +465,6 @@ msgstr "Nome elenco" msgid "Manager" msgstr "Supervisore" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Measures" -msgstr "Misure" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 @@ -642,27 +594,27 @@ msgstr "Proprietà" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Pie" -msgstr "Torta" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +msgid "Previous" +msgstr "Precedente" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Pivot name" -msgstr "Nome pivot" +msgid "Quarter" +msgstr "Trimestre" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -msgid "Previous" -msgstr "Precedente" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Dynamic" +msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Quarter" -msgstr "Trimestre" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Static" +msgstr "" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view @@ -822,24 +774,6 @@ msgstr "Immagine foglio di calcolo" msgid "Stacked" msgstr "In coda" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Area" -msgstr "Area riempita" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Column" -msgstr "Colonna riempita" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Line" -msgstr "Riga riempita" - #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" @@ -978,6 +912,45 @@ msgstr "non aggiornato" msgid "websocket message handling" msgstr "gestione messaggio websocket" +#~ msgid "Are you sure you want to delete this pivot?" +#~ msgstr "Si è sicuri di voler cancellare questa pivot?" + +#~ msgid "Dimensions" +#~ msgstr "Dimensioni" + +#~ msgid "Insert dynamic pivot" +#~ msgstr "Inserisci pivot dinamico" + +#~ msgid "Insert pivot" +#~ msgstr "Inserisci pivot" + +#~ msgid "Measures" +#~ msgstr "Misure" + +#~ msgid "Pivot name" +#~ msgstr "Nome pivot" + +#~ msgid "Area" +#~ msgstr "Area" + +#~ msgid "Column" +#~ msgstr "Colonna" + +#~ msgid "Line" +#~ msgstr "Riga" + +#~ msgid "Pie" +#~ msgstr "Torta" + +#~ msgid "Stacked Area" +#~ msgstr "Area riempita" + +#~ msgid "Stacked Column" +#~ msgstr "Colonna riempita" + +#~ msgid "Stacked Line" +#~ msgstr "Riga riempita" + #~ msgid "Add sheet to spreadsheet" #~ msgstr "Aggiungi scheda a foglIo di calcolo" diff --git a/spreadsheet_oca/i18n/nl.po b/spreadsheet_oca/i18n/nl.po index d1bd8948..271e1b8b 100644 --- a/spreadsheet_oca/i18n/nl.po +++ b/spreadsheet_oca/i18n/nl.po @@ -105,18 +105,6 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -msgid "Are you sure you want to delete this pivot?" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Area" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -173,12 +161,6 @@ msgstr "" msgid "Color" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Column" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -264,12 +246,6 @@ msgstr "Standaardwaarde" msgid "Delete" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Dimensions" -msgstr "Dimensies" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name @@ -422,24 +398,12 @@ msgstr "Importeer draaipunt" msgid "Import data to spreadsheet" msgstr "Gegevens importeren naar spreadsheet" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert dynamic pivot" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Insert list" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert pivot" -msgstr "Draaipunt invoegen" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_is_follower msgid "Is Follower" @@ -482,12 +446,6 @@ msgstr "Laatst bijgewerkt op" msgid "Last updated at" msgstr "Laatst bijgewerkt op" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Line" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -505,12 +463,6 @@ msgstr "Naam van lijst" msgid "Manager" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Measures" -msgstr "Afmetingen" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 @@ -640,27 +592,27 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Pie" -msgstr "" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +msgid "Previous" +msgstr "Vorig" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Pivot name" -msgstr "" +msgid "Quarter" +msgstr "Kwartaal" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -msgid "Previous" -msgstr "Vorig" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Dynamic" +msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Quarter" -msgstr "Kwartaal" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Static" +msgstr "" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view @@ -820,24 +772,6 @@ msgstr "" msgid "Stacked" msgstr "Gestapeld" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Area" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Column" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Line" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" @@ -970,6 +904,15 @@ msgstr "niet geüpdate" msgid "websocket message handling" msgstr "afhandeling van websocket-berichten" +#~ msgid "Dimensions" +#~ msgstr "Dimensies" + +#~ msgid "Insert pivot" +#~ msgstr "Draaipunt invoegen" + +#~ msgid "Measures" +#~ msgstr "Afmetingen" + #~ msgid "Add sheet to spreadsheet" #~ msgstr "Blad toevoegen aan spreadsheet" diff --git a/spreadsheet_oca/i18n/pt.po b/spreadsheet_oca/i18n/pt.po index 23e8fabc..3c1ddeb5 100644 --- a/spreadsheet_oca/i18n/pt.po +++ b/spreadsheet_oca/i18n/pt.po @@ -105,18 +105,6 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -msgid "Are you sure you want to delete this pivot?" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Area" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -173,12 +161,6 @@ msgstr "Código" msgid "Color" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Column" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -264,12 +246,6 @@ msgstr "Valor predefinido" msgid "Delete" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Dimensions" -msgstr "Dimensões" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name @@ -422,24 +398,12 @@ msgstr "Importar Pivô" msgid "Import data to spreadsheet" msgstr "Importar dados para a folha de cálculo" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert dynamic pivot" -msgstr "Inserir pivô dinâmico" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Insert list" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert pivot" -msgstr "Inserir pivô" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_is_follower msgid "Is Follower" @@ -482,12 +446,6 @@ msgstr "Última Actualização em" msgid "Last updated at" msgstr "Última Modificação a" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Line" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -505,12 +463,6 @@ msgstr "Nome da lista" msgid "Manager" msgstr "Gestor" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Measures" -msgstr "Medidas" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 @@ -640,27 +592,27 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Pie" -msgstr "" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +msgid "Previous" +msgstr "Anterior" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Pivot name" -msgstr "Nome do pivô" +msgid "Quarter" +msgstr "Trimestre" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -msgid "Previous" -msgstr "Anterior" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Dynamic" +msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Quarter" -msgstr "Trimestre" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Static" +msgstr "" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view @@ -820,24 +772,6 @@ msgstr "" msgid "Stacked" msgstr "Empilhados" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Area" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Column" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Line" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" @@ -970,6 +904,21 @@ msgstr "não atualizado" msgid "websocket message handling" msgstr "tratamento de mensagens websocket" +#~ msgid "Dimensions" +#~ msgstr "Dimensões" + +#~ msgid "Insert dynamic pivot" +#~ msgstr "Inserir pivô dinâmico" + +#~ msgid "Insert pivot" +#~ msgstr "Inserir pivô" + +#~ msgid "Measures" +#~ msgstr "Medidas" + +#~ msgid "Pivot name" +#~ msgstr "Nome do pivô" + #~ msgid "Add sheet to spreadsheet" #~ msgstr "Adicionar folha ao painel" diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index c776f776..20044d0d 100644 --- a/spreadsheet_oca/i18n/spreadsheet_oca.pot +++ b/spreadsheet_oca/i18n/spreadsheet_oca.pot @@ -102,18 +102,6 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -msgid "Are you sure you want to delete this pivot?" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Area" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -170,12 +158,6 @@ msgstr "" msgid "Color" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Column" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -261,12 +243,6 @@ msgstr "" msgid "Delete" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Dimensions" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name @@ -419,24 +395,12 @@ msgstr "" msgid "Import data to spreadsheet" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert dynamic pivot" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Insert list" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert pivot" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_is_follower msgid "Is Follower" @@ -479,12 +443,6 @@ msgstr "" msgid "Last updated at" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Line" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -502,12 +460,6 @@ msgstr "" msgid "Manager" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Measures" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 @@ -637,26 +589,26 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Pie" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +msgid "Previous" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Pivot name" +msgid "Quarter" msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -msgid "Previous" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Dynamic" msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Quarter" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Static" msgstr "" #. module: spreadsheet_oca @@ -817,24 +769,6 @@ msgstr "" msgid "Stacked" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Area" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Column" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Line" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" diff --git a/spreadsheet_oca/i18n/zh_CN.po b/spreadsheet_oca/i18n/zh_CN.po index d8e24f07..f65d4138 100644 --- a/spreadsheet_oca/i18n/zh_CN.po +++ b/spreadsheet_oca/i18n/zh_CN.po @@ -103,18 +103,6 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 -msgid "Are you sure you want to delete this pivot?" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Area" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -171,12 +159,6 @@ msgstr "" msgid "Color" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Column" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -262,12 +244,6 @@ msgstr "" msgid "Delete" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Dimensions" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name @@ -420,24 +396,12 @@ msgstr "" msgid "Import data to spreadsheet" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert dynamic pivot" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Insert list" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Insert pivot" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_is_follower msgid "Is Follower" @@ -480,12 +444,6 @@ msgstr "" msgid "Last updated at" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Line" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -503,12 +461,6 @@ msgstr "" msgid "Manager" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Measures" -msgstr "" - #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 @@ -638,26 +590,26 @@ msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Pie" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +msgid "Previous" msgstr "" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Pivot name" +msgid "Quarter" msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 -msgid "Previous" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Dynamic" msgstr "" #. module: spreadsheet_oca #. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 -msgid "Quarter" +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +msgid "Re-insert Static" msgstr "" #. module: spreadsheet_oca @@ -818,24 +770,6 @@ msgstr "" msgid "Stacked" msgstr "" -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Area" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Column" -msgstr "" - -#. module: spreadsheet_oca -#. odoo-javascript -#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 -msgid "Stacked Line" -msgstr "" - #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html index b8a9d39c..e4994893 100644 --- a/spreadsheet_oca/static/description/index.html +++ b/spreadsheet_oca/static/description/index.html @@ -372,7 +372,7 @@

    Spreadsheet Oca

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

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

    This module adds a functionality for adding and editing Spreadsheets diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js index dfbe770a..0426e874 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js @@ -1,12 +1,7 @@ -import * as spreadsheet from "@odoo/o-spreadsheet"; - import {Domain} from "@web/core/domain"; import {Many2XAutocomplete} from "@web/views/fields/relational_utils"; import {_t} from "@web/core/l10n/translation"; import {useService} from "@web/core/utils/hooks"; - -const {chartSidePanelComponentRegistry, chartSubtypeRegistry} = spreadsheet.registries; -const {PieChartDesignPanel} = spreadsheet.components; const {Component} = owl; export class OdooPanel extends Component { @@ -82,83 +77,3 @@ class OdooStackablePanel extends OdooPanel { } } OdooStackablePanel.template = "spreadsheet_oca.OdooStackablePanel"; - -chartSidePanelComponentRegistry - .add("odoo_line", { - configuration: OdooStackablePanel, - design: PieChartDesignPanel, - }) - .add("odoo_bar", { - configuration: OdooStackablePanel, - design: PieChartDesignPanel, - }) - .add("odoo_pie", { - configuration: OdooPanel, - design: PieChartDesignPanel, - }); - -chartSubtypeRegistry.add("odoo_line", { - matcher: (definition) => - definition.type === "odoo_line" && !definition.stacked && !definition.fillArea, - subtypeDefinition: {stacked: false, fillArea: false}, - displayName: _t("Line"), - chartSubtype: "odoo_line", - chartType: "odoo_line", - category: "line", - preview: "o-spreadsheet-ChartPreview.LINE_CHART", -}); -chartSubtypeRegistry.add("odoo_stacked_line", { - matcher: (definition) => - definition.type === "odoo_line" && definition.stacked && !definition.fillArea, - subtypeDefinition: {stacked: true, fillArea: false}, - displayName: _t("Stacked Line"), - chartSubtype: "odoo_stacked_line", - chartType: "odoo_line", - category: "line", - preview: "o-spreadsheet-ChartPreview.STACKED_LINE_CHART", -}); -chartSubtypeRegistry.add("odoo_area", { - matcher: (definition) => - definition.type === "odoo_line" && !definition.stacked && definition.fillArea, - subtypeDefinition: {stacked: false, fillArea: true}, - displayName: _t("Area"), - chartSubtype: "odoo_area", - chartType: "odoo_line", - category: "area", - preview: "o-spreadsheet-ChartPreview.AREA_CHART", -}); -chartSubtypeRegistry.add("odoo_stacked_area", { - matcher: (definition) => - definition.type === "odoo_line" && definition.stacked && definition.fillArea, - subtypeDefinition: {stacked: true, fillArea: true}, - displayName: _t("Stacked Area"), - chartSubtype: "odoo_stacked_area", - chartType: "odoo_line", - category: "area", - preview: "o-spreadsheet-ChartPreview.STACKED_AREA_CHART", -}); -chartSubtypeRegistry.add("odoo_bar", { - matcher: (definition) => definition.type === "odoo_bar" && !definition.stacked, - subtypeDefinition: {stacked: false}, - displayName: _t("Column"), - chartSubtype: "odoo_bar", - chartType: "odoo_bar", - category: "column", - preview: "o-spreadsheet-ChartPreview.COLUMN_CHART", -}); -chartSubtypeRegistry.add("odoo_stacked_bar", { - matcher: (definition) => definition.type === "odoo_bar" && definition.stacked, - subtypeDefinition: {stacked: true}, - displayName: _t("Stacked Column"), - chartSubtype: "odoo_stacked_bar", - chartType: "odoo_bar", - category: "column", - preview: "o-spreadsheet-ChartPreview.STACKED_COLUMN_CHART", -}); -chartSubtypeRegistry.add("odoo_pie", { - displayName: _t("Pie"), - chartSubtype: "odoo_pie", - chartType: "odoo_pie", - category: "pie", - preview: "o-spreadsheet-ChartPreview.PIE_CHART", -}); From 72ef6447cce42760641e73756bd13723c5c21819 Mon Sep 17 00:00:00 2001 From: Carlos Roca Date: Wed, 25 Feb 2026 08:19:28 +0100 Subject: [PATCH 086/100] Revert "[FIX] spreadsheet_oca: Remove duplicated charts that are throwing errors." This reverts commit 7140455df5b1b083f9d5146427c9a7b580a0b75b. --- .../src/spreadsheet/bundle/odoo_panels.esm.js | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js index 0426e874..dfbe770a 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js @@ -1,7 +1,12 @@ +import * as spreadsheet from "@odoo/o-spreadsheet"; + import {Domain} from "@web/core/domain"; import {Many2XAutocomplete} from "@web/views/fields/relational_utils"; import {_t} from "@web/core/l10n/translation"; import {useService} from "@web/core/utils/hooks"; + +const {chartSidePanelComponentRegistry, chartSubtypeRegistry} = spreadsheet.registries; +const {PieChartDesignPanel} = spreadsheet.components; const {Component} = owl; export class OdooPanel extends Component { @@ -77,3 +82,83 @@ class OdooStackablePanel extends OdooPanel { } } OdooStackablePanel.template = "spreadsheet_oca.OdooStackablePanel"; + +chartSidePanelComponentRegistry + .add("odoo_line", { + configuration: OdooStackablePanel, + design: PieChartDesignPanel, + }) + .add("odoo_bar", { + configuration: OdooStackablePanel, + design: PieChartDesignPanel, + }) + .add("odoo_pie", { + configuration: OdooPanel, + design: PieChartDesignPanel, + }); + +chartSubtypeRegistry.add("odoo_line", { + matcher: (definition) => + definition.type === "odoo_line" && !definition.stacked && !definition.fillArea, + subtypeDefinition: {stacked: false, fillArea: false}, + displayName: _t("Line"), + chartSubtype: "odoo_line", + chartType: "odoo_line", + category: "line", + preview: "o-spreadsheet-ChartPreview.LINE_CHART", +}); +chartSubtypeRegistry.add("odoo_stacked_line", { + matcher: (definition) => + definition.type === "odoo_line" && definition.stacked && !definition.fillArea, + subtypeDefinition: {stacked: true, fillArea: false}, + displayName: _t("Stacked Line"), + chartSubtype: "odoo_stacked_line", + chartType: "odoo_line", + category: "line", + preview: "o-spreadsheet-ChartPreview.STACKED_LINE_CHART", +}); +chartSubtypeRegistry.add("odoo_area", { + matcher: (definition) => + definition.type === "odoo_line" && !definition.stacked && definition.fillArea, + subtypeDefinition: {stacked: false, fillArea: true}, + displayName: _t("Area"), + chartSubtype: "odoo_area", + chartType: "odoo_line", + category: "area", + preview: "o-spreadsheet-ChartPreview.AREA_CHART", +}); +chartSubtypeRegistry.add("odoo_stacked_area", { + matcher: (definition) => + definition.type === "odoo_line" && definition.stacked && definition.fillArea, + subtypeDefinition: {stacked: true, fillArea: true}, + displayName: _t("Stacked Area"), + chartSubtype: "odoo_stacked_area", + chartType: "odoo_line", + category: "area", + preview: "o-spreadsheet-ChartPreview.STACKED_AREA_CHART", +}); +chartSubtypeRegistry.add("odoo_bar", { + matcher: (definition) => definition.type === "odoo_bar" && !definition.stacked, + subtypeDefinition: {stacked: false}, + displayName: _t("Column"), + chartSubtype: "odoo_bar", + chartType: "odoo_bar", + category: "column", + preview: "o-spreadsheet-ChartPreview.COLUMN_CHART", +}); +chartSubtypeRegistry.add("odoo_stacked_bar", { + matcher: (definition) => definition.type === "odoo_bar" && definition.stacked, + subtypeDefinition: {stacked: true}, + displayName: _t("Stacked Column"), + chartSubtype: "odoo_stacked_bar", + chartType: "odoo_bar", + category: "column", + preview: "o-spreadsheet-ChartPreview.STACKED_COLUMN_CHART", +}); +chartSubtypeRegistry.add("odoo_pie", { + displayName: _t("Pie"), + chartSubtype: "odoo_pie", + chartType: "odoo_pie", + category: "pie", + preview: "o-spreadsheet-ChartPreview.PIE_CHART", +}); From 27b979b804e6be0907c57b1efdb9856d63cfdd91 Mon Sep 17 00:00:00 2001 From: Carlos Roca Date: Wed, 25 Feb 2026 08:56:10 +0100 Subject: [PATCH 087/100] [FIX] spreadsheet_oca: Use the correct graphs depending on the type of each one Before these changes, all existing chart types were displayed in the selector. With these changes, the table type is taken into account, whether it is inserted from Odoo or from the spreadsheet itself, to determine which chart types are usable and which are not. --- spreadsheet_oca/README.rst | 2 +- spreadsheet_oca/__manifest__.py | 2 +- spreadsheet_oca/i18n/es.po | 42 ++++++++++ spreadsheet_oca/i18n/fr.po | 42 ++++++++++ spreadsheet_oca/i18n/fr_FR.po | 42 ++++++++++ spreadsheet_oca/i18n/it.po | 63 ++++++++++----- spreadsheet_oca/i18n/nl.po | 42 ++++++++++ spreadsheet_oca/i18n/pt.po | 42 ++++++++++ spreadsheet_oca/i18n/spreadsheet_oca.pot | 42 ++++++++++ spreadsheet_oca/i18n/zh_CN.po | 42 ++++++++++ spreadsheet_oca/static/description/index.html | 2 +- .../src/spreadsheet/bundle/chart_panel.esm.js | 80 ++++++++++++------- 12 files changed, 392 insertions(+), 51 deletions(-) diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index 56c1beb0..2e48c04c 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/README.rst @@ -11,7 +11,7 @@ Spreadsheet Oca !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:c8a74e3809101635545a0644d7a03bdb4c4707494a3ee713763e8c4b71a167ab + !! source digest: sha256:4b7714132ef1376e4af8b24408b5cc9f53f236a0e8de446427507c71c11a09de !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index 80e58fa6..447aae78 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "18.0.1.2.0", + "version": "18.0.1.2.1", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", diff --git a/spreadsheet_oca/i18n/es.po b/spreadsheet_oca/i18n/es.po index 1c714dd7..c48ab2cd 100644 --- a/spreadsheet_oca/i18n/es.po +++ b/spreadsheet_oca/i18n/es.po @@ -106,6 +106,12 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Area" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -162,6 +168,12 @@ msgstr "Código" msgid "Color" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Column" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -447,6 +459,12 @@ msgstr "Última actualización el" msgid "Last updated at" msgstr "Última Actualización el" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Line" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -591,6 +609,12 @@ msgstr "Propietario" msgid "Ownership" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Pie" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -773,6 +797,24 @@ msgstr "" msgid "Stacked" msgstr "Apilados" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Area" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Column" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Line" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" diff --git a/spreadsheet_oca/i18n/fr.po b/spreadsheet_oca/i18n/fr.po index 6ec9aa07..cb6e1844 100644 --- a/spreadsheet_oca/i18n/fr.po +++ b/spreadsheet_oca/i18n/fr.po @@ -105,6 +105,12 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Area" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -161,6 +167,12 @@ msgstr "" msgid "Color" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Column" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -446,6 +458,12 @@ msgstr "Dernière mise à jour le" msgid "Last updated at" msgstr "Dernière mise à jour à" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Line" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -590,6 +608,12 @@ msgstr "Propriétaire" msgid "Ownership" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Pie" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -772,6 +796,24 @@ msgstr "" msgid "Stacked" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Area" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Column" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Line" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" diff --git a/spreadsheet_oca/i18n/fr_FR.po b/spreadsheet_oca/i18n/fr_FR.po index 474db899..052e7bd4 100644 --- a/spreadsheet_oca/i18n/fr_FR.po +++ b/spreadsheet_oca/i18n/fr_FR.po @@ -103,6 +103,12 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Area" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -159,6 +165,12 @@ msgstr "" msgid "Color" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Column" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -444,6 +456,12 @@ msgstr "" msgid "Last updated at" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Line" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -588,6 +606,12 @@ msgstr "" msgid "Ownership" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Pie" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -770,6 +794,24 @@ msgstr "" msgid "Stacked" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Area" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Column" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Line" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" diff --git a/spreadsheet_oca/i18n/it.po b/spreadsheet_oca/i18n/it.po index d14aa2f1..cec224fb 100644 --- a/spreadsheet_oca/i18n/it.po +++ b/spreadsheet_oca/i18n/it.po @@ -105,6 +105,12 @@ msgstr "In archivio" msgid "Are you sure you want to delete this list?" msgstr "Si è sicuri di voler cancellare questo elenco?" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Area" +msgstr "Area" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -161,6 +167,12 @@ msgstr "Codice" msgid "Color" msgstr "Colore" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Column" +msgstr "Colonna" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -448,6 +460,12 @@ msgstr "Ultimo aggiornamento il" msgid "Last updated at" msgstr "Ultimo aggiornamento il" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Line" +msgstr "Riga" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -592,6 +610,12 @@ msgstr "Proprietario" msgid "Ownership" msgstr "Proprietà" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Pie" +msgstr "Torta" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -774,6 +798,24 @@ msgstr "Immagine foglio di calcolo" msgid "Stacked" msgstr "In coda" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Area" +msgstr "Area riempita" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Column" +msgstr "Colonna riempita" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Line" +msgstr "Riga riempita" + #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" @@ -930,27 +972,6 @@ msgstr "gestione messaggio websocket" #~ msgid "Pivot name" #~ msgstr "Nome pivot" -#~ msgid "Area" -#~ msgstr "Area" - -#~ msgid "Column" -#~ msgstr "Colonna" - -#~ msgid "Line" -#~ msgstr "Riga" - -#~ msgid "Pie" -#~ msgstr "Torta" - -#~ msgid "Stacked Area" -#~ msgstr "Area riempita" - -#~ msgid "Stacked Column" -#~ msgstr "Colonna riempita" - -#~ msgid "Stacked Line" -#~ msgstr "Riga riempita" - #~ msgid "Add sheet to spreadsheet" #~ msgstr "Aggiungi scheda a foglIo di calcolo" diff --git a/spreadsheet_oca/i18n/nl.po b/spreadsheet_oca/i18n/nl.po index 271e1b8b..df275066 100644 --- a/spreadsheet_oca/i18n/nl.po +++ b/spreadsheet_oca/i18n/nl.po @@ -105,6 +105,12 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Area" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -161,6 +167,12 @@ msgstr "" msgid "Color" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Column" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -446,6 +458,12 @@ msgstr "Laatst bijgewerkt op" msgid "Last updated at" msgstr "Laatst bijgewerkt op" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Line" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -590,6 +608,12 @@ msgstr "Eigenaar" msgid "Ownership" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Pie" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -772,6 +796,24 @@ msgstr "" msgid "Stacked" msgstr "Gestapeld" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Area" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Column" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Line" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" diff --git a/spreadsheet_oca/i18n/pt.po b/spreadsheet_oca/i18n/pt.po index 3c1ddeb5..d963f461 100644 --- a/spreadsheet_oca/i18n/pt.po +++ b/spreadsheet_oca/i18n/pt.po @@ -105,6 +105,12 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Area" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -161,6 +167,12 @@ msgstr "Código" msgid "Color" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Column" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -446,6 +458,12 @@ msgstr "Última Actualização em" msgid "Last updated at" msgstr "Última Modificação a" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Line" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -590,6 +608,12 @@ msgstr "Dono" msgid "Ownership" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Pie" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -772,6 +796,24 @@ msgstr "" msgid "Stacked" msgstr "Empilhados" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Area" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Column" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Line" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index 20044d0d..1f4b2d52 100644 --- a/spreadsheet_oca/i18n/spreadsheet_oca.pot +++ b/spreadsheet_oca/i18n/spreadsheet_oca.pot @@ -102,6 +102,12 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Area" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -158,6 +164,12 @@ msgstr "" msgid "Color" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Column" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -443,6 +455,12 @@ msgstr "" msgid "Last updated at" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Line" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -587,6 +605,12 @@ msgstr "" msgid "Ownership" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Pie" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -769,6 +793,24 @@ msgstr "" msgid "Stacked" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Area" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Column" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Line" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" diff --git a/spreadsheet_oca/i18n/zh_CN.po b/spreadsheet_oca/i18n/zh_CN.po index f65d4138..b63dccd7 100644 --- a/spreadsheet_oca/i18n/zh_CN.po +++ b/spreadsheet_oca/i18n/zh_CN.po @@ -103,6 +103,12 @@ msgstr "" msgid "Are you sure you want to delete this list?" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Area" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" @@ -159,6 +165,12 @@ msgstr "" msgid "Color" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Column" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" @@ -444,6 +456,12 @@ msgstr "" msgid "Last updated at" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Line" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -588,6 +606,12 @@ msgstr "" msgid "Ownership" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Pie" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -770,6 +794,24 @@ msgstr "" msgid "Stacked" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Area" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Column" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Stacked Line" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "" diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html index e4994893..cba2ebe7 100644 --- a/spreadsheet_oca/static/description/index.html +++ b/spreadsheet_oca/static/description/index.html @@ -372,7 +372,7 @@

    Spreadsheet Oca

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

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

    This module adds a functionality for adding and editing Spreadsheets diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js index b6a1d23b..41407c51 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js @@ -1,41 +1,67 @@ import * as spreadsheet from "@odoo/o-spreadsheet"; import {patch} from "@web/core/utils/patch"; +import {onWillUpdateProps} from "@odoo/owl"; -const {chartRegistry} = spreadsheet.registries; -const {ChartPanel} = spreadsheet.components; -export function isOdooKey(code) { - return code.startsWith("odoo_"); -} +const {chartSubtypeRegistry} = spreadsheet.registries; +const {ChartTypePicker} = spreadsheet.components; -patch(ChartPanel.prototype, { - get chartTypes() { - return this.filterChartTypes(isOdooKey(this.getChartDefinition().type)); +const ODOO_PREFIX = "odoo_"; +const isOdooKey = (key) => key?.startsWith(ODOO_PREFIX); + +const groupByCategory = (items) => + items.reduce((acc, item) => { + (acc[item.category] ||= []).push(item); + return acc; + }, {}); + +const getFigureDefinition = (env, figureId) => + env.model.getters.getChartDefinition(figureId); + +patch(ChartTypePicker.prototype, { + setup() { + super.setup(); + const refresh = (figureId) => this.filterCategoriesChartType(figureId); + refresh(this.props.figureId); + onWillUpdateProps((nextProps) => refresh(nextProps.figureId)); }, - filterChartTypes(isOdoo) { - var result = {}; - for (const key of chartRegistry.getKeys()) { - if ((isOdoo && isOdooKey(key)) || (!isOdoo && !isOdooKey(key))) { - result[key] = chartRegistry.get(key).name; + getChartTypes(isOdoo) { + const result = {}; + for (const key of chartSubtypeRegistry.getKeys()) { + if (isOdoo === isOdooKey(key)) { + result[key] = chartSubtypeRegistry.get(key).name; } } return result; }, onTypeChange(type) { - if (isOdooKey(this.getChartDefinition().type)) { - const definition = { - stacked: false, - verticalAxisPosition: "left", - ...this.env.model.getters.getChartDefinition(this.figureId), - type, - }; - this.env.model.dispatch("UPDATE_CHART", { - definition, - id: this.figureId, - sheetId: this.env.model.getters.getActiveSheetId(), - }); - } else { - super.onTypeChange(type); + const {env} = this; + const figureId = this.props.figureId; + const current = getFigureDefinition(env, figureId); + if (!isOdooKey(current.type)) { + return super.onTypeChange(type); } + const newChartInfo = chartSubtypeRegistry.get(type); + const definition = { + verticalAxisPosition: "left", + ...current, + ...newChartInfo.subtypeDefinition, + type: newChartInfo.chartType, + }; + env.model.dispatch("UPDATE_CHART", { + definition, + id: figureId, + sheetId: env.model.getters.getActiveSheetId(), + }); + this.closePopover(); + }, + filterCategoriesChartType(figureId) { + const {env} = this; + const definition = getFigureDefinition(env, figureId); + const isOdoo = isOdooKey(definition.type); + const registryItems = chartSubtypeRegistry + .getAll() + .filter((item) => isOdoo === isOdooKey(item.chartType)); + this.chartTypeByCategories = groupByCategory(registryItems); }, }); From 711b718860b78e5a003b4e7db1eb0076acc6799c Mon Sep 17 00:00:00 2001 From: mymage Date: Wed, 25 Feb 2026 14:13:07 +0000 Subject: [PATCH 088/100] Translated using Weblate (Italian) Currently translated at 100.0% (160 of 160 strings) Translation: spreadsheet-18.0/spreadsheet-18.0-spreadsheet_oca Translate-URL: https://translation.odoo-community.org/projects/spreadsheet-18-0/spreadsheet-18-0-spreadsheet_oca/it/ --- spreadsheet_oca/i18n/it.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spreadsheet_oca/i18n/it.po b/spreadsheet_oca/i18n/it.po index cec224fb..1f27e635 100644 --- a/spreadsheet_oca/i18n/it.po +++ b/spreadsheet_oca/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-12-17 12:42+0000\n" +"PO-Revision-Date: 2026-02-25 17:09+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -14,7 +14,7 @@ msgstr "" "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" +"X-Generator: Weblate 5.15.2\n" #. module: spreadsheet_oca #: model:ir.model.constraint,message:spreadsheet_oca.constraint_spreadsheet_spreadsheet_tag_name_uniq @@ -632,13 +632,13 @@ msgstr "Trimestre" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 msgid "Re-insert Dynamic" -msgstr "" +msgstr "Reinserisci dinamico" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 msgid "Re-insert Static" -msgstr "" +msgstr "Reinserisci statico" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view From 6b0d8fb80e2a78a400833a5cc627455fecccb932 Mon Sep 17 00:00:00 2001 From: Carlos Roca Date: Mon, 2 Mar 2026 09:08:12 +0100 Subject: [PATCH 089/100] [FIX] spreadsheet_oca: Take care about variables on domain This commit fixes the problem reported in this issue: https://github.com/OCA/spreadsheet/issues/96 Before these changes, the domain was taking the processed domain value, so it was using the value for the logged-in user. For example, if the uid variable was used, it was replaced with the user's ID and thus passed that way to the spreadsheet domains. After these changes, the domain sent to the spreadsheet is the unprocessed domain, so the variables are preserved and remain fully usable. --- .../spreadsheet/bundle/filter_panel_datasources.esm.js | 2 +- .../static/src/spreadsheet/graph_controller.esm.js | 9 +++++---- .../static/src/spreadsheet/list_renderer.esm.js | 2 +- .../static/src/spreadsheet/pivot_controller.esm.js | 9 +++++---- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js index 4a2a0eda..3d6c4866 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js @@ -120,7 +120,7 @@ export class PivotPanelDisplay extends Component { editDomain() { this.dialog.add(DomainSelectorDialog, { resModel: this.store.definition.model, - domain: this.store.definition.domain, + domain: this.domain, readonly: false, isDebugMode: Boolean(this.env.debug), onConfirm: this.onSelectDomain.bind(this), diff --git a/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js b/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js index 04238fa6..4fe34251 100644 --- a/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js @@ -12,10 +12,11 @@ patch(GraphRenderer.prototype, { 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) - ), + metaData: this.model.metaData, + searchParams: { + ...this.model.searchParams, + domain: this.env.searchModel.domainString, + }, }, }, } diff --git a/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js b/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js index 9ef138f0..9cf5bd54 100644 --- a/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js @@ -32,7 +32,7 @@ patch(ListRenderer.prototype, { mode: "list", metaData: { model: model.resModel, - domain: model.domain, + domain: this.env.searchModel.domainString, orderBy: model.orderBy, context: omit( model.searchParams?.context || {}, diff --git a/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js index 101544c9..54e68e6f 100644 --- a/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js @@ -54,10 +54,11 @@ patch(PivotRenderer.prototype, { 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) - ), + metaData: this.model.metaData, + searchParams: { + ...this.model.searchParams, + domain: this.env.searchModel.domainString, + }, }, }, } From 2bd024a08e0d7f309c612e000ce6e81ca7a3a64c Mon Sep 17 00:00:00 2001 From: Carlos Roca Date: Wed, 25 Feb 2026 12:28:52 +0100 Subject: [PATCH 090/100] [FIX] spreadsheet_oca: Error linking chart to Odoo menu Steps to reproduce the error: 1. Set debug=assets 2. Add a chart to spreadsheet 3. In "Link to Odoo menu" section select a record An error will be thrown --- spreadsheet_oca/README.rst | 2 +- spreadsheet_oca/__manifest__.py | 2 +- spreadsheet_oca/i18n/es.po | 7 +++++++ spreadsheet_oca/i18n/fr.po | 7 +++++++ spreadsheet_oca/i18n/fr_FR.po | 7 +++++++ spreadsheet_oca/i18n/it.po | 7 +++++++ spreadsheet_oca/i18n/nl.po | 7 +++++++ spreadsheet_oca/i18n/pt.po | 7 +++++++ spreadsheet_oca/i18n/spreadsheet_oca.pot | 7 +++++++ spreadsheet_oca/i18n/zh_CN.po | 7 +++++++ spreadsheet_oca/static/description/index.html | 2 +- .../static/src/spreadsheet/bundle/chart_panels.esm.js | 10 +++------- .../static/src/spreadsheet/bundle/odoo_panels.esm.js | 10 +++------- 13 files changed, 65 insertions(+), 17 deletions(-) diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index 2e48c04c..559fd585 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/README.rst @@ -11,7 +11,7 @@ Spreadsheet Oca !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:4b7714132ef1376e4af8b24408b5cc9f53f236a0e8de446427507c71c11a09de + !! source digest: sha256:ad9a44dccad9feb67b1967b0ff5ce98f777ceb5c2bcff5fc84cc5fd1ff3056a8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index 447aae78..40642cce 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "18.0.1.2.1", + "version": "18.0.1.2.2", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", diff --git a/spreadsheet_oca/i18n/es.po b/spreadsheet_oca/i18n/es.po index c48ab2cd..25aa7e07 100644 --- a/spreadsheet_oca/i18n/es.po +++ b/spreadsheet_oca/i18n/es.po @@ -701,6 +701,13 @@ msgstr "" msgid "Save" msgstr "Guardar" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Select a menu..." +msgstr "" + #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number msgid "Select number of rows to duplicate row" diff --git a/spreadsheet_oca/i18n/fr.po b/spreadsheet_oca/i18n/fr.po index cb6e1844..e5d1f502 100644 --- a/spreadsheet_oca/i18n/fr.po +++ b/spreadsheet_oca/i18n/fr.po @@ -700,6 +700,13 @@ msgstr "" msgid "Save" msgstr "Enregistrer" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Select a menu..." +msgstr "" + #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number msgid "Select number of rows to duplicate row" diff --git a/spreadsheet_oca/i18n/fr_FR.po b/spreadsheet_oca/i18n/fr_FR.po index 052e7bd4..44885cc7 100644 --- a/spreadsheet_oca/i18n/fr_FR.po +++ b/spreadsheet_oca/i18n/fr_FR.po @@ -698,6 +698,13 @@ msgstr "" msgid "Save" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Select a menu..." +msgstr "" + #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number msgid "Select number of rows to duplicate row" diff --git a/spreadsheet_oca/i18n/it.po b/spreadsheet_oca/i18n/it.po index 1f27e635..0812e3cf 100644 --- a/spreadsheet_oca/i18n/it.po +++ b/spreadsheet_oca/i18n/it.po @@ -702,6 +702,13 @@ msgstr "Righe:" msgid "Save" msgstr "Salva" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Select a menu..." +msgstr "" + #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number msgid "Select number of rows to duplicate row" diff --git a/spreadsheet_oca/i18n/nl.po b/spreadsheet_oca/i18n/nl.po index df275066..808707ad 100644 --- a/spreadsheet_oca/i18n/nl.po +++ b/spreadsheet_oca/i18n/nl.po @@ -700,6 +700,13 @@ msgstr "" msgid "Save" msgstr "Opslaan" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Select a menu..." +msgstr "" + #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number msgid "Select number of rows to duplicate row" diff --git a/spreadsheet_oca/i18n/pt.po b/spreadsheet_oca/i18n/pt.po index d963f461..60afb816 100644 --- a/spreadsheet_oca/i18n/pt.po +++ b/spreadsheet_oca/i18n/pt.po @@ -700,6 +700,13 @@ msgstr "" msgid "Save" msgstr "Guardar" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Select a menu..." +msgstr "" + #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number msgid "Select number of rows to duplicate row" diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index 1f4b2d52..bdd92041 100644 --- a/spreadsheet_oca/i18n/spreadsheet_oca.pot +++ b/spreadsheet_oca/i18n/spreadsheet_oca.pot @@ -697,6 +697,13 @@ msgstr "" msgid "Save" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Select a menu..." +msgstr "" + #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number msgid "Select number of rows to duplicate row" diff --git a/spreadsheet_oca/i18n/zh_CN.po b/spreadsheet_oca/i18n/zh_CN.po index b63dccd7..1907403a 100644 --- a/spreadsheet_oca/i18n/zh_CN.po +++ b/spreadsheet_oca/i18n/zh_CN.po @@ -698,6 +698,13 @@ msgstr "" msgid "Save" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +msgid "Select a menu..." +msgstr "" + #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number msgid "Select number of rows to duplicate row" diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html index cba2ebe7..27a7cc16 100644 --- a/spreadsheet_oca/static/description/index.html +++ b/spreadsheet_oca/static/description/index.html @@ -372,7 +372,7 @@

    Spreadsheet Oca

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

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

    This module adds a functionality for adding and editing Spreadsheets diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js index 2142fa57..7f1977ff 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js @@ -19,19 +19,15 @@ const menuChartProps = () => ({ this.menus = useService("menu"); }, get menuProps() { - const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); - var result = { + return { fieldString: _t("Menu Items"), resModel: "ir.ui.menu", update: this.updateMenu.bind(this), activeActions: {}, getDomain: this.getDomain.bind(this), + placeholder: _t("Select a menu..."), + value: this.menuId ? this.menuId[1] : "", }; - if (menu) { - result.value = menu.name; - result.id = menu.id; - } - return result; }, getDomain() { diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js index dfbe770a..767c0143 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js @@ -14,19 +14,15 @@ export class OdooPanel extends Component { this.menus = useService("menu"); } get menuProps() { - const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); - var result = { + return { fieldString: _t("Menu Items"), resModel: "ir.ui.menu", update: this.updateMenu.bind(this), activeActions: {}, getDomain: this.getDomain.bind(this), + placeholder: _t("Select a menu..."), + value: this.menuId ? this.menuId[1] : "", }; - if (menu) { - result.value = menu.name; - result.id = menu.id; - } - return result; } getDomain() { const menus = this.menus From e9b8738664e91aad29ab9632e493f6ee08e8dc94 Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 3 Mar 2026 07:58:45 +0000 Subject: [PATCH 091/100] Translated using Weblate (Italian) Currently translated at 100.0% (161 of 161 strings) Translation: spreadsheet-18.0/spreadsheet-18.0-spreadsheet_oca Translate-URL: https://translation.odoo-community.org/projects/spreadsheet-18-0/spreadsheet-18-0-spreadsheet_oca/it/ --- spreadsheet_oca/README.rst | 2 +- spreadsheet_oca/__manifest__.py | 2 +- spreadsheet_oca/i18n/it.po | 4 ++-- spreadsheet_oca/static/description/index.html | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index 559fd585..5babde5d 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/README.rst @@ -11,7 +11,7 @@ Spreadsheet Oca !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:ad9a44dccad9feb67b1967b0ff5ce98f777ceb5c2bcff5fc84cc5fd1ff3056a8 + !! source digest: sha256:e2538062948707da20c2cc2aa0016f74cd1bf35985858388eef1c9750a1a9f62 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index 40642cce..be5be297 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "18.0.1.2.2", + "version": "18.0.1.2.3", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", diff --git a/spreadsheet_oca/i18n/it.po b/spreadsheet_oca/i18n/it.po index 0812e3cf..8e1049f5 100644 --- a/spreadsheet_oca/i18n/it.po +++ b/spreadsheet_oca/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-02-25 17:09+0000\n" +"PO-Revision-Date: 2026-03-03 10:45+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -707,7 +707,7 @@ msgstr "Salva" #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Select a menu..." -msgstr "" +msgstr "Selezionare un menu..." #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html index 27a7cc16..69ccb105 100644 --- a/spreadsheet_oca/static/description/index.html +++ b/spreadsheet_oca/static/description/index.html @@ -372,7 +372,7 @@

    Spreadsheet Oca

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

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

    This module adds a functionality for adding and editing Spreadsheets From 1e0047fc64499f30354bf5e3cb08c52f8804d3a9 Mon Sep 17 00:00:00 2001 From: Carlos Roca Date: Tue, 24 Mar 2026 08:14:23 +0100 Subject: [PATCH 092/100] [FIX] spreadsheet_oca: Error thrown when pivot is sorted When a pivot has a sort defined and the data of the pivot is opened an error is thrown because the data is not processed correctly. By doing this changes, we adapt the code to the new way of process the pivot data and the error does not being thrown anymore. --- spreadsheet_oca/README.rst | 2 +- spreadsheet_oca/__manifest__.py | 2 +- spreadsheet_oca/static/description/index.html | 2 +- .../bundle/filter_panel_datasources.esm.js | 11 ++++------- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index 5babde5d..d2edf6a8 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/README.rst @@ -11,7 +11,7 @@ Spreadsheet Oca !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:e2538062948707da20c2cc2aa0016f74cd1bf35985858388eef1c9750a1a9f62 + !! source digest: sha256:e1b1dcc71a503891f65b9c9523ef165e3354a691bc8e0e42c1a99623717324d2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index be5be297..5148e576 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "18.0.1.2.3", + "version": "18.0.1.2.4", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html index 69ccb105..83a78d8e 100644 --- a/spreadsheet_oca/static/description/index.html +++ b/spreadsheet_oca/static/description/index.html @@ -372,7 +372,7 @@

    Spreadsheet Oca

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

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

    This module adds a functionality for adding and editing Spreadsheets diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js index 3d6c4866..a8081f6b 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js @@ -101,13 +101,10 @@ export class PivotPanelDisplay extends Component { const sortedColumn = this.store.definition.sortedColumn; const orderTranslate = sortedColumn.order === "asc" ? _t("ascending") : _t("descending"); - let label = null; - if (sortedColumn.measure) { - const measure = this.PivotDataSource.getMeasure(sortedColumn.measure); - label = measure ? measure.displayName : sortedColumn.measure; - } else if (sortedColumn.groupBy) { - label = this.PivotDataSource.getFormattedGroupBy(sortedColumn.groupBy); - } + const measure = this.store.definition.measures.find( + (m) => m.fieldName === sortedColumn.measure + ); + const label = this.PivotDataSource.getMeasure(measure.id).displayName; return `${label} (${orderTranslate})`; } get lastUpdate() { From 08e12d8c96c0bc2e97bb795167531640152a26c1 Mon Sep 17 00:00:00 2001 From: Carlos Roca Date: Thu, 26 Mar 2026 12:09:32 +0100 Subject: [PATCH 093/100] [IMP] spreadsheet_oca: Add new features to relation filters With this changes we are adding: 1. Include children records when it is possible 2. Add default values for the filter 3. If the model is for users allow set the current user by default 4. Allow to restrict values with a domain --- spreadsheet_oca/README.rst | 2 +- spreadsheet_oca/__manifest__.py | 2 +- spreadsheet_oca/i18n/es.po | 29 ++++++ spreadsheet_oca/i18n/fr.po | 29 ++++++ spreadsheet_oca/i18n/fr_FR.po | 29 ++++++ spreadsheet_oca/i18n/it.po | 29 ++++++ spreadsheet_oca/i18n/nl.po | 29 ++++++ spreadsheet_oca/i18n/pt.po | 29 ++++++ spreadsheet_oca/i18n/spreadsheet_oca.pot | 29 ++++++ spreadsheet_oca/i18n/zh_CN.po | 29 ++++++ spreadsheet_oca/models/__init__.py | 1 + spreadsheet_oca/models/ir_model.py | 16 ++++ spreadsheet_oca/static/description/index.html | 2 +- .../src/spreadsheet/bundle/filter.esm.js | 94 ++++++++++++++++--- .../src/spreadsheet/bundle/spreadsheet.xml | 78 +++++++++++++-- 15 files changed, 401 insertions(+), 26 deletions(-) create mode 100644 spreadsheet_oca/models/ir_model.py diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index d2edf6a8..3f2808b9 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/README.rst @@ -11,7 +11,7 @@ Spreadsheet Oca !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:e1b1dcc71a503891f65b9c9523ef165e3354a691bc8e0e42c1a99623717324d2 + !! source digest: sha256:afa8556b48ef425ac88f6fa7b69a9f5d76aaef94958f9ce0e14e0efd97024dc0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index 5148e576..782aaeb7 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "18.0.1.2.4", + "version": "18.0.1.3.0", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", diff --git a/spreadsheet_oca/i18n/es.po b/spreadsheet_oca/i18n/es.po index 25aa7e07..43fe0eb4 100644 --- a/spreadsheet_oca/i18n/es.po +++ b/spreadsheet_oca/i18n/es.po @@ -123,6 +123,12 @@ msgstr "" msgid "Automatically filter on the current period" msgstr "Filtrar automáticamente en el período actual" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Automatically filter on the current user" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__badge_image msgid "Badge Background" @@ -411,6 +417,12 @@ msgstr "Importar Pivot" msgid "Import data to spreadsheet" msgstr "Importar datos a hoja de cálculo" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Include children" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -511,6 +523,11 @@ msgstr "Modo" msgid "Model" msgstr "Modelo" +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_model +msgid "Models" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -615,6 +632,12 @@ msgstr "" msgid "Pie" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Possible values" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -688,6 +711,12 @@ msgstr "Res" msgid "Responsible User" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Restrict values with a domain" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 diff --git a/spreadsheet_oca/i18n/fr.po b/spreadsheet_oca/i18n/fr.po index e5d1f502..1fb8857f 100644 --- a/spreadsheet_oca/i18n/fr.po +++ b/spreadsheet_oca/i18n/fr.po @@ -122,6 +122,12 @@ msgstr "" msgid "Automatically filter on the current period" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Automatically filter on the current user" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__badge_image msgid "Badge Background" @@ -410,6 +416,12 @@ msgstr "" msgid "Import data to spreadsheet" msgstr "Importer des données au tableur" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Include children" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -510,6 +522,11 @@ msgstr "" msgid "Model" msgstr "Modèle" +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_model +msgid "Models" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -614,6 +631,12 @@ msgstr "" msgid "Pie" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Possible values" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -687,6 +710,12 @@ msgstr "" msgid "Responsible User" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Restrict values with a domain" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 diff --git a/spreadsheet_oca/i18n/fr_FR.po b/spreadsheet_oca/i18n/fr_FR.po index 44885cc7..9db7709b 100644 --- a/spreadsheet_oca/i18n/fr_FR.po +++ b/spreadsheet_oca/i18n/fr_FR.po @@ -120,6 +120,12 @@ msgstr "" msgid "Automatically filter on the current period" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Automatically filter on the current user" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__badge_image msgid "Badge Background" @@ -408,6 +414,12 @@ msgstr "" msgid "Import data to spreadsheet" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Include children" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -508,6 +520,11 @@ msgstr "" msgid "Model" msgstr "" +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_model +msgid "Models" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -612,6 +629,12 @@ msgstr "" msgid "Pie" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Possible values" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -685,6 +708,12 @@ msgstr "" msgid "Responsible User" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Restrict values with a domain" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 diff --git a/spreadsheet_oca/i18n/it.po b/spreadsheet_oca/i18n/it.po index 8e1049f5..0ad3a5a9 100644 --- a/spreadsheet_oca/i18n/it.po +++ b/spreadsheet_oca/i18n/it.po @@ -122,6 +122,12 @@ msgstr "Conteggio allegati" msgid "Automatically filter on the current period" msgstr "Filtra automaticamente sul periodo attuale" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Automatically filter on the current user" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__badge_image msgid "Badge Background" @@ -412,6 +418,12 @@ msgstr "Importa pivot" msgid "Import data to spreadsheet" msgstr "Importa dati nel foglio di calcolo" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Include children" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -512,6 +524,11 @@ msgstr "Modo" msgid "Model" msgstr "Modello" +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_model +msgid "Models" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -616,6 +633,12 @@ msgstr "Proprietà" msgid "Pie" msgstr "Torta" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Possible values" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -689,6 +712,12 @@ msgstr "Res" msgid "Responsible User" msgstr "Utente responsabile" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Restrict values with a domain" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 diff --git a/spreadsheet_oca/i18n/nl.po b/spreadsheet_oca/i18n/nl.po index 808707ad..c87814ca 100644 --- a/spreadsheet_oca/i18n/nl.po +++ b/spreadsheet_oca/i18n/nl.po @@ -122,6 +122,12 @@ msgstr "" msgid "Automatically filter on the current period" msgstr "Automatisch filteren op de huidige periode" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Automatically filter on the current user" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__badge_image msgid "Badge Background" @@ -410,6 +416,12 @@ msgstr "Importeer draaipunt" msgid "Import data to spreadsheet" msgstr "Gegevens importeren naar spreadsheet" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Include children" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -510,6 +522,11 @@ msgstr "" msgid "Model" msgstr "" +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_model +msgid "Models" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -614,6 +631,12 @@ msgstr "" msgid "Pie" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Possible values" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -687,6 +710,12 @@ msgstr "" msgid "Responsible User" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Restrict values with a domain" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 diff --git a/spreadsheet_oca/i18n/pt.po b/spreadsheet_oca/i18n/pt.po index 60afb816..4ac81b98 100644 --- a/spreadsheet_oca/i18n/pt.po +++ b/spreadsheet_oca/i18n/pt.po @@ -122,6 +122,12 @@ msgstr "" msgid "Automatically filter on the current period" msgstr "Filtrar automaticamente no período atual" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Automatically filter on the current user" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__badge_image msgid "Badge Background" @@ -410,6 +416,12 @@ msgstr "Importar Pivô" msgid "Import data to spreadsheet" msgstr "Importar dados para a folha de cálculo" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Include children" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -510,6 +522,11 @@ msgstr "Modo" msgid "Model" msgstr "Modelo" +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_model +msgid "Models" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -614,6 +631,12 @@ msgstr "" msgid "Pie" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Possible values" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -687,6 +710,12 @@ msgstr "Res" msgid "Responsible User" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Restrict values with a domain" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index bdd92041..e5a89eaa 100644 --- a/spreadsheet_oca/i18n/spreadsheet_oca.pot +++ b/spreadsheet_oca/i18n/spreadsheet_oca.pot @@ -119,6 +119,12 @@ msgstr "" msgid "Automatically filter on the current period" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Automatically filter on the current user" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__badge_image msgid "Badge Background" @@ -407,6 +413,12 @@ msgstr "" msgid "Import data to spreadsheet" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Include children" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -507,6 +519,11 @@ msgstr "" msgid "Model" msgstr "" +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_model +msgid "Models" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -611,6 +628,12 @@ msgstr "" msgid "Pie" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Possible values" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -684,6 +707,12 @@ msgstr "" msgid "Responsible User" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Restrict values with a domain" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 diff --git a/spreadsheet_oca/i18n/zh_CN.po b/spreadsheet_oca/i18n/zh_CN.po index 1907403a..ed29c542 100644 --- a/spreadsheet_oca/i18n/zh_CN.po +++ b/spreadsheet_oca/i18n/zh_CN.po @@ -120,6 +120,12 @@ msgstr "" msgid "Automatically filter on the current period" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Automatically filter on the current user" +msgstr "" + #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__badge_image msgid "Badge Background" @@ -408,6 +414,12 @@ msgstr "" msgid "Import data to spreadsheet" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Include children" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -508,6 +520,11 @@ msgstr "" msgid "Model" msgstr "" +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_model +msgid "Models" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 @@ -612,6 +629,12 @@ msgstr "" msgid "Pie" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Possible values" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 @@ -685,6 +708,12 @@ msgstr "" msgid "Responsible User" msgstr "" +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +msgid "Restrict values with a domain" +msgstr "" + #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 diff --git a/spreadsheet_oca/models/__init__.py b/spreadsheet_oca/models/__init__.py index c5ec2360..3e07c12a 100644 --- a/spreadsheet_oca/models/__init__.py +++ b/spreadsheet_oca/models/__init__.py @@ -1,3 +1,4 @@ +from . import ir_model from . import spreadsheet_abstract from . import spreadsheet_spreadsheet_tag from . import spreadsheet_spreadsheet diff --git a/spreadsheet_oca/models/ir_model.py b/spreadsheet_oca/models/ir_model.py new file mode 100644 index 00000000..78b452d4 --- /dev/null +++ b/spreadsheet_oca/models/ir_model.py @@ -0,0 +1,16 @@ +# Copyright 2026 Tecnativa - Carlos Roca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class IrModel(models.Model): + _inherit = "ir.model" + + @api.model + def has_parent_relation(self, model_name): + """Return if the model has a parent relation.""" + model = self.env.get(model_name) + if model is None or not model.has_access("read"): + return False + return model._parent_name in model._fields diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html index 83a78d8e..877f077a 100644 --- a/spreadsheet_oca/static/description/index.html +++ b/spreadsheet_oca/static/description/index.html @@ -372,7 +372,7 @@

    Spreadsheet Oca

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

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

    This module adds a functionality for adding and editing Spreadsheets diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js index a5fabc63..799faf37 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js @@ -1,10 +1,15 @@ import * as spreadsheet from "@odoo/o-spreadsheet"; import {Component, onWillStart, useState} from "@odoo/owl"; - +import {Domain} from "@web/core/domain"; +import {DomainSelector} from "@web/core/domain_selector/domain_selector"; +import {DomainSelectorDialog} from "@web/core/domain_selector_dialog/domain_selector_dialog"; import {FilterValue} from "@spreadsheet/global_filters/components/filter_value/filter_value"; import {ModelFieldSelector} from "@web/core/model_field_selector/model_field_selector"; import {ModelSelector} from "@web/core/model_selector/model_selector"; +import {MultiRecordSelector} from "@web/core/record_selectors/multi_record_selector"; import {RELATIVE_DATE_RANGE_TYPES} from "@spreadsheet/helpers/constants"; +const {Checkbox} = spreadsheet.components; +import {user} from "@web/core/user"; import {_t} from "@web/core/l10n/translation"; import {globalFiltersFieldMatchers} from "@spreadsheet/global_filters/plugins/global_filters_core_plugin"; @@ -63,25 +68,42 @@ sidePanelRegistry.add("FilterPanel", { export class EditFilterPanel extends Component { setup() { - this.filterId = this.props.filter; + this.filterId = this.props.filter.id; this.orm = useService("orm"); + this.nameService = useService("name"); + this.dialog = useService("dialog"); this.state = useState({ label: this.props.filter.label, type: this.props.filter.type, - defaultValue: this.props.filter.defaultValue, + defaultValue: this.props.filter.defaultValue || [], + defaultValueDisplayNames: this.props.filter.defaultValueDisplayNames || [], rangeType: this.props.filter.rangeType || "year", - modelName: {technical: this.props.filter.modelName, label: null}, + modelData: {technical: this.props.filter.modelName, label: null}, objects: {}, + includeChildren: this.props.filter.includeChildren, + domainOfAllowedValues: this.props.filter.domainOfAllowedValues, + valuesRestricted: Boolean(this.props.filter.domainOfAllowedValues?.length), }); this.relativeDateRangeTypes = RELATIVE_DATE_RANGE_TYPES; onWillStart(this.willStart.bind(this)); } async willStart() { - if (this.state.modelName.technical !== undefined) { + if (this.state.modelData.technical !== undefined) { + const technicalName = this.state.modelData.technical; const modelLabel = await this.orm.call("ir.model", "display_name_for", [ - [this.state.modelName.technical], + [technicalName], ]); - this.state.modelName.label = modelLabel[0] && modelLabel[0].display_name; + this.state.modelData.label = modelLabel[0] && modelLabel[0].display_name; + if (this.state.includeChildren) { + this.state.modelData.hasParentRelation = true; + } else { + const hasParentRelation = await this.orm.call( + "ir.model", + "has_parent_relation", + [technicalName] + ); + this.state.modelData.hasParentRelation = hasParentRelation; + } } var ModelFields = []; for (var [objectType, objectClass] of Object.entries( @@ -132,9 +154,46 @@ export class EditFilterPanel extends Component { onChangeFieldMatchOffset(object, ev) { this.state.objects[object.id].fieldMatch.offset = parseInt(ev.target.value, 10); } - onModelSelected(ev) { - this.state.modelName.technical = ev.technical; - this.state.modelName.label = ev.label; + async onModelSelected(ev) { + this.state.modelData.technical = ev.technical; + this.state.modelData.label = ev.label; + this.state.modelData.hasParentRelation = await this.orm.call( + "ir.model", + "has_parent_relation", + [ev.technical] + ); + this.state.domainOfAllowedValues = []; + } + async onRecordsSelected(resIds) { + const defaultValueDisplayNames = await this.nameService.loadDisplayNames( + this.state.modelData.technical, + resIds + ); + this.state.defaultValue = resIds; + this.state.defaultValueDisplayNames = Object.values(defaultValueDisplayNames); + } + onUpdateDomain(domain) { + this.state.domainOfAllowedValues = domain; + } + getCorrectDomain() { + const domain = this.state.domainOfAllowedValues; + if (domain) { + return new Domain(domain).toList(user.context); + } + return []; + } + changeDomainRestriction(value) { + this.state.valuesRestricted = value; + this.state.domainOfAllowedValues = []; + } + editDomain() { + this.dialog.add(DomainSelectorDialog, { + resModel: this.state.modelData.technical, + domain: this.getCorrectDomain(), + readonly: false, + isDebugMode: Boolean(this.env.debug), + onConfirm: this.onUpdateDomain.bind(this), + }); } onDateRangeChange(ev) { this.state.rangeType = ev.target.value; @@ -148,10 +207,13 @@ export class EditFilterPanel extends Component { const filter = { id: this.props.filter.id || uuidGenerator.uuidv4(), type: this.state.type, - label: this.state.label, + label: this.state.label || "", defaultValue: this.state.defaultValue, + defaultValueDisplayNames: this.state.defaultValueDisplayNames, rangeType: this.state.rangeType, - modelName: this.state.modelName.technical, + modelName: this.state.modelData.technical, + includeChildren: this.state.includeChildren, + domainOfAllowedValues: this.state.domainOfAllowedValues, }; const filterMatching = {}; Object.values(this.state.objects).forEach((object) => { @@ -227,7 +289,13 @@ export class EditFilterPanel extends Component { } EditFilterPanel.template = "spreadsheet_oca.EditFilterPanel"; -EditFilterPanel.components = {ModelSelector, ModelFieldSelector}; +EditFilterPanel.components = { + Checkbox, + DomainSelector, + ModelSelector, + ModelFieldSelector, + MultiRecordSelector, +}; sidePanelRegistry.add("EditFilterPanel", { title: "Edit Filter", diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml index bd90b950..40110bcd 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml @@ -243,17 +243,75 @@ t-model="state.defaultValue" />

    - -
    -
    Related model
    -
    - +
    +
    Related model
    +
    + +
    +
    -
    + +
    +
    Default value
    +
    + +
    +
    + +
    +
    +
    +
    Possible values
    +
    + +
    + + + + +
    +
    +
    -
    +
    From f3e6ed466ad3641eb0ed17b1d3878342054473d6 Mon Sep 17 00:00:00 2001 From: mymage Date: Wed, 8 Apr 2026 10:22:29 +0000 Subject: [PATCH 094/100] Translated using Weblate (Italian) Currently translated at 100.0% (166 of 166 strings) Translation: spreadsheet-18.0/spreadsheet-18.0-spreadsheet_oca Translate-URL: https://translation.odoo-community.org/projects/spreadsheet-18-0/spreadsheet-18-0-spreadsheet_oca/it/ --- spreadsheet_oca/i18n/it.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spreadsheet_oca/i18n/it.po b/spreadsheet_oca/i18n/it.po index 0ad3a5a9..b5cfa2b6 100644 --- a/spreadsheet_oca/i18n/it.po +++ b/spreadsheet_oca/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-03-03 10:45+0000\n" +"PO-Revision-Date: 2026-04-08 12:45+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -126,7 +126,7 @@ msgstr "Filtra automaticamente sul periodo attuale" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Automatically filter on the current user" -msgstr "" +msgstr "Filtra automaticamente sull'utente corrente" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__badge_image @@ -422,7 +422,7 @@ msgstr "Importa dati nel foglio di calcolo" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Include children" -msgstr "" +msgstr "Includi figli" #. module: spreadsheet_oca #. odoo-javascript @@ -527,7 +527,7 @@ msgstr "Modello" #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_ir_model msgid "Models" -msgstr "" +msgstr "Modelli" #. module: spreadsheet_oca #. odoo-javascript @@ -637,7 +637,7 @@ msgstr "Torta" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Possible values" -msgstr "" +msgstr "Valori possibili" #. module: spreadsheet_oca #. odoo-javascript @@ -716,7 +716,7 @@ msgstr "Utente responsabile" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Restrict values with a domain" -msgstr "" +msgstr "Restrizione valori con dominio" #. module: spreadsheet_oca #. odoo-javascript From 211ac795bd51f0bd402a4c6bfc6e7a2728f05930 Mon Sep 17 00:00:00 2001 From: alexmorel-tecnativa Date: Fri, 10 Apr 2026 13:12:34 +0000 Subject: [PATCH 095/100] Translated using Weblate (Spanish) Currently translated at 59.0% (98 of 166 strings) Translation: spreadsheet-18.0/spreadsheet-18.0-spreadsheet_oca Translate-URL: https://translation.odoo-community.org/projects/spreadsheet-18-0/spreadsheet-18-0-spreadsheet_oca/es/ --- spreadsheet_oca/i18n/es.po | 136 +++++++++++++++++++------------------ 1 file changed, 69 insertions(+), 67 deletions(-) diff --git a/spreadsheet_oca/i18n/es.po b/spreadsheet_oca/i18n/es.po index 43fe0eb4..62de7641 100644 --- a/spreadsheet_oca/i18n/es.po +++ b/spreadsheet_oca/i18n/es.po @@ -7,51 +7,51 @@ msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-09-03 11:51+0000\n" -"PO-Revision-Date: 2024-09-03 13:54+0200\n" -"Last-Translator: \n" +"PO-Revision-Date: 2026-04-10 18:45+0000\n" +"Last-Translator: alexmorel-tecnativa \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" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" #. module: spreadsheet_oca #: model:ir.model.constraint,message:spreadsheet_oca.constraint_spreadsheet_spreadsheet_tag_name_uniq msgid "A tag with the same name already exists." -msgstr "" +msgstr "Ya existe una etiqueta con el mismo nombre." #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_needaction msgid "Action Needed" -msgstr "" +msgstr "Acción requerida" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__active #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__active msgid "Active" -msgstr "" +msgstr "Activo" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_ids msgid "Activities" -msgstr "" +msgstr "Actividades" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_exception_decoration msgid "Activity Exception Decoration" -msgstr "" +msgstr "Decoración de excepción de actividad" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "Activity State" -msgstr "" +msgstr "Estado de la actividad" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_type_icon msgid "Activity Type Icon" -msgstr "" +msgstr "Icono del tipo de actividad" #. module: spreadsheet_oca #. odoo-javascript @@ -75,7 +75,7 @@ msgstr "Añadir texto" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 msgid "Add to spreadesheet" -msgstr "" +msgstr "Añadir a hoja de cálculo" #. module: spreadsheet_oca #. odoo-javascript @@ -98,24 +98,24 @@ msgstr "Después del siguiente" #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_kanban_view #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_search_view msgid "Archived" -msgstr "" +msgstr "Archivado" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 msgid "Are you sure you want to delete this list?" -msgstr "" +msgstr "Está seguro de que desea eliminar esta lista?" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Area" -msgstr "" +msgstr "Área" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" -msgstr "" +msgstr "Número de adjuntos" #. module: spreadsheet_oca #. odoo-javascript @@ -127,12 +127,12 @@ msgstr "Filtrar automáticamente en el período actual" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Automatically filter on the current user" -msgstr "" +msgstr "Filtrar automáticamente por el usuario actual" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__badge_image msgid "Badge Background" -msgstr "" +msgstr "Fondo de la insignia" #. module: spreadsheet_oca #. odoo-javascript @@ -143,7 +143,7 @@ msgstr "Antes del anterior" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_be_dynamic msgid "Can Be Dynamic" -msgstr "" +msgstr "Puede ser dinámico" #. module: spreadsheet_oca #. odoo-javascript @@ -172,13 +172,13 @@ msgstr "Código" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_tag__color msgid "Color" -msgstr "" +msgstr "Color" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Column" -msgstr "" +msgstr "Columna" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands @@ -188,23 +188,23 @@ msgstr "Comandos" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id msgid "Company" -msgstr "" +msgstr "Compañía" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 msgid "Comparisons in pivot are not supported" -msgstr "" +msgstr "Las comparaciones en Pivot no están soportadas" #. module: spreadsheet_oca #: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_configuration_menu msgid "Configuration" -msgstr "" +msgstr "Configuración" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view msgid "Context" -msgstr "" +msgstr "Contexto" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_ids @@ -214,7 +214,7 @@ msgstr "Colaboradores" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_group_ids msgid "Contributors Groups" -msgstr "" +msgstr "Grupos de colaboradores" #. module: spreadsheet_oca #: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_new @@ -245,7 +245,7 @@ msgstr "Creado el" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 msgid "Currency" -msgstr "" +msgstr "Moneda" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__datasource_name @@ -263,7 +263,7 @@ msgstr "Valor por defecto" #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_kanban_view msgid "Delete" -msgstr "" +msgstr "Eliminar" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name @@ -291,7 +291,7 @@ msgstr "Descargar XLSX" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 msgid "Duplicated groupbys in pivot are not supported" -msgstr "" +msgstr "Los agrupamientos duplicados en Pivot no son compatibles" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_rows @@ -332,23 +332,23 @@ msgstr "Filtros" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_follower_ids msgid "Followers" -msgstr "" +msgstr "Seguidores" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_partner_ids msgid "Followers (Partners)" -msgstr "" +msgstr "Seguidores (Contactos)" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_type_icon msgid "Font awesome icon e.g. fa-tasks" -msgstr "" +msgstr "Icono de Font Awesome, por ejemplo “fa-tasks”" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 msgid "From / To" -msgstr "" +msgstr "De / A" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__group_ids @@ -358,7 +358,7 @@ msgstr "Agrupado por" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__has_message msgid "Has Message" -msgstr "" +msgstr "Tiene mensaje" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__id @@ -373,22 +373,22 @@ msgstr "ID" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_exception_icon msgid "Icon" -msgstr "" +msgstr "Icono" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_exception_icon msgid "Icon to indicate an exception activity." -msgstr "" +msgstr "Icono para indicar una actividad con excepción." #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__message_needaction msgid "If checked, new messages require your attention." -msgstr "" +msgstr "Si está marcado, los nuevos mensajes requieren su atención." #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__message_has_error msgid "If checked, some messages have a delivery error." -msgstr "" +msgstr "Si está marcado, algunos mensajes presentan un error de entrega." #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id @@ -396,6 +396,8 @@ msgid "" "If set, the spreadsheet will be available only if this company is in the " "current companies." msgstr "" +"Si se establece, la hoja de cálculo solo estará disponible si esta compañía " +"está entre las compañías actuales." #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__import_data @@ -421,18 +423,18 @@ msgstr "Importar datos a hoja de cálculo" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Include children" -msgstr "" +msgstr "Incluir hijos" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Insert list" -msgstr "" +msgstr "Insertar lista" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_is_follower msgid "Is Follower" -msgstr "" +msgstr "Es seguidor" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__is_tree @@ -475,7 +477,7 @@ msgstr "Última Actualización el" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Line" -msgstr "" +msgstr "Línea" #. module: spreadsheet_oca #. odoo-javascript @@ -499,17 +501,17 @@ msgstr "Administrador" #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Menu Items" -msgstr "" +msgstr "Elementos del menú" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_has_error msgid "Message Delivery error" -msgstr "" +msgstr "Error en la entrega del mensaje" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_ids msgid "Messages" -msgstr "" +msgstr "Mensajes" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode_id @@ -526,7 +528,7 @@ msgstr "Modelo" #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_ir_model msgid "Models" -msgstr "" +msgstr "Modelos" #. module: spreadsheet_oca #. odoo-javascript @@ -538,17 +540,17 @@ msgstr "Mes" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 msgid "Month / Quarter" -msgstr "" +msgstr "Mes / Trimestre" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__my_activity_date_deadline msgid "My Activity Deadline" -msgstr "" +msgstr "Fecha límite de mi actividad" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_search_view msgid "My Sheets" -msgstr "" +msgstr "Mis hojas" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__name @@ -568,17 +570,17 @@ msgstr "Siguiente" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_date_deadline msgid "Next Activity Deadline" -msgstr "" +msgstr "Fecha límite de la siguiente actividad" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_summary msgid "Next Activity Summary" -msgstr "" +msgstr "Fecha límite de la siguiente actividad" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_type_id msgid "Next Activity Type" -msgstr "" +msgstr "Tipo de la siguiente actividad" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__next_revision_id @@ -594,22 +596,22 @@ msgstr "Número de filas" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_needaction_counter msgid "Number of Actions" -msgstr "" +msgstr "Número de acciones" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_has_error_counter msgid "Number of errors" -msgstr "" +msgstr "Número de errores" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__message_needaction_counter msgid "Number of messages requiring action" -msgstr "" +msgstr "Número de mensajes que requieren acción" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__message_has_error_counter msgid "Number of messages with delivery error" -msgstr "" +msgstr "Número de mensajes con error en la entrega" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view @@ -624,19 +626,19 @@ msgstr "Propietario" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view msgid "Ownership" -msgstr "" +msgstr "Propiedad" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Pie" -msgstr "" +msgstr "Circular" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Possible values" -msgstr "" +msgstr "Valores posibles" #. module: spreadsheet_oca #. odoo-javascript @@ -654,18 +656,18 @@ msgstr "Trimestre" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 msgid "Re-insert Dynamic" -msgstr "" +msgstr "Reinsertar dinámico" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 msgid "Re-insert Static" -msgstr "" +msgstr "Reinsertar estático" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view msgid "Read Access" -msgstr "" +msgstr "Acceso de lectura" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_ids @@ -675,7 +677,7 @@ msgstr "Lectores" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_group_ids msgid "Readers Groups" -msgstr "" +msgstr "Grupos con acceso de lectura" #. module: spreadsheet_oca #. odoo-javascript @@ -709,19 +711,19 @@ msgstr "Res" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_user_id msgid "Responsible User" -msgstr "" +msgstr "Usuario responsable" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Restrict values with a domain" -msgstr "" +msgstr "Restringir los valores mediante un dominio" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Rows:" -msgstr "" +msgstr "Filas:" #. module: spreadsheet_oca #. odoo-javascript @@ -735,7 +737,7 @@ msgstr "Guardar" #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Select a menu..." -msgstr "" +msgstr "Seleccione un menú..." #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number From af74bc0a3bd2a782ec83a62dbc39059f3c421c58 Mon Sep 17 00:00:00 2001 From: Ed-Spain Date: Mon, 13 Apr 2026 07:42:33 +0000 Subject: [PATCH 096/100] Translated using Weblate (Spanish) Currently translated at 100.0% (166 of 166 strings) Translation: spreadsheet-18.0/spreadsheet-18.0-spreadsheet_oca Translate-URL: https://translation.odoo-community.org/projects/spreadsheet-18-0/spreadsheet-18-0-spreadsheet_oca/es/ --- spreadsheet_oca/i18n/es.po | 50 ++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/spreadsheet_oca/i18n/es.po b/spreadsheet_oca/i18n/es.po index 62de7641..dcf11467 100644 --- a/spreadsheet_oca/i18n/es.po +++ b/spreadsheet_oca/i18n/es.po @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-09-03 11:51+0000\n" -"PO-Revision-Date: 2026-04-10 18:45+0000\n" -"Last-Translator: alexmorel-tecnativa \n" +"PO-Revision-Date: 2026-04-13 07:43+0000\n" +"Last-Translator: Ed-Spain \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" @@ -439,7 +439,7 @@ msgstr "Es seguidor" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__is_tree msgid "Is Tree" -msgstr "" +msgstr "Es árbol" #. module: spreadsheet_oca #. odoo-javascript @@ -758,13 +758,13 @@ msgstr "Revisión del servidor" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 msgid "Settings" -msgstr "" +msgstr "Ajustes" #. module: spreadsheet_oca #. odoo-python #: code:addons/spreadsheet_oca/models/spreadsheet_abstract.py:0 msgid "Sheet1" -msgstr "" +msgstr "Hoja1" #. module: spreadsheet_oca #. odoo-javascript @@ -799,7 +799,7 @@ msgstr "Revisión de hoja de cálculo" #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_tag msgid "Spreadsheet Tag" -msgstr "" +msgstr "Etiqueta Hoja de Cálculo" #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_abstract @@ -810,7 +810,7 @@ msgstr "Hoja de cálculo abstracta para herencia" #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_binary_data #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_binary_data msgid "Spreadsheet file" -msgstr "" +msgstr "Fichero Hoja de Cálculo" #. module: spreadsheet_oca #: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_act_window @@ -822,12 +822,12 @@ msgstr "Hojas de cálculo" #: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_tags_act_window #: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_tag_menu msgid "Spreadsheets Tags" -msgstr "" +msgstr "Etiquetas Hojas de Cálculo" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_kanban_view msgid "Spreasheet Image" -msgstr "" +msgstr "Imagen Hoja de Cálculo" #. module: spreadsheet_oca #. odoo-javascript @@ -839,19 +839,19 @@ msgstr "Apilados" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Stacked Area" -msgstr "" +msgstr "Área apilada" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Stacked Column" -msgstr "" +msgstr "Columna apilada" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Stacked Line" -msgstr "" +msgstr "Línea apilada" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state @@ -861,11 +861,15 @@ msgid "" "Today: Activity date is today\n" "Planned: Future activities." msgstr "" +"Estado basado en actividades\n" +"Vencido: La fecha límite ya ha pasado\n" +"Hoy: La fecha de actividad es hoy\n" +"Planificado: Actividades futuras." #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_tag_ids msgid "Tags" -msgstr "" +msgstr "Etiquetas" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic @@ -886,18 +890,18 @@ msgstr "Intervalo de tiempo" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Toggle Dropdown" -msgstr "" +msgstr "Alternar menú desplegable" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Total rows used when inserting list" -msgstr "" +msgstr "Total de filas usadas al insertar lista" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_tag__color msgid "Transparent tags are not visible in the kanban view" -msgstr "" +msgstr "Las etiquetas transparentes no son visibles en la vista kanban" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type @@ -907,7 +911,7 @@ msgstr "Tipo" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_exception_decoration msgid "Type of the exception activity on record." -msgstr "" +msgstr "Tipo de la actividad de excepción en el registro." #. module: spreadsheet_oca #. odoo-python @@ -919,13 +923,13 @@ msgstr "Sin nombre" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.xml:0 msgid "Upload" -msgstr "" +msgstr "Cargar" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.esm.js:0 msgid "Upload a Spreadsheet" -msgstr "" +msgstr "Cargar una hoja de cálculo" #. module: spreadsheet_oca #: model:res.groups,name:spreadsheet_oca.group_user @@ -935,17 +939,17 @@ msgstr "Usuario" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__website_message_ids msgid "Website Messages" -msgstr "" +msgstr "Mensajes del sitio web" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__website_message_ids msgid "Website communication history" -msgstr "" +msgstr "Historial de comunicación del sitio web" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view msgid "Write Access" -msgstr "" +msgstr "Acceso de escritura" #. module: spreadsheet_oca #. odoo-javascript @@ -968,7 +972,7 @@ msgstr "descendiendo" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view msgid "e.g. Sales KPI" -msgstr "" +msgstr "p.ej. KPI de ventas" #. module: spreadsheet_oca #. odoo-javascript From e762b41b257a664dc7ff7997934a2dd922c83d06 Mon Sep 17 00:00:00 2001 From: alexmorel-tecnativa Date: Thu, 16 Apr 2026 14:43:46 +0000 Subject: [PATCH 097/100] Translated using Weblate (Spanish) Currently translated at 100.0% (166 of 166 strings) Translation: spreadsheet-18.0/spreadsheet-18.0-spreadsheet_oca Translate-URL: https://translation.odoo-community.org/projects/spreadsheet-18-0/spreadsheet-18-0-spreadsheet_oca/es/ --- spreadsheet_oca/i18n/es.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spreadsheet_oca/i18n/es.po b/spreadsheet_oca/i18n/es.po index dcf11467..201907f8 100644 --- a/spreadsheet_oca/i18n/es.po +++ b/spreadsheet_oca/i18n/es.po @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-09-03 11:51+0000\n" -"PO-Revision-Date: 2026-04-13 07:43+0000\n" -"Last-Translator: Ed-Spain \n" +"PO-Revision-Date: 2026-04-17 16:45+0000\n" +"Last-Translator: alexmorel-tecnativa \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" @@ -471,7 +471,7 @@ msgstr "Última actualización el" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Last updated at" -msgstr "Última Actualización el" +msgstr "Última actualización el" #. module: spreadsheet_oca #. odoo-javascript @@ -810,7 +810,7 @@ msgstr "Hoja de cálculo abstracta para herencia" #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_binary_data #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_binary_data msgid "Spreadsheet file" -msgstr "Fichero Hoja de Cálculo" +msgstr "Archivo de hoja de cálculo" #. module: spreadsheet_oca #: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_act_window From 64bf036ccb06268a06e8005f42662577889054b1 Mon Sep 17 00:00:00 2001 From: Yann Papouin Date: Wed, 10 Jun 2026 06:23:10 +0000 Subject: [PATCH 098/100] Translated using Weblate (French) Currently translated at 100.0% (166 of 166 strings) Translation: spreadsheet-18.0/spreadsheet-18.0-spreadsheet_oca Translate-URL: https://translation.odoo-community.org/projects/spreadsheet-18-0/spreadsheet-18-0-spreadsheet_oca/fr/ --- spreadsheet_oca/README.rst | 2 +- spreadsheet_oca/__manifest__.py | 2 +- spreadsheet_oca/i18n/fr.po | 256 +++++++++--------- spreadsheet_oca/static/description/index.html | 2 +- 4 files changed, 136 insertions(+), 126 deletions(-) diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index 3f2808b9..20fb5ca4 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/README.rst @@ -11,7 +11,7 @@ Spreadsheet Oca !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:afa8556b48ef425ac88f6fa7b69a9f5d76aaef94958f9ce0e14e0efd97024dc0 + !! source digest: sha256:1310916cafc940d7dcb638553bb2072e73f47cc887916d5c384b1cec841b4223 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index 782aaeb7..4b6779cc 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "18.0.1.3.0", + "version": "18.0.1.3.1", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", diff --git a/spreadsheet_oca/i18n/fr.po b/spreadsheet_oca/i18n/fr.po index 1fb8857f..e0dd486b 100644 --- a/spreadsheet_oca/i18n/fr.po +++ b/spreadsheet_oca/i18n/fr.po @@ -6,75 +6,75 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-09-17 23:06+0000\n" -"Last-Translator: Grégory Moka Tourisme \n" +"PO-Revision-Date: 2026-06-10 06:35+0000\n" +"Last-Translator: Yann Papouin \n" "Language-Team: none\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 5.6.2\n" +"X-Generator: Weblate 5.15.2\n" #. module: spreadsheet_oca #: model:ir.model.constraint,message:spreadsheet_oca.constraint_spreadsheet_spreadsheet_tag_name_uniq msgid "A tag with the same name already exists." -msgstr "" +msgstr "Une étiquette portant le même nom existe déjà." #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_needaction msgid "Action Needed" -msgstr "" +msgstr "Nécessite une action" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__active #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__active msgid "Active" -msgstr "" +msgstr "Actif" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_ids msgid "Activities" -msgstr "" +msgstr "Activités" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_exception_decoration msgid "Activity Exception Decoration" -msgstr "" +msgstr "Activité exception décoration" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state msgid "Activity State" -msgstr "" +msgstr "Statut de l'activité" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_type_icon msgid "Activity Type Icon" -msgstr "" +msgstr "Icône de type d’activité" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Add date" -msgstr "" +msgstr "Ajouter une date" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Add relation" -msgstr "" +msgstr "Ajouter une relation" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Add text" -msgstr "" +msgstr "Ajouter du texte" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 msgid "Add to spreadesheet" -msgstr "" +msgstr "Ajouter au tableur" #. module: spreadsheet_oca #. odoo-javascript @@ -90,54 +90,54 @@ msgstr "Ajouter au tableur" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 msgid "After next" -msgstr "" +msgstr "Après la prochaine" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_kanban_view #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_search_view msgid "Archived" -msgstr "" +msgstr "Archivé" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 msgid "Are you sure you want to delete this list?" -msgstr "" +msgstr "Êtes vous sûr de vouloir supprimer cette liste ?" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Area" -msgstr "" +msgstr "Surface" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_attachment_count msgid "Attachment Count" -msgstr "" +msgstr "Nombre de pièces jointes" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Automatically filter on the current period" -msgstr "" +msgstr "Filtrer automatiquement sur la période actuelle" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Automatically filter on the current user" -msgstr "" +msgstr "Filtrer automatiquement sur l'utilisateur actuel" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__badge_image msgid "Badge Background" -msgstr "" +msgstr "Arrière-plan du badge" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 msgid "Before Previous" -msgstr "" +msgstr "Avant la précédente" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_be_dynamic @@ -160,50 +160,52 @@ msgstr "Modifier le nom" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__client_id msgid "Client" -msgstr "" +msgstr "Client" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__code msgid "Code" -msgstr "" +msgstr "Code" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_tag__color msgid "Color" -msgstr "" +msgstr "Couleur" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Column" -msgstr "" +msgstr "Colonne" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands msgid "Commands" -msgstr "" +msgstr "Commandes" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id msgid "Company" -msgstr "" +msgstr "Société" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 msgid "Comparisons in pivot are not supported" msgstr "" +"Les comparaisons dans les tableaux croisés dynamiques (pivot) ne sont pas " +"prises en charge" #. module: spreadsheet_oca #: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_configuration_menu msgid "Configuration" -msgstr "" +msgstr "Configuration" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view msgid "Context" -msgstr "" +msgstr "Contexte" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_ids @@ -213,7 +215,7 @@ msgstr "Contributeur" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_group_ids msgid "Contributors Groups" -msgstr "" +msgstr "Groupes de contributeurs" #. module: spreadsheet_oca #: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_new @@ -244,25 +246,25 @@ msgstr "Créé le" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 msgid "Currency" -msgstr "" +msgstr "Devise" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__datasource_name msgid "Datasource Name" -msgstr "" +msgstr "Nom de la source de données" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Default value" -msgstr "" +msgstr "Valeur par défaut" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_kanban_view msgid "Delete" -msgstr "" +msgstr "Supprimer" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name @@ -291,6 +293,8 @@ msgstr "Télécharger XLSX" #: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 msgid "Duplicated groupbys in pivot are not supported" msgstr "" +"Les regroupements (group_by) en double dans les tableaux croisés dynamiques " +"(pivot) ne sont pas pris en charge" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_rows @@ -331,23 +335,23 @@ msgstr "Filtre" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_follower_ids msgid "Followers" -msgstr "" +msgstr "Abonnés" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_partner_ids msgid "Followers (Partners)" -msgstr "" +msgstr "Abonnés (Partenaires)" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_type_icon msgid "Font awesome icon e.g. fa-tasks" -msgstr "" +msgstr "Icône font awesome ex : fa-tasks" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 msgid "From / To" -msgstr "" +msgstr "Depuis" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__group_ids @@ -357,7 +361,7 @@ msgstr "Groupe" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__has_message msgid "Has Message" -msgstr "" +msgstr "A un message" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__id @@ -367,27 +371,27 @@ msgstr "" #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__id #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_tag__id msgid "ID" -msgstr "" +msgstr "ID" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_exception_icon msgid "Icon" -msgstr "" +msgstr "Icône" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_exception_icon msgid "Icon to indicate an exception activity." -msgstr "" +msgstr "Icône pour indiquer une activité d'exception." #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__message_needaction msgid "If checked, new messages require your attention." -msgstr "" +msgstr "Si coché, de nouveaux messages demandent votre attention." #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__message_has_error msgid "If checked, some messages have a delivery error." -msgstr "" +msgstr "Si actif, certains messages ont une erreur de livraison." #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id @@ -395,6 +399,8 @@ msgid "" "If set, the spreadsheet will be available only if this company is in the " "current companies." msgstr "" +"Si cette option est activée, le tableur ne sera disponible que si cette " +"société figure parmi les sociétés actuelles." #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__import_data @@ -409,7 +415,7 @@ msgstr "Mode d'import" #. module: spreadsheet_oca #: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_import_act_window msgid "Import Pivot" -msgstr "" +msgstr "Importer un tableau croisé dynamique (pivot)" #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import @@ -420,23 +426,23 @@ msgstr "Importer des données au tableur" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Include children" -msgstr "" +msgstr "Inclure les fils" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Insert list" -msgstr "" +msgstr "Insérer une liste" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_is_follower msgid "Is Follower" -msgstr "" +msgstr "Est un abonné" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__is_tree msgid "Is Tree" -msgstr "" +msgstr "Est une liste" #. module: spreadsheet_oca #. odoo-javascript @@ -474,19 +480,19 @@ msgstr "Dernière mise à jour à" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Line" -msgstr "" +msgstr "Ligne" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Link to Odoo menu" -msgstr "" +msgstr "Lien vers le menu Odoo" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "List name" -msgstr "" +msgstr "Nom de la liste" #. module: spreadsheet_oca #: model:res.groups,name:spreadsheet_oca.group_manager @@ -498,22 +504,22 @@ msgstr "Gestionnaire" #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Menu Items" -msgstr "" +msgstr "Éléments de menu" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_has_error msgid "Message Delivery error" -msgstr "" +msgstr "Erreur de livraison du message" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_ids msgid "Messages" -msgstr "" +msgstr "Messages" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode_id msgid "Mode" -msgstr "" +msgstr "Mode" #. module: spreadsheet_oca #. odoo-javascript @@ -525,7 +531,7 @@ msgstr "Modèle" #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_ir_model msgid "Models" -msgstr "" +msgstr "Modèles" #. module: spreadsheet_oca #. odoo-javascript @@ -537,17 +543,17 @@ msgstr "Mois" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 msgid "Month / Quarter" -msgstr "" +msgstr "Mois / Trimestre" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__my_activity_date_deadline msgid "My Activity Deadline" -msgstr "" +msgstr "Mon échéance d'activité" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_search_view msgid "My Sheets" -msgstr "" +msgstr "Mes feuilles" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__name @@ -567,22 +573,22 @@ msgstr "Suivant" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_date_deadline msgid "Next Activity Deadline" -msgstr "" +msgstr "Échéance de la prochaine activité" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_summary msgid "Next Activity Summary" -msgstr "" +msgstr "Résumé de la prochaine activité" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_type_id msgid "Next Activity Type" -msgstr "" +msgstr "Type de la prochaine activité" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__next_revision_id msgid "Next Revision" -msgstr "" +msgstr "Prochaine version" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_rows @@ -593,22 +599,22 @@ msgstr "Nombre de lignes" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_needaction_counter msgid "Number of Actions" -msgstr "" +msgstr "Nombre d'actions" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__message_has_error_counter msgid "Number of errors" -msgstr "" +msgstr "Nombre d'erreurs" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__message_needaction_counter msgid "Number of messages requiring action" -msgstr "" +msgstr "Nombre de messages nécessitant une action" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__message_has_error_counter msgid "Number of messages with delivery error" -msgstr "" +msgstr "Nombre de messages avec erreur de livraison" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view @@ -623,19 +629,19 @@ msgstr "Propriétaire" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view msgid "Ownership" -msgstr "" +msgstr "Propriété" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Pie" -msgstr "" +msgstr "Camembert" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Possible values" -msgstr "" +msgstr "Valeurs possibles" #. module: spreadsheet_oca #. odoo-javascript @@ -647,24 +653,24 @@ msgstr "Précédent" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Quarter" -msgstr "" +msgstr "Trimestre" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 msgid "Re-insert Dynamic" -msgstr "" +msgstr "Réinsérer dynamique" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 msgid "Re-insert Static" -msgstr "" +msgstr "Réinsérer statique" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view msgid "Read Access" -msgstr "" +msgstr "Accès en lecture" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_ids @@ -674,7 +680,7 @@ msgstr "Lecteurs" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_group_ids msgid "Readers Groups" -msgstr "" +msgstr "Groupes de lecteurs" #. module: spreadsheet_oca #. odoo-javascript @@ -686,13 +692,13 @@ msgstr "Mettre à jour les données" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Related model" -msgstr "" +msgstr "Model associé" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 msgid "Relative Period" -msgstr "" +msgstr "Période relative" #. module: spreadsheet_oca #. odoo-javascript @@ -703,24 +709,24 @@ msgstr "Supprimer" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__res_id msgid "Res" -msgstr "" +msgstr "Res" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_user_id msgid "Responsible User" -msgstr "" +msgstr "Responsable" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Restrict values with a domain" -msgstr "" +msgstr "Limiter les valeurs à un domaine" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Rows:" -msgstr "" +msgstr "Lignes :" #. module: spreadsheet_oca #. odoo-javascript @@ -734,12 +740,12 @@ msgstr "Enregistrer" #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Select a menu..." -msgstr "" +msgstr "Sélectionnez un menu..." #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number msgid "Select number of rows to duplicate row" -msgstr "" +msgstr "Sélectionnez le nombre de lignes à dupliquer" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__sequence @@ -749,19 +755,19 @@ msgstr "Séquence" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__server_revision_id msgid "Server Revision" -msgstr "" +msgstr "Version du serveur" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 msgid "Settings" -msgstr "" +msgstr "Paramètres" #. module: spreadsheet_oca #. odoo-python #: code:addons/spreadsheet_oca/models/spreadsheet_abstract.py:0 msgid "Sheet1" -msgstr "" +msgstr "Feuille1" #. module: spreadsheet_oca #. odoo-javascript @@ -774,81 +780,81 @@ msgstr "Tri" #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__spreadsheet_id #: model:ir.module.category,name:spreadsheet_oca.module_category_spreedsheet msgid "Spreadsheet" -msgstr "Feuille de calcul" +msgstr "Tableur" #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_oca_revision msgid "Spreadsheet Oca Revision" -msgstr "" +msgstr "Version OCA du tableur" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_raw #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_raw msgid "Spreadsheet Raw" -msgstr "" +msgstr "Tableur brute" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_revision_ids #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_revision_ids msgid "Spreadsheet Revision" -msgstr "" +msgstr "Version du tableur" #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_tag msgid "Spreadsheet Tag" -msgstr "" +msgstr "Étiquette de tableur" #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_spreadsheet_abstract msgid "Spreadsheet abstract for inheritance" -msgstr "" +msgstr "Tableur abstrait pour héritage" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_binary_data #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_binary_data msgid "Spreadsheet file" -msgstr "" +msgstr "Fichier tableur" #. module: spreadsheet_oca #: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_act_window #: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_menu msgid "Spreadsheets" -msgstr "Feuilles de calcul" +msgstr "Tableurs" #. module: spreadsheet_oca #: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_tags_act_window #: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_tag_menu msgid "Spreadsheets Tags" -msgstr "" +msgstr "Étiquettes de tableurs" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_kanban_view msgid "Spreasheet Image" -msgstr "" +msgstr "Image du tableur" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Stacked" -msgstr "" +msgstr "Empilé" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Stacked Area" -msgstr "" +msgstr "Graphique en aires empilées" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Stacked Column" -msgstr "" +msgstr "Colonne empilée" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 msgid "Stacked Line" -msgstr "" +msgstr "Ligne empilée" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_state @@ -858,11 +864,15 @@ msgid "" "Today: Activity date is today\n" "Planned: Future activities." msgstr "" +"Statut basé sur les activités\n" +"En retard : la date d'échéance est déjà dépassée\n" +"Aujourd'hui : la date d'activité est aujourd'hui\n" +"Planifiée : activités futures." #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_tag_ids msgid "Tags" -msgstr "" +msgstr "Étiquettes" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic @@ -871,58 +881,58 @@ msgid "" "filters set in the spreadsheets." msgstr "" "Ce champ vous permet de générer des tableaux dont les lignes sont mises à " -"jour avec les filtres définis dans les feuilles de calcul." +"jour avec les filtres définis dans les tableurs." #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Time range" -msgstr "" +msgstr "Intervalle de temps" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Toggle Dropdown" -msgstr "" +msgstr "Permuter le menu déroulant" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "Total rows used when inserting list" -msgstr "" +msgstr "Nombre total de lignes utilisées lors de l'insertion de la liste" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_tag__color msgid "Transparent tags are not visible in the kanban view" -msgstr "" +msgstr "Les étiquettes transparentes ne sont pas visibles dans la vue Kanban" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type msgid "Type" -msgstr "" +msgstr "Type" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__activity_exception_decoration msgid "Type of the exception activity on record." -msgstr "" +msgstr "Type d'activité d'exception enregistrée." #. module: spreadsheet_oca #. odoo-python #: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 msgid "Unnamed" -msgstr "" +msgstr "Sans nom" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.xml:0 msgid "Upload" -msgstr "" +msgstr "Téléverser" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.esm.js:0 msgid "Upload a Spreadsheet" -msgstr "" +msgstr "Importer une feuille de calcul" #. module: spreadsheet_oca #: model:res.groups,name:spreadsheet_oca.group_user @@ -932,17 +942,17 @@ msgstr "Utilisateur" #. module: spreadsheet_oca #: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__website_message_ids msgid "Website Messages" -msgstr "" +msgstr "Messages du site web" #. module: spreadsheet_oca #: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__website_message_ids msgid "Website communication history" -msgstr "" +msgstr "Historique de communication du site web" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view msgid "Write Access" -msgstr "" +msgstr "Accès en écriture" #. module: spreadsheet_oca #. odoo-javascript @@ -954,35 +964,35 @@ msgstr "Année" #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 msgid "ascending" -msgstr "Croissant" +msgstr "croissant" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 msgid "descending" -msgstr "Décroissant" +msgstr "décroissant" #. module: spreadsheet_oca #: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view msgid "e.g. Sales KPI" -msgstr "" +msgstr "ex : indicateurs clés de performance (KPI) des ventes" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 msgid "name is required" -msgstr "Le nom est requis" +msgstr "« nom » est requis" #. module: spreadsheet_oca #. odoo-javascript #: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 msgid "not updated" -msgstr "" +msgstr "n'a pas été mis à jour" #. module: spreadsheet_oca #: model:ir.model,name:spreadsheet_oca.model_ir_websocket msgid "websocket message handling" -msgstr "" +msgstr "gestion des messages websocket" #~ msgid "Dimensions" #~ msgstr "Dimensions" diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html index 877f077a..739577db 100644 --- a/spreadsheet_oca/static/description/index.html +++ b/spreadsheet_oca/static/description/index.html @@ -372,7 +372,7 @@

    Spreadsheet Oca

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

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

    This module adds a functionality for adding and editing Spreadsheets From 2af5f5e9b3f9c775c3a2d97fd01675b6fa29feee Mon Sep 17 00:00:00 2001 From: Chris Mann Date: Thu, 23 Jul 2026 23:28:26 +0100 Subject: [PATCH 099/100] [IMP] spreadsheet_oca: pre-commit auto fixes --- .../static/src/spreadsheet/bundle/chart_panel.esm.js | 2 +- spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js | 5 ++--- .../src/spreadsheet/bundle/filter_panel_datasources.esm.js | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js index 41407c51..bd81b790 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js @@ -1,6 +1,6 @@ import * as spreadsheet from "@odoo/o-spreadsheet"; -import {patch} from "@web/core/utils/patch"; import {onWillUpdateProps} from "@odoo/owl"; +import {patch} from "@web/core/utils/patch"; const {chartSubtypeRegistry} = spreadsheet.registries; const {ChartTypePicker} = spreadsheet.components; diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js index 799faf37..fb36e4e8 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js @@ -8,12 +8,11 @@ import {ModelFieldSelector} from "@web/core/model_field_selector/model_field_sel import {ModelSelector} from "@web/core/model_selector/model_selector"; import {MultiRecordSelector} from "@web/core/record_selectors/multi_record_selector"; import {RELATIVE_DATE_RANGE_TYPES} from "@spreadsheet/helpers/constants"; -const {Checkbox} = spreadsheet.components; -import {user} from "@web/core/user"; - import {_t} from "@web/core/l10n/translation"; import {globalFiltersFieldMatchers} from "@spreadsheet/global_filters/plugins/global_filters_core_plugin"; import {useService} from "@web/core/utils/hooks"; +import {user} from "@web/core/user"; +const {Checkbox} = spreadsheet.components; const {topbarMenuRegistry} = spreadsheet.registries; const uuidGenerator = new spreadsheet.helpers.UuidGenerator(); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js index a8081f6b..8a37995e 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js @@ -3,10 +3,10 @@ import {Component, onWillStart, onWillUpdateProps, useRef, useState} from "@odoo import {Domain} from "@web/core/domain"; import {DomainSelector} from "@web/core/domain_selector/domain_selector"; import {DomainSelectorDialog} from "@web/core/domain_selector_dialog/domain_selector_dialog"; +import {ODOO_AGGREGATORS} from "@spreadsheet/pivot/pivot_helpers"; import {_t} from "@web/core/l10n/translation"; import {formatDate} from "@web/core/l10n/dates"; import {useService} from "@web/core/utils/hooks"; -import {ODOO_AGGREGATORS} from "@spreadsheet/pivot/pivot_helpers"; const {DateTime} = luxon; const {PivotTitleSection, PivotLayoutConfigurator} = spreadsheet.components; From fe147f4b7e29607b183b69d160fcc8ebda24a357 Mon Sep 17 00:00:00 2001 From: Chris Mann Date: Thu, 23 Jul 2026 23:29:03 +0100 Subject: [PATCH 100/100] [MIG] spreadsheet_oca: Migration to 19.0 --- spreadsheet_oca/README.rst | 16 +-- spreadsheet_oca/__manifest__.py | 2 +- .../models/spreadsheet_abstract.py | 4 +- .../models/spreadsheet_spreadsheet.py | 4 +- .../models/spreadsheet_spreadsheet_tag.py | 9 +- spreadsheet_oca/security/security.xml | 17 ++- spreadsheet_oca/static/description/index.html | 12 +- .../src/spreadsheet/bundle/chart_panel.esm.js | 24 ++-- .../spreadsheet/bundle/chart_panels.esm.js | 6 +- .../src/spreadsheet/bundle/filter.esm.js | 115 ++++++++++------ .../bundle/filter_panel_datasources.esm.js | 11 +- .../src/spreadsheet/bundle/odoo_panels.esm.js | 127 ++++++++---------- .../src/spreadsheet/bundle/spreadsheet.xml | 80 ++--------- .../bundle/spreadsheet_action.esm.js | 21 +-- .../bundle/spreadsheet_renderer.esm.js | 4 +- .../src/spreadsheet/list_controller.xml | 4 +- .../spreadsheet_tree_view.esm.js | 2 +- .../spreadsheet_tree_view.xml | 28 ++-- .../views/spreadsheet_spreadsheet.xml | 6 +- 19 files changed, 232 insertions(+), 260 deletions(-) diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst index 20fb5ca4..1f61461f 100644 --- a/spreadsheet_oca/README.rst +++ b/spreadsheet_oca/README.rst @@ -21,13 +21,13 @@ Spreadsheet Oca :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_oca + :target: https://github.com/OCA/spreadsheet/tree/19.0/spreadsheet_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_oca + :target: https://translation.odoo-community.org/projects/spreadsheet-19-0/spreadsheet-19-0-spreadsheet_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 + :target: https://runboat.odoo-community.org/builds?repo=OCA/spreadsheet&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -88,9 +88,9 @@ Usage of ``account.account`` model. (``income``, ``asset_receivable``, etc.) -.. |image1| image:: https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/static/description/spreadsheet_create.png -.. |image2| image:: https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/static/description/spreadsheet_edit.png -.. |image3| image:: https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/static/description/o-spreadsheet.png +.. |image1| image:: https://raw.githubusercontent.com/OCA/spreadsheet/19.0/spreadsheet_oca/static/description/spreadsheet_create.png +.. |image2| image:: https://raw.githubusercontent.com/OCA/spreadsheet/19.0/spreadsheet_oca/static/description/spreadsheet_edit.png +.. |image3| image:: https://raw.githubusercontent.com/OCA/spreadsheet/19.0/spreadsheet_oca/static/description/o-spreadsheet.png Development =========== @@ -105,7 +105,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -146,6 +146,6 @@ 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. +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_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py index 4b6779cc..743f5f4e 100644 --- a/spreadsheet_oca/__manifest__.py +++ b/spreadsheet_oca/__manifest__.py @@ -5,7 +5,7 @@ "name": "Spreadsheet Oca", "summary": """ Allow to edit spreadsheets""", - "version": "18.0.1.3.1", + "version": "19.0.1.0.0", "license": "AGPL-3", "author": "CreuBlanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/spreadsheet", diff --git a/spreadsheet_oca/models/spreadsheet_abstract.py b/spreadsheet_oca/models/spreadsheet_abstract.py index 86a1e317..245d393c 100644 --- a/spreadsheet_oca/models/spreadsheet_abstract.py +++ b/spreadsheet_oca/models/spreadsheet_abstract.py @@ -5,7 +5,7 @@ import json from typing import Any -from odoo import _, api, fields, models +from odoo import api, fields, models from odoo.exceptions import AccessError CollaborationMessage = dict[str, Any] @@ -68,7 +68,7 @@ def _empty_spreadsheet_data(self): "sheets": [ { "id": "sheet1", - "name": _("Sheet1"), + "name": self.env._("Sheet1"), } ], "settings": { diff --git a/spreadsheet_oca/models/spreadsheet_spreadsheet.py b/spreadsheet_oca/models/spreadsheet_spreadsheet.py index 55a9ae9f..3b75803a 100644 --- a/spreadsheet_oca/models/spreadsheet_spreadsheet.py +++ b/spreadsheet_oca/models/spreadsheet_spreadsheet.py @@ -5,7 +5,7 @@ import zipfile from io import BytesIO -from odoo import _, api, fields, models +from odoo import api, fields, models class SpreadsheetSpreadsheet(models.Model): @@ -59,7 +59,7 @@ class SpreadsheetSpreadsheet(models.Model): @api.depends("name") def _compute_filename(self): for record in self: - record.filename = "%s.json" % (self.name or _("Unnamed")) + record.filename = "%s.json" % (self.name or self.env._("Unnamed")) def create_document_from_attachment(self, attachment_ids): attachments = self.env["ir.attachment"].browse(attachment_ids) diff --git a/spreadsheet_oca/models/spreadsheet_spreadsheet_tag.py b/spreadsheet_oca/models/spreadsheet_spreadsheet_tag.py index 29fc9593..9be5cf64 100644 --- a/spreadsheet_oca/models/spreadsheet_spreadsheet_tag.py +++ b/spreadsheet_oca/models/spreadsheet_spreadsheet_tag.py @@ -15,10 +15,11 @@ def _get_default_color(self): name = fields.Char(required=True, translate=True) color = fields.Integer( - default=_get_default_color, + default=lambda self: self._get_default_color(), help="Transparent tags are not visible in the kanban view", ) - _sql_constraints = [ - ("name_uniq", "unique (name)", "A tag with the same name already exists."), - ] + _name_uniq = models.Constraint( + "unique (name)", + "A tag with the same name already exists.", + ) diff --git a/spreadsheet_oca/security/security.xml b/spreadsheet_oca/security/security.xml index aa94100a..b1986a12 100644 --- a/spreadsheet_oca/security/security.xml +++ b/spreadsheet_oca/security/security.xml @@ -6,16 +6,21 @@ Spreadsheet 99 + + Spreadsheet + + 99 + User - + Manager - + @@ -36,7 +41,7 @@ ['|', ('contributor_ids','=', user.id), ('contributor_group_ids','in', user.groups_id.ids)] + >['|', ('contributor_ids','=', user.id), ('contributor_group_ids','in', user.all_group_ids.ids)] @@ -46,7 +51,7 @@ ['|', ('reader_ids','=', user.id), ('reader_group_ids','in', user.groups_id.ids)] + >['|', ('reader_ids','=', user.id), ('reader_group_ids','in', user.all_group_ids.ids)] @@ -60,6 +65,6 @@ Spreadsheet Import mode - [('group_ids','in', user.groups_id.ids)] + [('group_ids','in', user.all_group_ids.ids)] diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html index 739577db..ae830502 100644 --- a/spreadsheet_oca/static/description/index.html +++ b/spreadsheet_oca/static/description/index.html @@ -374,7 +374,7 @@

    Spreadsheet Oca

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:1310916cafc940d7dcb638553bb2072e73f47cc887916d5c384b1cec841b4223 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

    +

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

    This module adds a functionality for adding and editing Spreadsheets using Odoo CE.

    It is an alternative to the proprietary module spreadsheet_edition @@ -405,13 +405,13 @@

    Create a new spreadsheet<
  • Click on ‘Create’
  • Put a name, then click on the “Edit” button
  • -

    image1

    +

    image1

    • At this point you switch to spreadsheet editing mode. The editor is named o-spreadsheet and looks like another common spreadsheet web editors. (OnlyOffice, Ethercalc, Google Sheets (non-free)).
    -

    image2

    +

    image2

    -

    image3

    +

    image3

    • Note: Business Odoo module can add “business functions”. This is currently the case for the accounting module, which adds the following @@ -457,7 +457,7 @@

      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.

      +feedback.

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

    @@ -495,7 +495,7 @@

    Maintainers

    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.

    +

    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_oca/static/src/spreadsheet/bundle/chart_panel.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js index bd81b790..4f4e46ee 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js @@ -14,15 +14,15 @@ const groupByCategory = (items) => return acc; }, {}); -const getFigureDefinition = (env, figureId) => - env.model.getters.getChartDefinition(figureId); +const getChartDefinition = (env, chartId) => + env.model.getters.getChartDefinition(chartId); patch(ChartTypePicker.prototype, { setup() { super.setup(); - const refresh = (figureId) => this.filterCategoriesChartType(figureId); - refresh(this.props.figureId); - onWillUpdateProps((nextProps) => refresh(nextProps.figureId)); + const refresh = (chartId) => this.filterCategoriesChartType(chartId); + refresh(this.props.chartId); + onWillUpdateProps((nextProps) => refresh(nextProps.chartId)); }, getChartTypes(isOdoo) { @@ -36,8 +36,8 @@ patch(ChartTypePicker.prototype, { }, onTypeChange(type) { const {env} = this; - const figureId = this.props.figureId; - const current = getFigureDefinition(env, figureId); + const chartId = this.props.chartId; + const current = getChartDefinition(env, chartId); if (!isOdooKey(current.type)) { return super.onTypeChange(type); } @@ -48,16 +48,18 @@ patch(ChartTypePicker.prototype, { ...newChartInfo.subtypeDefinition, type: newChartInfo.chartType, }; + const figureId = env.model.getters.getFigureIdFromChartId(chartId); env.model.dispatch("UPDATE_CHART", { definition, - id: figureId, - sheetId: env.model.getters.getActiveSheetId(), + chartId, + figureId, + sheetId: env.model.getters.getFigureSheetId(figureId), }); this.closePopover(); }, - filterCategoriesChartType(figureId) { + filterCategoriesChartType(chartId) { const {env} = this; - const definition = getFigureDefinition(env, figureId); + const definition = getChartDefinition(env, chartId); const isOdoo = isOdooKey(definition.type); const registryItems = chartSubtypeRegistry .getAll() diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js index 7f1977ff..a8d18e67 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js @@ -38,7 +38,7 @@ const menuChartProps = () => ({ return [["id", "in", menus]]; }, get menuId() { - const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); + const menu = this.env.model.getters.getChartOdooMenu(this.props.chartId); if (menu) { return [menu.id, menu.name]; } @@ -47,14 +47,14 @@ const menuChartProps = () => ({ updateMenu(menuId) { if (!menuId) { this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { - chartId: this.props.figureId, + chartId: this.props.chartId, odooMenuId: false, }); return; } const menu = this.env.model.getters.getIrMenu(menuId[0].id); this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { - chartId: this.props.figureId, + chartId: this.props.chartId, odooMenuId: menu.xmlid || menu.id, }); }, diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js index fb36e4e8..d2606174 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js @@ -1,5 +1,6 @@ import * as spreadsheet from "@odoo/o-spreadsheet"; import {Component, onWillStart, useState} from "@odoo/owl"; +import {DefaultDateValue} from "@spreadsheet/global_filters/components/default_date_value/default_date_value"; import {Domain} from "@web/core/domain"; import {DomainSelector} from "@web/core/domain_selector/domain_selector"; import {DomainSelectorDialog} from "@web/core/domain_selector_dialog/domain_selector_dialog"; @@ -7,9 +8,8 @@ import {FilterValue} from "@spreadsheet/global_filters/components/filter_value/f import {ModelFieldSelector} from "@web/core/model_field_selector/model_field_selector"; import {ModelSelector} from "@web/core/model_selector/model_selector"; import {MultiRecordSelector} from "@web/core/record_selectors/multi_record_selector"; -import {RELATIVE_DATE_RANGE_TYPES} from "@spreadsheet/helpers/constants"; import {_t} from "@web/core/l10n/translation"; -import {globalFiltersFieldMatchers} from "@spreadsheet/global_filters/plugins/global_filters_core_plugin"; +import {globalFieldMatchingRegistry} from "@spreadsheet/global_filters/helpers"; import {useService} from "@web/core/utils/hooks"; import {user} from "@web/core/user"; const {Checkbox} = spreadsheet.components; @@ -17,7 +17,6 @@ const {Checkbox} = spreadsheet.components; const {topbarMenuRegistry} = spreadsheet.registries; const uuidGenerator = new spreadsheet.helpers.UuidGenerator(); -topbarMenuRegistry.add("file", {name: _t("File"), sequence: 10}); topbarMenuRegistry.addChild("filters", ["file"], { name: _t("Filters"), sequence: 70, @@ -37,13 +36,6 @@ topbarMenuRegistry.addChild("download", ["file"], { execute: (env) => env.downloadAsXLXS(), icon: "o-spreadsheet-Icon.EXPORT_XLSX", }); -topbarMenuRegistry.addChild("settings", ["file"], { - name: _t("Settings"), - sequence: 100, - execute: (env) => env.openSidePanel("Settings"), - icon: "o-spreadsheet-Icon.COG", -}); - const {sidePanelRegistry} = spreadsheet.registries; export class FilterPanel extends Component { @@ -53,6 +45,15 @@ export class FilterPanel extends Component { onAddFilter(type) { this.env.openSidePanel("EditFilterPanel", {filter: {type: type}}); } + getGlobalFilterValue(filterId) { + return this.env.model.getters.getGlobalFilterValue(filterId); + } + setGlobalFilterValue(filterId, value) { + this.env.model.dispatch("SET_GLOBAL_FILTER_VALUE", { + id: filterId, + value, + }); + } } FilterPanel.template = "spreadsheet_oca.FilterPanel"; @@ -74,16 +75,17 @@ export class EditFilterPanel extends Component { this.state = useState({ label: this.props.filter.label, type: this.props.filter.type, - defaultValue: this.props.filter.defaultValue || [], + defaultValue: this._unwrapDefaultValue( + this.props.filter.type, + this.props.filter.defaultValue + ), defaultValueDisplayNames: this.props.filter.defaultValueDisplayNames || [], - rangeType: this.props.filter.rangeType || "year", modelData: {technical: this.props.filter.modelName, label: null}, objects: {}, includeChildren: this.props.filter.includeChildren, domainOfAllowedValues: this.props.filter.domainOfAllowedValues, valuesRestricted: Boolean(this.props.filter.domainOfAllowedValues?.length), }); - this.relativeDateRangeTypes = RELATIVE_DATE_RANGE_TYPES; onWillStart(this.willStart.bind(this)); } async willStart() { @@ -105,22 +107,25 @@ export class EditFilterPanel extends Component { } } var ModelFields = []; - for (var [objectType, objectClass] of Object.entries( - globalFiltersFieldMatchers - )) { - for (const objectId of objectClass.getIds()) { - var fields = objectClass.getFields(objectId); + const getters = this.env.model.getters; + for (var objectType of globalFieldMatchingRegistry.getKeys()) { + const objectClass = globalFieldMatchingRegistry.get(objectType); + for (const objectId of objectClass.getIds(getters)) { + var fields = objectClass.getFields(getters, objectId); this.state.objects[objectType + "_" + objectId] = { id: objectType + "_" + objectId, objectId: objectId, - name: objectClass.getDisplayName(objectId), - tag: await objectClass.getTag(objectId), + name: objectClass.getDisplayName(getters, objectId), + tag: await objectClass.getTag(getters, objectId), fieldMatch: - objectClass.getFieldMatching(objectId, this.props.filter.id) || - {}, + objectClass.getFieldMatching( + getters, + objectId, + this.props.filter.id + ) || {}, fields: fields, type: objectType, - model: objectClass.getModel(objectId), + model: objectClass.getModel(getters, objectId), }; ModelFields.push(fields); } @@ -134,13 +139,6 @@ export class EditFilterPanel extends Component { ), ]; } - get dateRangeTypes() { - return [ - {type: "fixedPeriod", description: _t("Month / Quarter")}, - {type: "relative", description: _t("Relative Period")}, - {type: "from_to", description: _t("From / To")}, - ]; - } get dateOffset() { return [ {value: 0, name: ""}, @@ -194,9 +192,50 @@ export class EditFilterPanel extends Component { onConfirm: this.onUpdateDomain.bind(this), }); } - onDateRangeChange(ev) { - this.state.rangeType = ev.target.value; - this.state.defaultValue = undefined; + onDefaultValueChanged(value) { + this.state.defaultValue = value; + } + _unwrapDefaultValue(type, defaultValue) { + if (defaultValue === undefined || defaultValue === null) { + return type === "relation" ? [] : undefined; + } + if (type === "relation") { + if (defaultValue.ids !== undefined) { + return defaultValue.ids; + } + return defaultValue; + } + if (type === "text") { + if (defaultValue.strings !== undefined) { + return defaultValue.strings.join(", "); + } + return defaultValue; + } + return defaultValue; + } + _wrapDefaultValue(type, value) { + if (type === "relation") { + if (value === "current_user") { + return {operator: "in", ids: "current_user"}; + } + if (!value || (Array.isArray(value) && value.length === 0)) { + return undefined; + } + return {operator: "in", ids: value}; + } + if (type === "text") { + if (!value) { + return undefined; + } + const strings = Array.isArray(value) + ? value + : String(value) + .split(",") + .map((s) => s.trim()) + .filter((s) => s); + return strings.length ? {operator: "ilike", strings} : undefined; + } + return value; } onSave() { const action = this.props.filter.id @@ -207,9 +246,11 @@ export class EditFilterPanel extends Component { id: this.props.filter.id || uuidGenerator.uuidv4(), type: this.state.type, label: this.state.label || "", - defaultValue: this.state.defaultValue, + defaultValue: this._wrapDefaultValue( + this.state.type, + this.state.defaultValue + ), defaultValueDisplayNames: this.state.defaultValueDisplayNames, - rangeType: this.state.rangeType, modelName: this.state.modelData.technical, includeChildren: this.state.includeChildren, domainOfAllowedValues: this.state.domainOfAllowedValues, @@ -251,9 +292,6 @@ export class EditFilterPanel extends Component { type: fieldDef?.type || "", }; } - toggleDateDefaultValue(ev) { - this.state.defaultValue = ev.target.checked ? "this_month" : undefined; - } getModelField(fieldMatch) { if (!fieldMatch || !fieldMatch.chain) { return ""; @@ -294,6 +332,7 @@ EditFilterPanel.components = { ModelSelector, ModelFieldSelector, MultiRecordSelector, + DefaultDateValue, }; sidePanelRegistry.add("EditFilterPanel", { diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js index 8a37995e..892ea5c7 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js @@ -21,7 +21,6 @@ topbarMenuRegistry.addChild("data_sources", ["data"], (env) => { name: env.model.getters.getListDisplayName(listId), sequence: sequence++, execute: (child_env) => { - child_env.model.dispatch("SELECT_ODOO_LIST", {listId: listId}); child_env.openSidePanel("ListPanel", {listId}); }, icon: "spreadsheet_oca.ListIcon", @@ -66,10 +65,12 @@ export class PivotTitleSectionInsertion extends PivotTitleSection { } reinsertTable(env, mode) { const zone = env.model.getters.getSelectedZone(); - const table = env.model.getters - .getPivot(this.props.pivotId) - .getTableStructure() - .export(); + const pivot = env.model.getters.getPivot(this.props.pivotId); + const table = ( + mode === "dynamic" + ? pivot.getCollapsedTableStructure() + : pivot.getExpandedTableStructure() + ).export(); env.model.dispatch("INSERT_PIVOT_WITH_TABLE", { pivotId: this.props.pivotId, table, diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js index 767c0143..32e25ccb 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js @@ -5,8 +5,18 @@ import {Many2XAutocomplete} from "@web/views/fields/relational_utils"; import {_t} from "@web/core/l10n/translation"; import {useService} from "@web/core/utils/hooks"; -const {chartSidePanelComponentRegistry, chartSubtypeRegistry} = spreadsheet.registries; -const {PieChartDesignPanel} = spreadsheet.components; +const {chartSidePanelComponentRegistry} = spreadsheet.registries; +const { + PieChartDesignPanel, + ChartWithAxisDesignPanel, + ComboChartDesignPanel, + FunnelChartDesignPanel, + GeoChartDesignPanel, + RadarChartDesignPanel, + SunburstChartDesignPanel, + TreeMapChartDesignPanel, + WaterfallChartDesignPanel, +} = spreadsheet.components; const {Component} = owl; export class OdooPanel extends Component { @@ -31,8 +41,11 @@ export class OdooPanel extends Component { .filter((menuId) => menuId !== "root"); return [["id", "in", menus]]; } + get chartId() { + return this.props.chartId; + } get menuId() { - const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); + const menu = this.env.model.getters.getChartOdooMenu(this.chartId); if (menu) { return [menu.id, menu.name]; } @@ -41,14 +54,14 @@ export class OdooPanel extends Component { updateMenu(menuId) { if (!menuId) { this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { - chartId: this.props.figureId, + chartId: this.chartId, odooMenuId: false, }); return; } const menu = this.env.model.getters.getIrMenu(menuId[0].id); this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { - chartId: this.props.figureId, + chartId: this.chartId, odooMenuId: menu.xmlid || menu.id, }); } @@ -72,7 +85,7 @@ OdooPanel.components = {Many2XAutocomplete}; class OdooStackablePanel extends OdooPanel { onChangeStacked(ev) { - this.props.updateChart(this.props.figureId, { + this.props.updateChart(this.chartId, { stacked: ev.target.checked, }); } @@ -91,70 +104,40 @@ chartSidePanelComponentRegistry .add("odoo_pie", { configuration: OdooPanel, design: PieChartDesignPanel, + }) + .add("odoo_combo", { + configuration: OdooPanel, + design: ComboChartDesignPanel, + }) + .add("odoo_scatter", { + configuration: OdooStackablePanel, + design: ChartWithAxisDesignPanel, + }) + .add("odoo_pyramid", { + configuration: OdooPanel, + design: ChartWithAxisDesignPanel, + }) + .add("odoo_waterfall", { + configuration: OdooPanel, + design: WaterfallChartDesignPanel, + }) + .add("odoo_radar", { + configuration: OdooPanel, + design: RadarChartDesignPanel, + }) + .add("odoo_sunburst", { + configuration: OdooPanel, + design: SunburstChartDesignPanel, + }) + .add("odoo_treemap", { + configuration: OdooPanel, + design: TreeMapChartDesignPanel, + }) + .add("odoo_geo", { + configuration: OdooPanel, + design: GeoChartDesignPanel, + }) + .add("odoo_funnel", { + configuration: OdooPanel, + design: FunnelChartDesignPanel, }); - -chartSubtypeRegistry.add("odoo_line", { - matcher: (definition) => - definition.type === "odoo_line" && !definition.stacked && !definition.fillArea, - subtypeDefinition: {stacked: false, fillArea: false}, - displayName: _t("Line"), - chartSubtype: "odoo_line", - chartType: "odoo_line", - category: "line", - preview: "o-spreadsheet-ChartPreview.LINE_CHART", -}); -chartSubtypeRegistry.add("odoo_stacked_line", { - matcher: (definition) => - definition.type === "odoo_line" && definition.stacked && !definition.fillArea, - subtypeDefinition: {stacked: true, fillArea: false}, - displayName: _t("Stacked Line"), - chartSubtype: "odoo_stacked_line", - chartType: "odoo_line", - category: "line", - preview: "o-spreadsheet-ChartPreview.STACKED_LINE_CHART", -}); -chartSubtypeRegistry.add("odoo_area", { - matcher: (definition) => - definition.type === "odoo_line" && !definition.stacked && definition.fillArea, - subtypeDefinition: {stacked: false, fillArea: true}, - displayName: _t("Area"), - chartSubtype: "odoo_area", - chartType: "odoo_line", - category: "area", - preview: "o-spreadsheet-ChartPreview.AREA_CHART", -}); -chartSubtypeRegistry.add("odoo_stacked_area", { - matcher: (definition) => - definition.type === "odoo_line" && definition.stacked && definition.fillArea, - subtypeDefinition: {stacked: true, fillArea: true}, - displayName: _t("Stacked Area"), - chartSubtype: "odoo_stacked_area", - chartType: "odoo_line", - category: "area", - preview: "o-spreadsheet-ChartPreview.STACKED_AREA_CHART", -}); -chartSubtypeRegistry.add("odoo_bar", { - matcher: (definition) => definition.type === "odoo_bar" && !definition.stacked, - subtypeDefinition: {stacked: false}, - displayName: _t("Column"), - chartSubtype: "odoo_bar", - chartType: "odoo_bar", - category: "column", - preview: "o-spreadsheet-ChartPreview.COLUMN_CHART", -}); -chartSubtypeRegistry.add("odoo_stacked_bar", { - matcher: (definition) => definition.type === "odoo_bar" && definition.stacked, - subtypeDefinition: {stacked: true}, - displayName: _t("Stacked Column"), - chartSubtype: "odoo_stacked_bar", - chartType: "odoo_bar", - category: "column", - preview: "o-spreadsheet-ChartPreview.STACKED_COLUMN_CHART", -}); -chartSubtypeRegistry.add("odoo_pie", { - displayName: _t("Pie"), - chartSubtype: "odoo_pie", - chartType: "odoo_pie", - category: "pie", - preview: "o-spreadsheet-ChartPreview.PIE_CHART", -}); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml index 40110bcd..96bea1a8 100644 --- a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml @@ -136,7 +136,12 @@
    - +
    -
    -
    Time range
    +
    +
    Default value
    - +
    -
    +
    Default value
    -
    - - -
    -
    - -
    -
    - -
    { - await loadSpreadsheetDependencies(); + await loadBundle("spreadsheet.o_spreadsheet"); await waitForDataLoaded(this.spreadsheet_model); await this.env.importData(this.spreadsheet_model); this.spreadsheet_model.joinSession(); diff --git a/spreadsheet_oca/static/src/spreadsheet/list_controller.xml b/spreadsheet_oca/static/src/spreadsheet/list_controller.xml index 1f2ef570..80d660e2 100644 --- a/spreadsheet_oca/static/src/spreadsheet/list_controller.xml +++ b/spreadsheet_oca/static/src/spreadsheet/list_controller.xml @@ -1,11 +1,11 @@ - +
    - - - - - - - - + + + + + + diff --git a/spreadsheet_oca/views/spreadsheet_spreadsheet.xml b/spreadsheet_oca/views/spreadsheet_spreadsheet.xml index b2684e67..88ccb123 100644 --- a/spreadsheet_oca/views/spreadsheet_spreadsheet.xml +++ b/spreadsheet_oca/views/spreadsheet_spreadsheet.xml @@ -219,14 +219,14 @@ Spreadsheets spreadsheet_oca,static/description/icon.png - + Configuration - + @@ -234,7 +234,7 @@ Spreadsheets Tags - +