eventTitleTreeLabel.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import {Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import overflowEllipsis from 'sentry/styles/overflowEllipsis';
  4. import space from 'sentry/styles/space';
  5. import {TreeLabelPart} from 'sentry/types';
  6. import {getTreeLabelPartDetails} from 'sentry/utils/events';
  7. type Props = {
  8. treeLabel: TreeLabelPart[];
  9. };
  10. function EventTitleTreeLabel({treeLabel}: Props) {
  11. const firstFourParts = treeLabel.slice(0, 4);
  12. const remainingParts = treeLabel.slice(firstFourParts.length);
  13. return (
  14. <Wrapper>
  15. <FirstFourParts>
  16. {firstFourParts.map((part, index) => {
  17. const label = getTreeLabelPartDetails(part);
  18. if (index !== firstFourParts.length - 1) {
  19. return (
  20. <Fragment key={index}>
  21. <PriorityLabel>{label}</PriorityLabel>
  22. <Divider>{'|'}</Divider>
  23. </Fragment>
  24. );
  25. }
  26. return <PriorityLabel key={index}>{label}</PriorityLabel>;
  27. })}
  28. </FirstFourParts>
  29. {!!remainingParts.length && (
  30. <RemainingLabels>
  31. {remainingParts.map((part, index) => {
  32. const label = getTreeLabelPartDetails(part);
  33. return (
  34. <Fragment key={index}>
  35. <Divider>{'|'}</Divider>
  36. <Label>{label}</Label>
  37. </Fragment>
  38. );
  39. })}
  40. </RemainingLabels>
  41. )}
  42. </Wrapper>
  43. );
  44. }
  45. export default EventTitleTreeLabel;
  46. const Wrapper = styled('div')`
  47. display: inline-grid;
  48. grid-template-columns: auto 1fr;
  49. align-items: center;
  50. `;
  51. const FirstFourParts = styled('div')`
  52. display: inline-grid;
  53. grid-auto-flow: column;
  54. align-items: center;
  55. `;
  56. const Label = styled('div')`
  57. display: inline-block;
  58. `;
  59. const PriorityLabel = styled(Label)`
  60. ${overflowEllipsis}
  61. display: inline-block;
  62. `;
  63. const RemainingLabels = styled('div')`
  64. ${overflowEllipsis}
  65. display: inline-block;
  66. min-width: 50px;
  67. `;
  68. export const Divider = styled('div')`
  69. color: ${p => p.theme.gray200};
  70. display: inline-block;
  71. padding: 0 ${space(1)};
  72. `;