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
parent 07a9e9eb7f
commit 4125bfc728
16 changed files with 616 additions and 156 deletions

View File

@@ -365,4 +365,31 @@ class CalendarrAPI {
]
_ = try await request("/api/homeassistant/events", method: "POST", body: body)
}
/// Delete a Home Assistant calendar event.
/// `calendarId` is the numeric HA-calendar DB id; `uid` is the HA event uid.
func deleteHAEvent(calendarId: Int, uid: String) async throws {
// uid is a path segment and may contain "/" or other reserved chars.
let allowed = CharacterSet.urlPathAllowed.subtracting(CharacterSet(charactersIn: "/"))
let encUid = uid.addingPercentEncoding(withAllowedCharacters: allowed) ?? uid
_ = try await request("/api/homeassistant/events/\(calendarId)/\(encUid)", method: "DELETE")
}
// MARK: Calendar visibility (sidebar_hidden)
/// Toggle a calendar's server-side visibility. Mirrors the web: hiding sets
/// `enabled=false, sidebar_hidden=true` (server then omits its events);
/// showing sets `enabled=true, sidebar_hidden=false`. Only CalDAV / Google /
/// Home Assistant have this flag; `local` / `ical` are a no-op.
func setCalendarSidebarHidden(source: String, calendarId: Int, hidden: Bool) async throws {
let path: String
switch source {
case "caldav": path = "/api/caldav/calendars/\(calendarId)"
case "google": path = "/api/google/calendars/\(calendarId)"
case "homeassistant": path = "/api/homeassistant/calendars/\(calendarId)"
default: return
}
_ = try await request(path, method: "PUT",
body: ["enabled": !hidden, "sidebar_hidden": hidden])
}
}