import React, { PureComponent } from 'react'; import classNames from 'classnames'; import { QueriesTab } from './QueriesTab'; import { VisualizationTab } from './VisualizationTab'; import { GeneralTab } from './GeneralTab'; import { store } from 'app/store/store'; import { updateLocation } from 'app/core/actions'; import { AngularComponent } from 'app/core/services/AngularLoader'; import { PanelModel } from '../panel_model'; import { DashboardModel } from '../dashboard_model'; import { PanelPlugin } from 'app/types/plugins'; interface PanelEditorProps { panel: PanelModel; dashboard: DashboardModel; plugin: PanelPlugin; angularPanel?: AngularComponent; onTypeChanged: (newType: PanelPlugin) => void; } interface PanelEditorTab { id: string; text: string; icon: string; } export class PanelEditor extends PureComponent { tabs: PanelEditorTab[]; constructor(props) { super(props); this.tabs = [ { id: 'general', text: 'General', icon: 'gicon gicon-preferences' }, { id: 'queries', text: 'Queries', icon: 'fa fa-database' }, { id: 'visualization', text: 'Visualization', icon: 'fa fa-line-chart' }, ]; } onChangeTab = (tab: PanelEditorTab) => { store.dispatch( updateLocation({ query: { tab: tab.id }, partial: true, }) ); this.forceUpdate(); }; onClose = () => { store.dispatch( updateLocation({ query: { tab: null, fullscreen: null, edit: null }, partial: true, }) ); }; render() { const { panel, dashboard, onTypeChanged, plugin, angularPanel } = this.props; const { location } = store.getState(); const activeTab = location.query.tab || 'queries'; return (
    {this.tabs.map(tab => { return ; })}
{activeTab === 'general' && } {activeTab === 'queries' && } {activeTab === 'visualization' && ( )}
); } } interface TabItemParams { tab: PanelEditorTab; activeTab: string; onClick: (tab: PanelEditorTab) => void; } function TabItem({ tab, activeTab, onClick }: TabItemParams) { const tabClasses = classNames({ 'gf-tabs-link': true, active: activeTab === tab.id, }); return (
  • onClick(tab)}> {tab.text}
  • ); }