From f48a52e5908e02888e7d62262eefab99a2ee8ec1 Mon Sep 17 00:00:00 2001 From: Oscar Kilhed Date: Fri, 19 Mar 2021 09:28:15 +0100 Subject: [PATCH] Remove datalink template suggestions for accessing specific fields when there are multiple dataframes. (#32057) * Don't suggest template strings using fields when there are mutliple dataframes * Change to use label instead of state --- .../field/getFieldDisplayValuesProxy.test.tsx | 4 ++ .../src/field/getFieldDisplayValuesProxy.ts | 11 ++++- .../app/features/panel/panellinks/link_srv.ts | 44 +++++++++++-------- .../panel/panellinks/specs/link_srv.test.ts | 24 ++++++++++ 4 files changed, 63 insertions(+), 20 deletions(-) diff --git a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.test.tsx b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.test.tsx index 334069ec2ea..ab550e1af5a 100644 --- a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.test.tsx +++ b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.test.tsx @@ -13,6 +13,9 @@ describe('getFieldDisplayValuesProxy', () => { { name: 'power', values: [100, 200, 300], + labels: { + name: 'POWAH!', + }, config: { displayName: 'The Power', }, @@ -60,6 +63,7 @@ describe('getFieldDisplayValuesProxy', () => { }); expect(p.power.numeric).toEqual(300); expect(p['power'].numeric).toEqual(300); + expect(p['POWAH!'].numeric).toEqual(300); expect(p['The Power'].numeric).toEqual(300); expect(p[1].numeric).toEqual(300); }); diff --git a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts index 7eb70ff707d..0abdd672f69 100644 --- a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts +++ b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts @@ -28,9 +28,18 @@ export function getFieldDisplayValuesProxy( field = frame.fields[k]; } if (!field) { - // 3. Match the title + // 3. Match the config displayName field = frame.fields.find((f) => key === f.config.displayName); } + if (!field) { + // 4. Match the name label + field = frame.fields.find((f) => { + if (f.labels) { + return key === f.labels.name; + } + return false; + }); + } if (!field) { return undefined; } diff --git a/public/app/features/panel/panellinks/link_srv.ts b/public/app/features/panel/panellinks/link_srv.ts index 5541e9b2542..b2ba10e70bc 100644 --- a/public/app/features/panel/panellinks/link_srv.ts +++ b/public/app/features/panel/panellinks/link_srv.ts @@ -134,30 +134,36 @@ export const getDataFrameVars = (dataFrames: DataFrame[]) => { const suggestions: VariableSuggestion[] = []; const keys: KeyValue = {}; - for (const frame of dataFrames) { - for (const field of frame.fields) { - const displayName = getFieldDisplayName(field, frame, dataFrames); + if (dataFrames.length !== 1) { + // It's not possible to access fields of other dataframes. So if there are multiple dataframes we need to skip these suggestions. + // Also return early if there are no dataFrames. + return []; + } - if (keys[displayName]) { - continue; - } + const frame = dataFrames[0]; - suggestions.push({ - value: `__data.fields${buildLabelPath(displayName)}`, - label: `${displayName}`, - documentation: `Formatted value for ${displayName} on the same row`, - origin: VariableOrigin.Fields, - }); + for (const field of frame.fields) { + const displayName = getFieldDisplayName(field, frame, dataFrames); - keys[displayName] = true; + if (keys[displayName]) { + continue; + } - if (!numeric && field.type === FieldType.number) { - numeric = { ...field, name: displayName }; - } + suggestions.push({ + value: `__data.fields${buildLabelPath(displayName)}`, + label: `${displayName}`, + documentation: `Formatted value for ${displayName} on the same row`, + origin: VariableOrigin.Fields, + }); - if (!title && field.config.displayName && field.config.displayName !== field.name) { - title = { ...field, name: displayName }; - } + keys[displayName] = true; + + if (!numeric && field.type === FieldType.number) { + numeric = { ...field, name: displayName }; + } + + if (!title && field.config.displayName && field.config.displayName !== field.name) { + title = { ...field, name: displayName }; } } diff --git a/public/app/features/panel/panellinks/specs/link_srv.test.ts b/public/app/features/panel/panellinks/specs/link_srv.test.ts index af4554a601d..5154b587112 100644 --- a/public/app/features/panel/panellinks/specs/link_srv.test.ts +++ b/public/app/features/panel/panellinks/specs/link_srv.test.ts @@ -424,4 +424,28 @@ describe('getDataFrameVars', () => { ]); }); }); + + describe('when called with multiple DataFrames', () => { + it('it should not return any suggestions', () => { + const frame1 = toDataFrame({ + name: 'server1', + fields: [ + { name: 'time', type: FieldType.time, values: [1, 2, 3] }, + { name: 'value', type: FieldType.number, values: [10, 11, 12] }, + ], + }); + + const frame2 = toDataFrame({ + name: 'server2', + fields: [ + { name: 'time', type: FieldType.time, values: [1, 2, 3] }, + { name: 'value', type: FieldType.number, values: [10, 11, 12] }, + ], + }); + + const suggestions = getDataFrameVars([frame1, frame2]); + + expect(suggestions).toEqual([]); + }); + }); });