Skip to content

Commit aee9e10

Browse files
authored
feat(issues): Display resolved via integration in activity (#102362)
displays integration activity information if the activity came from an activity <img width="505" height="75" alt="image" src="https://github.com/user-attachments/assets/f3d65394-a831-455f-ae1d-c0e44690981b" /> part of #102234
1 parent ba72a54 commit aee9e10

File tree

3 files changed

+107
-10
lines changed

3 files changed

+107
-10
lines changed

static/app/types/group.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,12 +617,20 @@ interface GroupActivitySetByResolvedInNextSemverRelease extends GroupActivityBas
617617
data: {
618618
// Set for semver releases
619619
current_release_version: string;
620+
inNextRelease?: boolean;
621+
integration_id?: number;
622+
provider?: string;
623+
provider_key?: string;
620624
};
621625
type: GroupActivityType.SET_RESOLVED_IN_RELEASE;
622626
}
623627

624628
interface GroupActivitySetByResolvedInRelease extends GroupActivityBase {
625629
data: {
630+
inNextRelease?: boolean;
631+
integration_id?: number;
632+
provider?: string;
633+
provider_key?: string;
626634
version?: string;
627635
};
628636
type: GroupActivityType.SET_RESOLVED_IN_RELEASE;

static/app/views/issueDetails/streamline/sidebar/activitySection.spec.tsx

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,4 +329,52 @@ describe('StreamlinedActivitySection', () => {
329329
}
330330
}
331331
});
332+
333+
it('renders resolved in release with integration', async () => {
334+
const resolvedGroup = GroupFixture({
335+
id: '1339',
336+
activity: [
337+
{
338+
type: GroupActivityType.SET_RESOLVED_IN_RELEASE,
339+
id: 'resolved-in-release-1',
340+
dateCreated: '2020-01-01T00:00:00',
341+
data: {
342+
version: '[email protected]',
343+
integration_id: 408,
344+
provider: 'Jira Server',
345+
provider_key: 'jira_server',
346+
},
347+
user,
348+
},
349+
],
350+
project,
351+
});
352+
353+
render(<StreamlinedActivitySection group={resolvedGroup} />);
354+
expect(await screen.findByText('Resolved')).toBeInTheDocument();
355+
expect(screen.getByRole('link', {name: '1.0.0'})).toBeInTheDocument();
356+
expect(screen.getByRole('link', {name: 'Jira Server'})).toBeInTheDocument();
357+
});
358+
359+
it('renders resolved in release without integration', async () => {
360+
const resolvedGroup = GroupFixture({
361+
id: '1340',
362+
activity: [
363+
{
364+
type: GroupActivityType.SET_RESOLVED_IN_RELEASE,
365+
id: 'resolved-in-release-2',
366+
dateCreated: '2020-01-01T00:00:00',
367+
data: {
368+
version: '[email protected]',
369+
},
370+
user,
371+
},
372+
],
373+
project,
374+
});
375+
376+
render(<StreamlinedActivitySection group={resolvedGroup} />);
377+
expect(await screen.findByText('Resolved')).toBeInTheDocument();
378+
expect(screen.getByRole('link', {name: '1.0.0'})).toBeInTheDocument();
379+
});
332380
});

static/app/views/issueDetails/streamline/sidebar/groupActivityItem.tsx

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -284,26 +284,67 @@ export default function getGroupActivityItem(
284284
}),
285285
};
286286
case GroupActivityType.SET_RESOLVED_IN_RELEASE: {
287-
// Resolved in the next release
287+
const hasIntegration =
288+
'integration_id' in activity.data && activity.data.integration_id;
289+
const integrationLink = hasIntegration ? (
290+
<Link
291+
to={`/settings/${organization.slug}/integrations/${activity.data.provider_key}/${activity.data.integration_id}/`}
292+
>
293+
{activity.data.provider}
294+
</Link>
295+
) : null;
296+
288297
if ('current_release_version' in activity.data) {
289298
const currentVersion = activity.data.current_release_version;
290299
return {
291300
title: t('Resolved'),
292-
message: tct('by [author] in releases greater than [version] [semver]', {
293-
author,
294-
version: <ActivityRelease project={project} version={currentVersion} />,
295-
semver: isSemverRelease(currentVersion) ? t('(semver)') : t('(non-semver)'),
296-
}),
301+
message: hasIntegration
302+
? tct(
303+
'by [author] in releases greater than [version] [semver] via [integration]',
304+
{
305+
author,
306+
version: (
307+
<ActivityRelease project={project} version={currentVersion} />
308+
),
309+
semver: isSemverRelease(currentVersion)
310+
? t('(semver)')
311+
: t('(non-semver)'),
312+
integration: integrationLink,
313+
}
314+
)
315+
: tct('by [author] in releases greater than [version] [semver]', {
316+
author,
317+
version: <ActivityRelease project={project} version={currentVersion} />,
318+
semver: isSemverRelease(currentVersion)
319+
? t('(semver)')
320+
: t('(non-semver)'),
321+
}),
297322
};
298323
}
299324
const version = activity.data.version;
325+
if (version) {
326+
return {
327+
title: t('Resolved'),
328+
message: hasIntegration
329+
? tct('by [author] in [version] [semver] via [integration]', {
330+
author,
331+
version: <ActivityRelease project={project} version={version} />,
332+
semver: isSemverRelease(version) ? t('(semver)') : t('(non-semver)'),
333+
integration: integrationLink,
334+
})
335+
: tct('by [author] in [version] [semver]', {
336+
author,
337+
version: <ActivityRelease project={project} version={version} />,
338+
semver: isSemverRelease(version) ? t('(semver)') : t('(non-semver)'),
339+
}),
340+
};
341+
}
300342
return {
301343
title: t('Resolved'),
302-
message: version
303-
? tct('by [author] in [version] [semver]', {
344+
message: hasIntegration
345+
? tct('by [author] in the upcoming release via [integration]', {
304346
author,
305-
version: <ActivityRelease project={project} version={version} />,
306-
semver: isSemverRelease(version) ? t('(semver)') : t('(non-semver)'),
347+
integration: integrationLink,
307348
})
308349
: tct('by [author] in the upcoming release', {
309350
author,

0 commit comments

Comments
 (0)