6c7c8a4662
feat: PWA-Unterstützung und Mobile-Responsiveness
Scarriffle
2026-05-07 10:35:42 +02:00
528d63d7dd
feat: PWA-Unterstützung und Mobile-Responsiveness
Scarriffle
2026-05-07 10:35:42 +02:00
0aeb421970
fix: HA Update-Fallback auf delete+create wenn Integration nicht unterstützt HA's Google-Calendar-Integration unterstützt kein calendar/event/update und gibt 'not_supported: Calendar does not support event update' zurück. In dem Fall wird jetzt automatisch der Termin gelöscht und neu erstellt (beide Operationen werden von der Integration unterstützt). Der Termin bekommt dabei eine neue UID, aber für den User sieht es wie ein Update aus.
Scarriffle
2026-05-05 18:19:00 +02:00
23a18b0a20
fix: HA Update-Fallback auf delete+create wenn Integration nicht unterstützt HA's Google-Calendar-Integration unterstützt kein calendar/event/update und gibt 'not_supported: Calendar does not support event update' zurück. In dem Fall wird jetzt automatisch der Termin gelöscht und neu erstellt (beide Operationen werden von der Integration unterstützt). Der Termin bekommt dabei eine neue UID, aber für den User sieht es wie ein Update aus.
Guido Schmit
2026-05-05 18:19:00 +02:00
29fef6ea77
fix: Ganztägig-Termine zeigen End-Datum jetzt korrekt inklusive iCal speichert DTEND exklusiv (Tag NACH dem letzten Tag). Bisher führte das dazu, dass ein Termin mit Ende=18.08 nur bis zum 17.08 angezeigt wurde, obwohl der User 18.08 als letzten Tag erwartete. Fix: Im Date-Picker arbeiten wir jetzt mit inklusiven End-Daten ('endet am 18.08' = 18.08 ist letzter Tag) und konvertieren beim Speichern auf exklusiv (DTEND=19.08). Beim Laden umgekehrt: -1 Tag fürs Anzeigen im Picker. Betrifft: openEditEventModal, openCopyEditModal, Save-Handler.
Scarriffle
2026-05-05 18:16:56 +02:00
e7174770f3
fix: Ganztägig-Termine zeigen End-Datum jetzt korrekt inklusive iCal speichert DTEND exklusiv (Tag NACH dem letzten Tag). Bisher führte das dazu, dass ein Termin mit Ende=18.08 nur bis zum 17.08 angezeigt wurde, obwohl der User 18.08 als letzten Tag erwartete. Fix: Im Date-Picker arbeiten wir jetzt mit inklusiven End-Daten ('endet am 18.08' = 18.08 ist letzter Tag) und konvertieren beim Speichern auf exklusiv (DTEND=19.08). Beim Laden umgekehrt: -1 Tag fürs Anzeigen im Picker. Betrifft: openEditEventModal, openCopyEditModal, Save-Handler.
Guido Schmit
2026-05-05 18:16:56 +02:00
dd18a0b594
feat: 'Vor dem Kopieren bearbeiten' Checkbox im Kopieren-Popup Über der Kalenderliste im Kopieren-Menü gibt es jetzt eine Checkbox 'Vor dem Kopieren bearbeiten'. Wenn aktiviert und ein Ziel-Kalender geklickt wird, öffnet sich der Termin-erstellen-Dialog mit allen Daten des Quell-Termins vorausgefüllt (Titel, Datum, Ort, Beschreibung, Farbe, Wiederholung) und dem Ziel-Kalender vorausgewählt.
Scarriffle
2026-05-05 18:11:33 +02:00
c12f30cbbf
feat: 'Vor dem Kopieren bearbeiten' Checkbox im Kopieren-Popup Über der Kalenderliste im Kopieren-Menü gibt es jetzt eine Checkbox 'Vor dem Kopieren bearbeiten'. Wenn aktiviert und ein Ziel-Kalender geklickt wird, öffnet sich der Termin-erstellen-Dialog mit allen Daten des Quell-Termins vorausgefüllt (Titel, Datum, Ort, Beschreibung, Farbe, Wiederholung) und dem Ziel-Kalender vorausgewählt.
Guido Schmit
2026-05-05 18:11:33 +02:00
4aaf6672f7
fix: Quell-Kalender wird beim Kopieren ausgeblendet buildWritableCalendars excluded jetzt den Kalender, in dem das Event bereits ist – so kann man nicht mehr in denselben Kalender kopieren.
Scarriffle
2026-05-05 17:54:15 +02:00
da74e8dc78
fix: Quell-Kalender wird beim Kopieren ausgeblendet buildWritableCalendars excluded jetzt den Kalender, in dem das Event bereits ist – so kann man nicht mehr in denselben Kalender kopieren.
Guido Schmit
2026-05-05 17:54:15 +02:00
ac5996693f
fix: Termine in unchecked Kalendern erstellen + HA-Kalender als Kopier-Ziel - populateCalendarSelect: filtert jetzt nach !sidebar_hidden statt enabled. Unchecked (versteckte) Kalender bleiben so im Termin-erstellen-Dropdown verfügbar - buildWritableCalendars: HA-Kalender werden als Kopier-Ziele aufgeführt - copyEventToCalendar: routet HA-Ziele über /homeassistant/events Endpoint (vorher fielen sie in den CalDAV-Fallback)
Scarriffle
2026-05-05 17:46:12 +02:00
b1b08072e7
fix: Termine in unchecked Kalendern erstellen + HA-Kalender als Kopier-Ziel - populateCalendarSelect: filtert jetzt nach !sidebar_hidden statt enabled. Unchecked (versteckte) Kalender bleiben so im Termin-erstellen-Dropdown verfügbar - buildWritableCalendars: HA-Kalender werden als Kopier-Ziele aufgeführt - copyEventToCalendar: routet HA-Ziele über /homeassistant/events Endpoint (vorher fielen sie in den CalDAV-Fallback)
Guido Schmit
2026-05-05 17:46:12 +02:00
0e6672b909
fix: CalDAV-Events bekommen source-Feld – Kalenderfarbe-Patch wirkt sofort CalDAV-Events hatten bisher kein source-Feld gesetzt. applyCalendarColor filtert aber via ev.source !== 'caldav', sodass der Patch nie auf CalDAV-Events angewendet wurde – die Farbe blieb sichtbar bis F5. Jetzt wird source: 'caldav' beim Anreichern der Events gesetzt.
Scarriffle
2026-04-29 20:27:31 +02:00
b961cf94ef
fix: CalDAV-Events bekommen source-Feld – Kalenderfarbe-Patch wirkt sofort CalDAV-Events hatten bisher kein source-Feld gesetzt. applyCalendarColor filtert aber via ev.source !== 'caldav', sodass der Patch nie auf CalDAV-Events angewendet wurde – die Farbe blieb sichtbar bis F5. Jetzt wird source: 'caldav' beim Anreichern der Events gesetzt.
Guido Schmit
2026-04-29 20:27:31 +02:00
8d95dd0b97
fix: Termin-Änderungen (Farbe, Titel, etc.) sofort ohne Reload anzeigen Nach dem Speichern eines Termins wird das gecachte Event-Objekt direkt in-place gepatcht und die View neu gerendert. Vorher war die neue Farbe erst nach F5 sichtbar, weil zwar fetchAndRender(true) aufgerufen wurde, aber der Render-Pfad das Update nicht zuverlässig übernommen hat.
Scarriffle
2026-04-29 20:22:34 +02:00
dce9890bfa
fix: Termin-Änderungen (Farbe, Titel, etc.) sofort ohne Reload anzeigen Nach dem Speichern eines Termins wird das gecachte Event-Objekt direkt in-place gepatcht und die View neu gerendert. Vorher war die neue Farbe erst nach F5 sichtbar, weil zwar fetchAndRender(true) aufgerufen wurde, aber der Render-Pfad das Update nicht zuverlässig übernommen hat.
Guido Schmit
2026-04-29 20:22:34 +02:00
e99f91dcf3
feat: HA-Events über WebSocket API (calendar/event/delete und update) Manche HA-Integrationen registrieren nur den WebSocket-Handler, keinen Service-Call. Die HA-Web-UI nutzt deshalb den WebSocket-Pfad. Calendarr macht das jetzt auch: - _ha_ws_call: minimaler WebSocket-Client für eine einzelne Command - create: erst WS, dann Service-Call als Fallback - update: nur WS (Service-Call existiert oft nicht) - delete: nur WS (Service-Call existiert oft nicht) Neue Dependency: websocket-client==1.8.0
Scarriffle
2026-04-29 20:01:12 +02:00
98870ccfb3
feat: HA-Events über WebSocket API (calendar/event/delete und update) Manche HA-Integrationen registrieren nur den WebSocket-Handler, keinen Service-Call. Die HA-Web-UI nutzt deshalb den WebSocket-Pfad. Calendarr macht das jetzt auch: - _ha_ws_call: minimaler WebSocket-Client für eine einzelne Command - create: erst WS, dann Service-Call als Fallback - update: nur WS (Service-Call existiert oft nicht) - delete: nur WS (Service-Call existiert oft nicht) Neue Dependency: websocket-client==1.8.0
Guido Schmit
2026-04-29 20:01:12 +02:00
64f8b901dd
fix: HA Delete – mehrere Body-Formate ausprobieren HA's Service-Call-Schema akzeptiert je nach Version verschiedene Body-Shapes für entity_id. Wir probieren jetzt der Reihe nach: 1. entity_id als String 2. entity_id als Liste 3. target-Wrapper Wenn alle fehlschlagen, klare Anweisung zum HA-Developer-Tools-Test.
Scarriffle
2026-04-29 19:58:56 +02:00
1f010078d3
fix: HA Delete – mehrere Body-Formate ausprobieren HA's Service-Call-Schema akzeptiert je nach Version verschiedene Body-Shapes für entity_id. Wir probieren jetzt der Reihe nach: 1. entity_id als String 2. entity_id als Liste 3. target-Wrapper Wenn alle fehlschlagen, klare Anweisung zum HA-Developer-Tools-Test.
Guido Schmit
2026-04-29 19:58:56 +02:00
c61d7fd698
fix: HA Delete – Fallback auf REST DELETE und klarere Fehlermeldung calendar.delete_event schlägt mit 400 fehl, wenn die HA-Integration das Feature nicht unterstützt (z.B. Google-Calendar via HA hat nur CREATE_EVENT, kein DELETE/UPDATE). - Versucht erst Service-Call, dann REST DELETE als Fallback - Bei 400 wird der User aufgeklärt, dass die Integration vermutlich kein Löschen unterstützt
Scarriffle
2026-04-29 19:55:04 +02:00
80cde5aaee
fix: HA Delete – Fallback auf REST DELETE und klarere Fehlermeldung calendar.delete_event schlägt mit 400 fehl, wenn die HA-Integration das Feature nicht unterstützt (z.B. Google-Calendar via HA hat nur CREATE_EVENT, kein DELETE/UPDATE). - Versucht erst Service-Call, dann REST DELETE als Fallback - Bei 400 wird der User aufgeklärt, dass die Integration vermutlich kein Löschen unterstützt
Guido Schmit
2026-04-29 19:55:04 +02:00
b803d4bf4c
fix: HA Datetime-Format mit Timezone, leere Strings filtern, Debug-Logs - _ha_format_dt: Parst ISO-Datetime zu datetime-Objekt, emittiert ohne Millisekunden, MIT Timezone-Offset. Vorher landeten Termine am falschen Datum, weil das Frontend UTC schickt aber wir die Timezone gestrippt haben → HA hat als lokale Zeit interpretiert - Leere Strings werden nicht mehr in den Body aufgenommen (HA Validator könnte diese ablehnen) - Logging in create/delete/update für besseres Debugging der HA-Calls
Scarriffle
2026-04-29 19:50:52 +02:00
0ea0a530f6
fix: HA Datetime-Format mit Timezone, leere Strings filtern, Debug-Logs - _ha_format_dt: Parst ISO-Datetime zu datetime-Objekt, emittiert ohne Millisekunden, MIT Timezone-Offset. Vorher landeten Termine am falschen Datum, weil das Frontend UTC schickt aber wir die Timezone gestrippt haben → HA hat als lokale Zeit interpretiert - Leere Strings werden nicht mehr in den Body aufgenommen (HA Validator könnte diese ablehnen) - Logging in create/delete/update für besseres Debugging der HA-Calls
Guido Schmit
2026-04-29 19:50:52 +02:00
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