From eeaa160ae833c3c2de23d0881db680a1c517672d Mon Sep 17 00:00:00 2001 From: Josh Hunt Date: Thu, 28 Apr 2022 16:07:22 +0100 Subject: [PATCH] Fix: Prevent automatic parsing of string data types to numbers (#46035) * Fix: Render unitless strings as strings from displayProcessor Co-authored-by: kay delaney Co-authored-by: Alexandra Vargas Co-authored-by: joshhunt Co-authored-by: Ashley Harrison Co-authored-by: Joao Silva * update tests * Rename none unit * rename none unit to Number Co-authored-by: kay delaney Co-authored-by: Alexandra Vargas Co-authored-by: Ashley Harrison Co-authored-by: Joao Silva --- .../src/field/displayProcessor.test.ts | 38 +++++++++---------- .../src/field/displayProcessor.ts | 2 + .../src/valueFormats/categories.ts | 2 +- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/packages/grafana-data/src/field/displayProcessor.test.ts b/packages/grafana-data/src/field/displayProcessor.test.ts index 51767895d2c..767228e2c04 100644 --- a/packages/grafana-data/src/field/displayProcessor.test.ts +++ b/packages/grafana-data/src/field/displayProcessor.test.ts @@ -6,11 +6,11 @@ import { MappingType, ValueMapping } from '../types/valueMapping'; import { getDisplayProcessor, getRawDisplayProcessor } from './displayProcessor'; -function getDisplayProcessorFromConfig(config: FieldConfig) { +function getDisplayProcessorFromConfig(config: FieldConfig, fieldType: FieldType = FieldType.number) { return getDisplayProcessor({ field: { config, - type: FieldType.number, + type: fieldType, }, theme: createTheme(), }); @@ -456,32 +456,32 @@ describe('Date display options', () => { }); describe('number formatting for string values', () => { - it('should preserve string unchanged if unit is strings', () => { - const processor = getDisplayProcessor({ - field: { - type: FieldType.string, - config: { unit: 'string' }, - }, - theme: createTheme(), - }); + it('should preserve string unchanged if unit is string', () => { + const processor = getDisplayProcessorFromConfig({ unit: 'string' }, FieldType.string); expect(processor('22.1122334455').text).toEqual('22.1122334455'); }); - it('should format string as number if no unit', () => { - const processor = getDisplayProcessor({ - field: { - type: FieldType.string, - config: { decimals: 2 }, - }, - theme: createTheme(), - }); - expect(processor('22.1122334455').text).toEqual('22.11'); + it('should preserve string unchanged if no unit is specified', () => { + const processor = getDisplayProcessorFromConfig({}, FieldType.string); + expect(processor('22.1122334455').text).toEqual('22.1122334455'); // Support empty/missing strings expect(processor(undefined).text).toEqual(''); expect(processor(null).text).toEqual(''); expect(processor('').text).toEqual(''); }); + + it('should format string as number if unit is `none`', () => { + const processor = getDisplayProcessorFromConfig({ unit: 'none' }, FieldType.string); + expect(processor('0x10').text).toEqual('16'); + }); + + it('should not parse a 64 bit number when the data type is string', () => { + const value = '2882377905688543293'; + const instance = getDisplayProcessorFromConfig({}, FieldType.string); + const disp = instance(value); + expect(disp.text).toEqual(value); + }); }); }); diff --git a/packages/grafana-data/src/field/displayProcessor.ts b/packages/grafana-data/src/field/displayProcessor.ts index f4a7a79f907..cce5e73b24d 100644 --- a/packages/grafana-data/src/field/displayProcessor.ts +++ b/packages/grafana-data/src/field/displayProcessor.ts @@ -68,6 +68,8 @@ export function getDisplayProcessor(options?: DisplayProcessorOptions): DisplayP if (!isBooleanUnit(unit)) { unit = 'bool'; } + } else if (!unit && field.type === FieldType.string) { + unit = 'string'; } const formatFunc = getValueFormat(unit || 'none'); diff --git a/packages/grafana-data/src/valueFormats/categories.ts b/packages/grafana-data/src/valueFormats/categories.ts index dd6e2455908..d8c3ea043fe 100644 --- a/packages/grafana-data/src/valueFormats/categories.ts +++ b/packages/grafana-data/src/valueFormats/categories.ts @@ -38,7 +38,7 @@ export const getCategories = (): ValueFormatCategory[] => [ { name: 'Misc', formats: [ - { name: 'none', id: 'none', fn: toFixedUnit('') }, + { name: 'Number', id: 'none', fn: toFixedUnit('') }, { name: 'String', id: 'string', fn: stringFormater }, { name: 'short',