Browse Source

feat(scim): Disable form for updating teams on the frontend (#78732)

Disables the team settings form when it has the `idp:provisioned` flag
set to true.

<img width="766" alt="image"
src="https://github.com/user-attachments/assets/05103d75-8869-4806-9edf-81cd4a1c6c42">


Requires https://github.com/getsentry/sentry/pull/78722
Leander Rodrigues 5 months ago
parent
commit
f2738747bc

+ 17 - 0
static/app/views/settings/organizationTeams/teamSettings/index.spec.tsx

@@ -103,4 +103,21 @@ describe('TeamSettings', function () {
 
 
     expect(TeamStore.getAll()).toEqual([]);
     expect(TeamStore.getAll()).toEqual([]);
   });
   });
+
+  it('cannot modify idp:provisioned teams regardless of role', function () {
+    const team = TeamFixture({hasAccess: true, flags: {'idp:provisioned': true}});
+    const organization = OrganizationFixture({access: []});
+
+    render(<TeamSettings {...routerProps} team={team} params={{teamId: team.slug}} />, {
+      organization,
+    });
+
+    expect(
+      screen.getByText(
+        "This team is managed through your organization's identity provider. These settings cannot be modified."
+      )
+    ).toBeInTheDocument();
+    expect(screen.getByRole('textbox', {name: 'Team Slug'})).toBeDisabled();
+    expect(screen.getByTestId('button-remove-team')).toBeDisabled();
+  });
 });
 });

+ 12 - 1
static/app/views/settings/organizationTeams/teamSettings/index.tsx

@@ -4,6 +4,7 @@ import cloneDeep from 'lodash/cloneDeep';
 import {addErrorMessage, addSuccessMessage} from 'sentry/actionCreators/indicator';
 import {addErrorMessage, addSuccessMessage} from 'sentry/actionCreators/indicator';
 import {removeTeam, updateTeamSuccess} from 'sentry/actionCreators/teams';
 import {removeTeam, updateTeamSuccess} from 'sentry/actionCreators/teams';
 import {hasEveryAccess} from 'sentry/components/acl/access';
 import {hasEveryAccess} from 'sentry/components/acl/access';
+import Alert from 'sentry/components/alert';
 import {Button} from 'sentry/components/button';
 import {Button} from 'sentry/components/button';
 import Confirm from 'sentry/components/confirm';
 import Confirm from 'sentry/components/confirm';
 import FieldGroup from 'sentry/components/forms/fieldGroup';
 import FieldGroup from 'sentry/components/forms/fieldGroup';
@@ -56,6 +57,7 @@ function TeamSettings({team, params}: TeamSettingsProps) {
 
 
   const hasTeamWrite = hasEveryAccess(['team:write'], {organization, team});
   const hasTeamWrite = hasEveryAccess(['team:write'], {organization, team});
   const hasTeamAdmin = hasEveryAccess(['team:admin'], {organization, team});
   const hasTeamAdmin = hasEveryAccess(['team:admin'], {organization, team});
+  const isIdpProvisioned = team.flags['idp:provisioned'];
 
 
   const forms = useMemo(() => {
   const forms = useMemo(() => {
     const formsConfig = cloneDeep(teamSettingsFields);
     const formsConfig = cloneDeep(teamSettingsFields);
@@ -81,6 +83,13 @@ function TeamSettings({team, params}: TeamSettingsProps) {
       <SentryDocumentTitle title={t('Team Settings')} orgSlug={organization.slug} />
       <SentryDocumentTitle title={t('Team Settings')} orgSlug={organization.slug} />
 
 
       <PermissionAlert access={['team:write']} team={team} />
       <PermissionAlert access={['team:write']} team={team} />
+      {isIdpProvisioned && (
+        <Alert type="warning" showIcon>
+          {t(
+            "This team is managed through your organization's identity provider. These settings cannot be modified."
+          )}
+        </Alert>
+      )}
 
 
       <Form
       <Form
         apiMethod="PUT"
         apiMethod="PUT"
@@ -98,6 +107,7 @@ function TeamSettings({team, params}: TeamSettingsProps) {
           additionalFieldProps={{
           additionalFieldProps={{
             hasTeamWrite,
             hasTeamWrite,
           }}
           }}
+          disabled={isIdpProvisioned}
           forms={forms}
           forms={forms}
         />
         />
       </Form>
       </Form>
@@ -105,6 +115,7 @@ function TeamSettings({team, params}: TeamSettingsProps) {
       <Panel>
       <Panel>
         <PanelHeader>{t('Team Administration')}</PanelHeader>
         <PanelHeader>{t('Team Administration')}</PanelHeader>
         <FieldGroup
         <FieldGroup
+          disabled={isIdpProvisioned}
           label={t('Remove Team')}
           label={t('Remove Team')}
           help={t(
           help={t(
             "This may affect team members' access to projects and associated alert delivery."
             "This may affect team members' access to projects and associated alert delivery."
@@ -112,7 +123,7 @@ function TeamSettings({team, params}: TeamSettingsProps) {
         >
         >
           <div>
           <div>
             <Confirm
             <Confirm
-              disabled={!hasTeamAdmin}
+              disabled={isIdpProvisioned || !hasTeamAdmin}
               onConfirm={handleRemoveTeam}
               onConfirm={handleRemoveTeam}
               priority="danger"
               priority="danger"
               message={tct('Are you sure you want to remove the team [team]?', {
               message={tct('Are you sure you want to remove the team [team]?', {