Fixing some messaging issues with calendar add/delete.
This commit is contained in:
@@ -8,6 +8,7 @@ using CommunityToolkit.Diagnostics;
|
|||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
using CommunityToolkit.Mvvm.Input;
|
using CommunityToolkit.Mvvm.Input;
|
||||||
using CommunityToolkit.Mvvm.Messaging;
|
using CommunityToolkit.Mvvm.Messaging;
|
||||||
|
using Itenso.TimePeriod;
|
||||||
using MoreLinq;
|
using MoreLinq;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using Wino.Calendar.ViewModels.Data;
|
using Wino.Calendar.ViewModels.Data;
|
||||||
@@ -1001,8 +1002,11 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
|||||||
|
|
||||||
Debug.WriteLine($"Calendar item deleted: {calendarItem.Id}");
|
Debug.WriteLine($"Calendar item deleted: {calendarItem.Id}");
|
||||||
|
|
||||||
// Check if the deleted item is currently displayed in details view
|
// Check if the deleted item (or its series master) is currently displayed in details view.
|
||||||
if (DisplayDetailsCalendarItemViewModel?.Id == calendarItem.Id)
|
var isDeletedDetailsItem = DisplayDetailsCalendarItemViewModel?.Id == calendarItem.Id;
|
||||||
|
var isDeletedSeriesMasterOfDetailsItem = DisplayDetailsCalendarItemViewModel?.CalendarItem?.RecurringCalendarItemId == calendarItem.Id;
|
||||||
|
|
||||||
|
if (isDeletedDetailsItem || isDeletedSeriesMasterOfDetailsItem)
|
||||||
{
|
{
|
||||||
// Clear the details view since this item was deleted
|
// Clear the details view since this item was deleted
|
||||||
DisplayDetailsCalendarItemViewModel = null;
|
DisplayDetailsCalendarItemViewModel = null;
|
||||||
@@ -1015,11 +1019,9 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
|||||||
{
|
{
|
||||||
foreach (var calendarDay in dayRange.CalendarDays)
|
foreach (var calendarDay in dayRange.CalendarDays)
|
||||||
{
|
{
|
||||||
var existingItem = calendarDay.EventsCollection.GetCalendarItem(calendarItem.Id);
|
calendarDay.EventsCollection.RemoveCalendarItems(item =>
|
||||||
if (existingItem != null)
|
item.Id == calendarItem.Id ||
|
||||||
{
|
(item is CalendarItemViewModel vm && vm.CalendarItem.RecurringCalendarItemId == calendarItem.Id));
|
||||||
calendarDay.EventsCollection.RemoveCalendarItem(existingItem);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -1119,9 +1121,11 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
|||||||
|
|
||||||
// Series master events should not be visible on the UI.
|
// Series master events should not be visible on the UI.
|
||||||
// Their instances are already expanded and synced individually.
|
// Their instances are already expanded and synced individually.
|
||||||
|
// For revert scenarios, restore visible child instances from local storage.
|
||||||
if (calendarItem.IsRecurringParent)
|
if (calendarItem.IsRecurringParent)
|
||||||
{
|
{
|
||||||
Debug.WriteLine($"Skipping series master event: {calendarItem.Title}");
|
Debug.WriteLine($"Skipping series master event: {calendarItem.Title}");
|
||||||
|
await RestoreVisibleRecurringSeriesInstancesAsync(calendarItem);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1167,4 +1171,45 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
|
|||||||
|
|
||||||
FilterActiveCalendars(DayRanges);
|
FilterActiveCalendars(DayRanges);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task RestoreVisibleRecurringSeriesInstancesAsync(CalendarItem recurringParent)
|
||||||
|
{
|
||||||
|
if (DayRanges.DisplayRange == null || recurringParent?.AssignedCalendar == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var visibleRange = new TimeRange(DayRanges.DisplayRange.StartDate, DayRanges.DisplayRange.EndDate);
|
||||||
|
var visibleItems = await _calendarService.GetCalendarEventsAsync(recurringParent.AssignedCalendar, visibleRange).ConfigureAwait(false);
|
||||||
|
|
||||||
|
var recurringChildren = visibleItems
|
||||||
|
.Where(item => item.RecurringCalendarItemId == recurringParent.Id && !item.IsHidden && !item.IsRecurringParent)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
if (!recurringChildren.Any())
|
||||||
|
return;
|
||||||
|
|
||||||
|
await ExecuteUIThread(() =>
|
||||||
|
{
|
||||||
|
foreach (var child in recurringChildren)
|
||||||
|
{
|
||||||
|
child.AssignedCalendar ??= recurringParent.AssignedCalendar;
|
||||||
|
|
||||||
|
var targetDays = DayRanges
|
||||||
|
.SelectMany(a => a.CalendarDays)
|
||||||
|
.Where(day => day.Period.OverlapsWith(child.Period));
|
||||||
|
|
||||||
|
foreach (var day in targetDays)
|
||||||
|
{
|
||||||
|
if (day.EventsCollection.GetCalendarItem(child.Id) != null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
day.EventsCollection.AddCalendarItem(new CalendarItemViewModel(child)
|
||||||
|
{
|
||||||
|
IsBusy = string.IsNullOrEmpty(child.RemoteEventId)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
FilterActiveCalendars(DayRanges);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -370,29 +370,43 @@ public abstract class WinoSynchronizer<TBaseRequest, TMessageType, TCalendarEven
|
|||||||
switch (calendarSynchronizerOperation)
|
switch (calendarSynchronizerOperation)
|
||||||
{
|
{
|
||||||
case CalendarSynchronizerOperation.CreateEvent:
|
case CalendarSynchronizerOperation.CreateEvent:
|
||||||
nativeRequests.AddRange(CreateCalendarEvent(group.ElementAt(0) as CreateCalendarEventRequest));
|
nativeRequests.AddRange(group
|
||||||
|
.OfType<CreateCalendarEventRequest>()
|
||||||
|
.SelectMany(CreateCalendarEvent));
|
||||||
break;
|
break;
|
||||||
case CalendarSynchronizerOperation.AcceptEvent:
|
case CalendarSynchronizerOperation.AcceptEvent:
|
||||||
nativeRequests.AddRange(AcceptEvent(group.ElementAt(0) as AcceptEventRequest));
|
nativeRequests.AddRange(group
|
||||||
|
.OfType<AcceptEventRequest>()
|
||||||
|
.SelectMany(AcceptEvent));
|
||||||
break;
|
break;
|
||||||
case CalendarSynchronizerOperation.DeclineEvent:
|
case CalendarSynchronizerOperation.DeclineEvent:
|
||||||
if (Account.ProviderType == MailProviderType.Outlook)
|
if (Account.ProviderType == MailProviderType.Outlook)
|
||||||
{
|
{
|
||||||
nativeRequests.AddRange(OutlookDeclineEvent(group.ElementAt(0) as OutlookDeclineEventRequest));
|
nativeRequests.AddRange(group
|
||||||
|
.OfType<OutlookDeclineEventRequest>()
|
||||||
|
.SelectMany(OutlookDeclineEvent));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nativeRequests.AddRange(DeclineEvent(group.ElementAt(0) as DeclineEventRequest));
|
nativeRequests.AddRange(group
|
||||||
|
.OfType<DeclineEventRequest>()
|
||||||
|
.SelectMany(DeclineEvent));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CalendarSynchronizerOperation.TentativeEvent:
|
case CalendarSynchronizerOperation.TentativeEvent:
|
||||||
nativeRequests.AddRange(TentativeEvent(group.ElementAt(0) as TentativeEventRequest));
|
nativeRequests.AddRange(group
|
||||||
|
.OfType<TentativeEventRequest>()
|
||||||
|
.SelectMany(TentativeEvent));
|
||||||
break;
|
break;
|
||||||
case CalendarSynchronizerOperation.UpdateEvent:
|
case CalendarSynchronizerOperation.UpdateEvent:
|
||||||
nativeRequests.AddRange(UpdateCalendarEvent(group.ElementAt(0) as UpdateCalendarEventRequest));
|
nativeRequests.AddRange(group
|
||||||
|
.OfType<UpdateCalendarEventRequest>()
|
||||||
|
.SelectMany(UpdateCalendarEvent));
|
||||||
break;
|
break;
|
||||||
case CalendarSynchronizerOperation.DeleteEvent:
|
case CalendarSynchronizerOperation.DeleteEvent:
|
||||||
nativeRequests.AddRange(DeleteCalendarEvent(group.ElementAt(0) as DeleteCalendarEventRequest));
|
nativeRequests.AddRange(group
|
||||||
|
.OfType<DeleteCalendarEventRequest>()
|
||||||
|
.SelectMany(DeleteCalendarEvent));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user