// ----------------------------- // Projektübersicht — Server-Kommunikation (CSV-API) // ----------------------------- // Diese Datei kapselt die HTTP-Kommunikation mit dem Express-Server (siehe // server.js im Projekt-Root) und wird nach js/csv.js von beiden // HTML-Einstiegspunkten geladen. Sie stellt baseUrl, blobToDataUrl, // sendCsvToServer und deleteCsvFromServer bereit. Genutzt wird sie von // js/store.js (syncAllToServer, Speichern/Löschen aller Wochen), // js/weeks.js (Wochen-Löschung) und js/plan/plan-state.js (savePlan schreibt // direkt die aktuelle Woche über sendCsvToServer). // baseUrl: dynamische Server-URL, damit die App auch von anderen Geraeten im Netzwerk erreichbar ist. // Fallback auf localhost:3003, wenn die Seite als lokale Datei geladen wurde. // Parameter: keine. Rückgabe: String mit Basis-URL. function baseUrl(){ const origin = window.location.origin; if(typeof origin === 'string' && /^https?:\/\//.test(origin)){ return origin; } return 'http://localhost:3003'; } // blobToDataUrl: liest einen Blob als Data-URL ein (z. B. für Bilddaten) // Parameter: blob (Blob). Rückgabe: Promise, das die Data-URL auflöst. function blobToDataUrl(blob){ return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.onerror = reject; reader.readAsDataURL(blob); }); } // sendCsvToServer: POSTet eine Speicherwoche im CSV-Format an /save-csv // Parameter: filename (String), csvContent (String). Rückgabe: Promise mit Server-Antwort. function sendCsvToServer(filename, csvContent){ if(!window.fetch) return Promise.reject(new Error('fetch nicht verfügbar')); return fetch(baseUrl() + '/save-csv',{ method:'POST', headers:{'Content-Type':'application/json; charset=utf-8'}, body:JSON.stringify({filename,csv:csvContent,department:currentDepartment}) }).then(r=>{ if(!r.ok) throw new Error('Server HTTP '+r.status); return r.json(); }); } // deleteCsvFromServer: fordert das Löschen einer Speicherwoche über POST /delete-csv an // Parameter: filename (String). Rückgabe: Promise mit Server-Antwort. function deleteCsvFromServer(filename){ if(!window.fetch) return Promise.reject(new Error('fetch nicht verfügbar')); return fetch(baseUrl() + '/delete-csv', { method: 'POST', headers: {'Content-Type':'application/json; charset=utf-8'}, body: JSON.stringify({ filename, department: currentDepartment }) }).then(r=>{ if(!r.ok) throw new Error('Server HTTP '+r.status); return r.json(); }); }