diff --git a/Wino.Calendar.ViewModels/AccountManagementViewModel.cs b/Wino.Calendar.ViewModels/AccountManagementViewModel.cs index ae78ede5..70b6108d 100644 --- a/Wino.Calendar.ViewModels/AccountManagementViewModel.cs +++ b/Wino.Calendar.ViewModels/AccountManagementViewModel.cs @@ -125,7 +125,7 @@ namespace Wino.Calendar.ViewModels Type = MailSynchronizationType.UpdateProfile }; - var profileSynchronizationResponse = await WinoServerConnectionManager.GetResponseAsync(new NewSynchronizationRequested(profileSyncOptions, SynchronizationSource.Client)); + var profileSynchronizationResponse = await WinoServerConnectionManager.GetResponseAsync(new NewMailSynchronizationRequested(profileSyncOptions, SynchronizationSource.Client)); var profileSynchronizationResult = profileSynchronizationResponse.Data; @@ -141,11 +141,13 @@ namespace Wino.Calendar.ViewModels accountCreationDialog.State = AccountCreationDialogState.FetchingEvents; // Start synchronizing events. - var eventsSyncOptions = new MailSynchronizationOptions() + var synchronizationOptions = new CalendarSynchronizationOptions() { AccountId = createdAccount.Id, - Type = MailSynchronizationType.Events + Type = CalendarSynchronizationType.CalendarMetadata }; + + var synchronizationResponse = await WinoServerConnectionManager.GetResponseAsync(new NewCalendarSynchronizationRequested(synchronizationOptions, SynchronizationSource.Client)); } } } diff --git a/Wino.Calendar.ViewModels/AppShellViewModel.cs b/Wino.Calendar.ViewModels/AppShellViewModel.cs index a7de7e14..23376be1 100644 --- a/Wino.Calendar.ViewModels/AppShellViewModel.cs +++ b/Wino.Calendar.ViewModels/AppShellViewModel.cs @@ -1,6 +1,5 @@ using System; using System.Globalization; -using System.Linq; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; @@ -8,13 +7,14 @@ using CommunityToolkit.Mvvm.Messaging; using Wino.Core.Domain.Collections; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; -using Wino.Core.Domain.MenuItems; using Wino.Core.Domain.Models.Calendar; using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Domain.Models.Synchronization; using Wino.Core.Extensions; using Wino.Core.ViewModels; using Wino.Messaging.Client.Calendar; using Wino.Messaging.Client.Navigation; +using Wino.Messaging.Server; namespace Wino.Calendar.ViewModels { @@ -22,18 +22,17 @@ namespace Wino.Calendar.ViewModels IRecipient, IRecipient, IRecipient, - IRecipient + IRecipient, + IRecipient { public event EventHandler DisplayTypeChanged; public IPreferencesService PreferencesService { get; } public IStatePersistanceService StatePersistenceService { get; } public INavigationService NavigationService { get; } public IWinoServerConnectionManager ServerConnectionManager { get; } - public MenuItemCollection FooterItems { get; set; } - public MenuItemCollection MenuItems { get; set; } [ObservableProperty] - private IMenuItem _selectedMenuItem; + private int _selectedMenuItemIndex = -1; [ObservableProperty] private bool isCalendarEnabled; @@ -62,10 +61,13 @@ namespace Wino.Calendar.ViewModels [ObservableProperty] private int _selectedDateNavigationHeaderIndex; + private readonly IAccountService _accountService; + public bool IsVerticalCalendar => StatePersistenceService.CalendarDisplayType == CalendarDisplayType.Month; public AppShellViewModel(IPreferencesService preferencesService, IStatePersistanceService statePersistanceService, + IAccountService accountService, INavigationService navigationService, IWinoServerConnectionManager serverConnectionManager) { @@ -74,6 +76,7 @@ namespace Wino.Calendar.ViewModels PreferencesService = preferencesService; StatePersistenceService = statePersistanceService; + _accountService = accountService; StatePersistenceService.StatePropertyChanged += PrefefencesChanged; } @@ -93,20 +96,37 @@ namespace Wino.Calendar.ViewModels { base.OnNavigatedTo(mode, parameters); - CreateFooterItems(); UpdateDateNavigationHeaderItems(); } - partial void OnSelectedMenuItemChanged(IMenuItem oldValue, IMenuItem newValue) + partial void OnSelectedMenuItemIndexChanged(int oldValue, int newValue) { - if (newValue is SettingsItem) + switch (newValue) { - NavigationService.Navigate(WinoPage.SettingsPage); + case -1: + NavigationService.Navigate(WinoPage.CalendarPage); + break; + case 0: + NavigationService.Navigate(WinoPage.AccountManagementPage); + break; + case 1: + NavigationService.Navigate(WinoPage.SettingsPage); + break; + default: + break; } - else if (newValue is ManageAccountsMenuItem) + } + + [RelayCommand] + private void Sync() + { + var t = new NewCalendarSynchronizationRequested(new CalendarSynchronizationOptions() { - NavigationService.Navigate(WinoPage.AccountManagementPage); - } + AccountId = Guid.Parse("52fae547-0740-4aa3-8d51-519bd31278ca"), + Type = CalendarSynchronizationType.CalendarMetadata + }, SynchronizationSource.Client); + + Messenger.Send(t); } /// @@ -142,14 +162,6 @@ namespace Wino.Calendar.ViewModels return DateTime.Today.Date; } - protected override void OnDispatcherAssigned() - { - base.OnDispatcherAssigned(); - - MenuItems = new MenuItemCollection(Dispatcher); - FooterItems = new MenuItemCollection(Dispatcher); - } - public override void OnPageLoaded() { base.OnPageLoaded(); @@ -160,13 +172,6 @@ namespace Wino.Calendar.ViewModels }); } - private void CreateFooterItems() - { - FooterItems.Clear(); - FooterItems.Add(new ManageAccountsMenuItem()); - FooterItems.Add(new SettingsItem()); - } - #region Commands [RelayCommand] @@ -236,6 +241,8 @@ namespace Wino.Calendar.ViewModels // Calendar page is loaded and calendar is ready to recieve render requests. public void Receive(CalendarInitializedMessage message) => Messenger.Send(new GoToCalendarDayMessage(DateTime.Now.Date)); - public void Receive(NavigateManageAccountsRequested message) => SelectedMenuItem = FooterItems.FirstOrDefault(a => a is ManageAccountsMenuItem); + public void Receive(NavigateManageAccountsRequested message) => SelectedMenuItemIndex = 1; + + public void Receive(GoToCalendarDayMessage message) => SelectedMenuItemIndex = -1; } } diff --git a/Wino.Calendar.ViewModels/CalendarPageViewModel.cs b/Wino.Calendar.ViewModels/CalendarPageViewModel.cs index a4f579c9..0f4f2500 100644 --- a/Wino.Calendar.ViewModels/CalendarPageViewModel.cs +++ b/Wino.Calendar.ViewModels/CalendarPageViewModel.cs @@ -375,62 +375,62 @@ namespace Wino.Calendar.ViewModels base.OnCalendarEventAdded(calendarItem); // Test - var eventDays = DayRanges.SelectMany(a => a.CalendarDays).Where(b => b.Period.Start.Date == calendarItem.StartTime.Date); + //var eventDays = DayRanges.SelectMany(a => a.CalendarDays).Where(b => b.Period.Start.Date == calendarItem.StartTime.Date); - var beforeAllDay = new CalendarItem(calendarItem.StartTime.Date.AddHours(0), calendarItem.StartTime.Date.AddMinutes(30)) - { - Title = "kj" - }; + //var beforeAllDay = new CalendarItem(calendarItem.StartTime.Date.AddHours(0), calendarItem.StartTime.Date.AddMinutes(30)) + //{ + // Title = "kj" + //}; - var allday = new CalendarItem(calendarItem.StartTime.Date.AddHours(1), calendarItem.StartTime.Date.AddHours(10).AddMinutes(59)) - { - Title = "All day" - }; + //var allday = new CalendarItem(calendarItem.StartTime.Date.AddHours(1), calendarItem.StartTime.Date.AddHours(10).AddMinutes(59)) + //{ + // Title = "All day" + //}; - var test = new CalendarItem(calendarItem.StartTime.Date.AddHours(4), calendarItem.StartTime.Date.AddHours(4).AddMinutes(30)) - { - Title = "test" - }; + //var test = new CalendarItem(calendarItem.StartTime.Date.AddHours(4), calendarItem.StartTime.Date.AddHours(4).AddMinutes(30)) + //{ + // Title = "test" + //}; - var hour = new CalendarItem(calendarItem.StartTime.Date.AddHours(7), calendarItem.StartTime.Date.AddHours(8)) - { - Title = "1 h" - }; + //var hour = new CalendarItem(calendarItem.StartTime.Date.AddHours(7), calendarItem.StartTime.Date.AddHours(8)) + //{ + // Title = "1 h" + //}; - var hourandhalf = new CalendarItem(calendarItem.StartTime.Date.AddHours(7), calendarItem.StartTime.Date.AddHours(8).AddMinutes(30)) - { - Title = "1.5 h" - }; - var halfhour1 = new CalendarItem(calendarItem.StartTime.Date.AddHours(7), calendarItem.StartTime.Date.AddHours(7).AddMinutes(30)) - { - Title = "30 min" - }; + //var hourandhalf = new CalendarItem(calendarItem.StartTime.Date.AddHours(7), calendarItem.StartTime.Date.AddHours(8).AddMinutes(30)) + //{ + // Title = "1.5 h" + //}; + //var halfhour1 = new CalendarItem(calendarItem.StartTime.Date.AddHours(7), calendarItem.StartTime.Date.AddHours(7).AddMinutes(30)) + //{ + // Title = "30 min" + //}; - var halfhour2 = new CalendarItem(calendarItem.StartTime.Date.AddHours(7).AddMinutes(30), calendarItem.StartTime.Date.AddHours(8)) - { - Title = "30 min" - }; - var halfhour3 = new CalendarItem(calendarItem.StartTime.Date.AddHours(8), calendarItem.StartTime.Date.AddHours(8).AddMinutes(30)) - { - Title = "30 min" - }; + //var halfhour2 = new CalendarItem(calendarItem.StartTime.Date.AddHours(7).AddMinutes(30), calendarItem.StartTime.Date.AddHours(8)) + //{ + // Title = "30 min" + //}; + //var halfhour3 = new CalendarItem(calendarItem.StartTime.Date.AddHours(8), calendarItem.StartTime.Date.AddHours(8).AddMinutes(30)) + //{ + // Title = "30 min" + //}; - foreach (var day in eventDays) - { - await ExecuteUIThread(() => - { - day.Events.Add(beforeAllDay); - day.Events.Add(allday); - day.Events.Add(hourandhalf); - day.Events.Add(hour); - day.Events.Add(halfhour1); - day.Events.Add(halfhour2); - day.Events.Add(halfhour3); - day.Events.Add(test); - }); - } + //foreach (var day in eventDays) + //{ + // await ExecuteUIThread(() => + // { + // day.Events.Add(beforeAllDay); + // day.Events.Add(allday); + // day.Events.Add(hourandhalf); + // day.Events.Add(hour); + // day.Events.Add(halfhour1); + // day.Events.Add(halfhour2); + // day.Events.Add(halfhour3); + // day.Events.Add(test); + // }); + //} - return; + //return; } } } diff --git a/Wino.Calendar/App.xaml.cs b/Wino.Calendar/App.xaml.cs index 510fe951..90faee93 100644 --- a/Wino.Calendar/App.xaml.cs +++ b/Wino.Calendar/App.xaml.cs @@ -12,7 +12,11 @@ using Wino.Activation; using Wino.Calendar.Activation; using Wino.Calendar.Services; using Wino.Calendar.ViewModels; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Exceptions; using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Synchronization; using Wino.Core.UWP; using Wino.Messaging.Client.Connection; using Wino.Messaging.Server; @@ -20,7 +24,7 @@ using Wino.Services; namespace Wino.Calendar { - public sealed partial class App : WinoApplication, IRecipient + public sealed partial class App : WinoApplication, IRecipient { public override string AppCenterKey => "dfdad6ab-95f9-44cc-9112-45ec6730c49e"; @@ -101,13 +105,6 @@ namespace Wino.Calendar protected override ActivationHandler GetDefaultActivationHandler() => new DefaultActivationHandler(); - public void Receive(NewSynchronizationRequested message) - { - - } - - - protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args) { base.OnBackgroundActivated(args); @@ -142,5 +139,20 @@ namespace Wino.Calendar AppServiceConnectionManager.Connection = null; } + + public async void Receive(NewCalendarSynchronizationRequested message) + { + try + { + var synchronizationResultResponse = await AppServiceConnectionManager.GetResponseAsync(message); + synchronizationResultResponse.ThrowIfFailed(); + } + catch (WinoServerException serverException) + { + var dialogService = Services.GetService(); + + dialogService.InfoBarMessage(Translator.Info_SyncFailedTitle, serverException.Message, InfoBarMessageType.Error); + } + } } } diff --git a/Wino.Calendar/Controls/WinoCalendarPanel.cs b/Wino.Calendar/Controls/WinoCalendarPanel.cs index 78144342..64dff365 100644 --- a/Wino.Calendar/Controls/WinoCalendarPanel.cs +++ b/Wino.Calendar/Controls/WinoCalendarPanel.cs @@ -129,7 +129,9 @@ namespace Wino.Calendar.Controls var childMeasurement = _measurements[child.Item.Id]; - double childHeight = Math.Max(0, GetChildHeight(child.Item.StartTime, child.Item.EndTime)); + // TODO Math.Max(0, GetChildHeight(child.Item.StartTime, child.Item.EndTime)); + // Recurring events may not have an end time. We need to calculate the height based on the start time and duration. + double childHeight = 50; double childWidth = Math.Max(0, GetChildWidth(childMeasurement, finalSize.Width)); double childTop = Math.Max(0, GetChildTopMargin(child.Item.StartTime, availableHeight)); double childLeft = Math.Max(0, GetChildLeftMargin(childMeasurement, availableWidth)); diff --git a/Wino.Calendar/Styles/CalendarRenderStyles.xaml b/Wino.Calendar/Styles/CalendarRenderStyles.xaml index 5bedf96b..6387c5b4 100644 --- a/Wino.Calendar/Styles/CalendarRenderStyles.xaml +++ b/Wino.Calendar/Styles/CalendarRenderStyles.xaml @@ -19,7 +19,7 @@ #121212 #3d3d3d - #30336b + #4b4b4b diff --git a/Wino.Calendar/Views/AppShell.xaml b/Wino.Calendar/Views/AppShell.xaml index 3f1ec9c0..05bb1822 100644 --- a/Wino.Calendar/Views/AppShell.xaml +++ b/Wino.Calendar/Views/AppShell.xaml @@ -9,6 +9,8 @@ xmlns:coreControls="using:Wino.Core.UWP.Controls" xmlns:coreSelectors="using:Wino.Core.UWP.Selectors" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:domain="using:Wino.Core.Domain" + xmlns:helpers="using:Wino.Helpers" xmlns:local="using:Wino.Calendar.Views" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:muxc="using:Microsoft.UI.Xaml.Controls" @@ -57,8 +59,8 @@ ConnectionStatus="{x:Bind ViewModel.ActiveConnectionStatus, Mode=OneWay}" CoreWindowText="Wino Calendar" IsBackButtonVisible="{x:Bind ViewModel.StatePersistenceService.IsBackButtonVisible, Mode=OneWay}" - IsNavigationPaneOpen="{x:Bind MainNavigationView.IsPaneOpen, Mode=TwoWay}" - NavigationViewDisplayMode="{x:Bind MainNavigationView.DisplayMode, Mode=OneWay}" + IsNavigationPaneOpen="{x:Bind MainSplitView.IsPaneOpen, Mode=TwoWay}" + NavigationViewDisplayMode="{x:Bind helpers:XamlHelpers.NavigationViewDisplayModeConverter(MainSplitView.DisplayMode), Mode=OneWay}" OpenPaneLength="{x:Bind ViewModel.StatePersistenceService.OpenPaneLength, Mode=OneWay}" ReconnectCommand="{x:Bind ViewModel.ReconnectServerCommand}" ShrinkShellContentOnExpansion="False" @@ -149,39 +151,86 @@ Background="{ThemeResource WinoApplicationBackgroundColor}" IsHitTestVisible="False" /> - - - - - - + Background="Transparent" + DisplayMode="Inline" + IsPaneOpen="True" + PaneBackground="Transparent"> + + + + + + + - - - - + + + + +