widgetHeader.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import styled from '@emotion/styled';
  2. import {HeaderTitleLegend} from 'sentry/components/charts/styles';
  3. import {FeatureBadge} from 'sentry/components/core/badge/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 type {
  9. GenericPerformanceWidgetProps,
  10. WidgetDataConstraint,
  11. WidgetDataProps,
  12. } from '../types';
  13. export function WidgetHeader<T extends WidgetDataConstraint>(
  14. props: GenericPerformanceWidgetProps<T> & WidgetDataProps<T>
  15. ) {
  16. const {title, titleTooltip, Subtitle, HeaderActions, InteractiveTitle} = props;
  17. return (
  18. <WidgetHeaderContainer>
  19. <TitleContainer>
  20. <StyledHeaderTitleLegend data-test-id="performance-widget-title">
  21. {InteractiveTitle ? (
  22. <InteractiveTitle {...props} />
  23. ) : (
  24. <TextOverflow>{title}</TextOverflow>
  25. )}
  26. <MEPTag />
  27. {titleTooltip && (
  28. <QuestionTooltip position="top" size="sm" title={titleTooltip} />
  29. )}
  30. </StyledHeaderTitleLegend>
  31. {Subtitle ? <Subtitle {...props} /> : null}
  32. </TitleContainer>
  33. <HeaderActionsContainer>
  34. {HeaderActions && <HeaderActions {...props} />}
  35. </HeaderActionsContainer>
  36. </WidgetHeaderContainer>
  37. );
  38. }
  39. const StyledHeaderTitleLegend = styled(HeaderTitleLegend)`
  40. position: relative;
  41. z-index: initial;
  42. top: -${space(0.5)};
  43. ${FeatureBadge} {
  44. position: relative;
  45. top: -${space(0.25)};
  46. margin-left: ${space(0.25)};
  47. }
  48. `;
  49. const TitleContainer = styled('div')`
  50. display: flex;
  51. flex-direction: column;
  52. align-items: flex-start;
  53. `;
  54. const WidgetHeaderContainer = styled('div')`
  55. display: flex;
  56. justify-content: space-between;
  57. align-items: flex-start;
  58. gap: ${space(1)};
  59. `;
  60. const HeaderActionsContainer = styled('div')`
  61. display: flex;
  62. align-items: center;
  63. gap: ${space(1)};
  64. `;