84 lines
3.0 KiB
HTML
84 lines
3.0 KiB
HTML
@include(snippets/header)
|
|
<div id="main">
|
|
<div class="container">
|
|
<h1>APPROVAL QUEUE</h1>
|
|
<p>Items here are pending approval.</p>
|
|
<table class="table" style="width: 100%">
|
|
<thead>
|
|
<tr>
|
|
<td>Preview</td>
|
|
<td>ID</td>
|
|
<td>Uploader</td>
|
|
<td>Type</td>
|
|
<td>Action</td>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@each(posts as post)
|
|
<tr>
|
|
<td>
|
|
<video controls loop muted preload="metadata" style="max-height: 200px; max-width: 300px;">
|
|
<source src="/b/{{ post.dest }}" type="{{ post.mime }}">
|
|
</video>
|
|
</td>
|
|
<td>{{ post.id }}</td>
|
|
<td>{{ post.username }}</td>
|
|
<td>{{ post.mime }}</td>
|
|
<td>
|
|
<a href="/admin/approve/?id={{ post.id }}" class="badge badge-success">Approve</a>
|
|
<a href="/admin/deny/?id={{ post.id }}" class="badge badge-danger btn-deny-async">Deny /
|
|
Delete</a>
|
|
</td>
|
|
</tr>
|
|
@endeach
|
|
@if(posts.length === 0)
|
|
<tr>
|
|
<td colspan="5">No pending items.</td>
|
|
</tr>
|
|
@endif
|
|
</tbody>
|
|
</table>
|
|
<br>
|
|
@if(typeof pages !== 'undefined' && pages > 1)
|
|
<div class="pagination" style="display: flex; gap: 10px; align-items: center; justify-content: center;">
|
|
@if(page > 1)
|
|
<a href="/admin/approve?page={{ page - 1 }}" class="badge badge-secondary">« Prev</a>
|
|
@endif
|
|
<span>Page {{ page }} of {{ pages }}</span>
|
|
@if(page < pages) <a href="/admin/approve?page={{ page + 1 }}" class="badge badge-secondary">Next
|
|
»</a>
|
|
@endif
|
|
</div>
|
|
<br>
|
|
@endif
|
|
<a href="/admin">Back to Admin</a>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
document.querySelectorAll('.btn-deny-async').forEach(btn => {
|
|
btn.addEventListener('click', async e => {
|
|
e.preventDefault();
|
|
if (!confirm('Permanently delete this item?')) return;
|
|
|
|
const url = btn.href;
|
|
const row = btn.closest('tr');
|
|
const originalText = btn.innerText;
|
|
btn.innerText = 'Deleting...';
|
|
|
|
try {
|
|
const res = await fetch(url);
|
|
if (res.ok) {
|
|
row.style.opacity = '0';
|
|
setTimeout(() => row.remove(), 500);
|
|
} else {
|
|
alert('Delete request failed');
|
|
btn.innerText = originalText;
|
|
}
|
|
} catch (err) {
|
|
alert('Error: ' + err);
|
|
btn.innerText = originalText;
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
@include(snippets/footer) |