feat(frontend): add delete all buttons to admin page
build / Go-Build (push) Successful in 1m31s
docker / docker (push) Successful in 4m17s

This commit is contained in:
2026-06-24 15:56:53 +02:00
parent 9911eaf812
commit 8587b9577a
2 changed files with 50 additions and 9 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/png" href="/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Outfit-Voting Abi26</title> <title>Outfit-Voting Abi26</title>
</head> </head>
+42 -1
View File
@@ -134,6 +134,36 @@ export default function AdminPage() {
}); });
}; };
const handleDeleteCategory = (cat: string) => {
const catIds = options.filter(o => o.Category === cat).map(o => o.ID);
if (catIds.length === 0) return;
openDialog(
"Kategorie leeren?",
`Möchtest du wirklich alle ${catIds.length} Einträge in der Kategorie "${cat}" unwiderruflich löschen?`,
async () => {
await api.bulkDeleteVoteEntries(catIds);
setSelectedIds(new Set([...selectedIds].filter(id => !catIds.includes(id))));
loadData();
closeDialog();
}
);
};
const handleDeleteAll = () => {
if (options.length === 0) return;
openDialog(
"Alle Einträge löschen?",
`ACHTUNG: Möchtest du wirklich ALLE ${options.length} Einträge unwiderruflich löschen?`,
async () => {
const allIds = options.map(o => o.ID);
await api.bulkDeleteVoteEntries(allIds);
setSelectedIds(new Set());
loadData();
closeDialog();
}
);
};
const saveEdit = async (id: string) => { const saveEdit = async (id: string) => {
await api.setVoteCount(id, editVotes); await api.setVoteCount(id, editVotes);
setEditId(null); setEditId(null);
@@ -205,13 +235,19 @@ export default function AdminPage() {
</div> </div>
</div> </div>
{selectedIds.size > 0 && ( {selectedIds.size > 0 ? (
<div className="bulk-actions panel"> <div className="bulk-actions panel">
<span>{selectedIds.size} Einträge ausgewählt</span> <span>{selectedIds.size} Einträge ausgewählt</span>
<button className="btn-danger" onClick={handleBulkDelete}> <button className="btn-danger" onClick={handleBulkDelete}>
<Trash2 size={18} /> Ausgewählte Löschen <Trash2 size={18} /> Ausgewählte Löschen
</button> </button>
</div> </div>
) : options.length > 0 && (
<div className="bulk-actions panel" style={{ justifyContent: 'flex-end' }}>
<button className="btn-danger" onClick={handleDeleteAll}>
<Trash2 size={18} /> Alle Kategorien & Einträge löschen
</button>
</div>
)} )}
<div className="admin-tables"> <div className="admin-tables">
@@ -245,6 +281,7 @@ export default function AdminPage() {
style={{ padding: '0.4rem 0.8rem', borderRadius: 'var(--radius-m)', background: 'rgba(255,255,255,0.05)', border: '1px solid var(--panel-border)', fontSize: '0.9rem', width: '160px' }} style={{ padding: '0.4rem 0.8rem', borderRadius: 'var(--radius-m)', background: 'rgba(255,255,255,0.05)', border: '1px solid var(--panel-border)', fontSize: '0.9rem', width: '160px' }}
/> />
</div> </div>
<div style={{ display: 'flex', gap: '0.5rem' }}>
<button className="btn-icon add-to-cat" onClick={() => { <button className="btn-icon add-to-cat" onClick={() => {
setBulkCategory(cat); setBulkCategory(cat);
window.scrollTo({ top: 0, behavior: 'smooth' }); window.scrollTo({ top: 0, behavior: 'smooth' });
@@ -252,6 +289,10 @@ export default function AdminPage() {
}}> }}>
<Plus size={16} /> Hier hinzufügen <Plus size={16} /> Hier hinzufügen
</button> </button>
<button className="btn-icon delete" onClick={() => handleDeleteCategory(cat)}>
<Trash2 size={16} /> Alle löschen
</button>
</div>
</div> </div>
<table className="admin-table"> <table className="admin-table">
<thead> <thead>