Skip to content

Commit e08d532

Browse files
committed
wip
1 parent c53a2e5 commit e08d532

File tree

4 files changed

+119
-2
lines changed

4 files changed

+119
-2
lines changed

src/sentry/static/sentry/app/views/organizationEventsV2/transactionView/minimap.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
import {DragManagerChildrenProps} from './dragManager';
1515
import {ParsedTraceType, TickAlignment} from './types';
1616

17+
export const MINIMAP_CONTAINER_HEIGHT = 106;
1718
const MINIMAP_HEIGHT = 75;
1819
const TIME_AXIS_HEIGHT = 30;
1920

@@ -564,6 +565,8 @@ const DurationGuideBox = styled('div')`
564565
`;
565566

566567
const MinimapContainer = styled('div')`
568+
opacity: 0.3;
569+
567570
width: 100%;
568571
position: sticky;
569572
left: 0;

src/sentry/static/sentry/app/views/organizationEventsV2/transactionView/span.tsx

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,16 @@ import Count from 'app/components/count';
88
import Tooltip from 'app/components/tooltip';
99

1010
import {SPAN_ROW_HEIGHT, SpanRow} from './styles';
11+
import {MINIMAP_CONTAINER_HEIGHT} from './minimap';
1112

1213
import {
1314
toPercent,
1415
SpanBoundsType,
1516
SpanGeneratedBoundsType,
1617
getHumanDuration,
18+
// rectOfElement,
19+
// rectRelativeTo,
20+
// rectOfViewport,
1721
} from './utils';
1822
import {SpanType} from './types';
1923
import {DividerHandlerManagerChildrenProps} from './dividerHandlerManager';
@@ -26,6 +30,7 @@ type PropType = {
2630
numOfSpanChildren: number;
2731
renderedSpanChildren: Array<JSX.Element>;
2832
spanBarColour: string;
33+
spanNumber: number;
2934

3035
dividerHandlerChildrenProps: DividerHandlerManagerChildrenProps;
3136
};
@@ -35,12 +40,22 @@ type State = {
3540
showSpanTree: boolean;
3641
};
3742

43+
const INTERSECTION_THRESHOLDS: Array<number> = [];
44+
45+
for (let i = 0; i <= 1.0; i += 0.01) {
46+
INTERSECTION_THRESHOLDS.push(i);
47+
}
48+
3849
class Span extends React.Component<PropType, State> {
3950
state: State = {
4051
displayDetail: false,
4152
showSpanTree: true,
4253
};
4354

55+
spanRowDOMRef = React.createRef<HTMLDivElement>();
56+
intersectionObserver?: IntersectionObserver = void 0;
57+
resizeObserver?: any = void 0;
58+
4459
toggleSpanTree = () => {
4560
this.setState(state => {
4661
return {
@@ -202,6 +217,8 @@ class Span extends React.Component<PropType, State> {
202217

203218
return (
204219
<SpanRow
220+
innerRef={this.spanRowDOMRef}
221+
data-span-number={String(this.props.spanNumber)}
205222
style={{
206223
display: isVisible ? 'block' : 'none',
207224

@@ -272,6 +289,83 @@ class Span extends React.Component<PropType, State> {
272289
);
273290
};
274291

292+
connectObserver = () => {
293+
if (!this.spanRowDOMRef.current) {
294+
return;
295+
}
296+
297+
this.disconnectObserver();
298+
299+
this.intersectionObserver = new IntersectionObserver(
300+
entries => {
301+
entries.forEach(entry => {
302+
const spanNumber = entry.target.getAttribute('data-span-number');
303+
304+
// console.log('entry', entry, entry.target);
305+
306+
// root refers to the root intersection rectangle used for the IntersectionObserver
307+
const rectRelativeToRoot = entry.boundingClientRect as DOMRect;
308+
309+
const bottomYCoord = rectRelativeToRoot.y + rectRelativeToRoot.height;
310+
311+
// refers to if the rect is out of view from the viewport
312+
const isOutOfViewAbove = rectRelativeToRoot.y < 0 && bottomYCoord < 0;
313+
314+
if (isOutOfViewAbove) {
315+
return;
316+
}
317+
318+
const relativeToMinimap = {
319+
top: rectRelativeToRoot.y - MINIMAP_CONTAINER_HEIGHT,
320+
bottom: bottomYCoord - MINIMAP_CONTAINER_HEIGHT,
321+
};
322+
323+
const rectBelowMinimap =
324+
relativeToMinimap.top > 0 && relativeToMinimap.bottom > 0;
325+
326+
if (rectBelowMinimap || relativeToMinimap.bottom <= 0) {
327+
return;
328+
}
329+
330+
console.log('entry', spanNumber);
331+
});
332+
},
333+
{
334+
threshold: INTERSECTION_THRESHOLDS,
335+
rootMargin: `-${MINIMAP_CONTAINER_HEIGHT}px 0px 0px 0px`,
336+
}
337+
);
338+
339+
this.intersectionObserver.observe(this.spanRowDOMRef.current);
340+
};
341+
342+
disconnectObserver = () => {
343+
if (this.intersectionObserver) {
344+
this.intersectionObserver.disconnect();
345+
}
346+
};
347+
348+
componentDidMount() {
349+
if (this.spanRowDOMRef.current) {
350+
this.connectObserver();
351+
352+
this.resizeObserver = new (window as any).ResizeObserver(() => {
353+
console.log('resized');
354+
this.connectObserver();
355+
});
356+
357+
this.resizeObserver.observe(this.spanRowDOMRef.current);
358+
}
359+
}
360+
361+
componentWillUnmount() {
362+
this.disconnectObserver();
363+
364+
if (this.resizeObserver) {
365+
this.resizeObserver.disconnect();
366+
}
367+
}
368+
275369
render() {
276370
return (
277371
<React.Fragment>

src/sentry/static/sentry/app/views/organizationEventsV2/transactionView/spanTree.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import DividerHandlerManager, {
1515

1616
type RenderedSpanTree = {
1717
spanTree: JSX.Element | null;
18+
nextSpanNumber: number;
1819
numOfHiddenSpansAbove: number;
1920
};
2021

@@ -26,6 +27,7 @@ type PropType = {
2627

2728
class SpanTree extends React.Component<PropType> {
2829
renderSpan = ({
30+
spanNumber,
2931
treeDepth,
3032
numOfHiddenSpansAbove,
3133
spanID,
@@ -36,6 +38,7 @@ class SpanTree extends React.Component<PropType> {
3638
pickSpanBarColour,
3739
dividerHandlerChildrenProps,
3840
}: {
41+
spanNumber: number;
3942
treeDepth: number;
4043
numOfHiddenSpansAbove: number;
4144
spanID: string;
@@ -59,6 +62,7 @@ class SpanTree extends React.Component<PropType> {
5962

6063
type AccType = {
6164
renderedSpanChildren: Array<JSX.Element>;
65+
nextSpanNumber: number;
6266
numOfHiddenSpansAbove: number;
6367
};
6468

@@ -67,6 +71,7 @@ class SpanTree extends React.Component<PropType> {
6771
const key = `${traceID}${spanChild.span_id}`;
6872

6973
const results = this.renderSpan({
74+
spanNumber: acc.nextSpanNumber,
7075
treeDepth: treeDepth + 1,
7176
numOfHiddenSpansAbove: acc.numOfHiddenSpansAbove,
7277
span: spanChild,
@@ -84,10 +89,13 @@ class SpanTree extends React.Component<PropType> {
8489

8590
acc.numOfHiddenSpansAbove = results.numOfHiddenSpansAbove;
8691

92+
acc.nextSpanNumber = results.nextSpanNumber;
93+
8794
return acc;
8895
},
8996
{
9097
renderedSpanChildren: [],
98+
nextSpanNumber: spanNumber + 1,
9199
numOfHiddenSpansAbove: isCurrentSpanHidden ? numOfHiddenSpansAbove + 1 : 0,
92100
}
93101
);
@@ -104,10 +112,12 @@ class SpanTree extends React.Component<PropType> {
104112

105113
return {
106114
numOfHiddenSpansAbove: reduced.numOfHiddenSpansAbove,
115+
nextSpanNumber: reduced.nextSpanNumber,
107116
spanTree: (
108117
<React.Fragment>
109118
{hiddenSpansMessage}
110119
<Span
120+
spanNumber={spanNumber}
111121
span={span}
112122
generateBounds={generateBounds}
113123
treeDepth={treeDepth}
@@ -156,6 +166,7 @@ class SpanTree extends React.Component<PropType> {
156166
});
157167

158168
return this.renderSpan({
169+
spanNumber: 1,
159170
treeDepth: 0,
160171
numOfHiddenSpansAbove: 0,
161172
span: rootSpan,

src/sentry/static/sentry/app/views/organizationEventsV2/transactionView/utils.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ type Rect = {
99
};
1010

1111
// get position of element relative to top/left of document
12-
const getOffsetOfElement = (element: HTMLElement) => {
12+
const getOffsetOfElement = (element: Element) => {
1313
// left and top are relative to viewport
1414
const {left, top} = element.getBoundingClientRect();
1515

@@ -20,7 +20,7 @@ const getOffsetOfElement = (element: HTMLElement) => {
2020
return {x: left + scrollLeft, y: top + scrollTop};
2121
};
2222

23-
export const rectOfContent = (element: HTMLElement): Rect => {
23+
export const rectOfContent = (element: Element): Rect => {
2424
const {x, y} = getOffsetOfElement(element);
2525

2626
// offsets for the border and any scrollbars (clientLeft and clientTop),
@@ -38,6 +38,15 @@ export const rectOfContent = (element: HTMLElement): Rect => {
3838
};
3939
};
4040

41+
export const rectOfViewport = (): Rect => {
42+
return {
43+
x: window.pageXOffset,
44+
y: window.pageYOffset,
45+
width: window.document.documentElement.clientWidth,
46+
height: window.document.documentElement.clientHeight,
47+
};
48+
};
49+
4150
export const rectRelativeTo = (rect: Rect, pos = {x: 0, y: 0}): Rect => {
4251
return {
4352
x: rect.x - pos.x,

0 commit comments

Comments
 (0)