d942b82e1d
feat: HA-Termine erstellen über calendar.create_event Service - POST /api/homeassistant/events Endpoint mit calendar.create_event - Frontend: HA-Termine erstellen statt 'nicht unterstützt' Toast - Datetime-Format an HA-Konvention angepasst: 'YYYY-MM-DD HH:MM:SS' (Space-Separator, ohne Timezone) - _ha_format_dt Helper für ISO → HA Datetime-Konvertierung
Scarriffle
2026-04-29 19:07:02 +02:00
7047f55cf7
feat: HA-Termine erstellen über calendar.create_event Service - POST /api/homeassistant/events Endpoint mit calendar.create_event - Frontend: HA-Termine erstellen statt 'nicht unterstützt' Toast - Datetime-Format an HA-Konvention angepasst: 'YYYY-MM-DD HH:MM:SS' (Space-Separator, ohne Timezone) - _ha_format_dt Helper für ISO → HA Datetime-Konvertierung
Guido Schmit
2026-04-29 19:07:02 +02:00
a700bc5350
fix: HA-Event-Update Fallback auf delete+create calendar.update_event existiert erst ab HA 2024.6. Wenn der Service nicht verfügbar ist (400), wird stattdessen delete_event + create_event verwendet. Funktioniert mit HA 2022.5+.
Scarriffle
2026-04-29 18:54:33 +02:00
d859e969d0
fix: HA-Event-Update Fallback auf delete+create calendar.update_event existiert erst ab HA 2024.6. Wenn der Service nicht verfügbar ist (400), wird stattdessen delete_event + create_event verwendet. Funktioniert mit HA 2022.5+.
Guido Schmit
2026-04-29 18:54:33 +02:00
9ae247c7c5
fix: HA update_event – bessere Fehlermeldung mit JSON-Response-Details Liest message-Feld aus HA JSON-Response und loggt den Request-Body für Debugging
Scarriffle
2026-04-29 18:52:32 +02:00
f970276b91
fix: HA update_event – bessere Fehlermeldung mit JSON-Response-Details Liest message-Feld aus HA JSON-Response und loggt den Request-Body für Debugging
Guido Schmit
2026-04-29 18:52:32 +02:00
4b6839f1ff
fix: HA Service-Call Parameter-Format korrigiert - update_event: start_date_time/end_date_time statt dtstart/dtend - Ganztägig: start_date/end_date statt dtstart/dtend - Datetime-Werte als ISO-String mit Timezone statt space-separated - Bessere Fehlermeldungen: HA-Response-Body wird im Error angezeigt
Scarriffle
2026-04-29 18:50:00 +02:00
4964dcf7f3
fix: HA Service-Call Parameter-Format korrigiert - update_event: start_date_time/end_date_time statt dtstart/dtend - Ganztägig: start_date/end_date statt dtstart/dtend - Datetime-Werte als ISO-String mit Timezone statt space-separated - Bessere Fehlermeldungen: HA-Response-Body wird im Error angezeigt
Guido Schmit
2026-04-29 18:50:00 +02:00
aee9689d46
fix: HA-Events über Service-Call API statt nicht-existierender REST-Endpoints PUT/DELETE /api/calendars/{entity_id}/{uid} existieren nicht in HA. Stattdessen: POST /api/services/calendar/update_event und POST /api/services/calendar/delete_event (HA 2023.x+)
Scarriffle
2026-04-29 18:45:24 +02:00
86fa07d18c
fix: HA-Events über Service-Call API statt nicht-existierender REST-Endpoints PUT/DELETE /api/calendars/{entity_id}/{uid} existieren nicht in HA. Stattdessen: POST /api/services/calendar/update_event und POST /api/services/calendar/delete_event (HA 2023.x+)
Guido Schmit
2026-04-29 18:45:24 +02:00
3351263c85
fix: HA-Event-Update URL-Encoding und Popup-Überlappung bei Lösch-Dialog - HA Update/Delete: UID wird URL-encoded (@ → %40), Delete mit Fallback auf Service-Call API für ältere HA-Versionen - Lösch-Dialog: Event-Popup wird geschlossen BEVOR der Bestätigungsdialog erscheint, kein Überlappen mehr
Scarriffle
2026-04-29 18:38:43 +02:00
59f53b5524
fix: HA-Event-Update URL-Encoding und Popup-Überlappung bei Lösch-Dialog - HA Update/Delete: UID wird URL-encoded (@ → %40), Delete mit Fallback auf Service-Call API für ältere HA-Versionen - Lösch-Dialog: Event-Popup wird geschlossen BEVOR der Bestätigungsdialog erscheint, kein Überlappen mehr
Guido Schmit
2026-04-29 18:38:43 +02:00
20e98e660a
fix: HA-Events bearbeitbar, Selected≠Today Styling, Serien-Löschung - HA-Events: Update/Delete-Endpoints via HA REST API implementiert - HA read-only Guard entfernt, stattdessen korrekte API-Anbindung - Selected-Day: Outline-Ring statt gefüllter Kreis (Today bleibt gefüllt) - Serien-Löschung: RECURRENCE-ID aus CalDAV-Events erkennen, damit expandierte Serientermine als recurring markiert werden und der Lösch-Dialog Einzel-/Serienlöschung anbietet
Scarriffle
2026-04-29 18:31:58 +02:00
e5265b3694
fix: HA-Events bearbeitbar, Selected≠Today Styling, Serien-Löschung - HA-Events: Update/Delete-Endpoints via HA REST API implementiert - HA read-only Guard entfernt, stattdessen korrekte API-Anbindung - Selected-Day: Outline-Ring statt gefüllter Kreis (Today bleibt gefüllt) - Serien-Löschung: RECURRENCE-ID aus CalDAV-Events erkennen, damit expandierte Serientermine als recurring markiert werden und der Lösch-Dialog Einzel-/Serienlöschung anbietet
Guido Schmit
2026-04-29 18:31:58 +02:00
134b238dea
fix: CalDAV-Update DTSTART-Fehler und HA-Events read-only - caldav_client: del+add statt direkter Zuweisung bei VEVENT-Properties (behebt "DTSTART MUST appear exactly once" Validierungsfehler) - HA-Events als read-only behandeln (kein Bearbeiten/Löschen im Popup) - [object Object] Toast behoben: HA-Events fallen nicht mehr in CalDAV-Pfad
Scarriffle
2026-04-29 18:21:56 +02:00
3e204d3355
fix: CalDAV-Update DTSTART-Fehler und HA-Events read-only - caldav_client: del+add statt direkter Zuweisung bei VEVENT-Properties (behebt "DTSTART MUST appear exactly once" Validierungsfehler) - HA-Events als read-only behandeln (kein Bearbeiten/Löschen im Popup) - [object Object] Toast behoben: HA-Events fallen nicht mehr in CalDAV-Pfad
Guido Schmit
2026-04-29 18:21:56 +02:00
d4ea097831
fix: Runde-2-Fixes – Monatsauswahl, CalDAV-Update, Lösch-Dialog, EXDATE - Monatsansicht: selectedDate von currentDate getrennt, Klick verschiebt View nicht mehr - Selected-Day Styling: weißer Text auf Primary-Hintergrund statt nur Textfarbe - Kontextmenü: --bg-surface statt fehlendem --bg-card - CalDAV Update/Delete: parent Calendar-Objekt übergeben (behebt NoneType-Fehler) - HA-Kalender im Kalender-Selektor ergänzt - Browser-confirm() durch styled Modal-Dialog ersetzt mit Serie/Einzeln-Option - EXDATE-Support: einzelne Vorkommen wiederkehrender Termine löschen (lokal + CalDAV) - Fehlende i18n-Keys für Lösch-Dialog ergänzt (DE + EN)
Scarriffle
2026-04-29 18:13:12 +02:00
1638c9f631
fix: Runde-2-Fixes – Monatsauswahl, CalDAV-Update, Lösch-Dialog, EXDATE - Monatsansicht: selectedDate von currentDate getrennt, Klick verschiebt View nicht mehr - Selected-Day Styling: weißer Text auf Primary-Hintergrund statt nur Textfarbe - Kontextmenü: --bg-surface statt fehlendem --bg-card - CalDAV Update/Delete: parent Calendar-Objekt übergeben (behebt NoneType-Fehler) - HA-Kalender im Kalender-Selektor ergänzt - Browser-confirm() durch styled Modal-Dialog ersetzt mit Serie/Einzeln-Option - EXDATE-Support: einzelne Vorkommen wiederkehrender Termine löschen (lokal + CalDAV) - Fehlende i18n-Keys für Lösch-Dialog ergänzt (DE + EN)
Guido Schmit
2026-04-29 18:13:12 +02:00
e3984eb5cf
feat: Datum-Validierung, Monatsauswahl, CalDAV-Fix, wiederkehrende Termine - End-Datum passt sich automatisch an wenn Start geändert wird (Duration bleibt erhalten) - Erstellen-Button nutzt den aktuell angesehenen Tag statt immer heute - Monatsansicht: Einzelklick = Tag auswählen, Doppelklick = Tagesansicht, Rechtsklick = Kontextmenü - CalDAV URL-Matching robuster (Normalisierung, Path-Fallback, calendar_id Parameter) - iCal-Abo-Termine sind nicht mehr bearbeitbar (Read-Only-Schutz) - Wiederkehrende Termine mit RRULE-Support (täglich/wöchentlich/monatlich/jährlich/benutzerdefiniert)
Scarriffle
2026-04-29 17:49:03 +02:00
013fb3dbc2
feat: Datum-Validierung, Monatsauswahl, CalDAV-Fix, wiederkehrende Termine - End-Datum passt sich automatisch an wenn Start geändert wird (Duration bleibt erhalten) - Erstellen-Button nutzt den aktuell angesehenen Tag statt immer heute - Monatsansicht: Einzelklick = Tag auswählen, Doppelklick = Tagesansicht, Rechtsklick = Kontextmenü - CalDAV URL-Matching robuster (Normalisierung, Path-Fallback, calendar_id Parameter) - iCal-Abo-Termine sind nicht mehr bearbeitbar (Read-Only-Schutz) - Wiederkehrende Termine mit RRULE-Support (täglich/wöchentlich/monatlich/jährlich/benutzerdefiniert)
Guido Schmit
2026-04-29 17:49:03 +02:00
58c7cbc38c
feat(ha): OAuth Authorization-Code-Flow statt kaputtem Password-Grant Home Assistant unterstützt keinen Password-Grant — deshalb kam immer "Ungültige Anmeldedaten", egal was eingegeben wurde. Jetzt wird der Nutzer nach demselben Muster wie bei Google zur HA-Login-Seite weitergeleitet, meldet sich dort an und kommt zurück zu Calendarr. Änderungen: - Neuer POST /api/homeassistant/auth-url und GET /callback Endpoint - Account speichert client_id für spätere Token-Refreshes - Modal: "Benutzername/Passwort" → "Mit Home Assistant anmelden" - Frontend behandelt ?ha_connected=1 / ?ha_error=... nach Rückkehr - Version v1 → v2
Scarriffle
2026-04-24 12:57:38 +02:00
9a59911156
feat(ha): OAuth Authorization-Code-Flow statt kaputtem Password-Grant Home Assistant unterstützt keinen Password-Grant — deshalb kam immer "Ungültige Anmeldedaten", egal was eingegeben wurde. Jetzt wird der Nutzer nach demselben Muster wie bei Google zur HA-Login-Seite weitergeleitet, meldet sich dort an und kommt zurück zu Calendarr. Änderungen: - Neuer POST /api/homeassistant/auth-url und GET /callback Endpoint - Account speichert client_id für spätere Token-Refreshes - Modal: "Benutzername/Passwort" → "Mit Home Assistant anmelden" - Frontend behandelt ?ha_connected=1 / ?ha_error=... nach Rückkehr - Version v1 → v2
Scarriffle
2026-04-24 12:57:38 +02:00
3d4fdb3f8f
fix: Versionsanzeige direkt im HTML statt per JS Vorher wurde die Version erst in initCalendar() gesetzt – wenn JS vorher fehlschlug, blieb der Text leer. Jetzt steht v1 direkt im HTML (Titel, Login-Button, Sidebar-Button, Impressum-Modal). Für künftige Releases: v1 → v2 in index.html + version.js ersetzen.
Scarriffle
2026-04-24 11:47:55 +02:00
e81bcfa269
fix: Versionsanzeige direkt im HTML statt per JS Vorher wurde die Version erst in initCalendar() gesetzt – wenn JS vorher fehlschlug, blieb der Text leer. Jetzt steht v1 direkt im HTML (Titel, Login-Button, Sidebar-Button, Impressum-Modal). Für künftige Releases: v1 → v2 in index.html + version.js ersetzen.
Scarriffle
2026-04-24 11:47:55 +02:00
c03af1b7ea
feat: Versionsanzeige bei Copyright-Links und im Impressum Neue version.js als Single Point of Truth (APP_VERSION). Sidebar, Login-Screen und Impressum-Modal zeigen die aktuelle Version an — ab jetzt bei jeder Änderung v2, v3 ... hochzählen. Startet bei v1.
Scarriffle
2026-04-24 11:36:43 +02:00
f82b7cf739
feat: Versionsanzeige bei Copyright-Links und im Impressum Neue version.js als Single Point of Truth (APP_VERSION). Sidebar, Login-Screen und Impressum-Modal zeigen die aktuelle Version an — ab jetzt bei jeder Änderung v2, v3 ... hochzählen. Startet bei v1.
Scarriffle
2026-04-24 11:36:43 +02:00
c5c6a5f71b
fix: HA Passwort-Auth loggt nicht mehr aus, Radio-Layout korrigiert - Backend gibt 400 statt 401 bei falschen HA-Credentials zurück, damit der globale api.js-Logout-Handler nicht ausgelöst wird - Null-Guard im JS nach api.post verhindert den "calendars of null"-Crash - Radio-Buttons für Anmeldemethode nicht mehr in form-group, damit input[type=radio] kein width:100% bekommt und sauber nebeneinander liegt
Scarriffle
2026-04-24 11:26:50 +02:00
a41e76b1bf
fix: HA Passwort-Auth loggt nicht mehr aus, Radio-Layout korrigiert - Backend gibt 400 statt 401 bei falschen HA-Credentials zurück, damit der globale api.js-Logout-Handler nicht ausgelöst wird - Null-Guard im JS nach api.post verhindert den "calendars of null"-Crash - Radio-Buttons für Anmeldemethode nicht mehr in form-group, damit input[type=radio] kein width:100% bekommt und sauber nebeneinander liegt
Scarriffle
2026-04-24 11:26:50 +02:00
69f5789e2d
feat: Home Assistant Benutzername/Passwort-Authentifizierung Ergänzt die HA-Integration um Password-Grant OAuth2: Nutzer können sich nun wahlweise mit einem Long-Lived Token oder mit Benutzername/Passwort anmelden. Access Tokens werden automatisch per Refresh-Token erneuert.
Scarriffle
2026-04-21 11:02:32 +02:00
7c55a6043d
feat: Home Assistant Benutzername/Passwort-Authentifizierung Ergänzt die HA-Integration um Password-Grant OAuth2: Nutzer können sich nun wahlweise mit einem Long-Lived Token oder mit Benutzername/Passwort anmelden. Access Tokens werden automatisch per Refresh-Token erneuert.
Scarriffle
2026-04-21 11:02:32 +02:00
978ad55af4
fix: Color-Picker-Cursor korrekt auf Palette ausgerichtet Der Cursor war relativ zum .gcp-Container positioniert, aber ohne den Offset des Canvas innerhalb des Containers (Padding). Jetzt wird die Canvas-Position via getBoundingClientRect() eingerechnet, sodass der Cursor exakt auf der Farbpalette bleibt.
Scarriffle
2026-04-13 09:22:42 +02:00
4ffcd2628e
fix: Color-Picker-Cursor korrekt auf Palette ausgerichtet Der Cursor war relativ zum .gcp-Container positioniert, aber ohne den Offset des Canvas innerhalb des Containers (Padding). Jetzt wird die Canvas-Position via getBoundingClientRect() eingerechnet, sodass der Cursor exakt auf der Farbpalette bleibt.
Scarriffle
2026-04-13 09:22:42 +02:00
d6e67a97c8
fix: Color-Picker-Cursor erreicht jetzt den rechten und unteren Rand updateUI verwendete svCanvas.width (HTML-Attribut, 220px) statt der tatsächlich gerenderten Breite. Wenn CSS den Canvas größer rendert, stoppte der Cursor vor dem rechten Rand. Jetzt wird getBoundingClientRect() verwendet, konsistent mit handleSV.
Scarriffle
2026-04-13 09:18:03 +02:00
e172386850
fix: Color-Picker-Cursor erreicht jetzt den rechten und unteren Rand updateUI verwendete svCanvas.width (HTML-Attribut, 220px) statt der tatsächlich gerenderten Breite. Wenn CSS den Canvas größer rendert, stoppte der Cursor vor dem rechten Rand. Jetzt wird getBoundingClientRect() verwendet, konsistent mit handleSV.
Scarriffle
2026-04-13 09:18:03 +02:00
5c7a74e221
fix: Ausgeblendete Kalender sofort aus Event-Cache entfernen Beim Ausblenden eines Kalenders (sidebar_hidden) wurde fetchAndRender() ohne force=true aufgerufen, wodurch der Cache nie invalidiert wurde und die Events weiterhin angezeigt wurden. Jetzt wird der Cache sofort gefiltert (wie beim Checkbox-Deaktivieren), ohne einen neuen Netzwerkaufruf.
Scarriffle
2026-04-13 09:03:40 +02:00
e70433a61c
fix: Ausgeblendete Kalender sofort aus Event-Cache entfernen Beim Ausblenden eines Kalenders (sidebar_hidden) wurde fetchAndRender() ohne force=true aufgerufen, wodurch der Cache nie invalidiert wurde und die Events weiterhin angezeigt wurden. Jetzt wird der Cache sofort gefiltert (wie beim Checkbox-Deaktivieren), ohne einen neuen Netzwerkaufruf.
Scarriffle
2026-04-13 09:03:40 +02:00
f28aa706e7
feat: Home Assistant Kalender-Integration + Bugfix ausgeblendete Kalender - Neue Integration: Home Assistant als Kalenderquelle via REST-API (GET /api/calendars + GET /api/calendars/{entity_id}) - Authentifizierung per Long-Lived Access Token - Neues Modal zum Verbinden (Name, URL, Token) mit Fehlerbehandlung - Kalender einzeln aktivierbar/deaktivierbar, Farbe änderbar - Ausgeblendete HA-Kalender in Einstellungen wiederherstellbar - Sync- und Trennen-Buttons in den Einstellungen - Bugfix: CalDAV- und Google-Kalender mit sidebar_hidden=true liefern nun keine Events mehr im Kalender
Scarriffle
2026-04-13 08:46:43 +02:00
f9f305b213
feat: Home Assistant Kalender-Integration + Bugfix ausgeblendete Kalender - Neue Integration: Home Assistant als Kalenderquelle via REST-API (GET /api/calendars + GET /api/calendars/{entity_id}) - Authentifizierung per Long-Lived Access Token - Neues Modal zum Verbinden (Name, URL, Token) mit Fehlerbehandlung - Kalender einzeln aktivierbar/deaktivierbar, Farbe änderbar - Ausgeblendete HA-Kalender in Einstellungen wiederherstellbar - Sync- und Trennen-Buttons in den Einstellungen - Bugfix: CalDAV- und Google-Kalender mit sidebar_hidden=true liefern nun keine Events mehr im Kalender
Scarriffle
2026-04-13 08:46:43 +02:00
5a7d8ad362
fix: Tint für mehrtägige Ganztags-Events korrekt via alldayLayout Der bisherige multiDayAllDayEvs-Filter hatte einen Timezone-Fehler bei der Datumsberechnung (UTC-Parsing vs. lokale Zeit in UTC+2). Neue Lösung: das bereits korrekt arbeitende alldayLayout wird direkt als Quelle verwendet. Items mit colEnd > colStart sind mehrtägig — die Spaltenindizes aus dem Layout ergeben den Tint-Bereich exakt.
Scarriffle
2026-04-08 22:24:05 +02:00
7f123de148
fix: Tint für mehrtägige Ganztags-Events korrekt via alldayLayout Der bisherige multiDayAllDayEvs-Filter hatte einen Timezone-Fehler bei der Datumsberechnung (UTC-Parsing vs. lokale Zeit in UTC+2). Neue Lösung: das bereits korrekt arbeitende alldayLayout wird direkt als Quelle verwendet. Items mit colEnd > colStart sind mehrtägig — die Spaltenindizes aus dem Layout ergeben den Tint-Bereich exakt.
Guido Schmit
2026-04-08 22:24:05 +02:00
d1d1135e32
perf/fix: Kalender-Toggle ohne Ladescreen + Mehrfach-Tint als Verlauf Ausblenden: Events werden sofort client-seitig aus dem Cache gefiltert (calendar_id-Match), kein Netzwerkaufruf für die Ansicht nötig. Einblenden: fetchAndRender(force, silent=true) überspringt showLoading(), die aktuelle Ansicht bleibt sichtbar und wird nach dem Fetch aktualisiert. Mehrere mehrtägige Events am selben Tag erzeugen jetzt einen vertikalen Farbverlauf (linear-gradient) statt gestapelter Ebenen, bei denen nur die letzte Farbe sichtbar war.
Scarriffle
2026-04-08 22:14:08 +02:00
a362ab21ae
perf/fix: Kalender-Toggle ohne Ladescreen + Mehrfach-Tint als Verlauf Ausblenden: Events werden sofort client-seitig aus dem Cache gefiltert (calendar_id-Match), kein Netzwerkaufruf für die Ansicht nötig. Einblenden: fetchAndRender(force, silent=true) überspringt showLoading(), die aktuelle Ansicht bleibt sichtbar und wird nach dem Fetch aktualisiert. Mehrere mehrtägige Events am selben Tag erzeugen jetzt einen vertikalen Farbverlauf (linear-gradient) statt gestapelter Ebenen, bei denen nur die letzte Farbe sichtbar war.
Guido Schmit
2026-04-08 22:14:08 +02:00
4c8face22a
fix: Kalender-Toggle sofort wirksam + Tint für mehrtägige Ganztags-Events - fetchAndRender(true) beim Ein-/Ausblenden eines Kalenders erzwingt einen Neu-Abruf statt Cache-Treffer, damit die Änderung sofort sichtbar ist - Tint-Berechnung in der Wochenansicht berücksichtigt jetzt auch mehrtägige Ganztags-Events (z.B. Urlaub), nicht nur mehrtägige Termin-Events — exclusive Enddaten werden dabei korrekt normalisiert
Scarriffle
2026-04-08 21:59:41 +02:00
15c540bd25
fix: Kalender-Toggle sofort wirksam + Tint für mehrtägige Ganztags-Events - fetchAndRender(true) beim Ein-/Ausblenden eines Kalenders erzwingt einen Neu-Abruf statt Cache-Treffer, damit die Änderung sofort sichtbar ist - Tint-Berechnung in der Wochenansicht berücksichtigt jetzt auch mehrtägige Ganztags-Events (z.B. Urlaub), nicht nur mehrtägige Termin-Events — exclusive Enddaten werden dabei korrekt normalisiert
Guido Schmit
2026-04-08 21:59:41 +02:00
7070e23cc6
fix: Wochenkalender-Filter und per-Kalender Fehlerbehandlung Der Wochenkalender von Google hat locale-spezifische IDs (z.B. de.german#weeknum@...) die nicht im alten exakten Set-Filter gefangen wurden. Dadurch wurde er in die DB gespeichert und verursachte beim Event-Abruf einen API-Fehler. Da der try/except die gesamte Kalender-Schleife umschloss, wurden bei einem einzigen fehlerhaften Kalender alle anderen Events ebenfalls verloren — Ursache für keine Termine trotz korrektem Token. - _is_system_calendar(): prüft jetzt auch 'weeknum' als Substring - _sync_google_calendars(): bereinigt bereits gespeicherte System-Kalender - get_google_events(): try/except ist jetzt pro Kalender, nicht global
Scarriffle
2026-04-08 21:49:24 +02:00
f2da15784b
fix: Wochenkalender-Filter und per-Kalender Fehlerbehandlung Der Wochenkalender von Google hat locale-spezifische IDs (z.B. de.german#weeknum@...) die nicht im alten exakten Set-Filter gefangen wurden. Dadurch wurde er in die DB gespeichert und verursachte beim Event-Abruf einen API-Fehler. Da der try/except die gesamte Kalender-Schleife umschloss, wurden bei einem einzigen fehlerhaften Kalender alle anderen Events ebenfalls verloren — Ursache für keine Termine trotz korrektem Token. - _is_system_calendar(): prüft jetzt auch 'weeknum' als Substring - _sync_google_calendars(): bereinigt bereits gespeicherte System-Kalender - get_google_events(): try/except ist jetzt pro Kalender, nicht global
Guido Schmit
2026-04-08 21:49:24 +02:00
240b7af1c8
fix: Google-Token-Fehler wird sichtbar gemacht und dem User gemeldet Wenn der Access-Token eines Google-Accounts abläuft und der Refresh fehlschlägt, wurde die leere Terminliste bisher still zurückgegeben (kein Log, keine UI-Meldung). Jetzt wird der Fehler geloggt, an den Aufrufer weitergegeben und als Toast-Meldung im Frontend angezeigt ("Token abgelaufen – bitte Konto trennen und neu verbinden"). Das Events-Endpoint gibt nun {events, errors} statt ein reines Array zurück; das Frontend extrahiert die Events entsprechend.
Scarriffle
2026-04-08 21:40:01 +02:00
62e7fa8be1
fix: Google-Token-Fehler wird sichtbar gemacht und dem User gemeldet Wenn der Access-Token eines Google-Accounts abläuft und der Refresh fehlschlägt, wurde die leere Terminliste bisher still zurückgegeben (kein Log, keine UI-Meldung). Jetzt wird der Fehler geloggt, an den Aufrufer weitergegeben und als Toast-Meldung im Frontend angezeigt ("Token abgelaufen – bitte Konto trennen und neu verbinden"). Das Events-Endpoint gibt nun {events, errors} statt ein reines Array zurück; das Frontend extrahiert die Events entsprechend.
Guido Schmit
2026-04-08 21:40:01 +02:00
804d6ac9eb
Fix: Scroll auf week-view verlegen – Header und Zeitraster immer gleich breit
Scarriffle2026-04-08 15:19:16 +02:00
307ee3c6a9
Fix: Scroll auf week-view verlegen – Header und Zeitraster immer gleich breit
Scarriffle2026-04-08 15:19:16 +02:00
377a24eac6
Fix: Kopfzeilen-Breite per JS an Scrollbar-Breite anpassen
Scarriffle2026-04-08 15:15:37 +02:00
0cce4fc721
Fix: Kopfzeilen-Breite per JS an Scrollbar-Breite anpassen
Scarriffle2026-04-08 15:15:37 +02:00
6a25607103
Fix: overflow-y:scroll statt auto für konsistente Spaltenbreite
Scarriffle2026-04-08 15:13:00 +02:00
ecdf8917d6
Fix: overflow-y:scroll statt auto für konsistente Spaltenbreite
Scarriffle2026-04-08 15:13:00 +02:00
f50f5fa1e1
Fix: Spaltenbreite Zeitraster und Kopfzeile durch scrollbar-gutter angleichen
Scarriffle2026-04-08 15:11:13 +02:00
77462263e1
Fix: Spaltenbreite Zeitraster und Kopfzeile durch scrollbar-gutter angleichen
Scarriffle2026-04-08 15:11:13 +02:00
fce162693c
Feature: Dynamische Monatsansicht-Lanes + spanning All-Day-Balken in Wochenansicht month.js: MAX_LANES wird jetzt aus der tatsächlichen Container-Höhe berechnet (kein hartes Limit von 3 mehr). week.js: All-Day-Zeile verwendet jetzt dieselbe Overlay-Logik wie die Monatsansicht – Termine spannen als einzelner Balken über mehrere Tage.
Scarriffle2026-04-08 14:57:57 +02:00
4156bc4413
Feature: Dynamische Monatsansicht-Lanes + spanning All-Day-Balken in Wochenansicht month.js: MAX_LANES wird jetzt aus der tatsächlichen Container-Höhe berechnet (kein hartes Limit von 3 mehr). week.js: All-Day-Zeile verwendet jetzt dieselbe Overlay-Logik wie die Monatsansicht – Termine spannen als einzelner Balken über mehrere Tage.
Scarriffle2026-04-08 14:57:57 +02:00
e317b799d0
Feature: Mehrtägige Termine in Wochen-/Tagesansicht vollständig anzeigen Timed-Events die mehrere Tage überspannen werden neu in der Ganztags-Zeile für jeden betroffenen Tag als Bar angezeigt (am Starttag mit Uhrzeit). Die Tagesspalten erhalten einen 15%-Farbhintergrund (col-span-tint) um die Abdeckung zu visualisieren.
Scarriffle2026-04-08 14:47:11 +02:00
f98ff69a9b
Feature: Mehrtägige Termine in Wochen-/Tagesansicht vollständig anzeigen Timed-Events die mehrere Tage überspannen werden neu in der Ganztags-Zeile für jeden betroffenen Tag als Bar angezeigt (am Starttag mit Uhrzeit). Die Tagesspalten erhalten einen 15%-Farbhintergrund (col-span-tint) um die Abdeckung zu visualisieren.
Scarriffle2026-04-08 14:47:11 +02:00
77936b3b8d
Fix: CalDAV delete/update, Copy-Menü-Reset, Timezone beim Kopieren - caldav_client: client.event() → caldav.Event() mit resource.load() für update/delete (DAVClient hat keine event()-Methode) - Popup: Copy-Menü wird beim Öffnen eines neuen Events immer zurückgesetzt - copyEventToCalendar: start/end via new Date().toISOString() normalisiert → verhindert 2h-Verschiebung bei Terminen ohne Timezone-Info
Scarriffle2026-04-08 14:43:34 +02:00
eea150373e
Fix: CalDAV delete/update, Copy-Menü-Reset, Timezone beim Kopieren - caldav_client: client.event() → caldav.Event() mit resource.load() für update/delete (DAVClient hat keine event()-Methode) - Popup: Copy-Menü wird beim Öffnen eines neuen Events immer zurückgesetzt - copyEventToCalendar: start/end via new Date().toISOString() normalisiert → verhindert 2h-Verschiebung bei Terminen ohne Timezone-Info
Scarriffle2026-04-08 14:43:34 +02:00
cae39e6086
Feature: Enddatum im Popup + Kopieren-nach-Kalender-Button Enddatum wird im Event-Popup angezeigt wenn Termin über Mitternacht geht. Neuer Kopieren-Button (📋) im Popup öffnet Kalender-Auswahl und dupliziert den Termin in den gewählten Kalender (CalDAV / Lokal / Google).
Scarriffle2026-04-08 14:34:01 +02:00
5dcde0a3ef
Feature: Enddatum im Popup + Kopieren-nach-Kalender-Button Enddatum wird im Event-Popup angezeigt wenn Termin über Mitternacht geht. Neuer Kopieren-Button (📋) im Popup öffnet Kalender-Auswahl und dupliziert den Termin in den gewählten Kalender (CalDAV / Lokal / Google).
Scarriffle2026-04-08 14:34:01 +02:00
b40e8c6731
Fix: Mehrtägige Events auf Tagesende begrenzt, Stundenhöhen weiter reduziert Timed-Events in Wochen-/Tagesansicht werden jetzt auf Mitternacht (24:00) des Starttages gekürzt – keine kilometerhohen Balken mehr bei tagesübergreifenden Terminen. Stundenhöhen: 36/54/72/90 → 28/44/60/80px; Kompakt (28px) zeigt 24h = 672px.
Scarriffle2026-04-08 14:27:24 +02:00
d29cbb8450
Fix: Mehrtägige Events auf Tagesende begrenzt, Stundenhöhen weiter reduziert Timed-Events in Wochen-/Tagesansicht werden jetzt auf Mitternacht (24:00) des Starttages gekürzt – keine kilometerhohen Balken mehr bei tagesübergreifenden Terminen. Stundenhöhen: 36/54/72/90 → 28/44/60/80px; Kompakt (28px) zeigt 24h = 672px.
Scarriffle2026-04-08 14:27:24 +02:00
ea7442db32
Fix: Scroll-Navigation nur für Monat/Quartal, Stundenhöhen reduziert Wheel-Scroll ändert Zeitraum jetzt nur noch in Monats- und Quartalsansicht. In Wochen-, Tag- und Terminansicht scrollt die Seite normal. Stundenhöhen: 40/60/80/100 → 36/54/72/90px; Kompakt (36px) zeigt 24h auf 1080p ohne Scrollen.
Scarriffle2026-04-08 14:19:13 +02:00
dea15191d8
Fix: Scroll-Navigation nur für Monat/Quartal, Stundenhöhen reduziert Wheel-Scroll ändert Zeitraum jetzt nur noch in Monats- und Quartalsansicht. In Wochen-, Tag- und Terminansicht scrollt die Seite normal. Stundenhöhen: 40/60/80/100 → 36/54/72/90px; Kompakt (36px) zeigt 24h auf 1080p ohne Scrollen.
Scarriffle2026-04-08 14:19:13 +02:00
bda4a75a11
Fix: Quartalsansicht – zufällige Today-Markierungen behoben, Button nach links verschoben Selected-Klasse aus der Quartalsansicht entfernt (war visuell identisch mit Today). Button-Reihenfolge: Quartal > Monat > Woche > Tag > Termine.
Scarriffle2026-04-08 14:15:48 +02:00
e9a307a20d
Fix: Quartalsansicht – zufällige Today-Markierungen behoben, Button nach links verschoben Selected-Klasse aus der Quartalsansicht entfernt (war visuell identisch mit Today). Button-Reihenfolge: Quartal > Monat > Woche > Tag > Termine.
Scarriffle2026-04-08 14:15:48 +02:00
ba73bde353
Feature: Quartalsansicht hinzugefügt Neue Ansicht zeigt 3 Monate eines Quartals nebeneinander mit farbigen Event-Dots, Quartal-Navigation und Titelanzeige (z.B. Q2 2026). Klick auf Tag wechselt in Tagesansicht. Zweisprachig (DE/EN).
Scarriffle2026-04-08 14:10:50 +02:00
e8b5bb3a40
Feature: Quartalsansicht hinzugefügt Neue Ansicht zeigt 3 Monate eines Quartals nebeneinander mit farbigen Event-Dots, Quartal-Navigation und Titelanzeige (z.B. Q2 2026). Klick auf Tag wechselt in Tagesansicht. Zweisprachig (DE/EN).
Scarriffle2026-04-08 14:10:50 +02:00
0b4060beae
fix: Kalenderfarbe wird sofort ohne Reload aktualisiert Statt nach Farbänderung den Cache zu invalidieren und neu zu laden, wird calendarColor direkt in-place auf allen gecachten Events gepatcht und dann nur renderView() aufgerufen. Kein Netzwerk-Request, sofortige Darstellung der neuen Farbe.
Scarriffle
2026-04-07 22:18:10 +02:00
3846af527a
fix: Kalenderfarbe wird sofort ohne Reload aktualisiert Statt nach Farbänderung den Cache zu invalidieren und neu zu laden, wird calendarColor direkt in-place auf allen gecachten Events gepatcht und dann nur renderView() aufgerufen. Kein Netzwerk-Request, sofortige Darstellung der neuen Farbe.
Guido Schmit
2026-04-07 22:18:10 +02:00
d8ec22d573
perf: Sliding-window Cache — Hintergrund-Prefetch bei Cache-Randnähe Wenn die aktuelle Ansicht weniger als 4 Wochen vom Cache-Rand entfernt ist, werden im Hintergrund 8 weitere Wochen in diese Richtung geladen und in den Cache gemergt. Der Cache wächst damit automatisch mit der Navigation mit — kein sichtbarer Ladevorgang auch bei langen Sprüngen.
Scarriffle
2026-04-07 22:09:11 +02:00
59751349b7
perf: Sliding-window Cache — Hintergrund-Prefetch bei Cache-Randnähe Wenn die aktuelle Ansicht weniger als 4 Wochen vom Cache-Rand entfernt ist, werden im Hintergrund 8 weitere Wochen in diese Richtung geladen und in den Cache gemergt. Der Cache wächst damit automatisch mit der Navigation mit — kein sichtbarer Ladevorgang auch bei langen Sprüngen.
Guido Schmit
2026-04-07 22:09:11 +02:00
faada7359e
perf: Event cache mit ±8-Wochen-Puffer für schnelle Navigation Beim ersten Laden wird ein Fenster von ±8 Wochen um die aktuelle Ansicht geholt. Wochenweise Navigation trifft danach den Cache sofort (kein Spinner, kein Netzwerk). Nach echten Datenänderungen (Event speichern/löschen, Sync, Konto-Änderungen) wird der Cache invalidiert und neu geladen.
Scarriffle
2026-04-07 22:05:03 +02:00
bc93474f49
perf: Event cache mit ±8-Wochen-Puffer für schnelle Navigation Beim ersten Laden wird ein Fenster von ±8 Wochen um die aktuelle Ansicht geholt. Wochenweise Navigation trifft danach den Cache sofort (kein Spinner, kein Netzwerk). Nach echten Datenänderungen (Event speichern/löschen, Sync, Konto-Änderungen) wird der Cache invalidiert und neu geladen.
Guido Schmit
2026-04-07 22:05:03 +02:00
e9bc56e857
feat: Rolling 5-week month view with week-by-week scroll Month view now shows 5 weeks starting from the week containing currentDate (not fixed to month boundaries), enabling views like "mid-April to mid-May". Prev/Next buttons jump 4 weeks; mouse wheel scrolls 1 week at a time with 500ms debounce.
Scarriffle
2026-04-07 21:58:51 +02:00
62ac0162eb
feat: Rolling 5-week month view with week-by-week scroll Month view now shows 5 weeks starting from the week containing currentDate (not fixed to month boundaries), enabling views like "mid-April to mid-May". Prev/Next buttons jump 4 weeks; mouse wheel scrolls 1 week at a time with 500ms debounce.
Guido Schmit
2026-04-07 21:58:51 +02:00
b268e88d84
fix: Month scroll navigates by full month, not by week Scrolling in month view was moving currentDate by 7 days, but the grid always renders the complete month — so 4 scrolls were needed before any visual change. Now each scroll step advances/retreats by exactly one month (same as the prev/next buttons).
Scarriffle
2026-04-07 21:51:15 +02:00
46f6765087
fix: Month scroll navigates by full month, not by week Scrolling in month view was moving currentDate by 7 days, but the grid always renders the complete month — so 4 scrolls were needed before any visual change. Now each scroll step advances/retreats by exactly one month (same as the prev/next buttons).
Guido Schmit
2026-04-07 21:51:15 +02:00
7f92e0423c
fix: Month grid lines, scroll throttle, custom dark date/time picker - Month view: Replaced day-strip+events-area with full-height column divs (.month-col) so borders extend the full row height and clicking anywhere in a day column (including below events) navigates to day view. Events overlay uses pointer-events:none (pass-through) while span bars and +N-more labels stay pointer-events:all. - Scroll navigation: Changed wheel handler from 80ms debounce to 500ms leading-edge throttle — one navigation per trackpad gesture. - Custom date/time picker (date-picker.js): Dark calendar grid with prev/next navigation, today/selected highlighting, and a CSS scroll-snap time scroller (hours 0-23, minutes 0-59) matching the app's primary color. Language-aware (month names, day headers via t()). - Event modal datetime inputs replaced with hidden inputs + .dt-display click targets that open the custom picker. setDtValue() helper keeps hidden input and display label in sync.
Scarriffle
2026-04-07 21:44:44 +02:00
e2f98520e2
fix: Month grid lines, scroll throttle, custom dark date/time picker - Month view: Replaced day-strip+events-area with full-height column divs (.month-col) so borders extend the full row height and clicking anywhere in a day column (including below events) navigates to day view. Events overlay uses pointer-events:none (pass-through) while span bars and +N-more labels stay pointer-events:all. - Scroll navigation: Changed wheel handler from 80ms debounce to 500ms leading-edge throttle — one navigation per trackpad gesture. - Custom date/time picker (date-picker.js): Dark calendar grid with prev/next navigation, today/selected highlighting, and a CSS scroll-snap time scroller (hours 0-23, minutes 0-59) matching the app's primary color. Language-aware (month names, day headers via t()). - Event modal datetime inputs replaced with hidden inputs + .dt-display click targets that open the custom picker. setDtValue() helper keeps hidden input and display label in sync.
Guido Schmit
2026-04-07 21:44:44 +02:00
cd4879d573
feat: Spanning event bars, wheel nav, dark datetime picker, segmented settings UI - Month view: Multi-day events render as continuous Google Calendar-style spanning bars across days/weeks using a greedy lane-packing algorithm. Timed multi-day events no longer repeat per day. - Mouse wheel / trackpad scrolls week-by-week in month view, day/week in other views (debounced, prevents default page scroll). - datetime-local/date inputs now use color-scheme:dark so the native browser picker opens in dark mode; calendar icon styled to match. - Contrast/hour-height selectors redesigned as connected segmented pill controls instead of individual tiles. - Hidden calendars list gains proper padding and separator lines. - "Google Konten" settings panel renamed "Konten" and expanded to show CalDAV, local calendars, iCal subscriptions, and Google accounts in one unified panel with sync/disconnect actions. - New i18n keys added for accounts panel in both de and en.
Scarriffle
2026-04-07 21:20:42 +02:00
94cbe4e7fb
feat: Spanning event bars, wheel nav, dark datetime picker, segmented settings UI - Month view: Multi-day events render as continuous Google Calendar-style spanning bars across days/weeks using a greedy lane-packing algorithm. Timed multi-day events no longer repeat per day. - Mouse wheel / trackpad scrolls week-by-week in month view, day/week in other views (debounced, prevents default page scroll). - datetime-local/date inputs now use color-scheme:dark so the native browser picker opens in dark mode; calendar icon styled to match. - Contrast/hour-height selectors redesigned as connected segmented pill controls instead of individual tiles. - Hidden calendars list gains proper padding and separator lines. - "Google Konten" settings panel renamed "Konten" and expanded to show CalDAV, local calendars, iCal subscriptions, and Google accounts in one unified panel with sync/disconnect actions. - New i18n keys added for accounts panel in both de and en.
Guido Schmit
2026-04-07 21:20:42 +02:00
fb4c7a7326
Fix: Kalenderwochen-Kalender ausblenden + Überlappungsdarstellung korrigiert - #weekNum@group.v.calendar.google.com (Kalenderwochen) wird beim Google- Sync, in der Kalenderliste und beim Event-Abruf übersprungen - layoutEvents: fehlende end-Variable im zweiten Pass ergänzt; ohne sie war die Bedingung immer false, sodass Spaltenanzahl überlappender Termine falsch berechnet wurde und Termine sich visuell überdeckten
Scarriffle2026-03-30 15:40:35 +02:00
d5026d6a71
i18n: data-i18n für Topbar, Sidebar und Dropdown ergänzt - Heute-Button, Ansichtsbuttons (Monat/Woche/Tag/Termine), Erstellen-Button und "Meine Kalender" mit data-i18n versehen - Profil/Abmelden im User-Dropdown übersetzbar gemacht - btn_profile + btn_logout Keys in de/en hinzugefügt - Settings-Icon title per data-i18n-title übersetzbar
Scarriffle2026-03-27 16:09:19 +01:00
7e101368bf
i18n: Sprache oben, data-i18n ergänzt, localStorage-Persistenz - Sprachdropdown an den Anfang des Einstellungs-Panels verschoben - data-i18n für Settings-Header, Speichern-Button und Nav-Tabs ergänzt, damit diese beim Sprachwechsel sofort übersetzt werden - setLang() speichert gewählte Sprache in localStorage (bleibt über Seitenreloads hinweg erhalten); currentLang wird beim Modulstart aus localStorage initialisiert - getLang() in openSettingsModal statt state.settings.language, damit das Dropdown immer die aktive Sprache zeigt
Scarriffle2026-03-27 15:30:15 +01:00
cd5d866cb1
Multilanguage: Deutsch / English, umschaltbar in Einstellungen - i18n.js: Übersetzungsmodul mit t(), setLang(), applyLang() + vollst. DE/EN Wörterbuch - Backend: language-Feld in UserSettings, Migration, Settings-API - calendar.js: alle deutschen Strings auf t()-Aufrufe umgestellt, setLang() beim Start - app.js, api.js, color-picker.js, views/*.js: alle UI-Strings übersetzt - Sprach-Dropdown in Einstellungen > Darstellung, data-i18n-Attribute in index.html
Scarriffle2026-03-27 15:15:07 +01:00
4f3db6142d
Fix: Login case-insensitive, Settings zusammengeführt, SVG-Icon, Copyright einzeilig - Login: Benutzername wird case-insensitiv verglichen (func.lower auf beiden Seiten) - Benutzer anlegen: Username wird immer lowercase gespeichert - Einstellungen: Panels "Darstellung", "Ansicht & Raster" und "Ausgeblendete Kalender" zu einem einzigen Panel zusammengeführt - App-Icon: Emoji 📅 durch plattformunabhängiges Inline-SVG ersetzt - Copyright: white-space:nowrap + damit Zeile nie umbricht
Scarriffle2026-03-27 14:50:16 +01:00
c849f77651
Einstellungen: Vollbild-Seite, Kontrast, Stundenhöhe, KW-Anzeige - Einstellungen von Modal-Popup auf Vollbild-Seite mit Seitennavigation umgestellt - Schriftkontrast (4 Stufen) und Linienkontrast (4 Stufen) pro Benutzer gespeichert - Stundenhöhe (40/60/80/100px) in Wochen-/Tagesansicht per Einstellung steuerbar - Kalenderwoche in Monats- und Wochenansicht grösser dargestellt - CSS-Variable --hour-h für dynamische Zeitraster-Höhe in week.js und app.css - Backend: neue Felder text_contrast, line_contrast, hour_height in UserSettings
Scarriffle2026-03-27 10:43:39 +01:00
bad1ed500f
Kalender-Sichtbarkeit persistent speichern + Sidebar-Overflow-Fix - sidebar_hidden-Spalte zu calendars und google_calendars hinzugefügt - Ausblenden-Button persistiert jetzt server-seitig (cross-device) - Einblenden in Einstellungen schreibt sidebar_hidden=false zurück - Sidebar: overflow-x hidden verhindert dass lange Namen den Button rausschieben
Scarriffle2026-03-27 10:02:05 +01:00