Dashboards: Fixes issue with panel header showing even when hide time override was enabled (#95814)

* Dashboards: Fixes issue with panel header showing even when hide time override was enabled

* fixes

* fixed test
This commit is contained in:
Torkel Ödegaard 2024-11-05 16:40:43 +01:00 committed by GitHub
parent bfa1f03315
commit 6fd3620d50
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 62 additions and 22 deletions

View File

@ -427,6 +427,22 @@ describe('PanelDataQueriesTab', () => {
expect(panel.state.$timeRange).toBeInstanceOf(PanelTimeRange);
});
it('should update hoverHeader', async () => {
const { queriesTab, panel } = await setupScene('panel-1');
panel.setState({ title: '', hoverHeader: true });
panel.state.$data?.activate();
queriesTab.onQueryOptionsChange({
dataSource: { name: 'grafana-testdata', type: 'grafana-testdata-datasource', default: true },
queries: [],
timeRange: { from: '1h' },
});
expect(panel.state.hoverHeader).toBe(false);
});
it('should update PanelTimeRange object on time options update', async () => {
const { queriesTab, panel } = await setupScene('panel-1');

View File

@ -24,8 +24,9 @@ import { updateQueries } from 'app/features/query/state/updateQueries';
import { isSharedDashboardQuery } from 'app/plugins/datasource/dashboard';
import { QueryGroupOptions } from 'app/types';
import { PanelTimeRange, PanelTimeRangeState } from '../../scene/PanelTimeRange';
import { PanelTimeRange } from '../../scene/PanelTimeRange';
import { getDashboardSceneFor, getPanelIdForVizPanel, getQueryRunnerFor } from '../../utils/utils';
import { getUpdatedHoverHeader } from '../getPanelFrameOptions';
import { PanelDataPaneTab, TabId, PanelDataTabHeaderProps } from './types';
@ -190,12 +191,11 @@ export class PanelDataQueriesTab extends SceneObjectBase<PanelDataQueriesTabStat
};
public onQueryOptionsChange = (options: QueryGroupOptions) => {
const panelObj = this.state.panelRef.resolve();
const panel = this.state.panelRef.resolve();
const dataObj = this.queryRunner;
const timeRangeObj = panelObj.state.$timeRange;
const dataObjStateUpdate: Partial<SceneQueryRunner['state']> = {};
const timeRangeObjStateUpdate: Partial<PanelTimeRangeState> = {};
const panelStateUpdate: Partial<VizPanel['state']> = {};
if (options.maxDataPoints !== dataObj.state.maxDataPoints) {
dataObjStateUpdate.maxDataPoints = options.maxDataPoints ?? undefined;
@ -205,23 +205,16 @@ export class PanelDataQueriesTab extends SceneObjectBase<PanelDataQueriesTabStat
dataObjStateUpdate.minInterval = options.minInterval;
}
if (options.timeRange) {
timeRangeObjStateUpdate.timeFrom = options.timeRange.from ?? undefined;
timeRangeObjStateUpdate.timeShift = options.timeRange.shift ?? undefined;
timeRangeObjStateUpdate.hideTimeOverride = options.timeRange.hide;
}
const timeFrom = options.timeRange?.from ?? undefined;
const timeShift = options.timeRange?.shift ?? undefined;
const hideTimeOverride = options.timeRange?.hide;
if (timeRangeObj instanceof PanelTimeRange) {
if (timeRangeObjStateUpdate.timeFrom !== undefined || timeRangeObjStateUpdate.timeShift !== undefined) {
// update time override
timeRangeObj.setState(timeRangeObjStateUpdate);
} else {
// remove time override
panelObj.setState({ $timeRange: undefined });
}
if (timeFrom !== undefined || timeShift !== undefined) {
panelStateUpdate.$timeRange = new PanelTimeRange({ timeFrom, timeShift, hideTimeOverride });
panelStateUpdate.hoverHeader = getUpdatedHoverHeader(panel.state.title, panelStateUpdate.$timeRange);
} else {
// no time override present on the panel, let's create one first
panelObj.setState({ $timeRange: new PanelTimeRange(timeRangeObjStateUpdate) });
panelStateUpdate.$timeRange = undefined;
panelStateUpdate.hoverHeader = getUpdatedHoverHeader(panel.state.title, undefined);
}
if (options.cacheTimeout !== dataObj?.state.cacheTimeout) {
@ -232,6 +225,8 @@ export class PanelDataQueriesTab extends SceneObjectBase<PanelDataQueriesTabStat
dataObjStateUpdate.queryCachingTTL = options.queryCachingTTL;
}
panel.setState(panelStateUpdate);
dataObj.setState(dataObjStateUpdate);
dataObj.runQueries();
};

View File

@ -1,7 +1,7 @@
import { SelectableValue } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
import { config } from '@grafana/runtime';
import { VizPanel } from '@grafana/scenes';
import { SceneTimeRangeLike, VizPanel } from '@grafana/scenes';
import { DataLinksInlineEditor, Input, TextArea, Switch, RadioButtonGroup, Select } from '@grafana/ui';
import { GenAIPanelDescriptionButton } from 'app/features/dashboard/components/GenAI/GenAIPanelDescriptionButton';
import { GenAIPanelTitleButton } from 'app/features/dashboard/components/GenAI/GenAIPanelTitleButton';
@ -11,6 +11,7 @@ import { RepeatRowSelect2 } from 'app/features/dashboard/components/RepeatRowSel
import { getPanelLinksVariableSuggestions } from 'app/features/panel/panellinks/link_srv';
import { VizPanelLinks } from '../scene/PanelLinks';
import { PanelTimeRange } from '../scene/PanelTimeRange';
import { DashboardGridItem } from '../scene/layout-default/DashboardGridItem';
import { vizPanelToPanel, transformSceneToSaveModel } from '../serialization/transformSceneToSaveModel';
import { dashboardSceneGraph } from '../utils/dashboardSceneGraph';
@ -206,5 +207,19 @@ function DescriptionTextArea({ panel }: { panel: VizPanel }) {
}
function setPanelTitle(panel: VizPanel, title: string) {
panel.setState({ title: title, hoverHeader: title === '' });
panel.setState({ title: title, hoverHeader: getUpdatedHoverHeader(title, panel.state.$timeRange) });
}
export function getUpdatedHoverHeader(title: string, timeRange: SceneTimeRangeLike | undefined): boolean {
if (title !== '') {
return false;
}
if (timeRange instanceof PanelTimeRange && !timeRange.state.hideTimeOverride) {
if (timeRange.state.timeFrom || timeRange.state.timeShift) {
return false;
}
}
return true;
}

View File

@ -585,6 +585,18 @@ describe('transformSaveModelToScene', () => {
expect(vizPanel.state.hoverHeader).toEqual(true);
});
it('should set hoverHeader to true if timeFrom and hideTimeOverride is true', () => {
const panel = {
type: 'test-plugin',
timeFrom: '2h',
hideTimeOverride: true,
};
const { vizPanel } = buildGridItemForTest(panel);
expect(vizPanel.state.hoverHeader).toBe(true);
});
it('should initalize the VizPanel with min interval set', () => {
const panel = {
title: '',

View File

@ -301,6 +301,8 @@ export function buildGridItemForPanel(panel: PanelModel): DashboardGridItem {
titleItems.push(new PanelNotices());
const timeOverrideShown = (panel.timeFrom || panel.timeShift) && !panel.hideTimeOverride;
const vizPanelState: VizPanelState = {
key: getVizPanelKeyForPanelId(panel.id),
title: panel.title,
@ -311,7 +313,7 @@ export function buildGridItemForPanel(panel: PanelModel): DashboardGridItem {
pluginVersion: panel.pluginVersion,
displayMode: panel.transparent ? 'transparent' : undefined,
// To be replaced with it's own option persited option instead derived
hoverHeader: !panel.title && !panel.timeFrom && !panel.timeShift,
hoverHeader: !panel.title && !timeOverrideShown,
hoverHeaderOffset: 0,
$data: createPanelDataProvider(panel),
titleItems,