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:
@@ -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)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) }
|
||||||
|
|||||||
Reference in New Issue
Block a user