monitorHeader.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import styled from '@emotion/styled';
  2. import Breadcrumbs from 'sentry/components/breadcrumbs';
  3. import {SectionHeading} from 'sentry/components/charts/styles';
  4. import IdBadge from 'sentry/components/idBadge';
  5. import * as Layout from 'sentry/components/layouts/thirds';
  6. import TimeSince from 'sentry/components/timeSince';
  7. import {t} from 'sentry/locale';
  8. import space from 'sentry/styles/space';
  9. import MonitorHeaderActions from './monitorHeaderActions';
  10. import MonitorIcon from './monitorIcon';
  11. type Props = React.ComponentProps<typeof MonitorHeaderActions>;
  12. const MonitorHeader = ({monitor, orgId, onUpdate}: Props) => {
  13. const crumbs = [
  14. {
  15. label: t('Monitors'),
  16. to: `/organizations/${orgId}/monitors`,
  17. },
  18. {
  19. label: t('Monitor Details'),
  20. },
  21. ];
  22. return (
  23. <Layout.Header>
  24. <Layout.HeaderContent>
  25. <Breadcrumbs crumbs={crumbs} />
  26. <Layout.Title>
  27. <MonitorName>
  28. <IdBadge
  29. project={monitor.project}
  30. avatarSize={28}
  31. hideName
  32. avatarProps={{hasTooltip: true, tooltip: monitor.project.slug}}
  33. />
  34. {monitor.name}
  35. </MonitorName>
  36. </Layout.Title>
  37. <MonitorId>{monitor.id}</MonitorId>
  38. </Layout.HeaderContent>
  39. <Layout.HeaderActions>
  40. <MonitorHeaderActions orgId={orgId} monitor={monitor} onUpdate={onUpdate} />
  41. <MonitorStats>
  42. <MonitorStatLabel>{t('Last Check-in')}</MonitorStatLabel>
  43. <MonitorStatLabel>{t('Next Check-in')}</MonitorStatLabel>
  44. <MonitorStatLabel>{t('Status')}</MonitorStatLabel>
  45. <div>{monitor.lastCheckIn && <TimeSince date={monitor.lastCheckIn} />}</div>
  46. <div>{monitor.nextCheckIn && <TimeSince date={monitor.nextCheckIn} />}</div>
  47. <MonitorIcon status={monitor.status} size={16} />
  48. </MonitorStats>
  49. </Layout.HeaderActions>
  50. </Layout.Header>
  51. );
  52. };
  53. const MonitorName = styled('div')`
  54. display: grid;
  55. grid-template-columns: max-content 1fr;
  56. grid-column-gap: ${space(1)};
  57. align-items: center;
  58. `;
  59. const MonitorId = styled('div')`
  60. margin-top: ${space(1)};
  61. color: ${p => p.theme.subText};
  62. `;
  63. const MonitorStats = styled('div')`
  64. display: grid;
  65. align-self: flex-end;
  66. grid-template-columns: repeat(3, max-content);
  67. grid-column-gap: ${space(4)};
  68. grid-row-gap: ${space(0.5)};
  69. margin-bottom: ${space(2)};
  70. `;
  71. const MonitorStatLabel = styled(SectionHeading)`
  72. text-transform: uppercase;
  73. font-size: ${p => p.theme.fontSizeSmall};
  74. `;
  75. export default MonitorHeader;