diff --git a/drb-frontend/app/admin/page.tsx b/drb-frontend/app/admin/page.tsx index 6b83723..05a2bfc 100644 --- a/drb-frontend/app/admin/page.tsx +++ b/drb-frontend/app/admin/page.tsx @@ -85,7 +85,7 @@ function fmtDatetime(iso: string | null | undefined) { const ROLE_COLORS: Record = { admin: "bg-indigo-900 text-indigo-300", operator: "bg-green-900 text-green-300", - viewer: "bg-gray-800 text-gray-400", + viewer: "bg-raised text-ink-2", }; function RoleBadge({ role }: { role: UserRole }) { @@ -136,14 +136,14 @@ function FeaturesTab() { )} {loading ? ( -

Loading…

+

Loading…

) : ( -
+
{FLAG_META.map(({ key, label, description }) => (

{label}

-

{description}

+

{description}

-

+

Fetches recent incidents with per-call correlation debug fields, plus orphaned calls. Copy the JSON and paste it to Claude to diagnose correlation problems.

- + setLimit(Math.min(100, Math.max(1, Number(e.target.value))))} - className="w-24 bg-gray-800 border border-gray-700 rounded-lg px-3 py-1.5 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" + className="w-24 bg-raised border border-line-strong rounded-lg px-3 py-1.5 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" />
- + setOrphanHours(Math.min(168, Math.max(1, Number(e.target.value))))} - className="w-28 bg-gray-800 border border-gray-700 rounded-lg px-3 py-1.5 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" + className="w-28 bg-raised border border-line-strong rounded-lg px-3 py-1.5 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" />
@@ -295,22 +295,22 @@ function CorrelationDebugTab() { {meta && Object.keys(pathCounts).length > 0 && (
-
-

corr_path distribution

+
+

corr_path distribution

{Object.entries(pathCounts).sort((a, b) => b[1] - a[1]).map(([path, n]) => (
- {path} + {path} {n}
))}
-
-

fit_signal distribution

+
+

fit_signal distribution

{Object.keys(signalCounts).length === 0 - ?

No signal data yet — deploy correlator update first

+ ?

No signal data yet — deploy correlator update first

: Object.entries(signalCounts).sort((a, b) => b[1] - a[1]).map(([sig, n]) => (
- {sig} + {sig} {n}
)) @@ -320,13 +320,13 @@ function CorrelationDebugTab() { )} {meta?.orphans_by_talkgroup && meta.orphans_by_talkgroup.length > 0 && ( -
-

orphans by talkgroup

+
+

orphans by talkgroup

{meta.orphans_by_talkgroup.map((tg) => (
- {tg.talkgroup_name} ({tg.talkgroup_id}) - - {tg.count} total · {tg.no_type_count} no-type · {tg.sweep_exhausted_count} exhausted + {tg.talkgroup_name} ({tg.talkgroup_id}) + + {tg.count} total · {tg.no_type_count} no-type · {tg.sweep_exhausted_count} exhausted
))} @@ -336,7 +336,7 @@ function CorrelationDebugTab() { {json && (
           {json}
         
@@ -455,13 +455,13 @@ function UserDetailPanel({ const isSelf = user.uid === currentUid; return ( -
+

{detail.email}

-

{detail.uid}

+

{detail.uid}

- +
{error && ( @@ -472,21 +472,21 @@ function UserDetailPanel({
- + setEditName(e.target.value)} - className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-1.5 text-white text-sm focus:outline-none focus:border-indigo-500" + className="w-full bg-raised border border-line-strong rounded-lg px-3 py-1.5 text-white text-sm focus:outline-none focus:border-indigo-500" placeholder="Full name" />
- + setEditNodes(e.target.value)} - className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-1.5 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" + className="w-full bg-raised border border-line-strong rounded-lg px-3 py-1.5 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" placeholder="node-abc123, node-def456" />
@@ -517,10 +517,10 @@ function UserDetailPanel({
-
+
- Organization - + Organization + {!detail.org_id ? "None: sees no data" : detail.org_id === myOrgId @@ -538,34 +538,34 @@ function UserDetailPanel({ )}
- Status + Status {detail.disabled ? "Disabled" : "Active"}
- Discord - + Discord + {detail.discord_linked ? `@${detail.discord_username ?? detail.discord_user_id}` : "Not linked"}
- Created - {fmtDate(detail.creation_time)} + Created + {fmtDate(detail.creation_time)}
- Last sign-in - {fmtDate(detail.last_sign_in)} + Last sign-in + {fmtDate(detail.last_sign_in)}
{(detail.sessions?.length ?? 0) > 0 && ( -
+
@@ -667,19 +667,19 @@ function CreateUserModal({ if (inviteLink) { return (
-
+

User Created

-

+

Share this one-time invite link with the new user so they can set their password. It expires after use.

-
+

{inviteLink}

@@ -697,37 +697,37 @@ function CreateUserModal({ return (
-
+

Create User

- + setEmail(e.target.value)} required - className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-indigo-500" + className="w-full bg-raised border border-line-strong rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-indigo-500" placeholder="user@example.com" />
-
- + setNodeIds(e.target.value)} required - className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-2 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" + className="w-full bg-raised border border-line-strong rounded-lg px-3 py-2 text-white text-sm font-mono focus:outline-none focus:border-indigo-500" placeholder="node-abc123, node-def456" />
@@ -760,7 +760,7 @@ function CreateUserModal({ @@ -820,7 +820,7 @@ function UsersTab({ currentUid }: { currentUid: string }) { )}
-

{users.length} user{users.length !== 1 ? "s" : ""}

+

{users.length} user{users.length !== 1 ? "s" : ""}