From 83c38fa2b1d02c11fb226bc19fc7d4f9c483ef09 Mon Sep 17 00:00:00 2001 From: Carlos Roca Date: Wed, 27 Nov 2024 13:39:42 +0100 Subject: [PATCH] [MIG] web_pivot_computed_measure: Migration to 18.0 --- test-requirements.txt | 1 + web_pivot_computed_measure.zip | Bin 0 -> 35946 bytes web_pivot_computed_measure/__manifest__.py | 16 +++-- .../dropdown_item_custom_measure.esm.js | 18 +++--- .../static/src/pivot/pivot_controller.esm.js | 10 +--- .../static/src/pivot/pivot_model.esm.js | 48 +++++++-------- .../static/src/pivot/pivot_renderer.esm.js | 4 +- .../static/src/pivot/pivot_view.xml | 8 +-- .../report_view_measures.esm.js | 16 +++++ .../report_view_measures.xml | 29 +++++++++ .../static/src/test/test.esm.js | 56 ++++++++++++------ .../static/src/view.xml | 29 --------- .../tests/test_ui_pivot.py | 2 +- 13 files changed, 134 insertions(+), 103 deletions(-) create mode 100644 test-requirements.txt create mode 100644 web_pivot_computed_measure.zip create mode 100644 web_pivot_computed_measure/static/src/report_view_measures/report_view_measures.esm.js create mode 100644 web_pivot_computed_measure/static/src/report_view_measures/report_view_measures.xml delete mode 100644 web_pivot_computed_measure/static/src/view.xml diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 000000000..4ad8e0ece --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1 @@ +odoo-test-helper diff --git a/web_pivot_computed_measure.zip b/web_pivot_computed_measure.zip new file mode 100644 index 0000000000000000000000000000000000000000..0244e21ca76ef4f1598719799ed749ac4312005d GIT binary patch literal 35946 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 literal 0 HcmV?d00001 diff --git a/web_pivot_computed_measure/__manifest__.py b/web_pivot_computed_measure/__manifest__.py index 02260c9c7..6ff8fb5ea 100644 --- a/web_pivot_computed_measure/__manifest__.py +++ b/web_pivot_computed_measure/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Web Pivot Computed Measure", "category": "web", - "version": "16.0.1.0.0", + "version": "18.0.1.0.0", "author": "Tecnativa, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/web", @@ -13,13 +13,17 @@ "maintainers": ["CarlosRoca13"], "assets": { "web.assets_backend": [ - "/web_pivot_computed_measure/static/src/**/*.esm.js", - "/web_pivot_computed_measure/static/src/**/*.scss", - ("remove", "/web_pivot_computed_measure/static/src/test/*.esm.js"), - "/web_pivot_computed_measure/static/src/**/*.xml", + "web_pivot_computed_measure/static/src/**/*.esm.js", + "web_pivot_computed_measure/static/src/**/*.scss", + "web_pivot_computed_measure/static/src/**/*.xml", + ("remove", "web_pivot_computed_measure/static/src/test/*.esm.js"), + ("remove", "web_pivot_computed_measure/static/src/pivot/*"), + ], + "web.assets_backend_lazy": [ + "web_pivot_computed_measure/static/src/pivot/*", ], "web.assets_tests": [ - "/web_pivot_computed_measure/static/src/test/test.esm.js", + "web_pivot_computed_measure/static/src/test/test.esm.js", ], }, } diff --git a/web_pivot_computed_measure/static/src/dropdown_item_custom_measure/dropdown_item_custom_measure.esm.js b/web_pivot_computed_measure/static/src/dropdown_item_custom_measure/dropdown_item_custom_measure.esm.js index e6a9259cd..b19e3ab87 100644 --- a/web_pivot_computed_measure/static/src/dropdown_item_custom_measure/dropdown_item_custom_measure.esm.js +++ b/web_pivot_computed_measure/static/src/dropdown_item_custom_measure/dropdown_item_custom_measure.esm.js @@ -17,16 +17,18 @@ export class DropdownItemCustomMeasure extends Component { } addMeasure(ev) { - const $target = $(ev.target).closest("#add_computed_measure_wrapper"); + const target = ev.target.closest("#add_computed_measure_wrapper"); const id = new Date().getTime(); - const field1 = $target.find("#computed_measure_field_1").val(); - const field2 = $target.find("#computed_measure_field_2").val(); - let operation = $target.find("#computed_measure_operation").val(); + const field1 = target.querySelector("#computed_measure_field_1").value; + const field2 = target.querySelector("#computed_measure_field_2").value; + let operation = target.querySelector("#computed_measure_operation").value; if (operation === "custom") { - operation = $target.find("#computed_measure_operation_custom").val(); + operation = target.querySelector( + "#computed_measure_operation_custom" + ).value; } - const name = $target.find("#computed_measure_name").val(); - const format = $target.find("#computed_measure_format").val(); + const name = target.querySelector("#computed_measure_name").value; + const format = target.querySelector("#computed_measure_format").value; this.props.model.addComputedMeasure( id, field1, @@ -35,8 +37,6 @@ export class DropdownItemCustomMeasure extends Component { name, format ); - // Click on measures button to close the modal and recompute the measures added - $(ev.target).closest(".dropdown").find(".dropdown-toggle").trigger("click"); } } DropdownItemCustomMeasure.template = diff --git a/web_pivot_computed_measure/static/src/pivot/pivot_controller.esm.js b/web_pivot_computed_measure/static/src/pivot/pivot_controller.esm.js index 8fd29a265..6ac0e8e6d 100644 --- a/web_pivot_computed_measure/static/src/pivot/pivot_controller.esm.js +++ b/web_pivot_computed_measure/static/src/pivot/pivot_controller.esm.js @@ -4,9 +4,8 @@ import {PivotController} from "@web/views/pivot/pivot_controller"; import {patch} from "@web/core/utils/patch"; -import {DropdownItemCustomMeasure} from "../dropdown_item_custom_measure/dropdown_item_custom_measure.esm"; -patch(PivotController.prototype, "web_pivot_computed_measure.PivotController", { +patch(PivotController.prototype, { /** * Add computed_measures to context key to avoid loosing info when saving the * filter to favorites. @@ -14,13 +13,8 @@ patch(PivotController.prototype, "web_pivot_computed_measure.PivotController", { * @override */ getContext() { - var res = this._super(...arguments); + var res = super.getContext(...arguments); res.pivot_computed_measures = this.model._computed_measures; return res; }, }); - -PivotController.components = { - ...PivotController.components, - DropdownItemCustomMeasure, -}; diff --git a/web_pivot_computed_measure/static/src/pivot/pivot_model.esm.js b/web_pivot_computed_measure/static/src/pivot/pivot_model.esm.js index 6a2f454c0..c7a2d0e5f 100644 --- a/web_pivot_computed_measure/static/src/pivot/pivot_model.esm.js +++ b/web_pivot_computed_measure/static/src/pivot/pivot_model.esm.js @@ -8,14 +8,14 @@ import {patch} from "@web/core/utils/patch"; import {computeReportMeasures} from "@web/views/utils"; import {evalOperation} from "../helpers/utils.esm"; -patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { +patch(PivotModel.prototype, { /** * Add _computed_measures to avoid recompute them until page is recharged * * @override */ setup() { - this._super(...arguments); + super.setup(...arguments); this._computed_measures = []; }, @@ -31,7 +31,7 @@ patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { * @returns a promise */ addComputedMeasure(id, field1, field2, operation, name, format) { - const measure = _.find(this._computed_measures, (item) => { + const measure = this._computed_measures.find((item) => { return ( item.field1 === field1 && item.field2 === field2 && @@ -92,7 +92,7 @@ patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { // Used to know if is a computed measure field __computed_id: cmDef.id, // Operator used for group the measure added. - group_operator: "sum", + aggregator: "sum", }; const metaData = (config && config.metaData) || this.metaData; metaData.measures[cmDef.id] = arrFields[cmDef.id]; @@ -133,7 +133,7 @@ patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { (config && config.metaData.activeMeasures) || this.metaData.activeMeasures || []; - return _.contains(activeMeasures, field); + return activeMeasures.includes(field); }, /** @@ -148,7 +148,6 @@ patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { if (subGroupData.__count === 0) { subGroupData[cm.id] = false; } else { - subGroupData[cm.id] = evalOperation(cm.operation, subGroupData); } } @@ -165,7 +164,7 @@ patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { this._fillComputedMeasuresData(subGroup, config); } } - this._super(...arguments); + super._prepareData(...arguments); }, /** @@ -177,16 +176,16 @@ patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { * * @override */ - _getGroupSubdivision(group, rowGroupBy, colGroupBy, config) { + async _getGroupSubdivision(group, rowGroupBy, colGroupBy, config) { const computed_measures = []; - for (let i = 0; i < config.metaData.activeMeasures.length; i++) - if (config.metaData.activeMeasures[i].startsWith("__computed_")) { - computed_measures.push(config.metaData.activeMeasures[i]); - config.metaData.activeMeasures.splice(i, 1); + for (let i = 0; i < config.measureSpecs.length; i++) + if (config.measureSpecs[i].startsWith("__computed_")) { + computed_measures.push(config.measureSpecs[i]); + config.measureSpecs.splice(i, 1); i--; } - const res = this._super(...arguments); - $.merge(config.metaData.activeMeasures, computed_measures); + const res = await super._getGroupSubdivision(...arguments); + Object.assign(config.measureSpecs, computed_measures); return res; }, @@ -199,7 +198,7 @@ patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { toggleMeasure(fieldName) { if (this._isMeasureEnabled(fieldName)) { // Mesaure is enabled - const umeasures = _.filter(this._computed_measures, (item) => { + const umeasures = this._computed_measures.filter((item) => { return item.field1 === fieldName || item.field2 === fieldName; }); if (umeasures.length && this._isMeasureEnabled(umeasures[0].id)) { @@ -219,8 +218,8 @@ patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { const fieldDef = this.metaData.fields[afield]; // Need to check if fieldDef exists to avoid problems with __count if (fieldDef && fieldDef.__computed_id) { - const cm = _.find(this._computed_measures, { - id: fieldDef.__computed_id, + const cm = this._computed_measures.find((item) => { + return item.id === fieldDef.__computed_id; }); toAnalyze.push(cm.field1, cm.field2); const toEnableFields = []; @@ -238,11 +237,11 @@ patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { this._activeMeasures( // Transform the array of arrays to a simple array. // [1, [2, 3]] => [1, 2, 3] - _.flatten(toEnable.reverse()) + toEnable.reverse().flat(Infinity) ); } } - return this._super(...arguments); + return super.toggleMeasure(...arguments); }, /** * Load the measures added to selected favorite filters @@ -250,7 +249,7 @@ patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { * @override */ async load(searchParams) { - var _super = this._super.bind(this); + var _super = super.load.bind(this); var config = {metaData: this.metaData, data: this.data}; if (!this.metaData.measures) { const metaData = this._buildMetaData(); @@ -278,15 +277,14 @@ patch(PivotModel.prototype, "web_pivot_computed_measure.PivotModel", { for (const fieldName of fieldNames) { const field = this.metaData.fields[fieldName]; if (field.__computed_id) { - const cm = _.find(this._computed_measures, { - id: field.__computed_id, + const cm = this._computed_measures.find((item) => { + return item.id === field.__computed_id; }); if (!cm) { delete this.metaData.fields[fieldName]; delete this.metaData.measures[fieldName]; - this.metaData.activeMeasures = _.without( - this.metaData.activeMeasures, - fieldName + this.metaData.activeMeasures = this.metaData.activeMeasures.filter( + (item) => item !== fieldName ); } } diff --git a/web_pivot_computed_measure/static/src/pivot/pivot_renderer.esm.js b/web_pivot_computed_measure/static/src/pivot/pivot_renderer.esm.js index 3987dc852..3598cb548 100644 --- a/web_pivot_computed_measure/static/src/pivot/pivot_renderer.esm.js +++ b/web_pivot_computed_measure/static/src/pivot/pivot_renderer.esm.js @@ -5,11 +5,11 @@ import {PivotRenderer} from "@web/views/pivot/pivot_renderer"; import {patch} from "@web/core/utils/patch"; -patch(PivotRenderer.prototype, "web_pivot_computed_measure.PivotRenderer", { +patch(PivotRenderer.prototype, { getFormattedValue(cell) { if (cell.value === Infinity) { return "-"; } - return this._super(...arguments); + return super.getFormattedValue(...arguments); }, }); diff --git a/web_pivot_computed_measure/static/src/pivot/pivot_view.xml b/web_pivot_computed_measure/static/src/pivot/pivot_view.xml index 4027ce8c5..4e46243f3 100644 --- a/web_pivot_computed_measure/static/src/pivot/pivot_view.xml +++ b/web_pivot_computed_measure/static/src/pivot/pivot_view.xml @@ -1,9 +1,9 @@ - - - - + + + true + model diff --git a/web_pivot_computed_measure/static/src/report_view_measures/report_view_measures.esm.js b/web_pivot_computed_measure/static/src/report_view_measures/report_view_measures.esm.js new file mode 100644 index 000000000..e519e89d7 --- /dev/null +++ b/web_pivot_computed_measure/static/src/report_view_measures/report_view_measures.esm.js @@ -0,0 +1,16 @@ +/** @odoo-module **/ +/* Copyright 2024 Tecnativa - Carlos Roca + * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) */ + +import {ReportViewMeasures} from "@web/views/view_components/report_view_measures"; +import {DropdownItemCustomMeasure} from "../dropdown_item_custom_measure/dropdown_item_custom_measure.esm"; + +ReportViewMeasures.components = { + ...ReportViewMeasures.components, + DropdownItemCustomMeasure, +}; +ReportViewMeasures.props = { + ...ReportViewMeasures.props, + add_computed_measures: {type: Boolean, optional: true}, + model: {type: Object, optional: true}, +}; diff --git a/web_pivot_computed_measure/static/src/report_view_measures/report_view_measures.xml b/web_pivot_computed_measure/static/src/report_view_measures/report_view_measures.xml new file mode 100644 index 000000000..6e6358221 --- /dev/null +++ b/web_pivot_computed_measure/static/src/report_view_measures/report_view_measures.xml @@ -0,0 +1,29 @@ + + + + + !measure.startsWith('__computed_') + + +