fix: Session-Store, DOM-Timing und API-Pfad-Fehler beheben
- connect-sqlite3 durch eigenen BetterSQLiteStore ersetzt (sessions-Tabelle
in der bestehenden DB, keine native Kompilierung nötig)
- db.init() vor require('./auth') gezogen damit BetterSQLiteStore-Konstruktor
db.get() erfolgreich aufrufen kann
- router.js: App-Shell und pageWrapper vor module.render() in DOM einfügen
damit document.getElementById() in Seiten-Modulen funktioniert
- Seiten-Module (meals, notes, contacts, calendar, budget): _container-Referenz
eingeführt, alle document.getElementById() auf _container.querySelector() bzw.
document.querySelector() für body-Elemente umgestellt
- login.js: User-Objekt nach erfolgreichem Login an navigate() übergeben
damit auth.me()-Roundtrip entfällt
- calendar.js: /users → /auth/users korrigiert (404-Fix)
- SW-Cache v8 (erzwingt Reload aller gecachten Seiten-Module)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -32,12 +32,14 @@ let state = {
|
||||
activeCategory: null,
|
||||
searchQuery: '',
|
||||
};
|
||||
let _container = null;
|
||||
|
||||
// --------------------------------------------------------
|
||||
// Entry Point
|
||||
// --------------------------------------------------------
|
||||
|
||||
export async function render(container, { user }) {
|
||||
_container = container;
|
||||
container.innerHTML = `
|
||||
<div class="contacts-page">
|
||||
<div class="contacts-toolbar">
|
||||
@@ -70,7 +72,7 @@ export async function render(container, { user }) {
|
||||
|
||||
// Suche
|
||||
let searchTimer;
|
||||
document.getElementById('contacts-search').addEventListener('input', (e) => {
|
||||
_container.querySelector('#contacts-search').addEventListener('input', (e) => {
|
||||
clearTimeout(searchTimer);
|
||||
searchTimer = setTimeout(() => {
|
||||
state.searchQuery = e.target.value.trim();
|
||||
@@ -79,10 +81,10 @@ export async function render(container, { user }) {
|
||||
});
|
||||
|
||||
// Kategorie-Filter
|
||||
document.getElementById('contacts-filters').addEventListener('click', (e) => {
|
||||
_container.querySelector('#contacts-filters').addEventListener('click', (e) => {
|
||||
const chip = e.target.closest('[data-cat]');
|
||||
if (!chip) return;
|
||||
document.querySelectorAll('.contact-filter-chip').forEach((c) =>
|
||||
_container.querySelectorAll('.contact-filter-chip').forEach((c) =>
|
||||
c.classList.toggle('contact-filter-chip--active', c === chip)
|
||||
);
|
||||
state.activeCategory = chip.dataset.cat || null;
|
||||
@@ -90,7 +92,7 @@ export async function render(container, { user }) {
|
||||
});
|
||||
|
||||
// Neu
|
||||
document.getElementById('contacts-add-btn').addEventListener('click', () =>
|
||||
_container.querySelector('#contacts-add-btn').addEventListener('click', () =>
|
||||
openModal({ mode: 'create' })
|
||||
);
|
||||
}
|
||||
@@ -119,7 +121,7 @@ function filterContacts() {
|
||||
}
|
||||
|
||||
function renderList() {
|
||||
const container = document.getElementById('contacts-list');
|
||||
const container = _container.querySelector('#contacts-list');
|
||||
if (!container) return;
|
||||
|
||||
const contacts = filterContacts();
|
||||
@@ -196,7 +198,7 @@ function renderContactItem(c) {
|
||||
// --------------------------------------------------------
|
||||
|
||||
function openModal({ mode, contact = null }) {
|
||||
document.getElementById('contact-modal-overlay')?.remove();
|
||||
document.querySelector('#contact-modal-overlay')?.remove();
|
||||
|
||||
const isEdit = mode === 'edit';
|
||||
const v = (field) => escHtml(isEdit && contact[field] ? contact[field] : '');
|
||||
|
||||
Reference in New Issue
Block a user