From 71f86be71578f042de892b40c6d89e0ebe2d05e5 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Sun, 2 Jun 2024 15:00:59 +0100 Subject: [PATCH] Add supported for key mediator handelrs --- Bitvault.Avalonia/App.axaml.cs | 34 +++++++++++++++---- .../ItemCategoryNavigationView.axaml | 20 +++-------- Bitvault.Avalonia/ItemDropdownEntryView.axaml | 8 +++++ .../ItemDropdownEntryView.axaml.cs | 12 +++++++ .../ItemMaskedTextEntryView.axaml | 8 +++++ .../ItemMaskedTextEntryView.axaml.cs | 12 +++++++ Bitvault.Avalonia/ItemNavigationView.axaml | 1 + Bitvault.Avalonia/ItemPasswordEntryView.axaml | 8 +++++ .../ItemPasswordEntryView.axaml.cs | 12 +++++++ Bitvault.Avalonia/ItemTextEntryView.axaml | 8 +++++ Bitvault.Avalonia/ItemTextEntryView.axaml.cs | 12 +++++++ .../AggregateItemCategoryViewModelHandler.cs | 6 ++-- ...ItemContentFromCategoryViewModelHandler.cs | 30 ++++++++++++++++ .../AggregateItemContentViewModelHandler.cs | 8 ++--- Bitvault/AggregateItemViewModelHandler.cs | 15 ++++---- Bitvault/IItemConfigurationCollection.cs | 4 +++ Bitvault/IItemEntryViewModel.cs | 4 +-- Bitvault/ItemCategoryCollectionViewModel.cs | 2 +- Bitvault/ItemCollectionViewModel.cs | 4 +-- Bitvault/ItemConfiguration.cs | 2 +- Bitvault/ItemConfigurationCollection.cs | 7 ++++ Bitvault/ItemContentViewModel.cs | 32 +++++++++-------- Bitvault/ItemDropdownEntryViewModel.cs | 12 +++++++ Bitvault/ItemDropdownEntryViewModelHandler.cs | 18 ++++++++++ Bitvault/ItemHeaderViewModel.cs | 3 +- Bitvault/ItemMaskedTextEntryViewModel.cs | 11 ++++++ .../ItemMaskedTextEntryViewModelHandler.cs | 18 ++++++++++ Bitvault/ItemNavigationViewModel.cs | 10 ++++-- Bitvault/ItemPasswordEntryViewModel.cs | 11 ++++++ Bitvault/ItemPasswordEntryViewModelHandler.cs | 18 ++++++++++ Bitvault/ItemTextEntryViewModel.cs | 11 ++++++ Bitvault/ItemTextEntryViewModelHandler.cs | 18 ++++++++++ Bitvault/ItemViewModel.cs | 2 +- Bitvault/MainViewModel.cs | 2 +- Bitvault/QueryLockerHandler.cs | 9 ++--- 35 files changed, 321 insertions(+), 71 deletions(-) create mode 100644 Bitvault.Avalonia/ItemDropdownEntryView.axaml create mode 100644 Bitvault.Avalonia/ItemDropdownEntryView.axaml.cs create mode 100644 Bitvault.Avalonia/ItemMaskedTextEntryView.axaml create mode 100644 Bitvault.Avalonia/ItemMaskedTextEntryView.axaml.cs create mode 100644 Bitvault.Avalonia/ItemPasswordEntryView.axaml create mode 100644 Bitvault.Avalonia/ItemPasswordEntryView.axaml.cs create mode 100644 Bitvault.Avalonia/ItemTextEntryView.axaml create mode 100644 Bitvault.Avalonia/ItemTextEntryView.axaml.cs create mode 100644 Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs create mode 100644 Bitvault/IItemConfigurationCollection.cs create mode 100644 Bitvault/ItemConfigurationCollection.cs create mode 100644 Bitvault/ItemDropdownEntryViewModel.cs create mode 100644 Bitvault/ItemDropdownEntryViewModelHandler.cs create mode 100644 Bitvault/ItemMaskedTextEntryViewModel.cs create mode 100644 Bitvault/ItemMaskedTextEntryViewModelHandler.cs create mode 100644 Bitvault/ItemPasswordEntryViewModel.cs create mode 100644 Bitvault/ItemPasswordEntryViewModelHandler.cs create mode 100644 Bitvault/ItemTextEntryViewModel.cs create mode 100644 Bitvault/ItemTextEntryViewModelHandler.cs diff --git a/Bitvault.Avalonia/App.axaml.cs b/Bitvault.Avalonia/App.axaml.cs index 9da0bb0..cbe7d5d 100644 --- a/Bitvault.Avalonia/App.axaml.cs +++ b/Bitvault.Avalonia/App.axaml.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; +using System.Linq; using Toolkit.Avalonia; using Toolkit.Foundation; @@ -69,6 +70,15 @@ public partial class App : Application services.AddTransient(); services.AddTransient(); + services.AddTransient(provider => + { + IEnumerable> items = + provider.GetServices>() ?? + Enumerable.Empty>(); + + return new ItemConfigurationCollection(items.ToDictionary(x => x.Name, x => (Func)(() => x.Value))); + }); + services.TryAddSingleton, ValueStore>(); services.TryAddSingleton, ValueStore>(); @@ -100,6 +110,7 @@ public partial class App : Application services.AddTemplate("Locker"); services.AddTemplate("ContentItemCollection"); + services.AddHandler(); services.AddTemplate("LockerHeader"); @@ -112,10 +123,18 @@ public partial class App : Application services.AddHandler(); + services.AddScoped>, ValueStore>>(); + + services.AddTemplate(); + services.AddTemplate(); + services.AddTemplate("EmptyItemCollection"); services.AddTemplate("Item"); + services.AddTemplate(); + services.AddTemplate(); services.AddHandler(); + services.AddHandler(); services.AddTemplate("ItemCommandHeader"); @@ -127,12 +146,10 @@ public partial class App : Application services.AddTemplate(); services.AddTemplate(); - services.AddTemplate("EmptyItemCollection"); - services.AddTemplate(); - services.AddTemplate(); - services.AddTemplate(); - - services.AddScoped>, ValueStore>>(); + services.AddTemplate(); + services.AddTemplate(); + services.AddTemplate(); + services.AddTemplate(); services.AddHandler(nameof(ItemState.Write)); services.AddHandler(nameof(ItemState.New)); @@ -142,6 +159,11 @@ public partial class App : Application services.AddHandler(); services.AddHandler(); + services.AddHandler(nameof(TextEntryConfiguration)); + services.AddHandler(nameof(PasswordEntryConfiguration)); + services.AddHandler(nameof(MaskedTextEntryConfiguration)); + services.AddHandler(nameof(DropdownEntryConfiguration)); + services.AddHandler(ServiceLifetime.Singleton); services.AddHandler(ServiceLifetime.Singleton); }); diff --git a/Bitvault.Avalonia/ItemCategoryNavigationView.axaml b/Bitvault.Avalonia/ItemCategoryNavigationView.axaml index cf70124..586c2ba 100644 --- a/Bitvault.Avalonia/ItemCategoryNavigationView.axaml +++ b/Bitvault.Avalonia/ItemCategoryNavigationView.axaml @@ -3,24 +3,12 @@ xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="using:Bitvault" - x:DataType="vm:ItemCategoryNavigationViewModel"> + x:DataType="vm:ItemCategoryNavigationViewModel" + ListBoxExtension.IsItemInvokedEnabled="True"> - - - - - - - - - - - + - + + Welcome to Avalonia! + diff --git a/Bitvault.Avalonia/ItemDropdownEntryView.axaml.cs b/Bitvault.Avalonia/ItemDropdownEntryView.axaml.cs new file mode 100644 index 0000000..cdcb0d6 --- /dev/null +++ b/Bitvault.Avalonia/ItemDropdownEntryView.axaml.cs @@ -0,0 +1,12 @@ +using Avalonia.Controls; + +namespace Bitvault.Avalonia +{ + public partial class ItemDropdownEntryView : UserControl + { + public ItemDropdownEntryView() + { + InitializeComponent(); + } + } +} diff --git a/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml new file mode 100644 index 0000000..08628f8 --- /dev/null +++ b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml @@ -0,0 +1,8 @@ + + Welcome to Avalonia! + diff --git a/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml.cs b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml.cs new file mode 100644 index 0000000..9d7d161 --- /dev/null +++ b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml.cs @@ -0,0 +1,12 @@ +using Avalonia.Controls; + +namespace Bitvault.Avalonia +{ + public partial class ItemMaskedTextEntryView : UserControl + { + public ItemMaskedTextEntryView() + { + InitializeComponent(); + } + } +} diff --git a/Bitvault.Avalonia/ItemNavigationView.axaml b/Bitvault.Avalonia/ItemNavigationView.axaml index 9d72351..6de7b0f 100644 --- a/Bitvault.Avalonia/ItemNavigationView.axaml +++ b/Bitvault.Avalonia/ItemNavigationView.axaml @@ -14,6 +14,7 @@ Region="{Binding Named, StringFormat='{}{0}:Content'}" Route="Item" Scope="self"> + diff --git a/Bitvault.Avalonia/ItemPasswordEntryView.axaml b/Bitvault.Avalonia/ItemPasswordEntryView.axaml new file mode 100644 index 0000000..35401e4 --- /dev/null +++ b/Bitvault.Avalonia/ItemPasswordEntryView.axaml @@ -0,0 +1,8 @@ + + Welcome to Avalonia! + diff --git a/Bitvault.Avalonia/ItemPasswordEntryView.axaml.cs b/Bitvault.Avalonia/ItemPasswordEntryView.axaml.cs new file mode 100644 index 0000000..7a898cf --- /dev/null +++ b/Bitvault.Avalonia/ItemPasswordEntryView.axaml.cs @@ -0,0 +1,12 @@ +using Avalonia.Controls; + +namespace Bitvault.Avalonia +{ + public partial class ItemPasswordEntryView : UserControl + { + public ItemPasswordEntryView() + { + InitializeComponent(); + } + } +} diff --git a/Bitvault.Avalonia/ItemTextEntryView.axaml b/Bitvault.Avalonia/ItemTextEntryView.axaml new file mode 100644 index 0000000..bce68b6 --- /dev/null +++ b/Bitvault.Avalonia/ItemTextEntryView.axaml @@ -0,0 +1,8 @@ + + Welcome to Avalonia! + diff --git a/Bitvault.Avalonia/ItemTextEntryView.axaml.cs b/Bitvault.Avalonia/ItemTextEntryView.axaml.cs new file mode 100644 index 0000000..0b55188 --- /dev/null +++ b/Bitvault.Avalonia/ItemTextEntryView.axaml.cs @@ -0,0 +1,12 @@ +using Avalonia.Controls; + +namespace Bitvault.Avalonia +{ + public partial class ItemTextEntryView : UserControl + { + public ItemTextEntryView() + { + InitializeComponent(); + } + } +} diff --git a/Bitvault/AggregateItemCategoryViewModelHandler.cs b/Bitvault/AggregateItemCategoryViewModelHandler.cs index 11906db..90c3137 100644 --- a/Bitvault/AggregateItemCategoryViewModelHandler.cs +++ b/Bitvault/AggregateItemCategoryViewModelHandler.cs @@ -2,7 +2,7 @@ namespace Bitvault; -public class AggregateItemCategoryViewModelHandler(IEnumerable> descriptors, +public class AggregateItemCategoryViewModelHandler(IItemConfigurationCollection configurations, IServiceFactory serviceFactory, IPublisher publisher) : INotificationHandler> @@ -10,9 +10,9 @@ public class AggregateItemCategoryViewModelHandler(IEnumerable args) { bool selected = true; - foreach (IConfigurationDescriptor descriptor in descriptors) + foreach (KeyValuePair> configuration in configurations) { - if (serviceFactory.Create(descriptor.Name, selected) + if (serviceFactory.Create(configuration.Key, selected) is ItemCategoryNavigationViewModel viewModel) { publisher.Publish(Create.As(viewModel), nameof(ItemCategoryCollectionViewModel)); diff --git a/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs b/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs new file mode 100644 index 0000000..3883dc6 --- /dev/null +++ b/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs @@ -0,0 +1,30 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public class AggregateItemContentFromCategoryViewModelHandler(IItemConfigurationCollection configurations, + IMediator mediator, + IPublisher publisher) : + INotificationHandler> +{ + public async Task Handle(AggerateEventArgs args) + { + if (args.Value is string category) + { + if (configurations.TryGetValue(category, out Func? factory)) + { + if (factory.Invoke() is ItemConfiguration configuration) + { + foreach (ItemSectionConfiguration section in configuration.Sections) + { + foreach (ItemEntryConfiguration entryConfiguration in section.Entries) + { + var dod = await mediator.Handle(entryConfiguration, + entryConfiguration.GetType().Name); + } + } + } + } + } + } +} diff --git a/Bitvault/AggregateItemContentViewModelHandler.cs b/Bitvault/AggregateItemContentViewModelHandler.cs index 077fcb0..a45cff9 100644 --- a/Bitvault/AggregateItemContentViewModelHandler.cs +++ b/Bitvault/AggregateItemContentViewModelHandler.cs @@ -2,20 +2,18 @@ namespace Bitvault; -public class AggregateItemContentViewModelHandler(IValueStore> valueStore, - IMediator mediator, +public class AggregateItemContentViewModelHandler(IMediator mediator, IServiceFactory serviceFactory, IPublisher publisher) : INotificationHandler> { public Task Handle(AggerateEventArgs args) { - var d = valueStore; - //if (serviceFactory.Create(false) is ItemHeaderViewModel viewModel) + //wModel>(false) is ItemHeaderViewModel viewModel) //{ // publisher.Publish(Create.As(viewModel), nameof(ItemViewModel)); //} return Task.CompletedTask; } -} \ No newline at end of file +} diff --git a/Bitvault/AggregateItemViewModelHandler.cs b/Bitvault/AggregateItemViewModelHandler.cs index d73a396..4e21875 100644 --- a/Bitvault/AggregateItemViewModelHandler.cs +++ b/Bitvault/AggregateItemViewModelHandler.cs @@ -8,32 +8,31 @@ public class AggerateItemViewModelHandler(IMediator mediator, ICache> cache, IPublisher publisher, LockerViewModelConfiguration dd) : - INotificationHandler> { - public async Task Handle(AggregateEventArgs args) { - var ddddd = dd; - if (args.Options is LockerViewModelConfiguration configuration) + if (args.Value is LockerViewModelConfiguration configuration) { cache.Clear(); bool selected = true; if (await mediator.Handle, - IReadOnlyCollection<(Guid Id, string Name, bool Favourite, bool Archived)>>(Request.As(new QueryLockerConfiguration + IReadOnlyCollection<(Guid Id, string Name, string Category, bool Favourite, bool Archived)>>(Request.As(new QueryLockerConfiguration { Filter = configuration.Filter, Query = configuration.Query - })) is IReadOnlyCollection<(Guid Id, string Name, bool Favourite, bool Archived)> results) + })) is IReadOnlyCollection<(Guid Id, string Name, string Category, bool Favourite, bool Archived)> results) { - foreach ((Guid Id, string Name, bool Favourite, bool Archived) in results) + foreach ((Guid Id, string Name, string Category, bool Favourite, bool Archived) in results) { IServiceScope serviceScope = serviceProvider.CreateScope(); IServiceFactory serviceFactory = serviceScope.ServiceProvider.GetRequiredService(); IValueStore> valueStore = serviceScope.ServiceProvider.GetRequiredService>>(); - if (serviceFactory.Create(Id, Name, "Description", selected, Favourite, Archived) is ItemNavigationViewModel viewModel) + if (serviceFactory.Create(Id, Name, "Description", Category, selected, Favourite, Archived) is ItemNavigationViewModel viewModel) { Item<(Guid, string)> item = new((Id, Name)); diff --git a/Bitvault/IItemConfigurationCollection.cs b/Bitvault/IItemConfigurationCollection.cs new file mode 100644 index 0000000..ab6572f --- /dev/null +++ b/Bitvault/IItemConfigurationCollection.cs @@ -0,0 +1,4 @@ +namespace Bitvault; + +public interface IItemConfigurationCollection : + IReadOnlyDictionary>; diff --git a/Bitvault/IItemEntryViewModel.cs b/Bitvault/IItemEntryViewModel.cs index 8fde9c1..6c36e1f 100644 --- a/Bitvault/IItemEntryViewModel.cs +++ b/Bitvault/IItemEntryViewModel.cs @@ -1,6 +1,4 @@ namespace Bitvault; public interface IItemEntryViewModel : - IDisposable -{ -} \ No newline at end of file + IDisposable; \ No newline at end of file diff --git a/Bitvault/ItemCategoryCollectionViewModel.cs b/Bitvault/ItemCategoryCollectionViewModel.cs index f5b552c..e6b975c 100644 --- a/Bitvault/ItemCategoryCollectionViewModel.cs +++ b/Bitvault/ItemCategoryCollectionViewModel.cs @@ -3,7 +3,7 @@ using Toolkit.Foundation; namespace Bitvault; -[Aggerate(typeof(CreateEventArgs), nameof(ItemCategoryCollectionViewModel))] +[Notification(typeof(CreateEventArgs), nameof(ItemCategoryCollectionViewModel))] public partial class ItemCategoryCollectionViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, diff --git a/Bitvault/ItemCollectionViewModel.cs b/Bitvault/ItemCollectionViewModel.cs index 4a9732a..6e01523 100644 --- a/Bitvault/ItemCollectionViewModel.cs +++ b/Bitvault/ItemCollectionViewModel.cs @@ -3,7 +3,7 @@ using Toolkit.Foundation; namespace Bitvault; -[Aggerate(typeof(AggerateEventArgs), nameof(ItemCollectionViewModel))] +[Notification(typeof(AggerateEventArgs), nameof(ItemCollectionViewModel))] [Notification(typeof(CreateEventArgs), nameof(ItemCollectionViewModel))] [Notification(typeof(InsertEventArgs), nameof(ItemCollectionViewModel))] [Notification(typeof(MoveToEventArgs), nameof(ItemCollectionViewModel))] @@ -71,6 +71,6 @@ public partial class ItemCollectionViewModel : return base.OnActivated(); } - protected override AggregateExpression CreateAggregateExpression() => + protected override AggregateExpression BuildAggregateExpression() => new(Aggregate.As(configuration)); } diff --git a/Bitvault/ItemConfiguration.cs b/Bitvault/ItemConfiguration.cs index e1699fb..abb81e3 100644 --- a/Bitvault/ItemConfiguration.cs +++ b/Bitvault/ItemConfiguration.cs @@ -2,7 +2,7 @@ public record ItemConfiguration { - public IList? Sections { get; set; } + public IList Sections { get; set; } = new List(); public static ItemConfiguration Identity => new() { diff --git a/Bitvault/ItemConfigurationCollection.cs b/Bitvault/ItemConfigurationCollection.cs new file mode 100644 index 0000000..323761d --- /dev/null +++ b/Bitvault/ItemConfigurationCollection.cs @@ -0,0 +1,7 @@ +using System.Collections.ObjectModel; + +namespace Bitvault; + +public class ItemConfigurationCollection(IDictionary> dictionary) : + ReadOnlyDictionary>(dictionary), + IItemConfigurationCollection; diff --git a/Bitvault/ItemContentViewModel.cs b/Bitvault/ItemContentViewModel.cs index 00e8266..85a15c6 100644 --- a/Bitvault/ItemContentViewModel.cs +++ b/Bitvault/ItemContentViewModel.cs @@ -2,27 +2,29 @@ namespace Bitvault; -//[Aggerate(nameof(ItemContentViewModel))] -public partial class ItemContentViewModel : - ObservableCollection, +public partial class ItemContentViewModel(IServiceProvider provider, + IServiceFactory factory, IMediator mediator, + IPublisher publisher, + ISubscription subscriber, + IDisposer disposer, + IContentTemplate template, + ItemState state = ItemState.Read) : + ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer), IItemEntryViewModel, INotificationHandler>> { - public ItemContentViewModel(IServiceProvider provider, - IServiceFactory factory, IMediator mediator, - IPublisher publisher, - ISubscription subscriber, - IDisposer disposer, - IContentTemplate template, - ItemState state = ItemState.Read) : base(provider, factory, mediator, publisher, subscriber, disposer) - { - Template = template; - } - - public IContentTemplate Template { get; set; } + public IContentTemplate Template { get; set; } = template; public Task Handle(NotifyEventArgs> args) { + if (args.Value is ItemCategory category) + { + if (category.Value is string value) + { + Fetch(() => new AggregateExpression(new AggerateEventArgs(value)), true); + } + } + return Task.CompletedTask; } } diff --git a/Bitvault/ItemDropdownEntryViewModel.cs b/Bitvault/ItemDropdownEntryViewModel.cs new file mode 100644 index 0000000..14c4681 --- /dev/null +++ b/Bitvault/ItemDropdownEntryViewModel.cs @@ -0,0 +1,12 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public partial class ItemDropdownEntryViewModel(IServiceProvider provider, + IServiceFactory factory, + IMediator mediator, + IPublisher publisher, + ISubscription subscriber, + IDisposer disposer) : + Observable(provider, factory, mediator, publisher, subscriber, disposer), + IItemEntryViewModel; diff --git a/Bitvault/ItemDropdownEntryViewModelHandler.cs b/Bitvault/ItemDropdownEntryViewModelHandler.cs new file mode 100644 index 0000000..df6379a --- /dev/null +++ b/Bitvault/ItemDropdownEntryViewModelHandler.cs @@ -0,0 +1,18 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public class ItemDropdownEntryViewModelHandler(IServiceFactory serviceFactory) : + IHandler +{ + public Task Handle(DropdownEntryConfiguration args, + CancellationToken cancellationToken) + { + if (serviceFactory.Create() is ItemDropdownEntryViewModel viewModel) + { + return Task.FromResult(viewModel); + } + + return Task.FromResult(default); + } +} diff --git a/Bitvault/ItemHeaderViewModel.cs b/Bitvault/ItemHeaderViewModel.cs index 649449d..685ac64 100644 --- a/Bitvault/ItemHeaderViewModel.cs +++ b/Bitvault/ItemHeaderViewModel.cs @@ -9,8 +9,7 @@ public partial class ItemHeaderViewModel : Observable, INotificationHandler>, INotificationHandler>, INotificationHandler>, - INotificationHandler>>, - IItemEntryViewModel + INotificationHandler>> { [ObservableProperty] private string? category; diff --git a/Bitvault/ItemMaskedTextEntryViewModel.cs b/Bitvault/ItemMaskedTextEntryViewModel.cs new file mode 100644 index 0000000..2a41556 --- /dev/null +++ b/Bitvault/ItemMaskedTextEntryViewModel.cs @@ -0,0 +1,11 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public partial class ItemMaskedTextEntryViewModel(IServiceProvider provider, + IServiceFactory factory, + IMediator mediator, + IPublisher publisher, + ISubscription subscriber, + IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer), + IItemEntryViewModel; \ No newline at end of file diff --git a/Bitvault/ItemMaskedTextEntryViewModelHandler.cs b/Bitvault/ItemMaskedTextEntryViewModelHandler.cs new file mode 100644 index 0000000..5c12ad7 --- /dev/null +++ b/Bitvault/ItemMaskedTextEntryViewModelHandler.cs @@ -0,0 +1,18 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public class ItemMaskedTextEntryViewModelHandler(IServiceFactory serviceFactory) : + IHandler +{ + public Task Handle(MaskedTextEntryConfiguration args, + CancellationToken cancellationToken) + { + if (serviceFactory.Create() is ItemMaskedTextEntryViewModel viewModel) + { + return Task.FromResult(viewModel); + } + + return Task.FromResult(default); + } +} diff --git a/Bitvault/ItemNavigationViewModel.cs b/Bitvault/ItemNavigationViewModel.cs index e2b1465..9d44d25 100644 --- a/Bitvault/ItemNavigationViewModel.cs +++ b/Bitvault/ItemNavigationViewModel.cs @@ -13,8 +13,9 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, IContentTemplate template, NamedComponent named, Guid id, - string? name = "", - string? description = "", + string name = "", + string description = "", + string category = "", bool selected = false, bool favourite = false, bool archived = false) : @@ -30,6 +31,9 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, [ObservableProperty] private bool archived = archived; + [ObservableProperty] + private string? category = category; + [ObservableProperty] private string? description = description; @@ -48,8 +52,8 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, [ObservableProperty] private bool selected = selected; - public IContentTemplate Template { get; set; } = template; public bool Attached { get; set; } + public IContentTemplate Template { get; set; } = template; public Task Handle(ArchiveEventArgs args) => Task.Run(Dispose); diff --git a/Bitvault/ItemPasswordEntryViewModel.cs b/Bitvault/ItemPasswordEntryViewModel.cs new file mode 100644 index 0000000..d5a6a2f --- /dev/null +++ b/Bitvault/ItemPasswordEntryViewModel.cs @@ -0,0 +1,11 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public partial class ItemPasswordEntryViewModel(IServiceProvider provider, + IServiceFactory factory, + IMediator mediator, + IPublisher publisher, + ISubscription subscriber, + IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer), + IItemEntryViewModel; \ No newline at end of file diff --git a/Bitvault/ItemPasswordEntryViewModelHandler.cs b/Bitvault/ItemPasswordEntryViewModelHandler.cs new file mode 100644 index 0000000..a3177f2 --- /dev/null +++ b/Bitvault/ItemPasswordEntryViewModelHandler.cs @@ -0,0 +1,18 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public class ItemPasswordEntryViewModelHandler(IServiceFactory serviceFactory) : + IHandler +{ + public Task Handle(PasswordEntryConfiguration args, + CancellationToken cancellationToken) + { + if (serviceFactory.Create() is ItemPasswordEntryViewModel viewModel) + { + return Task.FromResult(viewModel); + } + + return Task.FromResult(default); + } +} diff --git a/Bitvault/ItemTextEntryViewModel.cs b/Bitvault/ItemTextEntryViewModel.cs new file mode 100644 index 0000000..1150ac2 --- /dev/null +++ b/Bitvault/ItemTextEntryViewModel.cs @@ -0,0 +1,11 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public partial class ItemTextEntryViewModel(IServiceProvider provider, + IServiceFactory factory, + IMediator mediator, + IPublisher publisher, + ISubscription subscriber, + IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer), + IItemEntryViewModel; \ No newline at end of file diff --git a/Bitvault/ItemTextEntryViewModelHandler.cs b/Bitvault/ItemTextEntryViewModelHandler.cs new file mode 100644 index 0000000..022d673 --- /dev/null +++ b/Bitvault/ItemTextEntryViewModelHandler.cs @@ -0,0 +1,18 @@ +using Toolkit.Foundation; + +namespace Bitvault; + +public class ItemTextEntryViewModelHandler(IServiceFactory serviceFactory) : + IHandler +{ + public Task Handle(TextEntryConfiguration args, + CancellationToken cancellationToken) + { + if (serviceFactory.Create() is ItemTextEntryViewModel viewModel) + { + return Task.FromResult(viewModel); + } + + return Task.FromResult(default); + } +} diff --git a/Bitvault/ItemViewModel.cs b/Bitvault/ItemViewModel.cs index f6f124d..ee1a23c 100644 --- a/Bitvault/ItemViewModel.cs +++ b/Bitvault/ItemViewModel.cs @@ -6,7 +6,7 @@ namespace Bitvault; [Notification(typeof(ConfirmEventArgs), nameof(ItemState.New))] [Notification(typeof(ConfirmEventArgs), nameof(ItemState.Write))] public partial class ItemViewModel : - ObservableCollection, + ObservableCollection, INotificationHandler>, INotificationHandler>, INotificationHandler> diff --git a/Bitvault/MainViewModel.cs b/Bitvault/MainViewModel.cs index 584c8a1..d434a04 100644 --- a/Bitvault/MainViewModel.cs +++ b/Bitvault/MainViewModel.cs @@ -3,7 +3,7 @@ using Toolkit.Foundation; namespace Bitvault; -[Aggerate(typeof(CreateEventArgs), nameof(MainViewModel))] +[Notification(typeof(CreateEventArgs), nameof(MainViewModel))] public partial class MainViewModel : ObservableCollection { diff --git a/Bitvault/QueryLockerHandler.cs b/Bitvault/QueryLockerHandler.cs index dafe19d..215795e 100644 --- a/Bitvault/QueryLockerHandler.cs +++ b/Bitvault/QueryLockerHandler.cs @@ -6,12 +6,12 @@ using Toolkit.Foundation; namespace Bitvault; public class QueryLockerHandler(IDbContextFactory dbContextFactory) : - IHandler, IReadOnlyCollection<(Guid Id, string? Name, bool Favourite, bool Archived)>> + IHandler, IReadOnlyCollection<(Guid Id, string? Name, string Category, bool Favourite, bool Archived)>> { - public async Task> Handle(RequestEventArgs args, + public async Task> Handle(RequestEventArgs args, CancellationToken cancellationToken) { - List<(Guid Id, string? Name, bool Favourite, bool Archived)> items = []; + List<(Guid Id, string? Name, string Category, bool Favourite, bool Archived)> items = []; if (args.Value is QueryLockerConfiguration queryConfiguration) { @@ -47,6 +47,7 @@ public class QueryLockerHandler(IDbContextFactory dbContextFactor { x.Id, x.Name, + x.Category, Favourite = x.State == 1, Archived = x.State == 2 }).ToListAsync(); @@ -54,7 +55,7 @@ public class QueryLockerHandler(IDbContextFactory dbContextFactor foreach (var result in results.OrderBy(x => x.Name, StringComparer.OrdinalIgnoreCase)) { - items.Add(new(result.Id, result.Name, result.Favourite, result.Archived)); + items.Add(new(result.Id, result.Name, result.Category, result.Favourite, result.Archived)); } }