grafana/public/app/features/dashboard-scene/solo/SoloPanelPage.tsx
Torkel Ödegaard fe6d1460b0
DashboardScene: Adds solo page that uses dasboarde scene to render single panel (#77940)
* DashboardScene: Adds solo page that uses dasboarde scene to render single panel

* Update

* Panel and row repeats working

* Update

* added e2e tests

* Refactor

* Fixes

* Fix e2e

* fix

* fix

* fix
2024-02-11 09:08:47 +01:00

64 lines
1.8 KiB
TypeScript

// Libraries
import React, { useEffect } from 'react';
import { Alert, Spinner } from '@grafana/ui';
import PageLoader from 'app/core/components/PageLoader/PageLoader';
import { EntityNotFound } from 'app/core/components/PageNotFound/EntityNotFound';
import { GrafanaRouteComponentProps } from 'app/core/navigation/types';
import { DashboardPageRouteParams } from 'app/features/dashboard/containers/types';
import { DashboardRoutes } from 'app/types';
import { getDashboardScenePageStateManager } from '../pages/DashboardScenePageStateManager';
import { DashboardScene } from '../scene/DashboardScene';
import { useSoloPanel } from './useSoloPanel';
export interface Props extends GrafanaRouteComponentProps<DashboardPageRouteParams, { panelId: string }> {}
/**
* Used for iframe embedding and image rendering of single panels
*/
export function SoloPanelPage({ match, queryParams }: Props) {
const stateManager = getDashboardScenePageStateManager();
const { dashboard } = stateManager.useState();
useEffect(() => {
stateManager.loadDashboard({ uid: match.params.uid!, route: DashboardRoutes.Embedded });
return () => stateManager.clearState();
}, [stateManager, match, queryParams]);
if (!queryParams.panelId) {
return <EntityNotFound entity="Panel" />;
}
if (!dashboard) {
return <PageLoader />;
}
return <SoloPanelRenderer dashboard={dashboard} panelId={queryParams.panelId} />;
}
export default SoloPanelPage;
export function SoloPanelRenderer({ dashboard, panelId }: { dashboard: DashboardScene; panelId: string }) {
const [panel, error] = useSoloPanel(dashboard, panelId);
if (error) {
return <Alert title={error} />;
}
if (!panel) {
return (
<span>
Loading <Spinner />
</span>
);
}
return (
<div className="panel-solo">
<panel.Component model={panel} />
</div>
);
}