mirror of
https://github.com/grafana/grafana.git
synced 2025-08-02 03:02:18 +08:00

* Fix wrong use of empty list in times field in the UI * Add tooltip for disable switch * Show disabled badge in mute timings * Disable time ranges when disabling time interval in the UI * PR review comments * remove tooltip for the field as it does not register it correctly * remove wrong code line * Add comment * Address PR review comments
120 lines
3.1 KiB
TypeScript
120 lines
3.1 KiB
TypeScript
import { isUndefined, omitBy } from 'lodash';
|
|
|
|
import { MuteTimeInterval, TimeInterval, TimeRange } from 'app/plugins/datasource/alertmanager/types';
|
|
|
|
import { MuteTimingFields, MuteTimingIntervalFields } from '../types/mute-timing-form';
|
|
|
|
export const DAYS_OF_THE_WEEK = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
|
|
|
|
export const MONTHS = [
|
|
'january',
|
|
'february',
|
|
'march',
|
|
'april',
|
|
'may',
|
|
'june',
|
|
'july',
|
|
'august',
|
|
'september',
|
|
'october',
|
|
'november',
|
|
'december',
|
|
];
|
|
|
|
export const defaultTimeInterval: MuteTimingIntervalFields = {
|
|
times: [{ start_time: '', end_time: '' }],
|
|
weekdays: '',
|
|
days_of_month: '',
|
|
months: '',
|
|
years: '',
|
|
location: '',
|
|
disable: false,
|
|
};
|
|
|
|
export const validateArrayField = (
|
|
value: string | undefined,
|
|
validateValue: (input: string) => boolean,
|
|
invalidText: string
|
|
) => {
|
|
if (value) {
|
|
return (
|
|
value
|
|
.split(',')
|
|
.map((x) => x.trim())
|
|
.every((entry) => entry.split(':').every(validateValue)) || invalidText
|
|
);
|
|
} else {
|
|
return true;
|
|
}
|
|
};
|
|
|
|
const convertStringToArray = (str?: string) => {
|
|
return str ? str.split(',').map((s) => s.trim()) : undefined;
|
|
};
|
|
|
|
export const createMuteTiming = (fields: MuteTimingFields): MuteTimeInterval => {
|
|
const timeIntervals: TimeInterval[] = fields.time_intervals.map(
|
|
({ times, weekdays, days_of_month, months, years, location, disable }) => {
|
|
const interval = {
|
|
times: convertTimesToDto(times, disable),
|
|
weekdays: convertStringToArray(weekdays)?.map((v) => v.toLowerCase()),
|
|
days_of_month: convertStringToArray(days_of_month),
|
|
months: convertStringToArray(months),
|
|
years: convertStringToArray(years),
|
|
location: location ? location : undefined,
|
|
};
|
|
|
|
return omitBy(interval, isUndefined);
|
|
}
|
|
);
|
|
|
|
return {
|
|
name: fields.name,
|
|
time_intervals: timeIntervals,
|
|
};
|
|
};
|
|
|
|
/*
|
|
* Convert times from form to dto, if disable is true, then return an empty array as times
|
|
If the times array is empty and disable is false, then return undefined
|
|
* @param muteTimeInterval
|
|
* @returns MuteTimingFields
|
|
*
|
|
*/
|
|
function convertTimesToDto(times: TimeRange[] | undefined, disable: boolean) {
|
|
if (disable) {
|
|
return [];
|
|
}
|
|
const timesToReturn = times?.filter(({ start_time, end_time }) => !!start_time && !!end_time);
|
|
return timesToReturn?.length ? timesToReturn : undefined;
|
|
}
|
|
|
|
/*
|
|
* Get disable field from dto, if any of the lists is an empty array, then the disable field is true
|
|
* @param muteTimeInterval
|
|
* @returns MuteTimingFields
|
|
*
|
|
*/
|
|
|
|
export function isTimeIntervalDisabled(intervals: TimeInterval): boolean {
|
|
if (
|
|
intervals.times?.length === 0 ||
|
|
intervals.weekdays?.length === 0 ||
|
|
intervals.days_of_month?.length === 0 ||
|
|
intervals.months?.length === 0 ||
|
|
intervals.years?.length === 0
|
|
) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
Return true if all the time intervals are disabled
|
|
* @param muteTimeInterval
|
|
* @returns MuteTimingFields
|
|
* */
|
|
export function isDisabled(muteTiming: MuteTimeInterval) {
|
|
return muteTiming.time_intervals.every((timeInterval) => isTimeIntervalDisabled(timeInterval));
|
|
}
|