/* ============================================================ MCLogger – main.js Author: SimolZimol ============================================================ */ // ── Sidebar Toggle ──────────────────────────────────────── document.addEventListener('DOMContentLoaded', () => { const btn = document.getElementById('sidebarToggle'); const sidebar = document.getElementById('sidebar'); if (btn && sidebar) { btn.addEventListener('click', () => { sidebar.classList.toggle('collapsed'); localStorage.setItem('sidebar-collapsed', sidebar.classList.contains('collapsed')); }); // Zustand beim Laden wiederherstellen if (localStorage.getItem('sidebar-collapsed') === 'true') { sidebar.classList.add('collapsed'); } } // Online-Count aktualisieren updateOnlineCount(); setInterval(updateOnlineCount, 30_000); // Tooltips initialisieren document.querySelectorAll('[data-bs-toggle="tooltip"]').forEach(el => { new bootstrap.Tooltip(el); }); // Automatisch Tabellen sortieren ermöglichen initTableSort(); }); // ── Online-Count API ────────────────────────────────────── function updateOnlineCount() { fetch('/api/online') .then(r => r.json()) .then(data => { const el = document.getElementById('online-count'); if (el) el.textContent = data.length; }) .catch(() => {/* Ignorieren wenn nicht eingeloggt */}); } // ── Einfache Tabellen-Sortierung ────────────────────────── function initTableSort() { document.querySelectorAll('th[data-sort]').forEach(th => { th.style.cursor = 'pointer'; th.addEventListener('click', () => { const table = th.closest('table'); const idx = Array.from(th.parentNode.children).indexOf(th); const asc = th.dataset.order !== 'asc'; th.dataset.order = asc ? 'asc' : 'desc'; const rows = Array.from(table.querySelectorAll('tbody tr')); rows.sort((a, b) => { const av = a.cells[idx]?.textContent.trim() ?? ''; const bv = b.cells[idx]?.textContent.trim() ?? ''; return asc ? av.localeCompare(bv, 'de', {numeric: true}) : bv.localeCompare(av, 'de', {numeric: true}); }); const tbody = table.querySelector('tbody'); rows.forEach(r => tbody.appendChild(r)); }); }); } // ── Formatierung ────────────────────────────────────────── function fmtDuration(sec) { sec = parseInt(sec) || 0; const h = Math.floor(sec / 3600); const m = Math.floor((sec % 3600) / 60); const s = sec % 60; if (h) return `${h}h ${m}m`; if (m) return `${m}m ${s}s`; return `${s}s`; } // ── Live-Chat-Reload (optional) ─────────────────────────── if (window.location.pathname === '/chat') { // Kein automatisches Reload im Chat (würde Filter zurücksetzen) } // ── Kopieren in Zwischenablage ──────────────────────────── document.querySelectorAll('.copy-btn').forEach(btn => { btn.addEventListener('click', () => { const target = document.querySelector(btn.dataset.target); if (target) { navigator.clipboard.writeText(target.textContent.trim()) .then(() => { btn.innerHTML = ''; setTimeout(() => btn.innerHTML = '', 1500); }); } }); });