import { css } from '@emotion/css'; import { useMemo } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { Alert, Button, LinkButton, LoadingPlaceholder, Stack, useStyles2 } from '@grafana/ui'; import { Trans, t } from 'app/core/internationalization'; import { MuteTimingActionsButtons } from 'app/features/alerting/unified/components/mute-timings/MuteTimingActionsButtons'; import { ALL_MUTE_TIMINGS, useExportMuteTimingsDrawer, } from 'app/features/alerting/unified/components/mute-timings/useExportMuteTimingsDrawer'; import { useAlertmanager } from 'app/features/alerting/unified/state/AlertmanagerContext'; import { PROVENANCE_ANNOTATION } from 'app/features/alerting/unified/utils/k8s/constants'; import { Authorize } from '../../components/Authorize'; import { AlertmanagerAction, useAlertmanagerAbilities, useAlertmanagerAbility } from '../../hooks/useAbilities'; import { makeAMLink } from '../../utils/misc'; import { DynamicTable, DynamicTableColumnProps } from '../DynamicTable'; import { EmptyAreaWithCTA } from '../EmptyAreaWithCTA'; import { ProvisioningBadge } from '../Provisioning'; import { Spacer } from '../Spacer'; import { MuteTiming, useMuteTimings } from './useMuteTimings'; import { renderTimeIntervals } from './util'; type TableItem = { id: string; data: MuteTiming; }; export const MuteTimingsTable = () => { const { selectedAlertmanager: alertManagerSourceName = '', hasConfigurationAPI } = useAlertmanager(); const hideActions = !hasConfigurationAPI; const styles = useStyles2(getStyles); const [ExportAllDrawer, showExportAllDrawer] = useExportMuteTimingsDrawer(); const { data, isLoading, error } = useMuteTimings({ alertmanager: alertManagerSourceName ?? '' }); const items = useMemo((): TableItem[] => { const muteTimings = data || []; return muteTimings.map((mute) => { return { id: mute.id, data: mute, }; }); }, [data]); const [_, allowedToCreateMuteTiming] = useAlertmanagerAbility(AlertmanagerAction.CreateMuteTiming); const [exportMuteTimingsSupported, exportMuteTimingsAllowed] = useAlertmanagerAbility( AlertmanagerAction.ExportMuteTimings ); const columns = useColumns(alertManagerSourceName, hideActions); if (isLoading) { return ; } if (error) { return ( Could not load mute timings. Please try again later. ); } return (
Enter specific time intervals when not to send notifications or freeze notifications for recurring periods of time. {!hideActions && items.length > 0 && ( Add mute timing )} {exportMuteTimingsSupported && ( <> {ExportAllDrawer} )} {items.length > 0 ? ( ) : !hideActions ? ( ) : ( )}
); }; function useColumns(alertManagerSourceName: string, hideActions = false) { const [[_editSupported, allowedToEdit], [_deleteSupported, allowedToDelete]] = useAlertmanagerAbilities([ AlertmanagerAction.UpdateMuteTiming, AlertmanagerAction.DeleteMuteTiming, ]); const showActions = !hideActions && (allowedToEdit || allowedToDelete); return useMemo((): Array> => { const columns: Array> = [ { id: 'name', label: 'Name', renderCell: function renderName({ data }) { return (
{data.name}{' '} {data.provisioned && ( )}
); }, size: 1, }, { id: 'timeRange', label: 'Time range', renderCell: ({ data }) => { return renderTimeIntervals(data); }, size: 5, }, ]; if (showActions) { columns.push({ id: 'actions', label: 'Actions', alignColumn: 'end', renderCell: ({ data }) => ( ), size: 2, }); } return columns; }, [showActions, alertManagerSourceName]); } const getStyles = (theme: GrafanaTheme2) => ({ container: css({ display: 'flex', flexFlow: 'column nowrap', }), muteTimingsButtons: css({ marginBottom: theme.spacing(2), }), });