Fix: eagerload series.sets i admin og API (MissingGreenlet i async mode)
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Admin — Serier{% endblock %}
|
||||
{% block content %}
|
||||
<a href="/admin" style="color:var(--text-muted);text-decoration:none;font-size:0.9rem;">← Admin</a>
|
||||
<h1 style="margin-top:12px;">📦 Serier</h1>
|
||||
|
||||
<div style="display:flex;gap:24px;flex-wrap:wrap;margin:20px 0;">
|
||||
<div class="card" style="flex:1;min-width:280px;">
|
||||
<h3>Opret serie</h3>
|
||||
<form onsubmit="createSerie(event)" style="display:flex;flex-direction:column;gap:10px;margin-top:12px;">
|
||||
<input type="text" id="serie-name" placeholder="Navn (f.eks. Sword & Shield)" required>
|
||||
<input type="text" id="serie-desc" placeholder="Beskrivelse (valgfri)">
|
||||
<button class="btn btn-primary">Opret</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="card" style="flex:1;min-width:280px;">
|
||||
<h3>CSV-import</h3>
|
||||
<p style="font-size:0.85rem;color:var(--text-muted);margin:8px 0;">
|
||||
Kolonner: <code>name,description</code>
|
||||
<br><a href="/api/admin/templates/series.csv" style="color:var(--accent);">Download skabelon</a>
|
||||
</p>
|
||||
<form onsubmit="importSeries(event)" style="display:flex;flex-direction:column;gap:10px;">
|
||||
<input type="file" id="series-csv" accept=".csv" required>
|
||||
<button class="btn btn-primary">Importer</button>
|
||||
</form>
|
||||
<div id="series-import-result" style="margin-top:8px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2>Eksisterende serier</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr><th>Navn</th><th>Sæt</th><th>Handling</th></tr>
|
||||
</thead>
|
||||
<tbody id="series-list">
|
||||
{% for s in series %}
|
||||
<tr id="serie-{{ s.id }}">
|
||||
<td><strong>{{ s.name }}</strong></td>
|
||||
<td>{{ s.sets|length }}</td>
|
||||
<td>
|
||||
<button class="btn btn-danger btn-sm" onclick="deleteSerie({{ s.id }})">Slet</button>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% if series|length == 0 %}
|
||||
<div class="card" style="text-align:center;color:var(--text-muted);margin-top:16px;">
|
||||
<p>Ingen serier endnu.</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<script>
|
||||
async function createSerie(e) {
|
||||
e.preventDefault();
|
||||
const name = document.getElementById('serie-name').value.trim();
|
||||
const desc = document.getElementById('serie-desc').value.trim();
|
||||
if (!name) return;
|
||||
const res = await fetch('/api/admin/series', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({name, description: desc || null})
|
||||
});
|
||||
const data = await res.json();
|
||||
if (data.ok) {
|
||||
location.reload();
|
||||
} else {
|
||||
alert(data.detail || 'Fejl');
|
||||
}
|
||||
}
|
||||
|
||||
async function deleteSerie(id) {
|
||||
if (!confirm('Slet denne serie og alle dens sæt og kort?')) return;
|
||||
const res = await fetch('/api/admin/series/' + id, {method: 'DELETE'});
|
||||
const data = await res.json();
|
||||
if (data.ok) {
|
||||
document.getElementById('serie-' + id).remove();
|
||||
} else {
|
||||
alert('Fejl ved sletning');
|
||||
}
|
||||
}
|
||||
|
||||
async function importSeries(e) {
|
||||
e.preventDefault();
|
||||
const file = document.getElementById('series-csv').files[0];
|
||||
if (!file) return;
|
||||
const form = new FormData();
|
||||
form.append('file', file);
|
||||
const res = await fetch('/api/admin/series/import', {method: 'POST', body: form});
|
||||
const data = await res.json();
|
||||
const el = document.getElementById('series-import-result');
|
||||
if (data.ok) {
|
||||
el.innerHTML = '<p style="color:green;">✓ ' + data.created + ' serie(r) oprettet</p>';
|
||||
if (data.errors.length) {
|
||||
el.innerHTML += '<p style="color:var(--accent);">' + data.errors.join('<br>') + '</p>';
|
||||
}
|
||||
setTimeout(() => location.reload(), 1500);
|
||||
} else {
|
||||
el.innerHTML = '<p style="color:var(--accent);">Fejl ved import</p>';
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user