grafana/public/app/features/scenes/apps/GrafanaMonitoringApp.tsx
Torkel Ödegaard 5c9898a860
Scenes: SceneApp example in core (#64686)
* Scenes: Progress on demo app

* Argh

* Fixing breadcrumbs

* Added spacer

* Conditional scene objects

* Quick and dirty test for drilldown link via panel title

* Changed the toggle

* Add url state syncing for most links

* Add url state syncing for most links

* Fix instance in url params

* Quick and dirty tabs on the handler page

* fixing breadcrumbs

* Hide footer

* Updates

* new table styles

* Update table cell link styles

* Added search box

* Scene app demo: dynamic data link (#60398)

* Dynamically build data links

* Add field override tests

* Updates

* Updated

* Updates

* before nesting routing

* Something is working

* Caching and nested routes working

* Simplify model

* Use app components from grafana/scenes

* Make the monitoring app work with section nav

* Fixing

* Update scenes

* Remove unused route

* Updates

* remove file

* Update scenes version and use new features

* Remove semicolon

* removed unused thing

* Add refresh pickers

---------

Co-authored-by: Dominik Prokop <dominik.prokop@grafana.com>
2023-03-20 11:15:42 +01:00

145 lines
4.1 KiB
TypeScript

// Libraries
import React, { useMemo, useState } from 'react';
import {
SceneCanvasText,
SceneFlexLayout,
SceneApp,
SceneAppPage,
SceneRouteMatch,
EmbeddedScene,
SceneAppPageLike,
} from '@grafana/scenes';
import { usePageNav } from 'app/core/components/Page/usePageNav';
import { PluginPageContext, PluginPageContextType } from 'app/features/plugins/components/PluginPageContext';
import {
getOverviewScene,
getHttpHandlerListScene,
getOverviewLogsScene,
getHandlerDetailsScene,
getHandlerLogsScene,
} from './scenes';
export function GrafanaMonitoringApp() {
const appScene = useMemo(
() =>
new SceneApp({
pages: [getMainPageScene()],
}),
[]
);
const sectionNav = usePageNav('scenes')!;
const [pluginContext] = useState<PluginPageContextType>({ sectionNav });
return (
<PluginPageContext.Provider value={pluginContext}>
<appScene.Component model={appScene} />
</PluginPageContext.Provider>
);
}
export function getMainPageScene() {
return new SceneAppPage({
title: 'Grafana Monitoring',
subTitle: 'A custom app with embedded scenes to monitor your Grafana server',
url: '/scenes/grafana-monitoring',
hideFromBreadcrumbs: false,
getScene: getOverviewScene,
tabs: [
new SceneAppPage({
title: 'Overview',
url: '/scenes/grafana-monitoring',
getScene: getOverviewScene,
preserveUrlKeys: ['from', 'to', 'var-instance'],
}),
new SceneAppPage({
title: 'HTTP handlers',
url: '/scenes/grafana-monitoring/handlers',
getScene: getHttpHandlerListScene,
preserveUrlKeys: ['from', 'to', 'var-instance'],
drilldowns: [
{
routePath: '/scenes/grafana-monitoring/handlers/:handler',
getPage: getHandlerDrilldownPage,
},
],
}),
new SceneAppPage({
title: 'Logs',
url: '/scenes/grafana-monitoring/logs',
getScene: getOverviewLogsScene,
preserveUrlKeys: ['from', 'to', 'var-instance'],
}),
],
});
}
export function getHandlerDrilldownPage(
match: SceneRouteMatch<{ handler: string; tab?: string }>,
parent: SceneAppPageLike
) {
const handler = decodeURIComponent(match.params.handler);
const baseUrl = `/scenes/grafana-monitoring/handlers/${encodeURIComponent(handler)}`;
return new SceneAppPage({
title: handler,
subTitle: 'A grafana http handler is responsible for service a specific API request',
url: baseUrl,
getParentPage: () => parent,
getScene: () => getHandlerDetailsScene(handler),
tabs: [
new SceneAppPage({
title: 'Metrics',
url: baseUrl,
routePath: '/scenes/grafana-monitoring/handlers/:handler',
getScene: () => getHandlerDetailsScene(handler),
preserveUrlKeys: ['from', 'to', 'var-instance'],
}),
new SceneAppPage({
title: 'Logs',
url: baseUrl + '/logs',
routePath: '/scenes/grafana-monitoring/handlers/:handler/logs',
getScene: () => getHandlerLogsScene(handler),
preserveUrlKeys: ['from', 'to', 'var-instance'],
drilldowns: [
{
routePath: '/scenes/grafana-monitoring/handlers/:handler/logs/:secondLevel',
getPage: getSecondLevelDrilldown,
},
],
}),
],
});
}
export function getSecondLevelDrilldown(
match: SceneRouteMatch<{ handler: string; secondLevel: string }>,
parent: SceneAppPageLike
) {
const handler = decodeURIComponent(match.params.handler);
const secondLevel = decodeURIComponent(match.params.secondLevel);
const baseUrl = `/scenes/grafana-monitoring/handlers/${encodeURIComponent(handler)}/logs/${secondLevel}`;
return new SceneAppPage({
title: secondLevel,
subTitle: 'Second level dynamic drilldown',
url: baseUrl,
getParentPage: () => parent,
getScene: () => {
return new EmbeddedScene({
body: new SceneFlexLayout({
children: [
new SceneCanvasText({
text: 'Drilldown: ' + secondLevel,
}),
],
}),
});
},
});
}
export default GrafanaMonitoringApp;