From 9ddd416e8afb883e5f4b010e05d73dd3a43689c6 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Wed, 28 Dec 2022 13:34:05 +0100 Subject: [PATCH 001/139] [ADD] spreadsheet_oca --- spreadsheet_oca/README.rst | 9 ++ spreadsheet_oca/__init__.py | 1 + spreadsheet_oca/__manifest__.py | 32 +++++ 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 + .../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 ++++++++++++ 22 files changed, 782 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/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/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..854bfcc0 --- /dev/null +++ b/spreadsheet_oca/README.rst @@ -0,0 +1,9 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +=============== +Spreadsheet Oca +=============== + +Allow to edit spreadsheets 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/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 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 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/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 3fb1258bc907d51c13b17477429de4d9cbc6ac9d Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Fri, 7 Apr 2023 15:25:10 +0200 Subject: [PATCH 025/139] [IMP] spreadsheet_oca: Allow to edit filters --- spreadsheet_oca/__manifest__.py | 1 + .../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 +++ 5 files changed, 357 insertions(+), 10 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/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 5e3dfd9c4b8ef532370d6d9e3d5df402e45092c9 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 9 May 2023 22:36:54 +0000 Subject: [PATCH 026/139] [UPD] Update spreadsheet_oca.pot --- spreadsheet_oca/i18n/spreadsheet_oca.pot | 142 ++++++++++++++++++++++- 1 file changed, 140 insertions(+), 2 deletions(-) diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index 4d95a921..a033ba85 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,6 +394,13 @@ 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" @@ -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 From 432aaee0de1b90385e9473ca1700ea752f919395 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 9 May 2023 22:38:30 +0000 Subject: [PATCH 027/139] [UPD] Update spreadsheet_oca.pot --- spreadsheet_oca/i18n/spreadsheet_oca.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index a033ba85..c23fa6c2 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-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 00c2cb8dcdaa71425c4f1023e57782db87643ace Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 9 May 2023 22:41:37 +0000 Subject: [PATCH 028/139] spreadsheet_oca 16.0.1.1.1 --- 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 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", From 9129d92c1a87fe71d0db84ec1dca370cba5a2d3b Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 9 May 2023 22:44:10 +0000 Subject: [PATCH 029/139] [UPD] Update spreadsheet_oca.pot --- spreadsheet_oca/i18n/spreadsheet_oca.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 202f45e7ed15a9bf7053ea6a546badae3f107314 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 9 May 2023 22:45:58 +0000 Subject: [PATCH 030/139] [UPD] Update spreadsheet_oca.pot --- spreadsheet_oca/i18n/spreadsheet_oca.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index a033ba85..c23fa6c2 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-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 16e12e6e246b475262cae2e080a4856bc0a0034f Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 9 May 2023 22:47:52 +0000 Subject: [PATCH 031/139] [UPD] Update spreadsheet_oca.pot --- spreadsheet_oca/i18n/spreadsheet_oca.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 70d64deefa7de64fe7e039e25252583a83a5204a Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 9 May 2023 22:49:45 +0000 Subject: [PATCH 032/139] [UPD] Update spreadsheet_oca.pot --- spreadsheet_oca/i18n/spreadsheet_oca.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot index a033ba85..c23fa6c2 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-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 ca76656d8f227e8d51c313c6609289ea7dd1ea29 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 9 May 2023 22:51:36 +0000 Subject: [PATCH 033/139] [UPD] Update spreadsheet_oca.pot --- spreadsheet_oca/i18n/spreadsheet_oca.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3230ad13fa44e1cac6afe8df815e4ec937329bac Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Tue, 6 Jun 2023 18:06:10 +0200 Subject: [PATCH 034/139] [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 007ab95cb728607872aa49f8c5a9788f2eaa3fdb Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Wed, 7 Jun 2023 15:08:49 +0200 Subject: [PATCH 035/139] [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 036/139] [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 3eaa854c27e40d40d343fe65f1cd466b9a6c40e5 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Sun, 9 Jul 2023 18:42:08 +0200 Subject: [PATCH 039/139] [FIX] spreadsheet_oca: Fix filters --- spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js | 4 ++-- 1 file 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 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 7622ae3324a7412a80ec8ab0a467498ef355c092 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Sun, 9 Jul 2023 17:30:43 +0000 Subject: [PATCH 040/139] [UPD] Update spreadsheet_oca.pot --- spreadsheet_oca/i18n/spreadsheet_oca.pot | 106 +++++++++++++++++++++++ 1 file changed, 106 insertions(+) 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" From d91d3affa0011889bdb2dee1193025b614351c93 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 9 Jul 2023 17:32:31 +0000 Subject: [PATCH 041/139] 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 69eb3aec290ed7edb645df783b02d6c391adeab5 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Sun, 9 Jul 2023 23:57:36 +0200 Subject: [PATCH 042/139] [IMP] spreadsheet_oca: Allow to edit Odoo graphs properly Fixes #9 --- spreadsheet_oca/__manifest__.py | 1 + .../src/spreadsheet/bundle/odoo_panels.esm.js | 76 +++++++++++++++++++ .../src/spreadsheet/bundle/spreadsheet.xml | 36 +++++++++ .../static/src/spreadsheet/spreadsheet.scss | 5 ++ 4 files changed, 118 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/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 55c2bb0fe98a8eb3c3d437a8a9f7cfbe64546e3a Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 12 Jul 2023 08:11:06 +0000 Subject: [PATCH 043/139] [UPD] Update spreadsheet_oca.pot --- spreadsheet_oca/i18n/spreadsheet_oca.pot | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 From 4d14ebb934c2773f3da34e909cb78617fffc3f96 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 12 Jul 2023 08:13:02 +0000 Subject: [PATCH 044/139] spreadsheet_oca 16.0.1.1.3 --- 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 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", From 058678baf471f02158cff59b73d44872ce137da8 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 12 Jul 2023 08:18:40 +0000 Subject: [PATCH 045/139] [UPD] Update spreadsheet_oca.pot --- spreadsheet_oca/i18n/spreadsheet_oca.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 36b88ef936ebff749ce49002cd8c44c9eb246308 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Sat, 19 Aug 2023 23:44:19 +0200 Subject: [PATCH 046/139] [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