widgetHeader.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import styled from '@emotion/styled';
  2. import FeatureBadge from 'sentry/components/badge/featureBadge';
  3. import {HeaderTitleLegend} from 'sentry/components/charts/styles';
  4. import QuestionTooltip from 'sentry/components/questionTooltip';
  5. import TextOverflow from 'sentry/components/textOverflow';
  6. import {space} from 'sentry/styles/space';
  7. import {MEPTag} from 'sentry/utils/performance/contexts/metricsEnhancedPerformanceDataContext';
  8. import type {
  9. GenericPerformanceWidgetProps,
  10. WidgetDataConstraint,
  11. WidgetDataProps,
  12. } from '../types';
  13. import {PerformanceWidgetSetting} from '../widgetDefinitions';
  14. export function WidgetHeader<T extends WidgetDataConstraint>(
  15. props: GenericPerformanceWidgetProps<T> & WidgetDataProps<T>
  16. ) {
  17. const {title, titleTooltip, Subtitle, HeaderActions, InteractiveTitle, chartSetting} =
  18. props;
  19. const isWebVitalsWidget = [
  20. PerformanceWidgetSetting.HIGHEST_OPPORTUNITY_PAGES,
  21. PerformanceWidgetSetting.OVERALL_PERFORMANCE_SCORE,
  22. ].includes(chartSetting);
  23. const isResourcesWidget =
  24. chartSetting === PerformanceWidgetSetting.MOST_TIME_CONSUMING_RESOURCES;
  25. const isRequestsWidget =
  26. chartSetting === PerformanceWidgetSetting.MOST_TIME_CONSUMING_DOMAINS;
  27. const isCacheWidget =
  28. chartSetting === PerformanceWidgetSetting.HIGHEST_CACHE_MISS_RATE_TRANSACTIONS;
  29. const featureBadge =
  30. isWebVitalsWidget || isResourcesWidget || isRequestsWidget || isCacheWidget ? (
  31. <FeatureBadge type="new" />
  32. ) : null;
  33. return (
  34. <WidgetHeaderContainer>
  35. <TitleContainer>
  36. <StyledHeaderTitleLegend data-test-id="performance-widget-title">
  37. {InteractiveTitle ? (
  38. <InteractiveTitle {...props} />
  39. ) : (
  40. <TextOverflow>{title}</TextOverflow>
  41. )}
  42. {featureBadge}
  43. <MEPTag />
  44. {titleTooltip && (
  45. <QuestionTooltip position="top" size="sm" title={titleTooltip} />
  46. )}
  47. </StyledHeaderTitleLegend>
  48. {Subtitle ? <Subtitle {...props} /> : null}
  49. </TitleContainer>
  50. <HeaderActionsContainer>
  51. {HeaderActions && <HeaderActions {...props} />}
  52. </HeaderActionsContainer>
  53. </WidgetHeaderContainer>
  54. );
  55. }
  56. const StyledHeaderTitleLegend = styled(HeaderTitleLegend)`
  57. position: relative;
  58. z-index: initial;
  59. top: -${space(0.5)};
  60. ${FeatureBadge} {
  61. position: relative;
  62. top: -${space(0.25)};
  63. margin-left: ${space(0.25)};
  64. }
  65. `;
  66. const TitleContainer = styled('div')`
  67. display: flex;
  68. flex-direction: column;
  69. align-items: flex-start;
  70. `;
  71. const WidgetHeaderContainer = styled('div')`
  72. display: flex;
  73. justify-content: space-between;
  74. align-items: flex-start;
  75. gap: ${space(1)};
  76. `;
  77. const HeaderActionsContainer = styled('div')`
  78. display: flex;
  79. align-items: center;
  80. gap: ${space(1)};
  81. `;