Protokoll-Import: KI-Erkennung (Gruppe, Teilnehmer, Status, Mehrfachpunkte), Ladeanzeige, Erstellungsdatum je Punkt

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
erikandClaude Sonnet 5 committed 2026-10-01 10:54:43 +02:00
1 parent 6f18848f86
commit 11eabe42ae
275 files changed
+71952 -3029

No files matched your search

+27 -22
View File
@@ -4,12 +4,15 @@
// 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).
// sendWeekToServer und deleteWeekFromServer bereit. Genutzt wird sie von
// js/store.js (syncAllToServer, Speichern aller Wochen), 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). Die globale Personenliste hat seit der Ablösung von
// people/person_roles/person_absences keinen eigenen Schreibpfad mehr
// (Projektbeteiligte werden über die Benutzerverwaltung gepflegt, siehe
// /admin/users bzw. /users/:id/absences).
// 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.
@@ -46,7 +49,6 @@ function sendWeekToServer(week){
headers:{'Content-Type':'application/json; charset=utf-8'},
body:JSON.stringify({
week,
department:currentDepartment,
baseUpdatedAt:(week && week.updatedAt) ? week.updatedAt : undefined
})
}).then(r=>{
@@ -59,30 +61,33 @@ function sendWeekToServer(week){
err.updatedAt = json.updatedAt;
throw err;
}
throw new Error('Server HTTP '+r.status);
const err = new Error((json && json.error) || ('Server HTTP '+r.status));
err.status = r.status;
err.label = (week && week.label) || '';
throw err;
});
});
}
// 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.
// Bei einer Fehler-Antwort (z. B. 403 „Keine Berechtigung“) trägt der geworfene
// Error zusätzlich `status` (HTTP-Statuscode), damit Aufrufer (js/weeks.js)
// gezielt darauf reagieren können.
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(); });
body: JSON.stringify({ label })
}).then(r=>{
if(!r.ok){
return r.json().catch(()=>({})).then(json => {
const err = new Error((json && json.error) || ('Server HTTP '+r.status));
err.status = r.status;
throw err;
});
}
return r.json();
});
}