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..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,6 +231,57 @@ describe('BigNumberTotal transformProps', () => { expect(result.headerFormatter(500)).toBe('$500'); }); + test('should pass through non-numeric 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 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 7c250595962f..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 @@ -79,8 +79,16 @@ 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); + const bigNumber = - data.length === 0 ? null : parseMetricValue(data[0][metricName]); + parsedValue === null && + typeof rawValue === 'string' && + rawValue !== '' && + Number.isNaN(Number(rawValue)) + ? rawValue + : parsedValue; let metricEntry: Metric | undefined; if (chartProps.datasource?.metrics) {