Termin aus Mail, Rollen & Rechte, Abwesenheiten, Glas-Darstellung und Pi-Betrieb
- Termin aus Mail: Mailtext oder .eml per Drag & Drop/Strg+V auf Terminplan oder Aufgaben, KI schlägt Aufgaben vor, Prüfung im Aufgaben-Panel; neues Notizfeld je Aufgabe (plan_todos.notiz) - Terminplan: Meilensteine ohne Aufgabenbezug je in eigener Zeile, "+ Neu"-Menü klappt neben schmaler Seitenleiste nach rechts, Leistungsphasen - Rollen & Rechte, Abwesenheiten-Seite, Benachrichtigungen, Rundgang - Glas-Darstellung, Logo als Favicon - Pi-Betrieb: PDF-Arbeit im Kindprozess, Wächter, Einrichtungs- und Prüfskript inkl. WLAN-Wächter Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
f4fb3c550b
commit
b7e0bd0d92
56 files changed
+12265
-2974
No files matched your search
+28
-1
@@ -31,11 +31,16 @@ function baseUrl(){
|
||||
// lokalen Daten beruhen; meldet der Server 409 (conflict), wird ein Error
|
||||
// mit `err.conflict = true` und `err.updatedAt` geworfen, damit der Aufrufer
|
||||
// den Konflikt anzeigen kann.
|
||||
// CLIENT_ID: zufällige Kennung dieses Browser-Tabs. Geht bei jedem Speichern
|
||||
// als X-Client-Id mit und bei GET /ereignisse als ?client= — so bekommt der
|
||||
// Tab seine eigenen Änderungen nicht als "fremdes" Live-Ereignis zurück.
|
||||
const CLIENT_ID = Math.random().toString(36).slice(2) + Date.now().toString(36);
|
||||
|
||||
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'},
|
||||
headers:{'Content-Type':'application/json; charset=utf-8', 'X-Client-Id': CLIENT_ID},
|
||||
body:JSON.stringify({
|
||||
week,
|
||||
baseUpdatedAt:(week && week.updatedAt) ? week.updatedAt : undefined
|
||||
@@ -58,6 +63,28 @@ function sendWeekToServer(week){
|
||||
});
|
||||
}
|
||||
|
||||
// sendProjectsToServer: speichert nur einzelne Projekte einer Sitzung
|
||||
// (POST /save-projects, siehe js/store.js syncAllToServer()). Parameter:
|
||||
// label, projekte (Array von Projekt-Objekten; ihr updatedAt ist die Basis
|
||||
// für die Konfliktprüfung je Projekt). Rückgabe: Promise mit
|
||||
// {ok, updatedAt, projekte:{id: updatedAt}}; bei 409 ein Error mit
|
||||
// conflict=true, wie sendWeekToServer().
|
||||
function sendProjectsToServer(label, projekte){
|
||||
if(!window.fetch) return Promise.reject(new Error('fetch nicht verfügbar'));
|
||||
return fetch(baseUrl() + '/save-projects', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type':'application/json; charset=utf-8', 'X-Client-Id': CLIENT_ID},
|
||||
body: JSON.stringify({ label, projects: projekte.map(p => ({ project: p, baseUpdatedAt: p.updatedAt || '' })) })
|
||||
}).then(r => r.json().catch(() => null).then(json => {
|
||||
if(r.ok && json) return json;
|
||||
const err = new Error((json && json.error) || ('Server HTTP ' + r.status));
|
||||
if(json && json.conflict){ err.conflict = true; err.projekte = json.projekte || []; }
|
||||
err.status = r.status;
|
||||
err.label = label;
|
||||
throw err;
|
||||
}));
|
||||
}
|
||||
|
||||
// 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
|
||||
|
||||
Reference in new issue
Block a user