From d2d5e2b19c8be2f352235793893a40e6a268ce42 Mon Sep 17 00:00:00 2001 From: Guido Schmit Date: Mon, 15 Jun 2026 21:48:36 +0200 Subject: [PATCH] feat(filter): sync calendar visibility to server for CalDAV/Google/HA The filter-sheet Switch now calls setCalendarHiddenSynced(), which updates local hiddenKeys immediately AND fires a sidebar_hidden PATCH to the server for caldav/google/homeassistant calendars. This makes the quick-hide consistent with the web sidebar across all devices. CalendarFilterEntry gains a source field so the sheet knows which backend to target. Co-Authored-By: Claude Sonnet 4.6 --- .../calendarr/ui/calendar/CalendarFilterSheet.kt | 4 ++-- .../scarriffle/calendarr/ui/calendar/CalendarScreen.kt | 2 +- .../calendarr/ui/calendar/CalendarViewModel.kt | 9 +++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/scarriffle/calendarr/ui/calendar/CalendarFilterSheet.kt b/app/src/main/java/com/scarriffle/calendarr/ui/calendar/CalendarFilterSheet.kt index cc5b258..4629fb9 100644 --- a/app/src/main/java/com/scarriffle/calendarr/ui/calendar/CalendarFilterSheet.kt +++ b/app/src/main/java/com/scarriffle/calendarr/ui/calendar/CalendarFilterSheet.kt @@ -31,7 +31,7 @@ import androidx.compose.ui.unit.dp import com.scarriffle.calendarr.ui.tr import com.scarriffle.calendarr.util.colorFromHex -data class CalendarFilterEntry(val key: String, val name: String, val color: String) +data class CalendarFilterEntry(val key: String, val name: String, val color: String, val source: String = "") @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -107,7 +107,7 @@ fun CalendarFilterSheet( checked = visible, onCheckedChange = { if (groupMode) vm.setGroupKeyHidden(entry.key, hidden = !it) - else vm.setCalendarHidden(entry.key, hidden = !it) + else vm.setCalendarHiddenSynced(entry.key, entry.source, !it) }, ) } diff --git a/app/src/main/java/com/scarriffle/calendarr/ui/calendar/CalendarScreen.kt b/app/src/main/java/com/scarriffle/calendarr/ui/calendar/CalendarScreen.kt index d454618..7d6a036 100644 --- a/app/src/main/java/com/scarriffle/calendarr/ui/calendar/CalendarScreen.kt +++ b/app/src/main/java/com/scarriffle/calendarr/ui/calendar/CalendarScreen.kt @@ -501,7 +501,7 @@ private fun GroupBanner(group: Group, onExit: () -> Unit) { private fun allKnownCalendars(vm: CalendarViewModel): List { val st = vm.state.value return st.events - .map { CalendarFilterEntry(calendarKey(it.source, it.calendarId), it.calendarName.ifBlank { it.source }, it.effectiveColor) } + .map { CalendarFilterEntry(calendarKey(it.source, it.calendarId), it.calendarName.ifBlank { it.source }, it.effectiveColor, it.source) } .distinctBy { it.key } .sortedBy { it.name.lowercase() } } diff --git a/app/src/main/java/com/scarriffle/calendarr/ui/calendar/CalendarViewModel.kt b/app/src/main/java/com/scarriffle/calendarr/ui/calendar/CalendarViewModel.kt index 79c63b4..f474f55 100644 --- a/app/src/main/java/com/scarriffle/calendarr/ui/calendar/CalendarViewModel.kt +++ b/app/src/main/java/com/scarriffle/calendarr/ui/calendar/CalendarViewModel.kt @@ -330,6 +330,15 @@ class CalendarViewModel @Inject constructor( refreshFromCache() } + /** Like [setCalendarHidden] but also syncs server-side sidebar_hidden for external calendars. */ + fun setCalendarHiddenSynced(key: String, source: String, hidden: Boolean) { + setCalendarHidden(key, hidden) + val id = key.substringAfter(":").toIntOrNull() ?: return + if (source in listOf("caldav", "google", "homeassistant")) { + viewModelScope.launch { repository.setCalendarSidebarHidden(source, id, hidden) } + } + } + fun setHiddenCalendars(keys: Set) { settingsStore.hiddenCalendarKeys = keys _state.update { it.copy(hiddenKeys = keys) }