grafana/public/app/features/alerting/unified/components/receivers/ReceiversAndTemplatesView.tsx

74 lines
3.0 KiB
TypeScript

import React from 'react';
import { Alert, LinkButton, Stack } from '@grafana/ui';
import { AlertManagerCortexConfig } from 'app/plugins/datasource/alertmanager/types';
import { AlertmanagerAction, useAlertmanagerAbility } from '../../hooks/useAbilities';
import { GRAFANA_RULES_SOURCE_NAME, isVanillaPrometheusAlertManagerDataSource } from '../../utils/datasource';
import { makeAMLink } from '../../utils/misc';
import { Authorize } from '../Authorize';
import { ReceiversSection } from './ReceiversSection';
import { ReceiversTable } from './ReceiversTable';
import { TemplatesTable } from './TemplatesTable';
interface Props {
config: AlertManagerCortexConfig;
alertManagerName: string;
}
export const ReceiversAndTemplatesView = ({ config, alertManagerName }: Props) => {
const isGrafanaManagedAlertmanager = alertManagerName === GRAFANA_RULES_SOURCE_NAME;
const isVanillaAM = isVanillaPrometheusAlertManagerDataSource(alertManagerName);
return (
<Stack direction="column" gap={4}>
<ReceiversTable config={config} alertManagerName={alertManagerName} />
{/* Vanilla flavored Alertmanager does not support editing notification templates via the UI */}
{!isVanillaAM && <TemplatesView config={config} alertManagerName={alertManagerName} />}
{/* Grafana manager Alertmanager does not support global config, Mimir and Cortex do */}
{!isGrafanaManagedAlertmanager && <GlobalConfigAlert alertManagerName={alertManagerName} />}
</Stack>
);
};
export const TemplatesView = ({ config, alertManagerName }: Props) => {
const [createNotificationTemplateSupported, createNotificationTemplateAllowed] = useAlertmanagerAbility(
AlertmanagerAction.CreateNotificationTemplate
);
return (
<ReceiversSection
title="Notification templates"
description="Create notification templates to customize your notifications."
addButtonLabel="Add template"
addButtonTo={makeAMLink('/alerting/notifications/templates/new', alertManagerName)}
showButton={createNotificationTemplateSupported && createNotificationTemplateAllowed}
>
<TemplatesTable config={config} alertManagerName={alertManagerName} />
</ReceiversSection>
);
};
interface GlobalConfigAlertProps {
alertManagerName: string;
}
export const GlobalConfigAlert = ({ alertManagerName }: GlobalConfigAlertProps) => {
const isVanillaAM = isVanillaPrometheusAlertManagerDataSource(alertManagerName);
return (
<Authorize actions={[AlertmanagerAction.UpdateExternalConfiguration]}>
<Alert severity="info" title="Global config for contact points">
<p>
For each external Alertmanager you can define global settings, like server addresses, usernames and password,
for all the supported contact points.
</p>
<LinkButton href={makeAMLink('alerting/notifications/global-config', alertManagerName)} variant="secondary">
{isVanillaAM ? 'View global config' : 'Edit global config'}
</LinkButton>
</Alert>
</Authorize>
);
};