import React, { FC, useCallback, useState } from 'react'; import { css } from 'emotion'; import { GrafanaTheme, PanelPlugin, PanelPluginMeta } from '@grafana/data'; import { CustomScrollbar, 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 '../../panel_editor/VizTypePicker'; import { Field } from '@grafana/ui/src/components/Forms/Field'; interface OwnProps { panel: PanelModel; } interface ConnectedProps { plugin?: PanelPlugin; } interface DispatchProps { changePanelPlugin: typeof changePanelPlugin; } type Props = OwnProps & ConnectedProps & DispatchProps; export const VisualizationTabUnconnected: FC = ({ panel, plugin, changePanelPlugin }) => { const [searchQuery, setSearchQuery] = useState(''); const theme = useTheme(); const styles = getStyles(theme); if (!plugin) { return null; } const onPluginTypeChange = (meta: PanelPluginMeta) => { 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 visualisations" autoFocus />
{}} />
); }; const getStyles = stylesFactory((theme: GrafanaTheme) => { return { icon: css` color: ${theme.palette.gray33}; `, wrapper: css` display: flex; flex-direction: column; flex-grow: 1; max-height: 100%; padding: ${theme.spacing.md}; `, search: css` flex-grow: 0; flex-shrink: 1; `, searchClear: css` color: ${theme.palette.gray60}; cursor: pointer; `, visList: css` flex-grow: 1; height: 100%; overflow: hidden; `, }; }); const mapStateToProps: MapStateToProps = (state, props) => { return { plugin: state.plugins.panels[props.panel.type], }; }; const mapDispatchToProps: MapDispatchToProps = { changePanelPlugin }; export const VisualizationTab = connect(mapStateToProps, mapDispatchToProps)(VisualizationTabUnconnected);