import React, { PureComponent } from 'react'; import classNames from 'classnames'; import { hot } from 'react-hot-loader'; import { connect } from 'react-redux'; import { Tooltip, PanelPlugin, PanelPluginMeta } from '@grafana/ui'; import { AngularComponent, config } from '@grafana/runtime'; import { QueriesTab } from './QueriesTab'; import VisualizationTab from './VisualizationTab'; import { GeneralTab } from './GeneralTab'; import { AlertTab } from '../../alerting/AlertTab'; import { PanelModel } from '../state/PanelModel'; import { DashboardModel } from '../state/DashboardModel'; import { StoreState } from '../../../types'; import { PanelEditorTabIds, PanelEditorTab } from './state/reducers'; import { refreshPanelEditor, changePanelEditorTab, panelEditorCleanUp } from './state/actions'; interface PanelEditorProps { panel: PanelModel; dashboard: DashboardModel; plugin: PanelPlugin; angularPanel?: AngularComponent; onPluginTypeChange: (newType: PanelPluginMeta) => void; activeTab: PanelEditorTabIds; tabs: PanelEditorTab[]; refreshPanelEditor: typeof refreshPanelEditor; panelEditorCleanUp: typeof panelEditorCleanUp; changePanelEditorTab: typeof changePanelEditorTab; } class UnConnectedPanelEditor extends PureComponent { constructor(props: PanelEditorProps) { super(props); } componentDidMount(): void { this.refreshFromState(); } componentWillUnmount(): void { const { panelEditorCleanUp } = this.props; panelEditorCleanUp(); } refreshFromState = (meta?: PanelPluginMeta) => { const { refreshPanelEditor, plugin } = this.props; meta = meta || plugin.meta; refreshPanelEditor({ hasQueriesTab: !meta.skipDataQuery, usesGraphPlugin: meta.id === 'graph', alertingEnabled: config.alertingEnabled, }); }; onChangeTab = (tab: PanelEditorTab) => { const { changePanelEditorTab } = this.props; // Angular Query Components can potentially refresh the PanelModel // onBlur so this makes sure we change tab after that setTimeout(() => changePanelEditorTab(tab), 10); }; onPluginTypeChange = (newType: PanelPluginMeta) => { const { onPluginTypeChange } = this.props; onPluginTypeChange(newType); this.refreshFromState(newType); }; renderCurrentTab(activeTab: string) { const { panel, dashboard, plugin, angularPanel } = this.props; switch (activeTab) { case 'advanced': return ; case 'queries': return ; case 'alert': return ; case 'visualization': return ( ); default: return null; } } render() { const { activeTab, tabs } = this.props; return (
{tabs.map(tab => { return ; })}
{this.renderCurrentTab(activeTab)}
); } } export const mapStateToProps = (state: StoreState) => ({ activeTab: state.location.query.tab || PanelEditorTabIds.Queries, tabs: state.panelEditor.tabs, }); const mapDispatchToProps = { refreshPanelEditor, panelEditorCleanUp, changePanelEditorTab }; export const PanelEditor = hot(module)( connect( mapStateToProps, mapDispatchToProps )(UnConnectedPanelEditor) ); interface TabItemParams { tab: PanelEditorTab; activeTab: string; onClick: (tab: PanelEditorTab) => void; } function TabItem({ tab, activeTab, onClick }: TabItemParams) { const tabClasses = classNames({ 'panel-editor-tabs__link': true, active: activeTab === tab.id, }); return (
onClick(tab)}>
); }