diff --git a/Wino.Calendar.ViewModels/CalendarPageViewModel.cs b/Wino.Calendar.ViewModels/CalendarPageViewModel.cs index d154ce49..a8ffb1a7 100644 --- a/Wino.Calendar.ViewModels/CalendarPageViewModel.cs +++ b/Wino.Calendar.ViewModels/CalendarPageViewModel.cs @@ -902,6 +902,21 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel, } } + private void UpdateCalendarItemBusyState(Guid calendarItemId, bool isBusy) + { + var calendarItems = DayRanges + .SelectMany(a => a.CalendarDays) + .Select(b => b.EventsCollection.GetCalendarItem(calendarItemId)) + .Where(c => c != null) + .OfType() + .Distinct(); + + foreach (var item in calendarItems) + { + item.IsBusy = isBusy; + } + } + public void Receive(CalendarItemTappedMessage message) { if (message.CalendarItemViewModel == null) return; @@ -970,6 +985,15 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel, await ExecuteUIThread(() => { + if (source == CalendarItemUpdateSource.ClientUpdated) + { + UpdateCalendarItemBusyState(calendarItem.Id, true); + } + else if (source == CalendarItemUpdateSource.ClientReverted || source == CalendarItemUpdateSource.Server) + { + UpdateCalendarItemBusyState(calendarItem.Id, false); + } + // Update existing items in-place where the item should remain foreach (var calendarDay in currentDaysWithItem) { @@ -977,6 +1001,15 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel, { // Item should stay in this day - update in-place calendarDay.EventsCollection.UpdateCalendarItem(calendarItem); + + if (source == CalendarItemUpdateSource.Server) + { + var existingViewModel = calendarDay.EventsCollection.GetCalendarItem(calendarItem.Id) as CalendarItemViewModel; + if (existingViewModel != null) + { + existingViewModel.IsBusy = false; + } + } } else { @@ -1069,7 +1102,10 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel, foreach (var calendarDay in allDaysForEvent) { - var calendarItemViewModel = new CalendarItemViewModel(calendarItem); + var calendarItemViewModel = new CalendarItemViewModel(calendarItem) + { + IsBusy = string.IsNullOrEmpty(calendarItem.RemoteEventId) + }; await ExecuteUIThread(() => { diff --git a/Wino.Calendar.ViewModels/Data/CalendarItemViewModel.cs b/Wino.Calendar.ViewModels/Data/CalendarItemViewModel.cs index f0771b1e..409fdb9a 100644 --- a/Wino.Calendar.ViewModels/Data/CalendarItemViewModel.cs +++ b/Wino.Calendar.ViewModels/Data/CalendarItemViewModel.cs @@ -74,6 +74,9 @@ public partial class CalendarItemViewModel : ObservableObject, ICalendarItem, IC [ObservableProperty] public partial bool IsSelected { get; set; } + [ObservableProperty] + public partial bool IsBusy { get; set; } + /// /// The period of the day where this item is currently being displayed. /// Used for multi-day event title formatting. diff --git a/Wino.Calendar.ViewModels/EventDetailsPageViewModel.cs b/Wino.Calendar.ViewModels/EventDetailsPageViewModel.cs index 2e91dd0e..c13bd876 100644 --- a/Wino.Calendar.ViewModels/EventDetailsPageViewModel.cs +++ b/Wino.Calendar.ViewModels/EventDetailsPageViewModel.cs @@ -191,7 +191,10 @@ public partial class EventDetailsPageViewModel : CalendarBaseViewModel if (source == CalendarItemUpdateSource.ClientUpdated || source == CalendarItemUpdateSource.ClientReverted) { var previousAttendees = CurrentEvent?.Attendees?.ToList() ?? []; - CurrentEvent = new CalendarItemViewModel(calendarItem); + CurrentEvent = new CalendarItemViewModel(calendarItem) + { + IsBusy = source == CalendarItemUpdateSource.ClientUpdated + }; foreach (var attendee in previousAttendees) { diff --git a/Wino.Core.Domain/Interfaces/ICalendarItemViewModel.cs b/Wino.Core.Domain/Interfaces/ICalendarItemViewModel.cs index 4600a3b2..55a91f68 100644 --- a/Wino.Core.Domain/Interfaces/ICalendarItemViewModel.cs +++ b/Wino.Core.Domain/Interfaces/ICalendarItemViewModel.cs @@ -11,6 +11,8 @@ public interface ICalendarItemViewModel { bool IsSelected { get; set; } + bool IsBusy { get; set; } + /// /// The period of the day where this item is currently being displayed. /// diff --git a/Wino.Mail.WinUI/Controls/Calendar/CalendarItemControl.xaml b/Wino.Mail.WinUI/Controls/Calendar/CalendarItemControl.xaml index 0c73897d..64ce0b93 100644 --- a/Wino.Mail.WinUI/Controls/Calendar/CalendarItemControl.xaml +++ b/Wino.Mail.WinUI/Controls/Calendar/CalendarItemControl.xaml @@ -77,6 +77,18 @@ Text="{x:Bind CalendarItem.DisplayTitle, Mode=OneWay}" TextTrimming="CharacterEllipsis" /> + + + + + + + + + + + + + + + + +