Skip to content

Commit 646db21

Browse files
committed
[FIX] charts: hierarchical charts should show formatted labels instead of raw
Before this commit: - Hierarchical charts interpret datasets as labels and the last column as values. dataset cells were read as raw values, which is correct for other charts but incorrect here because these values are rendered as labels. - As a result, formatted values were displayed incorrectly in charts like Sunburst and Treemap. After this commit: - Dataset columns used as labels now use formatted cell values instead of raw values, ensuring dates and other formatted types display correctly in hierarchical charts. closes #8133 Task: 5913296 X-original-commit: 5e7fb8c Signed-off-by: Rémi Rahir (rar) <rar@odoo.com> Signed-off-by: Ronakkumar Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com>
1 parent ca666fc commit 646db21

File tree

3 files changed

+77
-11
lines changed

3 files changed

+77
-11
lines changed

src/helpers/figures/charts/runtime/chart_data_extractor.ts

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import {
4343
CellValue,
4444
DEFAULT_LOCALE,
4545
Format,
46+
FormattedValue,
4647
GenericDefinition,
4748
Getters,
4849
Locale,
@@ -780,20 +781,42 @@ function fixEmptyLabelsForDateCharts(
780781
return { labels: newLabels, dataSetsValues: newDatasets };
781782
}
782783

784+
function getDatasetRange(getters: Getters, ds: DataSet): Range | undefined {
785+
if (!ds.dataRange) {
786+
return;
787+
}
788+
789+
const labelCellZone = ds.labelCell ? [ds.labelCell.zone] : [];
790+
const dataZone = recomputeZones([ds.dataRange.zone], labelCellZone)[0];
791+
if (!dataZone) {
792+
return;
793+
}
794+
795+
return getters.getRangeFromZone(ds.dataRange.sheetId, dataZone);
796+
}
797+
783798
/**
784799
* Get the data from a dataSet
785800
*/
786801
export function getData(getters: Getters, ds: DataSet): (CellValue | undefined)[] {
787-
if (ds.dataRange) {
788-
const labelCellZone = ds.labelCell ? [ds.labelCell.zone] : [];
789-
const dataZone = recomputeZones([ds.dataRange.zone], labelCellZone)[0];
790-
if (dataZone === undefined) {
791-
return [];
792-
}
793-
const dataRange = getters.getRangeFromZone(ds.dataRange.sheetId, dataZone);
794-
return getters.getRangeValues(dataRange).map((value) => (value === "" ? undefined : value));
802+
const range = getDatasetRange(getters, ds);
803+
if (!range) {
804+
return [];
805+
}
806+
807+
return getters.getRangeValues(range).map((value) => (value === "" ? undefined : value));
808+
}
809+
810+
/**
811+
* Get the formatted data from a dataSet
812+
*/
813+
function getFormattedData(getters: Getters, ds: DataSet): (FormattedValue | undefined)[] {
814+
const range = getDatasetRange(getters, ds);
815+
if (!range) {
816+
return [];
795817
}
796-
return [];
818+
819+
return getters.getRangeFormattedValues(range).map((value) => (value === "" ? undefined : value));
797820
}
798821

799822
/**
@@ -1081,13 +1104,13 @@ function getHierarchicalDatasetValues(getters: Getters, dataSets: DataSet[]): Da
10811104
(ds) => !getters.isColHidden(ds.dataRange.sheetId, ds.dataRange.zone.left)
10821105
);
10831106
const datasetValues: DatasetValues[] = dataSets.map(() => ({ data: [], label: "" }));
1084-
const dataSetsData = dataSets.map((ds) => getData(getters, ds));
1107+
const dataSetsData = dataSets.map((ds) => getFormattedData(getters, ds));
10851108
if (!dataSetsData.length) {
10861109
return datasetValues;
10871110
}
10881111
const minLength = Math.min(...dataSetsData.map((ds) => ds.length));
10891112

1090-
let currentValues: (CellValue | undefined)[] = [];
1113+
let currentValues: (FormattedValue | undefined)[] = [];
10911114
const leafDatasetIndex = dataSets.length - 1;
10921115

10931116
for (let i = 0; i < minLength; i++) {

tests/figures/chart/sunburst/sunburst_chart_plugin.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,25 @@ describe("Sunburst chart chart", () => {
130130
]);
131131
});
132132

133+
test("Sunburst chart display dataset labels in formatted form", () => {
134+
// prettier-ignore
135+
setGrid(model, {
136+
A2: "2/3/2010", B2: "10",
137+
A3: "5/8/2015", B3: "40",
138+
})
139+
const chartId = createSunburstChart(model, {
140+
dataSets: [{ dataRange: "A1:A3" }],
141+
labelRange: "B1:B3",
142+
});
143+
144+
const config = getSunburstRuntime(chartId).chartJsConfig;
145+
expect(config.data.datasets).toHaveLength(1);
146+
expect(config.data.datasets[0].data).toMatchObject([
147+
{ value: 40, label: "5/8/2015", groups: ["5/8/2015"] },
148+
{ value: 10, label: "2/3/2010", groups: ["2/3/2010"] },
149+
]);
150+
});
151+
133152
test("Sunburst data is sorted", () => {
134153
// prettier-ignore
135154
setGrid(model, {

tests/figures/chart/treemap/treemap_chart_plugin.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,30 @@ describe("TreeMap chart", () => {
158158
});
159159
});
160160

161+
test("TreeMap chart display dataset labels in formatted form", () => {
162+
// prettier-ignore
163+
setGrid(model, {
164+
A1: "Date", B1: "Sales",
165+
A2: "2/3/2010", B2: "10",
166+
A3: "5/8/2015", B3: "40",
167+
})
168+
const chartId = createTreeMapChart(model, {
169+
dataSets: [{ dataRange: "A1:A3" }],
170+
labelRange: "B1:B3",
171+
dataSetsHaveTitle: true,
172+
});
173+
174+
const datasetConfig = getTreeMapDatasetConfig(chartId);
175+
expect(datasetConfig).toMatchObject({
176+
tree: [
177+
{ 0: "2/3/2010", value: 10 },
178+
{ 0: "5/8/2015", value: 40 },
179+
],
180+
groups: ["0"],
181+
key: "value",
182+
});
183+
});
184+
161185
test("Can have a hierarchical dataset with some categories more detailed that others", () => {
162186
// prettier-ignore
163187
setGrid(model, {

0 commit comments

Comments
 (0)