import React, { FC, useMemo, useState } from 'react'; import { useObservable } from 'react-use'; import { css } from 'emotion'; import AutoSizer from 'react-virtualized-auto-sizer'; import { DataFrame, DataQuery, GrafanaTheme, PanelData } from '@grafana/data'; import { Button, Icon, Tab, TabContent, TabsBar, useStyles } from '@grafana/ui'; import { PanelQueryRunner } from '../../query/state/PanelQueryRunner'; import { PreviewQueryTab } from './PreviewQueryTab'; import { PreviewInstancesTab } from './PreviewInstancesTab'; enum Tabs { Query = 'query', Instances = 'instances', } const tabs = [ { id: Tabs.Query, text: 'Query result' }, { id: Tabs.Instances, text: 'Alerting instances' }, ]; interface Props { queryRunner: PanelQueryRunner; getInstances: () => DataFrame[]; queries: DataQuery[]; onTest: () => void; onRunQueries: () => void; } export const AlertingQueryPreview: FC = ({ getInstances, onRunQueries, onTest, queryRunner, queries }) => { const [activeTab, setActiveTab] = useState(Tabs.Query); const styles = useStyles(getStyles); const observable = useMemo(() => queryRunner.getData({ withFieldConfig: true, withTransforms: true }), []); const data = useObservable(observable); const instances = getInstances(); return (
{tabs.map((tab, index) => { return ( setActiveTab(tab.id)} active={activeTab === tab.id} /> ); })} {data && data.state === 'Error' ? (

There was an error :(

{data.error?.data?.error}
) : queries && queries.length > 0 ? ( {({ width, height }) => { switch (activeTab) { case Tabs.Instances: return ( 0} instances={instances} styles={styles} width={width} height={height} onTest={onTest} /> ); case Tabs.Query: default: if (data) { return ; } return (

Run queries to view data.

); } }}
) : (

No queries added.

Start adding queries to this alert and a visualisation for your queries will appear here.
Learn more about how to create alert definitions
)}
); }; const getStyles = (theme: GrafanaTheme) => { return { wrapper: css` label: alertDefinitionPreviewTabs; 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%; `, noQueries: css` color: ${theme.colors.textSemiWeak}; display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100%; width: 100%; `, noQueriesHeader: css` color: ${theme.colors.textSemiWeak}; `, }; }; export type PreviewStyles = ReturnType;