Skip to content

Commit 1494b9e

Browse files
committed
Revert "remove chartRenderer for now"
This reverts commit 9f6c709eb3d571e4b3190938df142fe6bc0a2467.
1 parent dd798bd commit 1494b9e

File tree

4 files changed

+115
-5
lines changed

4 files changed

+115
-5
lines changed

static/app/views/dashboards/widgets/timeSeriesWidget/timeSeriesWidgetVisualization.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,22 @@ export function TimeSeriesWidgetVisualization(props: TimeSeriesWidgetVisualizati
130130
releaseBubbleXAxis,
131131
releaseBubbleGrid,
132132
} = useReleaseBubbles({
133+
chartRenderer: ({start: trimStart, end: trimEnd, ref: chartRendererRef}) => {
134+
return (
135+
<DrawerWidgetWrapper>
136+
<TimeSeriesWidgetVisualization
137+
{...props}
138+
ref={chartRendererRef}
139+
disableReleaseNavigation
140+
onZoom={() => {}}
141+
plottables={props.plottables.map(plottable =>
142+
plottable.constrain(trimStart, trimEnd)
143+
)}
144+
showReleaseAs="line"
145+
/>
146+
</DrawerWidgetWrapper>
147+
);
148+
},
133149
minTime: earliestTimeStamp ? new Date(earliestTimeStamp).getTime() : undefined,
134150
maxTime: latestTimeStamp ? new Date(latestTimeStamp).getTime() : undefined,
135151
releases: hasReleaseBubbles
@@ -653,4 +669,8 @@ const LoadingMask = styled(TransparentLoadingMask)`
653669
background: ${p => p.theme.background};
654670
`;
655671

672+
const DrawerWidgetWrapper = styled('div')`
673+
height: 220px;
674+
`;
675+
656676
TimeSeriesWidgetVisualization.LoadingPlaceholder = LoadingPanel;

static/app/views/issueDetails/streamline/eventGraph.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,19 @@ export function EventGraph({
277277
releaseBubbleXAxis,
278278
releaseBubbleGrid,
279279
} = useReleaseBubbles({
280+
chartRenderer: ({ref: chartRef}) => {
281+
return (
282+
<EventGraph
283+
ref={chartRef}
284+
group={group}
285+
event={event}
286+
showSummary={false}
287+
showReleasesAs="line"
288+
disableZoomNavigation
289+
{...styleProps}
290+
/>
291+
);
292+
},
280293
alignInMiddle: true,
281294
legendSelected: legendSelected.Releases,
282295
desiredBuckets: eventSeries.length,

static/app/views/releases/drawer/releasesDrawerList.tsx

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import {useCallback, useRef} from 'react';
1+
import {Fragment, type ReactElement, useCallback, useRef} from 'react';
2+
import styled from '@emotion/styled';
23
import type {SeriesOption} from 'echarts';
34
import type {MarkLineOption} from 'echarts/types/dist/shared';
45
import type {EChartsInstance} from 'echarts-for-react';
56

7+
import {DateTime} from 'sentry/components/dateTime';
68
import {
79
EventDrawerBody,
810
EventDrawerContainer,
@@ -12,10 +14,16 @@ import {
1214
NavigationCrumbs,
1315
} from 'sentry/components/events/eventDrawer';
1416
import {t, tn} from 'sentry/locale';
17+
import {space} from 'sentry/styles/space';
1518
import type {ReactEchartsRef, SeriesDataUnit} from 'sentry/types/echarts';
19+
import type {ReleaseMetaBasic} from 'sentry/types/release';
20+
import {useLocation} from 'sentry/utils/useLocation';
21+
import {useNavigate} from 'sentry/utils/useNavigate';
1622
import usePageFilters from 'sentry/utils/usePageFilters';
1723
import {useReleaseStats} from 'sentry/utils/useReleaseStats';
1824
import {formatVersion} from 'sentry/utils/versions/formatVersion';
25+
import {Widget} from 'sentry/views/dashboards/widgets/widget/widget';
26+
import type {ChartRendererProps} from 'sentry/views/releases/releaseBubbles/types';
1927

2028
import {ReleaseDrawerTable} from './releasesDrawerTable';
2129

@@ -24,6 +32,14 @@ interface ReleasesDrawerListProps {
2432
environments: readonly string[];
2533
projects: readonly number[];
2634
startTs: number;
35+
/**
36+
* A renderer function that returns a chart. It is called with the trimmed
37+
* list of releases and timeSeries. It currently uses the
38+
* `TimeSeriesWidgetVisualization` components props. It's possible we change
39+
* it to make the props more generic, e.g. pass start/end timestamps and do
40+
* the series manipulation when we call the bubble hook.
41+
*/
42+
chartRenderer?: (rendererProps: ChartRendererProps) => ReactElement;
2743
}
2844

2945
type MarkLineDataCallbackFn = (item: SeriesDataUnit) => boolean;
@@ -82,9 +98,12 @@ const unhighlightMarkLines = createMarkLineUpdater({});
8298
export function ReleasesDrawerList({
8399
startTs,
84100
endTs,
101+
chartRenderer,
85102
projects,
86103
environments,
87104
}: ReleasesDrawerListProps) {
105+
const location = useLocation();
106+
const navigate = useNavigate();
88107
const start = new Date(startTs);
89108
const end = new Date(endTs);
90109
const pageFilters = usePageFilters();
@@ -95,6 +114,18 @@ export function ReleasesDrawerList({
95114
end: endTs ? new Date(endTs).toISOString() : null,
96115
},
97116
});
117+
const handleSelectRelease = useCallback(
118+
(nextSelectedRelease: string, projectId: string) => {
119+
navigate({
120+
query: {
121+
...location.query,
122+
release: nextSelectedRelease,
123+
projectId,
124+
},
125+
});
126+
},
127+
[navigate, location.query]
128+
);
98129
const chartRef = useRef<ReactEchartsRef | null>(null);
99130

100131
const handleMouseOverRelease = useCallback((release: string) => {
@@ -137,6 +168,42 @@ export function ReleasesDrawerList({
137168
<Header>{title}</Header>
138169
</EventNavigator>
139170
<EventDrawerBody>
171+
{chartRenderer ? (
172+
<ChartContainer>
173+
<Widget
174+
Title={
175+
<Fragment>
176+
{t('Releases from ')}
177+
<DateTime date={start} /> <span>{t('to')}</span> <DateTime date={end} />
178+
</Fragment>
179+
}
180+
Visualization={chartRenderer?.({
181+
ref: (e: ReactEchartsRef | null) => {
182+
chartRef.current = e;
183+
184+
if (e) {
185+
// When chart is mounted, zoom the chart into the relevant
186+
// bucket
187+
e.getEchartsInstance().dispatchAction({
188+
type: 'dataZoom',
189+
batch: [
190+
{
191+
// data value at starting location
192+
startValue: startTs,
193+
// data value at ending location
194+
endValue: endTs,
195+
},
196+
],
197+
});
198+
}
199+
},
200+
releases,
201+
start,
202+
end,
203+
})}
204+
/>
205+
</ChartContainer>
206+
) : null}
140207
<ReleaseDrawerTable
141208
projects={projects}
142209
environments={environments}
@@ -149,3 +216,7 @@ export function ReleasesDrawerList({
149216
</EventDrawerContainer>
150217
);
151218
}
219+
220+
const ChartContainer = styled('div')`
221+
margin-bottom: ${space(2)};
222+
`;

static/app/views/releases/releaseBubbles/useReleaseBubbles.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {useCallback, useMemo, useRef} from 'react';
1+
import {type ReactElement, useMemo, useRef} from 'react';
22
import {type Theme, useTheme} from '@emotion/react';
33
import type {
44
CustomSeriesOption,
@@ -256,6 +256,11 @@ interface UseReleaseBubblesParams {
256256
* The size (height) of the bubble
257257
*/
258258
bubbleSize?: number;
259+
/**
260+
* This is a callback function that is used in ReleasesDrawer when rendering
261+
* the chart inside of the drawer.
262+
*/
263+
chartRenderer?: (rendererProps: ChartRendererProps) => ReactElement;
259264
datetime?: Parameters<typeof normalizeDateTimeParams>[0];
260265
/**
261266
* Number of desired bubbles/buckets to create
@@ -280,6 +285,7 @@ interface UseReleaseBubblesParams {
280285
}
281286

282287
export function useReleaseBubbles({
288+
chartRenderer,
283289
releases,
284290
minTime,
285291
maxTime,
@@ -592,9 +598,9 @@ export function useReleaseBubbles({
592598
return {
593599
connectReleaseBubbleChartRef: handleChartRef,
594600

595-
/**
596-
* Series to append to a chart's existing `series`
597-
*/
601+
//
602+
// Series to append to a chart's existing `series`
603+
//
598604
releaseBubbleSeries: ReleaseBubbleSeries({
599605
alignInMiddle,
600606
buckets,

0 commit comments

Comments
 (0)