import React, { Component } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import AutoSizer from 'react-virtualized-auto-sizer'; import { GrafanaRouteComponentProps } from 'app/core/navigation/types'; import { DashboardModel, PanelModel } from 'app/features/dashboard/state'; import { StoreState } from 'app/types'; import { DashboardPanel } from '../dashgrid/DashboardPanel'; import { initDashboard } from '../state/initDashboard'; export interface DashboardPageRouteParams { uid?: string; type?: string; slug?: string; } const mapStateToProps = (state: StoreState) => ({ dashboard: state.dashboard.getModel(), }); const mapDispatchToProps = { initDashboard, }; const connector = connect(mapStateToProps, mapDispatchToProps); export type Props = GrafanaRouteComponentProps & ConnectedProps; export interface State { panel: PanelModel | null; notFound: boolean; } export class SoloPanelPage extends Component { state: State = { panel: null, notFound: false, }; componentDidMount() { const { match, route } = this.props; this.props.initDashboard({ urlSlug: match.params.slug, urlUid: match.params.uid, urlType: match.params.type, routeName: route.routeName, fixUrl: false, }); } getPanelId(): number { return parseInt(this.props.queryParams.panelId ?? '0', 10); } componentDidUpdate(prevProps: Props) { const { dashboard } = this.props; if (!dashboard) { return; } // we just got a new dashboard if (!prevProps.dashboard || prevProps.dashboard.uid !== dashboard.uid) { const panel = dashboard.getPanelByUrlId(this.props.queryParams.panelId); if (!panel) { this.setState({ notFound: true }); return; } this.setState({ panel }); } } render() { return ( ); } } export interface SoloPanelProps extends State { dashboard: DashboardModel | null; panelId: number; } export const SoloPanel = ({ dashboard, notFound, panel, panelId }: SoloPanelProps) => { if (notFound) { return
Panel with id {panelId} not found
; } if (!panel || !dashboard) { return
Loading & initializing dashboard
; } return (
{({ width, height }) => { if (width === 0) { return null; } return ( ); }}
); }; export default connector(SoloPanelPage);