From 87fc8df1462b9bcc0b6b991dd6f16b014e3ca1e4 Mon Sep 17 00:00:00 2001 From: Guido Schmit Date: Mon, 1 Jun 2026 17:54:23 +0200 Subject: [PATCH] feat: render server display_title for group events (consistent across clients) CalEvent parses display_title; decorateGroup uses it (group icon + owner prefix from the server) instead of the hardcoded glyph, with a fallback for older servers. Raw title kept for editing. Co-Authored-By: Claude Opus 4.8 --- .../java/com/scarriffle/calendarr/domain/model/CalEvent.kt | 4 ++++ .../com/scarriffle/calendarr/ui/calendar/CalendarViewModel.kt | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/app/src/main/java/com/scarriffle/calendarr/domain/model/CalEvent.kt b/app/src/main/java/com/scarriffle/calendarr/domain/model/CalEvent.kt index e5ccd8c..f90d9a2 100644 --- a/app/src/main/java/com/scarriffle/calendarr/domain/model/CalEvent.kt +++ b/app/src/main/java/com/scarriffle/calendarr/domain/model/CalEvent.kt @@ -31,6 +31,9 @@ data class CalEvent( val owner: EventPerson? = null, val isGroupEvent: Boolean = false, val displayColor: String? = null, + // Server-decorated title for the group combined view (group icon / owner + // prefix); rendered in group mode while `title` stays raw for editing. + val displayTitle: String? = null, ) { /** * Group view supplies a server-resolved colour (display_color); otherwise @@ -117,6 +120,7 @@ data class CalEvent( owner = personFrom(json, "owner"), isGroupEvent = json.optBoolean("is_group_event", false), displayColor = json.strOrNull("display_color"), + displayTitle = json.strOrNull("display_title"), ) } } 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 dbc215a..9133813 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 @@ -215,6 +215,10 @@ class CalendarViewModel @Inject constructor( private fun decorateGroup(events: List): List { val me = currentUserId return events.map { ev -> + // Prefer the server-decorated title (group icon + owner prefix) so + // web, iOS and Android render identically; fall back for old servers. + val serverTitle = ev.displayTitle?.takeIf { it.isNotEmpty() } + if (serverTitle != null) return@map ev.copy(title = serverTitle) val prefix = when { ev.isGroupEvent && ev.creator != null && ev.creator.id != me -> "👥 ${firstName(ev.creator.displayName)}: " ev.isGroupEvent -> "👥 "