From 1f85c73a39ba3d23ce619ddeb535867da70db8d3 Mon Sep 17 00:00:00 2001 From: viettranx Date: Thu, 2 Apr 2026 23:30:14 +0700 Subject: [PATCH] fix(ui): resolve raw user IDs to display names across web UI Extract shared formatUserLabel util and wire useContactResolver into 15 pages that previously showed raw numeric IDs (e.g. 386246614) instead of human-readable names. - Add formatUserLabel with display hierarchy: name > @username > #id - Fix MultiUserPicker badges (covers all allow/deny lists) - Fix permissions, tenant users, overview cards, traces, nodes - Remove redundant raw ID spans from permissions and pending messages - Delete duplicate formatScopeLabel/parseUserDisplay local functions --- .../components/shared/multi-user-picker.tsx | 5 ++- ui/web/src/lib/format-user-label.ts | 31 +++++++++++++++++++ .../agent-detail/agent-permissions-tab.tsx | 16 +++++++--- .../workspace-sharing-section.tsx | 5 ++- .../events/event-sections/event-card.tsx | 3 +- .../src/pages/memory/memory-create-dialog.tsx | 13 ++------ ui/web/src/pages/memory/memory-page.tsx | 23 ++------------ ui/web/src/pages/nodes/nodes-page.tsx | 16 +++++++--- .../pages/overview/connected-clients-card.tsx | 7 ++++- .../src/pages/overview/quota-usage-card.tsx | 7 ++++- .../pages/overview/recent-requests-card.tsx | 7 ++++- .../pending-messages/message-list-dialog.tsx | 1 - .../task-sections/task-detail-comments.tsx | 3 +- .../tenants-admin/tenant-detail-page.tsx | 12 +++++-- ui/web/src/pages/traces/traces-page.tsx | 16 ++++------ 15 files changed, 105 insertions(+), 60 deletions(-) create mode 100644 ui/web/src/lib/format-user-label.ts diff --git a/ui/web/src/components/shared/multi-user-picker.tsx b/ui/web/src/components/shared/multi-user-picker.tsx index e3dce092..af4153f7 100644 --- a/ui/web/src/components/shared/multi-user-picker.tsx +++ b/ui/web/src/components/shared/multi-user-picker.tsx @@ -1,6 +1,8 @@ import { useState } from "react"; import { X } from "lucide-react"; import { Badge } from "@/components/ui/badge"; +import { useContactResolver } from "@/hooks/use-contact-resolver"; +import { formatUserLabel } from "@/lib/format-user-label"; import { UserPickerCombobox } from "./user-picker-combobox"; interface MultiUserPickerProps { @@ -34,6 +36,7 @@ export function MultiUserPicker({ portalContainer, }: MultiUserPickerProps) { const [inputValue, setInputValue] = useState(""); + const { resolve } = useContactResolver(value); const handleCommit = (val: string) => { const trimmed = val.trim(); @@ -59,7 +62,7 @@ export function MultiUserPicker({
{value.map((id) => ( - {id} + {formatUserLabel(id, resolve)}
{writers.map((p) => { - const displayName = p.metadata?.displayName || p.userId; + const label = p.metadata?.displayName || formatUserLabel(p.userId, resolve); const username = p.metadata?.username ? ` @${p.metadata.username}` : ""; return (
@@ -239,11 +248,10 @@ export function AgentPermissionsTab({ agentId }: AgentPermissionsTabProps) { > {p.permission} - {displayName} + {label} {username && ( {username} )} - ({p.userId})