From 2fb5b14085003387b08d5eee982b959095352643 Mon Sep 17 00:00:00 2001 From: Geoffroy BONNEVILLE Date: Thu, 16 Apr 2020 19:43:17 +0200 Subject: [PATCH] Updating group raise SaveCommand can execute No need to click twice on history menu Skipped first history entry as it is the same as the current entry Stored SaveException innerexception as it is read more than once --- ModernKeePass/App.xaml.cs | 5 +++-- ModernKeePass/ViewModels/EntryDetailVm.cs | 7 ++++--- ModernKeePass/ViewModels/GroupDetailVm.cs | 12 ++++++++++-- ModernKeePass/ViewModels/SaveVm.cs | 18 +++++++++++++++++- .../MainPageFrames/SaveDatabasePage.xaml | 6 ++++-- .../MainPageFrames/SaveDatabasePage.xaml.cs | 19 ++----------------- .../HamburgerMenuUserControl.xaml.cs | 2 +- 7 files changed, 41 insertions(+), 28 deletions(-) diff --git a/ModernKeePass/App.xaml.cs b/ModernKeePass/App.xaml.cs index ff4b050..3c2d49f 100644 --- a/ModernKeePass/App.xaml.cs +++ b/ModernKeePass/App.xaml.cs @@ -84,10 +84,11 @@ namespace ModernKeePass if (realException is SaveException) { + var innerException = realException.InnerException; unhandledExceptionEventArgs.Handled = true; - HockeyClient.Current.TrackException(realException.InnerException); + HockeyClient.Current.TrackException(innerException); await MessageDialogHelper.ShowActionDialog(_resource.GetResourceValue("MessageDialogSaveErrorTitle"), - realException.InnerException.Message, + innerException?.Message, _resource.GetResourceValue("MessageDialogSaveErrorButtonSaveAs"), _resource.GetResourceValue("MessageDialogSaveErrorButtonDiscard"), async command => diff --git a/ModernKeePass/ViewModels/EntryDetailVm.cs b/ModernKeePass/ViewModels/EntryDetailVm.cs index 1581290..ca03228 100644 --- a/ModernKeePass/ViewModels/EntryDetailVm.cs +++ b/ModernKeePass/ViewModels/EntryDetailVm.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Linq; using System.Threading.Tasks; using System.Windows.Input; using Windows.UI.Xaml.Controls; @@ -241,7 +242,7 @@ namespace ModernKeePass.ViewModels SelectedItem = _mediator.Send(new GetEntryQuery { Id = entryId }).GetAwaiter().GetResult(); _parent = _mediator.Send(new GetGroupQuery { Id = SelectedItem.ParentGroupId }).GetAwaiter().GetResult(); History = new ObservableCollection { SelectedItem }; - foreach (var entry in SelectedItem.History) + foreach (var entry in SelectedItem.History.Skip(1)) { History.Add(entry); } @@ -296,7 +297,7 @@ namespace ModernKeePass.ViewModels private async Task RestoreHistory() { - await _mediator.Send(new RestoreHistoryCommand { Entry = History[0], HistoryIndex = History.Count - SelectedIndex - 1 }); + await _mediator.Send(new RestoreHistoryCommand { Entry = History[0], HistoryIndex = History.Count - SelectedIndex }); History.Insert(0, SelectedItem); SelectedIndex = 0; ((RelayCommand)SaveCommand).RaiseCanExecuteChanged(); @@ -304,7 +305,7 @@ namespace ModernKeePass.ViewModels public async Task DeleteHistory() { - await _mediator.Send(new DeleteHistoryCommand { Entry = History[0], HistoryIndex = History.Count - SelectedIndex - 1 }); + await _mediator.Send(new DeleteHistoryCommand { Entry = History[0], HistoryIndex = History.Count - SelectedIndex }); History.RemoveAt(SelectedIndex); SelectedIndex = 0; ((RelayCommand)SaveCommand).RaiseCanExecuteChanged(); diff --git a/ModernKeePass/ViewModels/GroupDetailVm.cs b/ModernKeePass/ViewModels/GroupDetailVm.cs index 0f5b926..f4033b9 100644 --- a/ModernKeePass/ViewModels/GroupDetailVm.cs +++ b/ModernKeePass/ViewModels/GroupDetailVm.cs @@ -50,13 +50,21 @@ namespace ModernKeePass.ViewModels public string Title { get { return _group.Title; } - set { _mediator.Send(new UpdateGroupCommand {Group = _group, Title = value, Icon = _group.Icon}).Wait(); } + set + { + _mediator.Send(new UpdateGroupCommand {Group = _group, Title = value, Icon = _group.Icon}).Wait(); + ((RelayCommand)SaveCommand).RaiseCanExecuteChanged(); + } } public Symbol Icon { get { return (Symbol) Enum.Parse(typeof(Symbol), _group.Icon.ToString()); } - set { _mediator.Send(new UpdateGroupCommand { Group = _group, Title = _group.Title, Icon = (Icon)Enum.Parse(typeof(Icon), value.ToString()) }).Wait(); } + set + { + _mediator.Send(new UpdateGroupCommand { Group = _group, Title = _group.Title, Icon = (Icon)Enum.Parse(typeof(Icon), value.ToString()) }).Wait(); + ((RelayCommand)SaveCommand).RaiseCanExecuteChanged(); + } } public bool IsEditMode diff --git a/ModernKeePass/ViewModels/SaveVm.cs b/ModernKeePass/ViewModels/SaveVm.cs index 1294eff..e2b2695 100644 --- a/ModernKeePass/ViewModels/SaveVm.cs +++ b/ModernKeePass/ViewModels/SaveVm.cs @@ -1,38 +1,54 @@ using System.Threading.Tasks; using Windows.Storage; using Windows.Storage.AccessCache; +using Windows.UI.Xaml.Controls; using MediatR; using Microsoft.Extensions.DependencyInjection; using ModernKeePass.Application.Database.Commands.CloseDatabase; using ModernKeePass.Application.Database.Commands.SaveDatabase; +using ModernKeePass.Application.Database.Queries.GetDatabase; +using ModernKeePass.Common; +using ModernKeePass.Views; namespace ModernKeePass.ViewModels { public class SaveVm { + public bool IsSaveEnabled => _mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult().IsDirty; + + public RelayCommand SaveCommand { get; } + public RelayCommand CloseCommand { get; } + public Frame Frame { get; set; } + private readonly IMediator _mediator; + public SaveVm() : this(App.Services.GetRequiredService()) { } public SaveVm(IMediator mediator) { _mediator = mediator; + SaveCommand = new RelayCommand(async () => await Save(), () => IsSaveEnabled); + CloseCommand = new RelayCommand(async () => await Close()); } public async Task Save(bool close = true) { await _mediator.Send(new SaveDatabaseCommand()); - if (close) await Close(); + if (close) await _mediator.Send(new CloseDatabaseCommand()); + Frame.Navigate(typeof(MainPage)); } public async Task Save(StorageFile file) { var token = StorageApplicationPermissions.FutureAccessList.Add(file); await _mediator.Send(new SaveDatabaseCommand { FilePath = token }); + Frame.Navigate(typeof(MainPage)); } public async Task Close() { await _mediator.Send(new CloseDatabaseCommand()); + Frame.Navigate(typeof(MainPage)); } } } \ No newline at end of file diff --git a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml index 38213cb..eff6ec0 100644 --- a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml +++ b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml @@ -4,6 +4,8 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewModels="using:ModernKeePass.ViewModels" + xmlns:core="using:Microsoft.Xaml.Interactions.Core" + xmlns:interactivity="using:Microsoft.Xaml.Interactivity" x:Class="ModernKeePass.Views.SaveDatabasePage" mc:Ignorable="d"> @@ -11,11 +13,11 @@ - + - + diff --git a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs index cdcec13..52097fb 100644 --- a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs @@ -15,7 +15,6 @@ namespace ModernKeePass.Views /// public sealed partial class SaveDatabasePage { - private Frame _mainFrame; public SaveVm Model => (SaveVm)DataContext; public SaveDatabasePage() { @@ -25,15 +24,9 @@ namespace ModernKeePass.Views protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); - _mainFrame = e.Parameter as Frame; + Model.Frame = e.Parameter as Frame; } - - private async void SaveButton_OnClick(object sender, RoutedEventArgs e) - { - await Model.Save(); - _mainFrame.Navigate(typeof(MainPage)); - } - + private async void SaveAsButton_OnClick(object sender, RoutedEventArgs e) { var savePicker = new FileSavePicker @@ -46,14 +39,6 @@ namespace ModernKeePass.Views var file = await savePicker.PickSaveFileAsync().AsTask(); if (file == null) return; await Model.Save(file); - - _mainFrame.Navigate(typeof(MainPage)); - } - - private async void CloseButton_OnClick(object sender, RoutedEventArgs e) - { - await Model.Close(); - _mainFrame.Navigate(typeof(MainPage)); } } } diff --git a/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml.cs b/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml.cs index c792391..a93da0e 100644 --- a/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml.cs +++ b/ModernKeePass/Views/UserControls/HamburgerMenuUserControl.xaml.cs @@ -122,7 +122,7 @@ namespace ModernKeePass.Views.UserControls nameof(IsOpen), typeof(bool), typeof(HamburgerMenuUserControl), - new PropertyMetadata(true, (o, args) => { })); + new PropertyMetadata(false, (o, args) => { })); public event EventHandler SelectionChanged; private void Selector_OnSelectionChanged(object sender, SelectionChangedEventArgs e)