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
b867554e23
Google Kalender: individuelle Kalender in Sidebar anzeigen wie bei CalDAV - GoogleCalendar-Modell hinzugefügt (pro Account, mit enabled/color/name) - Kalender werden nach OAuth automatisch synchronisiert - Sidebar zeigt individuelle Google-Kalender mit Checkbox, Farbpunkt und Ausblenden-Button - Einstellungen: Google-Konten-Bereich mit Sync- und Trennen-Button - Ausgeblendete Kalender-Liste zeigt auch Google-Kalender - Event-Erstellung/Bearbeitung/Löschung nutzt GoogleCalendar-ID statt Account-ID
Scarriffle2026-03-27 09:45:10 +01:00
21d8ddfb7c
Fix Google OAuth: email scope hinzufügen für korrekte Email-Anzeige
Scarriffle2026-03-27 09:30:36 +01:00
0ffb6e5c49
Google Calendar OAuth2 Integration + CalDAV-Kalender ausblenden statt löschen - Google OAuth2 Flow: Admin konfiguriert Client-ID/Secret, User verbindet per Klick - Google Calendar API v3: Events lesen, erstellen, bearbeiten, löschen - GoogleAccount Model + google_router mit Token-Refresh - Google-Events in Event-Pipeline integriert - Frontend: Google Kalender in Sidebar, Dropdown, Event-CRUD-Routing - CalDAV-Kalender: Ausblenden statt ganzes Konto löschen, Einblenden in Einstellungen - Ausgeblendete Kalender Sektion in Einstellungen
Scarriffle2026-03-27 08:44:51 +01:00
cd46b45ec6
Lokale Kalender und iCal-URL-Abonnements Neue Features: - Lokale Kalender erstellen mit vollem Event-CRUD (in SQLite gespeichert) - iCal-URLs abonnieren mit Auto-Refresh und lokalem Caching - iCal-Events sind editierbar/löschbar (Änderungen als lokale Overrides) - Sidebar zeigt alle 3 Kalendertypen mit Farbe, Umbenennen, Löschen - Dropdown "Kalender hinzufügen" mit 3 Optionen (Lokal, CalDAV, iCal) Backend: models.py (4 neue Tabellen), local_router.py, ical_router.py Frontend: Neue Modals, erweiterte Sidebar, Source-basiertes Event-Routing
Scarriffle2026-03-27 07:39:41 +01:00
b2bc107d47
Einstellungen: native Color-Inputs durch Gradient-Colorpicker ersetzen Primärfarbe, Akzentfarbe, Heutige-Tag-Farbe und Account-Farbe verwenden jetzt den gleichen Dark-Style Gradient-Picker.
Scarriffle2026-03-26 19:41:17 +01:00
c0cbb22633
Gradient-Colorpicker im Dark-Style für Event- und Kalenderfarben Feste Farb-Swatches durch den HSV-Gradient-Colorpicker ersetzt. Neues Dark-Theme-CSS für den Picker passend zum Rest der App.
Scarriffle2026-03-26 19:35:08 +01:00
a1001bad68
Fix Avatar-Anzeige: Auth-Header bei Avatar-Requests mitsenden Avatar-Bilder wurden per <img src="..."> geladen, was keinen Authorization-Header mitsendet. Der Endpoint erfordert aber Auth, daher kam immer 401 zurück. Jetzt werden alle Avatar-Requests per fetch() mit Bearer-Token geladen und als Blob-URL gesetzt.
Scarriffle2026-03-26 19:23:58 +01:00
1bbabd6c4d
UI-Verbesserungen: Favicon, Tab-Titel, Kalender umbenennen, Avatar-Crop, Farbpalette - SVG-Favicon hinzugefügt - Dynamischer Tab-Titel (z.B. "Calendarr - März 2026") - Kalender per Doppelklick umbenennen (Backend + Frontend) - Avatar-Anzeige im Topbar gefixt (onerror Fallback, robustes Laden) - Avatar-Upload mit Cropper.js Bildausschnitt-Wahl - Avatar-Limit auf 5 MB erhöht, Thumbnail auf 512px - Farbpalette statt nativem Color-Picker für Kalenderfarben
Scarriffle2026-03-26 15:14:34 +01:00
77d6e20f86
Fix Avatar-Dropdown: Klick auf Child-Elemente korrekt erkennen avatar.contains() statt e.target !== avatar, damit Klicks auf das img innerhalb des Avatar-Divs das Dropdown nicht sofort schließen.
Scarriffle2026-03-26 14:18:24 +01:00
128f1b468a
Profilseite mit Avatar, Passwort-Änderung und TOTP 2FA - Neues Profil-Modal: Avatar-Upload, E-Mail bearbeiten, Kalender-Übersicht - Passwort ändern mit Validierung des aktuellen Passworts - TOTP 2FA: QR-Code + manueller Schlüssel, Aktivierung/Deaktivierung - Login-Flow unterstützt 2FA-Code (neuer JSON-Endpoint /auth/login) - User-Dropdown mit Profil-Link statt confirm()-Dialog - Kalenderfarben in Sidebar editierbar (Color-Picker auf Farbpunkt) - Monatsansicht nutzt volle Höhe (#view-container flex fix) - requirements.txt: passlib durch bcrypt ersetzt, pyotp/qrcode/Pillow hinzugefügt
Scarriffle2026-03-26 14:10:53 +01:00
8e200e9d11
Fix dayKey Tippfehler in renderMiniCal der die gesamte App crashte dayKey war nicht definiert in calendar.js - korrekt ist dateKey (aus utils.js importiert). Der ReferenceError verhinderte die Registrierung aller Event-Handler.
Scarriffle2026-03-26 13:51:23 +01:00