Commit Graph

19 Commits

Author SHA1 Message Date
Scarriffle
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.
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
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
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
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
2026-03-27 15:15:07 +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
2026-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
2026-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
2026-03-27 09:45:10 +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
2026-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
2026-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.
2026-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.
2026-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.
2026-03-26 19:23:58 +01:00
3f3609c944 big update i guess 2026-03-26 18:55:15 +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
2026-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.
2026-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
2026-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.
2026-03-26 13:51:23 +01:00
f029ed1544 initialer commit, Grundcode 2026-03-26 11:20:48 +01:00