From b98a1d79cfcf81121d8bc54b40a19fc45fb4c568 Mon Sep 17 00:00:00 2001 From: Nathan Rodman Date: Tue, 18 Jan 2022 10:46:36 -0800 Subject: [PATCH] Alerting: mute timing improvements (#43940) * mute timing table ui fixes * add options for CTA to use link * fix validation for time range --- .../unified/components/EmptyAreaWithCTA.tsx | 32 ++++++++------ .../components/amroutes/AmRoutesTable.tsx | 6 +++ .../amroutes/MuteTimingTimeRange.tsx | 2 +- .../components/amroutes/MuteTimingsTable.tsx | 43 +++++++++++++------ 4 files changed, 58 insertions(+), 25 deletions(-) diff --git a/public/app/features/alerting/unified/components/EmptyAreaWithCTA.tsx b/public/app/features/alerting/unified/components/EmptyAreaWithCTA.tsx index 85d289bf7ae..c507512ab07 100644 --- a/public/app/features/alerting/unified/components/EmptyAreaWithCTA.tsx +++ b/public/app/features/alerting/unified/components/EmptyAreaWithCTA.tsx @@ -1,12 +1,13 @@ import React, { ButtonHTMLAttributes, FC } from 'react'; import { css } from '@emotion/css'; import { GrafanaTheme } from '@grafana/data'; -import { Button, ButtonVariant, IconName, useStyles } from '@grafana/ui'; +import { Button, ButtonVariant, IconName, LinkButton, useStyles } from '@grafana/ui'; import { EmptyArea } from './EmptyArea'; export interface EmptyAreaWithCTAProps { buttonLabel: string; - onButtonClick: ButtonHTMLAttributes['onClick']; + href?: string; + onButtonClick?: ButtonHTMLAttributes['onClick']; text: string; buttonIcon?: IconName; @@ -21,23 +22,30 @@ export const EmptyAreaWithCTA: FC = ({ buttonVariant = 'primary', onButtonClick, text, + href, }) => { const styles = useStyles(getStyles); + const commonProps = { + className: styles.button, + icon: buttonIcon, + size: buttonSize, + variant: buttonVariant, + }; + return ( <>

{text}

- + {href ? ( + + {buttonLabel} + + ) : ( + + )}
); diff --git a/public/app/features/alerting/unified/components/amroutes/AmRoutesTable.tsx b/public/app/features/alerting/unified/components/amroutes/AmRoutesTable.tsx index c3543129a35..a66ae209285 100644 --- a/public/app/features/alerting/unified/components/amroutes/AmRoutesTable.tsx +++ b/public/app/features/alerting/unified/components/amroutes/AmRoutesTable.tsx @@ -56,6 +56,12 @@ export const AmRoutesTable: FC = ({ renderCell: (item) => item.data.receiver || '-', size: 5, }, + { + id: 'muteTimings', + label: 'Mute timings', + renderCell: (item) => item.data.muteTimeIntervals.join(', ') || '-', + size: 5, + }, ...(readOnly ? [] : [ diff --git a/public/app/features/alerting/unified/components/amroutes/MuteTimingTimeRange.tsx b/public/app/features/alerting/unified/components/amroutes/MuteTimingTimeRange.tsx index dfb1b91e64f..46e3fc2747f 100644 --- a/public/app/features/alerting/unified/components/amroutes/MuteTimingTimeRange.tsx +++ b/public/app/features/alerting/unified/components/amroutes/MuteTimingTimeRange.tsx @@ -22,7 +22,7 @@ export const MuteTimingTimeRange: FC = ({ intervalIndex }) => { return true; } const [hour, minutes] = timeString.split(':').map((x) => parseInt(x, 10)); - const isHourValid = hour > 0 && hour < 25; + const isHourValid = hour >= 0 && hour < 25; const isMinuteValid = minutes > -1 && minutes < 60; const isTimeValid = hour === 24 ? minutes === 0 : isHourValid && isMinuteValid; diff --git a/public/app/features/alerting/unified/components/amroutes/MuteTimingsTable.tsx b/public/app/features/alerting/unified/components/amroutes/MuteTimingsTable.tsx index 2c32e5138ce..7ee43ea5b43 100644 --- a/public/app/features/alerting/unified/components/amroutes/MuteTimingsTable.tsx +++ b/public/app/features/alerting/unified/components/amroutes/MuteTimingsTable.tsx @@ -16,6 +16,7 @@ import { getMonthsString, getYearsString, } from '../../utils/alertmanager'; +import { EmptyAreaWithCTA } from '../EmptyAreaWithCTA'; interface Props { alertManagerSourceName: string; @@ -46,7 +47,7 @@ export const MuteTimingsTable: FC = ({ alertManagerSourceName, muteTiming const columns = useColumns(alertManagerSourceName, hideActions, setMuteTimingName); return ( -
+
{!hideActions &&
Mute timings
} {!hideActions && (

@@ -54,7 +55,29 @@ export const MuteTimingsTable: FC = ({ alertManagerSourceName, muteTiming particular notification policies for specific times of the day.

)} - {items.length > 0 ? :

No mute timings configured

} + {!hideActions && items.length > 0 && ( + + New mute timing + + )} + {items.length > 0 ? ( + + ) : !hideActions ? ( + + ) : ( +

No mute timings configured

+ )} {!hideActions && ( = ({ alertManagerSourceName, muteTiming onDismiss={() => setMuteTimingName('')} /> )} - {!hideActions && ( - - Add mute timing - - )}
); }; @@ -139,7 +153,12 @@ function renderTimeIntervals(timeIntervals: TimeInterval[]) { } const getStyles = (theme: GrafanaTheme2) => ({ + container: css` + display: flex; + flex-flow: column nowrap; + `, addMuteButton: css` - margin-top: ${theme.spacing(1)}; + margin-bottom: ${theme.spacing(2)}; + align-self: flex-end; `, });