From 4670d4914c724d0b186ed4ca3bad3ebdaa41eb24 Mon Sep 17 00:00:00 2001 From: jubnl Date: Fri, 10 Apr 2026 06:59:10 +0200 Subject: [PATCH] fix(admin): collapse long scope lists with toggle in MCP Access panel Show first 6 scope badges per session with a clickable "+N more" pill that expands to all scopes; a "show less" pill collapses them again. Also fix column alignment to items-start so Owner/Created stay at the top of tall rows. --- .../components/Admin/AdminMcpTokensPanel.tsx | 83 +++++++++++++------ 1 file changed, 56 insertions(+), 27 deletions(-) diff --git a/client/src/components/Admin/AdminMcpTokensPanel.tsx b/client/src/components/Admin/AdminMcpTokensPanel.tsx index dd27ed5c..7173ae9c 100644 --- a/client/src/components/Admin/AdminMcpTokensPanel.tsx +++ b/client/src/components/Admin/AdminMcpTokensPanel.tsx @@ -26,13 +26,23 @@ interface AdminMcpToken { username: string } +const SCOPES_PREVIEW = 6 + export default function AdminMcpTokensPanel() { const [sessions, setSessions] = useState([]) const [sessionsLoading, setSessionsLoading] = useState(true) const [tokens, setTokens] = useState([]) const [tokensLoading, setTokensLoading] = useState(true) + const [expandedScopes, setExpandedScopes] = useState>(new Set()) const [revokeConfirmId, setRevokeConfirmId] = useState(null) const [deleteConfirmId, setDeleteConfirmId] = useState(null) + + const toggleScopes = (id: number) => + setExpandedScopes(prev => { + const next = new Set(prev) + next.has(id) ? next.delete(id) : next.add(id) + return next + }) const toast = useToast() const { t, locale } = useTranslation() @@ -99,35 +109,54 @@ export default function AdminMcpTokensPanel() { {t('admin.oauthSessions.created')} - {sessions.map((session, i) => ( -
-
-

{session.client_name}

-
- {session.scopes.map(scope => ( - - {scope} - - ))} + {sessions.map((session, i) => { + const expanded = expandedScopes.has(session.id) + const visible = expanded ? session.scopes : session.scopes.slice(0, SCOPES_PREVIEW) + const hidden = session.scopes.length - SCOPES_PREVIEW + return ( +
+
+

{session.client_name}

+
+ {visible.map(scope => ( + + {scope} + + ))} + {!expanded && hidden > 0 && ( + + )} + {expanded && hidden > 0 && ( + + )} +
+
+ + {session.username} +
+ + {new Date(session.created_at).toLocaleDateString(locale)} + +
-
- - {session.username} -
- - {new Date(session.created_at).toLocaleDateString(locale)} - - -
- ))} + ) + })} )}