Commit Graph

  • 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 Scarriffle 2026-04-08 15:19:16 +02:00
  • 307ee3c6a9 Fix: Scroll auf week-view verlegen – Header und Zeitraster immer gleich breit Scarriffle 2026-04-08 15:19:16 +02:00
  • 377a24eac6 Fix: Kopfzeilen-Breite per JS an Scrollbar-Breite anpassen Scarriffle 2026-04-08 15:15:37 +02:00
  • 0cce4fc721 Fix: Kopfzeilen-Breite per JS an Scrollbar-Breite anpassen Scarriffle 2026-04-08 15:15:37 +02:00
  • 6a25607103 Fix: overflow-y:scroll statt auto für konsistente Spaltenbreite Scarriffle 2026-04-08 15:13:00 +02:00
  • ecdf8917d6 Fix: overflow-y:scroll statt auto für konsistente Spaltenbreite Scarriffle 2026-04-08 15:13:00 +02:00
  • f50f5fa1e1 Fix: Spaltenbreite Zeitraster und Kopfzeile durch scrollbar-gutter angleichen Scarriffle 2026-04-08 15:11:13 +02:00
  • 77462263e1 Fix: Spaltenbreite Zeitraster und Kopfzeile durch scrollbar-gutter angleichen Scarriffle 2026-04-08 15:11:13 +02:00
  • 8fc3472b1c Fix: Ganztägig-Zeile sticky + korrekte Ausrichtung in Wochen-/Tagesansicht Scarriffle 2026-04-08 15:08:45 +02:00
  • 4a2f094a40 Fix: Ganztägig-Zeile sticky + korrekte Ausrichtung in Wochen-/Tagesansicht Scarriffle 2026-04-08 15:08:45 +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. Scarriffle 2026-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. Scarriffle 2026-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. Scarriffle 2026-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. Scarriffle 2026-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 Scarriffle 2026-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 Scarriffle 2026-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). Scarriffle 2026-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). Scarriffle 2026-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. Scarriffle 2026-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. Scarriffle 2026-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. Scarriffle 2026-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. Scarriffle 2026-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. Scarriffle 2026-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. Scarriffle 2026-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). Scarriffle 2026-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). Scarriffle 2026-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 Scarriffle 2026-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 Scarriffle 2026-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 Scarriffle 2026-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 Scarriffle 2026-03-27 15:15:07 +01:00
  • e4a14e6927 Icon: SVG-Favicon + Emoji in Setup/Login ersetzt, Settings-Tab "Darstellung" umbenannt Scarriffle 2026-03-27 14:54:26 +01:00
  • 33c1f0ab73 README hinzufügen Scarriffle 2026-03-27 14:52:33 +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 Scarriffle 2026-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 Scarriffle 2026-03-27 10:43:39 +01:00
  • 2128f07037 Login: Untertitel "das minimalistische Kalender Frontend" hinzufügen Scarriffle 2026-03-27 10:16:10 +01:00
  • 9f39be8e33 Fix Impressum: Login-Button z-index + Google-Datenschutzhinweis - Impressum-Modal z-index auf 1100 erhöht (war hinter Login-Screen versteckt) - Hinweis zu Google-Daten hinzugefügt (ausserhalb CH, Google-Datenschutz gilt) Scarriffle 2026-03-27 10:10:13 +01:00
  • fa0a96994e Impressum-Popup: Copyright in Sidebar und Login-Seite hinzufügen - © 2026 Scarriffleservices am unteren Rand der Sidebar (sticky) - Gleicher Link auf der Login-Seite (unten mittig) - Impressum-Modal: Anbieter, Datenspeicherung Schweiz, Haftungsausschluss, Kontakt Scarriffle 2026-03-27 10:06:31 +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 Scarriffle 2026-03-27 10:02:05 +01:00