[v11.0.x] DashboardScene: Fixes minor issue transitioning between dashboards (#86475)

DashboardScene: Fixes minor issue transitioning between dashboards (#86262)

* DashboardScene: Fixes minor issue transitioning between dashboards

* Update

(cherry picked from commit a8b81e1481)

Co-authored-by: Torkel Ödegaard <torkel@grafana.com>
This commit is contained in:
grafana-delivery-bot[bot]
2024-05-03 17:27:14 +02:00
committed by GitHub
co-authored by Torkel Ödegaard
parent a4eb6c2ab6
commit 24784583be
3 changed files with 33 additions and 9 deletions
@@ -72,6 +72,11 @@ export function DashboardScenePage({ match, route, queryParams, history }: Props
);
}
// Do not render anything when transitioning from one dashboard to another
if (dashboard.state.uid && dashboard.state.uid !== match.params.uid) {
return null;
}
return (
<>
<dashboard.Component model={dashboard} key={dashboard.state.key} />
@@ -1,6 +1,6 @@
import { advanceBy } from 'jest-date-mock';
import { locationService } from '@grafana/runtime';
import { BackendSrv, locationService, setBackendSrv } from '@grafana/runtime';
import { getUrlSyncManager } from '@grafana/scenes';
import store from 'app/core/store';
import { DASHBOARD_FROM_LS_KEY } from 'app/features/dashboard/state/initDashboard';
@@ -41,6 +41,18 @@ describe('DashboardScenePageStateManager', () => {
expect(loader.state.loadError).toBe('Error: Dashboard not found');
});
it('should handle home dashboard redirect', async () => {
setBackendSrv({
get: () => Promise.resolve({ redirectUri: '/d/asd' }),
} as unknown as BackendSrv);
const loader = new DashboardScenePageStateManager({});
await loader.loadDashboard({ uid: '', route: DashboardRoutes.Home });
expect(loader.state.dashboard).toBeUndefined();
expect(loader.state.loadError).toBeUndefined();
});
it('shoud fetch dashboard from local storage and remove it after if it exists', async () => {
const loader = new DashboardScenePageStateManager({});
const localStorageDashboard = { uid: 'fake-dash' };
@@ -91,11 +91,8 @@ export class DashboardScenePageStateManager extends StateManagerBase<DashboardSc
case DashboardRoutes.Home:
rsp = await getBackendSrv().get('/api/dashboards/home');
// If user specified a custom home dashboard redirect to that
if (rsp?.redirectUri) {
const newUrl = locationUtil.stripBaseFromUrl(rsp.redirectUri);
locationService.replace(newUrl);
return null;
if (rsp.redirectUri) {
return rsp;
}
if (rsp?.meta) {
@@ -175,6 +172,10 @@ export class DashboardScenePageStateManager extends StateManagerBase<DashboardSc
try {
startMeasure(LOAD_SCENE_MEASUREMENT);
const dashboard = await this.loadScene(options);
if (!dashboard) {
return;
}
if (!(config.publicDashboardAccessToken && dashboard.state.controls?.state.hideTimeControls)) {
dashboard.startUrlSync();
}
@@ -187,12 +188,14 @@ export class DashboardScenePageStateManager extends StateManagerBase<DashboardSc
}
}
private async loadScene(options: LoadDashboardOptions): Promise<DashboardScene> {
private async loadScene(options: LoadDashboardOptions): Promise<DashboardScene | null> {
const comingFromExplore = Boolean(
localStorageStore.getObject<DashboardDTO>(DASHBOARD_FROM_LS_KEY) &&
options.keepDashboardFromExploreInLocalStorage === false
);
this.setState({ isLoading: true });
const rsp = await this.fetchDashboard(options);
const fromCache = this.cache[options.uid];
@@ -204,8 +207,6 @@ export class DashboardScenePageStateManager extends StateManagerBase<DashboardSc
}
}
this.setState({ isLoading: true });
if (rsp?.dashboard) {
const scene = transformSaveModelToScene(rsp);
@@ -217,6 +218,12 @@ export class DashboardScenePageStateManager extends StateManagerBase<DashboardSc
return scene;
}
if (rsp?.redirectUri) {
const newUrl = locationUtil.stripBaseFromUrl(rsp.redirectUri);
locationService.replace(newUrl);
return null;
}
throw new Error('Dashboard not found');
}