import { css } from '@emotion/css'; import { take, takeRight, uniqueId } from 'lodash'; import { FC } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { Stack, getTagColorsFromName, useStyles2 } from '@grafana/ui'; import { ObjectMatcher } from 'app/plugins/datasource/alertmanager/types'; import { MatcherFormatter, matcherFormatter } from '../../utils/matchers'; import { PopupCard } from '../HoverCard'; type MatchersProps = { matchers: ObjectMatcher[]; formatter?: MatcherFormatter }; // renders the first N number of matchers const Matchers: FC = ({ matchers, formatter = 'default' }) => { const styles = useStyles2(getStyles); const NUM_MATCHERS = 5; const firstFew = take(matchers, NUM_MATCHERS); const rest = takeRight(matchers, matchers.length - NUM_MATCHERS); const hasMoreMatchers = rest.length > 0; return ( {firstFew.map((matcher) => ( ))} {/* TODO hover state to show all matchers we're not showing */} {hasMoreMatchers && ( {rest.map((matcher) => ( ))} } >
{`and ${rest.length} more`}
)}
); }; interface MatcherBadgeProps { matcher: ObjectMatcher; formatter?: MatcherFormatter; } const MatcherBadge: FC = ({ matcher, formatter = 'default' }) => { const styles = useStyles2(getStyles); return (
{matcherFormatter[formatter](matcher)}
); }; const getStyles = (theme: GrafanaTheme2) => ({ matcher: (label: string) => { const { color, borderColor } = getTagColorsFromName(label); return { wrapper: css({ color: '#fff', background: color, padding: `${theme.spacing(0.33)} ${theme.spacing(0.66)}`, fontSize: theme.typography.bodySmall.fontSize, border: `solid 1px ${borderColor}`, borderRadius: theme.shape.borderRadius(2), // Ensure we preserve whitespace, as otherwise it's not noticeable _at all_ // when rendering the matcher, and is only noticeable when editing whiteSpace: 'pre', }), }; }, metadata: css({ color: theme.colors.text.secondary, fontSize: theme.typography.bodySmall.fontSize, fontWeight: theme.typography.bodySmall.fontWeight, }), }); export { Matchers };