diff --git a/package.json b/package.json index 9e644fd..f918caf 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,7 @@ "dependencies": { "bcrypt": "^5.1.1", "better-sqlite3": "^9.6.0", - "connect-sqlite3": "^0.9.15", - "dotenv": "^16.4.7", +"dotenv": "^16.4.7", "express": "^4.21.2", "express-rate-limit": "^7.5.0", "express-session": "^1.18.1", diff --git a/public/pages/budget.js b/public/pages/budget.js index c961e13..176d052 100644 --- a/public/pages/budget.js +++ b/public/pages/budget.js @@ -28,6 +28,7 @@ let state = { entries: [], summary: null, }; +let _container = null; // -------------------------------------------------------- // Formatierung @@ -67,6 +68,7 @@ async function loadMonth(month) { // -------------------------------------------------------- export async function render(container, { user }) { + _container = container; const today = new Date(); state.month = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}`; @@ -103,17 +105,17 @@ export async function render(container, { user }) { // -------------------------------------------------------- function wireNav() { - document.getElementById('budget-prev').addEventListener('click', async () => { + _container.querySelector('#budget-prev').addEventListener('click', async () => { await loadMonth(addMonths(state.month, -1)); renderBody(); updateLabel(); }); - document.getElementById('budget-next').addEventListener('click', async () => { + _container.querySelector('#budget-next').addEventListener('click', async () => { await loadMonth(addMonths(state.month, 1)); renderBody(); updateLabel(); }); - document.getElementById('budget-today').addEventListener('click', async () => { + _container.querySelector('#budget-today').addEventListener('click', async () => { const today = new Date(); const m = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}`; if (m === state.month) return; @@ -121,12 +123,12 @@ function wireNav() { renderBody(); updateLabel(); }); - document.getElementById('budget-add').addEventListener('click', () => openModal({ mode: 'create' })); + _container.querySelector('#budget-add').addEventListener('click', () => openModal({ mode: 'create' })); updateLabel(); } function updateLabel() { - const lbl = document.getElementById('budget-label'); + const lbl = _container.querySelector('#budget-label'); if (lbl) lbl.textContent = formatMonthLabel(state.month); } @@ -135,7 +137,7 @@ function updateLabel() { // -------------------------------------------------------- function renderBody() { - const body = document.getElementById('budget-body'); + const body = _container.querySelector('#budget-body'); if (!body) return; updateLabel(); @@ -186,7 +188,7 @@ function renderBody() { if (window.lucide) lucide.createIcons(); - document.getElementById('budget-list')?.addEventListener('click', async (e) => { + _container.querySelector('#budget-list')?.addEventListener('click', async (e) => { const delBtn = e.target.closest('[data-action="delete"]'); if (delBtn) { await deleteEntry(parseInt(delBtn.dataset.id, 10)); return; } @@ -262,7 +264,7 @@ function formatEntryDate(dateStr) { // -------------------------------------------------------- function openModal({ mode, entry = null }) { - document.getElementById('budget-modal-overlay')?.remove(); + document.querySelector('#budget-modal-overlay')?.remove(); const isEdit = mode === 'edit'; const today = new Date().toISOString().slice(0, 10); diff --git a/public/pages/calendar.js b/public/pages/calendar.js index 2af845f..7ac1127 100644 --- a/public/pages/calendar.js +++ b/public/pages/calendar.js @@ -38,6 +38,7 @@ let state = { rangeFrom: '', rangeTo: '', }; +let _container = null; // -------------------------------------------------------- // Datumshelfer @@ -130,7 +131,7 @@ async function loadRange(from, to) { async function loadUsers() { try { - const res = await api.get('/users'); + const res = await api.get('/auth/users'); state.users = res.data; } catch { state.users = []; @@ -142,6 +143,7 @@ async function loadUsers() { // -------------------------------------------------------- export async function render(container, { user }) { + _container = container; state.today = isoDate(new Date()); state.cursor = state.today; state.view = 'month'; @@ -165,7 +167,7 @@ export async function render(container, { user }) { // -------------------------------------------------------- function renderToolbar() { - const bar = document.getElementById('cal-toolbar'); + const bar = _container.querySelector('#cal-toolbar'); if (!bar) return; bar.innerHTML = ` @@ -216,7 +218,7 @@ function renderToolbar() { } function updateLabel() { - const lbl = document.getElementById('cal-label'); + const lbl = _container.querySelector('#cal-label'); if (!lbl) return; const d = new Date(state.cursor + 'T00:00:00'); const year = d.getFullYear(); @@ -273,7 +275,7 @@ async function reloadForView() { // -------------------------------------------------------- function renderView() { - const body = document.getElementById('cal-body'); + const body = _container.querySelector('#cal-body'); if (!body) return; body.innerHTML = ''; @@ -624,7 +626,7 @@ function renderAgendaEvent(ev) { // -------------------------------------------------------- function showEventPopup(ev, anchor) { - document.getElementById('event-popup')?.remove(); + document.querySelector('#event-popup')?.remove(); const popup = document.createElement('div'); popup.id = 'event-popup'; @@ -689,7 +691,7 @@ function showEventPopup(ev, anchor) { // -------------------------------------------------------- function openEventModal({ mode, event = null, date = null }) { - document.getElementById('event-modal-overlay')?.remove(); + document.querySelector('#event-modal-overlay')?.remove(); const overlay = document.createElement('div'); overlay.id = 'event-modal-overlay'; @@ -860,15 +862,15 @@ function buildEventModalHTML({ mode, event, date }) { // Allday-Toggle: Felder umschalten document.addEventListener('change', (e) => { if (e.target.id !== 'modal-allday') return; - const tf = document.getElementById('time-fields'); - const af = document.getElementById('allday-fields'); + const tf = document.querySelector('#time-fields'); + const af = document.querySelector('#allday-fields'); if (!tf || !af) return; if (e.target.checked) { tf.style.display = 'none'; af.style.display = ''; } else { tf.style.display = ''; af.style.display = 'none'; } }); function closeEventModal() { - document.getElementById('event-modal-overlay')?.remove(); + document.querySelector('#event-modal-overlay')?.remove(); } async function saveEvent(overlay, mode, eventId) { diff --git a/public/pages/contacts.js b/public/pages/contacts.js index 54d2203..733bfe8 100644 --- a/public/pages/contacts.js +++ b/public/pages/contacts.js @@ -32,12 +32,14 @@ let state = { activeCategory: null, searchQuery: '', }; +let _container = null; // -------------------------------------------------------- // Entry Point // -------------------------------------------------------- export async function render(container, { user }) { + _container = container; container.innerHTML = `