import { css } from '@emotion/css'; import React from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { secondsToHms } from '@grafana/data/src/datetime/rangeutil'; import { getDataSourceSrv } from '@grafana/runtime'; import { useStyles2 } from '@grafana/ui'; import { RecordedQuery } from '../types'; interface Props { recordedQuery: RecordedQuery; buttons: JSX.Element[]; } export const QueryCard = ({ recordedQuery, buttons }: Props) => { const styles = useStyles2(getStyles); const ds = getDataSourceSrv()?.getInstanceSettings(recordedQuery.queries[0]?.datasource); return (
{ds?.meta && }

{recordedQuery.name}

{content(recordedQuery)}

{buttons.map((b, i) => { return (
{b}
); })}
); }; const content = (rq: RecordedQuery): string => { const content = [`Interval: ${secondsToHms(rq.interval)}`, `Range: Last ${secondsToHms(rq.range)}`]; const ds = getDataSourceSrv()?.getInstanceSettings(rq.queries[0]?.datasource); if (ds !== undefined) { content.unshift(ds.name); } if (rq.description !== '') { content.push(`${rq.description}`); } return content.join(' | '); }; const getStyles = (theme: GrafanaTheme2) => { const borderRadius = theme.shape.borderRadius(); return { info: css` display: flex; flex-direction: row; justify-content: space-between; align-items: center; width: 100%; `, heading: css` display: flex; justify-content: space-between; align-items: center; width: 100%; margin-bottom: 0; font-size: ${theme.typography.size.md}; letter-spacing: inherit; line-height: ${theme.typography.body.lineHeight}; color: ${theme.colors.text.primary}; font-weight: ${theme.typography.fontWeightMedium}; `, description: css` width: 100%; margin: ${theme.spacing(1, 0, 0)}; color: ${theme.colors.text.secondary}; line-height: ${theme.typography.body.lineHeight}; `, alert: css` flex-grow: 1; position: relative; border-radius: ${borderRadius}; display: flex; flex-direction: row; align-items: center; background: ${theme.colors.background.secondary}; box-shadow: ${theme.shadows.z1}; margin-bottom: ${theme.spacing(1)}; &:before { content: ''; position: absolute; top: 0; left: 0; bottom: 0; right: 0; background: ${theme.colors.background.primary}; z-index: -1; } `, body: css` color: ${theme.colors.text.secondary}; padding: ${theme.spacing(2)}; flex-grow: 1; display: flex; flex-direction: column; justify-content: center; overflow-wrap: break-word; word-break: break-word; `, content: css` color: ${theme.colors.text.secondary}; padding-top: ${theme.spacing(1)}; margin-left: 26px; `, media: css` margin-left: ${theme.spacing(2)}; width: 40px; `, buttonWrapper: css` padding: ${theme.spacing(1)}; background: none; display: flex; align-items: center; margin-right: ${theme.spacing()}; `, button: css` margin-left: ${theme.spacing()}; `, }; };