From a9ed0dd02000b6c2f57202fc50ca0a50ebc03abe Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Wed, 29 Oct 2025 14:26:57 -0700 Subject: [PATCH 1/2] feat(issues): Display resolution integration info displays integration activity information if the activity came from an activity --- static/app/types/group.tsx | 8 +++ .../sidebar/activitySection.spec.tsx | 48 +++++++++++++++++ .../streamline/sidebar/groupActivityItem.tsx | 52 ++++++++++++++----- 3 files changed, 94 insertions(+), 14 deletions(-) diff --git a/static/app/types/group.tsx b/static/app/types/group.tsx index 0a592868a53b4b..65b1c40078a7d5 100644 --- a/static/app/types/group.tsx +++ b/static/app/types/group.tsx @@ -617,12 +617,20 @@ interface GroupActivitySetByResolvedInNextSemverRelease extends GroupActivityBas data: { // Set for semver releases current_release_version: string; + inNextRelease?: boolean; + integration_id?: number; + provider?: string; + provider_key?: string; }; type: GroupActivityType.SET_RESOLVED_IN_RELEASE; } interface GroupActivitySetByResolvedInRelease extends GroupActivityBase { data: { + inNextRelease?: boolean; + integration_id?: number; + provider?: string; + provider_key?: string; version?: string; }; type: GroupActivityType.SET_RESOLVED_IN_RELEASE; diff --git a/static/app/views/issueDetails/streamline/sidebar/activitySection.spec.tsx b/static/app/views/issueDetails/streamline/sidebar/activitySection.spec.tsx index 3268437c163d87..05143223bf9aa9 100644 --- a/static/app/views/issueDetails/streamline/sidebar/activitySection.spec.tsx +++ b/static/app/views/issueDetails/streamline/sidebar/activitySection.spec.tsx @@ -329,4 +329,52 @@ describe('StreamlinedActivitySection', () => { } } }); + + it('renders resolved in release with integration', async () => { + const resolvedGroup = GroupFixture({ + id: '1339', + activity: [ + { + type: GroupActivityType.SET_RESOLVED_IN_RELEASE, + id: 'resolved-in-release-1', + dateCreated: '2020-01-01T00:00:00', + data: { + version: 'frontend@1.0.0', + integration_id: 408, + provider: 'Jira Server', + provider_key: 'jira_server', + }, + user, + }, + ], + project, + }); + + render(); + expect(await screen.findByText('Resolved')).toBeInTheDocument(); + expect(screen.getByRole('link', {name: '1.0.0'})).toBeInTheDocument(); + expect(screen.getByRole('link', {name: 'Jira Server'})).toBeInTheDocument(); + }); + + it('renders resolved in release without integration', async () => { + const resolvedGroup = GroupFixture({ + id: '1340', + activity: [ + { + type: GroupActivityType.SET_RESOLVED_IN_RELEASE, + id: 'resolved-in-release-2', + dateCreated: '2020-01-01T00:00:00', + data: { + version: 'frontend@1.0.0', + }, + user, + }, + ], + project, + }); + + render(); + expect(await screen.findByText('Resolved')).toBeInTheDocument(); + expect(screen.getByRole('link', {name: '1.0.0'})).toBeInTheDocument(); + }); }); diff --git a/static/app/views/issueDetails/streamline/sidebar/groupActivityItem.tsx b/static/app/views/issueDetails/streamline/sidebar/groupActivityItem.tsx index 52df2a49492630..c77abd083d01d9 100644 --- a/static/app/views/issueDetails/streamline/sidebar/groupActivityItem.tsx +++ b/static/app/views/issueDetails/streamline/sidebar/groupActivityItem.tsx @@ -284,30 +284,54 @@ export default function getGroupActivityItem( }), }; case GroupActivityType.SET_RESOLVED_IN_RELEASE: { - // Resolved in the next release + const hasIntegration = + 'integration_id' in activity.data && activity.data.integration_id; + const integrationLink = hasIntegration ? ( + + {activity.data.provider} + + ) : null; + const viaIntegration = hasIntegration + ? tct(' via [integration]', {integration: integrationLink}) + : ''; + if ('current_release_version' in activity.data) { const currentVersion = activity.data.current_release_version; return { title: t('Resolved'), - message: tct('by [author] in releases greater than [version] [semver]', { + message: tct( + 'by [author] in releases greater than [version] [semver][viaIntegration]', + { + author, + version: , + semver: isSemverRelease(currentVersion) + ? t('(semver)') + : t('(non-semver)'), + viaIntegration, + } + ), + }; + } + const version = activity.data.version; + if (version) { + return { + title: t('Resolved'), + message: tct('by [author] in [version] [semver][viaIntegration]', { author, - version: , - semver: isSemverRelease(currentVersion) ? t('(semver)') : t('(non-semver)'), + version: , + semver: isSemverRelease(version) ? t('(semver)') : t('(non-semver)'), + viaIntegration, }), }; } - const version = activity.data.version; return { title: t('Resolved'), - message: version - ? tct('by [author] in [version] [semver]', { - author, - version: , - semver: isSemverRelease(version) ? t('(semver)') : t('(non-semver)'), - }) - : tct('by [author] in the upcoming release', { - author, - }), + message: tct('by [author] in the upcoming release[viaIntegration]', { + author, + viaIntegration, + }), }; } case GroupActivityType.SET_RESOLVED_IN_COMMIT: { From 3631d10d0e79e0c6f036df09d7a4284b9a47881e Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Wed, 29 Oct 2025 16:02:07 -0700 Subject: [PATCH 2/2] more verbose translations --- .../streamline/sidebar/groupActivityItem.tsx | 65 ++++++++++++------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/static/app/views/issueDetails/streamline/sidebar/groupActivityItem.tsx b/static/app/views/issueDetails/streamline/sidebar/groupActivityItem.tsx index c77abd083d01d9..4cb9931c444624 100644 --- a/static/app/views/issueDetails/streamline/sidebar/groupActivityItem.tsx +++ b/static/app/views/issueDetails/streamline/sidebar/groupActivityItem.tsx @@ -293,45 +293,62 @@ export default function getGroupActivityItem( {activity.data.provider} ) : null; - const viaIntegration = hasIntegration - ? tct(' via [integration]', {integration: integrationLink}) - : ''; if ('current_release_version' in activity.data) { const currentVersion = activity.data.current_release_version; return { title: t('Resolved'), - message: tct( - 'by [author] in releases greater than [version] [semver][viaIntegration]', - { - author, - version: , - semver: isSemverRelease(currentVersion) - ? t('(semver)') - : t('(non-semver)'), - viaIntegration, - } - ), + message: hasIntegration + ? tct( + 'by [author] in releases greater than [version] [semver] via [integration]', + { + author, + version: ( + + ), + semver: isSemverRelease(currentVersion) + ? t('(semver)') + : t('(non-semver)'), + integration: integrationLink, + } + ) + : tct('by [author] in releases greater than [version] [semver]', { + author, + version: , + semver: isSemverRelease(currentVersion) + ? t('(semver)') + : t('(non-semver)'), + }), }; } const version = activity.data.version; if (version) { return { title: t('Resolved'), - message: tct('by [author] in [version] [semver][viaIntegration]', { - author, - version: , - semver: isSemverRelease(version) ? t('(semver)') : t('(non-semver)'), - viaIntegration, - }), + message: hasIntegration + ? tct('by [author] in [version] [semver] via [integration]', { + author, + version: , + semver: isSemverRelease(version) ? t('(semver)') : t('(non-semver)'), + integration: integrationLink, + }) + : tct('by [author] in [version] [semver]', { + author, + version: , + semver: isSemverRelease(version) ? t('(semver)') : t('(non-semver)'), + }), }; } return { title: t('Resolved'), - message: tct('by [author] in the upcoming release[viaIntegration]', { - author, - viaIntegration, - }), + message: hasIntegration + ? tct('by [author] in the upcoming release via [integration]', { + author, + integration: integrationLink, + }) + : tct('by [author] in the upcoming release', { + author, + }), }; } case GroupActivityType.SET_RESOLVED_IN_COMMIT: {