import React, { useCallback, useState } from 'react'; import { css } from 'emotion'; import { GrafanaTheme, PanelPlugin, PanelPluginMeta } from '@grafana/data'; import { useTheme, stylesFactory, Icon, Input } from '@grafana/ui'; import { changePanelPlugin } from '../../state/actions'; import { StoreState } from 'app/types'; import { PanelModel } from '../../state/PanelModel'; import { connect, MapStateToProps, MapDispatchToProps } from 'react-redux'; import { VizTypePicker, getAllPanelPluginMeta, filterPluginList } from '../VizTypePicker/VizTypePicker'; import { Field } from '@grafana/ui/src/components/Forms/Field'; interface OwnProps { panel: PanelModel; onToggleOptionGroup: (expand: boolean) => void; } interface ConnectedProps { plugin?: PanelPlugin; } interface DispatchProps { changePanelPlugin: typeof changePanelPlugin; } type Props = OwnProps & ConnectedProps & DispatchProps; export const VisualizationTabUnconnected = React.forwardRef( ({ panel, plugin, changePanelPlugin, onToggleOptionGroup }, ref) => { const [searchQuery, setSearchQuery] = useState(''); const theme = useTheme(); const styles = getStyles(theme); if (!plugin) { return null; } const onPluginTypeChange = (meta: PanelPluginMeta) => { if (meta.id === plugin.meta.id) { onToggleOptionGroup(false); } else { changePanelPlugin(panel, meta.id); } }; const onKeyPress = useCallback( (e: React.KeyboardEvent) => { if (e.key === 'Enter') { const query = e.currentTarget.value; const plugins = getAllPanelPluginMeta(); const match = filterPluginList(plugins, query, plugin.meta); if (match && match.length) { onPluginTypeChange(match[0]); } } }, [onPluginTypeChange] ); const suffix = searchQuery !== '' ? ( setSearchQuery('')}> Clear filter ) : null; return (
setSearchQuery(e.currentTarget.value)} onKeyPress={onKeyPress} prefix={} suffix={suffix} placeholder="Filter visualizations" ref={ref} /> {}} />
); } ); const getStyles = stylesFactory((theme: GrafanaTheme) => { return { icon: css` color: ${theme.palette.gray33}; `, wrapper: css` display: flex; flex-direction: column; `, searchClear: css` color: ${theme.palette.gray60}; cursor: pointer; `, }; }); const mapStateToProps: MapStateToProps = (state, props) => { return { plugin: state.plugins.panels[props.panel.type], }; }; const mapDispatchToProps: MapDispatchToProps = { changePanelPlugin }; export const VisualizationTab = connect(mapStateToProps, mapDispatchToProps, undefined, { forwardRef: true })( VisualizationTabUnconnected );