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 <noreply@anthropic.com>
This commit is contained in:
Guido Schmit
2026-06-15 21:48:36 +02:00
parent 740367b0b9
commit d2d5e2b19c
3 changed files with 12 additions and 3 deletions

View File

@@ -31,7 +31,7 @@ import androidx.compose.ui.unit.dp
import com.scarriffle.calendarr.ui.tr import com.scarriffle.calendarr.ui.tr
import com.scarriffle.calendarr.util.colorFromHex 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) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@@ -107,7 +107,7 @@ fun CalendarFilterSheet(
checked = visible, checked = visible,
onCheckedChange = { onCheckedChange = {
if (groupMode) vm.setGroupKeyHidden(entry.key, hidden = !it) if (groupMode) vm.setGroupKeyHidden(entry.key, hidden = !it)
else vm.setCalendarHidden(entry.key, hidden = !it) else vm.setCalendarHiddenSynced(entry.key, entry.source, !it)
}, },
) )
} }

View File

@@ -501,7 +501,7 @@ private fun GroupBanner(group: Group, onExit: () -> Unit) {
private fun allKnownCalendars(vm: CalendarViewModel): List<CalendarFilterEntry> { private fun allKnownCalendars(vm: CalendarViewModel): List<CalendarFilterEntry> {
val st = vm.state.value val st = vm.state.value
return st.events 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 } .distinctBy { it.key }
.sortedBy { it.name.lowercase() } .sortedBy { it.name.lowercase() }
} }

View File

@@ -330,6 +330,15 @@ class CalendarViewModel @Inject constructor(
refreshFromCache() 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<String>) { fun setHiddenCalendars(keys: Set<String>) {
settingsStore.hiddenCalendarKeys = keys settingsStore.hiddenCalendarKeys = keys
_state.update { it.copy(hiddenKeys = keys) } _state.update { it.copy(hiddenKeys = keys) }