From 5f393202115e761c0f41641bb096168fa8b96634 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 23 Apr 2026 13:19:49 +0000 Subject: [PATCH] feat(ui): PageVisibilitySettings to shadcn - antd Button/Checkbox.Group/Collapse/Space/Tag/Typography \u2192 shadcn Accordion/Checkbox/Button/Badge. - Purple informational paragraph kept as a categorical accent (added to overrides). Blue 'N pages selected' badge similarly categorical. - Save/Reset buttons on the same row; destructive-tinted Reset is omitted (preserving the original neutral outline). Gates: TS \u2713 | Build \u2713. Co-authored-by: yuneng-jiang --- ui/litellm-dashboard/.eslintrc.json | 1 + .../UISettings/PageVisibilitySettings.tsx | 194 ++++++++++-------- 2 files changed, 110 insertions(+), 85 deletions(-) diff --git a/ui/litellm-dashboard/.eslintrc.json b/ui/litellm-dashboard/.eslintrc.json index ccf3fa73dc3..6da9f5e4529 100644 --- a/ui/litellm-dashboard/.eslintrc.json +++ b/ui/litellm-dashboard/.eslintrc.json @@ -67,6 +67,7 @@ "src/components/team/member_permissions.tsx", "src/components/agent_management/AgentSelector.tsx", "src/components/CostTrackingSettings/how_it_works.tsx", + "src/components/Settings/AdminSettings/UISettings/PageVisibilitySettings.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/Settings/AdminSettings/UISettings/PageVisibilitySettings.tsx b/ui/litellm-dashboard/src/components/Settings/AdminSettings/UISettings/PageVisibilitySettings.tsx index 47e4a8bb7f3..5ab65b38eb6 100644 --- a/ui/litellm-dashboard/src/components/Settings/AdminSettings/UISettings/PageVisibilitySettings.tsx +++ b/ui/litellm-dashboard/src/components/Settings/AdminSettings/UISettings/PageVisibilitySettings.tsx @@ -1,14 +1,24 @@ "use client"; import { getAvailablePages } from "@/components/page_utils"; -import { Button, Checkbox, Collapse, Space, Tag, Typography } from "antd"; +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { useMemo, useState } from "react"; interface PageVisibilitySettingsProps { enabledPagesInternalUsers: string[] | null | undefined; enabledPagesPropertyDescription?: string; isUpdating: boolean; - onUpdate: (settings: { enabled_ui_pages_internal_users: string[] | null }) => void; + onUpdate: (settings: { + enabled_ui_pages_internal_users: string[] | null; + }) => void; } export default function PageVisibilitySettings({ @@ -17,13 +27,12 @@ export default function PageVisibilitySettings({ isUpdating, onUpdate, }: PageVisibilitySettingsProps) { - // Check if page visibility is set (null/undefined means "not set" = all pages visible) - const isPageVisibilitySet = enabledPagesInternalUsers !== null && enabledPagesInternalUsers !== undefined; + const isPageVisibilitySet = + enabledPagesInternalUsers !== null && + enabledPagesInternalUsers !== undefined; - // Get available pages from leftnav configuration const availablePages = useMemo(() => getAvailablePages(), []); - // Group pages by their group for better UI const pagesByGroup = useMemo(() => { const grouped: Record = {}; availablePages.forEach((page) => { @@ -35,10 +44,10 @@ export default function PageVisibilitySettings({ return grouped; }, [availablePages]); - // Local state for page selection - const [selectedPages, setSelectedPages] = useState(enabledPagesInternalUsers || []); + const [selectedPages, setSelectedPages] = useState( + enabledPagesInternalUsers || [], + ); - // Update local state when data changes useMemo(() => { if (enabledPagesInternalUsers) { setSelectedPages(enabledPagesInternalUsers); @@ -47,8 +56,19 @@ export default function PageVisibilitySettings({ } }, [enabledPagesInternalUsers]); + const togglePage = (page: string, checked: boolean) => { + if (checked) { + setSelectedPages((prev) => [...prev, page]); + } else { + setSelectedPages((prev) => prev.filter((p) => p !== page)); + } + }; + const handleSavePageVisibility = () => { - onUpdate({ enabled_ui_pages_internal_users: selectedPages.length > 0 ? selectedPages : null }); + onUpdate({ + enabled_ui_pages_internal_users: + selectedPages.length > 0 ? selectedPages : null, + }); }; const handleResetToDefault = () => { @@ -57,90 +77,94 @@ export default function PageVisibilitySettings({ }; return ( - - - - Internal User Page Visibility +
+
+
+ Internal User Page Visibility {!isPageVisibilitySet && ( - - Not set (all pages visible) - + Not set (all pages visible) )} {isPageVisibilitySet && ( - - {selectedPages.length} page{selectedPages.length !== 1 ? "s" : ""} selected - + + {selectedPages.length} page{selectedPages.length !== 1 ? "s" : ""}{" "} + selected + )} - +
{enabledPagesPropertyDescription && ( - {enabledPagesPropertyDescription} +

+ {enabledPagesPropertyDescription} +

)} - - By default, all pages are visible to internal users. Select specific pages to restrict visibility. - - - Note: Only pages accessible to internal user roles are shown here. Admin-only pages are excluded as they - cannot be made visible to internal users regardless of this setting. - - +

+ By default, all pages are visible to internal users. Select specific + pages to restrict visibility. +

+

+ Note: Only pages accessible to internal user roles are shown here. + Admin-only pages are excluded as they cannot be made visible to + internal users regardless of this setting. +

+
- - - - {Object.entries(pagesByGroup).map(([groupName, pages]) => ( -
- - {groupName} - - - {pages.map((page) => ( -
- - - {page.label} - - {page.description} - - - -
- ))} -
-
+ + + Configure Page Visibility + +
+ {Object.entries(pagesByGroup).map(([groupName, pages]) => ( +
+
+ {groupName} +
+
+ {pages.map((page) => ( + ))} - - +
+
+ ))} - - + {isPageVisibilitySet && ( + - {isPageVisibilitySet && ( - - )} - - - ), - }, - ]} - /> - + )} +
+
+ + + + ); }