diff --git a/Bitvault.Avalonia/App.axaml.cs b/Bitvault.Avalonia/App.axaml.cs index 481049c..65cd472 100644 --- a/Bitvault.Avalonia/App.axaml.cs +++ b/Bitvault.Avalonia/App.axaml.cs @@ -97,6 +97,7 @@ public partial class App : Application services.AddTemplate(); services.AddTemplate(); services.AddTemplate(); + services.AddTemplate(); services.AddTemplate(); services.AddTemplate(); @@ -106,8 +107,7 @@ public partial class App : Application services.AddHandler(ServiceLifetime.Scoped); services.AddHandler(ServiceLifetime.Scoped); - - services.AddHandler(); + services.AddHandler(ServiceLifetime.Scoped); }); })!); diff --git a/Bitvault.Avalonia/ArchiveItemActionView.axaml b/Bitvault.Avalonia/ArchiveItemActionView.axaml index 219ba78..c563799 100644 --- a/Bitvault.Avalonia/ArchiveItemActionView.axaml +++ b/Bitvault.Avalonia/ArchiveItemActionView.axaml @@ -14,9 +14,9 @@ ToolTip.Tip="Archive"> + Text="" /> diff --git a/Bitvault.Avalonia/ConfirmItemActionView.axaml b/Bitvault.Avalonia/ConfirmItemActionView.axaml index 2b33e76..58e1752 100644 --- a/Bitvault.Avalonia/ConfirmItemActionView.axaml +++ b/Bitvault.Avalonia/ConfirmItemActionView.axaml @@ -13,9 +13,9 @@ ToolTip.Tip="Save"> + Text="" /> diff --git a/Bitvault.Avalonia/DismissItemActionView.axaml b/Bitvault.Avalonia/DismissItemActionView.axaml index 81af79d..fcd4efa 100644 --- a/Bitvault.Avalonia/DismissItemActionView.axaml +++ b/Bitvault.Avalonia/DismissItemActionView.axaml @@ -1,18 +1,21 @@ + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:vm="using:Bitvault" + x:DataType="vm:DismissItemActionViewModel"> diff --git a/Bitvault.Avalonia/EditItemActionView.axaml b/Bitvault.Avalonia/EditItemActionView.axaml index 499ab2f..6fd40e1 100644 --- a/Bitvault.Avalonia/EditItemActionView.axaml +++ b/Bitvault.Avalonia/EditItemActionView.axaml @@ -13,9 +13,9 @@ ToolTip.Tip="Edit"> + Text="" /> diff --git a/Bitvault.Avalonia/ItemNavigationView.axaml b/Bitvault.Avalonia/ItemNavigationView.axaml index 6d1cc4f..7b21824 100644 --- a/Bitvault.Avalonia/ItemNavigationView.axaml +++ b/Bitvault.Avalonia/ItemNavigationView.axaml @@ -14,7 +14,11 @@ + Scope="self"> + + + + diff --git a/Bitvault.Avalonia/UnarchiveItemActionView.axaml b/Bitvault.Avalonia/UnarchiveItemActionView.axaml new file mode 100644 index 0000000..f009378 --- /dev/null +++ b/Bitvault.Avalonia/UnarchiveItemActionView.axaml @@ -0,0 +1,21 @@ + + + diff --git a/Bitvault.Avalonia/UnarchiveItemActionView.axaml.cs b/Bitvault.Avalonia/UnarchiveItemActionView.axaml.cs new file mode 100644 index 0000000..3ef9e1d --- /dev/null +++ b/Bitvault.Avalonia/UnarchiveItemActionView.axaml.cs @@ -0,0 +1,8 @@ +using Avalonia.Controls; + +namespace Bitvault.Avalonia; + +public partial class UnarchiveItemActionView : UserControl +{ + public UnarchiveItemActionView() => InitializeComponent(); +} diff --git a/Bitvault/AggerateContainerViewModelHandler.cs b/Bitvault/AggerateContainerViewModelHandler.cs index 0263308..352bb43 100644 --- a/Bitvault/AggerateContainerViewModelHandler.cs +++ b/Bitvault/AggerateContainerViewModelHandler.cs @@ -30,7 +30,7 @@ public class AggerateContainerViewModelHandler(IMediator mediator, IServiceFactory serviceFactory = serviceScope.ServiceProvider.GetRequiredService(); IValueStore valueStore = serviceScope.ServiceProvider.GetRequiredService>(); - if (serviceFactory.Create(Id, Name, "Description " + 1, selected) is ItemNavigationViewModel viewModel) + if (serviceFactory.Create(Id, Name, "Description", selected, configuration.Filter == "Archive") is ItemNavigationViewModel viewModel) { Item item = new() { Id = Id, Name = Name }; valueStore.Set(item); diff --git a/Bitvault/Archive.cs b/Bitvault/Archive.cs index 08d5aa5..48075a9 100644 --- a/Bitvault/Archive.cs +++ b/Bitvault/Archive.cs @@ -7,4 +7,4 @@ public record Archive public static ArchiveEventArgs As() where TValue : new() => new(new TValue()); -} +} \ No newline at end of file diff --git a/Bitvault/ArchiveItemActionViewModel.cs b/Bitvault/ArchiveItemActionViewModel.cs index e3cde98..84c5741 100644 --- a/Bitvault/ArchiveItemActionViewModel.cs +++ b/Bitvault/ArchiveItemActionViewModel.cs @@ -14,3 +14,4 @@ public partial class ArchiveItemActionViewModel(IServiceProvider provider, [RelayCommand] public void Invoke() => Publisher.Publish(Archive.As()); } + diff --git a/Bitvault/ArchiveItemHandler.cs b/Bitvault/ArchiveItemHandler.cs index 1b964af..0f285fc 100644 --- a/Bitvault/ArchiveItemHandler.cs +++ b/Bitvault/ArchiveItemHandler.cs @@ -20,7 +20,7 @@ public class ArchiveItemHandler(IValueStore valueStore, if (await context.FindAsync(item.Id) is ItemEntry result) { - result.State = 3; + result.State = 2; await context.SaveChangesAsync(); } }); diff --git a/Bitvault/ConfirmItemHandler.cs b/Bitvault/ConfirmItemHandler.cs index cc92bed..8f124bb 100644 --- a/Bitvault/ConfirmItemHandler.cs +++ b/Bitvault/ConfirmItemHandler.cs @@ -1,83 +1,8 @@ -using Bitvault.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; -using Toolkit.Foundation; +using Toolkit.Foundation; namespace Bitvault; -public class EditItemHander(IDbContextFactory dbContextFactory) : - IHandler, bool> -{ - public async Task Handle(EditEventArgs<(int, ItemConfiguration)> args, - CancellationToken cancellationToken) - { - //if (args.Value is ItemConfiguration configuration) - //{ - // try - // { - // using ContainerDbContext context = dbContextFactory.CreateDbContext(); - // EntityEntry? result = null; - - // await Task.Run(async () => - // { - // result = await context.AddAsync(new ItemEntry { Name = configuration.Name }, cancellationToken); - // await context.SaveChangesAsync(cancellationToken); - - // }, cancellationToken); - - // if (result is not null) - // { - // return true; - // } - // } - // catch - // { - - // } - //} - - return false; - } -} - -public class CreateItemHander(IDbContextFactory dbContextFactory) : - IHandler, (bool, int)> -{ - public async Task<(bool, int)> Handle(CreateEventArgs args, - CancellationToken cancellationToken) - { - if (args.Value is ItemConfiguration configuration) - { - try - { - using ContainerDbContext context = dbContextFactory.CreateDbContext(); - EntityEntry? result = null; - - await Task.Run(async () => - { - result = await context.AddAsync(new ItemEntry { Name = configuration.Name }, cancellationToken); - await context.SaveChangesAsync(cancellationToken); - - }, cancellationToken); - - if (result is not null) - { - return (false, -1); - } - } - catch - { - - } - } - - return (false, -1); - } -} - -public class ConfirmItemHandler(IMediator mediator, - IValueStore valueStore, - IPublisher publisher) : +public class ConfirmItemHandler(IMediator mediator) : INotificationHandler> { public async Task Handle(ConfirmEventArgs args) diff --git a/Bitvault/CreateItemHander.cs b/Bitvault/CreateItemHander.cs new file mode 100644 index 0000000..df53c78 --- /dev/null +++ b/Bitvault/CreateItemHander.cs @@ -0,0 +1,41 @@ +using Bitvault.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; +using Toolkit.Foundation; + +namespace Bitvault; + +public class CreateItemHander(IDbContextFactory dbContextFactory) : + IHandler, (bool, int)> +{ + public async Task<(bool, int)> Handle(CreateEventArgs args, + CancellationToken cancellationToken) + { + if (args.Value is ItemConfiguration configuration) + { + try + { + using ContainerDbContext context = dbContextFactory.CreateDbContext(); + EntityEntry? result = null; + + await Task.Run(async () => + { + result = await context.AddAsync(new ItemEntry { Name = configuration.Name }, cancellationToken); + await context.SaveChangesAsync(cancellationToken); + + }, cancellationToken); + + if (result is not null) + { + return (false, -1); + } + } + catch + { + + } + } + + return (false, -1); + } +} diff --git a/Bitvault/DismissItemActionViewModel.cs b/Bitvault/DismissItemActionViewModel.cs index 79b4a07..364e04a 100644 --- a/Bitvault/DismissItemActionViewModel.cs +++ b/Bitvault/DismissItemActionViewModel.cs @@ -1,4 +1,5 @@ -using Toolkit.Foundation; +using CommunityToolkit.Mvvm.Input; +using Toolkit.Foundation; namespace Bitvault; @@ -7,4 +8,8 @@ public partial class DismissItemActionViewModel(IServiceProvider provider, IMediator mediator, IPublisher publisher, ISubscription subscriber, - IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer); \ No newline at end of file + IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer) +{ + [RelayCommand] + public void Invoke() => Publisher.Publish(Cancel.As()); +} \ No newline at end of file diff --git a/Bitvault/EditItemHander.cs b/Bitvault/EditItemHander.cs new file mode 100644 index 0000000..0a2e07f --- /dev/null +++ b/Bitvault/EditItemHander.cs @@ -0,0 +1,40 @@ +using Bitvault.Data; +using Microsoft.EntityFrameworkCore; +using Toolkit.Foundation; + +namespace Bitvault; + +public class EditItemHander(IDbContextFactory dbContextFactory) : + IHandler, bool> +{ + public async Task Handle(EditEventArgs<(int, ItemConfiguration)> args, + CancellationToken cancellationToken) + { + //if (args.Value is ItemConfiguration configuration) + //{ + // try + // { + // using ContainerDbContext context = dbContextFactory.CreateDbContext(); + // EntityEntry? result = null; + + // await Task.Run(async () => + // { + // result = await context.AddAsync(new ItemEntry { Name = configuration.Name }, cancellationToken); + // await context.SaveChangesAsync(cancellationToken); + + // }, cancellationToken); + + // if (result is not null) + // { + // return true; + // } + // } + // catch + // { + + // } + //} + + return false; + } +} diff --git a/Bitvault/ItemActivatedHandler.cs b/Bitvault/ItemActivatedHandler.cs index 934f197..e26eff7 100644 --- a/Bitvault/ItemActivatedHandler.cs +++ b/Bitvault/ItemActivatedHandler.cs @@ -4,27 +4,3 @@ using Toolkit.Foundation; namespace Bitvault; -public class ItemActivatedHandler(IServiceProvider serviceProvider, - ICache cache, - IPublisher publisher) : - INotificationHandler> -{ - public Task Handle(ActivatedEventArgs args) - { - if (args.Value is Item item) - { - IServiceScope serviceScope = serviceProvider.CreateScope(); - IServiceFactory serviceFactory = serviceScope.ServiceProvider.GetRequiredService(); - - cache.Add(item); - int index = cache.IndexOf(item); - - if (serviceFactory.Create(item.Id, item.Name, "Description " + 1, true) is ItemNavigationViewModel viewModel) - { - publisher.Publish(Insert.As(index, viewModel), nameof(ContainerViewModel)); - } - } - - return Task.CompletedTask; - } -} \ No newline at end of file diff --git a/Bitvault/ItemNavigationViewModel.cs b/Bitvault/ItemNavigationViewModel.cs index fdb1f68..2b9de96 100644 --- a/Bitvault/ItemNavigationViewModel.cs +++ b/Bitvault/ItemNavigationViewModel.cs @@ -14,12 +14,17 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, int id, string name, string description, - bool selected) : + bool selected, + bool archived) : Observable(provider, factory, mediator, publisher, subscriber, disposer), INotificationHandler>, + INotificationHandler>, ISelectable, IRemovable { + [ObservableProperty] + private bool archived = archived; + [ObservableProperty] private string? description = description; @@ -42,4 +47,10 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, Dispose(); return Task.CompletedTask; } + + public Task Handle(UnarchiveEventArgs args) + { + Dispose(); + return Task.CompletedTask; + } } \ No newline at end of file diff --git a/Bitvault/ItemViewModel.cs b/Bitvault/ItemViewModel.cs index e53c7ca..0c12ff5 100644 --- a/Bitvault/ItemViewModel.cs +++ b/Bitvault/ItemViewModel.cs @@ -1,26 +1,66 @@ -using Toolkit.Foundation; +using CommunityToolkit.Mvvm.ComponentModel; +using Toolkit.Foundation; namespace Bitvault; public partial class ItemViewModel : - ObservableCollection + ObservableCollection, + INotificationHandler>, + INotificationHandler> { + [ObservableProperty] + private bool archived; + public ItemViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, - IContentTemplate template) : base(provider, factory, mediator, publisher, subscriber, disposer) + IContentTemplate template, + bool archived = false) : base(provider, factory, mediator, publisher, subscriber, disposer) { Template = template; + Archived = archived; + if (!Archived) + { + Publisher.Publish(Notify.As(Factory.Create(new List + { + Factory.Create(), + Factory.Create(), + }))); + } + else + { + Publisher.Publish(Notify.As(Factory.Create(new List + { + Factory.Create(), + }))); + } + } + + public IContentTemplate Template { get; set; } + + public Task Handle(EditEventArgs args) + { + Publisher.Publish(Notify.As(Factory.Create(new List + { + Factory.Create(), + Factory.Create(), + }))); + + return Task.CompletedTask; + } + + public Task Handle(CancelEventArgs args) + { Publisher.Publish(Notify.As(Factory.Create(new List { Factory.Create(), Factory.Create(), }))); - } - public IContentTemplate Template { get; set; } + return Task.CompletedTask; + } } diff --git a/Bitvault/QueryContainerHandler.cs b/Bitvault/QueryContainerHandler.cs index ff21068..e8ea388 100644 --- a/Bitvault/QueryContainerHandler.cs +++ b/Bitvault/QueryContainerHandler.cs @@ -20,17 +20,17 @@ public class QueryContainerHandler(IDbContextFactory dbConte if (queryConfiguration.Filter == "All") { - predicate = predicate.And(x => x.State != 3); + predicate = predicate.And(x => x.State != 2); } if (queryConfiguration.Filter == "Starred") { - predicate = predicate.And(x => x.State != 3 && x.State == 2); + predicate = predicate.And(x => x.State != 2 && x.State == 1); } if (queryConfiguration.Filter == "Archive") { - predicate = predicate.And(x => x.State == 3); + predicate = predicate.And(x => x.State == 2); } if (queryConfiguration.Query is { Length: > 0} query) diff --git a/Bitvault/Unarchive.cs b/Bitvault/Unarchive.cs new file mode 100644 index 0000000..63f451b --- /dev/null +++ b/Bitvault/Unarchive.cs @@ -0,0 +1,10 @@ +namespace Bitvault; + +public record Unarchive +{ + public static UnarchiveEventArgs As(TValue value) => + new(value); + + public static UnarchiveEventArgs As() where TValue : new() => + new(new TValue()); +} diff --git a/Bitvault/UnarchiveEventArgs.cs b/Bitvault/UnarchiveEventArgs.cs new file mode 100644 index 0000000..8b15903 --- /dev/null +++ b/Bitvault/UnarchiveEventArgs.cs @@ -0,0 +1,3 @@ +namespace Bitvault; + +public record UnarchiveEventArgs(TValue Value); diff --git a/Bitvault/UnarchiveItemActionViewModel.cs b/Bitvault/UnarchiveItemActionViewModel.cs new file mode 100644 index 0000000..fe54dba --- /dev/null +++ b/Bitvault/UnarchiveItemActionViewModel.cs @@ -0,0 +1,17 @@ +using CommunityToolkit.Mvvm.Input; +using Toolkit.Foundation; + +namespace Bitvault; + +public partial class UnarchiveItemActionViewModel(IServiceProvider provider, + IServiceFactory factory, + IMediator mediator, + IPublisher publisher, + ISubscription subscriber, + IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer), + IRemovable +{ + [RelayCommand] + public void Invoke() => Publisher.Publish(Unarchive.As()); +} + diff --git a/Bitvault/UnarchiveItemHandler.cs b/Bitvault/UnarchiveItemHandler.cs new file mode 100644 index 0000000..603e315 --- /dev/null +++ b/Bitvault/UnarchiveItemHandler.cs @@ -0,0 +1,34 @@ +using Bitvault.Data; +using Microsoft.EntityFrameworkCore; +using Toolkit.Foundation; + +namespace Bitvault; + +public class UnarchiveItemHandler(IValueStore valueStore, + IDbContextFactory dbContextFactory) : + INotificationHandler> +{ + public async Task Handle(UnarchiveEventArgs args) + { + try + { + if (valueStore.Value is Item item) + { + await Task.Run(async () => + { + using ContainerDbContext context = await dbContextFactory.CreateDbContextAsync(); + + if (await context.FindAsync(item.Id) is ItemEntry result) + { + result.State = 0; + await context.SaveChangesAsync(); + } + }); + } + } + catch + { + + } + } +}