diff --git a/packages/grafana-data/src/field/fieldState.test.ts b/packages/grafana-data/src/field/fieldState.test.ts index 979f3b90837..33275a58ceb 100644 --- a/packages/grafana-data/src/field/fieldState.test.ts +++ b/packages/grafana-data/src/field/fieldState.test.ts @@ -15,6 +15,47 @@ function checkScenario(scenario: TitleScenario): string { return getFieldDisplayName(field, frame, scenario.frames); } +describe('getFieldDisplayName', () => { + it('Should add suffix for comparison frames', () => { + const frame = toDataFrame({ + meta: { + timeCompare: { + diffMs: -86400000, + isTimeShiftQuery: true, + }, + }, + fields: [ + { name: TIME_SERIES_TIME_FIELD_NAME, values: [1, 2, 3], type: FieldType.time }, + { + name: 'Value 1', + values: [1, 2, 3], + type: FieldType.number, + config: { + displayName: 'ServerA', + }, + }, + { + name: 'Value 2', + values: [1, 2, 3], + type: FieldType.number, + config: { + displayNameFromDS: 'ServerB', + }, + }, + { + name: 'Value 3', + values: [1, 2, 3], + type: FieldType.number, + }, + ], + }); + + expect(getFieldDisplayName(frame.fields[1], frame)).toBe('ServerA (comparison)'); + expect(getFieldDisplayName(frame.fields[2], frame)).toBe('ServerB (comparison)'); + expect(getFieldDisplayName(frame.fields[3], frame)).toBe('Value 3 (comparison)'); + }); +}); + describe('getFrameDisplayName', () => { it('Should return frame name if set', () => { const frame = toDataFrame({ diff --git a/packages/grafana-data/src/field/fieldState.ts b/packages/grafana-data/src/field/fieldState.ts index e9b6588c1f4..c20d6469bb7 100644 --- a/packages/grafana-data/src/field/fieldState.ts +++ b/packages/grafana-data/src/field/fieldState.ts @@ -72,15 +72,15 @@ export function getFieldDisplayName(field: Field, frame?: DataFrame, allFrames?: */ export function calculateFieldDisplayName(field: Field, frame?: DataFrame, allFrames?: DataFrame[]): string { const hasConfigTitle = field.config?.displayName && field.config?.displayName.length; - + const isComparisonSeries = Boolean(frame?.meta?.timeCompare?.isTimeShiftQuery); let displayName = hasConfigTitle ? field.config!.displayName! : field.name; if (hasConfigTitle) { - return displayName; + return isComparisonSeries ? `${displayName} (comparison)` : displayName; } if (frame && field.config?.displayNameFromDS) { - return field.config.displayNameFromDS; + return isComparisonSeries ? `${field.config.displayNameFromDS} (comparison)` : field.config.displayNameFromDS; } // This is an ugly exception for time field @@ -151,6 +151,9 @@ export function calculateFieldDisplayName(field: Field, frame?: DataFrame, allFr displayName = getUniqueFieldName(field, frame); } + if (isComparisonSeries) { + displayName = `${displayName} (comparison)`; + } return displayName; } diff --git a/packages/grafana-data/src/types/data.ts b/packages/grafana-data/src/types/data.ts index cfdc9e82530..2785f6c799f 100644 --- a/packages/grafana-data/src/types/data.ts +++ b/packages/grafana-data/src/types/data.ts @@ -94,6 +94,12 @@ export interface QueryResultMeta { */ pathSeparator?: string; + /** A time shift metadata indicating a result of comparison */ + timeCompare?: { + diffMs: number; + isTimeShiftQuery: boolean; + }; + /** * Legacy data source specific, should be moved to custom * */