From 87e795c837f3b6893725191acf694165fade485b Mon Sep 17 00:00:00 2001 From: Mannu Date: Tue, 2 Jun 2026 21:48:57 +0530 Subject: [PATCH] feat: show user phone in admin users page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Answer to "is phone visible in admin?": it wasn't — added it. - /api/admin/users: SELECT u.phone, return phone in the DTO - admin users page: new Phone column (tap-to-call tel: link, "—" when empty), searchable by phone, included in CSV export (now properly quoted so commas/empty cells don't shift columns) Co-Authored-By: Claude Opus 4.8 --- src/app/admin/users/page.tsx | 21 ++++++++++++++++----- src/app/api/admin/users/route.ts | 2 ++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/app/admin/users/page.tsx b/src/app/admin/users/page.tsx index 332703d..9dedaca 100644 --- a/src/app/admin/users/page.tsx +++ b/src/app/admin/users/page.tsx @@ -7,6 +7,7 @@ interface User { id: string; email: string; name: string; + phone?: string | null; familyId: string; familyName: string; createdAt: string; @@ -122,13 +123,17 @@ export default function AdminUsers() { const filteredUsers = users.filter((u) => u.email.toLowerCase().includes(search.toLowerCase()) || - (u.name || "").toLowerCase().includes(search.toLowerCase()) + (u.name || "").toLowerCase().includes(search.toLowerCase()) || + (u.phone || "").includes(search) ); const exportCSV = () => { - const headers = ["Email", "Name", "Family", "Created"]; - const rows = filteredUsers.map((u) => [u.email, u.name, u.familyName, u.createdAt]); - const csv = [headers, ...rows].map((row) => row.join(",")).join("\n"); + const headers = ["Email", "Name", "Phone", "Family", "Created"]; + const rows = filteredUsers.map((u) => [u.email, u.name, u.phone || "", u.familyName, u.createdAt]); + // Quote each cell so commas/empties don't shift columns + const csv = [headers, ...rows] + .map((row) => row.map((cell) => `"${String(cell ?? "").replace(/"/g, '""')}"`).join(",")) + .join("\n"); const blob = new Blob([csv], { type: "text/csv" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); @@ -206,7 +211,7 @@ export default function AdminUsers() { setSearch(e.target.value)} /> @@ -216,6 +221,7 @@ export default function AdminUsers() { User + Phone Family Password Joined @@ -229,6 +235,11 @@ export default function AdminUsers() {
{user.name || user.email}
{user.email}
+ + {user.phone + ? {user.phone} + : } + {user.familyName || }