index.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import {useRef} from 'react';
  2. import styled from '@emotion/styled';
  3. import {DateNavigator} from 'sentry/components/checkInTimeline/dateNavigator';
  4. import {
  5. GridLineLabels,
  6. GridLineOverlay,
  7. } from 'sentry/components/checkInTimeline/gridLines';
  8. import {useDateNavigation} from 'sentry/components/checkInTimeline/hooks/useDateNavigation';
  9. import {useTimeWindowConfig} from 'sentry/components/checkInTimeline/hooks/useTimeWindowConfig';
  10. import Panel from 'sentry/components/panels/panel';
  11. import {Sticky} from 'sentry/components/sticky';
  12. import {space} from 'sentry/styles/space';
  13. import {useDimensions} from 'sentry/utils/useDimensions';
  14. import type {UptimeAlert} from 'sentry/views/alerts/types';
  15. import {OverviewRow} from './overviewRow';
  16. interface Props {
  17. uptimeAlerts: UptimeAlert[];
  18. }
  19. export function OverviewTimeline({uptimeAlerts}: Props) {
  20. const elementRef = useRef<HTMLDivElement>(null);
  21. const {width: timelineWidth} = useDimensions<HTMLDivElement>({elementRef});
  22. const timeWindowConfig = useTimeWindowConfig({timelineWidth});
  23. const dateNavigation = useDateNavigation();
  24. return (
  25. <MonitorListPanel role="region">
  26. <TimelineWidthTracker ref={elementRef} />
  27. <Header>
  28. <HeaderControlsLeft>
  29. <DateNavigator
  30. dateNavigation={dateNavigation}
  31. direction="back"
  32. size="xs"
  33. borderless
  34. />
  35. </HeaderControlsLeft>
  36. <AlignedGridLineLabels timeWindowConfig={timeWindowConfig} />
  37. <HeaderControlsRight>
  38. <DateNavigator
  39. dateNavigation={dateNavigation}
  40. direction="forward"
  41. size="xs"
  42. borderless
  43. />
  44. </HeaderControlsRight>
  45. </Header>
  46. <AlignedGridLineOverlay
  47. stickyCursor
  48. allowZoom
  49. showCursor
  50. timeWindowConfig={timeWindowConfig}
  51. />
  52. <UptimeAlertRow>
  53. {uptimeAlerts.map(uptimeAlert => (
  54. <OverviewRow
  55. key={uptimeAlert.id}
  56. timeWindowConfig={timeWindowConfig}
  57. uptimeAlert={uptimeAlert}
  58. />
  59. ))}
  60. </UptimeAlertRow>
  61. </MonitorListPanel>
  62. );
  63. }
  64. const Header = styled(Sticky)`
  65. display: grid;
  66. grid-column: 1/-1;
  67. grid-template-columns: subgrid;
  68. z-index: 1;
  69. background: ${p => p.theme.background};
  70. border-top-left-radius: ${p => p.theme.panelBorderRadius};
  71. border-top-right-radius: ${p => p.theme.panelBorderRadius};
  72. box-shadow: 0 1px ${p => p.theme.translucentBorder};
  73. &[data-stuck] {
  74. border-radius: 0;
  75. border-left: 1px solid ${p => p.theme.border};
  76. border-right: 1px solid ${p => p.theme.border};
  77. margin: 0 -1px;
  78. }
  79. `;
  80. const TimelineWidthTracker = styled('div')`
  81. position: absolute;
  82. width: 100%;
  83. grid-row: 1;
  84. grid-column: 2/-1;
  85. `;
  86. const AlignedGridLineOverlay = styled(GridLineOverlay)`
  87. grid-row: 1;
  88. grid-column: 2/-1;
  89. `;
  90. const AlignedGridLineLabels = styled(GridLineLabels)`
  91. grid-row: 1;
  92. grid-column: 2/-1;
  93. `;
  94. const MonitorListPanel = styled(Panel)`
  95. display: grid;
  96. grid-template-columns: 350px 1fr max-content;
  97. `;
  98. const UptimeAlertRow = styled('ul')`
  99. display: grid;
  100. grid-template-columns: subgrid;
  101. grid-column: 1 / -1;
  102. list-style: none;
  103. padding: 0;
  104. margin: 0;
  105. `;
  106. const HeaderControlsLeft = styled('div')`
  107. grid-column: 1;
  108. display: flex;
  109. justify-content: flex-end;
  110. padding: ${space(1.5)} ${space(2)};
  111. `;
  112. const HeaderControlsRight = styled('div')`
  113. grid-row: 1;
  114. grid-column: -1;
  115. padding: ${space(1.5)} ${space(2)};
  116. `;