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 c4868ac61e7..00522b9d0a8 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,56 @@ 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 pass through numeric-looking VARCHAR string literally (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, + ); + expect(result.bigNumber).toBe('123'); + }); + 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 7c250595962..3c7c78ecc70 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,15 @@ 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.trim() !== '' + ? rawValue + : parsedValue; let metricEntry: Metric | undefined; if (chartProps.datasource?.metrics) { diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx index 9f5a9d0ccda..25c2774d825 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.tsx @@ -189,8 +189,10 @@ function BigNumberVis({ text = t('No data'); } else if (typeof bigNumber === 'number') { text = headerFormatter(bigNumber); + } else if (typeof bigNumber === 'string') { + text = bigNumber; } else { - // For string/boolean/Date values, convert to number if possible, else show as string + // For boolean/Date values, convert to number if possible, else show as string const numValue = Number(bigNumber); text = Number.isNaN(numValue) ? String(bigNumber)