traceTransactionRow.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import {PlatformIcon} from 'platformicons';
  2. import {TraceIcons} from '../traceIcons';
  3. import type {TraceTree} from '../traceModels/traceTree';
  4. import type {TraceTreeNode} from '../traceModels/traceTreeNode';
  5. import {makeTraceNodeBarColor, TraceBar} from '../traceRow/traceBar';
  6. import {
  7. maybeFocusTraceRow,
  8. TRACE_COUNT_FORMATTER,
  9. TraceChildrenButton,
  10. TraceRowConnectors,
  11. type TraceRowProps,
  12. } from '../traceRow/traceRow';
  13. export function TraceTransactionRow(
  14. props: TraceRowProps<TraceTreeNode<TraceTree.Transaction>>
  15. ) {
  16. return (
  17. <div
  18. key={props.index}
  19. ref={r =>
  20. props.tabIndex === 0
  21. ? maybeFocusTraceRow(r, props.node, props.previouslyFocusedNodeRef)
  22. : null
  23. }
  24. tabIndex={props.tabIndex}
  25. className={`TraceRow ${props.rowSearchClassName} ${props.node.hasErrors ? props.node.maxIssueSeverity : ''}`}
  26. onKeyDown={props.onRowKeyDown}
  27. onPointerDown={props.onRowClick}
  28. style={props.style}
  29. >
  30. <div
  31. className="TraceLeftColumn"
  32. ref={props.registerListColumnRef}
  33. onDoubleClick={props.onRowDoubleClick}
  34. >
  35. <div className="TraceLeftColumnInner" style={props.listColumnStyle}>
  36. <div className={props.listColumnClassName}>
  37. <TraceRowConnectors node={props.node} manager={props.manager} />
  38. {props.node.children.length > 0 || props.node.canFetch ? (
  39. <TraceChildrenButton
  40. icon={
  41. props.node.canFetch ? (
  42. props.node.fetchStatus === 'idle' ? (
  43. '+'
  44. ) : props.node.zoomedIn ? (
  45. <TraceIcons.Chevron direction="up" />
  46. ) : (
  47. '+'
  48. )
  49. ) : (
  50. <TraceIcons.Chevron direction={props.node.expanded ? 'up' : 'down'} />
  51. )
  52. }
  53. status={props.node.fetchStatus}
  54. expanded={props.node.expanded || props.node.zoomedIn}
  55. onDoubleClick={props.onExpandDoubleClick}
  56. onClick={e => {
  57. if (props.node.canFetch) {
  58. props.onZoomIn(e);
  59. } else {
  60. props.onExpand(e);
  61. }
  62. }}
  63. >
  64. {props.node.children.length > 0
  65. ? TRACE_COUNT_FORMATTER.format(props.node.children.length)
  66. : null}
  67. </TraceChildrenButton>
  68. ) : null}
  69. </div>
  70. <PlatformIcon
  71. platform={props.projects[props.node.value.project_slug] ?? 'default'}
  72. />
  73. <span className="TraceOperation">{props.node.value['transaction.op']}</span>
  74. <strong className="TraceEmDash"> — </strong>
  75. <span className="TraceDescription">{props.node.value.transaction}</span>
  76. </div>
  77. </div>
  78. <div
  79. ref={props.registerSpanColumnRef}
  80. className={props.spanColumnClassName}
  81. onDoubleClick={props.onRowDoubleClick}
  82. >
  83. <TraceBar
  84. node={props.node}
  85. virtualized_index={props.virtualized_index}
  86. manager={props.manager}
  87. color={makeTraceNodeBarColor(props.theme, props.node)}
  88. node_space={props.node.space}
  89. errors={props.node.errors}
  90. performance_issues={props.node.performance_issues}
  91. profiles={props.node.profiles}
  92. />
  93. <button
  94. ref={props.registerSpanArrowRef}
  95. className="TraceArrow"
  96. onClick={props.onSpanArrowClick}
  97. >
  98. <TraceIcons.Chevron direction="left" />
  99. </button>
  100. </div>
  101. </div>
  102. );
  103. }