Files
Sonia Aguilar 1f13a14815 Alerting: Fix wrong use of empty list in times field in the UI (#84179)
* 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
2024-03-15 15:48:16 +01:00

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));
}