Skip to content

Commit 20b3bcf

Browse files
authored
fix(eco): Allow superusers to view integration configuration (#102353)
Currently blocks the link and redirects you away. Let me see it. Adds missing document title on integration details page. <img width="694" height="389" alt="image" src="https://github.com/user-attachments/assets/9930d1c9-a2ea-454c-badf-b45ec89f89cf" />
1 parent aa6037f commit 20b3bcf

File tree

3 files changed

+54
-42
lines changed

3 files changed

+54
-42
lines changed

static/app/views/settings/organizationIntegrations/configureIntegration.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import type {
2525
} from 'sentry/types/integrations';
2626
import type {RouteComponentProps} from 'sentry/types/legacyReactRouter';
2727
import type {Organization} from 'sentry/types/organization';
28+
import {isActiveSuperuser} from 'sentry/utils/isActiveSuperuser';
2829
import {singleLineRenderer} from 'sentry/utils/marked/marked';
2930
import type {ApiQueryKey} from 'sentry/utils/queryClient';
3031
import {setApiQueryData, useApiQuery, useQueryClient} from 'sentry/utils/queryClient';
@@ -127,7 +128,11 @@ function ConfigureIntegration({params, router, routes, location}: Props) {
127128
useEffect(() => {
128129
// This page should not be accessible by members (unless its github or gitlab)
129130
const allowMemberConfiguration = ['github', 'gitlab'].includes(providerKey);
130-
if (!allowMemberConfiguration && !organization.access.includes('org:integrations')) {
131+
if (
132+
!allowMemberConfiguration &&
133+
!organization.access.includes('org:integrations') &&
134+
!isActiveSuperuser()
135+
) {
131136
router.push(
132137
normalizeUrl({
133138
pathname: `/settings/${organization.slug}/integrations/${providerKey}/`,

static/app/views/settings/organizationIntegrations/installedIntegration.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import type {Integration, IntegrationProvider} from 'sentry/types/integrations';
1717
import type {Organization} from 'sentry/types/organization';
1818
import type {IntegrationAnalyticsKey} from 'sentry/utils/analytics/integrations';
1919
import {getIntegrationStatus} from 'sentry/utils/integrationUtil';
20+
import {isActiveSuperuser} from 'sentry/utils/isActiveSuperuser';
2021

2122
import {AddIntegrationButton} from './addIntegrationButton';
2223
import IntegrationItem from './integrationItem';
@@ -114,6 +115,9 @@ export default class InstalledIntegration extends Component<Props> {
114115
return (
115116
<Access access={['org:integrations']}>
116117
{({hasAccess}) => {
118+
const superuser = isActiveSuperuser();
119+
const canConfigure =
120+
(hasAccess || superuser) && this.integrationStatus === 'active';
117121
const disableAction = !(hasAccess && this.integrationStatus === 'active');
118122
return (
119123
<Fragment>
@@ -122,7 +126,7 @@ export default class InstalledIntegration extends Component<Props> {
122126
</IntegrationItemBox>
123127
<div>
124128
<Tooltip
125-
disabled={allowMemberConfiguration || hasAccess}
129+
disabled={allowMemberConfiguration || hasAccess || superuser}
126130
position="left"
127131
title={t(
128132
'You must be an organization owner, manager or admin to configure'
@@ -148,7 +152,7 @@ export default class InstalledIntegration extends Component<Props> {
148152
<StyledLinkButton
149153
borderless
150154
icon={<IconSettings />}
151-
disabled={!allowMemberConfiguration && disableAction}
155+
disabled={!allowMemberConfiguration && !canConfigure}
152156
to={`/settings/${organization.slug}/integrations/${provider.key}/${integration.id}/`}
153157
data-test-id="integration-configure-button"
154158
>

static/app/views/settings/organizationIntegrations/integrationDetailedView.tsx

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import LoadingError from 'sentry/components/loadingError';
1212
import LoadingIndicator from 'sentry/components/loadingIndicator';
1313
import Panel from 'sentry/components/panels/panel';
1414
import PanelItem from 'sentry/components/panels/panelItem';
15+
import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
1516
import {t} from 'sentry/locale';
1617
import {PluginIcon} from 'sentry/plugins/components/pluginIcon';
1718
import {space} from 'sentry/styles/space';
@@ -556,47 +557,49 @@ export default function IntegrationDetailedView() {
556557
}
557558

558559
return (
559-
<IntegrationLayout.Body
560-
integrationName={integrationName}
561-
alert={<FirstPartyIntegrationAlert integrations={configurations} hideCTA />}
562-
topSection={
563-
<IntegrationLayout.TopSection
564-
featureData={featureData}
565-
integrationName={integrationName}
566-
installationStatus={installationStatus}
567-
integrationIcon={<PluginIcon pluginId={integrationSlug} size={50} />}
568-
addInstallButton={
569-
<IntegrationLayout.AddInstallButton
570-
featureData={featureData}
571-
hideButtonIfDisabled={false}
572-
requiresAccess
573-
renderTopButton={renderTopButton}
574-
/>
575-
}
576-
additionalCTA={
577-
<FirstPartyIntegrationAdditionalCTA integrations={configurations} />
578-
}
579-
/>
580-
}
581-
tabs={renderTabs()}
582-
content={
583-
activeTab === 'overview' ? (
584-
<IntegrationLayout.InformationCard
585-
integrationSlug={integrationSlug}
586-
description={description}
587-
alerts={alerts}
560+
<SentryDocumentTitle title={integrationName}>
561+
<IntegrationLayout.Body
562+
integrationName={integrationName}
563+
alert={<FirstPartyIntegrationAlert integrations={configurations} hideCTA />}
564+
topSection={
565+
<IntegrationLayout.TopSection
588566
featureData={featureData}
589-
author={author}
590-
resourceLinks={resourceLinks}
591-
permissions={null}
567+
integrationName={integrationName}
568+
installationStatus={installationStatus}
569+
integrationIcon={<PluginIcon pluginId={integrationSlug} size={50} />}
570+
addInstallButton={
571+
<IntegrationLayout.AddInstallButton
572+
featureData={featureData}
573+
hideButtonIfDisabled={false}
574+
requiresAccess
575+
renderTopButton={renderTopButton}
576+
/>
577+
}
578+
additionalCTA={
579+
<FirstPartyIntegrationAdditionalCTA integrations={configurations} />
580+
}
592581
/>
593-
) : activeTab === 'configurations' ? (
594-
renderConfigurations()
595-
) : (
596-
renderFeatures()
597-
)
598-
}
599-
/>
582+
}
583+
tabs={renderTabs()}
584+
content={
585+
activeTab === 'overview' ? (
586+
<IntegrationLayout.InformationCard
587+
integrationSlug={integrationSlug}
588+
description={description}
589+
alerts={alerts}
590+
featureData={featureData}
591+
author={author}
592+
resourceLinks={resourceLinks}
593+
permissions={null}
594+
/>
595+
) : activeTab === 'configurations' ? (
596+
renderConfigurations()
597+
) : (
598+
renderFeatures()
599+
)
600+
}
601+
/>
602+
</SentryDocumentTitle>
600603
);
601604
}
602605

0 commit comments

Comments
 (0)