releaseStats.tsx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import {Fragment, memo} from 'react';
  2. import styled from '@emotion/styled';
  3. import GroupReleaseChart from 'app/components/group/releaseChart';
  4. import SeenInfo from 'app/components/group/seenInfo';
  5. import Placeholder from 'app/components/placeholder';
  6. import Tooltip from 'app/components/tooltip';
  7. import {IconQuestion} from 'app/icons';
  8. import {t} from 'app/locale';
  9. import space from 'app/styles/space';
  10. import {CurrentRelease, Environment, Group, Organization, Project} from 'app/types';
  11. import getDynamicText from 'app/utils/getDynamicText';
  12. import SidebarSection from './sidebarSection';
  13. type Props = {
  14. organization: Organization;
  15. project: Project;
  16. environments: Environment[];
  17. allEnvironments: Group | undefined;
  18. group: Group | undefined;
  19. currentRelease: CurrentRelease | undefined;
  20. };
  21. const GroupReleaseStats = ({
  22. organization,
  23. project,
  24. environments,
  25. allEnvironments,
  26. group,
  27. currentRelease,
  28. }: Props) => {
  29. const environmentLabel =
  30. environments.length > 0
  31. ? environments.map(env => env.displayName).join(', ')
  32. : t('All Environments');
  33. const shortEnvironmentLabel =
  34. environments.length > 1
  35. ? t('selected environments')
  36. : environments.length === 1
  37. ? environments[0].displayName
  38. : undefined;
  39. const projectId = project.id;
  40. const projectSlug = project.slug;
  41. const hasRelease = new Set(project.features).has('releases');
  42. const releaseTrackingUrl = `/settings/${organization.slug}/projects/${project.slug}/release-tracking/`;
  43. return (
  44. <SidebarSection title={<span data-test-id="env-label">{environmentLabel}</span>}>
  45. {!group || !allEnvironments ? (
  46. <Placeholder height="288px" />
  47. ) : (
  48. <Fragment>
  49. <GroupReleaseChart
  50. group={allEnvironments}
  51. environment={environmentLabel}
  52. environmentStats={group.stats}
  53. release={currentRelease?.release}
  54. releaseStats={currentRelease?.stats}
  55. statsPeriod="24h"
  56. title={t('Last 24 Hours')}
  57. firstSeen={group.firstSeen}
  58. lastSeen={group.lastSeen}
  59. />
  60. <GroupReleaseChart
  61. group={allEnvironments}
  62. environment={environmentLabel}
  63. environmentStats={group.stats}
  64. release={currentRelease?.release}
  65. releaseStats={currentRelease?.stats}
  66. statsPeriod="30d"
  67. title={t('Last 30 Days')}
  68. className="bar-chart-small"
  69. firstSeen={group.firstSeen}
  70. lastSeen={group.lastSeen}
  71. />
  72. <SidebarSection
  73. secondary
  74. title={
  75. <span>
  76. {t('Last seen')}
  77. <TooltipWrapper>
  78. <Tooltip
  79. title={t('When the most recent event in this issue was captured.')}
  80. disableForVisualTest
  81. >
  82. <StyledIconQuest size="xs" color="gray200" />
  83. </Tooltip>
  84. </TooltipWrapper>
  85. </span>
  86. }
  87. >
  88. <SeenInfo
  89. organization={organization}
  90. projectId={projectId}
  91. projectSlug={projectSlug}
  92. date={getDynamicText({
  93. value: group.lastSeen,
  94. fixed: '2016-01-13T03:08:25Z',
  95. })}
  96. dateGlobal={allEnvironments.lastSeen}
  97. hasRelease={hasRelease}
  98. environment={shortEnvironmentLabel}
  99. release={group.lastRelease || null}
  100. title={t('Last seen')}
  101. />
  102. </SidebarSection>
  103. <SidebarSection
  104. secondary
  105. title={
  106. <span>
  107. {t('First seen')}
  108. <TooltipWrapper>
  109. <Tooltip
  110. title={t('When the first event in this issue was captured.')}
  111. disableForVisualTest
  112. >
  113. <StyledIconQuest size="xs" color="gray200" />
  114. </Tooltip>
  115. </TooltipWrapper>
  116. </span>
  117. }
  118. >
  119. <SeenInfo
  120. organization={organization}
  121. projectId={projectId}
  122. projectSlug={projectSlug}
  123. date={getDynamicText({
  124. value: group.firstSeen,
  125. fixed: '2015-08-13T03:08:25Z',
  126. })}
  127. dateGlobal={allEnvironments.firstSeen}
  128. hasRelease={hasRelease}
  129. environment={shortEnvironmentLabel}
  130. release={group.firstRelease || null}
  131. title={t('First seen')}
  132. />
  133. </SidebarSection>
  134. {!hasRelease ? (
  135. <SidebarSection secondary title={t('Releases not configured')}>
  136. <a href={releaseTrackingUrl}>{t('Setup Releases')}</a>{' '}
  137. {t(' to make issues easier to fix.')}
  138. </SidebarSection>
  139. ) : null}
  140. </Fragment>
  141. )}
  142. </SidebarSection>
  143. );
  144. };
  145. export default memo(GroupReleaseStats);
  146. const TooltipWrapper = styled('span')`
  147. margin-left: ${space(0.5)};
  148. `;
  149. const StyledIconQuest = styled(IconQuestion)`
  150. position: relative;
  151. top: 2px;
  152. `;