Settings sync, calendar visibility sync, event refresh & week-view fixes

- Add two-way settings sync (SettingsSync) with toggle, app-start/foreground/
  10-min pull and debounced push; server wins; view/week-start/dim-past always
  sync. Wire previously-ignored settings (hour height, contrasts, week start,
  default view, dim past) into the actual UI.
- Make AppSettings decoding resilient (decodeIfPresent) so getSettings no longer
  fails on iOS-only fields the server omits; keep text/bg/line colors local-only;
  month divider/label colors now sync.
- Auto-refresh after create/edit (cache-busting) and optimistic removal on
  delete; switch delete confirm to a centered alert. Add HA event deletion.
- Calendar visibility: fix inverted hide/show toggle; normalize calendar keys so
  local filtering works for all sources; sync banish with server sidebar_hidden
  (CalDAV/Google/HA), refetch on un-banish.
- Manual "sync with server" button in the menu.
- Upcoming widget shows next 5 days (renamed).
- Week/Day view: route multi-day timed events to the all-day strip so they no
  longer render as a full-height block.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-05-27 20:44:14 +02:00
co-authored by Claude Opus 4.7
parent 07a9e9eb7f
commit 4125bfc728
16 changed files with 616 additions and 156 deletions
+10
View File
@@ -64,6 +64,8 @@ private let strings: [String: [String: String]] = [
"menu.server": "Server",
"menu.logout": "Abmelden",
"menu.admin": "Admin",
"menu.sync": "Mit Server synchronisieren",
"menu.sync.section": "Synchronisierung",
// Settings – chrome
"settings.title": "Darstellung",
@@ -76,6 +78,9 @@ private let strings: [String: [String: String]] = [
"settings.liquidglass": "Liquid Glass",
"settings.liquidglass.desc": "Verwendet die neue iOS\u{202F}26 Glasoptik mit transparenter Navigationsleiste",
"settings.liquidglass.footer": "Änderung wirkt sofort – kein Neustart nötig.",
"settings.sync": "Einstellungen synchronisieren",
"settings.sync.desc": "Darstellung mit dem Server abgleichen",
"settings.sync.footer": "Wenn aktiv, werden Farben, Kontraste und Stundenhöhe mit dem Server abgeglichen (der Server hat Vorrang). Ansicht, erster Wochentag und das Ausgrauen vergangener Termine werden immer synchronisiert – auch wenn der Schalter aus ist.",
"settings.cache.header": "Vorladen",
"settings.cache.title": "Vorladen",
@@ -320,6 +325,8 @@ private let strings: [String: [String: String]] = [
"menu.server": "Server",
"menu.logout": "Sign out",
"menu.admin": "Admin",
"menu.sync": "Sync with server",
"menu.sync.section": "Synchronization",
"settings.title": "Appearance",
"settings.loading": "Loading settings…",
@@ -330,6 +337,9 @@ private let strings: [String: [String: String]] = [
"settings.liquidglass": "Liquid Glass",
"settings.liquidglass.desc": "Uses the new iOS\u{202F}26 glass look with a translucent navigation bar",
"settings.liquidglass.footer": "Takes effect immediately – no restart required.",
"settings.sync": "Sync settings",
"settings.sync.desc": "Keep appearance in sync with the server",
"settings.sync.footer": "When on, colors, contrasts and hour height sync with the server (the server wins). View, first weekday and dimming past events always sync – even when the switch is off.",
"settings.cache.header": "Preloading",
"settings.cache.title": "Preloading",