import { format } from 'date-fns'; import { HttpCheckStatus, ServiceCheckData } from '../../../../common/lib/http-check-data.module'; /** * // Enhance data for displaying as stacked progress bar * @param start Start time (left boundary) for status timeline * @param end End time (right boundary) for status timeline * @param rawData The raw data array from the api response * @returns Data for displaying as stacked progress bar using ServiceTimelineWidget[data] */ export function convertToStatusTimelineData(start: Date, end: Date, rawData?: ServiceCheckData[]) { const diffMs = end.getTime() - start.getTime(); const data: Partial[] = []; if (rawData?.length) { let lastEntry: Partial | undefined = undefined; const diffPerc = ((rawData[0].time.getTime() - start.getTime()) / diffMs) * 100; if (diffPerc > 0) { lastEntry = { statusText: `[${format(rawData[0].time, 'HH:mm:ss')}] ${rawData[0].data.map(dx => dx.message).join(', ')}`, statusClass: mapStatusClass(rawData[0]) }; data.push(lastEntry); } let sumwidth = 0; rawData.forEach((d, i) => { if (lastEntry) { lastEntry.width = ((d.time.getTime() - start.getTime()) / diffMs) * 100 - sumwidth; sumwidth += lastEntry.width; } lastEntry = { statusText: `[${format(d.time, 'HH:mm:ss')}] ${d.data.map(dx => dx.message).join(', ')}`, statusClass: mapStatusClass(d) }; data.push(lastEntry); }); if (sumwidth < 100 && lastEntry && !lastEntry.width) { lastEntry.width = 100 - sumwidth; } } else { data.push({ width: 100, statusClass: 'bg-progress', statusText: '- no data -' }); } return data as StatusTimelineData[]; } export function mapStatusClass(data: ServiceCheckData) { const maxStatus = data.data.reduce((res, d) => (res = Math.max(res, d.status)), 0); switch (maxStatus) { case HttpCheckStatus.OK: return 'bg-peak'; default: return 'bg-max'; } }