widgetHeader.tsx 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import styled from '@emotion/styled';
  2. import {HeaderTitleLegend} from 'sentry/components/charts/styles';
  3. import FeatureBadge from 'sentry/components/featureBadge';
  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 {
  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 featureBadge = isWebVitalsWidget ? (
  26. <FeatureBadge type="new" />
  27. ) : isResourcesWidget ? (
  28. <FeatureBadge type="alpha" />
  29. ) : null;
  30. return (
  31. <WidgetHeaderContainer>
  32. <TitleContainer>
  33. <StyledHeaderTitleLegend data-test-id="performance-widget-title">
  34. {InteractiveTitle ? (
  35. <InteractiveTitle {...props} />
  36. ) : (
  37. <TextOverflow>{title}</TextOverflow>
  38. )}
  39. {featureBadge}
  40. <MEPTag />
  41. {titleTooltip && (
  42. <QuestionTooltip position="top" size="sm" title={titleTooltip} />
  43. )}
  44. </StyledHeaderTitleLegend>
  45. {Subtitle ? <Subtitle {...props} /> : null}
  46. </TitleContainer>
  47. <HeaderActionsContainer>
  48. {HeaderActions && <HeaderActions {...props} />}
  49. </HeaderActionsContainer>
  50. </WidgetHeaderContainer>
  51. );
  52. }
  53. const StyledHeaderTitleLegend = styled(HeaderTitleLegend)`
  54. position: relative;
  55. z-index: initial;
  56. top: -${space(0.5)};
  57. ${FeatureBadge} {
  58. position: relative;
  59. top: -${space(0.25)};
  60. margin-left: ${space(0.25)};
  61. }
  62. `;
  63. const TitleContainer = styled('div')`
  64. display: flex;
  65. flex-direction: column;
  66. align-items: flex-start;
  67. `;
  68. const WidgetHeaderContainer = styled('div')`
  69. display: flex;
  70. justify-content: space-between;
  71. align-items: flex-start;
  72. gap: ${space(1)};
  73. `;
  74. const HeaderActionsContainer = styled('div')`
  75. display: flex;
  76. align-items: center;
  77. gap: ${space(1)};
  78. `;