Implement comprehensive external calendar event deduplication and fixes
All checks were successful
Build and Push Docker Image / docker (push) Successful in 1m11s

- Add UID-based deduplication to prefer recurring events over single events with same UID
- Implement RRULE-generated instance detection to filter duplicate occurrences
- Add title normalization for case-insensitive matching and consolidation
- Fix external calendar refresh button with proper error handling and loading states
- Update context menu for external events to show only "View Event Details" option
- Add comprehensive multi-pass deduplication: UID → title consolidation → RRULE filtering

This resolves issues where Outlook calendars showed duplicate events with same UID
but different RRULE states (e.g., "Dragster Stand Up" appearing both as recurring
and single events).

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Connor Johnstone
2025-09-04 15:35:42 -04:00
parent c6eea88002
commit b16603b50b
4 changed files with 582 additions and 42 deletions

View File

@@ -110,6 +110,7 @@ pub struct SidebarProps {
pub on_color_change: Callback<(String, String)>,
pub on_color_picker_toggle: Callback<String>,
pub available_colors: Vec<String>,
pub refreshing_calendar_id: Option<i32>,
pub on_calendar_context_menu: Callback<(MouseEvent, String)>,
pub on_calendar_visibility_toggle: Callback<String>,
pub current_view: ViewMode,
@@ -304,8 +305,15 @@ pub fn sidebar(props: &SidebarProps) -> Html {
on_refresh.emit(cal_id);
})
}}
disabled={props.refreshing_calendar_id == Some(cal.id)}
>
{"🔄"}
{
if props.refreshing_calendar_id == Some(cal.id) {
"" // Loading spinner
} else {
"🔄" // Normal refresh icon
}
}
</button>
</div>
</div>