← back to Butlr
views/admin/index.ejs
56 lines
<%- include('../partials/head', { title, meta_desc }) %>
<%- include('../partials/header') %>
<main class="container" style="max-width: 1100px; padding: 24px;">
<h1 style="margin: 0 0 6px;">Butlr Admin</h1>
<p class="muted" style="margin: 0 0 24px;">Signed in as <strong><%= req.user?.email || req.user?.name || 'admin' %></strong> · role: <%= req.user?.role || 'owner' %></p>
<div style="display:grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 20px;">
<a href="/admin/users" class="admin-card">
<div class="admin-card-icon">👥</div>
<h3>Users</h3>
<p class="muted">Add, remove, set roles · <strong><%= users_count %></strong> total</p>
</a>
<a href="/admin/contacts" class="admin-card">
<div class="admin-card-icon">📇</div>
<h3>Contacts</h3>
<p class="muted">Search your Mac contacts · click-to-call · <span id="contacts-status" class="muted">checking...</span></p>
</a>
<a href="/admin/calls" class="admin-card">
<div class="admin-card-icon">📞</div>
<h3>Call history</h3>
<p class="muted">All calls · <strong><%= calls_count %></strong> total · play + transcript</p>
</a>
<a href="/admin/live" class="admin-card" style="border-color: <%= live_count > 0 ? '#dc2626' : 'var(--line)' %>;">
<div class="admin-card-icon"><%= live_count > 0 ? '🔴' : '⚪' %></div>
<h3>Live calls</h3>
<p class="muted"><strong><%= live_count %></strong> active right now · takeover panel</p>
</a>
</div>
<style>
.admin-card { display: block; padding: 24px; border: 1px solid var(--line); border-radius: 12px; background: var(--panel); text-decoration: none; color: var(--ink); transition: transform 0.15s, border-color 0.15s; }
.admin-card:hover { transform: translateY(-2px); border-color: var(--ink-dim); }
.admin-card-icon { font-size: 32px; margin-bottom: 8px; }
.admin-card h3 { margin: 0 0 6px; font-size: 18px; }
.admin-card p { margin: 0; font-size: 13px; }
</style>
<script>
// Probe Mac2 contacts service via Butlr proxy. If unreachable, show offline label.
fetch('/admin/api/contacts-health').then(r => r.json()).then(j => {
const el = document.getElementById('contacts-status');
if (el) el.textContent = j.ok ? (j.count + ' available') : 'service offline';
}).catch(() => { document.getElementById('contacts-status').textContent = 'service offline'; });
</script>
</main>
<%- include('../partials/footer') %>