conversions.lib.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { format } from 'date-fns';
  2. import { HttpCheckStatus, ServiceCheckData } from '../../../../common/lib/http-check-data.module';
  3. /**
  4. * // Enhance data for displaying as stacked progress bar
  5. * @param start Start time (left boundary) for status timeline
  6. * @param end End time (right boundary) for status timeline
  7. * @param rawData The raw data array from the api response
  8. * @returns Data for displaying as stacked progress bar using ServiceTimelineWidget[data]
  9. */
  10. export function convertToStatusTimelineData(start: Date, end: Date, rawData?: ServiceCheckData[]) {
  11. const diffMs = end.getTime() - start.getTime();
  12. const data: Partial<StatusTimelineData>[] = [];
  13. if (rawData?.length) {
  14. let lastEntry: Partial<StatusTimelineData> | undefined = undefined;
  15. const diffPerc = ((rawData[0].time.getTime() - start.getTime()) / diffMs) * 100;
  16. if (diffPerc > 0) {
  17. lastEntry = {
  18. statusText: `[${format(rawData[0].time, 'HH:mm:ss')}] ${rawData[0].data.map(dx => dx.message).join(', ')}`,
  19. statusClass: mapStatusClass(rawData[0])
  20. };
  21. data.push(lastEntry);
  22. }
  23. let sumwidth = 0;
  24. rawData.forEach((d, i) => {
  25. if (lastEntry) {
  26. lastEntry.width = ((d.time.getTime() - start.getTime()) / diffMs) * 100 - sumwidth;
  27. sumwidth += lastEntry.width;
  28. }
  29. lastEntry = {
  30. statusText: `[${format(d.time, 'HH:mm:ss')}] ${d.data.map(dx => dx.message).join(', ')}`,
  31. statusClass: mapStatusClass(d)
  32. };
  33. data.push(lastEntry);
  34. });
  35. if (sumwidth < 100 && lastEntry && !lastEntry.width) {
  36. lastEntry.width = 100 - sumwidth;
  37. }
  38. } else {
  39. data.push({
  40. width: 100,
  41. statusClass: 'bg-progress',
  42. statusText: '- no data -'
  43. });
  44. }
  45. return data as StatusTimelineData[];
  46. }
  47. export function mapStatusClass(data: ServiceCheckData) {
  48. const maxStatus = data.data.reduce((res, d) => (res = Math.max(res, d.status)), 0);
  49. switch (maxStatus) {
  50. case HttpCheckStatus.OK:
  51. return 'bg-peak';
  52. default:
  53. return 'bg-max';
  54. }
  55. }