Moderation: Foto-Freigabe repariert (rasse_id join, delegate an wiki-API), SW by-v364

This commit is contained in:
rene 2026-04-25 09:41:56 +02:00
parent d603b7bae1
commit 034f7ef21f
3 changed files with 42 additions and 61 deletions

View file

@ -164,10 +164,12 @@ window.Page_moderation = (() => {
<div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));
gap:var(--space-4)">
${fotos.map(f => `
<div class="card" style="padding:var(--space-4)">
<img src="${_esc(f.foto_url)}" alt=""
style="width:100%;height:140px;object-fit:cover;
border-radius:var(--radius-md);margin-bottom:var(--space-3)">
<div class="card" style="padding:var(--space-4)" data-id="${f.id}">
<a href="#wiki?rasse=${_esc(f.rasse_slug)}" style="display:block;text-decoration:none">
<img src="${_esc(f.foto_url)}" alt=""
style="width:100%;height:140px;object-fit:cover;
border-radius:var(--radius-md);margin-bottom:var(--space-3)">
</a>
<div style="font-weight:var(--weight-semibold);font-size:var(--text-sm)">
${_esc(f.rasse_name || f.rasse_slug)}
</div>
@ -183,18 +185,18 @@ window.Page_moderation = (() => {
background:#fef9c3;color:#92400e"> Keine Bestätigung</span>`}
</div>
${f.aktuell_foto ? `
<div style="font-size:var(--text-xs);color:var(--c-text-muted);margin-bottom:4px">Aktuell:</div>
<img src="${_esc(f.aktuell_foto)}" alt="Aktuell"
style="width:100%;height:80px;object-fit:cover;
style="width:100%;height:70px;object-fit:cover;
border-radius:var(--radius-sm);opacity:.5;
margin-bottom:var(--space-2)">
<div style="font-size:var(--text-xs);color:var(--c-text-muted);
margin-bottom:var(--space-3)">aktuelles Foto</div>
` : ''}
margin-bottom:var(--space-3)">
` : `<div style="font-size:var(--text-xs);color:var(--c-warning);
margin-bottom:var(--space-3)">Noch kein Foto vorhanden</div>`}
<div style="display:flex;gap:var(--space-2)">
<button class="btn btn-sm btn-primary mod-foto-approve"
data-id="${f.id}" style="flex:1">Freigeben</button>
data-id="${f.id}" style="flex:1"> Freigeben</button>
<button class="btn btn-sm btn-ghost mod-foto-reject"
data-id="${f.id}" style="color:var(--c-danger)">Ablehnen</button>
data-id="${f.id}" style="color:var(--c-danger)"> Ablehnen</button>
</div>
</div>
`).join('')}
@ -204,23 +206,26 @@ window.Page_moderation = (() => {
el.querySelectorAll('.mod-foto-approve').forEach(btn => {
btn.addEventListener('click', async () => {
btn.disabled = true;
btn.textContent = '…';
try {
await API.patch(`/moderation/fotos/${btn.dataset.id}`, { action: 'approve' });
UI.toast.success('Foto freigegeben.');
UI.toast('Foto freigegeben.', 'success');
await _loadFotos(el);
} catch (e) { UI.toast.error(e.message); btn.disabled = false; }
} catch (e) { UI.toast(e.message, 'danger'); btn.disabled = false; btn.textContent = '✓ Freigeben'; }
});
});
el.querySelectorAll('.mod-foto-reject').forEach(btn => {
btn.addEventListener('click', async () => {
const reason = prompt('Ablehnungsgrund (optional, wird dem User angezeigt):');
if (reason === null) return;
btn.disabled = true;
try {
await API.patch(`/moderation/fotos/${btn.dataset.id}`, {
action: 'reject',
reject_reason: 'Nicht geeignet.'
reject_reason: reason || 'Foto entspricht nicht den Anforderungen.'
});
UI.toast.success('Foto abgelehnt.');
UI.toast('Einreichung abgelehnt.', 'info');
await _loadFotos(el);
} catch (e) { UI.toast.error(e.message); btn.disabled = false; }
});