From befdfaf47eb00c7bf0842950016faae8d309c9aa Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Wed, 9 Sep 2026 20:16:00 -0700 Subject: [PATCH 1/2] fix(search): clarify source settings and permission updates --- .../self-hosting/integrations-oauth.mdx | 2 +- apps/docs/content/docs/search/confluence.mdx | 2 +- apps/docs/content/docs/search/github.mdx | 2 +- apps/docs/content/docs/search/gmail.mdx | 2 +- .../content/docs/search/google-calendar.mdx | 2 +- .../docs/content/docs/search/google-drive.mdx | 2 +- apps/docs/content/docs/search/index.mdx | 8 +- apps/docs/content/docs/search/jira.mdx | 2 +- .../static/search/integration-settings.jpg | Bin 56193 -> 32832 bytes .../api/auth/oauth/credentials/route.test.ts | 95 ++++++++++++++++++ .../app/api/auth/oauth/credentials/route.ts | 12 ++- ...rganization-integrations-settings.test.tsx | 60 ++++++++--- .../organization-integrations-settings.tsx | 40 ++++++-- .../[connectorType]/provider-detail.test.tsx | 5 +- .../[connectorType]/provider-detail.tsx | 7 +- apps/sim/lib/credential-groups/service.ts | 2 +- 16 files changed, 195 insertions(+), 48 deletions(-) diff --git a/apps/docs/content/docs/platform/self-hosting/integrations-oauth.mdx b/apps/docs/content/docs/platform/self-hosting/integrations-oauth.mdx index 3ca4d246c6f..a1247719b3a 100644 --- a/apps/docs/content/docs/platform/self-hosting/integrations-oauth.mdx +++ b/apps/docs/content/docs/platform/self-hosting/integrations-oauth.mdx @@ -203,7 +203,7 @@ Keep **Expire user authorization tokens** enabled so Sim receives the refresh to Complete the installation through [the GitHub Search source setup](/search/github#add-a-repository). -If you replace a deployment's GitHub App, an organization admin must first open **Settings → Sources → Update configurations**. When Search is disabled, this action is under **Settings → Connected accounts → Providers**. This applies the deployment's current App configuration to the existing providers while preserving their saved identities. Accounts whose App configuration changed must reconnect. Then reconnect personal GitHub accounts and connect an installation of the new App. Reconnecting alone cannot update the organization's saved App configuration. +If you replace a deployment's GitHub App, an organization admin selects **Settings → Sources → More → Refresh connection settings**. When Search is disabled, use **Connected accounts → Providers → Update configurations** in organization settings. This applies the deployment's current App configuration to all existing providers while preserving their option IDs. Accounts whose App configuration changed must reconnect. Then reconnect personal GitHub accounts and connect an installation of the new App. Reconnecting alone cannot update the organization's saved App configuration. diff --git a/apps/docs/content/docs/search/confluence.mdx b/apps/docs/content/docs/search/confluence.mdx index e2480e8a74d..d171730c160 100644 --- a/apps/docs/content/docs/search/confluence.mdx +++ b/apps/docs/content/docs/search/confluence.mdx @@ -196,6 +196,6 @@ Configure one shared Confluence OAuth integration for your deployment. This powe 2. Under **Authorization → OAuth 2.0 (3LO)**, add `https:///api/auth/oauth2/callback/confluence` to **Callback URLs**, keep existing callbacks used by the deployment, and save. 3. Under **Permissions**, add the Confluence API and configure the full `confluence` scope list for your release in [Sim's OAuth configuration](https://github.com/simstudioai/sim/blob/staging/apps/sim/lib/oauth/oauth.ts), including `read:group:confluence`. Also add **User Identity API** with `read:me`. Sim requests `offline_access` for refresh tokens. The service-account read scopes above do not replace the broader shared OAuth scope set. 4. Enable sharing under **Distribution**. Set `CONFLUENCE_CLIENT_ID` and `CONFLUENCE_CLIENT_SECRET` from the app's **Settings**, verify `NEXT_PUBLIC_APP_URL`, and restart Sim. -5. Start authorization from **Integrations** and select the configured site. After changing the deployment's OAuth client or requested scopes, an organization admin selects **Settings → Sources → Update configurations**, then affected teammates reconnect. +5. Start authorization from **Integrations** and select the configured site. After changing the deployment's OAuth client or requested scopes, an organization admin selects **Settings → Sources → More → Refresh connection settings**, then affected teammates reconnect. A callback mismatch needs a corrected callback URL; a connection that works only for the app owner needs sharing enabled. See Atlassian's [OAuth configuration guide](https://developer.atlassian.com/cloud/confluence/oauth-2-3lo-apps/) and Sim's [deployment reference](/platform/self-hosting/integrations-oauth). diff --git a/apps/docs/content/docs/search/github.mdx b/apps/docs/content/docs/search/github.mdx index cf3f2858cc9..53a4d329ad9 100644 --- a/apps/docs/content/docs/search/github.mdx +++ b/apps/docs/content/docs/search/github.mdx @@ -96,7 +96,7 @@ This is an installation plus personal authorization flow. GitHub Search does not | Identity verification fails | Verify the email used by your Sim account in GitHub's email settings, then reconnect. A public profile email alone is insufficient. | | Authorization fails after installation | Return to Sim and start **Connect** there. Do not enable authorization during installation. | | Account authorization did not complete | Start the connection again from Sim. If it repeats, contact your organization admin or Sim support. For self-hosted Sim, check the [App callback and credentials](/platform/self-hosting/integrations-oauth#github-search). | -| Update GitHub using Update configurations in organization settings before connecting this source | An organization admin must select **Settings → Sources → Update configurations**, then reconnect GitHub. | +| GitHub asks for a provider configuration update | An organization admin selects **Settings → Sources → More → Refresh connection settings**, then affected users reconnect GitHub. | | Indexed files no longer appear | Confirm your own repository access, App repository selection, and connection status. Installation-indexed content is also withheld when GitHub cannot verify current access; retry once GitHub is available. | | Sync is incomplete | Review the source status. Very large Git trees, file size limits, and unreadable files can limit indexing. | | Empty repository returns an error | Add an initial commit, then sync again. GitHub does not return a file tree for an uninitialized repository. | diff --git a/apps/docs/content/docs/search/gmail.mdx b/apps/docs/content/docs/search/gmail.mdx index 94fd942d937..97ee3fb1b5c 100644 --- a/apps/docs/content/docs/search/gmail.mdx +++ b/apps/docs/content/docs/search/gmail.mdx @@ -97,7 +97,7 @@ Users do not need to create Google Cloud credentials. The deployment operator co 1. In [Google Cloud Console](https://console.cloud.google.com/), select your project. Open **APIs & Services → Library**, find **Gmail API**, and enable it. 2. Open **Google Auth platform → Branding**. Select **Get started** if needed, then enter the app name, support email, and contact email. Under **Audience**, use **Internal** only for an app limited to your Google Workspace organization; otherwise use **External** and add test users while testing. Review the app's permissions under **Data Access → Add or remove scopes**, using the current Sim scopes below. Follow Google's [consent and verification guidance](https://developers.google.com/workspace/guides/configure-oauth-consent) for your audience. 3. Open **Google Auth platform → Clients → Create client**. Choose **Web application**, give the client a name, and add the URI below under **Authorized redirect URIs**. If this instance already has a Google client, add this URI to that client instead. See [Google's credential setup](https://developers.google.com/workspace/guides/create-credentials#web-application). -4. Save the client ID and secret as `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET`. Set `NEXT_PUBLIC_APP_URL` to the same Sim origin used in the callback, then restart Sim. See [Integrations & OAuth](/platform/self-hosting/integrations-oauth). If you change an existing deployment's OAuth client or scopes, an organization admin selects **Settings → Sources → Update configurations**, then affected teammates reconnect. +4. Save the client ID and secret as `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET`. Set `NEXT_PUBLIC_APP_URL` to the same Sim origin used in the callback, then restart Sim. See [Integrations & OAuth](/platform/self-hosting/integrations-oauth). If you change an existing deployment's OAuth client or scopes, an organization admin selects **Settings → Sources → More → Refresh connection settings**, then affected teammates reconnect. ```text https:///api/auth/oauth2/callback/google-email diff --git a/apps/docs/content/docs/search/google-calendar.mdx b/apps/docs/content/docs/search/google-calendar.mdx index 60a676b3f45..020039b20ab 100644 --- a/apps/docs/content/docs/search/google-calendar.mdx +++ b/apps/docs/content/docs/search/google-calendar.mdx @@ -94,7 +94,7 @@ The deployment operator configures Google OAuth once; teammates then use the nor 1. In [Google Cloud Console](https://console.cloud.google.com/), select your project. Open **APIs & Services → Library**, find **Google Calendar API**, and enable it. 2. Open **Google Auth platform → Branding** and configure the app name and contact details. Under **Audience**, choose **Internal** for your Google Workspace organization only, or **External** for other users. Add test users while an external app is testing. Review **Data Access → Add or remove scopes** using the current Sim scopes below. See Google's [consent and verification guidance](https://developers.google.com/workspace/guides/configure-oauth-consent). 3. Open **Google Auth platform → Clients → Create client**, choose **Web application**, and add the URI below under **Authorized redirect URIs**. Add it to the existing Google client if the instance already uses one. See [Google's credential setup](https://developers.google.com/workspace/guides/create-credentials#web-application). -4. Save the client ID and secret as `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET`. Set `NEXT_PUBLIC_APP_URL` to the same Sim origin used in the callback, then restart Sim. See [Integrations & OAuth](/platform/self-hosting/integrations-oauth). If you change an existing deployment's OAuth client or scopes, an organization admin selects **Settings → Sources → Update configurations**, then affected teammates reconnect. +4. Save the client ID and secret as `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET`. Set `NEXT_PUBLIC_APP_URL` to the same Sim origin used in the callback, then restart Sim. See [Integrations & OAuth](/platform/self-hosting/integrations-oauth). If you change an existing deployment's OAuth client or scopes, an organization admin selects **Settings → Sources → More → Refresh connection settings**, then affected teammates reconnect. ```text https:///api/auth/oauth2/callback/google-calendar diff --git a/apps/docs/content/docs/search/google-drive.mdx b/apps/docs/content/docs/search/google-drive.mdx index d502865f1d4..230449ffbb2 100644 --- a/apps/docs/content/docs/search/google-drive.mdx +++ b/apps/docs/content/docs/search/google-drive.mdx @@ -151,7 +151,7 @@ https:///api/auth/oauth2/callback/google-drive This Google Cloud example uses one client for all three services. Replace `https://sim.example.com` with your Sim origin and add only the callbacks for services you enable. -Save the client ID and secret as `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET`. Set `NEXT_PUBLIC_APP_URL` to the same Sim origin used in the callback, then restart Sim. See [Integrations & OAuth](/platform/self-hosting/integrations-oauth). If you change an existing deployment's OAuth client or scopes, an organization admin selects **Settings → Sources → Update configurations**, then affected teammates reconnect. +Save the client ID and secret as `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET`. Set `NEXT_PUBLIC_APP_URL` to the same Sim origin used in the callback, then restart Sim. See [Integrations & OAuth](/platform/self-hosting/integrations-oauth). If you change an existing deployment's OAuth client or scopes, an organization admin selects **Settings → Sources → More → Refresh connection settings**, then affected teammates reconnect. The current Sim Drive OAuth connection uses these scopes: diff --git a/apps/docs/content/docs/search/index.mdx b/apps/docs/content/docs/search/index.mdx index 6119f99440b..104f2f83852 100644 --- a/apps/docs/content/docs/search/index.mdx +++ b/apps/docs/content/docs/search/index.mdx @@ -18,7 +18,7 @@ Search brings your connected sources into one place. An organization admin allow As an organization admin, open **Settings → Sources** and turn on the integration. It stays in the list; no setup page opens automatically. -The switch permits the integration in your organization. It does not connect an account, grant document access, or start indexing. Teammates connect from **Integrations** in the main sidebar; only admins manage these switches. +The switch saves immediately and permits the integration in your organization. It does not connect an account, grant document access, or start indexing. Teammates connect from **Integrations** in the main sidebar; only admins manage these switches. @@ -41,9 +41,9 @@ Open **Integrations** in the main sidebar and select **Connect** if prompted—e -Organization Sources settings with provider switches, Set up or Manage actions, and Update configurations +Organization Sources settings with provider switches and Set up or Manage actions -Source availability depends on the deployment and organization policy. An unavailable source needs operator configuration before setup can continue. If an existing provider asks for a configuration update, an admin selects **Update configurations** on this page, then affected teammates reconnect. +Source availability depends on the deployment and organization policy. An unavailable source needs operator configuration before setup can continue. If an existing provider asks for a configuration update after a deployment change, an admin selects **More → Refresh connection settings** on this page, then affected teammates reconnect. ## Choose the right connection method @@ -100,7 +100,7 @@ For Gmail, one configuration is usually enough. **Add sync configuration** creat | Source tab | What you can do | | --- | --- | | **Documents** | Find indexed documents, inspect processing status, retry failed indexing, or exclude and restore documents. | -| **Settings** | Edit the source's scope, filters, and supported indexing credentials. Save your changes before leaving. | +| **Settings** | Edit the source's scope, filters, and supported indexing credentials. Select **Save** to apply changes or **Discard** to undo them. | | **Sync history** | Review run dates, document changes, and any sync or account errors. | **Sync using** shows the method selected when the source was created. Create a new source to change that method. To replace a supported indexing credential, select its replacement and use **Change indexing account**. diff --git a/apps/docs/content/docs/search/jira.mdx b/apps/docs/content/docs/search/jira.mdx index ea3e1e960c1..7306de72675 100644 --- a/apps/docs/content/docs/search/jira.mdx +++ b/apps/docs/content/docs/search/jira.mdx @@ -138,6 +138,6 @@ The deployment operator configures one shared Jira OAuth integration. Teammates 3. Under **Permissions**, add **Jira API**, then **Configure** its classic and granular scopes for Jira, Jira Service Management, and Assets. Separately add **User Identity API** with `read:me`. Sim requests `offline_access` in the authorization URL for refresh tokens. Configure the full `jira` scope list for your release in [Sim's OAuth configuration](https://github.com/simstudioai/sim/blob/staging/apps/sim/lib/oauth/oauth.ts); the Search read scopes above are only a subset of this shared integration's permissions. 4. Under **Distribution**, enable sharing so teammates can authorize the app. Copy the client ID and secret from **Settings** into `JIRA_CLIENT_ID` and `JIRA_CLIENT_SECRET`, set the correct `NEXT_PUBLIC_APP_URL`, and restart Sim. -5. Start a connection from **Integrations**. Confirm that Atlassian lists the intended site, then return to Sim. After changing the deployment's OAuth client or requested scopes, an organization admin selects **Settings → Sources → Update configurations**, then affected teammates reconnect. +5. Start a connection from **Integrations**. Confirm that Atlassian lists the intended site, then return to Sim. After changing the deployment's OAuth client or requested scopes, an organization admin selects **Settings → Sources → More → Refresh connection settings**, then affected teammates reconnect. For a local instance using `NEXT_PUBLIC_APP_URL=http://localhost:3000`, register `http://localhost:3000/api/auth/oauth2/callback/jira`. Use a separate development OAuth app when production callbacks must remain unchanged. After updating local client credentials or the app URL, restart Sim and begin a new connection from **Integrations**. If only the app owner can connect, check **Distribution**. See Atlassian's [OAuth configuration and sharing guide](https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/) and Sim's [deployment reference](/platform/self-hosting/integrations-oauth). diff --git a/apps/docs/public/static/search/integration-settings.jpg b/apps/docs/public/static/search/integration-settings.jpg index 05d4e20bebe552f0e824e400c78352cd93174599..f4e517c06560e8d6eb21e668805d82c344d2c20b 100644 GIT binary patch literal 32832 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 Xo1Z|d#7;@xRN4oeG1+}w9L)X?Ik_n9 literal 56193 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 diff --git a/apps/sim/app/api/auth/oauth/credentials/route.test.ts b/apps/sim/app/api/auth/oauth/credentials/route.test.ts index 94f2cf1a7ab..1a0e2a60de4 100644 --- a/apps/sim/app/api/auth/oauth/credentials/route.test.ts +++ b/apps/sim/app/api/auth/oauth/credentials/route.test.ts @@ -38,6 +38,7 @@ vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) vi.mock('@/lib/permission-groups/config-scope.server', () => permissionGroupScopeMock) +import { getCanonicalScopesForProvider, getMissingRequiredScopes } from '@/lib/oauth/utils' import { DEFAULT_PERMISSION_GROUP_CONFIG } from '@/lib/permission-groups/fields' import { GET } from '@/app/api/auth/oauth/credentials/route' @@ -146,6 +147,100 @@ describe('OAuth Credentials API Route', () => { await expect(response.json()).resolves.toEqual({ credentials: [] }) }) + describe.each(['list', 'detail'] as const)('OAuth grant scopes in %s responses', (mode) => { + const workspaceId = '3f1c8a54-1c2e-4a1b-9d6e-2b7c5a9f0e11' + + beforeEach(() => { + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockReset().mockResolvedValue({ + success: true, + userId: 'user-123', + authType: 'session', + }) + permissionsMockFns.mockCheckWorkspaceAccess.mockResolvedValue({ + exists: true, + hasAccess: true, + canWrite: true, + canAdmin: true, + }) + permissionGroupScopeMockFns.mockResolvePermissionGroupConfig.mockResolvedValue( + DEFAULT_PERMISSION_GROUP_CONFIG + ) + }) + + async function requestCredential(providerId: string, scope: string | null) { + const row = { + id: 'credential-1', + workspaceId, + type: 'oauth', + displayName: 'Connected account', + providerId, + accountId: 'account-1', + scope, + updatedAt: new Date('2026-01-01T00:00:00Z'), + accountProviderId: providerId, + accountScope: scope, + accountUpdatedAt: new Date('2026-01-01T00:00:00Z'), + } + if (mode === 'detail') { + dbChainMockFns.limit.mockResolvedValueOnce([row]) + } else { + dbChainMockFns.where.mockResolvedValueOnce([row]).mockResolvedValueOnce([]) + } + const query = + mode === 'detail' + ? '?credentialId=credential-1' + : `?provider=${providerId}&workspaceId=${workspaceId}` + const response = await GET(createMockRequestWithQuery('GET', query)) + expect(response.status).toBe(200) + const data = await response.json() + expect(data.credentials).toHaveLength(1) + return data.credentials[0] + } + + it.each([null, '', ' \t\n '])( + 'does not synthesize a Confluence grant from missing scope metadata %j', + async (scope) => { + const credential = await requestCredential('confluence', scope) + + expect(credential.scopes).toEqual([]) + expect( + getMissingRequiredScopes(credential, getCanonicalScopesForProvider('confluence')) + ).toContain('read:group:confluence') + } + ) + + it('preserves the actual older Confluence grant and identifies missing group access', async () => { + const requiredScopes = getCanonicalScopesForProvider('confluence') + const previousGrant = requiredScopes.filter((scope) => scope !== 'read:group:confluence') + const credential = await requestCredential('confluence', previousGrant.join(',')) + + expect(credential.scopes).toEqual(previousGrant) + expect(getMissingRequiredScopes(credential, requiredScopes)).toEqual([ + 'read:group:confluence', + ]) + }) + + it('preserves a complete Confluence grant without requesting another update', async () => { + const grantedScopes = getCanonicalScopesForProvider('confluence') + const credential = await requestCredential('confluence', grantedScopes.join(' ')) + + expect(credential.scopes).toEqual(grantedScopes) + expect(getMissingRequiredScopes(credential, grantedScopes)).toEqual([]) + }) + + it.each([null, '', ' \t\n '])( + 'preserves the Box omitted-scope fallback for %j', + async (scope) => { + const credential = await requestCredential('box', scope) + const requiredScopes = getCanonicalScopesForProvider('box') + + expect(requiredScopes.length).toBeGreaterThan(0) + expect(credential.scopes).toEqual(requiredScopes) + expect(getMissingRequiredScopes(credential, requiredScopes)).toEqual([]) + } + ) + }) + /** The session/executor split documented on {@link integrationsWithheldFromSession} in the route. */ describe('integrations.manage', () => { const INTEGRATIONS_WITHHELD = { diff --git a/apps/sim/app/api/auth/oauth/credentials/route.ts b/apps/sim/app/api/auth/oauth/credentials/route.ts index 0625008f233..318e7c7ac98 100644 --- a/apps/sim/app/api/auth/oauth/credentials/route.ts +++ b/apps/sim/app/api/auth/oauth/credentials/route.ts @@ -35,13 +35,15 @@ function toCredentialResponse( credentialType: 'oauth' | 'service_account' = 'oauth' ) { const storedScope = scope?.trim() - // Some providers (e.g. Box) don't return scopes in their token response, - // so the DB column stays empty. Fall back to the configured scopes for - // the provider so the credential-selector doesn't show a false - // "Additional permissions required" banner. + /** + * Confluence reports granted scopes, so absent metadata must prompt reauthorization. + * Preserve the existing fallback for providers that omit scopes, such as Box. + */ const scopes = storedScope ? storedScope.split(/[\s,]+/).filter(Boolean) - : getCanonicalScopesForProvider(providerId) + : providerId === 'confluence' + ? [] + : getCanonicalScopesForProvider(providerId) const [_, featureType = 'default'] = providerId.split('-') return { diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx index 3c91acc8103..952880c34ee 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.test.tsx @@ -13,6 +13,8 @@ const mocks = vi.hoisted(() => ({ refetch: vi.fn(), update: vi.fn(), updatePending: false, + updateError: null as Error | null, + resetUpdate: vi.fn(), })) vi.mock('@/app/o/[organizationId]/providers/organization-provider', () => ({ useOrganizationContext: mocks.context, @@ -23,7 +25,12 @@ vi.mock( ) vi.mock('@/hooks/queries/organization-accounts', () => ({ useOrganizationAccounts: mocks.accounts, - useUpdateOrganizationAccounts: () => ({ mutate: mocks.update, isPending: mocks.updatePending }), + useUpdateOrganizationAccounts: () => ({ + mutate: mocks.update, + isPending: mocks.updatePending, + error: mocks.updateError, + reset: mocks.resetUpdate, + }), useOrganizationAccountPeople: mocks.people, useInviteOrganizationAccountPeople: () => ({ mutateAsync: mocks.invite, reset: vi.fn() }), useResendOrganizationAccountInvitation: () => ({}), @@ -42,6 +49,7 @@ describe('organization integration invitations', () => { vi.spyOn(toast, 'success').mockReturnValue('toast-id') vi.spyOn(toast, 'error').mockReturnValue('toast-id') mocks.updatePending = false + mocks.updateError = null vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true) mocks.context.mockReturnValue({ organization: { id: 'org-a' }, viewer: { isAdmin: true } }) mocks.accounts.mockReturnValue({ @@ -85,7 +93,7 @@ describe('organization integration invitations', () => { function findButton(label: string) { const button = Array.from(document.querySelectorAll('button')).find( - (element) => element.textContent === label + (element) => element.textContent === label || element.getAttribute('aria-label') === label ) if (!button) throw new Error(`Missing ${label} button`) return button @@ -95,6 +103,19 @@ describe('organization integration invitations', () => { await act(async () => findButton(label).click()) } + async function openRefresh() { + expect(container.textContent).not.toContain('Update configurations') + await act(async () => + findButton('More source actions').dispatchEvent( + new MouseEvent('pointerdown', { bubbles: true, button: 0 }) + ) + ) + const item = document.querySelector('[role="menuitem"]') + expect(item?.textContent).toBe('Refresh connection settings') + await act(async () => item?.click()) + expect(document.body.textContent).toContain('Affected accounts will need to reconnect.') + } + it('keeps provider setup as the default and sends manual invitations from People to this org', async () => { await render() expect(container.textContent).toContain('Provider setup') @@ -124,7 +145,7 @@ describe('organization integration invitations', () => { expect(document.querySelector('[role="dialog"]')).toBeNull() }) - it('refreshes saved provider identities from Sources and reports the outcome', async () => { + it('refreshes saved provider identities only after choosing the maintenance action and confirming', async () => { mocks.accounts.mockReturnValue({ data: { credentialGroup: { @@ -151,7 +172,8 @@ describe('organization integration invitations', () => { }) mocks.update.mockImplementationOnce((_input, { onSuccess }) => onSuccess()) await render() - await click('Update configurations') + await openRefresh() + await click('Refresh') expect(mocks.update).toHaveBeenCalledWith( { organizationId: 'org-a', @@ -176,24 +198,32 @@ describe('organization integration invitations', () => { }, expect.any(Object) ) - expect(toast.success).toHaveBeenCalledWith('Provider configurations updated') + expect(toast.success).toHaveBeenCalledWith('Connection settings refreshed') - mocks.update.mockImplementationOnce((_input, { onError }) => - onError(new Error('Update denied')) - ) - await click('Update configurations') - expect(toast.error).toHaveBeenCalledWith('Update denied') + expect(document.querySelector('[role="dialog"]')).toBeNull() + }) + it('keeps failed refreshes open for retry and blocks duplicate submissions', async () => { + mocks.accounts.mockReturnValue({ + data: { credentialGroup: { id: 'group-a', options: [{ provider: 'gmail' }] } }, + error: null, + }) + await render() + await openRefresh() + await click('Refresh') + mocks.updateError = new Error('Update denied') + await render() + expect(document.body.textContent).toContain('Update denied') + expect(document.querySelector('[role="dialog"]')).not.toBeNull() mocks.updatePending = true await render() - expect(findButton('Update configurations')).toBeDisabled() - await click('Update configurations') - expect(mocks.update).toHaveBeenCalledTimes(2) + expect(findButton('Refresh')).toBeDisabled() + expect(mocks.update).toHaveBeenCalledOnce() }) - it('does not offer a configuration update without saved providers', async () => { + it('does not offer maintenance without saved providers', async () => { await render() - expect(container.textContent).not.toContain('Update configurations') + expect(container.querySelector('[aria-label="More source actions"]')).toBeNull() }) it('opens People directly from the saved URL', async () => { diff --git a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx index 82055465391..5a88385585a 100644 --- a/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx +++ b/apps/sim/app/o/[organizationId]/settings/components/integrations/organization-integrations-settings.tsx @@ -1,11 +1,13 @@ 'use client' -import { Chip, ChipSwitch, toast } from '@sim/emcn' +import { useState } from 'react' +import { Chip, ChipConfirmModal, ChipModalError, ChipSwitch, toast } from '@sim/emcn' import { useQueryState } from 'nuqs' import { getOrganizationAccountUpdateOptions } from '@/lib/credential-groups/organization-account-options' import { useOrganizationContext } from '@/app/o/[organizationId]/providers/organization-provider' import { OrganizationIntegrationsSetup } from '@/app/o/[organizationId]/settings/components/integrations/organization-integrations-setup' import { organizationIntegrationsTabParam } from '@/app/o/[organizationId]/settings/components/integrations/search-params' +import { RowActionsMenu } from '@/app/workspace/[workspaceId]/settings/components/row-actions-menu' import { SettingsEmptyState, SettingsQueryErrorState, @@ -24,8 +26,9 @@ export function OrganizationIntegrationsSettings() { ) const accounts = useOrganizationAccounts(viewer.isAdmin ? organization.id : undefined) const update = useUpdateOrganizationAccounts() + const [refreshOpen, setRefreshOpen] = useState(false) const group = accounts.data?.credentialGroup - const updateConfigurations = () => { + const refreshConnections = () => { if (!group || update.isPending) return update.mutate( { @@ -34,8 +37,10 @@ export function OrganizationIntegrationsSettings() { update: { options: getOrganizationAccountUpdateOptions(group) }, }, { - onSuccess: () => toast.success('Provider configurations updated'), - onError: (error) => toast.error(error.message), + onSuccess: () => { + setRefreshOpen(false) + toast.success('Connection settings refreshed') + }, } ) } @@ -54,11 +59,32 @@ export function OrganizationIntegrationsSettings() { ]} /> {tab === 'providers' && !accounts.error && group && group.options.length > 0 && ( - - Update configurations - + { + update.reset() + setRefreshOpen(true) + }, + }, + ]} + /> )} + { + if (!update.isPending) setRefreshOpen(open) + }} + title='Refresh connection settings?' + text='Apply the latest sign-in settings to all integrations. Affected accounts will need to reconnect.' + confirm={{ label: 'Refresh', pending: update.isPending, onClick: refreshConnections }} + > + {update.error?.message} + {tab === 'providers' && } {tab === 'people' && ( { ) expect(container.textContent).not.toContain('Add source') expect(container.textContent).not.toContain('Add sync configuration') - expect(container.querySelector('a[href="/o/org-one/integrations"]')).toHaveTextContent( - 'Open Integrations' - ) + expect(container.querySelector('a[href="/o/org-one/integrations"]')).toBeNull() + expect(container.textContent).not.toContain('Open Integrations') expect(mocks.sources).toHaveBeenCalledWith( expect.any(Object), expect.objectContaining({ enabled: false }) diff --git a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.tsx b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.tsx index eda0203eca3..8e8003d9bfa 100644 --- a/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.tsx +++ b/apps/sim/app/o/[organizationId]/settings/integrations/providers/[connectorType]/provider-detail.tsx @@ -1,7 +1,7 @@ 'use client' import { useState } from 'react' -import { ChipConfirmModal, ChipLink, ChipModalError, ChipSwitch } from '@sim/emcn' +import { ChipConfirmModal, ChipModalError, ChipSwitch } from '@sim/emcn' import { ArrowLeft, Plus } from '@sim/emcn/icons' import { format } from 'date-fns' import { useRouter } from 'next/navigation' @@ -367,11 +367,6 @@ export function OrganizationProviderDetail({ connectorType }: OrganizationProvid : 'Add a source to set up account connections.' : 'Activate this integration to set up account connections.'} - {automaticSetup && approved && ( - - Open Integrations - - )} ) ) : ( diff --git a/apps/sim/lib/credential-groups/service.ts b/apps/sim/lib/credential-groups/service.ts index 78715ba0884..c7a668ce6d0 100644 --- a/apps/sim/lib/credential-groups/service.ts +++ b/apps/sim/lib/credential-groups/service.ts @@ -307,7 +307,7 @@ export async function ensureWorkspaceAccountsGroup( throw new OrchestrationError( 'validation', scope.kind === 'organization' - ? `Update ${preparedOption.label} using Update configurations in organization settings before connecting this source` + ? `Update ${preparedOption.label} using More > Refresh connection settings in Sources before connecting this source` : `Update ${preparedOption.label} in Connected accounts before connecting this source` ) } From 08bff4524d431f9ce8f3cd79131f64c54ef27fd4 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Wed, 9 Sep 2026 20:21:47 -0700 Subject: [PATCH 2/2] fix(search): clarify recovery when Search is disabled --- apps/sim/lib/credential-groups/service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sim/lib/credential-groups/service.ts b/apps/sim/lib/credential-groups/service.ts index c7a668ce6d0..79f2e428378 100644 --- a/apps/sim/lib/credential-groups/service.ts +++ b/apps/sim/lib/credential-groups/service.ts @@ -307,7 +307,7 @@ export async function ensureWorkspaceAccountsGroup( throw new OrchestrationError( 'validation', scope.kind === 'organization' - ? `Update ${preparedOption.label} using More > Refresh connection settings in Sources before connecting this source` + ? `Refresh ${preparedOption.label} in Sources > More > Refresh connection settings, or Connected accounts > Providers > Update configurations when Search is disabled` : `Update ${preparedOption.label} in Connected accounts before connecting this source` ) }