Really-amin's picture
Upload 303 files
b068b76 verified
const adminFeedback = () => window.UIFeedback || {};
const $ = (id) => document.getElementById(id);
function renderProviders(providers = []) {
const table = $('providers-table');
if (!table) return;
if (!providers.length) {
table.innerHTML = '<tr><td colspan="4" class="empty-state">No providers configured.</td></tr>';
return;
}
table.innerHTML = providers
.map((provider) => `
<tr data-provider-id="${provider.provider_id || provider.name}">
<td>${provider.name || provider.provider_id}</td>
<td><span class="badge ${provider.status || 'info'}">${provider.status || 'unknown'}</span></td>
<td>${provider.response_time_ms ?? '-'}</td>
<td>${provider.category || provider.provider_category || 'n/a'}</td>
</tr>`)
.join('');
}
function renderDetail(detail) {
if (!detail) return;
$('selected-provider').textContent = detail.provider_id || detail.name;
$('provider-detail-list').innerHTML = `
<li><span>Status</span><span><span class="badge ${detail.status || 'info'}">${
detail.status || 'unknown'
}</span></span></li>
<li><span>Response</span><span>${detail.response_time_ms ?? 0} ms</span></li>
<li><span>Priority</span><span>${detail.priority ?? 'n/a'}</span></li>
<li><span>Auth</span><span>${detail.requires_auth ? 'Yes' : 'No'}</span></li>
<li><span>Base URL</span><span style="font-size:0.78rem;color:var(--ui-text-muted);">${
detail.base_url || '-'
}</span></li>`;
}
function renderConfig(config) {
$('config-summary').textContent = `${config.total || 0} providers`;
$('config-list').innerHTML =
Object.entries(config.providers || {})
.slice(0, 8)
.map(([key, value]) => `<li><span>${value.name || key}</span><span>${value.category || value.chain || 'n/a'}</span></li>`)
.join('') || '<li class="empty-state"><span>No config loaded.</span></li>';
}
function renderLogs(logs = []) {
$('logs-list').innerHTML =
logs
.map((log) => `<div class="stream-item"><strong>${log.timestamp || ''}</strong><div>${log.endpoint || ''} Â| ${log.status || ''}</div></div>`)
.join('') || '<div class="stream-item empty-state">No logs yet.</div>';
}
function renderAlerts(alerts = []) {
$('alerts-list').innerHTML =
alerts
.map((alert) => `<div class="alert ${alert.severity || 'info'}"><span>${alert.message || ''}</span><span>${alert.timestamp || ''}</span></div>`)
.join('') || '<div class="alert info">No alerts at the moment.</div>';
}
async function bootstrapAdmin() {
adminFeedback().showLoading?.($('providers-table'), 'Loading providers…');
try {
const payload = await adminFeedback().fetchJSON?.('/api/providers', {}, 'Providers');
renderProviders(payload.providers);
$('providers-count').textContent = `${payload.total || payload.providers?.length || 0} providers`;
$('providers-table').addEventListener('click', async (event) => {
const row = event.target.closest('tr[data-provider-id]');
if (!row) return;
const providerId = row.dataset.providerId;
adminFeedback().showLoading?.($('provider-detail-list'), 'Fetching details…');
try {
const detail = await adminFeedback().fetchJSON?.(
`/api/providers/${encodeURIComponent(providerId)}/health`,
{},
'Provider health',
);
renderDetail({ provider_id: providerId, ...detail });
} catch {}
});
} catch {}
try {
const config = await adminFeedback().fetchJSON?.('/api/providers/config', {}, 'Providers config');
renderConfig(config);
} catch {}
try {
const logs = await adminFeedback().fetchJSON?.('/api/logs?limit=20', {}, 'Logs');
renderLogs(logs.logs || logs);
} catch {
renderLogs([]);
}
try {
const alerts = await adminFeedback().fetchJSON?.('/api/alerts', {}, 'Alerts');
renderAlerts(alerts.alerts || []);
} catch {
renderAlerts([]);
}
}
document.addEventListener('DOMContentLoaded', bootstrapAdmin);