import React, { FC, useMemo } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { Icon, useStyles2, Link, Button } from '@grafana/ui'; import { css } from '@emotion/css'; import { AlertmanagerAlert, Silence } from 'app/plugins/datasource/alertmanager/types'; import SilenceTableRow from './SilenceTableRow'; import { getAlertTableStyles } from '../../styles/table'; import { NoSilencesSplash } from './NoSilencesCTA'; import { makeAMLink } from '../../utils/misc'; import { contextSrv } from 'app/core/services/context_srv'; import { useQueryParams } from 'app/core/hooks/useQueryParams'; interface Props { silences: Silence[]; alertManagerAlerts: AlertmanagerAlert[]; alertManagerSourceName: string; } const SilencesTable: FC = ({ silences, alertManagerAlerts, alertManagerSourceName }) => { const styles = useStyles2(getStyles); const tableStyles = useStyles2(getAlertTableStyles); const [queryParams] = useQueryParams(); const filteredSilences = useMemo(() => { const silenceIdsString = queryParams?.silenceIds; if (typeof silenceIdsString === 'string') { return silences.filter((silence) => silenceIdsString.split(',').includes(silence.id)); } return silences; }, [queryParams, silences]); const findSilencedAlerts = (id: string) => { return alertManagerAlerts.filter((alert) => alert.status.silencedBy.includes(id)); }; return ( <> {!!silences.length && ( <> {contextSrv.isEditor && (
)} {contextSrv.isEditor && } {contextSrv.isEditor && } {filteredSilences.map((silence, index) => { const silencedAlerts = findSilencedAlerts(silence.id); return ( ); })}
State Matching labels Alerts ScheduleAction
Expired silences are automatically deleted after 5 days.
)} {!silences.length && } ); }; const getStyles = (theme: GrafanaTheme2) => ({ topButtonContainer: css` display: flex; flex-direction: row; justify-content: flex-end; `, addNewSilence: css` margin-bottom: ${theme.spacing(1)}; `, colState: css` width: 110px; `, colMatchers: css` width: 50%; `, callout: css` background-color: ${theme.colors.background.secondary}; border-top: 3px solid ${theme.colors.info.border}; border-radius: 2px; height: 62px; display: flex; flex-direction: row; align-items: center; margin-top: ${theme.spacing(2)}; & > * { margin-left: ${theme.spacing(1)}; } `, calloutIcon: css` color: ${theme.colors.info.text}; `, }); export default SilencesTable;