mirror of
https://github.com/wismna/ModernKeePass.git
synced 2025-10-03 23:50:18 -04:00
Don't use mediator for App services (recent, resource, settings)
WIP in View models
This commit is contained in:
@@ -43,14 +43,11 @@
|
|||||||
<Compile Include="Common\Interfaces\ICryptographyClient.cs" />
|
<Compile Include="Common\Interfaces\ICryptographyClient.cs" />
|
||||||
<Compile Include="Common\Interfaces\IDatabaseProxy.cs" />
|
<Compile Include="Common\Interfaces\IDatabaseProxy.cs" />
|
||||||
<Compile Include="Common\Interfaces\IFileProxy.cs" />
|
<Compile Include="Common\Interfaces\IFileProxy.cs" />
|
||||||
<Compile Include="Common\Interfaces\IHasSelectableObject.cs" />
|
|
||||||
<Compile Include="Common\Interfaces\IImportFormat.cs" />
|
<Compile Include="Common\Interfaces\IImportFormat.cs" />
|
||||||
<Compile Include="Common\Interfaces\IIsEnabled.cs" />
|
|
||||||
<Compile Include="Common\Interfaces\IPasswordProxy.cs" />
|
<Compile Include="Common\Interfaces\IPasswordProxy.cs" />
|
||||||
<Compile Include="Common\Interfaces\IProxyInvocationHandler.cs" />
|
<Compile Include="Common\Interfaces\IProxyInvocationHandler.cs" />
|
||||||
<Compile Include="Common\Interfaces\IRecentProxy.cs" />
|
<Compile Include="Common\Interfaces\IRecentProxy.cs" />
|
||||||
<Compile Include="Common\Interfaces\IResourceProxy.cs" />
|
<Compile Include="Common\Interfaces\IResourceProxy.cs" />
|
||||||
<Compile Include="Common\Interfaces\ISelectableModel.cs" />
|
|
||||||
<Compile Include="Common\Interfaces\ISettingsProxy.cs" />
|
<Compile Include="Common\Interfaces\ISettingsProxy.cs" />
|
||||||
<Compile Include="Common\Mappings\IMapFrom.cs" />
|
<Compile Include="Common\Mappings\IMapFrom.cs" />
|
||||||
<Compile Include="Common\Mappings\MappingProfile.cs" />
|
<Compile Include="Common\Mappings\MappingProfile.cs" />
|
||||||
@@ -91,18 +88,9 @@
|
|||||||
<Compile Include="Group\Commands\SortGroups\SortGroupsCommand.cs" />
|
<Compile Include="Group\Commands\SortGroups\SortGroupsCommand.cs" />
|
||||||
<Compile Include="Group\Models\GroupVm.cs" />
|
<Compile Include="Group\Models\GroupVm.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Recent\Commands\AddRecent\AddRecentCommand.cs" />
|
|
||||||
<Compile Include="Recent\Commands\ClearAllRecent\ClearAllRecentCommand.cs" />
|
|
||||||
<Compile Include="Recent\Models\RecentVm.cs" />
|
|
||||||
<Compile Include="Recent\Queries\GetAllRecent\GetAllRecentQuery.cs" />
|
|
||||||
<Compile Include="Recent\Queries\GetRecent\GetRecentQuery.cs" />
|
|
||||||
<Compile Include="Recent\Queries\HasRecent\HasRecentQuery.cs" />
|
|
||||||
<Compile Include="Resources\Queries\GetResourceQuery.cs" />
|
|
||||||
<Compile Include="Security\Commands\GenerateKeyFile\GenerateKeyFileCommand.cs" />
|
<Compile Include="Security\Commands\GenerateKeyFile\GenerateKeyFileCommand.cs" />
|
||||||
<Compile Include="Security\Commands\GeneratePassword\GeneratePasswordCommand.cs" />
|
<Compile Include="Security\Commands\GeneratePassword\GeneratePasswordCommand.cs" />
|
||||||
<Compile Include="Security\Queries\EstimatePasswordComplexity\EstimatePasswordComplexityQuery.cs" />
|
<Compile Include="Security\Queries\EstimatePasswordComplexity\EstimatePasswordComplexityQuery.cs" />
|
||||||
<Compile Include="Settings\Commands\PutSettingCommand.cs" />
|
|
||||||
<Compile Include="Settings\Queries\GetSettingQuery.cs" />
|
|
||||||
<Content Include="Services\DatabaseService.cs" />
|
<Content Include="Services\DatabaseService.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -10,7 +10,7 @@ namespace ModernKeePass.Application.Common.Interfaces
|
|||||||
string Name { get; }
|
string Name { get; }
|
||||||
GroupEntity RootGroup { get; }
|
GroupEntity RootGroup { get; }
|
||||||
|
|
||||||
string RecycleBinId { get; set; }
|
GroupEntity RecycleBin { get; set; }
|
||||||
string CipherId { get; set; }
|
string CipherId { get; set; }
|
||||||
string KeyDerivationId { get; set; }
|
string KeyDerivationId { get; set; }
|
||||||
string Compression { get; set; }
|
string Compression { get; set; }
|
||||||
@@ -21,6 +21,7 @@ namespace ModernKeePass.Application.Common.Interfaces
|
|||||||
Task<GroupEntity> Create(FileInfo fileInfo, Credentials credentials);
|
Task<GroupEntity> Create(FileInfo fileInfo, Credentials credentials);
|
||||||
Task SaveDatabase();
|
Task SaveDatabase();
|
||||||
Task SaveDatabase(string filePath);
|
Task SaveDatabase(string filePath);
|
||||||
|
void SetRecycleBin(string id);
|
||||||
Task UpdateCredentials(Credentials credentials);
|
Task UpdateCredentials(Credentials credentials);
|
||||||
void CloseDatabase();
|
void CloseDatabase();
|
||||||
|
|
||||||
|
@@ -1,7 +0,0 @@
|
|||||||
namespace ModernKeePass.Application.Common.Interfaces
|
|
||||||
{
|
|
||||||
public interface IHasSelectableObject
|
|
||||||
{
|
|
||||||
ISelectableModel SelectedItem { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,7 +0,0 @@
|
|||||||
namespace ModernKeePass.Application.Common.Interfaces
|
|
||||||
{
|
|
||||||
public interface IIsEnabled
|
|
||||||
{
|
|
||||||
bool IsEnabled { get; }
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,7 +0,0 @@
|
|||||||
namespace ModernKeePass.Application.Common.Interfaces
|
|
||||||
{
|
|
||||||
public interface ISelectableModel
|
|
||||||
{
|
|
||||||
bool IsSelected { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@@ -7,7 +7,7 @@ namespace ModernKeePass.Application.Database.Models
|
|||||||
public bool IsOpen { get; set; }
|
public bool IsOpen { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public GroupVm RootGroup { get; set; }
|
public GroupVm RootGroup { get; set; }
|
||||||
public string RecycleBinId { get; set; }
|
public GroupVm RecycleBin { get; set; }
|
||||||
public bool IsRecycleBinEnabled { get; set; }
|
public bool IsRecycleBinEnabled { get; set; }
|
||||||
public string Compression { get; set; }
|
public string Compression { get; set; }
|
||||||
public string CipherId { get; set; }
|
public string CipherId { get; set; }
|
||||||
|
@@ -27,7 +27,7 @@ namespace ModernKeePass.Application.Database.Queries.GetDatabase
|
|||||||
Name = _databaseProxy.Name,
|
Name = _databaseProxy.Name,
|
||||||
RootGroup = _mapper.Map<GroupVm>(_databaseProxy.RootGroup),
|
RootGroup = _mapper.Map<GroupVm>(_databaseProxy.RootGroup),
|
||||||
IsRecycleBinEnabled = _databaseProxy.IsRecycleBinEnabled,
|
IsRecycleBinEnabled = _databaseProxy.IsRecycleBinEnabled,
|
||||||
RecycleBinId = _databaseProxy.RecycleBinId,
|
RecycleBin = _mapper.Map<GroupVm>(_databaseProxy.RecycleBin),
|
||||||
Compression = _databaseProxy.Compression,
|
Compression = _databaseProxy.Compression,
|
||||||
CipherId = _databaseProxy.CipherId,
|
CipherId = _databaseProxy.CipherId,
|
||||||
KeyDerivationId = _databaseProxy.CipherId
|
KeyDerivationId = _databaseProxy.CipherId
|
||||||
|
@@ -13,6 +13,7 @@ namespace ModernKeePass.Application.Group.Models
|
|||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
public string Title { get; set; }
|
public string Title { get; set; }
|
||||||
public Icon Icon { get; set; }
|
public Icon Icon { get; set; }
|
||||||
|
public GroupVm ParentGroup { get; set; }
|
||||||
public List<GroupVm> SubGroups { get; set; } = new List<GroupVm>();
|
public List<GroupVm> SubGroups { get; set; } = new List<GroupVm>();
|
||||||
public List<EntryVm> Entries { get; set; } = new List<EntryVm>();
|
public List<EntryVm> Entries { get; set; } = new List<EntryVm>();
|
||||||
|
|
||||||
@@ -22,6 +23,7 @@ namespace ModernKeePass.Application.Group.Models
|
|||||||
.ForMember(d => d.Id, opts => opts.MapFrom(s => s.Id))
|
.ForMember(d => d.Id, opts => opts.MapFrom(s => s.Id))
|
||||||
.ForMember(d => d.Title, opts => opts.MapFrom(s => s.Name))
|
.ForMember(d => d.Title, opts => opts.MapFrom(s => s.Name))
|
||||||
.ForMember(d => d.Icon, opts => opts.MapFrom(s => s.Icon))
|
.ForMember(d => d.Icon, opts => opts.MapFrom(s => s.Icon))
|
||||||
|
.ForMember(d => d.ParentGroup, opts => opts.MapFrom(s => s.Parent))
|
||||||
.ForMember(d => d.Entries, opts => opts.MapFrom(s => s.Entries.OrderBy(e => e.Name)))
|
.ForMember(d => d.Entries, opts => opts.MapFrom(s => s.Entries.OrderBy(e => e.Name)))
|
||||||
.ForMember(d => d.SubGroups, opts => opts.MapFrom(s => s.SubGroups));
|
.ForMember(d => d.SubGroups, opts => opts.MapFrom(s => s.SubGroups));
|
||||||
}
|
}
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
using MediatR;
|
using MediatR;
|
||||||
using ModernKeePass.Application.Common.Interfaces;
|
using ModernKeePass.Application.Common.Interfaces;
|
||||||
|
using ModernKeePass.Application.Group.Models;
|
||||||
using ModernKeePass.Domain.Exceptions;
|
using ModernKeePass.Domain.Exceptions;
|
||||||
|
|
||||||
namespace ModernKeePass.Application.Parameters.Commands.SetRecycleBin
|
namespace ModernKeePass.Application.Parameters.Commands.SetRecycleBin
|
||||||
{
|
{
|
||||||
public class SetRecycleBinCommand : IRequest
|
public class SetRecycleBinCommand : IRequest
|
||||||
{
|
{
|
||||||
public string RecycleBinId { get; set; }
|
public GroupVm RecycleBin { get; set; }
|
||||||
|
|
||||||
public class SetRecycleBinCommandHandler : IRequestHandler<SetRecycleBinCommand>
|
public class SetRecycleBinCommandHandler : IRequestHandler<SetRecycleBinCommand>
|
||||||
{
|
{
|
||||||
@@ -19,7 +20,7 @@ namespace ModernKeePass.Application.Parameters.Commands.SetRecycleBin
|
|||||||
|
|
||||||
public void Handle(SetRecycleBinCommand message)
|
public void Handle(SetRecycleBinCommand message)
|
||||||
{
|
{
|
||||||
if (_database.IsOpen) _database.RecycleBinId = message.RecycleBinId;
|
if (_database.IsOpen) _database.SetRecycleBin(message.RecycleBin.Id);
|
||||||
else throw new DatabaseClosedException();
|
else throw new DatabaseClosedException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,31 +0,0 @@
|
|||||||
using MediatR;
|
|
||||||
using ModernKeePass.Application.Common.Interfaces;
|
|
||||||
using ModernKeePass.Domain.Dtos;
|
|
||||||
|
|
||||||
namespace ModernKeePass.Application.Recent.Commands.AddRecent
|
|
||||||
{
|
|
||||||
public class AddRecentCommand: IRequest
|
|
||||||
{
|
|
||||||
public string Name { get; set; }
|
|
||||||
public string Path { get; set; }
|
|
||||||
|
|
||||||
public class AddRecentCommandHandler: IRequestHandler<AddRecentCommand>
|
|
||||||
{
|
|
||||||
private readonly IRecentProxy _recent;
|
|
||||||
|
|
||||||
public AddRecentCommandHandler(IRecentProxy recent)
|
|
||||||
{
|
|
||||||
_recent = recent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Handle(AddRecentCommand message)
|
|
||||||
{
|
|
||||||
_recent.Add(new FileInfo
|
|
||||||
{
|
|
||||||
Name = message.Name,
|
|
||||||
Path = message.Path
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,23 +0,0 @@
|
|||||||
using MediatR;
|
|
||||||
using ModernKeePass.Application.Common.Interfaces;
|
|
||||||
|
|
||||||
namespace ModernKeePass.Application.Recent.Commands.ClearAllRecent
|
|
||||||
{
|
|
||||||
public class ClearAllRecentCommand : IRequest
|
|
||||||
{
|
|
||||||
public class ClearAllRecentCommandHandler : IRequestHandler<ClearAllRecentCommand>
|
|
||||||
{
|
|
||||||
private readonly IRecentProxy _recent;
|
|
||||||
|
|
||||||
public ClearAllRecentCommandHandler(IRecentProxy recent)
|
|
||||||
{
|
|
||||||
_recent = recent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Handle(ClearAllRecentCommand message)
|
|
||||||
{
|
|
||||||
_recent.ClearAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,18 +0,0 @@
|
|||||||
using AutoMapper;
|
|
||||||
using ModernKeePass.Application.Common.Mappings;
|
|
||||||
using ModernKeePass.Domain.Dtos;
|
|
||||||
|
|
||||||
namespace ModernKeePass.Application.Recent.Models
|
|
||||||
{
|
|
||||||
public class RecentVm: IMapFrom<FileInfo>
|
|
||||||
{
|
|
||||||
public string Name { get; set; }
|
|
||||||
public string Path { get; set; }
|
|
||||||
public void Mapping(Profile profile)
|
|
||||||
{
|
|
||||||
profile.CreateMap<FileInfo, RecentVm>()
|
|
||||||
.ForMember(d => d.Name, opts => opts.MapFrom(s => s.Name))
|
|
||||||
.ForMember(d => d.Path, opts => opts.MapFrom(s => s.Path));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,30 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using AutoMapper;
|
|
||||||
using MediatR;
|
|
||||||
using ModernKeePass.Application.Common.Interfaces;
|
|
||||||
using ModernKeePass.Application.Recent.Models;
|
|
||||||
|
|
||||||
namespace ModernKeePass.Application.Recent.Queries.GetAllRecent
|
|
||||||
{
|
|
||||||
public class GetAllRecentQuery : IRequest<IEnumerable<RecentVm>>
|
|
||||||
{
|
|
||||||
public class GetAllRecentQueryHandler : IAsyncRequestHandler<GetAllRecentQuery, IEnumerable<RecentVm>>
|
|
||||||
{
|
|
||||||
private readonly IRecentProxy _recent;
|
|
||||||
private readonly IMapper _mapper;
|
|
||||||
|
|
||||||
public GetAllRecentQueryHandler(IRecentProxy recent, IMapper mapper)
|
|
||||||
{
|
|
||||||
_recent = recent;
|
|
||||||
_mapper = mapper;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<IEnumerable<RecentVm>> Handle(GetAllRecentQuery message)
|
|
||||||
{
|
|
||||||
var fileInfo = await _recent.GetAll();
|
|
||||||
return _mapper.Map<IEnumerable<RecentVm>>(fileInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,31 +0,0 @@
|
|||||||
using System.Threading.Tasks;
|
|
||||||
using AutoMapper;
|
|
||||||
using MediatR;
|
|
||||||
using ModernKeePass.Application.Common.Interfaces;
|
|
||||||
using ModernKeePass.Application.Recent.Models;
|
|
||||||
|
|
||||||
namespace ModernKeePass.Application.Recent.Queries.GetRecent
|
|
||||||
{
|
|
||||||
public class GetRecentQuery : IRequest<RecentVm>
|
|
||||||
{
|
|
||||||
public string Token { get; set; }
|
|
||||||
|
|
||||||
public class GetRecentQueryHandler : IAsyncRequestHandler<GetRecentQuery, RecentVm>
|
|
||||||
{
|
|
||||||
private readonly IRecentProxy _recent;
|
|
||||||
private readonly IMapper _mapper;
|
|
||||||
|
|
||||||
public GetRecentQueryHandler(IRecentProxy recent, IMapper mapper)
|
|
||||||
{
|
|
||||||
_recent = recent;
|
|
||||||
_mapper = mapper;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<RecentVm> Handle(GetRecentQuery message)
|
|
||||||
{
|
|
||||||
var fileInfo = await _recent.Get(message.Token);
|
|
||||||
return _mapper.Map<RecentVm>(fileInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,23 +0,0 @@
|
|||||||
using MediatR;
|
|
||||||
using ModernKeePass.Application.Common.Interfaces;
|
|
||||||
|
|
||||||
namespace ModernKeePass.Application.Recent.Queries.HasRecent
|
|
||||||
{
|
|
||||||
public class HasRecentQuery : IRequest<bool>
|
|
||||||
{
|
|
||||||
public class HasRecentQueryHandler : IRequestHandler<HasRecentQuery, bool>
|
|
||||||
{
|
|
||||||
private readonly IRecentProxy _recent;
|
|
||||||
|
|
||||||
public HasRecentQueryHandler(IRecentProxy recent)
|
|
||||||
{
|
|
||||||
_recent = recent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Handle(HasRecentQuery message)
|
|
||||||
{
|
|
||||||
return _recent.EntryCount > 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,23 +0,0 @@
|
|||||||
using MediatR;
|
|
||||||
using ModernKeePass.Application.Common.Interfaces;
|
|
||||||
|
|
||||||
namespace ModernKeePass.Application.Resources.Queries
|
|
||||||
{
|
|
||||||
public class GetResourceQuery: IRequest<string>
|
|
||||||
{
|
|
||||||
public string Key { get; set; }
|
|
||||||
public class GetResourceQueryHandler: IRequestHandler<GetResourceQuery, string>
|
|
||||||
{
|
|
||||||
private readonly IResourceProxy _resourceProxy;
|
|
||||||
|
|
||||||
public GetResourceQueryHandler(IResourceProxy resourceProxy)
|
|
||||||
{
|
|
||||||
_resourceProxy = resourceProxy;
|
|
||||||
}
|
|
||||||
public string Handle(GetResourceQuery message)
|
|
||||||
{
|
|
||||||
return _resourceProxy.GetResourceValue(message.Key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,25 +0,0 @@
|
|||||||
using MediatR;
|
|
||||||
using ModernKeePass.Application.Common.Interfaces;
|
|
||||||
|
|
||||||
namespace ModernKeePass.Application.Settings.Commands
|
|
||||||
{
|
|
||||||
public class PutSettingCommand<T> : IRequest
|
|
||||||
{
|
|
||||||
public string Key { get; set; }
|
|
||||||
public T value { get; set; }
|
|
||||||
|
|
||||||
public class PutSettingCommandHandler : IRequestHandler<PutSettingCommand<T>>
|
|
||||||
{
|
|
||||||
private readonly ISettingsProxy _settingsProxy;
|
|
||||||
|
|
||||||
public PutSettingCommandHandler(ISettingsProxy settingsProxy)
|
|
||||||
{
|
|
||||||
_settingsProxy = settingsProxy;
|
|
||||||
}
|
|
||||||
public void Handle(PutSettingCommand<T> message)
|
|
||||||
{
|
|
||||||
_settingsProxy.PutSetting(message.Key, message.value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,24 +0,0 @@
|
|||||||
using MediatR;
|
|
||||||
using ModernKeePass.Application.Common.Interfaces;
|
|
||||||
|
|
||||||
namespace ModernKeePass.Application.Settings.Queries
|
|
||||||
{
|
|
||||||
public class GetSettingQuery<T> : IRequest<T>
|
|
||||||
{
|
|
||||||
public string Key { get; set; }
|
|
||||||
|
|
||||||
public class GetSettingQueryHandler : IRequestHandler<GetSettingQuery<T>, T>
|
|
||||||
{
|
|
||||||
private readonly ISettingsProxy _settingsProxy;
|
|
||||||
|
|
||||||
public GetSettingQueryHandler(ISettingsProxy settingsProxy)
|
|
||||||
{
|
|
||||||
_settingsProxy = settingsProxy;
|
|
||||||
}
|
|
||||||
public T Handle(GetSettingQuery<T> message)
|
|
||||||
{
|
|
||||||
return _settingsProxy.GetSetting<T>(message.Key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -55,6 +55,9 @@
|
|||||||
<Compile Include="Exceptions\NavigationException.cs" />
|
<Compile Include="Exceptions\NavigationException.cs" />
|
||||||
<Compile Include="Exceptions\SaveException.cs" />
|
<Compile Include="Exceptions\SaveException.cs" />
|
||||||
<Compile Include="Interfaces\IDateTime.cs" />
|
<Compile Include="Interfaces\IDateTime.cs" />
|
||||||
|
<Compile Include="Interfaces\IHasSelectableObject.cs" />
|
||||||
|
<Compile Include="Interfaces\IIsEnabled.cs" />
|
||||||
|
<Compile Include="Interfaces\ISelectableModel.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
<ItemGroup />
|
||||||
|
@@ -6,6 +6,7 @@ namespace ModernKeePass.Domain.Entities
|
|||||||
{
|
{
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
public GroupEntity Parent { get; set; }
|
||||||
public DateTimeOffset LastModificationDate { get; set; }
|
public DateTimeOffset LastModificationDate { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,4 +1,4 @@
|
|||||||
namespace ModernKeePass.Interfaces
|
namespace ModernKeePass.Domain.Interfaces
|
||||||
{
|
{
|
||||||
public interface IHasSelectableObject
|
public interface IHasSelectableObject
|
||||||
{
|
{
|
@@ -1,4 +1,4 @@
|
|||||||
namespace ModernKeePass.Interfaces
|
namespace ModernKeePass.Domain.Interfaces
|
||||||
{
|
{
|
||||||
public interface IIsEnabled
|
public interface IIsEnabled
|
||||||
{
|
{
|
@@ -1,4 +1,4 @@
|
|||||||
namespace ModernKeePass.Interfaces
|
namespace ModernKeePass.Domain.Interfaces
|
||||||
{
|
{
|
||||||
public interface ISelectableModel
|
public interface ISelectableModel
|
||||||
{
|
{
|
@@ -2,6 +2,8 @@
|
|||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using ModernKeePass.Application.Common.Interfaces;
|
using ModernKeePass.Application.Common.Interfaces;
|
||||||
|
using ModernKeePass.Domain.Interfaces;
|
||||||
|
using ModernKeePass.Infrastructure.Common;
|
||||||
using ModernKeePass.Infrastructure.KeePass;
|
using ModernKeePass.Infrastructure.KeePass;
|
||||||
using ModernKeePass.Infrastructure.UWP;
|
using ModernKeePass.Infrastructure.UWP;
|
||||||
|
|
||||||
@@ -17,10 +19,11 @@ namespace ModernKeePass.Infrastructure
|
|||||||
services.AddSingleton(typeof(IDatabaseProxy), typeof(KeePassDatabaseClient));
|
services.AddSingleton(typeof(IDatabaseProxy), typeof(KeePassDatabaseClient));
|
||||||
services.AddTransient(typeof(ICryptographyClient), typeof(KeePassCryptographyClient));
|
services.AddTransient(typeof(ICryptographyClient), typeof(KeePassCryptographyClient));
|
||||||
services.AddTransient(typeof(IPasswordProxy), typeof(KeePassPasswordClient));
|
services.AddTransient(typeof(IPasswordProxy), typeof(KeePassPasswordClient));
|
||||||
services.AddTransient(typeof(IResourceProxy), typeof(UwpResourceClient));
|
/*services.AddTransient(typeof(IResourceProxy), typeof(UwpResourceClient));
|
||||||
services.AddTransient(typeof(ISettingsProxy), typeof(UwpSettingsClient));
|
services.AddTransient(typeof(ISettingsProxy), typeof(UwpSettingsClient));
|
||||||
services.AddTransient(typeof(IRecentProxy), typeof(UwpRecentFilesClient));
|
services.AddTransient(typeof(IRecentProxy), typeof(UwpRecentFilesClient));*/
|
||||||
services.AddTransient(typeof(IFileProxy), typeof(StorageFileClient));
|
services.AddScoped(typeof(IFileProxy), typeof(StorageFileClient));
|
||||||
|
services.AddTransient(typeof(IDateTime), typeof(MachineDateTime));
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,6 +7,7 @@ using ModernKeePass.Domain.Dtos;
|
|||||||
using ModernKeePass.Domain.Entities;
|
using ModernKeePass.Domain.Entities;
|
||||||
using ModernKeePass.Domain.Enums;
|
using ModernKeePass.Domain.Enums;
|
||||||
using ModernKeePass.Domain.Exceptions;
|
using ModernKeePass.Domain.Exceptions;
|
||||||
|
using ModernKeePass.Domain.Interfaces;
|
||||||
using ModernKeePassLib;
|
using ModernKeePassLib;
|
||||||
using ModernKeePassLib.Cryptography.KeyDerivation;
|
using ModernKeePassLib.Cryptography.KeyDerivation;
|
||||||
using ModernKeePassLib.Interfaces;
|
using ModernKeePassLib.Interfaces;
|
||||||
@@ -22,6 +23,7 @@ namespace ModernKeePass.Infrastructure.KeePass
|
|||||||
private readonly ISettingsProxy _settings;
|
private readonly ISettingsProxy _settings;
|
||||||
private readonly IFileProxy _fileService;
|
private readonly IFileProxy _fileService;
|
||||||
private readonly IMapper _mapper;
|
private readonly IMapper _mapper;
|
||||||
|
private readonly IDateTime _dateTime;
|
||||||
private readonly PwDatabase _pwDatabase = new PwDatabase();
|
private readonly PwDatabase _pwDatabase = new PwDatabase();
|
||||||
private string _fileAccessToken;
|
private string _fileAccessToken;
|
||||||
private Credentials _credentials;
|
private Credentials _credentials;
|
||||||
@@ -38,19 +40,19 @@ namespace ModernKeePass.Infrastructure.KeePass
|
|||||||
set { _pwDatabase.RecycleBinEnabled = value; }
|
set { _pwDatabase.RecycleBinEnabled = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public string RecycleBinId
|
public GroupEntity RecycleBin
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (_pwDatabase.RecycleBinEnabled)
|
if (_pwDatabase.RecycleBinEnabled)
|
||||||
{
|
{
|
||||||
var pwGroup = _pwDatabase.RootGroup.FindGroup(_pwDatabase.RecycleBinUuid, true);
|
var pwGroup = _pwDatabase.RootGroup.FindGroup(_pwDatabase.RecycleBinUuid, true);
|
||||||
return pwGroup.Uuid.ToHexString();
|
return _mapper.Map<GroupEntity>(pwGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
set { _pwDatabase.RecycleBinUuid = BuildIdFromString(value); }
|
set { _pwDatabase.RecycleBinUuid = BuildIdFromString(value.Id); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public string CipherId
|
public string CipherId
|
||||||
@@ -75,11 +77,12 @@ namespace ModernKeePass.Infrastructure.KeePass
|
|||||||
set { _pwDatabase.Compression = (PwCompressionAlgorithm) Enum.Parse(typeof(PwCompressionAlgorithm), value); }
|
set { _pwDatabase.Compression = (PwCompressionAlgorithm) Enum.Parse(typeof(PwCompressionAlgorithm), value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public KeePassDatabaseClient(ISettingsProxy settings, IFileProxy fileService, IMapper mapper)
|
public KeePassDatabaseClient(ISettingsProxy settings, IFileProxy fileService, IMapper mapper, IDateTime dateTime)
|
||||||
{
|
{
|
||||||
_settings = settings;
|
_settings = settings;
|
||||||
_fileService = fileService;
|
_fileService = fileService;
|
||||||
_mapper = mapper;
|
_mapper = mapper;
|
||||||
|
_dateTime = dateTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<GroupEntity> Open(FileInfo fileInfo, Credentials credentials)
|
public async Task<GroupEntity> Open(FileInfo fileInfo, Credentials credentials)
|
||||||
@@ -94,7 +97,8 @@ namespace ModernKeePass.Infrastructure.KeePass
|
|||||||
_credentials = credentials;
|
_credentials = credentials;
|
||||||
_fileAccessToken = fileInfo.Path;
|
_fileAccessToken = fileInfo.Path;
|
||||||
|
|
||||||
return _mapper.Map<GroupEntity>(_pwDatabase.RootGroup);
|
RootGroup = _mapper.Map<GroupEntity>(_pwDatabase.RootGroup);
|
||||||
|
return RootGroup;
|
||||||
}
|
}
|
||||||
catch (InvalidCompositeKeyException ex)
|
catch (InvalidCompositeKeyException ex)
|
||||||
{
|
{
|
||||||
@@ -124,7 +128,8 @@ namespace ModernKeePass.Infrastructure.KeePass
|
|||||||
|
|
||||||
_fileAccessToken = fileInfo.Path;
|
_fileAccessToken = fileInfo.Path;
|
||||||
|
|
||||||
return _mapper.Map<GroupEntity>(_pwDatabase.RootGroup);
|
RootGroup = _mapper.Map<GroupEntity>(_pwDatabase.RootGroup);
|
||||||
|
return RootGroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SaveDatabase()
|
public async Task SaveDatabase()
|
||||||
@@ -158,6 +163,12 @@ namespace ModernKeePass.Infrastructure.KeePass
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetRecycleBin(string id)
|
||||||
|
{
|
||||||
|
_pwDatabase.RecycleBinUuid = BuildIdFromString(id);
|
||||||
|
_pwDatabase.RecycleBinChanged = _dateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
public void CloseDatabase()
|
public void CloseDatabase()
|
||||||
{
|
{
|
||||||
_pwDatabase?.Close();
|
_pwDatabase?.Close();
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using Windows.UI.Xaml;
|
using Windows.UI.Xaml;
|
||||||
using Microsoft.Xaml.Interactivity;
|
using Microsoft.Xaml.Interactivity;
|
||||||
using ModernKeePass.Application.Resources.Queries;
|
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
using ModernKeePass.ViewModels;
|
using ModernKeePass.ViewModels;
|
||||||
|
|
||||||
namespace ModernKeePass.Actions
|
namespace ModernKeePass.Actions
|
||||||
@@ -32,23 +32,19 @@ namespace ModernKeePass.Actions
|
|||||||
|
|
||||||
public object Execute(object sender, object parameter)
|
public object Execute(object sender, object parameter)
|
||||||
{
|
{
|
||||||
var mediator = App.Mediator;
|
var resource = new ResourcesService();
|
||||||
var type = Entity is GroupVm ? "Group" : "Entry";
|
var type = Entity is GroupVm ? "Group" : "Entry";
|
||||||
|
|
||||||
var message = Entity.IsRecycleOnDelete
|
var message = Entity.IsRecycleOnDelete
|
||||||
? mediator.Send(new GetResourceQuery { Key = $"{type}RecyclingConfirmation" })
|
? resource.GetResourceValue($"{type}RecyclingConfirmation")
|
||||||
: mediator.Send(new GetResourceQuery { Key = $"{type}DeletingConfirmation" });
|
: resource.GetResourceValue($"{type}DeletingConfirmation");
|
||||||
var text = Entity.IsRecycleOnDelete ?
|
var text = Entity.IsRecycleOnDelete ? resource.GetResourceValue($"{type}Recycled") : resource.GetResourceValue($"{type}Deleted");
|
||||||
mediator.Send(new GetResourceQuery { Key = $"{type}Recycled" }) :
|
MessageDialogHelper.ShowActionDialog(resource.GetResourceValue("EntityDeleteTitle"), message,
|
||||||
mediator.Send(new GetResourceQuery { Key = $"{type}Deleted" });
|
resource.GetResourceValue("EntityDeleteActionButton"),
|
||||||
MessageDialogHelper.ShowActionDialog(
|
resource.GetResourceValue("EntityDeleteCancelButton"), a =>
|
||||||
mediator.Send(new GetResourceQuery { Key = "EntityDeleteTitle" }).GetAwaiter().GetResult(),
|
|
||||||
message.GetAwaiter().GetResult(),
|
|
||||||
mediator.Send(new GetResourceQuery { Key = "EntityDeleteActionButton" }).GetAwaiter().GetResult(),
|
|
||||||
mediator.Send(new GetResourceQuery { Key = "EntityDeleteCancelButton" }).GetAwaiter().GetResult(), async a =>
|
|
||||||
{
|
{
|
||||||
ToastNotificationHelper.ShowMovedToast(Entity, await mediator.Send(new GetResourceQuery { Key = "EntityDeleting" }), await text);
|
ToastNotificationHelper.ShowMovedToast(Entity, resource.GetResourceValue("EntityDeleting"), text);
|
||||||
await Entity.MarkForDelete(await mediator.Send(new GetResourceQuery { Key = "RecycleBinTitle"}));
|
Entity.MarkForDelete(resource.GetResourceValue("RecycleBinTitle"));
|
||||||
Command.Execute(null);
|
Command.Execute(null);
|
||||||
}, null).GetAwaiter();
|
}, null).GetAwaiter();
|
||||||
|
|
||||||
|
@@ -1,31 +0,0 @@
|
|||||||
using System.Threading.Tasks;
|
|
||||||
using Windows.Storage;
|
|
||||||
using ModernKeePass.ViewModels;
|
|
||||||
using ModernKeePassLib;
|
|
||||||
using ModernKeePassLib.Cryptography.KeyDerivation;
|
|
||||||
using ModernKeePassLib.Keys;
|
|
||||||
|
|
||||||
namespace ModernKeePass.Interfaces
|
|
||||||
{
|
|
||||||
public interface IDatabaseService
|
|
||||||
{
|
|
||||||
string Name { get; }
|
|
||||||
bool RecycleBinEnabled { get; set; }
|
|
||||||
GroupVm RootGroup { get; set; }
|
|
||||||
GroupVm RecycleBin { get; set; }
|
|
||||||
PwUuid DataCipher { get; set; }
|
|
||||||
PwCompressionAlgorithm CompressionAlgorithm { get; set; }
|
|
||||||
KdfParameters KeyDerivation { get; set; }
|
|
||||||
bool IsOpen { get; }
|
|
||||||
bool HasChanged { get; set; }
|
|
||||||
|
|
||||||
Task Open(StorageFile databaseFile, CompositeKey key, bool createNew = false);
|
|
||||||
Task ReOpen();
|
|
||||||
void Save();
|
|
||||||
Task Save(StorageFile file);
|
|
||||||
void CreateRecycleBin(string title);
|
|
||||||
void AddDeletedItem(PwUuid id);
|
|
||||||
void Close(bool releaseFile = true);
|
|
||||||
void UpdateCompositeKey(CompositeKey newCompositeKey);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -10,18 +10,17 @@ using ModernKeePass.Application.Database.Queries.GetDatabase;
|
|||||||
using ModernKeePass.Application.Entry.Commands.SetFieldValue;
|
using ModernKeePass.Application.Entry.Commands.SetFieldValue;
|
||||||
using ModernKeePass.Application.Group.Commands.CreateGroup;
|
using ModernKeePass.Application.Group.Commands.CreateGroup;
|
||||||
using ModernKeePass.Application.Group.Commands.DeleteEntry;
|
using ModernKeePass.Application.Group.Commands.DeleteEntry;
|
||||||
using ModernKeePass.Application.Resources.Queries;
|
|
||||||
using ModernKeePass.Application.Security.Commands.GeneratePassword;
|
using ModernKeePass.Application.Security.Commands.GeneratePassword;
|
||||||
using ModernKeePass.Application.Security.Queries.EstimatePasswordComplexity;
|
using ModernKeePass.Application.Security.Queries.EstimatePasswordComplexity;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
|
using ModernKeePass.Domain.Interfaces;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
{
|
{
|
||||||
public class EntryVm : NotifyPropertyChangedBase, IVmEntity, ISelectableModel
|
public class EntryVm : NotifyPropertyChangedBase, IVmEntity, ISelectableModel
|
||||||
{
|
{
|
||||||
public GroupVm ParentGroup { get; private set; }
|
|
||||||
public GroupVm PreviousGroup { get; private set; }
|
|
||||||
public bool IsRevealPasswordEnabled => !string.IsNullOrEmpty(Password);
|
public bool IsRevealPasswordEnabled => !string.IsNullOrEmpty(Password);
|
||||||
public bool HasExpired => HasExpirationDate && ExpiryDate < DateTime.Now;
|
public bool HasExpired => HasExpirationDate && ExpiryDate < DateTime.Now;
|
||||||
public double PasswordComplexityIndicator => _mediator.Send(new EstimatePasswordComplexityQuery {Password = Password}).GetAwaiter().GetResult();
|
public double PasswordComplexityIndicator => _mediator.Send(new EstimatePasswordComplexityQuery {Password = Password}).GetAwaiter().GetResult();
|
||||||
@@ -35,7 +34,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
public bool BracketsPatternSelected { get; set; }
|
public bool BracketsPatternSelected { get; set; }
|
||||||
public string CustomChars { get; set; } = string.Empty;
|
public string CustomChars { get; set; } = string.Empty;
|
||||||
public string Id => _entry.Id;
|
public string Id => _entry.Id;
|
||||||
public bool IsRecycleOnDelete => GetDatabase().IsRecycleBinEnabled && !ParentGroup.IsSelected;
|
public bool IsRecycleOnDelete => _database.IsRecycleBinEnabled && !ParentGroup.IsSelected;
|
||||||
public IEnumerable<IVmEntity> BreadCrumb => new List<IVmEntity>(ParentGroup.BreadCrumb) {ParentGroup};
|
public IEnumerable<IVmEntity> BreadCrumb => new List<IVmEntity>(ParentGroup.BreadCrumb) {ParentGroup};
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Determines if the Entry is current or from history
|
/// Determines if the Entry is current or from history
|
||||||
@@ -197,6 +196,8 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
private readonly Application.Entry.Models.EntryVm _entry;
|
private readonly Application.Entry.Models.EntryVm _entry;
|
||||||
private readonly IMediator _mediator;
|
private readonly IMediator _mediator;
|
||||||
|
private readonly IResourceService _resource;
|
||||||
|
private DatabaseVm _database;
|
||||||
private bool _isEditMode;
|
private bool _isEditMode;
|
||||||
private bool _isRevealPassword;
|
private bool _isRevealPassword;
|
||||||
private double _passwordLength = 25;
|
private double _passwordLength = 25;
|
||||||
@@ -204,13 +205,14 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
public EntryVm() { }
|
public EntryVm() { }
|
||||||
|
|
||||||
internal EntryVm(Application.Entry.Models.EntryVm entry, GroupVm parent) : this(entry, parent, App.Mediator) { }
|
internal EntryVm(Application.Entry.Models.EntryVm entry, Application.Group.Models.GroupVm parent) : this(entry, parent, App.Mediator, new ResourcesService()) { }
|
||||||
|
|
||||||
public EntryVm(Application.Entry.Models.EntryVm entry, GroupVm parent, IMediator mediator)
|
public EntryVm(Application.Entry.Models.EntryVm entry, Application.Group.Models.GroupVm parent, IMediator mediator, IResourceService resource)
|
||||||
{
|
{
|
||||||
_entry = entry;
|
_entry = entry;
|
||||||
_mediator = mediator;
|
_mediator = mediator;
|
||||||
ParentGroup = parent;
|
_resource = resource;
|
||||||
|
_database = _mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult();
|
||||||
|
|
||||||
SaveCommand = new RelayCommand(() => _mediator.Send(new SaveDatabaseCommand()));
|
SaveCommand = new RelayCommand(() => _mediator.Send(new SaveDatabaseCommand()));
|
||||||
GeneratePasswordCommand = new RelayCommand(async () => await GeneratePassword());
|
GeneratePasswordCommand = new RelayCommand(async () => await GeneratePassword());
|
||||||
@@ -238,13 +240,12 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
public async Task MarkForDelete(string recycleBinTitle)
|
public async Task MarkForDelete(string recycleBinTitle)
|
||||||
{
|
{
|
||||||
var database = GetDatabase();
|
if (_database.IsRecycleBinEnabled && _database.RecycleBin == null)
|
||||||
if (database.IsRecycleBinEnabled && database.RecycleBinId == null)
|
await _mediator.Send(new CreateGroupCommand { ParentGroup = _database.RootGroup, IsRecycleBin = true, Name = recycleBinTitle});
|
||||||
await _mediator.Send(new CreateGroupCommand { ParentGroup = database.RootGroup, IsRecycleBin = true, Name = recycleBinTitle});
|
await Move(_database.IsRecycleBinEnabled && !ParentGroup.IsSelected ? _database.RecycleBin : null);
|
||||||
await Move(database.IsRecycleBinEnabled && !ParentGroup.IsSelected ? _database.RecycleBin : null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Move(GroupVm destination)
|
public async Task Move(Application.Group.Models.GroupVm destination)
|
||||||
{
|
{
|
||||||
PreviousGroup = ParentGroup;
|
PreviousGroup = ParentGroup;
|
||||||
PreviousGroup.Entries.Remove(this);
|
PreviousGroup.Entries.Remove(this);
|
||||||
@@ -270,13 +271,8 @@ namespace ModernKeePass.ViewModels
|
|||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return IsSelected ?
|
return IsSelected ?
|
||||||
_mediator.Send(new GetResourceQuery{Key = "EntryCurrent"}).GetAwaiter().GetResult() :
|
_resource.GetResourceValue("EntryCurrent") :
|
||||||
_entry.ModificationDate.ToString("g");
|
_entry.ModificationDate.ToString("g");
|
||||||
}
|
}
|
||||||
|
|
||||||
private DatabaseVm GetDatabase()
|
|
||||||
{
|
|
||||||
return _mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -20,6 +20,7 @@ using ModernKeePass.Application.Group.Commands.SortEntries;
|
|||||||
using ModernKeePass.Application.Group.Commands.SortGroups;
|
using ModernKeePass.Application.Group.Commands.SortGroups;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Domain.Enums;
|
using ModernKeePass.Domain.Enums;
|
||||||
|
using ModernKeePass.Domain.Interfaces;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
|
@@ -149,9 +149,6 @@
|
|||||||
<Compile Include="Converters\EmptyStringToVisibilityConverter.cs" />
|
<Compile Include="Converters\EmptyStringToVisibilityConverter.cs" />
|
||||||
<Compile Include="Converters\NullToBooleanConverter.cs" />
|
<Compile Include="Converters\NullToBooleanConverter.cs" />
|
||||||
<Compile Include="Extensions\DispatcherTaskExtensions.cs" />
|
<Compile Include="Extensions\DispatcherTaskExtensions.cs" />
|
||||||
<Content Include="Interfaces\IDatabaseService.cs" />
|
|
||||||
<Compile Include="Interfaces\IHasSelectableObject.cs" />
|
|
||||||
<Compile Include="Interfaces\ISelectableModel.cs" />
|
|
||||||
<Compile Include="Views\BasePages\LayoutAwarePageBase.cs" />
|
<Compile Include="Views\BasePages\LayoutAwarePageBase.cs" />
|
||||||
<Compile Include="Views\MainPageFrames\ImportExportPage.xaml.cs">
|
<Compile Include="Views\MainPageFrames\ImportExportPage.xaml.cs">
|
||||||
<DependentUpon>ImportExportPage.xaml</DependentUpon>
|
<DependentUpon>ImportExportPage.xaml</DependentUpon>
|
||||||
@@ -191,7 +188,6 @@
|
|||||||
<Compile Include="Converters\ProgressBarLegalValuesConverter.cs" />
|
<Compile Include="Converters\ProgressBarLegalValuesConverter.cs" />
|
||||||
<Compile Include="Converters\TextToWidthConverter.cs" />
|
<Compile Include="Converters\TextToWidthConverter.cs" />
|
||||||
<Compile Include="Events\PasswordEventArgs.cs" />
|
<Compile Include="Events\PasswordEventArgs.cs" />
|
||||||
<Compile Include="Interfaces\IIsEnabled.cs" />
|
|
||||||
<Compile Include="Interfaces\IVmEntity.cs" />
|
<Compile Include="Interfaces\IVmEntity.cs" />
|
||||||
<Compile Include="Views\MainPage.xaml.cs">
|
<Compile Include="Views\MainPage.xaml.cs">
|
||||||
<DependentUpon>MainPage.xaml</DependentUpon>
|
<DependentUpon>MainPage.xaml</DependentUpon>
|
||||||
|
Reference in New Issue
Block a user