Transformations: Fix regression where disabling single transformation would display "No data" (#81320)

This commit is contained in:
Nathan Marrs 2024-01-26 10:14:59 -07:00 committed by GitHub
parent a081abdd25
commit 138079bbd8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 24 additions and 3 deletions

View File

@ -6,7 +6,7 @@ describe('Panel edit tests - transformations', () => {
}); });
it('Tests transformations editor', () => { it('Tests transformations editor', () => {
e2e.flows.openDashboard({ uid: '5SdHCadmz', queryParams: { editPanel: 3 } }); e2e.flows.openDashboard({ uid: 'TkZXxlNG3', queryParams: { editPanel: 47 } });
e2e.components.Tab.title('Transform data').should('be.visible').click(); e2e.components.Tab.title('Transform data').should('be.visible').click();
e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click(); e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click();
@ -14,4 +14,15 @@ describe('Panel edit tests - transformations', () => {
e2e.components.Transforms.Reduce.calculationsLabel().scrollIntoView().should('be.visible'); e2e.components.Transforms.Reduce.calculationsLabel().scrollIntoView().should('be.visible');
e2e.components.Transforms.Reduce.modeLabel().should('be.visible'); e2e.components.Transforms.Reduce.modeLabel().should('be.visible');
}); });
it('Tests case where transformations can be disabled and not clear out panel data', () => {
e2e.flows.openDashboard({ uid: 'TkZXxlNG3', queryParams: { editPanel: 47 } });
e2e.components.Tab.title('Transform data').should('be.visible').click();
e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click();
e2e.components.TransformTab.newTransform('Reduce').scrollIntoView().should('be.visible').click();
e2e.components.Transforms.disableTransformationButton().should('be.visible').click();
e2e.components.Panels.Panel.PanelDataErrorMessage().should('not.exist');
});
}); });

View File

@ -164,6 +164,7 @@ export const Components = {
container: 'data-testid hover-header-container', container: 'data-testid hover-header-container',
dragIcon: 'data-testid drag-icon', dragIcon: 'data-testid drag-icon',
}, },
PanelDataErrorMessage: 'data-testid Panel data error message',
}, },
Visualization: { Visualization: {
Graph: { Graph: {
@ -306,6 +307,7 @@ export const Components = {
}, },
Transforms: { Transforms: {
card: (name: string) => `data-testid New transform ${name}`, card: (name: string) => `data-testid New transform ${name}`,
disableTransformationButton: 'data-testid Disable transformation button',
Reduce: { Reduce: {
modeLabel: 'data-testid Transform mode label', modeLabel: 'data-testid Transform mode label',
calculationsLabel: 'data-testid Transform calculations label', calculationsLabel: 'data-testid Transform calculations label',

View File

@ -10,6 +10,7 @@ interface BaseQueryOperationActionProps {
title: string; title: string;
onClick: (e: React.MouseEvent) => void; onClick: (e: React.MouseEvent) => void;
disabled?: boolean; disabled?: boolean;
dataTestId?: string;
} }
function BaseQueryOperationAction(props: QueryOperationActionProps | QueryOperationToggleActionProps) { function BaseQueryOperationAction(props: QueryOperationActionProps | QueryOperationToggleActionProps) {
@ -25,6 +26,7 @@ function BaseQueryOperationAction(props: QueryOperationActionProps | QueryOperat
onClick={props.onClick} onClick={props.onClick}
type="button" type="button"
aria-label={selectors.components.QueryEditorRow.actionButton(props.title)} aria-label={selectors.components.QueryEditorRow.actionButton(props.title)}
data-testid={props.dataTestId}
{...('active' in props && { 'aria-pressed': props.active })} {...('active' in props && { 'aria-pressed': props.active })}
/> />
</div> </div>

View File

@ -2,6 +2,7 @@ import React, { useCallback } from 'react';
import { useToggle } from 'react-use'; import { useToggle } from 'react-use';
import { DataTransformerConfig, TransformerRegistryItem, FrameMatcherID, DataTopic } from '@grafana/data'; import { DataTransformerConfig, TransformerRegistryItem, FrameMatcherID, DataTopic } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
import { reportInteraction } from '@grafana/runtime'; import { reportInteraction } from '@grafana/runtime';
import { ConfirmModal } from '@grafana/ui'; import { ConfirmModal } from '@grafana/ui';
import { import {
@ -120,6 +121,7 @@ export const TransformationOperationRow = ({
icon={disabled ? 'eye-slash' : 'eye'} icon={disabled ? 'eye-slash' : 'eye'}
onClick={instrumentToggleCallback(() => onDisableToggle(index), 'disabled', disabled)} onClick={instrumentToggleCallback(() => onDisableToggle(index), 'disabled', disabled)}
active={disabled} active={disabled}
dataTestId={selectors.components.Transforms.disableTransformationButton}
/> />
<QueryOperationAction <QueryOperationAction
title="Remove" title="Remove"

View File

@ -8,6 +8,7 @@ import {
VisualizationSuggestionsBuilder, VisualizationSuggestionsBuilder,
VisualizationSuggestion, VisualizationSuggestion,
} from '@grafana/data'; } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
import { PanelDataErrorViewProps, locationService } from '@grafana/runtime'; import { PanelDataErrorViewProps, locationService } from '@grafana/runtime';
import { usePanelContext, useStyles2 } from '@grafana/ui'; import { usePanelContext, useStyles2 } from '@grafana/ui';
import { CardButton } from 'app/core/components/CardButton'; import { CardButton } from 'app/core/components/CardButton';
@ -66,7 +67,9 @@ export function PanelDataErrorView(props: PanelDataErrorViewProps) {
return ( return (
<div className={styles.wrapper}> <div className={styles.wrapper}>
<div className={styles.message}>{message}</div> <div className={styles.message} data-testid={selectors.components.Panels.Panel.PanelDataErrorMessage}>
{message}
</div>
{context.app === CoreApp.PanelEditor && dataSummary.hasData && panel && ( {context.app === CoreApp.PanelEditor && dataSummary.hasData && panel && (
<div className={styles.actions}> <div className={styles.actions}>
{props.suggestions && ( {props.suggestions && (

View File

@ -219,7 +219,8 @@ export class PanelQueryRunner {
private applyTransformations(data: PanelData): Observable<PanelData> { private applyTransformations(data: PanelData): Observable<PanelData> {
const transformations = this.dataConfigSource.getTransformations(); const transformations = this.dataConfigSource.getTransformations();
if (!transformations || transformations.length === 0) { const allTransformationsDisabled = transformations && transformations.every((t) => t.disabled);
if (allTransformationsDisabled || !transformations || transformations.length === 0) {
return of(data); return of(data);
} }