+
+
+ {open && (
+ <>
+
setOpen(false)} style={{ position: 'fixed', inset: 0, zIndex: 149 }} />
+
+
+ Switch workspace
+
+
+ {loadError && (
+
{loadError}
+ )}
+
+
void handleSwitch(null)}
+ />
+
+ {myTeams.length === 0 && !loadError && teams != null && (
+ No team memberships yet.
+ )}
+
+ {[...myTeams].sort((a, b) => a.name.localeCompare(b.name)).map(t => (
+ void handleSwitch(t.id)}
+ />
+ ))}
+
+ {switchError && (
+
+ {switchError}
+
+ )}
+
+ >
+ )}
+
+ )
+}
+
+function SwitcherItem({ label, active, disabled, onClick }: { label: string; active: boolean; disabled: boolean; onClick: () => void }) {
+ return (
+
+ )
+}
diff --git a/frontend/cc-ui/src/components/shell/TopAppBar.tsx b/frontend/cc-ui/src/components/shell/TopAppBar.tsx
index 3202682..d680f09 100644
--- a/frontend/cc-ui/src/components/shell/TopAppBar.tsx
+++ b/frontend/cc-ui/src/components/shell/TopAppBar.tsx
@@ -5,6 +5,7 @@ import GlobalSearch from './GlobalSearch'
import NotificationsMenu from './NotificationsMenu'
import OrgSelector from './OrgSelector'
import ProfileMenu from './ProfileMenu'
+import TeamSwitcher from './TeamSwitcher'
import ThemeToggle from './ThemeToggle'
interface Props {
@@ -20,9 +21,12 @@ interface Props {
/**
* Admin Console Phase 2: top app bar. Breadcrumb (left) + global search /
- * notifications / theme toggle / org selector / profile menu (right) --
- * every one of these is new UI except ProfileMenu's sign-out, which
- * reuses auth.ts's existing logout() (see ProfileMenu.tsx).
+ * notifications / theme toggle / org selector / team switcher / profile
+ * menu (right) -- every one of these is new UI except ProfileMenu's
+ * sign-out, which reuses auth.ts's existing logout() (see
+ * ProfileMenu.tsx). Mode B Phase 2 adds TeamSwitcher, the first real
+ * (non-placeholder) context switcher here -- OrgSelector next to it
+ * remains its own documented placeholder.
*/
export default function TopAppBar({ breadcrumb, user, onSignOut, onMenuToggle, extraActions }: Props) {
return (
@@ -47,6 +51,7 @@ export default function TopAppBar({ breadcrumb, user, onSignOut, onMenuToggle, e
{extraActions &&
{extraActions}
}
+
diff --git a/frontend/cc-ui/src/components/shell/index.ts b/frontend/cc-ui/src/components/shell/index.ts
index 1a26a60..5455244 100644
--- a/frontend/cc-ui/src/components/shell/index.ts
+++ b/frontend/cc-ui/src/components/shell/index.ts
@@ -6,5 +6,6 @@ export { default as GlobalSearch } from './GlobalSearch'
export { default as NotificationsMenu } from './NotificationsMenu'
export { default as OrgSelector } from './OrgSelector'
export { default as ProfileMenu } from './ProfileMenu'
+export { default as TeamSwitcher } from './TeamSwitcher'
export { default as ThemeToggle } from './ThemeToggle'
export { default as Footer } from './Footer'
diff --git a/frontend/cc-ui/src/components/teams/TeamMembersPanel.test.tsx b/frontend/cc-ui/src/components/teams/TeamMembersPanel.test.tsx
index 3f48a19..40b01e9 100644
--- a/frontend/cc-ui/src/components/teams/TeamMembersPanel.test.tsx
+++ b/frontend/cc-ui/src/components/teams/TeamMembersPanel.test.tsx
@@ -39,7 +39,7 @@ function sessionAs(userId: number | null) {
vi.mocked(auth.getSessionUser).mockReturnValue(
userId == null ? null : {
userId: String(userId), email: 'x@acme.test', roles: [], permissions: [],
- orgId: '42', orgRoles: [], schemaVersion: 2,
+ orgId: '42', orgRoles: [], teamId: null, teamRole: null, schemaVersion: 2,
},
)
}
diff --git a/frontend/cc-ui/tsconfig.app.tsbuildinfo b/frontend/cc-ui/tsconfig.app.tsbuildinfo
index 815c803..82518a1 100644
--- a/frontend/cc-ui/tsconfig.app.tsbuildinfo
+++ b/frontend/cc-ui/tsconfig.app.tsbuildinfo
@@ -1 +1 @@
-{"root":["./src/api.ts","./src/audit.ts","./src/auth.test.ts","./src/auth.ts","./src/billing.ts","./src/dashboard.ts","./src/format.ts","./src/integrations.ts","./src/interactions.ts","./src/main.tsx","./src/model_registry.ts","./src/navigation.test.ts","./src/navigation.ts","./src/organizations.ts","./src/platform_config.ts","./src/rag.ts","./src/roles.ts","./src/security.ts","./src/serviceAccounts.ts","./src/sessions.ts","./src/sso.ts","./src/teams.ts","./src/tes.ts","./src/test-setup.ts","./src/users.ts","./src/workflows.ts","./src/apps/AdminApp.test.tsx","./src/apps/AdminApp.tsx","./src/apps/AuthGate.tsx","./src/apps/ControlApp.test.tsx","./src/apps/ControlApp.tsx","./src/apps/UnknownModeNotice.test.tsx","./src/apps/UnknownModeNotice.tsx","./src/components/AccessDenied.test.tsx","./src/components/AccessDenied.tsx","./src/components/AdminLogo.tsx","./src/components/Header.tsx","./src/components/LoginScreen.test.tsx","./src/components/LoginScreen.tsx","./src/components/OAuthButtons.tsx","./src/components/StatusBadge.tsx","./src/components/dashboard/AlertCard.tsx","./src/components/dashboard/DashboardCard.tsx","./src/components/dashboard/DashboardGrid.tsx","./src/components/dashboard/HealthCard.tsx","./src/components/dashboard/MetricCard.tsx","./src/components/dashboard/StatusCard.tsx","./src/components/dashboard/TrendCard.tsx","./src/components/dashboard/dashboard-widgets.test.tsx","./src/components/dashboard/index.ts","./src/components/organizations/OrganizationStatusBadge.tsx","./src/components/organizations/OrganizationSummaryCard.tsx","./src/components/organizations/OrganizationTable.tsx","./src/components/organizations/SecuritySummaryCard.tsx","./src/components/roles/PermissionSelector.test.tsx","./src/components/roles/PermissionSelector.tsx","./src/components/roles/RoleAssignmentList.tsx","./src/components/roles/RoleBadge.tsx","./src/components/roles/RoleSelector.test.tsx","./src/components/roles/RoleSelector.tsx","./src/components/shell/AppShell.tsx","./src/components/shell/Breadcrumb.tsx","./src/components/shell/Footer.tsx","./src/components/shell/GlobalSearch.tsx","./src/components/shell/NotificationsMenu.tsx","./src/components/shell/OrgSelector.tsx","./src/components/shell/ProfileMenu.tsx","./src/components/shell/SidebarNav.tsx","./src/components/shell/ThemeToggle.tsx","./src/components/shell/TopAppBar.tsx","./src/components/shell/index.ts","./src/components/teams/TeamMembersPanel.test.tsx","./src/components/teams/TeamMembersPanel.tsx","./src/components/teams/TeamRow.test.tsx","./src/components/teams/TeamRow.tsx","./src/components/teams/TeamsCard.test.tsx","./src/components/teams/TeamsCard.tsx","./src/components/ui/ActionToolbar.tsx","./src/components/ui/BackLink.tsx","./src/components/ui/Button.tsx","./src/components/ui/Card.tsx","./src/components/ui/ComingSoon.tsx","./src/components/ui/DataTable.tsx","./src/components/ui/EmptyState.tsx","./src/components/ui/ErrorState.tsx","./src/components/ui/LoadingState.tsx","./src/components/ui/PageContainer.tsx","./src/components/ui/Pagination.tsx","./src/components/ui/SectionHeader.tsx","./src/components/ui/SessionExpiredState.tsx","./src/components/ui/StatCard.tsx","./src/components/ui/icon-type.ts","./src/components/ui/index.ts","./src/components/users/UserMFASecurityCard.test.tsx","./src/components/users/UserMFASecurityCard.tsx","./src/components/users/UserOrgMembershipList.tsx","./src/components/users/UserStatusAction.tsx","./src/pages/CloudPage.tsx","./src/pages/ConfigPage.tsx","./src/pages/DashboardPage.test.tsx","./src/pages/DashboardPage.tsx","./src/pages/DockerPage.tsx","./src/pages/EcosystemPage.tsx","./src/pages/HealthPage.tsx","./src/pages/IntegrationsPage.test.tsx","./src/pages/IntegrationsPage.tsx","./src/pages/InteractionsPage.test.tsx","./src/pages/InteractionsPage.tsx","./src/pages/LlmPage.tsx","./src/pages/OrganizationDetailPage.test.tsx","./src/pages/OrganizationDetailPage.tsx","./src/pages/OrganizationsPage.test.tsx","./src/pages/OrganizationsPage.tsx","./src/pages/PlatformSettingsPage.test.tsx","./src/pages/PlatformSettingsPage.tsx","./src/pages/UserDetailPage.test.tsx","./src/pages/UserDetailPage.tsx","./src/pages/UsersPage.test.tsx","./src/pages/UsersPage.tsx","./src/pages/audit/AuditLogsPage.test.tsx","./src/pages/audit/AuditLogsPage.tsx","./src/pages/billing/BillingPage.test.tsx","./src/pages/billing/BillingPage.tsx","./src/pages/billing/SubscriptionPage.test.tsx","./src/pages/billing/SubscriptionPage.tsx","./src/pages/identity/RolesPage.test.tsx","./src/pages/identity/RolesPage.tsx","./src/pages/identity/SSOSettingsPage.test.tsx","./src/pages/identity/SSOSettingsPage.tsx","./src/pages/identity/ServiceAccountsPage.test.tsx","./src/pages/identity/ServiceAccountsPage.tsx","./src/pages/identity/TeamsPage.test.tsx","./src/pages/identity/TeamsPage.tsx","./src/pages/operations/AIModelsPage.test.tsx","./src/pages/operations/AIModelsPage.tsx","./src/pages/operations/RAGPage.test.tsx","./src/pages/operations/RAGPage.tsx","./src/pages/operations/ToolExecutionPage.test.tsx","./src/pages/operations/ToolExecutionPage.tsx","./src/pages/operations/WorkflowsPage.test.tsx","./src/pages/operations/WorkflowsPage.tsx","./src/pages/security/OrganizationMFAPolicyPage.test.tsx","./src/pages/security/OrganizationMFAPolicyPage.tsx","./src/pages/security/SecurityDashboardPage.test.tsx","./src/pages/security/SecurityDashboardPage.tsx","./src/pages/security/SessionsPage.test.tsx","./src/pages/security/SessionsPage.tsx"],"version":"5.9.3"}
\ No newline at end of file
+{"root":["./src/api.ts","./src/audit.ts","./src/auth.test.ts","./src/auth.ts","./src/billing.ts","./src/dashboard.ts","./src/format.ts","./src/integrations.ts","./src/interactions.ts","./src/main.tsx","./src/model_registry.ts","./src/navigation.test.ts","./src/navigation.ts","./src/organizations.ts","./src/platform_config.ts","./src/rag.ts","./src/roles.ts","./src/security.ts","./src/serviceAccounts.ts","./src/sessions.ts","./src/sso.ts","./src/teams.ts","./src/tes.ts","./src/test-setup.ts","./src/users.ts","./src/workflows.ts","./src/apps/AdminApp.test.tsx","./src/apps/AdminApp.tsx","./src/apps/AuthGate.tsx","./src/apps/ControlApp.test.tsx","./src/apps/ControlApp.tsx","./src/apps/UnknownModeNotice.test.tsx","./src/apps/UnknownModeNotice.tsx","./src/components/AccessDenied.test.tsx","./src/components/AccessDenied.tsx","./src/components/AdminLogo.tsx","./src/components/Header.tsx","./src/components/LoginScreen.test.tsx","./src/components/LoginScreen.tsx","./src/components/OAuthButtons.tsx","./src/components/StatusBadge.tsx","./src/components/dashboard/AlertCard.tsx","./src/components/dashboard/DashboardCard.tsx","./src/components/dashboard/DashboardGrid.tsx","./src/components/dashboard/HealthCard.tsx","./src/components/dashboard/MetricCard.tsx","./src/components/dashboard/StatusCard.tsx","./src/components/dashboard/TrendCard.tsx","./src/components/dashboard/dashboard-widgets.test.tsx","./src/components/dashboard/index.ts","./src/components/organizations/OrganizationStatusBadge.tsx","./src/components/organizations/OrganizationSummaryCard.tsx","./src/components/organizations/OrganizationTable.tsx","./src/components/organizations/SecuritySummaryCard.tsx","./src/components/roles/PermissionSelector.test.tsx","./src/components/roles/PermissionSelector.tsx","./src/components/roles/RoleAssignmentList.tsx","./src/components/roles/RoleBadge.tsx","./src/components/roles/RoleSelector.test.tsx","./src/components/roles/RoleSelector.tsx","./src/components/shell/AppShell.tsx","./src/components/shell/Breadcrumb.tsx","./src/components/shell/Footer.tsx","./src/components/shell/GlobalSearch.tsx","./src/components/shell/NotificationsMenu.tsx","./src/components/shell/OrgSelector.tsx","./src/components/shell/ProfileMenu.tsx","./src/components/shell/SidebarNav.tsx","./src/components/shell/TeamSwitcher.test.tsx","./src/components/shell/TeamSwitcher.tsx","./src/components/shell/ThemeToggle.tsx","./src/components/shell/TopAppBar.tsx","./src/components/shell/index.ts","./src/components/teams/TeamMembersPanel.test.tsx","./src/components/teams/TeamMembersPanel.tsx","./src/components/teams/TeamRow.test.tsx","./src/components/teams/TeamRow.tsx","./src/components/teams/TeamsCard.test.tsx","./src/components/teams/TeamsCard.tsx","./src/components/ui/ActionToolbar.tsx","./src/components/ui/BackLink.tsx","./src/components/ui/Button.tsx","./src/components/ui/Card.tsx","./src/components/ui/ComingSoon.tsx","./src/components/ui/DataTable.tsx","./src/components/ui/EmptyState.tsx","./src/components/ui/ErrorState.tsx","./src/components/ui/LoadingState.tsx","./src/components/ui/PageContainer.tsx","./src/components/ui/Pagination.tsx","./src/components/ui/SectionHeader.tsx","./src/components/ui/SessionExpiredState.tsx","./src/components/ui/StatCard.tsx","./src/components/ui/icon-type.ts","./src/components/ui/index.ts","./src/components/users/UserMFASecurityCard.test.tsx","./src/components/users/UserMFASecurityCard.tsx","./src/components/users/UserOrgMembershipList.tsx","./src/components/users/UserStatusAction.tsx","./src/pages/CloudPage.tsx","./src/pages/ConfigPage.tsx","./src/pages/DashboardPage.test.tsx","./src/pages/DashboardPage.tsx","./src/pages/DockerPage.tsx","./src/pages/EcosystemPage.tsx","./src/pages/HealthPage.tsx","./src/pages/IntegrationsPage.test.tsx","./src/pages/IntegrationsPage.tsx","./src/pages/InteractionsPage.test.tsx","./src/pages/InteractionsPage.tsx","./src/pages/LlmPage.tsx","./src/pages/OrganizationDetailPage.test.tsx","./src/pages/OrganizationDetailPage.tsx","./src/pages/OrganizationsPage.test.tsx","./src/pages/OrganizationsPage.tsx","./src/pages/PlatformSettingsPage.test.tsx","./src/pages/PlatformSettingsPage.tsx","./src/pages/UserDetailPage.test.tsx","./src/pages/UserDetailPage.tsx","./src/pages/UsersPage.test.tsx","./src/pages/UsersPage.tsx","./src/pages/audit/AuditLogsPage.test.tsx","./src/pages/audit/AuditLogsPage.tsx","./src/pages/billing/BillingPage.test.tsx","./src/pages/billing/BillingPage.tsx","./src/pages/billing/SubscriptionPage.test.tsx","./src/pages/billing/SubscriptionPage.tsx","./src/pages/identity/RolesPage.test.tsx","./src/pages/identity/RolesPage.tsx","./src/pages/identity/SSOSettingsPage.test.tsx","./src/pages/identity/SSOSettingsPage.tsx","./src/pages/identity/ServiceAccountsPage.test.tsx","./src/pages/identity/ServiceAccountsPage.tsx","./src/pages/identity/TeamsPage.test.tsx","./src/pages/identity/TeamsPage.tsx","./src/pages/operations/AIModelsPage.test.tsx","./src/pages/operations/AIModelsPage.tsx","./src/pages/operations/RAGPage.test.tsx","./src/pages/operations/RAGPage.tsx","./src/pages/operations/ToolExecutionPage.test.tsx","./src/pages/operations/ToolExecutionPage.tsx","./src/pages/operations/WorkflowsPage.test.tsx","./src/pages/operations/WorkflowsPage.tsx","./src/pages/security/OrganizationMFAPolicyPage.test.tsx","./src/pages/security/OrganizationMFAPolicyPage.tsx","./src/pages/security/SecurityDashboardPage.test.tsx","./src/pages/security/SecurityDashboardPage.tsx","./src/pages/security/SessionsPage.test.tsx","./src/pages/security/SessionsPage.tsx"],"version":"5.9.3"}
\ No newline at end of file