From 1323d05634e173d29ee68cc073ae8d2cf8bad7ca Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 23 Apr 2026 12:56:26 +0000 Subject: [PATCH] feat(ui): team/member_permissions to shadcn - @tremor Card/Table family/Text/Title + antd Button/Checkbox/Empty + @ant-design Reload/Save \u2192 shadcn Card/Table/Button/Checkbox + lucide RefreshCcw/Save. - HTTP method chips use categorical blue (GET) / emerald (non-GET) palette. File added to overrides. - Empty state rendered as a plain muted paragraph (no Empty component needed). Gates: TS \u2713 | Build \u2713. Co-authored-by: yuneng-jiang --- ui/litellm-dashboard/.eslintrc.json | 1 + .../components/team/member_permissions.tsx | 98 +++++++++++++------ 2 files changed, 68 insertions(+), 31 deletions(-) diff --git a/ui/litellm-dashboard/.eslintrc.json b/ui/litellm-dashboard/.eslintrc.json index c15ba3e5ef7..08fc6f5fd02 100644 --- a/ui/litellm-dashboard/.eslintrc.json +++ b/ui/litellm-dashboard/.eslintrc.json @@ -64,6 +64,7 @@ "src/components/prompts/prompt_editor_view/conversation_panel/MessageBubble.tsx", "src/components/playground/chat_ui/SessionManagement.tsx", "src/components/playground/chat_ui/SearchResultsDisplay.tsx", + "src/components/team/member_permissions.tsx", "src/components/UsagePage/components/EntityUsage/SpendByProvider.tsx", "src/components/view_logs/ToolsSection/FormattedToolView.tsx", "src/components/Settings/LoggingAndAlerts/LoggingCallbacks/LoggingCallbacksTable.tsx", diff --git a/ui/litellm-dashboard/src/components/team/member_permissions.tsx b/ui/litellm-dashboard/src/components/team/member_permissions.tsx index 5bbd82f4a5d..45a644ad429 100644 --- a/ui/litellm-dashboard/src/components/team/member_permissions.tsx +++ b/ui/litellm-dashboard/src/components/team/member_permissions.tsx @@ -1,7 +1,20 @@ -import { getTeamPermissionsCall, teamPermissionsUpdateCall } from "@/components/networking"; -import { ReloadOutlined, SaveOutlined } from "@ant-design/icons"; -import { Card, Table, TableBody, TableCell, TableHead, TableHeaderCell, TableRow, Text, Title } from "@tremor/react"; -import { Button, Checkbox, Empty } from "antd"; +import { + getTeamPermissionsCall, + teamPermissionsUpdateCall, +} from "@/components/networking"; +import { Button } from "@/components/ui/button"; +import { Card } from "@/components/ui/card"; +import { Checkbox } from "@/components/ui/checkbox"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import { cn } from "@/lib/utils"; +import { RefreshCcw, Save } from "lucide-react"; import React, { useEffect, useState } from "react"; import NotificationsManager from "../molecules/notifications_manager"; import { getPermissionInfo } from "./permission_definitions"; @@ -12,7 +25,11 @@ interface MemberPermissionsProps { canEditTeam: boolean; } -const MemberPermissions: React.FC = ({ teamId, accessToken, canEditTeam }) => { +const MemberPermissions: React.FC = ({ + teamId, + accessToken, + canEditTeam, +}) => { const [permissions, setPermissions] = useState([]); const [selectedPermissions, setSelectedPermissions] = useState([]); const [loading, setLoading] = useState(true); @@ -39,6 +56,7 @@ const MemberPermissions: React.FC = ({ teamId, accessTok useEffect(() => { fetchPermissions(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [teamId, accessToken]); const handlePermissionChange = (permission: string, checked: boolean) => { @@ -75,58 +93,76 @@ const MemberPermissions: React.FC = ({ teamId, accessTok const hasPermissions = permissions.length > 0; return ( - -
- Member Permissions + +
+

+ Member Permissions +

{canEditTeam && hasChanges && (
- -
)}
- Control what team members can do when they are not team admins. +

+ Control what team members can do when they are not team admins. +

{hasPermissions ? ( -
- - +
+
+ - Method - Endpoint - Description - + Method + Endpoint + Description + Allow Access - + - + {permissions.map((permission) => { const permInfo = getPermissionInfo(permission); return ( - + {permInfo.method} - {permInfo.endpoint} + + {permInfo.endpoint} + - {permInfo.description} - + + {permInfo.description} + + handlePermissionChange(permission, e.target.checked)} + onCheckedChange={(checked) => + handlePermissionChange(permission, checked === true) + } disabled={!canEditTeam} /> @@ -137,8 +173,8 @@ const MemberPermissions: React.FC = ({ teamId, accessTok
) : ( -
- +
+ No permissions available
)}