From f04e032cf114d48f4c23c5817e6f674863b3713b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 24 Sep 2024 13:51:02 +0200 Subject: [PATCH] FieldOverrides: Clear displayName caching after applying field overrides (#93651) * FieldOverrides: Clear displayName caching after applying field overrides * Remove old comment --- .../src/field/fieldOverrides.test.ts | 57 +++++++++++++++++++ .../grafana-data/src/field/fieldOverrides.ts | 2 + 2 files changed, 59 insertions(+) diff --git a/packages/grafana-data/src/field/fieldOverrides.test.ts b/packages/grafana-data/src/field/fieldOverrides.test.ts index 84329ca5e86..0d16b66397b 100644 --- a/packages/grafana-data/src/field/fieldOverrides.test.ts +++ b/packages/grafana-data/src/field/fieldOverrides.test.ts @@ -309,6 +309,63 @@ describe('applyFieldOverrides', () => { expect(config.decimals).toEqual(1); }); + it('displayName should be able to reference itself', () => { + const data = applyFieldOverrides({ + data: [f0], // the frame + fieldConfig: { + defaults: { + displayName: '${__field.displayName} and more!', + }, + overrides: [], + }, + replaceVariables: (v, scopedVars) => { + const dataContext = scopedVars?.__dataContext?.value; + if (dataContext) { + // Trying to fake what would happen with the real interpolation function + return getFieldDisplayName(dataContext.field, dataContext.frame) + ' and more!'; + } + return v; + }, + theme: createTheme(), + fieldConfigRegistry: customFieldRegistry, + })[0]; + + const valueColumn = data.fields[1]; + const displayName = getFieldDisplayName(valueColumn, data); + + expect(displayName).toEqual('value and more!'); + }); + + it('displayName should be able to reference itself in an override', () => { + const data = applyFieldOverrides({ + data: [f0], // the frame + fieldConfig: { + defaults: {}, + overrides: [ + { + matcher: { id: FieldMatcherID.byName, options: 'value' }, + properties: [{ id: 'displayName', value: '${__field.displayName} and more!' }], + }, + ], + }, + replaceVariables: (v, scopedVars) => { + const dataContext = scopedVars?.__dataContext?.value; + if (dataContext) { + // Trying to fake what would happen with the real interpolation function + return getFieldDisplayName(dataContext.field, dataContext.frame) + ' and more!'; + } + return v; + }, + theme: createTheme(), + fieldConfigRegistry: customFieldRegistry, + })[0]; + + const valueColumn = data.fields[1]; + const displayName = getFieldDisplayName(valueColumn, data); + + expect(displayName).toEqual('value and more!'); + }); + it('will apply set min/max when asked', () => { const data = applyFieldOverrides({ data: [f0], // the frame diff --git a/packages/grafana-data/src/field/fieldOverrides.ts b/packages/grafana-data/src/field/fieldOverrides.ts index a1cf083cbea..479f31155c6 100644 --- a/packages/grafana-data/src/field/fieldOverrides.ts +++ b/packages/grafana-data/src/field/fieldOverrides.ts @@ -162,6 +162,8 @@ export function applyFieldOverrides(options: ApplyFieldOverrideOptions): DataFra const { range, newGlobalRange } = calculateRange(config, field, globalRange, options.data!); globalRange = newGlobalRange; + // Clear any cached displayName as it can change during field overrides process + field.state!.displayName = null; field.state!.seriesIndex = seriesIndex; field.state!.range = range; field.type = type;