diff --git a/public/app/features/alerting/unified/components/expressions/Expression.tsx b/public/app/features/alerting/unified/components/expressions/Expression.tsx index e5ae64df1e9..fd9b3fb44b9 100644 --- a/public/app/features/alerting/unified/components/expressions/Expression.tsx +++ b/public/app/features/alerting/unified/components/expressions/Expression.tsx @@ -135,21 +135,13 @@ interface ExpressionResultProps { } export const PAGE_SIZE = 20; export const ExpressionResult: FC = ({ series, isAlertCondition }) => { - const { page, pageItems, onPageChange, numberOfPages, pageStart, pageEnd } = usePagination(series, 1, PAGE_SIZE); + const { pageItems, previousPage, nextPage, numberOfPages, pageStart, pageEnd } = usePagination(series, 1, PAGE_SIZE); const styles = useStyles2(getStyles); // sometimes we receive results where every value is just "null" when noData occurs const emptyResults = isEmptySeries(series); const isTimeSeriesResults = !emptyResults && isTimeSeriesFrames(series); - const previousPage = useCallback(() => { - onPageChange(page - 1); - }, [page, onPageChange]); - - const nextPage = useCallback(() => { - onPageChange(page + 1); - }, [page, onPageChange]); - const shouldShowPagination = numberOfPages > 1; return ( @@ -331,8 +323,11 @@ const FrameRow: FC = ({ frame, index, isAlertCondition }) => { const TimeseriesRow: FC = ({ frame, index }) => { const styles = useStyles2(getStyles); - const hasLabels = frame.fields[1].labels; - const name = hasLabels ? formatLabels(frame.fields[1].labels ?? {}) : 'Series ' + index; + const valueField = frame.fields[1]; // field 0 is "time", field 1 is "value" + + const hasLabels = valueField.labels; + const displayNameFromDS = valueField.config?.displayNameFromDS; + const name = displayNameFromDS ?? (hasLabels ? formatLabels(valueField.labels ?? {}) : 'Series ' + index); const timestamps = frame.fields[0].values.toArray(); diff --git a/public/app/features/alerting/unified/components/expressions/util.test.ts b/public/app/features/alerting/unified/components/expressions/util.test.ts index 171e485d06f..30b022791da 100644 --- a/public/app/features/alerting/unified/components/expressions/util.test.ts +++ b/public/app/features/alerting/unified/components/expressions/util.test.ts @@ -62,6 +62,25 @@ describe('getSeriesName', () => { it('should work with NoData frames', () => { expect(getSeriesName(EMPTY_FRAME)).toBe(''); }); + + it('should give preference to displayNameFromDS', () => { + const frame: DataFrame = { + name: 'MyFrame', + ...toDataFrame({ + fields: [ + { + name: 'value', + type: FieldType.number, + values: [1, 2, 3], + labels: { foo: 'bar' }, + config: { displayNameFromDS: 'series-name-override' }, + }, + ], + }), + }; + + expect(getSeriesName(frame)).toBe('series-name-override'); + }); }); describe('getSeriesValue', () => { diff --git a/public/app/features/alerting/unified/components/expressions/util.ts b/public/app/features/alerting/unified/components/expressions/util.ts index 2a8407a6416..ffa21753f28 100644 --- a/public/app/features/alerting/unified/components/expressions/util.ts +++ b/public/app/features/alerting/unified/components/expressions/util.ts @@ -10,7 +10,10 @@ import { DataFrame, Labels, roundDecimals } from '@grafana/data'; */ const getSeriesName = (frame: DataFrame): string => { - return frame.name ?? formatLabels(frame.fields[0]?.labels ?? {}); + const firstField = frame.fields[0]; + + const displayNameFromDS = firstField?.config?.displayNameFromDS; + return displayNameFromDS ?? frame.name ?? formatLabels(firstField?.labels ?? {}); }; const getSeriesValue = (frame: DataFrame) => {