diff --git a/ModernKeePass.Application/Application.csproj b/ModernKeePass.Application/Application.csproj index e48f95d..612419f 100644 --- a/ModernKeePass.Application/Application.csproj +++ b/ModernKeePass.Application/Application.csproj @@ -75,7 +75,7 @@ - + diff --git a/ModernKeePass.Application/Common/Behaviors/SetDirtyBehavior.cs b/ModernKeePass.Application/Common/Behaviors/DirtyStatusBehavior.cs similarity index 75% rename from ModernKeePass.Application/Common/Behaviors/SetDirtyBehavior.cs rename to ModernKeePass.Application/Common/Behaviors/DirtyStatusBehavior.cs index d2034ed..05c4555 100644 --- a/ModernKeePass.Application/Common/Behaviors/SetDirtyBehavior.cs +++ b/ModernKeePass.Application/Common/Behaviors/DirtyStatusBehavior.cs @@ -7,14 +7,14 @@ using ModernKeePass.Application.Database.Commands.SaveDatabase; namespace ModernKeePass.Application.Common.Behaviors { - public class SetDirtyBehavior : IPipelineBehavior + public class DirtyStatusBehavior : IPipelineBehavior { private readonly List _excludedCommands = new List {nameof(SaveDatabaseCommand), nameof(CloseDatabaseCommand)}; private readonly IDatabaseProxy _database; - public SetDirtyBehavior(IDatabaseProxy database) + public DirtyStatusBehavior(IDatabaseProxy database) { _database = database; } @@ -23,9 +23,9 @@ namespace ModernKeePass.Application.Common.Behaviors { var response = await next(); var queryName = typeof(TRequest).Name; - if (queryName.Contains("Command") && !_excludedCommands.Contains(queryName)) + if (queryName.Contains("Command")) { - _database.IsDirty = true; + _database.IsDirty = !_excludedCommands.Contains(queryName); } return response; diff --git a/ModernKeePass.Application/Database/Commands/CloseDatabase/CloseDatabaseCommand.cs b/ModernKeePass.Application/Database/Commands/CloseDatabase/CloseDatabaseCommand.cs index 96c5040..f17d97f 100644 --- a/ModernKeePass.Application/Database/Commands/CloseDatabase/CloseDatabaseCommand.cs +++ b/ModernKeePass.Application/Database/Commands/CloseDatabase/CloseDatabaseCommand.cs @@ -21,7 +21,6 @@ namespace ModernKeePass.Application.Database.Commands.CloseDatabase // Cleanup _database.FileAccessToken = null; - _database.IsDirty = false; _database.Size = 0; } } diff --git a/ModernKeePass.Application/Database/Commands/SaveDatabase/SaveDatabaseCommand.cs b/ModernKeePass.Application/Database/Commands/SaveDatabase/SaveDatabaseCommand.cs index 94cc86f..6b57a1d 100644 --- a/ModernKeePass.Application/Database/Commands/SaveDatabase/SaveDatabaseCommand.cs +++ b/ModernKeePass.Application/Database/Commands/SaveDatabase/SaveDatabaseCommand.cs @@ -47,8 +47,6 @@ namespace ModernKeePass.Application.Database.Commands.SaveDatabase _file.ReleaseFile(_database.FileAccessToken); _database.FileAccessToken = message.FilePath; } - - _database.IsDirty = false; } catch (Exception exception) { diff --git a/ModernKeePass.Application/DependencyInjection.cs b/ModernKeePass.Application/DependencyInjection.cs index 8b02a02..5ec0c9d 100644 --- a/ModernKeePass.Application/DependencyInjection.cs +++ b/ModernKeePass.Application/DependencyInjection.cs @@ -12,7 +12,7 @@ namespace ModernKeePass.Application { var assembly = typeof(DependencyInjection).GetTypeInfo().Assembly; services.AddMediatR(assembly); - services.AddTransient(typeof(IPipelineBehavior<,>), typeof(SetDirtyBehavior<,>)); + services.AddTransient(typeof(IPipelineBehavior<,>), typeof(DirtyStatusBehavior<,>)); //services.AddValidatorsFromAssembly(assembly); return services; diff --git a/ModernKeePass/ViewModels/GroupDetailVm.cs b/ModernKeePass/ViewModels/GroupDetailVm.cs index 7667a08..0d34d9d 100644 --- a/ModernKeePass/ViewModels/GroupDetailVm.cs +++ b/ModernKeePass/ViewModels/GroupDetailVm.cs @@ -137,25 +137,34 @@ namespace ModernKeePass.ViewModels Entries.CollectionChanged += Entries_CollectionChanged; Groups = new ObservableCollection(_group.SubGroups); } + + public void GoToEntry(string entryId, bool isNew = false) + { + _navigation.NavigateTo(Constants.Navigation.EntryPage, new NavigationItem + { + Id = entryId, + IsNew = isNew + }); + } + public void GoToGroup(string entryId, bool isNew = false) + { + _navigation.NavigateTo(Constants.Navigation.GroupPage, new NavigationItem + { + Id = entryId, + IsNew = isNew + }); + } public async Task AddNewGroup(string name = "") { var group = await _mediator.Send(new CreateGroupCommand {Name = name, ParentGroup = _group}); - _navigation.NavigateTo(Constants.Navigation.GroupPage, new NavigationItem - { - Id = group.Id, - IsNew = true - }); + GoToGroup(group.Id, true); } public async Task AddNewEntry() { var entry = await _mediator.Send(new CreateEntryCommand { ParentGroup = _group }); - _navigation.NavigateTo(Constants.Navigation.EntryPage, new NavigationItem - { - Id = entry.Id, - IsNew = true - }); + GoToEntry(entry.Id, true); } public async Task Move(GroupVm destination) diff --git a/ModernKeePass/Views/GroupDetailPage.xaml.cs b/ModernKeePass/Views/GroupDetailPage.xaml.cs index 8de42b3..46f1079 100644 --- a/ModernKeePass/Views/GroupDetailPage.xaml.cs +++ b/ModernKeePass/Views/GroupDetailPage.xaml.cs @@ -5,10 +5,7 @@ using Windows.Storage.Streams; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; -using GalaSoft.MvvmLight.Views; -using Microsoft.Extensions.DependencyInjection; using ModernKeePass.Application.Entry.Models; -using ModernKeePass.Common; using ModernKeePass.Models; using ModernKeePass.ViewModels; @@ -22,15 +19,11 @@ namespace ModernKeePass.Views /// public sealed partial class GroupDetailPage { - private readonly INavigationService _navigation; - public GroupDetailVm Model => (GroupDetailVm)DataContext; - public GroupDetailPage(): this (App.Services.GetRequiredService()) { } - public GroupDetailPage(INavigationService navigation) + public GroupDetailPage() { InitializeComponent(); - _navigation = navigation; } #region NavigationHelper registration @@ -58,7 +51,7 @@ namespace ModernKeePass.Views return; default: var group = listView?.SelectedItem as Application.Group.Models.GroupVm; - _navigation.NavigateTo(Constants.Navigation.GroupPage, new NavigationItem { Id = group?.Id }); + Model.GoToGroup(group?.Id); break; } } @@ -71,7 +64,7 @@ namespace ModernKeePass.Views return; default: var entry = GridView.SelectedItem as EntryVm; - _navigation.NavigateTo(Constants.Navigation.EntryPage, new NavigationItem { Id = entry?.Id }); + Model.GoToEntry(entry?.Id); break; } } @@ -103,7 +96,7 @@ namespace ModernKeePass.Views private void SearchBox_OnResultSuggestionChosen(SearchBox sender, SearchBoxResultSuggestionChosenEventArgs args) { - _navigation.NavigateTo(Constants.Navigation.EntryPage, new NavigationItem { Id = args.Tag }); + Model.GoToEntry(args.Tag); } private void GroupDetailPage_OnSizeChanged(object sender, SizeChangedEventArgs e) diff --git a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml index 0e04cfd..756cd32 100644 --- a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml +++ b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml @@ -21,30 +21,6 @@ - - - - - - - CSV - - - - - - diff --git a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs index 0d3fa7d..0dd56c1 100644 --- a/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/NewDatabasePage.xaml.cs @@ -3,11 +3,7 @@ using System.Collections.Generic; using Windows.Storage.AccessCache; using Windows.Storage.Pickers; using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; -using Microsoft.Extensions.DependencyInjection; -using ModernKeePass.Application.Common.Interfaces; using ModernKeePass.Domain.Dtos; -using ModernKeePass.Infrastructure.File; using ModernKeePass.ViewModels; // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 @@ -19,13 +15,10 @@ namespace ModernKeePass.Views /// public sealed partial class NewDatabasePage { - private readonly IResourceProxy _resource; private NewVm Model => (NewVm)DataContext; - - public NewDatabasePage(): this(App.Services.GetRequiredService()) { } - public NewDatabasePage(IResourceProxy resource) + + public NewDatabasePage() { - _resource = resource; InitializeComponent(); } @@ -50,33 +43,5 @@ namespace ModernKeePass.Views }; Model.OpenFile(fileInfo); } - - private void ImportFormatComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e) - { - var comboBox = sender as ComboBox; - switch (comboBox?.SelectedIndex) - { - case 0: - Model.ImportFormat = new CsvImportFormat(); - Model.ImportFileExtensionFilter = ".csv"; - Model.ImportFormatHelp = _resource.GetResourceValue("NewImportFormatHelpCSV"); - break; - } - } - - private async void ImportFileButton_OnClick(object sender, RoutedEventArgs e) - { - var picker = new FileOpenPicker - { - ViewMode = PickerViewMode.List, - SuggestedStartLocation = PickerLocationId.DocumentsLibrary - }; - if (!string.IsNullOrEmpty(Model.ImportFileExtensionFilter)) - picker.FileTypeFilter.Add(Model.ImportFileExtensionFilter); - - // Application now has read/write access to the picked file - Model.ImportFile = await picker.PickSingleFileAsync().AsTask(); - if (Model.ImportFile != null) ImportFileLink.Content = Model.ImportFile.Name; - } } } diff --git a/README.md b/README.md index 503ae42..1f1af84 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ You can get it [here](https://www.microsoft.com/en-us/store/p/modernkeepass/9mwq - Change database compression - Change database key derivation - Displays and change entry colors and icons -- Import existing CSV data +- Move entries from a group to another # Build and Test 1. Clone the repository @@ -38,7 +38,7 @@ Otherwise, there are still many things left to implement: - Entry custom fields - Entry attachments - Multi entry selection (for delete, or move) -- Move entries from a group to another +- Import existing data from CSV, JSON, or XML - Open database from URL (and maybe some clouds?) # Credits diff --git a/WinAppCommon/ViewModels/NewVm.cs b/WinAppCommon/ViewModels/NewVm.cs index 28e4095..d97fd00 100644 --- a/WinAppCommon/ViewModels/NewVm.cs +++ b/WinAppCommon/ViewModels/NewVm.cs @@ -1,5 +1,4 @@ using System.Threading.Tasks; -using Windows.Storage; using GalaSoft.MvvmLight.Views; using MediatR; using Messages; @@ -16,25 +15,6 @@ namespace ModernKeePass.ViewModels private readonly IMediator _mediator; private readonly ISettingsProxy _settings; private readonly INavigationService _navigation; - private string _importFormatHelp; - - public bool IsImportChecked { get; set; } - - public IStorageFile ImportFile { get; set; } - - public string ImportFileExtensionFilter { get; set; } = "*"; - - public IImportFormat ImportFormat { get; set; } - - public string ImportFormatHelp - { - get { return _importFormatHelp; } - set - { - _importFormatHelp = value; - RaisePropertyChanged(nameof(ImportFormatHelp)); - } - } public NewVm(IMediator mediator, IRecentProxy recent, ISettingsProxy settings, INavigationService navigation) { @@ -67,6 +47,7 @@ namespace ModernKeePass.ViewModels Version = _settings.GetSetting(Constants.Settings.DefaultFileFormat, "4"), CreateSampleData = _settings.GetSetting(Constants.Settings.Sample) }); + var database = await _mediator.Send(new GetDatabaseQuery()); _navigation.NavigateTo(Constants.Navigation.GroupPage, new NavigationItem { Id = database.RootGroupId }); }