breadcrumb.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import {Component} from 'react';
  2. import {Location, LocationDescriptor} from 'history';
  3. import Breadcrumbs, {Crumb} from 'app/components/breadcrumbs';
  4. import {t} from 'app/locale';
  5. import {Organization} from 'app/types';
  6. import {decodeScalar} from 'app/utils/queryString';
  7. import Tab from './transactionSummary/tabs';
  8. import {eventsRouteWithQuery} from './transactionSummary/transactionEvents/utils';
  9. import {tagsRouteWithQuery} from './transactionSummary/transactionTags/utils';
  10. import {vitalsRouteWithQuery} from './transactionSummary/transactionVitals/utils';
  11. import {transactionSummaryRouteWithQuery} from './transactionSummary/utils';
  12. import {vitalDetailRouteWithQuery} from './vitalDetail/utils';
  13. import {getPerformanceLandingUrl} from './utils';
  14. type Props = {
  15. organization: Organization;
  16. location: Location;
  17. transactionName?: string;
  18. vitalName?: string;
  19. eventSlug?: string;
  20. traceSlug?: string;
  21. transactionComparison?: boolean;
  22. tab?: Tab;
  23. };
  24. class Breadcrumb extends Component<Props> {
  25. getCrumbs() {
  26. const crumbs: Crumb[] = [];
  27. const {
  28. organization,
  29. location,
  30. transactionName,
  31. vitalName,
  32. eventSlug,
  33. traceSlug,
  34. transactionComparison,
  35. tab,
  36. } = this.props;
  37. const performanceTarget: LocationDescriptor = {
  38. pathname: getPerformanceLandingUrl(organization),
  39. query: {
  40. ...location.query,
  41. // clear out the transaction name
  42. transaction: undefined,
  43. },
  44. };
  45. crumbs.push({
  46. to: performanceTarget,
  47. label: t('Performance'),
  48. preserveGlobalSelection: true,
  49. });
  50. if (vitalName) {
  51. const webVitalsTarget = vitalDetailRouteWithQuery({
  52. orgSlug: organization.slug,
  53. vitalName: 'fcp',
  54. projectID: decodeScalar(location.query.project),
  55. query: location.query,
  56. });
  57. crumbs.push({
  58. to: webVitalsTarget,
  59. label: t('Vital Detail'),
  60. preserveGlobalSelection: true,
  61. });
  62. } else if (transactionName) {
  63. switch (tab) {
  64. case Tab.Tags: {
  65. const tagsTarget = tagsRouteWithQuery({
  66. orgSlug: organization.slug,
  67. transaction: transactionName,
  68. projectID: decodeScalar(location.query.project),
  69. query: location.query,
  70. });
  71. crumbs.push({
  72. to: tagsTarget,
  73. label: t('Tags'),
  74. preserveGlobalSelection: true,
  75. });
  76. break;
  77. }
  78. case Tab.Events: {
  79. const eventsTarget = eventsRouteWithQuery({
  80. orgSlug: organization.slug,
  81. transaction: transactionName,
  82. projectID: decodeScalar(location.query.project),
  83. query: location.query,
  84. });
  85. crumbs.push({
  86. to: eventsTarget,
  87. label: t('All Events'),
  88. preserveGlobalSelection: true,
  89. });
  90. break;
  91. }
  92. case Tab.WebVitals: {
  93. const webVitalsTarget = vitalsRouteWithQuery({
  94. orgSlug: organization.slug,
  95. transaction: transactionName,
  96. projectID: decodeScalar(location.query.project),
  97. query: location.query,
  98. });
  99. crumbs.push({
  100. to: webVitalsTarget,
  101. label: t('Web Vitals'),
  102. preserveGlobalSelection: true,
  103. });
  104. break;
  105. }
  106. case Tab.TransactionSummary:
  107. default: {
  108. const summaryTarget = transactionSummaryRouteWithQuery({
  109. orgSlug: organization.slug,
  110. transaction: transactionName,
  111. projectID: decodeScalar(location.query.project),
  112. query: location.query,
  113. });
  114. crumbs.push({
  115. to: summaryTarget,
  116. label: t('Transaction Summary'),
  117. preserveGlobalSelection: true,
  118. });
  119. }
  120. }
  121. }
  122. if (transactionName && eventSlug) {
  123. crumbs.push({
  124. to: '',
  125. label: t('Event Details'),
  126. });
  127. } else if (transactionComparison) {
  128. crumbs.push({
  129. to: '',
  130. label: t('Compare to Baseline'),
  131. });
  132. } else if (traceSlug) {
  133. crumbs.push({
  134. to: '',
  135. label: t('Trace View'),
  136. });
  137. }
  138. return crumbs;
  139. }
  140. render() {
  141. return <Breadcrumbs crumbs={this.getCrumbs()} />;
  142. }
  143. }
  144. export default Breadcrumb;