Table: fix crash when applying overrides to "frame" type field (#108179)

fix crash when applying overrides to partial nested frames
pull/107754/head
Domas 5 days ago committed by GitHub
parent e40341ffe8
commit 602e327769
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 62
      packages/grafana-data/src/field/fieldOverrides.test.ts
  2. 8
      packages/grafana-data/src/field/fieldOverrides.ts

@ -252,23 +252,23 @@ describe('applyFieldOverrides', () => {
{ name: 'value', type: FieldType.number, values: [10, 20] }, { name: 'value', type: FieldType.number, values: [10, 20] },
], ],
}); });
const f0 = createDataFrame({
name: 'A',
fields: [
{
name: 'message',
type: FieldType.string,
values: ['foo'],
},
{
name: 'frame',
type: FieldType.frame,
values: [f0Internal],
},
],
});
it('will apply field overrides to the fields within the frame', () => { it('will apply field overrides to the fields within the frame', () => {
const f0 = createDataFrame({
name: 'A',
fields: [
{
name: 'message',
type: FieldType.string,
values: ['foo'],
},
{
name: 'frame',
type: FieldType.frame,
values: [f0Internal],
},
],
});
const withOverrides = applyFieldOverrides({ const withOverrides = applyFieldOverrides({
data: [f0], data: [f0],
fieldConfig: { fieldConfig: {
@ -284,6 +284,38 @@ describe('applyFieldOverrides', () => {
expect(withOverrides[0].fields[1].values[0].fields[1].state.range.max).toBe(30); expect(withOverrides[0].fields[1].values[0].fields[1].state.range.max).toBe(30);
}); });
it('will not crash when some of the nested frames are undefined', () => {
const f0 = createDataFrame({
name: 'A',
fields: [
{
name: 'message',
type: FieldType.string,
values: ['foo', 'bar'],
},
{
name: 'frame',
type: FieldType.frame,
values: [f0Internal, undefined],
},
],
});
expect(() =>
applyFieldOverrides({
data: [f0],
fieldConfig: {
defaults: {
max: 30,
},
overrides: [],
},
replaceVariables: (value) => value,
theme: createTheme(),
fieldConfigRegistry: customFieldRegistry,
})
).not.toThrow();
});
}); });
it('will merge FieldConfig with default values', () => { it('will merge FieldConfig with default values', () => {

@ -5,7 +5,7 @@ import { usePrevious } from 'react-use';
import { ThresholdsMode, VariableFormatID } from '@grafana/schema'; import { ThresholdsMode, VariableFormatID } from '@grafana/schema';
import { compareArrayValues, compareDataFrameStructures } from '../dataframe/frameComparisons'; import { compareArrayValues, compareDataFrameStructures } from '../dataframe/frameComparisons';
import { guessFieldTypeForField } from '../dataframe/processDataFrame'; import { createDataFrame, guessFieldTypeForField } from '../dataframe/processDataFrame';
import { PanelPlugin } from '../panel/PanelPlugin'; import { PanelPlugin } from '../panel/PanelPlugin';
import { asHexString } from '../themes/colorManipulator'; import { asHexString } from '../themes/colorManipulator';
import { GrafanaTheme2 } from '../themes/types'; import { GrafanaTheme2 } from '../themes/types';
@ -238,7 +238,11 @@ export function applyFieldOverrides(options: ApplyFieldOverrideOptions): DataFra
if (field.type === FieldType.frame) { if (field.type === FieldType.frame) {
field.values = applyFieldOverrides({ field.values = applyFieldOverrides({
...options, ...options,
data: field.values, // nested frames can be `undefined` in certain situations, like after `merge` transform due to padding the value array.
// let's replace them with empty frames to avoid errors applying overrides
data: field.values.map(
(nestedFrame: DataFrame | undefined): DataFrame => nestedFrame ?? createDataFrame({ fields: [] })
),
}); });
} }
} }

Loading…
Cancel
Save