Populate navigation caterogies

This commit is contained in:
TheXamlGuy
2024-06-09 15:36:52 +01:00
parent 3344762e6e
commit b5f125546f
15 changed files with 159 additions and 54 deletions
+4 -2
View File
@@ -2,7 +2,9 @@ using Toolkit.UI.Controls.Avalonia;
namespace Wallet.Avalonia;
public partial class AllNavigationView : NavigationViewItem
public partial class AllNavigationView :
NavigationViewItem
{
public AllNavigationView() => InitializeComponent();
public AllNavigationView() =>
InitializeComponent();
}
+7 -4
View File
@@ -37,7 +37,7 @@ public partial class App : Application
.AddConfiguration("Item:Note", ItemConfiguration.Note)
.AddConfiguration("Item:Password", ItemConfiguration.Password)
.AddConfiguration("Item:Passport", ItemConfiguration.Passport)
.AddConfiguration("Item:Api Credentials", ItemConfiguration.ApiCredentials)
.AddConfiguration("Item:API Credentials", ItemConfiguration.ApiCredentials)
.AddConfiguration("Item:Software License", ItemConfiguration.SoftwareLicense)
.AddConfiguration("Item:Crypto", ItemConfiguration.CryptoWallet)
.AddConfiguration("Item:Database", ItemConfiguration.Database)
@@ -84,8 +84,8 @@ public partial class App : Application
services.AddTransient<IItemConfigurationCollection, ItemConfigurationCollection>(provider =>
{
IEnumerable<IConfigurationDescriptor<ItemConfiguration>> items =
provider.GetServices<IConfigurationDescriptor<ItemConfiguration>>() ??
IEnumerable<IConfigurationDescriptor<ItemConfiguration>> items =
provider.GetServices<IConfigurationDescriptor<ItemConfiguration>>().OrderBy(x => x.Name) ??
Enumerable.Empty<IConfigurationDescriptor<ItemConfiguration>>();
return new ItemConfigurationCollection(items.ToDictionary(x => x.Name, x => (Func<ItemConfiguration>)(() => x.Value)));
@@ -115,6 +115,7 @@ public partial class App : Application
services.AddTemplate<AllNavigationViewModel, AllNavigationView>();
services.AddTemplate<StarredNavigationViewModel, StarredNavigationView>();
services.AddTemplate<CategoriesNavigationViewModel, CategoriesNavigationView>();
services.AddTemplate<CategoryNavigationViewModel, CategoryNavigationView>();
services.AddTemplate<ArchiveNavigationViewModel, ArchiveNavigationView>();
services.AddTemplate<OpenWalletViewModel, OpenWalletView>("OpenWallet");
@@ -133,7 +134,9 @@ public partial class App : Application
services.AddTemplate<ItemCategoryCollectionViewModel, ItemCategoryCollectionView>("ItemCategoryCollection");
services.AddTemplate<ItemCategoryNavigationViewModel, ItemCategoryNavigationView>();
services.AddHandler<SynchronizeCategoriesNavigationViewModelHandler>();
services.AddHandler<SynchronizeItemCategoryViewModelHandler>();
services.AddScoped<IDecoratorService<Item<(Guid, string)>>, DecoratorService<Item<(Guid, string)>>>();
@@ -2,4 +2,7 @@
x:Class="Wallet.Avalonia.CategoriesNavigationView"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Content="Categories" />
xmlns:vm="using:Wallet"
x:DataType="vm:CategoriesNavigationViewModel"
Content="Categories"
MenuItemsSource="{Binding}" />
@@ -2,7 +2,9 @@ using Toolkit.UI.Controls.Avalonia;
namespace Wallet.Avalonia;
public partial class CategoriesNavigationView : NavigationViewItem
public partial class CategoriesNavigationView :
NavigationViewItem
{
public CategoriesNavigationView() => InitializeComponent();
public CategoriesNavigationView() =>
InitializeComponent();
}
@@ -0,0 +1,7 @@
<NavigationViewItem
x:Class="Wallet.Avalonia.CategoryNavigationView"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:Wallet"
x:DataType="vm:CategoryNavigationViewModel"
Content="{Binding Filter}" />
@@ -0,0 +1,10 @@
using Toolkit.UI.Controls.Avalonia;
namespace Wallet.Avalonia;
public partial class CategoryNavigationView :
NavigationViewItem
{
public CategoryNavigationView() =>
InitializeComponent();
}
+1 -1
View File
@@ -8,4 +8,4 @@ public partial class AllNavigationViewModel(IServiceProvider provider,
IPublisher publisher,
ISubscription subscriber,
IDisposer disposer,
string filter) : FilterWalletNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, filter);
string filter) : FilterNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, filter);
+1 -1
View File
@@ -8,4 +8,4 @@ public partial class ArchiveNavigationViewModel(IServiceProvider provider,
IPublisher publisher,
ISubscription subscriber,
IDisposer disposer,
string name) : FilterWalletNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, name);
string name) : FilterNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, name);
+5 -1
View File
@@ -2,10 +2,14 @@
namespace Wallet;
[Notification(typeof(CreateEventArgs<CategoryNavigationViewModel>), nameof(CategoriesNavigationViewModel))]
public partial class CategoriesNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
IDisposer disposer,
string name) : FilterWalletNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, name);
string name) : FilterNavigationViewModel<CategoryNavigationViewModel>(provider, factory, mediator, publisher, subscriber, disposer, name)
{
}
+11
View File
@@ -0,0 +1,11 @@
using Toolkit.Foundation;
namespace Wallet;
public partial class CategoryNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
IDisposer disposer,
string filter) : FilterNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, filter);
+80
View File
@@ -0,0 +1,80 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Toolkit.Foundation;
namespace Wallet;
public partial class FilterNavigationViewModel :
ObservableCollection<IWalletNavigationViewModel>,
IWalletNavigationViewModel,
INotificationHandler<ActivatedEventArgs<Wallet>>,
INotificationHandler<DeactivatedEventArgs<Wallet>>
{
[ObservableProperty]
private bool activated;
[ObservableProperty]
private string? filter;
[ObservableProperty]
private bool selected;
public FilterNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
IDisposer disposer,
string? filter = null) : base(provider, factory, mediator, publisher, subscriber, disposer)
{
Filter = filter;
}
public Task Handle(DeactivatedEventArgs<Wallet> args) =>
Task.FromResult(Activated = false);
public Task Handle(ActivatedEventArgs<Wallet> args) =>
Task.FromResult(Activated = true);
[RelayCommand]
public void Invoke() => Publisher.Publish(Notify.As(new Filter(Filter)),
nameof(ItemCollectionViewModel));
}
public partial class FilterNavigationViewModel<TWalletNavigation> :
ObservableCollection<TWalletNavigation>,
IWalletNavigationViewModel,
INotificationHandler<ActivatedEventArgs<Wallet>>,
INotificationHandler<DeactivatedEventArgs<Wallet>>
where TWalletNavigation : IWalletNavigationViewModel
{
[ObservableProperty]
private bool activated;
[ObservableProperty]
private string? filter;
[ObservableProperty]
private bool selected;
public FilterNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
IDisposer disposer,
string? filter = null) : base(provider, factory, mediator, publisher, subscriber, disposer)
{
Filter = filter;
}
public Task Handle(DeactivatedEventArgs<Wallet> args) =>
Task.FromResult(Activated = false);
public Task Handle(ActivatedEventArgs<Wallet> args) =>
Task.FromResult(Activated = true);
[RelayCommand]
public void Invoke() => Publisher.Publish(Notify.As(new Filter(Filter)),
nameof(ItemCollectionViewModel));
}
-41
View File
@@ -1,41 +0,0 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Toolkit.Foundation;
namespace Wallet;
public partial class FilterWalletNavigationViewModel : Observable,
IWalletNavigationViewModel,
INotificationHandler<ActivatedEventArgs<Wallet>>,
INotificationHandler<DeactivatedEventArgs<Wallet>>
{
[ObservableProperty]
private bool activated;
[ObservableProperty]
private string? filter;
[ObservableProperty]
private bool selected;
public FilterWalletNavigationViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,
IPublisher publisher,
ISubscription subscriber,
IDisposer disposer,
string? filter = null) : base(provider, factory, mediator, publisher, subscriber, disposer)
{
Filter = filter;
}
public Task Handle(DeactivatedEventArgs<Wallet> args) =>
Task.FromResult(Activated = false);
public Task Handle(ActivatedEventArgs<Wallet> args) =>
Task.FromResult(Activated = true);
[RelayCommand]
public void Invoke() => Publisher.Publish(Notify.As(new Filter(Filter)),
nameof(ItemCollectionViewModel));
}
+1 -1
View File
@@ -8,4 +8,4 @@ public partial class StarredNavigationViewModel(IServiceProvider provider,
IPublisher publisher,
ISubscription subscriber,
IDisposer disposer,
string name) : FilterWalletNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, name);
string name) : FilterNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, name);
@@ -0,0 +1,23 @@
using Toolkit.Foundation;
namespace Wallet;
public class SynchronizeCategoriesNavigationViewModelHandler(IItemConfigurationCollection configurations,
IServiceFactory serviceFactory,
IPublisher publisher) :
INotificationHandler<SynchronizeEventArgs<CategoryNavigationViewModel>>
{
public Task Handle(SynchronizeEventArgs<CategoryNavigationViewModel> args)
{
foreach (KeyValuePair<string, Func<ItemConfiguration>> configuration in configurations)
{
if (serviceFactory.Create<CategoryNavigationViewModel>(configuration.Key)
is CategoryNavigationViewModel viewModel)
{
publisher.Publish(Create.As(viewModel), nameof(CategoriesNavigationViewModel));
}
}
return Task.CompletedTask;
}
}
+1
View File
@@ -11,6 +11,7 @@ public partial class WalletViewModel :
[ObservableProperty]
private string filter;
public WalletViewModel(IServiceProvider provider,
IServiceFactory factory,
IMediator mediator,