From de470af1fb72d06f1f16d43ed84f59f833861343 Mon Sep 17 00:00:00 2001 From: omkarhall Date: Wed, 17 Jun 2026 21:32:07 -0500 Subject: [PATCH 1/4] fix(chart): added Big Number chart support for MAX metric with VARCHAR column --- .../plugins/plugin-chart-echarts/src/BigNumber/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/utils.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/utils.ts index 29fd193bbd39..98e0ff45860d 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/utils.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/utils.ts @@ -37,7 +37,7 @@ export const parseMetricValue = (metricValue: number | string | null) => { if (dateObject.isValid()) { return dateObject.valueOf(); } - return null; + return metricValue; } return metricValue; }; From 971a7c34070c306fb2f0bf093a7fd0331e642df1 Mon Sep 17 00:00:00 2001 From: omkarhall Date: Wed, 17 Jun 2026 23:27:04 -0500 Subject: [PATCH 2/4] fix(chart): apply string preservation only in Big Number Total path --- .../src/BigNumber/BigNumberTotal/transformProps.ts | 7 ++++++- .../plugins/plugin-chart-echarts/src/BigNumber/utils.ts | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.ts index 7c250595962f..f020d01ab6d1 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.ts @@ -79,8 +79,13 @@ export default function transformProps( const formattedSubtitleFontSize = subtitle?.trim() ? (subtitleFontSize ?? PROPORTION.SUBHEADER) : (subheaderFontSize ?? subtitleFontSize ?? PROPORTION.SUBHEADER); + const rawValue = data.length === 0 ? null : data[0][metricName]; + const parsedValue = rawValue == null ? null : parseMetricValue(rawValue); + // Preserve non-date strings for display-only path const bigNumber = - data.length === 0 ? null : parseMetricValue(data[0][metricName]); + parsedValue === null && typeof rawValue === 'string' && rawValue !== '' + ? rawValue + : parsedValue; let metricEntry: Metric | undefined; if (chartProps.datasource?.metrics) { diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/utils.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/utils.ts index 98e0ff45860d..29fd193bbd39 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/utils.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/utils.ts @@ -37,7 +37,7 @@ export const parseMetricValue = (metricValue: number | string | null) => { if (dateObject.isValid()) { return dateObject.valueOf(); } - return metricValue; + return null; } return metricValue; }; From 1cb87468d16c62a7ee8d4d966a602d319778237d Mon Sep 17 00:00:00 2001 From: omkarhall Date: Thu, 18 Jun 2026 11:02:15 -0500 Subject: [PATCH 3/4] fix(chart): added test to simulate non-date VARCHAR --- .../BigNumberTotal/transformProps.test.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.test.ts index 2b2f38a0ac2d..808ae7ea6658 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.test.ts @@ -231,6 +231,31 @@ describe('BigNumberTotal transformProps', () => { expect(result.headerFormatter(500)).toBe('$500'); }); + test('should pass through raw string when parseMetricValue returns null (e.g. VARCHAR MAX)', () => { + const { parseMetricValue } = jest.requireMock('../utils'); + parseMetricValue.mockReturnValueOnce(null); + + const chartProps = { + width: 400, + height: 300, + queriesData: [ + { + data: [{ value: 'some-varchar-result' }], + coltypes: [GenericDataType.String], + }, + ], + formData: baseFormData, + rawFormData: baseRawFormData, + hooks: baseHooks, + datasource: baseDatasource, + }; + + const result = transformProps( + chartProps as unknown as BigNumberTotalChartProps, + ); + expect(result.bigNumber).toBe('some-varchar-result'); + }); + test('should propagate colorThresholdFormatters from getColorFormatters', () => { // Override the getColorFormatters mock to return specific value const mockFormatters = [{ formatter: 'red' }]; From 0df282dc25cb89d7842e25e1f823632fc4894189 Mon Sep 17 00:00:00 2001 From: omkarhall Date: Thu, 18 Jun 2026 11:18:21 -0500 Subject: [PATCH 4/4] fix(chart): ensured that numeric strings do not get formatted as dates and added test --- .../BigNumberTotal/transformProps.test.ts | 28 ++++++++++++++++++- .../BigNumberTotal/transformProps.ts | 7 +++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.test.ts index 808ae7ea6658..2d82ffce54ca 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.test.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.test.ts @@ -231,7 +231,7 @@ describe('BigNumberTotal transformProps', () => { expect(result.headerFormatter(500)).toBe('$500'); }); - test('should pass through raw string when parseMetricValue returns null (e.g. VARCHAR MAX)', () => { + test('should pass through non-numeric raw string when parseMetricValue returns null (e.g. VARCHAR MAX)', () => { const { parseMetricValue } = jest.requireMock('../utils'); parseMetricValue.mockReturnValueOnce(null); @@ -256,6 +256,32 @@ describe('BigNumberTotal transformProps', () => { expect(result.bigNumber).toBe('some-varchar-result'); }); + test('should not fall back to raw string when value is numeric-looking VARCHAR (e.g. "123")', () => { + const { parseMetricValue } = jest.requireMock('../utils'); + parseMetricValue.mockReturnValueOnce(null); + + const chartProps = { + width: 400, + height: 300, + queriesData: [ + { + data: [{ value: '123' }], + coltypes: [GenericDataType.String], + }, + ], + formData: baseFormData, + rawFormData: baseRawFormData, + hooks: baseHooks, + datasource: baseDatasource, + }; + + const result = transformProps( + chartProps as unknown as BigNumberTotalChartProps, + ); + // parsedValue is null and "123" is numeric, so bigNumber stays null (not "123") + expect(result.bigNumber).toBeNull(); + }); + test('should propagate colorThresholdFormatters from getColorFormatters', () => { // Override the getColorFormatters mock to return specific value const mockFormatters = [{ formatter: 'red' }]; diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.ts b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.ts index f020d01ab6d1..ff748ad7e7d4 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.ts +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberTotal/transformProps.ts @@ -81,9 +81,12 @@ export default function transformProps( : (subheaderFontSize ?? subtitleFontSize ?? PROPORTION.SUBHEADER); const rawValue = data.length === 0 ? null : data[0][metricName]; const parsedValue = rawValue == null ? null : parseMetricValue(rawValue); - // Preserve non-date strings for display-only path + const bigNumber = - parsedValue === null && typeof rawValue === 'string' && rawValue !== '' + parsedValue === null && + typeof rawValue === 'string' && + rawValue !== '' && + Number.isNaN(Number(rawValue)) ? rawValue : parsedValue;