diff --git a/Bitvault.Avalonia/App.axaml.cs b/Bitvault.Avalonia/App.axaml.cs index df580fa..22133f2 100644 --- a/Bitvault.Avalonia/App.axaml.cs +++ b/Bitvault.Avalonia/App.axaml.cs @@ -111,11 +111,7 @@ public partial class App : Application services.AddTemplate("Locker"); services.AddTemplate("ContentItemCollection"); - services.AddSingleton>, - DecoratorService>>(); - services.AddTransient(provider => provider.GetRequiredService>>().Value!); - - services.AddHandler(); + services.AddHandler(); services.AddTemplate("LockerHeader"); services.AddTemplate(); @@ -125,7 +121,7 @@ public partial class App : Application services.AddTemplate("ItemCategoryCollection"); services.AddTemplate(); - services.AddHandler(); + services.AddHandler(); services.AddScoped>, DecoratorService>>(); @@ -137,8 +133,8 @@ public partial class App : Application services.AddTemplate(); services.AddTemplate(); - services.AddHandler(); - services.AddHandler(); + services.AddHandler(); + services.AddHandler(); services.AddTemplate(); @@ -147,10 +143,6 @@ public partial class App : Application services.AddTemplate(); services.AddTemplate(); - services.AddSingleton>, - DecoratorService>>(); - services.AddTransient(provider => provider.GetRequiredService>>().Value!); - services.AddTemplate("ItemCommandHeader"); services.AddTemplate(); @@ -186,7 +178,7 @@ public partial class App : Application services.AddInitializer(); services.AddTemplate("Main"); - services.AddHandler(); + services.AddHandler(); services.AddTransient(); diff --git a/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs b/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs deleted file mode 100644 index a360daf..0000000 --- a/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Toolkit.Foundation; - -namespace Bitvault; - -public class AggregateItemContentFromCategoryViewModelHandler(IItemConfigurationCollection configurations, - IServiceFactory serviceFactory, - 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 configurationSection in configuration.Sections) - { - string section = $"{nameof(ItemSection)}:{Guid.NewGuid}"; - if (serviceFactory.Create(section) - is ItemSectionViewModel sectionViewModel) - { - publisher.Publish(Create.As(sectionViewModel), nameof(ItemContentViewModel)); - foreach (ItemEntryConfiguration entryConfiguration in configurationSection.Entries) - { - if (await mediator.Handle(entryConfiguration, - entryConfiguration.GetType().Name) is IItemEntryViewModel entryViewModel) - { - publisher.Publish(Create.As(entryViewModel), section); - } - } - } - } - } - } - } - } -} diff --git a/Bitvault/ConfirmCreateItemHandler.cs b/Bitvault/ConfirmCreateItemHandler.cs index b8d36a9..86559dc 100644 --- a/Bitvault/ConfirmCreateItemHandler.cs +++ b/Bitvault/ConfirmCreateItemHandler.cs @@ -13,6 +13,9 @@ public class ConfirmCreateItemHandler(IMediator mediator, if (name is not null) { + IList<(int, string)> sections = await mediator.HandleMany, + (int, string)>(Confirm.As()); + IList<(int, ItemEntryConfiguration)> entries = await mediator.HandleMany, (int, ItemEntryConfiguration)>(Confirm.As()); diff --git a/Bitvault/FooterViewModel.cs b/Bitvault/FooterViewModel.cs index 4213248..c503c8c 100644 --- a/Bitvault/FooterViewModel.cs +++ b/Bitvault/FooterViewModel.cs @@ -5,13 +5,12 @@ namespace Bitvault; public partial class FooterViewModel : ObservableCollection { - public FooterViewModel(ICollectionSynchronizer synchronizer, - IServiceProvider provider, + public FooterViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, - IDisposer disposer) : base(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) + IDisposer disposer) : base(provider, factory, mediator, publisher, subscriber, disposer) { Add(); } diff --git a/Bitvault/ItemCategoryCollectionViewModel.cs b/Bitvault/ItemCategoryCollectionViewModel.cs index e0accb5..e6b975c 100644 --- a/Bitvault/ItemCategoryCollectionViewModel.cs +++ b/Bitvault/ItemCategoryCollectionViewModel.cs @@ -4,15 +4,14 @@ using Toolkit.Foundation; namespace Bitvault; [Notification(typeof(CreateEventArgs), nameof(ItemCategoryCollectionViewModel))] -public partial class ItemCategoryCollectionViewModel(ICollectionSynchronizer synchronizer, - IServiceProvider provider, +public partial class ItemCategoryCollectionViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, IContentTemplate template) : - ObservableCollection(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) + ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer) { [ObservableProperty] private IContentTemplate template = template; diff --git a/Bitvault/ItemCollectionViewModel.cs b/Bitvault/ItemCollectionViewModel.cs index 770d28d..1d7c5a8 100644 --- a/Bitvault/ItemCollectionViewModel.cs +++ b/Bitvault/ItemCollectionViewModel.cs @@ -18,8 +18,7 @@ public partial class ItemCollectionViewModel : private LockerViewModelConfiguration configuration; - public ItemCollectionViewModel(ICollectionSynchronizer synchronizer, - IServiceProvider provider, + public ItemCollectionViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, @@ -28,7 +27,7 @@ public partial class ItemCollectionViewModel : IContentTemplate template, NamedComponent named, LockerViewModelConfiguration configuration, - string? filter = null) : base(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) + string? filter = null) : base(provider, factory, mediator, publisher, subscriber, disposer) { Template = template; Named = $"{named}"; @@ -71,6 +70,6 @@ public partial class ItemCollectionViewModel : return base.OnActivated(); } - protected override AggregateExpression BuildAggregateExpression() => - new(Aggregate.As(configuration)); + protected override SynchronizeExpression BuildAggregateExpression() => + new(Synchronize.As(configuration)); } diff --git a/Bitvault/ItemCommandHeaderViewModel.cs b/Bitvault/ItemCommandHeaderViewModel.cs index 5e393bd..1391038 100644 --- a/Bitvault/ItemCommandHeaderViewModel.cs +++ b/Bitvault/ItemCommandHeaderViewModel.cs @@ -2,15 +2,14 @@ namespace Bitvault; -public partial class ItemCommandHeaderViewModel(ICollectionSynchronizer synchronizer, - IServiceProvider provider, +public partial class ItemCommandHeaderViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, IContentTemplate template) : - ObservableCollection(synchronizer, provider, factory, mediator, publisher, subscriber, disposer), + ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer), INotificationHandler> { public IContentTemplate Template { get; set; } = template; diff --git a/Bitvault/ItemContentViewModel.cs b/Bitvault/ItemContentViewModel.cs index dc43dfd..8e4e8c2 100644 --- a/Bitvault/ItemContentViewModel.cs +++ b/Bitvault/ItemContentViewModel.cs @@ -3,15 +3,14 @@ namespace Bitvault; [Notification(typeof(CreateEventArgs), nameof(ItemContentViewModel))] -public partial class ItemContentViewModel(ICollectionSynchronizer synchronizer, - IServiceProvider provider, +public partial class ItemContentViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, IContentTemplate template, ItemState state = ItemState.Read) : - ObservableCollection(synchronizer, provider, factory, mediator, publisher, subscriber, disposer), + ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer), IItemEntryViewModel, INotificationHandler>> { @@ -23,7 +22,8 @@ public partial class ItemContentViewModel(ICollectionSynchronizer synchronizer, { if (category.Value is string value) { - Fetch(() => new AggregateExpression(new AggerateEventArgs(value)), true); + Fetch(() => new SynchronizeExpression(new SynchronizeEventArgs)>((value, this))), true); } } diff --git a/Bitvault/ItemDropdownEntryViewModel.cs b/Bitvault/ItemDropdownEntryViewModel.cs index 01d82a5..b1a1bd4 100644 --- a/Bitvault/ItemDropdownEntryViewModel.cs +++ b/Bitvault/ItemDropdownEntryViewModel.cs @@ -8,7 +8,7 @@ public partial class ItemDropdownEntryViewModel(IServiceProvider provider, IPublisher publisher, ISubscription subscriber, IDisposer disposer, - ICollectionSynchronization synchronization, + ISynchronizationCollection synchronization, ItemEntryConfiguration configuration, string? key = default, string? value = default) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, synchronization, configuration, key, value); \ No newline at end of file diff --git a/Bitvault/ItemDropdownEntryViewModelHandler.cs b/Bitvault/ItemDropdownEntryViewModelHandler.cs index 5c31b9b..34e31f2 100644 --- a/Bitvault/ItemDropdownEntryViewModelHandler.cs +++ b/Bitvault/ItemDropdownEntryViewModelHandler.cs @@ -2,16 +2,19 @@ namespace Bitvault; -public class ItemDropdownEntryViewModelHandler(IServiceFactory serviceFactory) : - IHandler +public class ItemDropdownEntryViewModelHandler(IServiceFactory serviceFactory) : + IHandler, IItemEntryViewModel?> { - public Task Handle(DropdownEntryConfiguration args, + public Task Handle(CreateEventArgs args, CancellationToken cancellationToken) { - if (serviceFactory.Create(args, args.Label, args.Value ?? "") - is ItemDropdownEntryViewModel viewModel) + if (args.Value is DropdownEntryConfiguration configuration) { - return Task.FromResult(viewModel); + if (serviceFactory.Create([.. args.Parameters, configuration, configuration.Label, configuration.Value ?? ""]) + is ItemDropdownEntryViewModel viewModel) + { + return Task.FromResult(viewModel); + } } return Task.FromResult(default); diff --git a/Bitvault/ItemEntryConfiguration.cs b/Bitvault/ItemEntryConfiguration.cs index 9c86efc..fae44f6 100644 --- a/Bitvault/ItemEntryConfiguration.cs +++ b/Bitvault/ItemEntryConfiguration.cs @@ -2,13 +2,20 @@ namespace Bitvault; +public interface IItemEntryConfiguration +{ + string? Label { get; set; } + + object? Value { get; set; } +} + [JsonDerivedType(typeof(DropdownEntryConfiguration), typeDiscriminator: "Dropdown")] [JsonDerivedType(typeof(MaskedTextEntryConfiguration), typeDiscriminator: "MaskedText")] [JsonDerivedType(typeof(NoteEntryConfiguration), typeDiscriminator: "Note")] [JsonDerivedType(typeof(NumberEntryConfiguration), typeDiscriminator: "Number")] [JsonDerivedType(typeof(PasswordEntryConfiguration), typeDiscriminator: "Password")] [JsonDerivedType(typeof(TextEntryConfiguration), typeDiscriminator: "Text")] -public record ItemEntryConfiguration +public record ItemEntryConfiguration : IItemEntryConfiguration { [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? Label { get; set; } diff --git a/Bitvault/ItemEntryViewModel.cs b/Bitvault/ItemEntryViewModel.cs index 0d5bb97..f8ad9cd 100644 --- a/Bitvault/ItemEntryViewModel.cs +++ b/Bitvault/ItemEntryViewModel.cs @@ -1,5 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; -using Toolkit.Foundation; +using Toolkit.Foundation; namespace Bitvault; @@ -9,7 +8,7 @@ public partial class ItemEntryViewModel(IServiceProvider provider, IPublisher publisher, ISubscription subscriber, IDisposer disposer, - ICollectionSynchronization synchronization, + ISynchronizationCollection synchronization, ItemEntryConfiguration configuration, TKey? key = default, TValue? value = default) : @@ -21,9 +20,5 @@ public partial class ItemEntryViewModel(IServiceProvider provider, public int Index => synchronization.IndexOf(this); public Task<(int, ItemEntryConfiguration)> Handle(ConfirmEventArgs args, - CancellationToken cancellationToken) - { - var doo = Provider.GetRequiredService>(); - return Task.FromResult((Index, configuration with { Value = Value })); - } + CancellationToken cancellationToken) => Task.FromResult((Index, configuration with { Value = Value })); } diff --git a/Bitvault/ItemMaskedTextEntryViewModel.cs b/Bitvault/ItemMaskedTextEntryViewModel.cs index 8b56b79..76e1463 100644 --- a/Bitvault/ItemMaskedTextEntryViewModel.cs +++ b/Bitvault/ItemMaskedTextEntryViewModel.cs @@ -8,7 +8,7 @@ public partial class ItemMaskedTextEntryViewModel(IServiceProvider provider, IPublisher publisher, ISubscription subscriber, IDisposer disposer, - ICollectionSynchronization synchronization, + ISynchronizationCollection synchronization, ItemEntryConfiguration configuration, string? key = default, string? value = default) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, synchronization, configuration, key, value); \ No newline at end of file diff --git a/Bitvault/ItemMaskedTextEntryViewModelHandler.cs b/Bitvault/ItemMaskedTextEntryViewModelHandler.cs index c99c85a..a85104e 100644 --- a/Bitvault/ItemMaskedTextEntryViewModelHandler.cs +++ b/Bitvault/ItemMaskedTextEntryViewModelHandler.cs @@ -2,16 +2,19 @@ namespace Bitvault; -public class ItemMaskedTextEntryViewModelHandler(IServiceFactory serviceFactory) : - IHandler +public class ItemMaskedTextEntryViewModelHandler(IServiceFactory serviceFactory) : + IHandler, IItemEntryViewModel?> { - public Task Handle(MaskedTextEntryConfiguration args, + public Task Handle(CreateEventArgs args, CancellationToken cancellationToken) { - if (serviceFactory.Create(args, args.Label, args.Value ?? "") is - ItemMaskedTextEntryViewModel viewModel) + if (args.Value is MaskedTextEntryConfiguration configuration) { - return Task.FromResult(viewModel); + if (serviceFactory.Create([.. args.Parameters, configuration, configuration.Label, configuration.Value ?? ""]) + is ItemMaskedTextEntryViewModel viewModel) + { + return Task.FromResult(viewModel); + } } return Task.FromResult(default); diff --git a/Bitvault/ItemNavigationViewModel.cs b/Bitvault/ItemNavigationViewModel.cs index 10e4996..2443fd6 100644 --- a/Bitvault/ItemNavigationViewModel.cs +++ b/Bitvault/ItemNavigationViewModel.cs @@ -10,7 +10,6 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, ISubscription subscriber, IDisposer disposer, IContentTemplate template, - ICollectionSynchronization synchronization, NamedComponent named, Guid id, string name = "", @@ -26,7 +25,6 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, INotificationHandler>, INotificationHandler>>, ISelectable, - IIndexable, IRemovable { [ObservableProperty] @@ -53,8 +51,6 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, [ObservableProperty] private bool selected = selected; - public int Index => synchronization.IndexOf(this); - public IContentTemplate Template { get; set; } = template; public Task Handle(ArchiveEventArgs args) => diff --git a/Bitvault/ItemPasswordEntryViewModel.cs b/Bitvault/ItemPasswordEntryViewModel.cs index 3854a47..9eda6e1 100644 --- a/Bitvault/ItemPasswordEntryViewModel.cs +++ b/Bitvault/ItemPasswordEntryViewModel.cs @@ -8,7 +8,7 @@ public partial class ItemPasswordEntryViewModel(IServiceProvider provider, IPublisher publisher, ISubscription subscriber, IDisposer disposer, - ICollectionSynchronization synchronization, + ISynchronizationCollection synchronization, ItemEntryConfiguration configuration, string? key = default, string? value = default) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, synchronization, configuration, key, value); \ No newline at end of file diff --git a/Bitvault/ItemPasswordEntryViewModelHandler.cs b/Bitvault/ItemPasswordEntryViewModelHandler.cs index 9c98a56..fe8da09 100644 --- a/Bitvault/ItemPasswordEntryViewModelHandler.cs +++ b/Bitvault/ItemPasswordEntryViewModelHandler.cs @@ -3,15 +3,18 @@ namespace Bitvault; public class ItemPasswordEntryViewModelHandler(IServiceFactory serviceFactory) : - IHandler + IHandler, IItemEntryViewModel?> { - public Task Handle(PasswordEntryConfiguration args, + public Task Handle(CreateEventArgs args, CancellationToken cancellationToken) { - if (serviceFactory.Create(args, args.Label, args.Value ?? "") - is ItemPasswordEntryViewModel viewModel) + if (args.Value is PasswordEntryConfiguration configuration) { - return Task.FromResult(viewModel); + if (serviceFactory.Create([.. args.Parameters, configuration, configuration.Label, configuration.Value ?? ""]) + is ItemPasswordEntryViewModel viewModel) + { + return Task.FromResult(viewModel); + } } return Task.FromResult(default); diff --git a/Bitvault/ItemSectionViewModel.cs b/Bitvault/ItemSectionViewModel.cs index ecdbc4b..da91471 100644 --- a/Bitvault/ItemSectionViewModel.cs +++ b/Bitvault/ItemSectionViewModel.cs @@ -4,18 +4,25 @@ using Toolkit.Foundation; namespace Bitvault; [Notification(typeof(CreateEventArgs), nameof(Section))] -public partial class ItemSectionViewModel(ICollectionSynchronizer synchronizer, - IServiceProvider provider, +public partial class ItemSectionViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, IContentTemplate template, - string section) : ObservableCollection(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) + ISynchronizationCollection synchronization, + string section) : ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer), + IHandler, (int, string)>, + IIndexable { [ObservableProperty] private string section = section; public IContentTemplate Template { get; set; } = template; + + public int Index => synchronization.IndexOf(this); + + public Task<(int, string)> Handle(ConfirmEventArgs args, + CancellationToken cancellationToken) => Task.FromResult((0, Section)); } diff --git a/Bitvault/ItemTextEntryViewModel.cs b/Bitvault/ItemTextEntryViewModel.cs index 35f0f1c..ebe522c 100644 --- a/Bitvault/ItemTextEntryViewModel.cs +++ b/Bitvault/ItemTextEntryViewModel.cs @@ -8,7 +8,7 @@ public partial class ItemTextEntryViewModel(IServiceProvider provider, IPublisher publisher, ISubscription subscriber, IDisposer disposer, - ICollectionSynchronization synchronization, + ISynchronizationCollection synchronization, ItemEntryConfiguration configuration, string? key = default, string? value = default) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, synchronization, configuration, key, value); \ No newline at end of file diff --git a/Bitvault/ItemTextEntryViewModelHandler.cs b/Bitvault/ItemTextEntryViewModelHandler.cs index 6c3b893..4d30ba0 100644 --- a/Bitvault/ItemTextEntryViewModelHandler.cs +++ b/Bitvault/ItemTextEntryViewModelHandler.cs @@ -3,15 +3,18 @@ namespace Bitvault; public class ItemTextEntryViewModelHandler(IServiceFactory serviceFactory) : - IHandler + IHandler, IItemEntryViewModel?> { - public Task Handle(TextEntryConfiguration args, + public Task Handle(CreateEventArgs args, CancellationToken cancellationToken) { - if (serviceFactory.Create(args, args.Label, args.Value ?? "") - is ItemTextEntryViewModel viewModel) + if (args.Value is TextEntryConfiguration configuration) { - return Task.FromResult(viewModel); + if (serviceFactory.Create([.. args.Parameters, configuration, configuration.Label, configuration.Value ?? ""]) + is ItemTextEntryViewModel viewModel) + { + return Task.FromResult(viewModel); + } } return Task.FromResult(default); diff --git a/Bitvault/ItemViewModel.cs b/Bitvault/ItemViewModel.cs index ff9e45b..ee1a23c 100644 --- a/Bitvault/ItemViewModel.cs +++ b/Bitvault/ItemViewModel.cs @@ -29,8 +29,7 @@ public partial class ItemViewModel : [ObservableProperty] private bool fromCategory; - public ItemViewModel(ICollectionSynchronizer synchronizer, - IServiceProvider provider, + public ItemViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, @@ -42,7 +41,7 @@ public partial class ItemViewModel : bool fromCategory = false, string name = "", bool favourite = false, - bool archived = false) : base(synchronizer,provider, factory, mediator, publisher, subscriber, disposer) + bool archived = false) : base(provider, factory, mediator, publisher, subscriber, disposer) { Template = template; Named = $"{named}"; diff --git a/Bitvault/LockerHeaderViewModel.cs b/Bitvault/LockerHeaderViewModel.cs index 5d6e64a..085bf49 100644 --- a/Bitvault/LockerHeaderViewModel.cs +++ b/Bitvault/LockerHeaderViewModel.cs @@ -2,15 +2,14 @@ namespace Bitvault; -public partial class LockerHeaderViewModel(ICollectionSynchronizer synchronizer, - IServiceProvider provider, +public partial class LockerHeaderViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, IContentTemplate template) : - ObservableCollection(synchronizer, provider, factory, mediator, publisher, subscriber, disposer), + ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer), INotificationHandler> { public IContentTemplate Template { get; set; } = template; diff --git a/Bitvault/LockerNavigationViewModel.cs b/Bitvault/LockerNavigationViewModel.cs index e5f7bf8..bb19ce8 100644 --- a/Bitvault/LockerNavigationViewModel.cs +++ b/Bitvault/LockerNavigationViewModel.cs @@ -27,8 +27,7 @@ public partial class LockerNavigationViewModel : [ObservableProperty] private bool selected; - public LockerNavigationViewModel(ICollectionSynchronizer synchronizer, - IServiceProvider provider, + public LockerNavigationViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, @@ -36,7 +35,7 @@ public partial class LockerNavigationViewModel : IDisposer disposer, IContentTemplate template, string name, - bool selected) : base(synchronizer,provider, factory, mediator, publisher, subscriber, disposer) + bool selected) : base(provider, factory, mediator, publisher, subscriber, disposer) { Template = template; Name = name; diff --git a/Bitvault/MainViewModel.cs b/Bitvault/MainViewModel.cs index 1e804f7..9b5fab2 100644 --- a/Bitvault/MainViewModel.cs +++ b/Bitvault/MainViewModel.cs @@ -11,15 +11,14 @@ public partial class MainViewModel : [ObservableProperty] private FooterViewModel footer; - public MainViewModel(ICollectionSynchronizer synchronizer, - IServiceProvider provider, + public MainViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, IContentTemplate template, - FooterViewModel footer) : base(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) + FooterViewModel footer) : base(provider, factory, mediator, publisher, subscriber, disposer) { Template = template; Footer = footer; diff --git a/Bitvault/ManageViewModel.cs b/Bitvault/ManageViewModel.cs index 46128d8..3559420 100644 --- a/Bitvault/ManageViewModel.cs +++ b/Bitvault/ManageViewModel.cs @@ -6,14 +6,13 @@ public partial class ManageViewModel : ObservableCollection, IMainNavigationViewModel { - public ManageViewModel(ICollectionSynchronizer synchronizer, - IServiceProvider provider, + public ManageViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, - IContentTemplate template) : base(synchronizer,provider, factory, mediator, publisher, subscriber, disposer) + IContentTemplate template) : base(provider, factory, mediator, publisher, subscriber, disposer) { Template = template; diff --git a/Bitvault/AggregateItemCategoryViewModelHandler.cs b/Bitvault/SynchronizeItemCategoryViewModelHandler.cs similarity index 70% rename from Bitvault/AggregateItemCategoryViewModelHandler.cs rename to Bitvault/SynchronizeItemCategoryViewModelHandler.cs index 90c3137..b07f2e3 100644 --- a/Bitvault/AggregateItemCategoryViewModelHandler.cs +++ b/Bitvault/SynchronizeItemCategoryViewModelHandler.cs @@ -2,12 +2,12 @@ namespace Bitvault; -public class AggregateItemCategoryViewModelHandler(IItemConfigurationCollection configurations, +public class SynchronizeItemCategoryViewModelHandler(IItemConfigurationCollection configurations, IServiceFactory serviceFactory, IPublisher publisher) : - INotificationHandler> + INotificationHandler> { - public Task Handle(AggerateEventArgs args) + public Task Handle(SynchronizeEventArgs args) { bool selected = true; foreach (KeyValuePair> configuration in configurations) diff --git a/Bitvault/SynchronizeItemContentFromCategoryViewModelHandler.cs b/Bitvault/SynchronizeItemContentFromCategoryViewModelHandler.cs new file mode 100644 index 0000000..3ef3b89 --- /dev/null +++ b/Bitvault/SynchronizeItemContentFromCategoryViewModelHandler.cs @@ -0,0 +1,46 @@ +using System.Reflection; +using Toolkit.Foundation; + +namespace Bitvault; + +public class SynchronizeItemContentFromCategoryViewModelHandler(IItemConfigurationCollection configurations, + IServiceFactory serviceFactory, + IMediator mediator, + IPublisher publisher) : + INotificationHandler)>> +{ + public async Task Handle(SynchronizeEventArgs)> args) + { + (string category, ISynchronizationCollection synchronization) = args.Value; + if (configurations.TryGetValue(category, out Func? factory)) + { + if (factory.Invoke() is ItemConfiguration configuration) + { + foreach (ItemSectionConfiguration configurationSection in configuration.Sections) + { + string section = $"{nameof(ItemSection)}:{Guid.NewGuid()}"; + if (serviceFactory.Create(synchronization, section) + is ItemSectionViewModel sectionViewModel) + { + publisher.Publish(Create.As(sectionViewModel), nameof(ItemContentViewModel)); + foreach (IItemEntryConfiguration entryConfiguration in configurationSection.Entries) + { + Type messageType = typeof(CreateEventArgs<>).MakeGenericType(entryConfiguration.GetType()); + ConstructorInfo? constructor = messageType.GetConstructor([entryConfiguration.GetType(), typeof(object[])]); + + if (constructor?.Invoke(new object[] { entryConfiguration, new object[] { sectionViewModel } }) is object message) + { + if (await mediator.Handle(message, entryConfiguration.GetType().Name) is IItemEntryViewModel entryViewModel) + { + publisher.Publish(Create.As(entryViewModel), section); + } + } + } + } + } + } + } + + } +} diff --git a/Bitvault/AggregateItemContentViewModelHandler.cs b/Bitvault/SynchronizeItemContentViewModelHandler.cs similarity index 62% rename from Bitvault/AggregateItemContentViewModelHandler.cs rename to Bitvault/SynchronizeItemContentViewModelHandler.cs index a45cff9..1030faf 100644 --- a/Bitvault/AggregateItemContentViewModelHandler.cs +++ b/Bitvault/SynchronizeItemContentViewModelHandler.cs @@ -2,12 +2,12 @@ namespace Bitvault; -public class AggregateItemContentViewModelHandler(IMediator mediator, +public class SynchronizeItemContentViewModelHandler(IMediator mediator, IServiceFactory serviceFactory, IPublisher publisher) : - INotificationHandler> + INotificationHandler> { - public Task Handle(AggerateEventArgs args) + public Task Handle(SynchronizeEventArgs args) { //wModel>(false) is ItemHeaderViewModel viewModel) //{ diff --git a/Bitvault/AggregateItemViewModelHandler.cs b/Bitvault/SynchronizeItemViewModelHandler.cs similarity index 86% rename from Bitvault/AggregateItemViewModelHandler.cs rename to Bitvault/SynchronizeItemViewModelHandler.cs index 5f2d629..cb342de 100644 --- a/Bitvault/AggregateItemViewModelHandler.cs +++ b/Bitvault/SynchronizeItemViewModelHandler.cs @@ -3,15 +3,13 @@ using Toolkit.Foundation; namespace Bitvault; -public class AggerateItemViewModelHandler(IMediator mediator, +public class SynchronizeItemViewModelHandler(IMediator mediator, IServiceProvider serviceProvider, ICache> cache, - IPublisher publisher, - LockerViewModelConfiguration dd) : - INotificationHandler> + IPublisher publisher) : + INotificationHandler> { - public async Task Handle(AggerateEventArgs args) { if (args.Value is LockerViewModelConfiguration configuration) diff --git a/Bitvault/AggregateMainViewModelHandler.cs b/Bitvault/SynchronizeMainViewModelHandler.cs similarity index 70% rename from Bitvault/AggregateMainViewModelHandler.cs rename to Bitvault/SynchronizeMainViewModelHandler.cs index 6579093..37ca7ff 100644 --- a/Bitvault/AggregateMainViewModelHandler.cs +++ b/Bitvault/SynchronizeMainViewModelHandler.cs @@ -3,21 +3,23 @@ using Toolkit.Foundation; namespace Bitvault; -public class AggregateMainViewModelHandler(IPublisher publisher, +public class SynchronizeMainViewModelHandler(IPublisher publisher, ILockerHostCollection lockers) : - INotificationHandler> + INotificationHandler> { - public Task Handle(AggerateEventArgs args) + public Task Handle(SynchronizeEventArgs args) { bool selected = true; foreach (IComponentHost locker in lockers.OrderBy(x => x.Services.GetRequiredService>() is IConfigurationDescriptor descriptor ? descriptor.Name : null)) { - if (locker.Services.GetRequiredService>() is IConfigurationDescriptor descriptor) + if (locker.Services.GetRequiredService>() + is IConfigurationDescriptor descriptor) { if (locker.Services.GetRequiredService() is IServiceFactory factory) { - if (factory.Create(descriptor.Name, selected) is LockerNavigationViewModel viewModel) + if (factory.Create(descriptor.Name, selected) + is LockerNavigationViewModel viewModel) { publisher.Publish(Create.As(viewModel), nameof(MainViewModel));