diff --git a/ui/litellm-dashboard/.eslintrc.json b/ui/litellm-dashboard/.eslintrc.json index adc55a0e362..bca9af3333c 100644 --- a/ui/litellm-dashboard/.eslintrc.json +++ b/ui/litellm-dashboard/.eslintrc.json @@ -86,6 +86,7 @@ "src/components/AIHub/forms/MakeMCPPublicForm.tsx", "src/components/AIHub/forms/MakeModelPublicForm.tsx", "src/components/policies/policy_test_panel.tsx", + "src/components/mcp_tools/McpCrudPermissionPanel.tsx", "src/components/permissions/VectorStorePermissions.tsx", "src/components/permissions/AgentPermissions.tsx", "src/components/permissions/MCPServerPermissions.tsx", diff --git a/ui/litellm-dashboard/src/components/mcp_tools/McpCrudPermissionPanel.tsx b/ui/litellm-dashboard/src/components/mcp_tools/McpCrudPermissionPanel.tsx index 248385fe002..7a74e4292e6 100644 --- a/ui/litellm-dashboard/src/components/mcp_tools/McpCrudPermissionPanel.tsx +++ b/ui/litellm-dashboard/src/components/mcp_tools/McpCrudPermissionPanel.tsx @@ -10,9 +10,9 @@ */ import React, { useMemo, useState } from "react"; -import { Checkbox } from "antd"; -import { Text } from "@tremor/react"; -import { ChevronDownIcon, ChevronRightIcon } from "lucide-react"; +import { Checkbox } from "@/components/ui/checkbox"; +import { cn } from "@/lib/utils"; +import { ChevronDown, ChevronRight } from "lucide-react"; import { CrudOp, MCPToolEntry, @@ -43,26 +43,27 @@ interface McpCrudPermissionPanelProps { const CRUD_ORDER: CrudOp[] = ["read", "create", "update", "delete", "unknown"]; const RISK_BADGE: Record = { - low: "bg-green-100 text-green-800", - medium: "bg-yellow-100 text-yellow-800", - high: "bg-red-100 text-red-800 font-semibold", - unknown: "bg-gray-100 text-gray-700", + low: "bg-emerald-100 text-emerald-800 dark:bg-emerald-950 dark:text-emerald-300", + medium: + "bg-amber-100 text-amber-800 dark:bg-amber-950 dark:text-amber-300", + high: "bg-red-100 text-red-800 font-semibold dark:bg-red-950 dark:text-red-300", + unknown: "bg-muted text-muted-foreground", }; const GROUP_BORDER: Record = { - read: "border-green-200", - create: "border-blue-200", - update: "border-yellow-200", - delete: "border-red-300", - unknown: "border-gray-200", + read: "border-emerald-200 dark:border-emerald-900", + create: "border-blue-200 dark:border-blue-900", + update: "border-amber-200 dark:border-amber-900", + delete: "border-red-300 dark:border-red-900", + unknown: "border-border", }; const GROUP_HEADER_BG: Record = { - read: "bg-green-50", - create: "bg-blue-50", - update: "bg-yellow-50", - delete: "bg-red-50", - unknown: "bg-gray-50", + read: "bg-emerald-50 dark:bg-emerald-950/30", + create: "bg-blue-50 dark:bg-blue-950/30", + update: "bg-amber-50 dark:bg-amber-950/30", + delete: "bg-red-50 dark:bg-red-950/30", + unknown: "bg-muted", }; // --------------------------------------------------------------------------- @@ -164,44 +165,63 @@ const McpCrudPermissionPanel: React.FC = ({ const isCollapsed = collapsed[op]; return ( -
+
{/* Group header */} -
+
{!readOnly && (
- + {fullyAllowed ? "All on" : partial ? "Partial" : "All off"} - - {/* Checkbox supports `indeterminate`; Switch does not. */} + toggleGroup(op, e.target.checked)} + checked={ + partial ? "indeterminate" : fullyAllowed ? true : false + } + onCheckedChange={(c) => toggleGroup(op, c === true)} onClick={(e) => e.stopPropagation()} />
@@ -210,54 +230,66 @@ const McpCrudPermissionPanel: React.FC = ({ {/* Description row */} {!isCollapsed && ( -
+
{meta.description}
)} - {/* Tool list — searchFilter narrows display only; group toggles still cover all tools */} + {/* Tool list */} {!isCollapsed && ( -
+
{group - .filter((t) => - !searchFilter || - t.name.toLowerCase().includes(searchFilter.toLowerCase()) || - (t.description ?? "").toLowerCase().includes(searchFilter.toLowerCase()) + .filter( + (t) => + !searchFilter || + t.name + .toLowerCase() + .includes(searchFilter.toLowerCase()) || + (t.description ?? "") + .toLowerCase() + .includes(searchFilter.toLowerCase()), ) .map((tool) => { - const allowed = isToolAllowed(tool.name); - return ( -
toggleTool(tool.name)} - > - toggleTool(tool.name)} - disabled={readOnly} - onClick={(e) => e.stopPropagation()} - /> -
- {tool.name} - {tool.description && ( - - {tool.description} - + const allowed = isToolAllowed(tool.name); + return ( +
- toggleTool(tool.name)} > - {allowed ? "on" : "off"} - -
- ); - })} + toggleTool(tool.name)} + disabled={readOnly} + onClick={(e) => e.stopPropagation()} + /> +
+

+ {tool.name} +

+ {tool.description && ( +

+ {tool.description} +

+ )} +
+ + {allowed ? "on" : "off"} + +
+ ); + })}
)}