Changeset 0.23.2 (#155)
This commit is contained in:
@@ -47,6 +47,7 @@ const ADMIN_LOADERS = {
|
||||
usage: () => UI.loadAdminUsage(),
|
||||
audit: () => UI.loadAuditLog(),
|
||||
stats: () => UI.loadAdminStats(),
|
||||
channels: () => UI.loadAdminChannels(),
|
||||
};
|
||||
|
||||
// Find which category a section belongs to
|
||||
@@ -1447,4 +1448,55 @@ Object.assign(UI, {
|
||||
prev.style.color = fg;
|
||||
},
|
||||
|
||||
// ── Admin Channels (v0.23.2) ──────────────
|
||||
|
||||
async loadAdminChannels() {
|
||||
const list = document.getElementById('adminArchivedList');
|
||||
const countEl = document.getElementById('adminArchivedCount');
|
||||
const modeEl = document.getElementById('adminRetentionMode');
|
||||
if (!list) return;
|
||||
|
||||
try {
|
||||
const resp = await API._get('/api/v1/admin/channels/archived');
|
||||
const channels = resp.channels || [];
|
||||
if (countEl) countEl.textContent = channels.length;
|
||||
if (modeEl) modeEl.textContent = resp.retention_mode || 'flexible';
|
||||
|
||||
if (channels.length === 0) {
|
||||
list.innerHTML = '<div class="empty-hint">No archived channels</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
let html = '<table class="admin-table"><thead><tr>' +
|
||||
'<th>Title</th><th>Type</th><th>Owner</th><th>Messages</th><th>Archived</th><th></th>' +
|
||||
'</tr></thead><tbody>';
|
||||
for (const ch of channels) {
|
||||
const age = _relativeTime(ch.updated_at);
|
||||
html += `<tr>
|
||||
<td>${esc(ch.title || 'Untitled')}</td>
|
||||
<td>${esc(ch.type)}</td>
|
||||
<td>${esc(ch.owner_name)}</td>
|
||||
<td>${ch.message_count}</td>
|
||||
<td>${age}</td>
|
||||
<td><button class="btn-small btn-danger" onclick="UI._purgeChannel('${ch.id}')">Purge</button></td>
|
||||
</tr>`;
|
||||
}
|
||||
html += '</tbody></table>';
|
||||
list.innerHTML = html;
|
||||
} catch (e) {
|
||||
list.innerHTML = `<div class="empty-hint">Failed to load: ${esc(e.message)}</div>`;
|
||||
}
|
||||
},
|
||||
|
||||
async _purgeChannel(channelId) {
|
||||
if (!await showConfirm('Permanently delete this archived channel and all its messages? This cannot be undone.')) return;
|
||||
try {
|
||||
await API._del(`/api/v1/admin/channels/${channelId}/purge`);
|
||||
UI.toast('Channel purged', 'success');
|
||||
UI.loadAdminChannels(); // refresh list
|
||||
} catch (e) {
|
||||
UI.toast('Purge failed: ' + e.message, 'error');
|
||||
}
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user