tdfj
This commit is contained in:
parent
fed7951a98
commit
9dc8f554b9
@ -346,4 +346,21 @@ router.post('/members/:id/reviewed', requireAdmin, async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// GET /admin/api/badge-count – für Live-Update
|
||||||
|
router.get('/api/badge-count', requireAdmin, async (req, res) => {
|
||||||
|
try {
|
||||||
|
const [rows] = await db.query(`
|
||||||
|
SELECT
|
||||||
|
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending_count,
|
||||||
|
SUM(CASE WHEN reviewed = 0 AND status = 'active' THEN 1 ELSE 0 END) as new_count
|
||||||
|
FROM memberships
|
||||||
|
`);
|
||||||
|
const total = (rows[0].pending_count || 0) + (rows[0].new_count || 0);
|
||||||
|
res.json({ total, pending: rows[0].pending_count || 0, new: rows[0].new_count || 0 });
|
||||||
|
} catch (err) {
|
||||||
|
res.json({ total: 0, pending: 0, new: 0 });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|||||||
@ -391,6 +391,56 @@
|
|||||||
window.location = '/admin/members/' + id;
|
window.location = '/admin/members/' + id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Live Badge Update alle 30 Sekunden
|
||||||
|
function updateBadge() {
|
||||||
|
fetch('/admin/api/badge-count')
|
||||||
|
.then(r => r.json())
|
||||||
|
.then(data => {
|
||||||
|
const badge = document.querySelector('.nav-badge');
|
||||||
|
if (data.total > 0) {
|
||||||
|
if (badge) {
|
||||||
|
badge.textContent = data.total;
|
||||||
|
} else {
|
||||||
|
// Badge neu erstellen
|
||||||
|
const link = document.querySelector('[onclick*="mitglieder"]');
|
||||||
|
if (link) {
|
||||||
|
const span = document.createElement('span');
|
||||||
|
span.className = 'nav-badge';
|
||||||
|
span.textContent = data.total;
|
||||||
|
link.appendChild(span);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Stat-Karten aktualisieren
|
||||||
|
if (data.new > 0) {
|
||||||
|
let newCard = document.getElementById('stat-new');
|
||||||
|
if (!newCard) {
|
||||||
|
const statsRow = document.querySelector('.stats-row');
|
||||||
|
newCard = document.createElement('div');
|
||||||
|
newCard.id = 'stat-new';
|
||||||
|
newCard.className = 'stat-card stat-card-new';
|
||||||
|
newCard.style.cursor = 'pointer';
|
||||||
|
newCard.onclick = () => showSection('mitglieder', document.querySelector('[onclick*="mitglieder"]'));
|
||||||
|
newCard.innerHTML = '<div class="stat-number" style="color:#0891b2">' + data.new + '</div><div class="stat-label">🆕 Neu</div>';
|
||||||
|
statsRow.appendChild(newCard);
|
||||||
|
} else {
|
||||||
|
newCard.querySelector('.stat-number').textContent = data.new;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const newCard = document.getElementById('stat-new');
|
||||||
|
if (newCard) newCard.remove();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (badge) badge.remove();
|
||||||
|
const newCard = document.getElementById('stat-new');
|
||||||
|
if (newCard) newCard.remove();
|
||||||
|
}
|
||||||
|
}).catch(() => {});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sofort + alle 30 Sekunden
|
||||||
|
updateBadge();
|
||||||
|
setInterval(updateBadge, 30000);
|
||||||
|
|
||||||
function filterMembers() {
|
function filterMembers() {
|
||||||
const q = document.getElementById('memberSearch').value.toLowerCase();
|
const q = document.getElementById('memberSearch').value.toLowerCase();
|
||||||
document.querySelectorAll('.member-row').forEach(row => {
|
document.querySelectorAll('.member-row').forEach(row => {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user