diff --git a/public/index.html b/public/index.html index 836a4f2..0cc1ae3 100644 --- a/public/index.html +++ b/public/index.html @@ -1,1050 +1,2806 @@ + - - -Blair — Ghost Dashboard - - - - - - - -
-
- - - - - - Mit Discord anmelden - - - - -
-
- - -
Lade...
- - - - - - - - - - - - - - -
-
-
Sicher?
-
-
-
-
-
- - + const entry = { + id: editingCreditId || 'c_' + Date.now().toString(36), + name, + type: document.getElementById('cf-type').value, + role: document.getElementById('cf-role').value.trim(), + avatar: document.getElementById('cf-avatar').value.trim(), + emoji: document.getElementById('cf-emoji').value.trim() || '👤', + desc: document.getElementById('cf-desc').value.trim(), + discord: document.getElementById('cf-discord').value.trim(), + website: document.getElementById('cf-website').value.trim(), + roblox: document.getElementById('cf-roblox').value.trim(), + }; + + if (editingCreditId) { + const idx = credits.findIndex(c => c.id === editingCreditId); + if (idx > -1) credits[idx] = entry; + } else { + credits.push(entry); + } + + saveCredits(); + closeModal('credits-modal'); + renderCredits(); + toast(`✓ ${name} gespeichert!`, "success"); + } + + function confirmDeleteCredit(id) { + const c = credits.find(x => x.id === id); + if (!c) return; + showConfirm(`${c.name} entfernen?`, 'Dieser Eintrag wird aus Credits & Partner entfernt.', () => { + credits = credits.filter(x => x.id !== id); + saveCredits(); + renderCredits(); + toast(`${c.name} entfernt.`, "danger"); + }); + } + + /* ── BOOT ── */ + document.addEventListener('DOMContentLoaded', () => { + + // ── Mode pills ── + document.getElementById('pill-viewer').addEventListener('click', () => setMode('viewer')); + const pu = document.getElementById('pill-user'); + const pa = document.getElementById('pill-admin'); + if (pu) pu.addEventListener('click', () => setMode('user')); + if (pa) pa.addEventListener('click', () => setMode('admin')); + + // ── Viewer tabs ── + document.querySelectorAll('#vnav .nav-btn').forEach((btn, i) => { + const tabs = ['cards', 'cheat', 'guide', 'credits']; + btn.addEventListener('click', () => switchTab(tabs[i])); + }); + + // ── Auth ── + const logoutBtn = document.querySelector('.btn-logout'); + if (logoutBtn) logoutBtn.addEventListener('click', doLogout); + + // ── Admin actions ── + const newGhost = document.getElementById('btn-new-ghost'); + const exportBtn = document.getElementById('btn-export'); + const addAdminBtn = document.getElementById('btn-add-admin'); + if (newGhost) newGhost.addEventListener('click', () => openGhostForm(null)); + if (exportBtn) exportBtn.addEventListener('click', exportGhosts); + if (addAdminBtn) addAdminBtn.addEventListener('click', addAdmin); + + // ── Community ── + const submitBtn = document.getElementById('btn-submit-tip'); + if (submitBtn) submitBtn.addEventListener('click', submitTip); + + // ── Ghost view modal ── + document.getElementById('ghost-modal').addEventListener('click', (e) => { + if (e.target === document.getElementById('ghost-modal')) closeModal('ghost-modal'); + }); + document.getElementById('close-ghost-modal').addEventListener('click', () => closeModal('ghost-modal')); + + // ── Edit modal ── + document.getElementById('edit-modal').addEventListener('click', (e) => { + if (e.target === document.getElementById('edit-modal')) closeModal('edit-modal'); + }); + document.getElementById('close-edit-modal').addEventListener('click', () => closeModal('edit-modal')); + document.getElementById('btn-cancel-edit').addEventListener('click', () => closeModal('edit-modal')); + document.getElementById('btn-add-tell').addEventListener('click', addTellRow); + document.getElementById('btn-save-ghost').addEventListener('click', saveGhost); + + // ── Confirm dialog ── + document.querySelector('.confirm-bg .btn-sm').addEventListener('click', closeConfirm); + document.getElementById('confirm-ok').addEventListener('click', () => { + if (confirmCb) confirmCb(); + closeConfirm(); + }); + + // ── Keyboard shortcuts ── + document.addEventListener('keydown', e => { + if (e.key === 'Escape') { + closeModal('ghost-modal'); + closeModal('edit-modal'); + closeConfirm(); + } + }); + + // ── Guest button ── + const guestBtn = document.getElementById('guest-btn'); + if (guestBtn) guestBtn.addEventListener('click', guestMode); + + // ── Credits ── + document.getElementById('close-credits-modal').addEventListener('click', () => closeModal('credits-modal')); + document.getElementById('btn-cancel-credits').addEventListener('click', () => closeModal('credits-modal')); + document.getElementById('btn-save-credit').addEventListener('click', saveCreditEntry); + document.getElementById('credits-modal').addEventListener('click', (e) => { + if (e.target === document.getElementById('credits-modal')) closeModal('credits-modal'); + }); + const addCreditBtn = document.getElementById('btn-add-credit'); + if (addCreditBtn) addCreditBtn.addEventListener('click', () => openCreditForm(null)); + + init(); + }); + - + + \ No newline at end of file