diff --git a/Wallet.Avalonia/AllNavigationView.axaml.cs b/Wallet.Avalonia/AllNavigationView.axaml.cs index 1e7f925..cf0d3cb 100644 --- a/Wallet.Avalonia/AllNavigationView.axaml.cs +++ b/Wallet.Avalonia/AllNavigationView.axaml.cs @@ -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(); } \ No newline at end of file diff --git a/Wallet.Avalonia/App.axaml.cs b/Wallet.Avalonia/App.axaml.cs index 00e98be..cf0553d 100644 --- a/Wallet.Avalonia/App.axaml.cs +++ b/Wallet.Avalonia/App.axaml.cs @@ -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(provider => { - IEnumerable> items = - provider.GetServices>() ?? + IEnumerable> items = + provider.GetServices>().OrderBy(x => x.Name) ?? Enumerable.Empty>(); return new ItemConfigurationCollection(items.ToDictionary(x => x.Name, x => (Func)(() => x.Value))); @@ -115,6 +115,7 @@ public partial class App : Application services.AddTemplate(); services.AddTemplate(); services.AddTemplate(); + services.AddTemplate(); services.AddTemplate(); services.AddTemplate("OpenWallet"); @@ -133,7 +134,9 @@ public partial class App : Application services.AddTemplate("ItemCategoryCollection"); services.AddTemplate(); - + + services.AddHandler(); + services.AddHandler(); services.AddScoped>, DecoratorService>>(); diff --git a/Wallet.Avalonia/CategoriesNavigationView.axaml b/Wallet.Avalonia/CategoriesNavigationView.axaml index b681180..8a66282 100644 --- a/Wallet.Avalonia/CategoriesNavigationView.axaml +++ b/Wallet.Avalonia/CategoriesNavigationView.axaml @@ -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}" /> diff --git a/Wallet.Avalonia/CategoriesNavigationView.axaml.cs b/Wallet.Avalonia/CategoriesNavigationView.axaml.cs index 9a48cff..0635bf2 100644 --- a/Wallet.Avalonia/CategoriesNavigationView.axaml.cs +++ b/Wallet.Avalonia/CategoriesNavigationView.axaml.cs @@ -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(); } \ No newline at end of file diff --git a/Wallet.Avalonia/CategoryNavigationView.axaml b/Wallet.Avalonia/CategoryNavigationView.axaml new file mode 100644 index 0000000..cbc5d93 --- /dev/null +++ b/Wallet.Avalonia/CategoryNavigationView.axaml @@ -0,0 +1,7 @@ + diff --git a/Wallet.Avalonia/CategoryNavigationView.axaml.cs b/Wallet.Avalonia/CategoryNavigationView.axaml.cs new file mode 100644 index 0000000..ea7e8de --- /dev/null +++ b/Wallet.Avalonia/CategoryNavigationView.axaml.cs @@ -0,0 +1,10 @@ +using Toolkit.UI.Controls.Avalonia; + +namespace Wallet.Avalonia; + +public partial class CategoryNavigationView : + NavigationViewItem +{ + public CategoryNavigationView() => + InitializeComponent(); +} diff --git a/Wallet/AllNavigationViewModel.cs b/Wallet/AllNavigationViewModel.cs index 3877ed2..bdf6485 100644 --- a/Wallet/AllNavigationViewModel.cs +++ b/Wallet/AllNavigationViewModel.cs @@ -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); \ No newline at end of file + string filter) : FilterNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, filter); \ No newline at end of file diff --git a/Wallet/ArchiveNavigationViewModel.cs b/Wallet/ArchiveNavigationViewModel.cs index c984b9e..c97f641 100644 --- a/Wallet/ArchiveNavigationViewModel.cs +++ b/Wallet/ArchiveNavigationViewModel.cs @@ -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); \ No newline at end of file + string name) : FilterNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, name); \ No newline at end of file diff --git a/Wallet/CategoriesNavigationViewModel.cs b/Wallet/CategoriesNavigationViewModel.cs index 9490e48..7b772d3 100644 --- a/Wallet/CategoriesNavigationViewModel.cs +++ b/Wallet/CategoriesNavigationViewModel.cs @@ -2,10 +2,14 @@ namespace Wallet; +[Notification(typeof(CreateEventArgs), 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); \ No newline at end of file + string name) : FilterNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, name) +{ + +} \ No newline at end of file diff --git a/Wallet/CategoryNavigationViewModel.cs b/Wallet/CategoryNavigationViewModel.cs new file mode 100644 index 0000000..479aec3 --- /dev/null +++ b/Wallet/CategoryNavigationViewModel.cs @@ -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); \ No newline at end of file diff --git a/Wallet/FilterNavigationViewModel.cs b/Wallet/FilterNavigationViewModel.cs new file mode 100644 index 0000000..0897b18 --- /dev/null +++ b/Wallet/FilterNavigationViewModel.cs @@ -0,0 +1,80 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Toolkit.Foundation; + +namespace Wallet; + +public partial class FilterNavigationViewModel : + ObservableCollection, + IWalletNavigationViewModel, + INotificationHandler>, + INotificationHandler> +{ + [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 args) => + Task.FromResult(Activated = false); + + public Task Handle(ActivatedEventArgs args) => + Task.FromResult(Activated = true); + + [RelayCommand] + public void Invoke() => Publisher.Publish(Notify.As(new Filter(Filter)), + nameof(ItemCollectionViewModel)); +} + +public partial class FilterNavigationViewModel : + ObservableCollection, + IWalletNavigationViewModel, + INotificationHandler>, + INotificationHandler> + 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 args) => + Task.FromResult(Activated = false); + + public Task Handle(ActivatedEventArgs args) => + Task.FromResult(Activated = true); + + [RelayCommand] + public void Invoke() => Publisher.Publish(Notify.As(new Filter(Filter)), + nameof(ItemCollectionViewModel)); +} \ No newline at end of file diff --git a/Wallet/FilterWalletNavigationViewModel.cs b/Wallet/FilterWalletNavigationViewModel.cs deleted file mode 100644 index 31e9512..0000000 --- a/Wallet/FilterWalletNavigationViewModel.cs +++ /dev/null @@ -1,41 +0,0 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using CommunityToolkit.Mvvm.Input; -using Toolkit.Foundation; - -namespace Wallet; - -public partial class FilterWalletNavigationViewModel : Observable, - IWalletNavigationViewModel, - INotificationHandler>, - INotificationHandler> -{ - [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 args) => - Task.FromResult(Activated = false); - - public Task Handle(ActivatedEventArgs args) => - Task.FromResult(Activated = true); - - [RelayCommand] - public void Invoke() => Publisher.Publish(Notify.As(new Filter(Filter)), - nameof(ItemCollectionViewModel)); -} \ No newline at end of file diff --git a/Wallet/StarredNavigationViewModel.cs b/Wallet/StarredNavigationViewModel.cs index b333b64..c342159 100644 --- a/Wallet/StarredNavigationViewModel.cs +++ b/Wallet/StarredNavigationViewModel.cs @@ -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); \ No newline at end of file + string name) : FilterNavigationViewModel(provider, factory, mediator, publisher, subscriber, disposer, name); \ No newline at end of file diff --git a/Wallet/SynchronizeCategoriesNavigationViewModelHandler.cs b/Wallet/SynchronizeCategoriesNavigationViewModelHandler.cs new file mode 100644 index 0000000..1fceb0c --- /dev/null +++ b/Wallet/SynchronizeCategoriesNavigationViewModelHandler.cs @@ -0,0 +1,23 @@ +using Toolkit.Foundation; + +namespace Wallet; + +public class SynchronizeCategoriesNavigationViewModelHandler(IItemConfigurationCollection configurations, + IServiceFactory serviceFactory, + IPublisher publisher) : + INotificationHandler> +{ + public Task Handle(SynchronizeEventArgs args) + { + foreach (KeyValuePair> configuration in configurations) + { + if (serviceFactory.Create(configuration.Key) + is CategoryNavigationViewModel viewModel) + { + publisher.Publish(Create.As(viewModel), nameof(CategoriesNavigationViewModel)); + } + } + + return Task.CompletedTask; + } +} diff --git a/Wallet/WalletViewModel.cs b/Wallet/WalletViewModel.cs index 8d48267..cf79f35 100644 --- a/Wallet/WalletViewModel.cs +++ b/Wallet/WalletViewModel.cs @@ -11,6 +11,7 @@ public partial class WalletViewModel : [ObservableProperty] private string filter; + public WalletViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator,