Provider account connections
}, })) -vi.mock('@/app/workspace/[workspaceId]/search/components/search-source-setup', () => ({ +vi.mock('@/app/o/[organizationId]/settings/components/integrations/search-source-setup', () => ({ SearchSourceSetup: (props: unknown) => { mocks.setup(props) return null 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 ecf0c0f62b5..5e98e688040 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 @@ -11,18 +11,15 @@ import { SettingsPanel } from '@/components/settings/settings-panel' import { organizationRoutes } from '@/lib/navigation/paths' import { getSearchConnectionLabels } from '@/lib/sim-search/connection-labels' import { getConnectorAccessAvailability } from '@/lib/sim-search/connectors' +import { searchSetupAccessParam, searchSetupParam } from '@/lib/sim-search/search-params' import { SEARCH_DEBOUNCE_MS } from '@/lib/url-state' import { useOrganizationContext } from '@/app/o/[organizationId]/providers/organization-provider' import { organizationSearchStatusLabel } from '@/app/o/[organizationId]/settings/components/integrations/organization-search-status' import { connectedAccountsParam } from '@/app/o/[organizationId]/settings/components/integrations/search-params' +import { SearchSourcePagination } from '@/app/o/[organizationId]/settings/components/integrations/search-source-pagination' +import { SearchSourceSetup } from '@/app/o/[organizationId]/settings/components/integrations/search-source-setup' import { OrganizationSlackAccountRemoval } from '@/app/o/[organizationId]/settings/components/integrations/slack-account-removal' import { OrganizationSlackAccountSetup } from '@/app/o/[organizationId]/settings/components/integrations/slack-account-setup' -import { SearchSourcePagination } from '@/app/workspace/[workspaceId]/search/components/search-source-pagination' -import { SearchSourceSetup } from '@/app/workspace/[workspaceId]/search/components/search-source-setup' -import { - searchSetupAccessParam, - searchSetupParam, -} from '@/app/workspace/[workspaceId]/search/search-params' import { SettingsEmptyState, SettingsQueryErrorState, diff --git a/apps/sim/app/workspace/[workspaceId]/components/integration-tabs-header/integration-tabs-header.test.tsx b/apps/sim/app/workspace/[workspaceId]/components/integration-tabs-header/integration-tabs-header.test.tsx index 226c60c89b1..15fd822f500 100644 --- a/apps/sim/app/workspace/[workspaceId]/components/integration-tabs-header/integration-tabs-header.test.tsx +++ b/apps/sim/app/workspace/[workspaceId]/components/integration-tabs-header/integration-tabs-header.test.tsx @@ -3,22 +3,13 @@ */ import { act } from 'react' import { createRoot, type Root } from 'react-dom/client' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' - -const { mockMemberAccessAvailable } = vi.hoisted(() => ({ - mockMemberAccessAvailable: vi.fn(() => true), -})) - -vi.mock('@/hooks/use-member-access', () => ({ - useMemberAccessAvailable: () => mockMemberAccessAvailable(), -})) - +import { afterEach, describe, expect, it } from 'vitest' import { IntegrationTabsHeader } from '@/app/workspace/[workspaceId]/components/integration-tabs-header/integration-tabs-header' let root: Root | null = null let container: HTMLDivElement | null = null -function mount(active: 'integrations' | 'skills' | 'search' = 'integrations') { +function mount(active: 'integrations' | 'skills' = 'integrations') { ;(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true container = document.createElement('div') document.body.appendChild(container) @@ -30,10 +21,6 @@ function tabs(): string[] { return Array.from(container?.querySelectorAll('a') ?? []).map((node) => node.textContent ?? '') } -beforeEach(() => { - mockMemberAccessAvailable.mockReturnValue(true) -}) - afterEach(() => { if (root) act(() => root?.unmount()) container?.remove() @@ -45,20 +32,14 @@ describe('IntegrationTabsHeader', () => { it('links every tab to its page in the routed workspace', () => { mount() - expect(tabs()).toEqual(['Integrations', 'Skills', 'Search']) + expect(tabs()).toEqual(['Integrations', 'Skills']) expect( Array.from(container?.querySelectorAll('a') ?? []).map((node) => node.getAttribute('href')) - ).toEqual([ - '/workspace/workspace-1/integrations', - '/workspace/workspace-1/skills', - '/workspace/workspace-1/search', - ]) + ).toEqual(['/workspace/workspace-1/integrations', '/workspace/workspace-1/skills']) }) - it('omits Search where per-member access is off, matching the page that 404s', () => { - mockMemberAccessAvailable.mockReturnValue(false) - mount() - + it('keeps the same workspace navigation on the Skills tab', () => { + mount('skills') expect(tabs()).toEqual(['Integrations', 'Skills']) }) }) diff --git a/apps/sim/app/workspace/[workspaceId]/components/integration-tabs-header/integration-tabs-header.tsx b/apps/sim/app/workspace/[workspaceId]/components/integration-tabs-header/integration-tabs-header.tsx index 248d7936669..11774143550 100644 --- a/apps/sim/app/workspace/[workspaceId]/components/integration-tabs-header/integration-tabs-header.tsx +++ b/apps/sim/app/workspace/[workspaceId]/components/integration-tabs-header/integration-tabs-header.tsx @@ -3,38 +3,20 @@ import type { ReactNode } from 'react' import { ChipLink, cn } from '@sim/emcn' import { HEADER_ACTION_CLUSTER, PAGE_HEADER_BAR } from '@/components/page-header-bar' -import { useMemberAccessAvailable } from '@/hooks/use-member-access' interface IntegrationTabsHeaderProps { - active: 'integrations' | 'skills' | 'search' + active: 'integrations' | 'skills' workspaceId: string /** Trailing actions for the owning page (e.g. skills' "Add skill"). */ rightSlot?: ReactNode } -/** - * Top-of-page tab header shared by the Integrations, Skills, and Search pages — - * three views of one surface, so each highlights itself and links to its siblings. - * - * Lives in the shared workspace components rather than under `integrations/` - * because every page owns it equally; its former home made Skills reach across - * into a sibling feature for its own chrome. - * - * Search appears only where per-member access is on, matching the page it links - * to, which 404s otherwise. A client component so the three pages and their - * Suspense fallbacks all read that one judgement from the workspace host - * context rather than each resolving it again on the server. - * - * The `gap-1` is explicit because chips carry no outer margin — the parent owns the - * space between them. - */ +/** Shared navigation for workspace integrations and skills. */ export function IntegrationTabsHeader({ active, workspaceId, rightSlot, }: IntegrationTabsHeaderProps) { - const memberAccessAvailable = useMemberAccessAvailable() - return ({error}
} - > - ) -} diff --git a/apps/sim/app/workspace/[workspaceId]/search/components/search-setup-return.test.tsx b/apps/sim/app/workspace/[workspaceId]/search/components/search-setup-return.test.tsx deleted file mode 100644 index 7b3a9fb4384..00000000000 --- a/apps/sim/app/workspace/[workspaceId]/search/components/search-setup-return.test.tsx +++ /dev/null @@ -1,72 +0,0 @@ -/** @vitest-environment jsdom */ -import { act, type ReactNode } from 'react' -import { NuqsTestingAdapter } from 'nuqs/adapters/testing' -import { createRoot, type Root } from 'react-dom/client' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' - -const push = vi.hoisted(() => vi.fn()) -vi.mock('next/navigation', () => ({ - usePathname: () => '/workspace/workspace-1/settings/credential-groups', - useRouter: () => ({ push }), -})) - -import { SearchSetupReturn } from '@/app/workspace/[workspaceId]/search/components/search-setup-return' - -let root: Root | undefined -let container: HTMLDivElement - -async function render(node: ReactNode, searchParams: string) { - container = document.createElement('div') - document.body.appendChild(container) - root = createRoot(container) - await act(async () => - root?.render( -{error}
} -