diff --git a/addons/web/static/src/legacy/js/views/graph/graph_renderer.js b/addons/web/static/src/legacy/js/views/graph/graph_renderer.js index ba35e0d976b..a41beda3b22 100644 --- a/addons/web/static/src/legacy/js/views/graph/graph_renderer.js +++ b/addons/web/static/src/legacy/js/views/graph/graph_renderer.js @@ -263,6 +263,7 @@ odoo.define("web/static/src/js/views/graph/graph_renderer", function (require) { const innerHTML = this.env.qweb.renderToString("web.GraphRenderer.CustomTooltip", { maxWidth: getMaxWidth(this.chart.chartArea), measure: this.measureDescription, + mode: this.props.mode, tooltipItems: this._getTooltipItems(tooltipModel), }); const template = Object.assign(document.createElement("template"), { innerHTML }); @@ -616,11 +617,14 @@ odoo.define("web/static/src/js/views/graph/graph_renderer", function (require) { let label = data.labels[item.index]; let value; let boxColor; + let percentage; if (this.props.mode === "pie") { if (label === this.noDataLabel) { value = this._formatValue(0); } else { value = this._formatValue(dataset.data[item.index]); + const totalData = dataset.data.reduce((a, b) => a + b, 0); + percentage = totalData && ((dataset.data[item.index] * 100) / totalData).toFixed(2); } label = this._relabelling(label, comparisonFieldIndex, dataset.originIndex); if (this.props.origins.length > 1) { @@ -640,7 +644,7 @@ odoo.define("web/static/src/js/views/graph/graph_renderer", function (require) { dataset.backgroundColor : dataset.borderColor; } - return { id, label, value, boxColor }; + return { id, label, value, boxColor, percentage }; } /** diff --git a/addons/web/static/src/legacy/scss/graph_view.scss b/addons/web/static/src/legacy/scss/graph_view.scss index 82c0ce39d5f..84f755e46d9 100644 --- a/addons/web/static/src/legacy/scss/graph_view.scss +++ b/addons/web/static/src/legacy/scss/graph_view.scss @@ -49,6 +49,9 @@ padding-bottom: 1px; } td { + &:nth-child(1) { + min-width: 100px; + } span.o_square { height: 12px; width: 12px; diff --git a/addons/web/static/src/views/graph/graph_renderer.js b/addons/web/static/src/views/graph/graph_renderer.js index 1c06b3eeeb4..7f7e36ed675 100644 --- a/addons/web/static/src/views/graph/graph_renderer.js +++ b/addons/web/static/src/views/graph/graph_renderer.js @@ -111,6 +111,7 @@ export class GraphRenderer extends Component { const innerHTML = this.env.qweb.renderToString("web.GraphRenderer.CustomTooltip", { maxWidth: getMaxWidth(this.chart.chartArea), measure: measures[measure].string, + mode: this.model.metaData.mode, tooltipItems: this.getTooltipItems(data, metaData, tooltipModel), }); const template = Object.assign(document.createElement("template"), { innerHTML }); @@ -456,6 +457,7 @@ export class GraphRenderer extends Component { let label = dataset.trueLabels[id]; let value = this.formatValue(dataset.data[id], allIntegers); let boxColor; + let percentage; if (mode === "pie") { if (label === NO_DATA) { value = this.formatValue(0, allIntegers); @@ -464,13 +466,15 @@ export class GraphRenderer extends Component { label = `${dataset.label} / ${label}`; } boxColor = dataset.backgroundColor[id]; + const totalData = dataset.data.reduce((a, b) => a + b, 0); + percentage = totalData && ((dataset.data[item.index] * 100) / totalData).toFixed(2); } else { if (groupBy.length > 1 || domains.length > 1) { label = `${label} / ${dataset.label}`; } boxColor = mode === "bar" ? dataset.backgroundColor : dataset.borderColor; } - items.push({ id, label, value, boxColor }); + items.push({ id, label, value, boxColor, percentage }); } return items; } diff --git a/addons/web/static/src/views/graph/graph_renderer.xml b/addons/web/static/src/views/graph/graph_renderer.xml index 29333a22286..c41b2377e82 100644 --- a/addons/web/static/src/views/graph/graph_renderer.xml +++ b/addons/web/static/src/views/graph/graph_renderer.xml @@ -15,7 +15,12 @@ - + + + + (%) + + diff --git a/addons/web/static/src/views/graph/graph_view.scss b/addons/web/static/src/views/graph/graph_view.scss index 955635f6418..8e86df7e582 100644 --- a/addons/web/static/src/views/graph/graph_view.scss +++ b/addons/web/static/src/views/graph/graph_view.scss @@ -50,6 +50,9 @@ padding-bottom: 1px; } td { + &:nth-child(1) { + min-width: 100px; + } span.o_square { height: 12px; width: 12px; diff --git a/addons/web/static/tests/views/graph_view_tests.js b/addons/web/static/tests/views/graph_view_tests.js index 3d5f7584ace..a79bd723082 100644 --- a/addons/web/static/tests/views/graph_view_tests.js +++ b/addons/web/static/tests/views/graph_view_tests.js @@ -1271,7 +1271,7 @@ QUnit.module("Views", (hooks) => { stack: undefined, }); checkLegend(assert, graph, "Total"); - checkTooltip(assert, graph, { lines: [{ label: "Total", value: "8" }] }, 0); + checkTooltip(assert, graph, { lines: [{ label: "Total", value: "8 (100.00%)" }] }, 0); }); QUnit.test("pie chart rendering (one groupBy)", async function (assert) { @@ -1294,8 +1294,8 @@ QUnit.module("Views", (hooks) => { data: [3, 5], }); checkLegend(assert, graph, ["true", "false"]); - checkTooltip(assert, graph, { lines: [{ label: "true", value: "3" }] }, 0); - checkTooltip(assert, graph, { lines: [{ label: "false", value: "5" }] }, 1); + checkTooltip(assert, graph, { lines: [{ label: "true", value: "3 (37.50%)" }] }, 0); + checkTooltip(assert, graph, { lines: [{ label: "false", value: "5 (62.50%)" }] }, 1); }); QUnit.test("pie chart rendering (two groupBy)", async function (assert) { @@ -1320,9 +1320,9 @@ QUnit.module("Views", (hooks) => { label: "", }); checkLegend(assert, graph, ["true / xphone", "false / xphone", "false / xpad"]); - checkTooltip(assert, graph, { lines: [{ label: "true / xphone", value: "3" }] }, 0); - checkTooltip(assert, graph, { lines: [{ label: "false / xphone", value: "1" }] }, 1); - checkTooltip(assert, graph, { lines: [{ label: "false / xpad", value: "4" }] }, 2); + checkTooltip(assert, graph, { lines: [{ label: "true / xphone", value: "3 (37.50%)" }] }, 0); + checkTooltip(assert, graph, { lines: [{ label: "false / xphone", value: "1 (12.50%)" }] }, 1); + checkTooltip(assert, graph, { lines: [{ label: "false / xpad", value: "4 (50.00%)" }] }, 2); }); QUnit.test("pie chart rendering (no groupBy, several domains)", async function (assert) { @@ -1369,7 +1369,7 @@ QUnit.module("Views", (hooks) => { graph, { title: "Revenue", - lines: [{ label: "True group / Total", value: "6" }], + lines: [{ label: "True group / Total", value: "6 (100.00%)" }], }, 0, 0 @@ -1379,7 +1379,7 @@ QUnit.module("Views", (hooks) => { graph, { title: "Revenue", - lines: [{ label: "False group / Total", value: "17" }], + lines: [{ label: "False group / Total", value: "17 (100.00%)" }], }, 0, 1 @@ -1439,7 +1439,7 @@ QUnit.module("Views", (hooks) => { graph, { title: "Revenue", - lines: [{ label: "True group / 1", value: "14" }], + lines: [{ label: "True group / 1", value: "14 (100.00%)" }], }, 0, 0 @@ -1449,7 +1449,7 @@ QUnit.module("Views", (hooks) => { graph, { title: "Revenue", - lines: [{ label: "False group / 1", value: "12" }], + lines: [{ label: "False group / 1", value: "12 (63.16%)" }], }, 0, 1 @@ -1459,7 +1459,7 @@ QUnit.module("Views", (hooks) => { graph, { title: "Revenue", - lines: [{ label: "False group / 2", value: "5" }], + lines: [{ label: "False group / 2", value: "5 (26.32%)" }], }, 1, 1 @@ -1469,7 +1469,7 @@ QUnit.module("Views", (hooks) => { graph, { title: "Revenue", - lines: [{ label: "False group / 4", value: "2" }], + lines: [{ label: "False group / 4", value: "2 (10.53%)" }], }, 2, 1 @@ -1553,7 +1553,7 @@ QUnit.module("Views", (hooks) => { assert, graph, { - lines: [{ label: "February 2021 / W05 2021", value: "1" }], + lines: [{ label: "February 2021 / W05 2021", value: "1 (50.00%)" }], }, 0, 0 @@ -1562,7 +1562,7 @@ QUnit.module("Views", (hooks) => { assert, graph, { - lines: [{ label: "January 2021 / W01 2021", value: "1" }], + lines: [{ label: "January 2021 / W01 2021", value: "1 (25.00%)" }], }, 0, 1 @@ -1571,7 +1571,7 @@ QUnit.module("Views", (hooks) => { assert, graph, { - lines: [{ label: "February 2021 / W07 2021", value: "1" }], + lines: [{ label: "February 2021 / W07 2021", value: "1 (50.00%)" }], }, 1, 0 @@ -1580,7 +1580,7 @@ QUnit.module("Views", (hooks) => { assert, graph, { - lines: [{ label: "January 2021 / W02 2021", value: "1" }], + lines: [{ label: "January 2021 / W02 2021", value: "1 (25.00%)" }], }, 1, 1 @@ -1589,7 +1589,7 @@ QUnit.module("Views", (hooks) => { assert, graph, { - lines: [{ label: "January 2021 / W03 2021", value: "1" }], + lines: [{ label: "January 2021 / W03 2021", value: "1 (25.00%)" }], }, 2, 1 @@ -1598,7 +1598,7 @@ QUnit.module("Views", (hooks) => { assert, graph, { - lines: [{ label: "January 2021 / W04 2021", value: "1" }], + lines: [{ label: "January 2021 / W04 2021", value: "1 (25.00%)" }], }, 3, 1 @@ -1674,7 +1674,7 @@ QUnit.module("Views", (hooks) => { graph, { title: "Revenue", - lines: [{ label: "February 2021 / true / W05 2021", value: "14" }], + lines: [{ label: "February 2021 / true / W05 2021", value: "14 (100.00%)" }], }, 0, 0 @@ -1684,7 +1684,7 @@ QUnit.module("Views", (hooks) => { graph, { title: "Revenue", - lines: [{ label: "January 2021 / true / W01 2021", value: "12" }], + lines: [{ label: "January 2021 / true / W01 2021", value: "12 (70.59%)" }], }, 1, 1 @@ -1694,7 +1694,7 @@ QUnit.module("Views", (hooks) => { graph, { title: "Revenue", - lines: [{ label: "January 2021 / false / W02 2021", value: "5" }], + lines: [{ label: "January 2021 / false / W02 2021", value: "5 (29.41%)" }], }, 2, 1 @@ -1726,7 +1726,7 @@ QUnit.module("Views", (hooks) => { ] ); checkLegend(assert, graph, ["No data"]); - checkTooltip(assert, graph, { lines: [{ label: "No data", value: "0" }] }, 0); + checkTooltip(assert, graph, { lines: [{ label: "No data", value: "0 (100.00%)" }] }, 0); }); QUnit.test("pie chart rendering (no data, several domains)", async function (assert) { @@ -1772,14 +1772,14 @@ QUnit.module("Views", (hooks) => { checkTooltip( assert, graph, - { lines: [{ label: "True group / xphone", value: "1" }] }, + { lines: [{ label: "True group / xphone", value: "1 (100.00%)" }] }, 0, 0 ); checkTooltip( assert, graph, - { lines: [{ label: "False group / No data", value: "0" }] }, + { lines: [{ label: "False group / No data", value: "0 (100.00%)" }] }, 1, 1 );