import React, { useCallback, useState } from 'react'; import { FieldConfigSource, GrafanaTheme, PanelData, PanelPlugin } from '@grafana/data'; import { DashboardModel, PanelModel } from '../../state'; import { CustomScrollbar, stylesFactory, Tab, TabContent, TabsBar, useTheme, Container } from '@grafana/ui'; import { DefaultFieldConfigEditor, OverrideFieldConfigEditor } from './FieldConfigEditor'; import { AngularPanelOptions } from './AngularPanelOptions'; import { css } from 'emotion'; import { GeneralPanelOptions } from './GeneralPanelOptions'; import { PanelOptionsEditor } from './PanelOptionsEditor'; export const OptionsPaneContent: React.FC<{ plugin?: PanelPlugin; panel: PanelModel; data: PanelData; dashboard: DashboardModel; onFieldConfigsChange: (config: FieldConfigSource) => void; onPanelOptionsChanged: (options: any) => void; onPanelConfigChange: (configKey: string, value: any) => void; }> = ({ plugin, panel, data, onFieldConfigsChange, onPanelOptionsChanged, onPanelConfigChange, dashboard }) => { const theme = useTheme(); const styles = getStyles(theme); const renderFieldOptions = useCallback( (plugin: PanelPlugin) => { const fieldConfig = panel.getFieldConfig(); if (!fieldConfig) { return null; } return ( {renderCustomPanelSettings(plugin)} ); }, [data, plugin, panel, onFieldConfigsChange] ); const renderFieldOverrideOptions = useCallback( (plugin: PanelPlugin) => { const fieldConfig = panel.getFieldConfig(); if (!fieldConfig) { return null; } return ( ); }, [data, plugin, panel, onFieldConfigsChange] ); const renderCustomPanelSettings = useCallback( (plugin: PanelPlugin) => { const editors = []; if (plugin.editor && panel) { editors.push(
); } // When editor created declaratively if (plugin.optionEditors && panel) { editors.push( ); } if (editors.length > 0) { return <>{editors}; } return (
); }, [data, plugin, panel, onFieldConfigsChange] ); const [activeTab, setActiveTab] = useState('defaults'); return (
{plugin && (
setActiveTab('defaults')} /> setActiveTab('overrides')} /> setActiveTab('panel')} /> {activeTab === 'defaults' && renderFieldOptions(plugin)} {activeTab === 'overrides' && renderFieldOverrideOptions(plugin)} {activeTab === 'panel' && }
)}
); }; const getStyles = stylesFactory((theme: GrafanaTheme) => { return { wrapper: css` display: flex; flex-direction: column; height: 100%; `, panelOptionsPane: css` height: 100%; width: 100%; border-bottom: none; `, tabContent: css` padding: 0; display: flex; flex-direction: column; flex-grow: 1; min-height: 0; background: ${theme.colors.pageBg}; border-left: 1px solid ${theme.colors.pageHeaderBorder}; `, legacyOptions: css` label: legacy-options; .panel-options-grid { display: flex; flex-direction: column; } .panel-options-group { margin-bottom: 0; } .panel-options-group__body { padding: ${theme.spacing.md} 0; } .section { display: block; margin: ${theme.spacing.md} 0; &:first-child { margin-top: 0; } } `, }; });