From 98d8b197a9353ea42f5f0e4cc4f9597483ab8450 Mon Sep 17 00:00:00 2001 From: Zak Bearman Date: Sun, 6 Sep 2026 22:47:16 +1200 Subject: [PATCH] Link invite trace accounts to admin user profiles --- frontend/app/admin/invites/page.tsx | 17 +++++++++++++---- frontend/app/globals.css | 12 ++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/frontend/app/admin/invites/page.tsx b/frontend/app/admin/invites/page.tsx index 311ff72..7ba7a47 100644 --- a/frontend/app/admin/invites/page.tsx +++ b/frontend/app/admin/invites/page.tsx @@ -1,6 +1,7 @@ 'use client' import InviteDeliveryChoice from '../../ui/InviteDeliveryChoice' +import Link from 'next/link' import { useRouter } from 'next/navigation' import { useEffect, useMemo, useState } from 'react' @@ -918,6 +919,14 @@ export default function AdminInviteManagementPage() { return invites }, [inviteView, invites]) + const traceUserIds = useMemo(() => new Map(users.map(user => [user.username.trim().toLowerCase(), user.id])), [users]) + const traceAccountLink = (username: string, className?: string) => { + const id = traceUserIds.get(username.trim().toLowerCase()) + return id != null + ? {username} + : {username} + } + const inviteTraceRows = useMemo(() => { const inviteByCode = new Map() invites.forEach((invite) => { @@ -2276,14 +2285,14 @@ export default function AdminInviteManagementPage() { >
- {row.username} + {traceAccountLink(row.username, 'invite-trace-user')} {row.role} {row.authProvider} {row.isCycle && cycle}

{row.inviterUsername - ? `\u2190 Invited by ${row.inviterUsername}` + ? <>← Invited by {traceAccountLink(row.inviterUsername)} : row.inviteCode ? `\u2190 Invited via code ${row.inviteCode}` : 'Direct/root account'} @@ -2319,7 +2328,7 @@ export default function AdminInviteManagementPage() {