grafana/public/app/features/dashboard/containers/SoloPanelPage.tsx

128 lines
3.0 KiB
TypeScript

import React, { Component } from 'react';
import { connect, ConnectedProps } from 'react-redux';
import AutoSizer from 'react-virtualized-auto-sizer';
import { DashboardPanel } from '../dashgrid/DashboardPanel';
import { initDashboard } from '../state/initDashboard';
import { StoreState } from 'app/types';
import { DashboardModel, PanelModel } from 'app/features/dashboard/state';
import { GrafanaRouteComponentProps } from 'app/core/navigation/types';
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<DashboardPageRouteParams, { panelId: string }> &
ConnectedProps<typeof connector>;
export interface State {
panel: PanelModel | null;
notFound: boolean;
}
export class SoloPanelPage extends Component<Props, State> {
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 (
<SoloPanel
dashboard={this.props.dashboard}
notFound={this.state.notFound}
panel={this.state.panel}
panelId={this.getPanelId()}
/>
);
}
}
export interface SoloPanelProps extends State {
dashboard: DashboardModel | null;
panelId: number;
}
export const SoloPanel = ({ dashboard, notFound, panel, panelId }: SoloPanelProps) => {
if (notFound) {
return <div className="alert alert-error">Panel with id {panelId} not found</div>;
}
if (!panel || !dashboard) {
return <div>Loading & initializing dashboard</div>;
}
return (
<div className="panel-solo">
<AutoSizer>
{({ width, height }) => {
if (width === 0) {
return null;
}
return (
<DashboardPanel
stateKey={panel.key}
width={width}
height={height}
dashboard={dashboard}
panel={panel}
isEditing={false}
isViewing={false}
lazy={false}
/>
);
}}
</AutoSizer>
</div>
);
};
export default connector(SoloPanelPage);