From bd0fd21852954229c4be9a8243eb8ee372066439 Mon Sep 17 00:00:00 2001 From: Darren Janeczek <38694490+darrenjaneczek@users.noreply.github.com> Date: Sat, 3 Feb 2024 10:20:04 -0500 Subject: [PATCH] fix: datatrails verify different time range before creating new history node (#81839) fix: datatrails verify different time range --- .../app/features/trails/DataTrailsHistory.tsx | 10 +++++++++- public/app/features/trails/utils.ts | 18 +++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/public/app/features/trails/DataTrailsHistory.tsx b/public/app/features/trails/DataTrailsHistory.tsx index 34490bd2fb1..f5def4ad5b1 100644 --- a/public/app/features/trails/DataTrailsHistory.tsx +++ b/public/app/features/trails/DataTrailsHistory.tsx @@ -15,7 +15,7 @@ import { useStyles2, Tooltip, Stack } from '@grafana/ui'; import { DataTrail, DataTrailState } from './DataTrail'; import { VAR_FILTERS } from './shared'; -import { getTrailFor } from './utils'; +import { getTrailFor, isSceneTimeRangeState } from './utils'; export interface DataTrailsHistoryState extends SceneObjectState { currentStep: number; @@ -68,6 +68,14 @@ export class DataTrailHistory extends SceneObjectBase { trail.subscribeToEvent(SceneObjectStateChangedEvent, (evt) => { if (evt.payload.changedObject instanceof SceneTimeRange) { + const { prevState, newState } = evt.payload; + + if (isSceneTimeRangeState(prevState) && isSceneTimeRangeState(newState)) { + if (prevState.from === newState.from && prevState.to === newState.to) { + return; + } + } + this.addTrailStep(trail, 'time'); } }); diff --git a/public/app/features/trails/utils.ts b/public/app/features/trails/utils.ts index b80a42b9eb5..364d597a515 100644 --- a/public/app/features/trails/utils.ts +++ b/public/app/features/trails/utils.ts @@ -1,6 +1,13 @@ import { urlUtil } from '@grafana/data'; import { config, getDataSourceSrv } from '@grafana/runtime'; -import { getUrlSyncManager, sceneGraph, SceneObject, SceneObjectUrlValues, SceneTimeRange } from '@grafana/scenes'; +import { + getUrlSyncManager, + sceneGraph, + SceneObject, + SceneObjectState, + SceneObjectUrlValues, + SceneTimeRange, +} from '@grafana/scenes'; import { getDatasourceSrv } from '../plugins/datasource_srv'; @@ -89,3 +96,12 @@ export function getColorByIndex(index: number) { const visTheme = config.theme2.visualization; return visTheme.getColorByName(visTheme.palette[index % 8]); } + +export type SceneTimeRangeState = SceneObjectState & { + from: string; + to: string; +}; +export function isSceneTimeRangeState(state: SceneObjectState): state is SceneTimeRangeState { + const keys = Object.keys(state); + return keys.includes('from') && keys.includes('to'); +}