import React, { FC, useState } from 'react'; import { css } from '@emotion/css'; import AutoSizer from 'react-virtualized-auto-sizer'; import { DataFrame, DataQuery, GrafanaTheme, PanelData } from '@grafana/data'; import { Icon, Tab, TabContent, TabsBar, useStyles } from '@grafana/ui'; import { PreviewQueryTab } from './PreviewQueryTab'; import { PreviewInstancesTab } from './PreviewInstancesTab'; import { EmptyState } from './EmptyState'; enum Tabs { Query = 'query', Instances = 'instances', } const tabs = [ { id: Tabs.Query, text: 'Query result' }, { id: Tabs.Instances, text: 'Alerting instances' }, ]; interface Props { getInstances: () => DataFrame[]; queries: DataQuery[]; onTest: () => void; } export const AlertingQueryPreview: FC = ({ getInstances, onTest, queries }) => { const [activeTab, setActiveTab] = useState(Tabs.Query); const styles = useStyles(getStyles); let data = {} as PanelData; const instances = getInstances(); return (
{tabs.map((tab, index) => { return ( setActiveTab(tab.id)} active={activeTab === tab.id} /> ); })} {data && (data.state === 'Error' ? (
{data.error?.data?.error}
) : ( ))}
); }; interface PreviewProps { queries: DataQuery[]; instances: DataFrame[]; onTest: () => void; data: PanelData; activeTab: string; } const QueriesAndInstances: FC = ({ queries, instances, onTest, data, activeTab }) => { if (queries.length === 0) { return (
Start adding queries to this alert and a visualisation for your queries will appear here.
Learn more about how to create alert definitions
); } return ( {({ width, height }) => { switch (activeTab) { case Tabs.Instances: return ; case Tabs.Query: default: return ; } }} ); }; const getStyles = (theme: GrafanaTheme) => { return { wrapper: css` display: flex; flex-direction: column; width: 100%; height: 100%; padding: ${theme.spacing.md} 0 0 ${theme.spacing.md}; `, tabContent: css` background: ${theme.colors.panelBg}; height: 100%; `, }; };