2024-06-25 12:43:47 +01:00
|
|
|
import { useState, useEffect } from 'react';
|
2023-11-15 12:28:29 +01:00
|
|
|
import { Route, Switch } from 'react-router-dom';
|
|
|
|
|
|
2024-06-14 10:23:51 +02:00
|
|
|
import { PageLayoutType } from '@grafana/data';
|
2023-11-15 12:28:29 +01:00
|
|
|
import { locationService } from '@grafana/runtime';
|
2024-06-14 10:23:51 +02:00
|
|
|
import { SceneComponentProps, SceneObjectBase, SceneObjectState, UrlSyncContextProvider } from '@grafana/scenes';
|
2023-11-15 12:28:29 +01:00
|
|
|
import { Page } from 'app/core/components/Page/Page';
|
|
|
|
|
|
|
|
|
|
import { DataTrail } from './DataTrail';
|
|
|
|
|
import { DataTrailsHome } from './DataTrailsHome';
|
2024-03-26 10:39:56 +01:00
|
|
|
import { MetricsHeader } from './MetricsHeader';
|
2023-11-28 18:00:08 +00:00
|
|
|
import { getTrailStore } from './TrailStore/TrailStore';
|
2024-03-22 13:33:50 +00:00
|
|
|
import { HOME_ROUTE, TRAILS_ROUTE } from './shared';
|
2024-06-14 10:23:51 +02:00
|
|
|
import { getUrlForTrail, newMetricsTrail } from './utils';
|
2023-11-15 12:28:29 +01:00
|
|
|
|
|
|
|
|
export interface DataTrailsAppState extends SceneObjectState {
|
|
|
|
|
trail: DataTrail;
|
|
|
|
|
home: DataTrailsHome;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export class DataTrailsApp extends SceneObjectBase<DataTrailsAppState> {
|
|
|
|
|
public constructor(state: DataTrailsAppState) {
|
|
|
|
|
super(state);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
goToUrlForTrail(trail: DataTrail) {
|
|
|
|
|
locationService.push(getUrlForTrail(trail));
|
2024-06-14 10:23:51 +02:00
|
|
|
this.setState({ trail });
|
2023-11-15 12:28:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static Component = ({ model }: SceneComponentProps<DataTrailsApp>) => {
|
|
|
|
|
const { trail, home } = model.useState();
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Switch>
|
|
|
|
|
<Route
|
|
|
|
|
exact={true}
|
2024-03-22 13:33:50 +00:00
|
|
|
path={HOME_ROUTE}
|
2023-11-15 12:28:29 +01:00
|
|
|
render={() => (
|
2024-03-26 10:39:56 +01:00
|
|
|
<Page
|
|
|
|
|
navId="explore/metrics"
|
|
|
|
|
layout={PageLayoutType.Standard}
|
|
|
|
|
renderTitle={() => <MetricsHeader />}
|
|
|
|
|
subTitle=""
|
|
|
|
|
>
|
|
|
|
|
<home.Component model={home} />
|
2023-11-15 12:28:29 +01:00
|
|
|
</Page>
|
|
|
|
|
)}
|
|
|
|
|
/>
|
2024-06-14 10:23:51 +02:00
|
|
|
<Route exact={true} path={TRAILS_ROUTE} render={() => <DataTrailView trail={trail} />} />
|
2023-11-15 12:28:29 +01:00
|
|
|
</Switch>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function DataTrailView({ trail }: { trail: DataTrail }) {
|
2024-06-25 12:43:47 +01:00
|
|
|
const [isInitialized, setIsInitialized] = useState(false);
|
2023-11-15 12:28:29 +01:00
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (!isInitialized) {
|
2023-11-28 18:00:08 +00:00
|
|
|
getTrailStore().setRecentTrail(trail);
|
2023-11-15 12:28:29 +01:00
|
|
|
setIsInitialized(true);
|
|
|
|
|
}
|
|
|
|
|
}, [trail, isInitialized]);
|
|
|
|
|
|
|
|
|
|
if (!isInitialized) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-14 10:23:51 +02:00
|
|
|
return (
|
|
|
|
|
<UrlSyncContextProvider scene={trail}>
|
|
|
|
|
<trail.Component model={trail} />
|
|
|
|
|
</UrlSyncContextProvider>
|
|
|
|
|
);
|
2023-11-15 12:28:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let dataTrailsApp: DataTrailsApp;
|
|
|
|
|
|
|
|
|
|
export function getDataTrailsApp() {
|
|
|
|
|
if (!dataTrailsApp) {
|
|
|
|
|
dataTrailsApp = new DataTrailsApp({
|
2024-06-14 10:23:51 +02:00
|
|
|
trail: newMetricsTrail(),
|
2023-11-28 18:00:08 +00:00
|
|
|
home: new DataTrailsHome({}),
|
2023-11-15 12:28:29 +01:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return dataTrailsApp;
|
|
|
|
|
}
|