69 lines
3.2 KiB
JavaScript
69 lines
3.2 KiB
JavaScript
// -----------------------------
|
|
// Projektübersicht — Server-Kommunikation (JSON-API)
|
|
// -----------------------------
|
|
// Diese Datei kapselt die HTTP-Kommunikation mit dem Express-Server (siehe
|
|
// server.js im Projekt-Root) und wird nach js/date-picker.js von beiden
|
|
// HTML-Einstiegspunkten geladen. Sie stellt baseUrl, blobToDataUrl,
|
|
// sendWeekToServer, sendPeopleToServer und deleteWeekFromServer bereit.
|
|
// Genutzt wird sie von js/store.js (syncAllToServer, Speichern aller Wochen
|
|
// und der Personenliste), js/weeks.js (Wochen-Löschung) und
|
|
// js/plan/plan-state.js (savePlan schreibt direkt die aktuelle Woche über
|
|
// sendWeekToServer). Die Daten werden als strukturierte JSON-Objekte an die
|
|
// SQLite-API des Servers übergeben (keine CSV-Strings mehr).
|
|
|
|
// 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);
|
|
});
|
|
}
|
|
|
|
// sendWeekToServer: POSTet ein komplettes Wochen-Objekt (JSON) an
|
|
// <baseUrl>/save-week. Parameter: week (Objekt). Rückgabe: Promise mit Server-Antwort.
|
|
function sendWeekToServer(week){
|
|
if(!window.fetch) return Promise.reject(new Error('fetch nicht verfügbar'));
|
|
return fetch(baseUrl() + '/save-week',{
|
|
method:'POST',
|
|
headers:{'Content-Type':'application/json; charset=utf-8'},
|
|
body:JSON.stringify({week, department:currentDepartment})
|
|
}).then(r=>{ if(!r.ok) throw new Error('Server HTTP '+r.status); return r.json(); });
|
|
}
|
|
|
|
// sendPeopleToServer: POSTet die globale Personenliste einer Abteilung als
|
|
// JSON-Array an <baseUrl>/save-people. Parameter: people (Array).
|
|
// Rückgabe: Promise mit Server-Antwort.
|
|
function sendPeopleToServer(people){
|
|
if(!window.fetch) return Promise.reject(new Error('fetch nicht verfügbar'));
|
|
return fetch(baseUrl() + '/save-people',{
|
|
method:'POST',
|
|
headers:{'Content-Type':'application/json; charset=utf-8'},
|
|
body:JSON.stringify({people, department:currentDepartment})
|
|
}).then(r=>{ if(!r.ok) throw new Error('Server HTTP '+r.status); return r.json(); });
|
|
}
|
|
|
|
// deleteWeekFromServer: fordert das Löschen einer Woche über POST /delete-week an
|
|
// Parameter: label (String, das Wochen-Label). Rückgabe: Promise mit Server-Antwort.
|
|
function deleteWeekFromServer(label){
|
|
if(!window.fetch) return Promise.reject(new Error('fetch nicht verfügbar'));
|
|
return fetch(baseUrl() + '/delete-week', {
|
|
method: 'POST',
|
|
headers: {'Content-Type':'application/json; charset=utf-8'},
|
|
body: JSON.stringify({ label, department: currentDepartment })
|
|
}).then(r=>{ if(!r.ok) throw new Error('Server HTTP '+r.status); return r.json(); });
|
|
}
|