diff --git a/addons/spreadsheet/static/src/chart/odoo_chart/odoo_line_chart.js b/addons/spreadsheet/static/src/chart/odoo_chart/odoo_line_chart.js index 38a542c273e..48c7740547e 100644 --- a/addons/spreadsheet/static/src/chart/odoo_chart/odoo_line_chart.js +++ b/addons/spreadsheet/static/src/chart/odoo_chart/odoo_line_chart.js @@ -21,6 +21,7 @@ export class OdooLineChart extends OdooChart { super(definition, sheetId, getters); this.verticalAxisPosition = definition.verticalAxisPosition; this.stacked = definition.stacked; + this.cumulative = definition.cumulative; } getDefinition() { @@ -28,6 +29,7 @@ export class OdooLineChart extends OdooChart { ...super.getDefinition(), verticalAxisPosition: this.verticalAxisPosition, stacked: this.stacked, + cumulative: this.cumulative, }; } } @@ -49,13 +51,21 @@ function createOdooChartRuntime(chart, getters) { const locale = getters.getLocale(); const chartJsConfig = getLineConfiguration(chart, labels, locale); const colors = new ChartColors(); - for (const [index, { label, data }] of datasets.entries()) { + for (let [index, { label, data }] of datasets.entries()) { const color = colors.next(); const backgroundRGBA = colorToRGBA(color); if (chart.stacked) { // use the transparency of Odoo to keep consistency backgroundRGBA.a = LINE_FILL_TRANSPARENCY; } + if (chart.cumulative) { + let accumulator = 0; + data = data.map((value) => { + accumulator += value; + return accumulator; + }); + } + const backgroundColor = rgbaToHex(backgroundRGBA); const dataset = { label, diff --git a/addons/spreadsheet/static/tests/charts/model/odoo_chart_plugin_test.js b/addons/spreadsheet/static/tests/charts/model/odoo_chart_plugin_test.js index 461abd78333..367e11c76bc 100644 --- a/addons/spreadsheet/static/tests/charts/model/odoo_chart_plugin_test.js +++ b/addons/spreadsheet/static/tests/charts/model/odoo_chart_plugin_test.js @@ -481,4 +481,40 @@ QUnit.module("spreadsheet > odoo chart plugin", {}, () => { assert.deepEqual(chartDataSource.getData(), { datasets: [], labels: [] }); } ); + + QUnit.test("Line chart to support cumulative data", async (assert) => { + const { model } = await createSpreadsheetWithChart({ type: "odoo_line" }); + const sheetId = model.getters.getActiveSheetId(); + const chartId = model.getters.getChartIds(sheetId)[0]; + const definition = model.getters.getChartDefinition(chartId); + await waitForDataSourcesLoaded(model); + assert.deepEqual( + model.getters.getChartRuntime(chartId).chartJsConfig.data.datasets[0].data, + [1, 3] + ); + model.dispatch("UPDATE_CHART", { + definition: { + ...definition, + cumulative: true, + }, + id: chartId, + sheetId, + }); + assert.deepEqual( + model.getters.getChartRuntime(chartId).chartJsConfig.data.datasets[0].data, + [1, 4] + ); + model.dispatch("UPDATE_CHART", { + definition: { + ...definition, + cumulative: false, + }, + id: chartId, + sheetId, + }); + assert.deepEqual( + model.getters.getChartRuntime(chartId).chartJsConfig.data.datasets[0].data, + [1, 3] + ); + }); });