Add song-level report triage
This commit is contained in:
@@ -532,6 +532,7 @@
|
||||
<h1 class="page">Reported lines</h1>
|
||||
<p class="lead">Listeners flag lines that look wrong. Fix one in the editor and its report closes itself; or mark it resolved if it was fine.</p>
|
||||
<div class="row" style="margin-bottom:14px">
|
||||
<label>Age<select class="field" id="reportAge"><option value="0">Any age</option><option value="7">7+ days</option><option value="30">30+ days</option><option value="90">90+ days</option></select></label>
|
||||
<div class="seg" role="group" aria-label="Status">
|
||||
<button id="fOpen" type="button" aria-pressed="true">Open</button>
|
||||
<button id="fRes" type="button" aria-pressed="false">Resolved</button>
|
||||
@@ -1320,7 +1321,8 @@
|
||||
async function loadReports() {
|
||||
const box = $('repList');
|
||||
box.innerHTML = '<div class="empty">Loading…</div>';
|
||||
const j = await api('/api/admin/flags?status=' + repStatus);
|
||||
const age = Number($('reportAge')?.value || 0);
|
||||
const j = await api(`/api/admin/flags?status=${repStatus}&olderThanDays=${age}`);
|
||||
if (!j.ok) { box.innerHTML = `<div class="empty">${esc(j.error || 'failed')}</div>`; return; }
|
||||
setBadge(j.open);
|
||||
if (!j.flags.length) {
|
||||
@@ -1341,6 +1343,7 @@
|
||||
<div style="min-width:0"><h2>${esc(s.title || vid)}</h2><span class="muted" style="font-size:12.5px">${esc(s.channel || '')} <code>${esc(vid)}</code></span></div>
|
||||
<span class="grow"></span>
|
||||
<button class="btn sm pri" data-fix="${esc(vid)}">Open in editor</button>
|
||||
${repStatus === 'open' ? `<button class="btn sm" data-resolve-song="${esc(vid)}">Resolve all for song</button>` : ''}
|
||||
</div>
|
||||
<div class="lines">${[...s.lines].map(([text, fl]) => `
|
||||
<div class="ln flagged" style="padding:12px">
|
||||
@@ -1362,6 +1365,12 @@
|
||||
$('repList').addEventListener('click', async (e) => {
|
||||
const b = e.target.closest('button'); if (!b) return;
|
||||
if (b.dataset.fix) { leOpen(b.dataset.fix, b.dataset.text); return; }
|
||||
if (b.dataset.resolveSong) {
|
||||
if (!confirm(`Resolve every open report for ${b.dataset.resolveSong}?`)) return;
|
||||
const result = await api(`/api/admin/flags/song/${encodeURIComponent(b.dataset.resolveSong)}/resolve`, { method: 'POST', body: {} });
|
||||
if (!result.ok) alert(result.error || 'Could not resolve reports');
|
||||
await loadReports(); leReloadFlagsOnly(); return;
|
||||
}
|
||||
const each = async (ids, fn) => { for (const id of ids.split(',')) await fn(id); await loadReports(); leReloadFlagsOnly(); };
|
||||
if (b.dataset.resall) each(b.dataset.resall, (id) => api(`/api/admin/flags/${id}`, { method: 'POST', body: { status: 'resolved' } }));
|
||||
else if (b.dataset.reopen) each(b.dataset.reopen, (id) => api(`/api/admin/flags/${id}`, { method: 'POST', body: { status: 'open' } }));
|
||||
@@ -1375,6 +1384,7 @@
|
||||
}
|
||||
$('fOpen').addEventListener('click', () => setFilter('open'));
|
||||
$('fRes').addEventListener('click', () => setFilter('resolved'));
|
||||
$('reportAge').addEventListener('change', loadReports);
|
||||
$('repRefresh').addEventListener('click', loadReports);
|
||||
|
||||
/* ========================================================================
|
||||
|
||||
Reference in New Issue
Block a user