From 6f5fc16df9c7c18bcc0adc1df9f441edc9be023e Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Fri, 3 May 2024 17:26:32 +0200 Subject: [PATCH 1/3] fix(charts): correctly apply React `key` with function `accessor`s --- .../src/components/BarChart/BarChart.cy.tsx | 16 ++++++++-- .../src/components/BarChart/BarChart.tsx | 4 +-- .../components/BulletChart/BulletChart.tsx | 4 +-- .../components/ColumnChart/ColumnChart.tsx | 4 +-- .../src/components/ComposedChart/index.tsx | 4 +-- .../src/components/LineChart/LineChart.tsx | 4 +-- .../src/components/RadarChart/RadarChart.tsx | 2 +- .../components/ScatterChart/ScatterChart.tsx | 11 +++++-- .../hooks/usePrepareDimensionsAndMeasures.ts | 30 ++++++++++++++----- 9 files changed, 54 insertions(+), 25 deletions(-) diff --git a/packages/charts/src/components/BarChart/BarChart.cy.tsx b/packages/charts/src/components/BarChart/BarChart.cy.tsx index 828ddc184c3..518c8e710cd 100644 --- a/packages/charts/src/components/BarChart/BarChart.cy.tsx +++ b/packages/charts/src/components/BarChart/BarChart.cy.tsx @@ -8,14 +8,15 @@ const dimensions = [ interval: 0 } ]; + const measures = [ { - accessor: 'users', + accessor: (data) => data.users, label: 'Users', formatter: (val: number) => val.toLocaleString('en') }, { - accessor: 'sessions', + accessor: (data) => data.sessions, label: 'Active Sessions', formatter: (val) => `${val} sessions`, hideDataLabel: true @@ -66,7 +67,16 @@ describe('BarChart', () => { 'have.been.calledWith', Cypress.sinon.match({ detail: Cypress.sinon.match({ - dataKey: 'users' + value: 'Users' + }) + }) + ); + cy.contains('Vol.').click(); + cy.get('@onLegendClick').should( + 'have.been.calledWith', + Cypress.sinon.match({ + detail: Cypress.sinon.match({ + dataKey: 'volume' }) }) ); diff --git a/packages/charts/src/components/BarChart/BarChart.tsx b/packages/charts/src/components/BarChart/BarChart.tsx index 3dc4df94c12..d37c81fb042 100644 --- a/packages/charts/src/components/BarChart/BarChart.tsx +++ b/packages/charts/src/components/BarChart/BarChart.tsx @@ -297,7 +297,7 @@ const BarChart = forwardRef((props, ref) => { } tickLine={index < 1} @@ -316,7 +316,7 @@ const BarChart = forwardRef((props, ref) => { ((props, ref) => axisProps.reversed = isRTL; } - return ; + return ; })} {layout === 'horizontal' && ( ((props, ref) => return ( diff --git a/packages/charts/src/components/ColumnChart/ColumnChart.tsx b/packages/charts/src/components/ColumnChart/ColumnChart.tsx index 07aab1ba7c3..b03b0c81304 100644 --- a/packages/charts/src/components/ColumnChart/ColumnChart.tsx +++ b/packages/charts/src/components/ColumnChart/ColumnChart.tsx @@ -253,7 +253,7 @@ const ColumnChart = forwardRef((props, ref) => dimensions.map((dimension, index) => { return ( ((props, ref) => yAxisId={chartConfig.secondYAxis?.dataKey === element.accessor ? 'right' : 'left'} stackId={element.stackId} fillOpacity={element.opacity} - key={element.accessor} + key={element.key} name={element.label ?? element.accessor} strokeOpacity={element.opacity} type="monotone" diff --git a/packages/charts/src/components/ComposedChart/index.tsx b/packages/charts/src/components/ComposedChart/index.tsx index e27a309f529..03deb1d5998 100644 --- a/packages/charts/src/components/ComposedChart/index.tsx +++ b/packages/charts/src/components/ComposedChart/index.tsx @@ -326,7 +326,7 @@ const ComposedChart = forwardRef((props, ref axisProps.reversed = isRTL; } - return ; + return ; })} {layout === 'horizontal' && ( ((props, ref } return ( ((props, ref) => { {dimensions.map((dimension, index) => { return ( ((props, ref) => { ((props, ref) => { {measures.map((element, index) => { return ( ((props, ref) {chartConfig.xAxisVisible && ( ((props, ref) name={yMeasure?.label} axisLine={chartConfig.yAxisVisible} tickLine={tickLineConfig} - key={yMeasure?.accessor} + key={typeof yMeasure?.accessor !== 'function' ? yMeasure?.accessor : yMeasure?.label} dataKey={yMeasure?.accessor} tickFormatter={yMeasure?.formatter} interval={0} @@ -272,7 +272,12 @@ const ScatterChart = forwardRef((props, ref) margin={yMeasure?.label ? { left: 200 } : 0} orientation={isRTL === true ? 'right' : 'left'} /> - + {dataset?.map((dataSet, index) => { return ( ) { + let reactKey = accessorObj.accessor; + if (typeof accessorObj.accessor === 'function') { + reactKey = JSON.stringify(accessorObj); + } + return reactKey; +} + export const usePrepareDimensionsAndMeasures = ( rawDimensions, rawMeasures, @@ -8,19 +16,25 @@ export const usePrepareDimensionsAndMeasures = { const dimensions: DimensionConfig = useMemo( () => - rawDimensions.map((label) => ({ - ...dimensionDefaults, - ...label - })), + rawDimensions.map((dimension) => { + return { + ...dimensionDefaults, + ...dimension, + reactKey: getAccessorReactKey(dimension) + }; + }), [rawDimensions, dimensionDefaults] ); const measures: MeasureConfig = useMemo( () => - rawMeasures.map((value) => ({ - ...measureDefaults, - ...value - })), + rawMeasures.map((measure) => { + return { + ...measureDefaults, + ...measure, + reactKey: getAccessorReactKey(measure) + }; + }), [rawMeasures, measureDefaults] ); From a6c1922c28394a170f1ca256d7d703f38516cab9 Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Fri, 3 May 2024 17:28:24 +0200 Subject: [PATCH 2/3] Update ColumnChart.tsx --- packages/charts/src/components/ColumnChart/ColumnChart.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/charts/src/components/ColumnChart/ColumnChart.tsx b/packages/charts/src/components/ColumnChart/ColumnChart.tsx index b03b0c81304..17590954d2b 100644 --- a/packages/charts/src/components/ColumnChart/ColumnChart.tsx +++ b/packages/charts/src/components/ColumnChart/ColumnChart.tsx @@ -310,7 +310,7 @@ const ColumnChart = forwardRef((props, ref) => yAxisId={chartConfig.secondYAxis?.dataKey === element.accessor ? 'right' : 'left'} stackId={element.stackId} fillOpacity={element.opacity} - key={element.key} + key={element.reactKey} name={element.label ?? element.accessor} strokeOpacity={element.opacity} type="monotone" From f747d084d9ad409cb00f53042b10622b445800c8 Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Mon, 6 May 2024 08:53:43 +0200 Subject: [PATCH 3/3] update tests --- .../usePrepareDimensionsAndMeasures.cy.tsx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/charts/src/hooks/usePrepareDimensionsAndMeasures.cy.tsx b/packages/charts/src/hooks/usePrepareDimensionsAndMeasures.cy.tsx index 123dadca09e..cdca0ea3170 100644 --- a/packages/charts/src/hooks/usePrepareDimensionsAndMeasures.cy.tsx +++ b/packages/charts/src/hooks/usePrepareDimensionsAndMeasures.cy.tsx @@ -27,12 +27,14 @@ describe('useLabelFormatter', () => { cy.get('@result').should('have.been.calledWith', { dimensions: [ { - accessor: 'a' + accessor: 'a', + reactKey: 'a' } ], measures: [ { - accessor: 'b' + accessor: 'b', + reactKey: 'b' } ] }); @@ -52,13 +54,15 @@ describe('useLabelFormatter', () => { dimensions: [ { accessor: 'a', - dimensionDefault: true + dimensionDefault: true, + reactKey: 'a' } ], measures: [ { accessor: 'b', - measureDefault: true + measureDefault: true, + reactKey: 'b' } ] }); @@ -81,13 +85,15 @@ describe('useLabelFormatter', () => { dimensions: [ { accessor: 'a', - dimensionDefault: true + dimensionDefault: true, + reactKey: 'a' } ], measures: [ { accessor: 'b', - measureDefault: true + measureDefault: true, + reactKey: 'b' } ] });