From 714122ec90d0c9878da4e42f643e0c9607a74883 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 11 Aug 2026 06:23:38 +0000 Subject: [PATCH] fix(ui): stop useCan from fetching the org list for capabilities that don't use it useCan called useIsOrgAdmin unconditionally, which fires /organization/list via useOrganizations. That broke UsageTab and CostOptimizationView tests (they render without a QueryClientProvider, so the useQuery inside useIsOrgAdmin threw "No QueryClient set") and also broke Workflows / Memory / Guardrails Monitor integration tests that assert no fetch fires for a non-admin role. Only viewDeletedTeams reads the org-admin flag (ORG_ADMIN_CAPABILITIES), so drop the useIsOrgAdmin call from useCan and OR the org-admin membership check in at the single caller in view_logs. The org-admin membership fallback for viewDeletedTeams is preserved. Co-authored-by: Krrish Dholakia --- ui/litellm-dashboard/src/app/(dashboard)/hooks/useCan.ts | 4 +--- ui/litellm-dashboard/src/components/view_logs/index.tsx | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useCan.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useCan.ts index 13903007cae..f538e1dff15 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/useCan.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/useCan.ts @@ -3,12 +3,10 @@ import { hasCapability, type Capability } from "@/utils/capabilities"; import useAuthorized from "./useAuthorized"; -import useIsOrgAdmin from "./useIsOrgAdmin"; const useCan = (capability: Capability): boolean => { const { userRole } = useAuthorized(); - const isOrgAdmin = useIsOrgAdmin(); - return hasCapability(userRole, capability, isOrgAdmin); + return hasCapability(userRole, capability); }; export default useCan; diff --git a/ui/litellm-dashboard/src/components/view_logs/index.tsx b/ui/litellm-dashboard/src/components/view_logs/index.tsx index 7269564dcec..e59dc590512 100644 --- a/ui/litellm-dashboard/src/components/view_logs/index.tsx +++ b/ui/litellm-dashboard/src/components/view_logs/index.tsx @@ -1,6 +1,7 @@ import { useState } from "react"; import { Tab, TabGroup, TabList, TabPanel, TabPanels } from "@tremor/react"; import useCan from "@/app/(dashboard)/hooks/useCan"; +import useIsOrgAdmin from "@/app/(dashboard)/hooks/useIsOrgAdmin"; import DeletedKeysPage from "../DeletedKeysPage/DeletedKeysPage"; import DeletedTeamsPage from "../DeletedTeamsPage/DeletedTeamsPage"; import AuditLogsPanel from "./AuditLogsPanel"; @@ -30,7 +31,7 @@ const DELETED_TEAMS_TAB: LogsTab = { id: "deleted teams", label: "Deleted Teams" export default function SpendLogsTable({ accessToken, token, userRole, userID, premiumUser }: SpendLogsTableProps) { const [activeTab, setActiveTab] = useState(REQUEST_LOGS_TAB.id); const canViewAuditLogs = useCan("viewAuditLogs"); - const canViewDeletedTeams = useCan("viewDeletedTeams"); + const canViewDeletedTeams = useCan("viewDeletedTeams") || useIsOrgAdmin(); if (!accessToken || !token || !userRole || !userID) { return (