{error}
} + + {loading ? ( +Loading…
+ ) : entries.length === 0 ? ( +No audit entries.
+ ) : ( +| When | +Actor | +Action | +Target | +Details | +
|---|---|---|---|---|
| {formatDate(e.created_at)} | ++ {e.actor_email ?? e.actor_id ?? '—'} + | +{e.action} | ++ {e.target_type ? `${e.target_type}:` : ''} + {e.target_id ?? ''} + | +
+
+ {JSON.stringify(e.details ?? {})}
+
+ |
+
No users yet.
+ ) : ( +| Joined | +|
|---|---|
| + + {u.email ?? u.id} + + | +{formatDate(u.created_at)} | +
None over quota.
+ ) : ( +| Subdomain | +Usage | +
|---|---|
| {t.subdomain} | ++ {formatBytes(t.bytes_used)} / {formatBytes(t.quota_bytes)} + | +
{error}
} + {notice &&{notice}
} +Loading…
+ ) : reserved.length === 0 ? ( +None reserved in the database.
+ ) : ( +| Name | +Added | ++ |
|---|---|---|
| {r.name} | +{formatDate(r.created_at)} | ++ + | +
+ These are hardcoded in the app and always reserved (cannot be removed + here). +
+{error}
} + {notice &&{notice}
} + + {loading ? ( +Loading…
+ ) : tunnels.length === 0 ? ( +No tunnels found.
+ ) : ( +| Subdomain | +Owner | +Status | +Usage | +Last seen | +Actions | +
|---|---|---|---|---|---|
| {t.subdomain} | ++ {t.owner_email ?? '—'} + | ++ {t.is_active ? ( + active + ) : ( + inactive + )} + | +
+
+ {formatBytes(t.bytes_used)} / {formatBytes(t.quota_bytes)}
+
+
+ = 100
+ ? 'var(--danger)'
+ : 'var(--accent)',
+ }}
+ />
+
+ |
+ {formatDate(t.last_seen_at)} | +
+
+
+
+
+
+
+
+
+ |
+
+ ← Users +
+No tunnel claimed.
+ )} +| When | +Action | +By | +Details | +
|---|---|---|---|
| {formatDate(a.created_at)} | +{a.action} | +{a.actor_email ?? '—'} | +
+
+ {JSON.stringify(a.details ?? {})}
+
+ |
+
No audit entries.
+ )} +{error}
} + {success &&{success}
} +{error}
} + + {loading ? ( +Loading…
+ ) : users.length === 0 ? ( +No users found.
+ ) : ( +| Role | +Status | +Tunnel | +Usage | +Created | +|
|---|---|---|---|---|---|
| + + {u.email ?? u.id} + + | ++ {u.role === 'admin' ? ( + admin + ) : ( + user + )} + | ++ {isBanned(u) ? ( + banned + ) : u.email_confirmed_at ? ( + confirmed + ) : ( + unconfirmed + )} + | +{u.tunnel ? u.tunnel.subdomain : '—'} | ++ {u.tunnel + ? `${formatBytes(u.tunnel.bytes_used)} / ${formatBytes( + u.tunnel.quota_bytes, + )}` + : '—'} + | +{formatDate(u.created_at)} | +