History *works*

WIP on save on entry page doesn't show last change
This commit is contained in:
Geoffroy BONNEVILLE
2020-04-14 19:59:19 +02:00
parent 9603c1ff01
commit b66e79f97c
8 changed files with 54 additions and 115 deletions

View File

@@ -88,6 +88,7 @@
<Compile Include="Common\Interfaces\ISettingsProxy.cs" />
<Compile Include="Common\Mappings\IMapFrom.cs" />
<Compile Include="Common\Mappings\MappingProfile.cs" />
<Compile Include="Entry\Commands\AddHistory\AddHistoryCommand.cs" />
<Compile Include="Entry\Queries\GetEntry\GetEntryQuery.cs" />
<Compile Include="Group\Commands\DeleteEntry\DeleteEntryCommand.cs" />
<Compile Include="Group\Commands\DeleteGroup\DeleteGroupCommand.cs" />

View File

@@ -21,6 +21,7 @@ namespace ModernKeePass.Application.Common.Interfaces
Task Open(byte[] file, Credentials credentials);
Task ReOpen(byte[] file);
void AddHistory(string entryId);
Task Create(Credentials credentials, string name, DatabaseVersion version = DatabaseVersion.V2);
Task<byte[]> SaveDatabase();
Task<byte[]> SaveDatabase(byte[] newFileContents);

View File

@@ -0,0 +1,28 @@
using MediatR;
using ModernKeePass.Application.Common.Interfaces;
using ModernKeePass.Domain.Exceptions;
namespace ModernKeePass.Application.Entry.Commands.AddHistory
{
public class AddHistoryCommand : IRequest
{
public string EntryId { get; set; }
public class AddHistoryCommandHandler : IRequestHandler<AddHistoryCommand>
{
private readonly IDatabaseProxy _database;
public AddHistoryCommandHandler(IDatabaseProxy database)
{
_database = database;
}
public void Handle(AddHistoryCommand message)
{
if (!_database.IsOpen) throw new DatabaseClosedException();
_database.AddHistory(message.EntryId);
}
}
}
}

View File

@@ -28,6 +28,7 @@ namespace ModernKeePass.Application.Entry.Models
public bool HasExpirationDate { get; set; }
public DateTimeOffset ExpirationDate { get; set; }
public DateTimeOffset ModificationDate { get; set; }
public bool IsDirty { get; set; }
public override string ToString()
{

View File

@@ -222,8 +222,6 @@ namespace ModernKeePass.Infrastructure.KeePass
public void UpdateEntry(string entryId, string fieldName, object fieldValue)
{
var pwEntry = _pwDatabase.RootGroup.FindEntry(BuildIdFromString(entryId), true);
pwEntry.Touch(true);
pwEntry.CreateBackup(null);
switch (fieldName)
{
@@ -252,6 +250,13 @@ namespace ModernKeePass.Infrastructure.KeePass
}
}
public void AddHistory(string entryId)
{
var pwEntry = _pwDatabase.RootGroup.FindEntry(BuildIdFromString(entryId), true);
pwEntry.Touch(true);
pwEntry.CreateBackup(null);
}
public void UpdateGroup(string groupId)
{
throw new NotImplementedException();

View File

@@ -10,119 +10,10 @@ namespace ModernKeePass.Converters
public object Convert(object value, Type targetType, object parameter, string language)
{
return Enum.Parse(typeof(Symbol), value.ToString());
/*var icon = (Icon)value;
switch (icon)
{
case Icon.Delete: return Symbol.Delete;
case Icon.Edit: return Symbol.Edit;
case Icon.Save: return Symbol.Save;
case Icon.Cancel: return Symbol.Cancel;
case Icon.Accept: return Symbol.Accept;
case Icon.Home: return Symbol.Home;
case Icon.Camera: return Symbol.Camera;
case Icon.Setting: return Symbol.Setting;
case Icon.Mail: return Symbol.Mail;
case Icon.Find: return Symbol.Find;
case Icon.Help: return Symbol.Help;
case Icon.Clock: return Symbol.Clock;
case Icon.Crop: return Symbol.Crop;
case Icon.World: return Symbol.World;
case Icon.Flag: return Symbol.Flag;
case Icon.PreviewLink: return Symbol.PreviewLink;
case Icon.Document: return Symbol.Document;
case Icon.ProtectedDocument: return Symbol.ProtectedDocument;
case Icon.ContactInfo: return Symbol.ContactInfo;
case Icon.ViewAll: return Symbol.ViewAll;
case Icon.Rotate: return Symbol.Rotate;
case Icon.List: return Symbol.List;
case Icon.Shop: return Symbol.Shop;
case Icon.BrowsePhotos: return Symbol.BrowsePhotos;
case Icon.Caption: return Symbol.Caption;
case Icon.Repair: return Symbol.Repair;
case Icon.Page: return Symbol.Page;
case Icon.Paste: return Symbol.Paste;
case Icon.Important: return Symbol.Important;
case Icon.SlideShow: return Symbol.SlideShow;
case Icon.MapDrive: return Symbol.MapDrive;
case Icon.ContactPresence: return Symbol.ContactPresence;
case Icon.Contact: return Symbol.Contact;
case Icon.Folder: return Symbol.Folder;
case Icon.View: return Symbol.View;
case Icon.Permissions: return Symbol.Permissions;
case Icon.Map: return Symbol.Map;
case Icon.CellPhone: return Symbol.CellPhone;
case Icon.OutlineStar: return Symbol.OutlineStar;
case Icon.Calculator: return Symbol.Calculator;
case Icon.Library: return Symbol.Library;
case Icon.SyncFolder: return Symbol.SyncFolder;
case Icon.GoToStart: return Symbol.GoToStart;
case Icon.ZeroBars: return Symbol.ZeroBars;
case Icon.FourBars: return Symbol.FourBars;
case Icon.Scan: return Symbol.Scan;
case Icon.ReportHacked: return Symbol.ReportHacked;
case Icon.Stop: return Symbol.Stop;
default:
throw new ArgumentOutOfRangeException();
}*/
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
/*var symbol = (Symbol)value;
var defaultIcon = parameter != null ? int.Parse(parameter as string) : -1;
switch (symbol)
{
case Symbol.Delete: return Icon.Delete;
case Symbol.Edit: return Icon.Edit;
case Symbol.Save: return Icon.Save;
case Symbol.Cancel: return Icon.Cancel;
case Symbol.Accept: return Icon.Accept;
case Symbol.Home: return Icon.Home;
case Symbol.Camera: return Icon.Camera;
case Symbol.Setting: return Icon.Setting;
case Symbol.Mail: return Icon.Mail;
case Symbol.Find: return Icon.Find;
case Symbol.Help: return Icon.Help;
case Symbol.Clock: return Icon.Clock;
case Symbol.Crop: return Icon.Crop;
case Symbol.World: return Icon.World;
case Symbol.Flag: return Icon.Flag;
case Symbol.PreviewLink: return Icon.PreviewLink;
case Symbol.Document: return Icon.Document;
case Symbol.ProtectedDocument: return Icon.ProtectedDocument;
case Symbol.ContactInfo: return Icon.ContactInfo;
case Symbol.ViewAll: return Icon.ViewAll;
case Symbol.Rotate: return Icon.Rotate;
case Symbol.List: return Icon.List;
case Symbol.Shop: return Icon.Shop;
case Symbol.BrowsePhotos: return Icon.BrowsePhotos;
case Symbol.Caption: return Icon.Caption;
case Symbol.Repair: return Icon.Repair;
case Symbol.Page: return Icon.Page;
case Symbol.Paste: return Icon.Paste;
case Symbol.Important: return Icon.Important;
case Symbol.SlideShow: return Icon.SlideShow;
case Symbol.MapDrive: return Icon.MapDrive;
case Symbol.ContactPresence: return Icon.ContactPresence;
case Symbol.Contact: return Icon.Contact;
case Symbol.Folder: return Icon.Folder;
case Symbol.View: return Icon.View;
case Symbol.Permissions: return Icon.Permissions;
case Symbol.Map: return Icon.Map;
case Symbol.CellPhone: return Icon.CellPhone;
case Symbol.OutlineStar: return Icon.OutlineStar;
case Symbol.Calculator: return Icon.Calculator;
case Symbol.Library: return Icon.Library;
case Symbol.SyncFolder: return Icon.SyncFolder;
case Symbol.GoToStart: return Icon.GoToStart;
case Symbol.ZeroBars: return Icon.ZeroBars;
case Symbol.FourBars: return Icon.FourBars;
case Symbol.Scan: return Icon.Scan;
case Symbol.ReportHacked: return Icon.ReportHacked;
case Symbol.Stop: return Icon.Stop;
default: return defaultIcon;
}*/
return Enum.Parse(typeof(Icon), value.ToString());
}
}

View File

@@ -9,6 +9,7 @@ using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Application.Database.Commands.SaveDatabase;
using ModernKeePass.Application.Database.Models;
using ModernKeePass.Application.Database.Queries.GetDatabase;
using ModernKeePass.Application.Entry.Commands.AddHistory;
using ModernKeePass.Application.Entry.Commands.SetFieldValue;
using ModernKeePass.Application.Entry.Models;
using ModernKeePass.Application.Entry.Queries.GetEntry;
@@ -83,7 +84,7 @@ namespace ModernKeePass.ViewModels
{
_entry.Password = value;
SetFieldValue(nameof(Password), value).Wait();
OnPropertyChanged();
OnPropertyChanged(nameof(Password));
OnPropertyChanged(nameof(PasswordComplexityIndicator));
}
}
@@ -246,7 +247,7 @@ namespace ModernKeePass.ViewModels
public async Task MarkForDelete(string recycleBinTitle)
{
await _mediator.Send(new DeleteEntryCommand {EntryId = _entry.Id, ParentGroupId = _entry.ParentGroupId, RecycleBinName = recycleBinTitle});
await _mediator.Send(new DeleteEntryCommand {EntryId = Id, ParentGroupId = _entry.ParentGroupId, RecycleBinName = recycleBinTitle});
}
public async Task Move(GroupVm destination)
@@ -259,18 +260,28 @@ namespace ModernKeePass.ViewModels
{
await _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = fieldName, FieldValue = value });
((RelayCommand)SaveCommand).RaiseCanExecuteChanged();
_entry.IsDirty = true;
}
public async Task AddHistory()
{
if (_entry.IsDirty) await _mediator.Send(new AddHistoryCommand {EntryId = Id});
}
internal void SetEntry(EntryVm entry, int index)
{
_entry = entry;
IsSelected = index == 0;
OnPropertyChanged();
}
private async Task SaveChanges()
{
await AddHistory();
await _mediator.Send(new SaveDatabaseCommand());
((RelayCommand)SaveCommand).RaiseCanExecuteChanged();
_entry.IsDirty = false;
}
}
}

View File

@@ -46,8 +46,9 @@ namespace ModernKeePass.Views
if (args != null) DataContext = new EntryDetailVm(args);
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
protected override async void OnNavigatedFrom(NavigationEventArgs e)
{
await Model.AddHistory();
NavigationHelper.OnNavigatedFrom(e);
}
@@ -69,7 +70,7 @@ namespace ModernKeePass.Views
case -1:
return;
default:
var entry = listView?.SelectedItem as Application.Entry.Models.EntryVm;
var entry = listView.SelectedItem as Application.Entry.Models.EntryVm;
Model.SetEntry(entry, index);
break;
}