import { css } from '@emotion/css'; import React from 'react'; import { dateTimeFormat, GrafanaTheme2 } from '@grafana/data'; import { AdHocFiltersVariable, sceneGraph } from '@grafana/scenes'; import { Badge, Card, IconButton, Stack, useStyles2 } from '@grafana/ui'; import { DataTrail } from './DataTrail'; import { VAR_FILTERS } from './shared'; import { getDataSource, getDataSourceName, getMetricName } from './utils'; export interface Props { trail: DataTrail; onSelect: (trail: DataTrail) => void; onDelete?: () => void; } export function DataTrailCard({ trail, onSelect, onDelete }: Props) { const styles = useStyles2(getStyles); const filtersVariable = sceneGraph.lookupVariable(VAR_FILTERS, trail)!; if (!(filtersVariable instanceof AdHocFiltersVariable)) { return null; } const filters = filtersVariable.state.filters; const dsValue = getDataSource(trail); return ( onSelect(trail)} className={styles.card}> {getMetricName(trail.state.metric)}
{filters.map((f) => ( ))}
Datasource: {getDataSourceName(dsValue)}
{trail.state.createdAt && ( Created: {dateTimeFormat(trail.state.createdAt, { format: 'LL' })} )}
{onDelete && ( )}
); } function getStyles(theme: GrafanaTheme2) { return { tag: css({ maxWidth: '260px', overflow: 'hidden', textOverflow: 'ellipsis', }), card: css({ padding: theme.spacing(1), }), secondary: css({ color: theme.colors.text.secondary, fontSize: '12px', }), description: css({ width: '100%', gridArea: 'Description', margin: theme.spacing(1, 0, 0), color: theme.colors.text.secondary, lineHeight: theme.typography.body.lineHeight, }), actions: css({ marginRight: theme.spacing(1), }), }; }