fix: Multiseries chart data does not load completely (#20248)

## Description

When single series line chart data has 0 in one y axis value the chart
renders fine but when we add a series to the chart the 0 values were
being sent as null. This was because of an `if` condition which would
send null if the value is 0.
This PR fixes it so that 0 values are passed down to chart properly.

Fixes #20212

## Type of change

- Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

- Jest

### Test Case
> https://github.com/appsmithorg/TestSmith/issues/2174

### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)


## Checklist:
### Dev activity
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my own code
- [x] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag


### QA activity:
- [x] Test plan has been approved by relevant developers
- [x] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test
This commit is contained in:
Souma Ghosh 2023-02-02 19:47:09 +05:30 committed by GitHub
parent 5c8ab85df7
commit f95f0dcee0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 60 additions and 23 deletions

View File

@ -14,6 +14,7 @@ import {
LabelOrientation,
LABEL_ORIENTATION_COMPATIBLE_CHARTS,
} from "../constants";
import { getSeriesChartData } from "./utils";
import log from "loglevel";
import { Colors } from "constants/Colors";
// Leaving this require here. Ref: https://stackoverflow.com/questions/41292559/could-not-find-a-declaration-file-for-module-module-name-path-to-module-nam/42505940#42505940
@ -198,28 +199,6 @@ class ChartComponent extends React.Component<ChartComponentProps> {
});
};
getSeriesChartData = (data: ChartDataPoint[], categories: string[]) => {
const dataMap: { [key: string]: string } = {};
// if not array or (is array and array length is zero)
if (!Array.isArray(data) || (Array.isArray(data) && data.length === 0)) {
return [
{
value: "",
},
];
}
for (let index = 0; index < data.length; index++) {
const item: ChartDataPoint = data[index];
dataMap[item.x] = item.y;
}
return categories.map((category: string) => {
return {
value: dataMap[category] ? dataMap[category] : null,
};
});
};
/**
* creates dataset need by fusion chart from widget object-data
*
@ -235,7 +214,7 @@ class ChartComponent extends React.Component<ChartComponentProps> {
const seriesChartData: Array<Record<
string,
unknown
>> = this.getSeriesChartData(get(item, "data", []), categories);
>> = getSeriesChartData(get(item, "data", []), categories);
return {
seriesName: item.seriesName,
color: item.color

View File

@ -0,0 +1,29 @@
import { getSeriesChartData } from "./utils";
describe("getSeriesChartData", () => {
it("should return 0 in value when some y axis inputs are 0", () => {
const data = [
{ x: "Jul", y: 3 },
{ x: "Aug", y: 2 },
{ x: "Sep", y: 2 },
{ x: "Oct", y: 0 },
{ x: "Nov", y: 2 },
{ x: "Dec", y: 0 },
{ x: "Jan", y: 1 },
];
const categories = ["Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan"];
const result = getSeriesChartData(data, categories);
const expected = [
{ value: 3 },
{ value: 2 },
{ value: 2 },
{ value: 0 },
{ value: 2 },
{ value: 0 },
{ value: 1 },
];
expect(result).toStrictEqual(expected);
});
});

View File

@ -0,0 +1,29 @@
import { ChartDataPoint } from "../constants";
export const getSeriesChartData = (
data: ChartDataPoint[],
categories: string[],
) => {
const dataMap: { [key: string]: string } = {};
// if not array or (is array and array length is zero)
if (!Array.isArray(data) || (Array.isArray(data) && data.length === 0)) {
return [
{
value: "",
},
];
}
for (let index = 0; index < data.length; index++) {
const item: ChartDataPoint = data[index];
dataMap[item.x] = item.y;
}
return categories.map((category: string) => {
return {
value:
dataMap[category] || dataMap[category]?.toString()
? dataMap[category]
: null,
};
});
};