From 48a156ef656349344f5d401c0a6ea12e297427a4 Mon Sep 17 00:00:00 2001 From: Dennis Oelkers Date: Fri, 30 Aug 2024 10:36:29 +0200 Subject: [PATCH 1/4] Fixing exception in bar chart with stack mode when no data is present. This change is fixing an issue which results in an exception being thrown when a bar chart visualization in stack mode has no data. --- .../components/visualizations/utils/chartLayoutGenerators.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts b/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts index a3285ebab169..7f89d98786d9 100644 --- a/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts +++ b/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts @@ -266,7 +266,7 @@ export const generateMappersForYAxis = ( }); }; -const joinValues = (values: Array>, barmode: BarMode): Array => { +const joinValues = (values: Array> = [], barmode: BarMode): Array => { if (barmode === 'stack' || barmode === 'relative') { return zipWith(...values, (...iterateValues) => sum(iterateValues)); } From 0300e24f227fe008a737098d85854451f64934ee Mon Sep 17 00:00:00 2001 From: Dennis Oelkers Date: Fri, 30 Aug 2024 10:38:10 +0200 Subject: [PATCH 2/4] Simplifying code by replacing `transform`. --- .../visualizations/utils/chartLayoutGenerators.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts b/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts index 7f89d98786d9..a33f953d56ba 100644 --- a/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts +++ b/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts @@ -15,7 +15,6 @@ * . */ -import transform from 'lodash/transform'; import zipWith from 'lodash/zipWith'; import sum from 'lodash/sum'; import flattenDeep from 'lodash/flattenDeep'; @@ -285,7 +284,7 @@ export type GenerateLayoutsParams = { export const generateLayouts = ( { unitTypeMapper, chartData, barmode, widgetUnits, config, theme }: GenerateLayoutsParams, -): Record => { +) => { const groupYValuesByUnitTypeKey = chartData.reduce<{} | Record>>>((res, value: ChartDefinition) => { const traceName = value.fullPath; const fieldName = getFieldNameFromTrace({ series: config.series, fullPath: traceName }); @@ -301,10 +300,11 @@ export const generateLayouts = ( return res; }, {}); - return transform(unitTypeMapper, (res, { axisKeyName, axisCount }, unitTypeKey: FieldUnitType | DefaultAxisKey) => { + return Object.fromEntries(Object.entries(unitTypeMapper).map(([unitTypeKey, { axisKeyName, axisCount }]) => { const unitValues = joinValues(groupYValuesByUnitTypeKey[unitTypeKey], barmode); - res[axisKeyName] = getUnitLayoutWithData(unitTypeKey, axisCount, unitValues, theme); - }); + + return [axisKeyName, getUnitLayoutWithData(unitTypeKey as FieldUnitType, axisCount, unitValues, theme)]; + })); }; const getHoverTexts = ({ convertedValues, unit }: { convertedValues: Array, From 8fbc725b07fc40d777c7ef282bd5917672a4de4c Mon Sep 17 00:00:00 2001 From: Dennis Oelkers Date: Fri, 30 Aug 2024 10:38:23 +0200 Subject: [PATCH 3/4] Suppressing linter hint. --- .../components/visualizations/utils/chartLayoutGenerators.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts b/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts index a33f953d56ba..f3e0c923f4b3 100644 --- a/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts +++ b/graylog2-web-interface/src/views/components/visualizations/utils/chartLayoutGenerators.ts @@ -265,6 +265,7 @@ export const generateMappersForYAxis = ( }); }; +// eslint-disable-next-line default-param-last const joinValues = (values: Array> = [], barmode: BarMode): Array => { if (barmode === 'stack' || barmode === 'relative') { return zipWith(...values, (...iterateValues) => sum(iterateValues)); From d838fe6fe69f1da282ce4312a16ded8f29c74ae7 Mon Sep 17 00:00:00 2001 From: Dennis Oelkers Date: Fri, 30 Aug 2024 10:43:37 +0200 Subject: [PATCH 4/4] Adding test case. --- .../utils/__tests__/chartLayoutGenerators.test.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/chartLayoutGenerators.test.ts b/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/chartLayoutGenerators.test.ts index 2588cfd79e72..3fe1366a688c 100644 --- a/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/chartLayoutGenerators.test.ts +++ b/graylog2-web-interface/src/views/components/visualizations/utils/__tests__/chartLayoutGenerators.test.ts @@ -174,6 +174,12 @@ describe('Chart Layout Generators', () => { expect(result).toEqual(layoutsFor4axis); }); + + it('does not throw exception when chart data is `undefined` in stack mode', () => { + const result = generateLayouts({ ...params, chartData: [], barmode: 'stack' }); + + expect(result).toBeDefined(); + }); }); describe('getHoverTemplateSettings', () => {