This commit is contained in:
TheXamlGuy
2024-06-05 19:18:17 +01:00
parent 83c2ba7449
commit 8995982607
30 changed files with 154 additions and 145 deletions
+5 -13
View File
@@ -111,11 +111,7 @@ public partial class App : Application
services.AddTemplate<LockerViewModel, LockerView>("Locker"); services.AddTemplate<LockerViewModel, LockerView>("Locker");
services.AddTemplate<ItemCollectionViewModel, ItemCollectionView>("ContentItemCollection"); services.AddTemplate<ItemCollectionViewModel, ItemCollectionView>("ContentItemCollection");
services.AddSingleton<IDecoratorService<ICollectionSynchronization<ItemNavigationViewModel>>, services.AddHandler<SynchronizeItemViewModelHandler>();
DecoratorService<ICollectionSynchronization<ItemNavigationViewModel>>>();
services.AddTransient(provider => provider.GetRequiredService<IDecoratorService<ICollectionSynchronization<ItemNavigationViewModel>>>().Value!);
services.AddHandler<AggerateItemViewModelHandler>();
services.AddTemplate<LockerHeaderViewModel, LockerHeaderView>("LockerHeader"); services.AddTemplate<LockerHeaderViewModel, LockerHeaderView>("LockerHeader");
services.AddTemplate<BackActionViewModel, BackActionView>(); services.AddTemplate<BackActionViewModel, BackActionView>();
@@ -125,7 +121,7 @@ public partial class App : Application
services.AddTemplate<ItemCategoryCollectionViewModel, ItemCategoryCollectionView>("ItemCategoryCollection"); services.AddTemplate<ItemCategoryCollectionViewModel, ItemCategoryCollectionView>("ItemCategoryCollection");
services.AddTemplate<ItemCategoryNavigationViewModel, ItemCategoryNavigationView>(); services.AddTemplate<ItemCategoryNavigationViewModel, ItemCategoryNavigationView>();
services.AddHandler<AggregateItemCategoryViewModelHandler>(); services.AddHandler<SynchronizeItemCategoryViewModelHandler>();
services.AddScoped<IDecoratorService<Item<(Guid, string)>>, DecoratorService<Item<(Guid, string)>>>(); services.AddScoped<IDecoratorService<Item<(Guid, string)>>, DecoratorService<Item<(Guid, string)>>>();
@@ -137,8 +133,8 @@ public partial class App : Application
services.AddTemplate<ItemHeaderViewModel, ItemHeaderView>(); services.AddTemplate<ItemHeaderViewModel, ItemHeaderView>();
services.AddTemplate<ItemContentViewModel, ItemContentView>(); services.AddTemplate<ItemContentViewModel, ItemContentView>();
services.AddHandler<AggregateItemContentViewModelHandler>(); services.AddHandler<SynchronizeItemContentViewModelHandler>();
services.AddHandler<AggregateItemContentFromCategoryViewModelHandler>(); services.AddHandler<SynchronizeItemContentFromCategoryViewModelHandler>();
services.AddTemplate<ItemSectionViewModel, ItemSectionView>(); services.AddTemplate<ItemSectionViewModel, ItemSectionView>();
@@ -147,10 +143,6 @@ public partial class App : Application
services.AddTemplate<ItemMaskedTextEntryViewModel, ItemMaskedTextEntryView>(); services.AddTemplate<ItemMaskedTextEntryViewModel, ItemMaskedTextEntryView>();
services.AddTemplate<ItemDropdownEntryViewModel, ItemDropdownEntryView>(); services.AddTemplate<ItemDropdownEntryViewModel, ItemDropdownEntryView>();
services.AddSingleton<IDecoratorService<ICollectionSynchronization<IItemEntryViewModel>>,
DecoratorService<ICollectionSynchronization<IItemEntryViewModel>>>();
services.AddTransient(provider => provider.GetRequiredService<IDecoratorService<ICollectionSynchronization<IItemEntryViewModel>>>().Value!);
services.AddTemplate<ItemCommandHeaderViewModel, ItemCommandHeaderView>("ItemCommandHeader"); services.AddTemplate<ItemCommandHeaderViewModel, ItemCommandHeaderView>("ItemCommandHeader");
services.AddTemplate<FavouriteItemActionViewModel, FavouriteItemActionView>(); services.AddTemplate<FavouriteItemActionViewModel, FavouriteItemActionView>();
@@ -186,7 +178,7 @@ public partial class App : Application
services.AddInitializer<LockerInitializer>(); services.AddInitializer<LockerInitializer>();
services.AddTemplate<MainViewModel, MainView>("Main"); services.AddTemplate<MainViewModel, MainView>("Main");
services.AddHandler<AggregateMainViewModelHandler>(); services.AddHandler<SynchronizeMainViewModelHandler>();
services.AddTransient<FooterViewModel>(); services.AddTransient<FooterViewModel>();
@@ -1,40 +0,0 @@
using Toolkit.Foundation;
namespace Bitvault;
public class AggregateItemContentFromCategoryViewModelHandler(IItemConfigurationCollection configurations,
IServiceFactory serviceFactory,
IMediator mediator,
IPublisher publisher) :
INotificationHandler<AggerateEventArgs<IItemEntryViewModel, string>>
{
public async Task Handle(AggerateEventArgs<IItemEntryViewModel, string> args)
{
if (args.Value is string category)
{
if (configurations.TryGetValue(category, out Func<ItemConfiguration>? factory))
{
if (factory.Invoke() is ItemConfiguration configuration)
{
foreach (ItemSectionConfiguration configurationSection in configuration.Sections)
{
string section = $"{nameof(ItemSection)}:{Guid.NewGuid}";
if (serviceFactory.Create<ItemSectionViewModel>(section)
is ItemSectionViewModel sectionViewModel)
{
publisher.Publish(Create.As(sectionViewModel), nameof(ItemContentViewModel));
foreach (ItemEntryConfiguration entryConfiguration in configurationSection.Entries)
{
if (await mediator.Handle<ItemEntryConfiguration, IItemEntryViewModel?>(entryConfiguration,
entryConfiguration.GetType().Name) is IItemEntryViewModel entryViewModel)
{
publisher.Publish(Create.As(entryViewModel), section);
}
}
}
}
}
}
}
}
}
+3
View File
@@ -13,6 +13,9 @@ public class ConfirmCreateItemHandler(IMediator mediator,
if (name is not null) if (name is not null)
{ {
IList<(int, string)> sections = await mediator.HandleMany<ConfirmEventArgs<ItemSection>,
(int, string)>(Confirm.As<ItemSection>());
IList<(int, ItemEntryConfiguration)> entries = await mediator.HandleMany<ConfirmEventArgs<ItemContentEntry>, IList<(int, ItemEntryConfiguration)> entries = await mediator.HandleMany<ConfirmEventArgs<ItemContentEntry>,
(int, ItemEntryConfiguration)>(Confirm.As<ItemContentEntry>()); (int, ItemEntryConfiguration)>(Confirm.As<ItemContentEntry>());
+2 -3
View File
@@ -5,13 +5,12 @@ namespace Bitvault;
public partial class FooterViewModel : public partial class FooterViewModel :
ObservableCollection<IMainNavigationViewModel> ObservableCollection<IMainNavigationViewModel>
{ {
public FooterViewModel(ICollectionSynchronizer synchronizer, public FooterViewModel(IServiceProvider provider,
IServiceProvider provider,
IServiceFactory factory, IServiceFactory factory,
IMediator mediator, IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer) : base(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) IDisposer disposer) : base(provider, factory, mediator, publisher, subscriber, disposer)
{ {
Add<ManageNavigationViewModel>(); Add<ManageNavigationViewModel>();
} }
+2 -3
View File
@@ -4,15 +4,14 @@ using Toolkit.Foundation;
namespace Bitvault; namespace Bitvault;
[Notification(typeof(CreateEventArgs<ItemCategoryNavigationViewModel>), nameof(ItemCategoryCollectionViewModel))] [Notification(typeof(CreateEventArgs<ItemCategoryNavigationViewModel>), nameof(ItemCategoryCollectionViewModel))]
public partial class ItemCategoryCollectionViewModel(ICollectionSynchronizer synchronizer, public partial class ItemCategoryCollectionViewModel(IServiceProvider provider,
IServiceProvider provider,
IServiceFactory factory, IServiceFactory factory,
IMediator mediator, IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
IContentTemplate template) : IContentTemplate template) :
ObservableCollection<ItemCategoryNavigationViewModel>(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) ObservableCollection<ItemCategoryNavigationViewModel>(provider, factory, mediator, publisher, subscriber, disposer)
{ {
[ObservableProperty] [ObservableProperty]
private IContentTemplate template = template; private IContentTemplate template = template;
+4 -5
View File
@@ -18,8 +18,7 @@ public partial class ItemCollectionViewModel :
private LockerViewModelConfiguration configuration; private LockerViewModelConfiguration configuration;
public ItemCollectionViewModel(ICollectionSynchronizer synchronizer, public ItemCollectionViewModel(IServiceProvider provider,
IServiceProvider provider,
IServiceFactory factory, IServiceFactory factory,
IMediator mediator, IMediator mediator,
IPublisher publisher, IPublisher publisher,
@@ -28,7 +27,7 @@ public partial class ItemCollectionViewModel :
IContentTemplate template, IContentTemplate template,
NamedComponent named, NamedComponent named,
LockerViewModelConfiguration configuration, 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; Template = template;
Named = $"{named}"; Named = $"{named}";
@@ -71,6 +70,6 @@ public partial class ItemCollectionViewModel :
return base.OnActivated(); return base.OnActivated();
} }
protected override AggregateExpression BuildAggregateExpression() => protected override SynchronizeExpression BuildAggregateExpression() =>
new(Aggregate.As<ItemNavigationViewModel, LockerViewModelConfiguration>(configuration)); new(Synchronize.As<ItemNavigationViewModel, LockerViewModelConfiguration>(configuration));
} }
+2 -3
View File
@@ -2,15 +2,14 @@
namespace Bitvault; namespace Bitvault;
public partial class ItemCommandHeaderViewModel(ICollectionSynchronizer synchronizer, public partial class ItemCommandHeaderViewModel(IServiceProvider provider,
IServiceProvider provider,
IServiceFactory factory, IServiceFactory factory,
IMediator mediator, IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
IContentTemplate template) : IContentTemplate template) :
ObservableCollection(synchronizer, provider, factory, mediator, publisher, subscriber, disposer), ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer),
INotificationHandler<NotifyEventArgs<ItemCommandHeaderCollection>> INotificationHandler<NotifyEventArgs<ItemCommandHeaderCollection>>
{ {
public IContentTemplate Template { get; set; } = template; public IContentTemplate Template { get; set; } = template;
+4 -4
View File
@@ -3,15 +3,14 @@
namespace Bitvault; namespace Bitvault;
[Notification(typeof(CreateEventArgs<ItemSectionViewModel>), nameof(ItemContentViewModel))] [Notification(typeof(CreateEventArgs<ItemSectionViewModel>), nameof(ItemContentViewModel))]
public partial class ItemContentViewModel(ICollectionSynchronizer synchronizer, public partial class ItemContentViewModel(IServiceProvider provider,
IServiceProvider provider,
IServiceFactory factory, IMediator mediator, IServiceFactory factory, IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
IContentTemplate template, IContentTemplate template,
ItemState state = ItemState.Read) : ItemState state = ItemState.Read) :
ObservableCollection<ItemSectionViewModel>(synchronizer, provider, factory, mediator, publisher, subscriber, disposer), ObservableCollection<ItemSectionViewModel>(provider, factory, mediator, publisher, subscriber, disposer),
IItemEntryViewModel, IItemEntryViewModel,
INotificationHandler<NotifyEventArgs<ItemCategory<string>>> INotificationHandler<NotifyEventArgs<ItemCategory<string>>>
{ {
@@ -23,7 +22,8 @@ public partial class ItemContentViewModel(ICollectionSynchronizer synchronizer,
{ {
if (category.Value is string value) if (category.Value is string value)
{ {
Fetch(() => new AggregateExpression(new AggerateEventArgs<IItemEntryViewModel, string>(value)), true); Fetch(() => new SynchronizeExpression(new SynchronizeEventArgs<IItemEntryViewModel,
(string, ISynchronizationCollection<ItemSectionViewModel>)>((value, this))), true);
} }
} }
+1 -1
View File
@@ -8,7 +8,7 @@ public partial class ItemDropdownEntryViewModel(IServiceProvider provider,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
ICollectionSynchronization<IItemEntryViewModel> synchronization, ISynchronizationCollection<IItemEntryViewModel> synchronization,
ItemEntryConfiguration configuration, ItemEntryConfiguration configuration,
string? key = default, string? key = default,
string? value = default) : ItemEntryViewModel<string, string?>(provider, factory, mediator, publisher, subscriber, disposer, synchronization, configuration, key, value); string? value = default) : ItemEntryViewModel<string, string?>(provider, factory, mediator, publisher, subscriber, disposer, synchronization, configuration, key, value);
@@ -3,15 +3,18 @@
namespace Bitvault; namespace Bitvault;
public class ItemDropdownEntryViewModelHandler(IServiceFactory serviceFactory) : public class ItemDropdownEntryViewModelHandler(IServiceFactory serviceFactory) :
IHandler<DropdownEntryConfiguration, IItemEntryViewModel?> IHandler<CreateEventArgs<DropdownEntryConfiguration>, IItemEntryViewModel?>
{ {
public Task<IItemEntryViewModel?> Handle(DropdownEntryConfiguration args, public Task<IItemEntryViewModel?> Handle(CreateEventArgs<DropdownEntryConfiguration> args,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
if (serviceFactory.Create<ItemDropdownEntryViewModel>(args, args.Label, args.Value ?? "") if (args.Value is DropdownEntryConfiguration configuration)
is ItemDropdownEntryViewModel viewModel)
{ {
return Task.FromResult<IItemEntryViewModel?>(viewModel); if (serviceFactory.Create<ItemDropdownEntryViewModel>([.. args.Parameters, configuration, configuration.Label, configuration.Value ?? ""])
is ItemDropdownEntryViewModel viewModel)
{
return Task.FromResult<IItemEntryViewModel?>(viewModel);
}
} }
return Task.FromResult<IItemEntryViewModel?>(default); return Task.FromResult<IItemEntryViewModel?>(default);
+8 -1
View File
@@ -2,13 +2,20 @@
namespace Bitvault; namespace Bitvault;
public interface IItemEntryConfiguration
{
string? Label { get; set; }
object? Value { get; set; }
}
[JsonDerivedType(typeof(DropdownEntryConfiguration), typeDiscriminator: "Dropdown")] [JsonDerivedType(typeof(DropdownEntryConfiguration), typeDiscriminator: "Dropdown")]
[JsonDerivedType(typeof(MaskedTextEntryConfiguration), typeDiscriminator: "MaskedText")] [JsonDerivedType(typeof(MaskedTextEntryConfiguration), typeDiscriminator: "MaskedText")]
[JsonDerivedType(typeof(NoteEntryConfiguration), typeDiscriminator: "Note")] [JsonDerivedType(typeof(NoteEntryConfiguration), typeDiscriminator: "Note")]
[JsonDerivedType(typeof(NumberEntryConfiguration), typeDiscriminator: "Number")] [JsonDerivedType(typeof(NumberEntryConfiguration), typeDiscriminator: "Number")]
[JsonDerivedType(typeof(PasswordEntryConfiguration), typeDiscriminator: "Password")] [JsonDerivedType(typeof(PasswordEntryConfiguration), typeDiscriminator: "Password")]
[JsonDerivedType(typeof(TextEntryConfiguration), typeDiscriminator: "Text")] [JsonDerivedType(typeof(TextEntryConfiguration), typeDiscriminator: "Text")]
public record ItemEntryConfiguration public record ItemEntryConfiguration : IItemEntryConfiguration
{ {
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string? Label { get; set; } public string? Label { get; set; }
+3 -8
View File
@@ -1,5 +1,4 @@
using Microsoft.Extensions.DependencyInjection; using Toolkit.Foundation;
using Toolkit.Foundation;
namespace Bitvault; namespace Bitvault;
@@ -9,7 +8,7 @@ public partial class ItemEntryViewModel<TKey, TValue>(IServiceProvider provider,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
ICollectionSynchronization<IItemEntryViewModel> synchronization, ISynchronizationCollection<IItemEntryViewModel> synchronization,
ItemEntryConfiguration configuration, ItemEntryConfiguration configuration,
TKey? key = default, TKey? key = default,
TValue? value = default) : TValue? value = default) :
@@ -21,9 +20,5 @@ public partial class ItemEntryViewModel<TKey, TValue>(IServiceProvider provider,
public int Index => synchronization.IndexOf(this); public int Index => synchronization.IndexOf(this);
public Task<(int, ItemEntryConfiguration)> Handle(ConfirmEventArgs<ItemContentEntry> args, public Task<(int, ItemEntryConfiguration)> Handle(ConfirmEventArgs<ItemContentEntry> args,
CancellationToken cancellationToken) CancellationToken cancellationToken) => Task.FromResult((Index, configuration with { Value = Value }));
{
var doo = Provider.GetRequiredService<ICollectionSynchronization<IItemEntryViewModel>>();
return Task.FromResult((Index, configuration with { Value = Value }));
}
} }
+1 -1
View File
@@ -8,7 +8,7 @@ public partial class ItemMaskedTextEntryViewModel(IServiceProvider provider,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
ICollectionSynchronization<IItemEntryViewModel> synchronization, ISynchronizationCollection<IItemEntryViewModel> synchronization,
ItemEntryConfiguration configuration, ItemEntryConfiguration configuration,
string? key = default, string? key = default,
string? value = default) : ItemEntryViewModel<string, string?>(provider, factory, mediator, publisher, subscriber, disposer, synchronization, configuration, key, value); string? value = default) : ItemEntryViewModel<string, string?>(provider, factory, mediator, publisher, subscriber, disposer, synchronization, configuration, key, value);
@@ -3,15 +3,18 @@
namespace Bitvault; namespace Bitvault;
public class ItemMaskedTextEntryViewModelHandler(IServiceFactory serviceFactory) : public class ItemMaskedTextEntryViewModelHandler(IServiceFactory serviceFactory) :
IHandler<MaskedTextEntryConfiguration, IItemEntryViewModel?> IHandler<CreateEventArgs<MaskedTextEntryConfiguration>, IItemEntryViewModel?>
{ {
public Task<IItemEntryViewModel?> Handle(MaskedTextEntryConfiguration args, public Task<IItemEntryViewModel?> Handle(CreateEventArgs<MaskedTextEntryConfiguration> args,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
if (serviceFactory.Create<ItemMaskedTextEntryViewModel>(args, args.Label, args.Value ?? "") is if (args.Value is MaskedTextEntryConfiguration configuration)
ItemMaskedTextEntryViewModel viewModel)
{ {
return Task.FromResult<IItemEntryViewModel?>(viewModel); if (serviceFactory.Create<ItemMaskedTextEntryViewModel>([.. args.Parameters, configuration, configuration.Label, configuration.Value ?? ""])
is ItemMaskedTextEntryViewModel viewModel)
{
return Task.FromResult<IItemEntryViewModel?>(viewModel);
}
} }
return Task.FromResult<IItemEntryViewModel?>(default); return Task.FromResult<IItemEntryViewModel?>(default);
-4
View File
@@ -10,7 +10,6 @@ public partial class ItemNavigationViewModel(IServiceProvider provider,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
IContentTemplate template, IContentTemplate template,
ICollectionSynchronization<ItemNavigationViewModel> synchronization,
NamedComponent named, NamedComponent named,
Guid id, Guid id,
string name = "", string name = "",
@@ -26,7 +25,6 @@ public partial class ItemNavigationViewModel(IServiceProvider provider,
INotificationHandler<UnfavouriteEventArgs<Item>>, INotificationHandler<UnfavouriteEventArgs<Item>>,
INotificationHandler<NotifyEventArgs<ItemHeader<string>>>, INotificationHandler<NotifyEventArgs<ItemHeader<string>>>,
ISelectable, ISelectable,
IIndexable,
IRemovable IRemovable
{ {
[ObservableProperty] [ObservableProperty]
@@ -53,8 +51,6 @@ public partial class ItemNavigationViewModel(IServiceProvider provider,
[ObservableProperty] [ObservableProperty]
private bool selected = selected; private bool selected = selected;
public int Index => synchronization.IndexOf(this);
public IContentTemplate Template { get; set; } = template; public IContentTemplate Template { get; set; } = template;
public Task Handle(ArchiveEventArgs<Item> args) => public Task Handle(ArchiveEventArgs<Item> args) =>
+1 -1
View File
@@ -8,7 +8,7 @@ public partial class ItemPasswordEntryViewModel(IServiceProvider provider,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
ICollectionSynchronization<IItemEntryViewModel> synchronization, ISynchronizationCollection<IItemEntryViewModel> synchronization,
ItemEntryConfiguration configuration, ItemEntryConfiguration configuration,
string? key = default, string? key = default,
string? value = default) : ItemEntryViewModel<string, string?>(provider, factory, mediator, publisher, subscriber, disposer, synchronization, configuration, key, value); string? value = default) : ItemEntryViewModel<string, string?>(provider, factory, mediator, publisher, subscriber, disposer, synchronization, configuration, key, value);
@@ -3,15 +3,18 @@
namespace Bitvault; namespace Bitvault;
public class ItemPasswordEntryViewModelHandler(IServiceFactory serviceFactory) : public class ItemPasswordEntryViewModelHandler(IServiceFactory serviceFactory) :
IHandler<PasswordEntryConfiguration, IItemEntryViewModel?> IHandler<CreateEventArgs<PasswordEntryConfiguration>, IItemEntryViewModel?>
{ {
public Task<IItemEntryViewModel?> Handle(PasswordEntryConfiguration args, public Task<IItemEntryViewModel?> Handle(CreateEventArgs<PasswordEntryConfiguration> args,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
if (serviceFactory.Create<ItemPasswordEntryViewModel>(args, args.Label, args.Value ?? "") if (args.Value is PasswordEntryConfiguration configuration)
is ItemPasswordEntryViewModel viewModel)
{ {
return Task.FromResult<IItemEntryViewModel?>(viewModel); if (serviceFactory.Create<ItemPasswordEntryViewModel>([.. args.Parameters, configuration, configuration.Label, configuration.Value ?? ""])
is ItemPasswordEntryViewModel viewModel)
{
return Task.FromResult<IItemEntryViewModel?>(viewModel);
}
} }
return Task.FromResult<IItemEntryViewModel?>(default); return Task.FromResult<IItemEntryViewModel?>(default);
+10 -3
View File
@@ -4,18 +4,25 @@ using Toolkit.Foundation;
namespace Bitvault; namespace Bitvault;
[Notification(typeof(CreateEventArgs<IItemEntryViewModel>), nameof(Section))] [Notification(typeof(CreateEventArgs<IItemEntryViewModel>), nameof(Section))]
public partial class ItemSectionViewModel(ICollectionSynchronizer synchronizer, public partial class ItemSectionViewModel(IServiceProvider provider,
IServiceProvider provider,
IServiceFactory factory, IServiceFactory factory,
IMediator mediator, IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
IContentTemplate template, IContentTemplate template,
string section) : ObservableCollection<IItemEntryViewModel>(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) ISynchronizationCollection<ItemSectionViewModel> synchronization,
string section) : ObservableCollection<IItemEntryViewModel>(provider, factory, mediator, publisher, subscriber, disposer),
IHandler<ConfirmEventArgs<ItemSection>, (int, string)>,
IIndexable
{ {
[ObservableProperty] [ObservableProperty]
private string section = section; private string section = section;
public IContentTemplate Template { get; set; } = template; public IContentTemplate Template { get; set; } = template;
public int Index => synchronization.IndexOf(this);
public Task<(int, string)> Handle(ConfirmEventArgs<ItemSection> args,
CancellationToken cancellationToken) => Task.FromResult((0, Section));
} }
+1 -1
View File
@@ -8,7 +8,7 @@ public partial class ItemTextEntryViewModel(IServiceProvider provider,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
ICollectionSynchronization<IItemEntryViewModel> synchronization, ISynchronizationCollection<IItemEntryViewModel> synchronization,
ItemEntryConfiguration configuration, ItemEntryConfiguration configuration,
string? key = default, string? key = default,
string? value = default) : ItemEntryViewModel<string, string?>(provider, factory, mediator, publisher, subscriber, disposer, synchronization, configuration, key, value); string? value = default) : ItemEntryViewModel<string, string?>(provider, factory, mediator, publisher, subscriber, disposer, synchronization, configuration, key, value);
+8 -5
View File
@@ -3,15 +3,18 @@
namespace Bitvault; namespace Bitvault;
public class ItemTextEntryViewModelHandler(IServiceFactory serviceFactory) : public class ItemTextEntryViewModelHandler(IServiceFactory serviceFactory) :
IHandler<TextEntryConfiguration, IItemEntryViewModel?> IHandler<CreateEventArgs<TextEntryConfiguration>, IItemEntryViewModel?>
{ {
public Task<IItemEntryViewModel?> Handle(TextEntryConfiguration args, public Task<IItemEntryViewModel?> Handle(CreateEventArgs<TextEntryConfiguration> args,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
if (serviceFactory.Create<ItemTextEntryViewModel>(args, args.Label, args.Value ?? "") if (args.Value is TextEntryConfiguration configuration)
is ItemTextEntryViewModel viewModel)
{ {
return Task.FromResult<IItemEntryViewModel?>(viewModel); if (serviceFactory.Create<ItemTextEntryViewModel>([.. args.Parameters, configuration, configuration.Label, configuration.Value ?? ""])
is ItemTextEntryViewModel viewModel)
{
return Task.FromResult<IItemEntryViewModel?>(viewModel);
}
} }
return Task.FromResult<IItemEntryViewModel?>(default); return Task.FromResult<IItemEntryViewModel?>(default);
+2 -3
View File
@@ -29,8 +29,7 @@ public partial class ItemViewModel :
[ObservableProperty] [ObservableProperty]
private bool fromCategory; private bool fromCategory;
public ItemViewModel(ICollectionSynchronizer synchronizer, public ItemViewModel(IServiceProvider provider,
IServiceProvider provider,
IServiceFactory factory, IServiceFactory factory,
IMediator mediator, IMediator mediator,
IPublisher publisher, IPublisher publisher,
@@ -42,7 +41,7 @@ public partial class ItemViewModel :
bool fromCategory = false, bool fromCategory = false,
string name = "", string name = "",
bool favourite = false, 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; Template = template;
Named = $"{named}"; Named = $"{named}";
+2 -3
View File
@@ -2,15 +2,14 @@
namespace Bitvault; namespace Bitvault;
public partial class LockerHeaderViewModel(ICollectionSynchronizer synchronizer, public partial class LockerHeaderViewModel(IServiceProvider provider,
IServiceProvider provider,
IServiceFactory factory, IServiceFactory factory,
IMediator mediator, IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
IContentTemplate template) : IContentTemplate template) :
ObservableCollection(synchronizer, provider, factory, mediator, publisher, subscriber, disposer), ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer),
INotificationHandler<NotifyEventArgs<LockerCommandHeaderCollection>> INotificationHandler<NotifyEventArgs<LockerCommandHeaderCollection>>
{ {
public IContentTemplate Template { get; set; } = template; public IContentTemplate Template { get; set; } = template;
+2 -3
View File
@@ -27,8 +27,7 @@ public partial class LockerNavigationViewModel :
[ObservableProperty] [ObservableProperty]
private bool selected; private bool selected;
public LockerNavigationViewModel(ICollectionSynchronizer synchronizer, public LockerNavigationViewModel(IServiceProvider provider,
IServiceProvider provider,
IServiceFactory factory, IServiceFactory factory,
IMediator mediator, IMediator mediator,
IPublisher publisher, IPublisher publisher,
@@ -36,7 +35,7 @@ public partial class LockerNavigationViewModel :
IDisposer disposer, IDisposer disposer,
IContentTemplate template, IContentTemplate template,
string name, string name,
bool selected) : base(synchronizer,provider, factory, mediator, publisher, subscriber, disposer) bool selected) : base(provider, factory, mediator, publisher, subscriber, disposer)
{ {
Template = template; Template = template;
Name = name; Name = name;
+2 -3
View File
@@ -11,15 +11,14 @@ public partial class MainViewModel :
[ObservableProperty] [ObservableProperty]
private FooterViewModel footer; private FooterViewModel footer;
public MainViewModel(ICollectionSynchronizer synchronizer, public MainViewModel(IServiceProvider provider,
IServiceProvider provider,
IServiceFactory factory, IServiceFactory factory,
IMediator mediator, IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
IContentTemplate template, IContentTemplate template,
FooterViewModel footer) : base(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) FooterViewModel footer) : base(provider, factory, mediator, publisher, subscriber, disposer)
{ {
Template = template; Template = template;
Footer = footer; Footer = footer;
+2 -3
View File
@@ -6,14 +6,13 @@ public partial class ManageViewModel :
ObservableCollection, ObservableCollection,
IMainNavigationViewModel IMainNavigationViewModel
{ {
public ManageViewModel(ICollectionSynchronizer synchronizer, public ManageViewModel(IServiceProvider provider,
IServiceProvider provider,
IServiceFactory factory, IServiceFactory factory,
IMediator mediator, IMediator mediator,
IPublisher publisher, IPublisher publisher,
ISubscription subscriber, ISubscription subscriber,
IDisposer disposer, IDisposer disposer,
IContentTemplate template) : base(synchronizer,provider, factory, mediator, publisher, subscriber, disposer) IContentTemplate template) : base(provider, factory, mediator, publisher, subscriber, disposer)
{ {
Template = template; Template = template;
@@ -2,12 +2,12 @@
namespace Bitvault; namespace Bitvault;
public class AggregateItemCategoryViewModelHandler(IItemConfigurationCollection configurations, public class SynchronizeItemCategoryViewModelHandler(IItemConfigurationCollection configurations,
IServiceFactory serviceFactory, IServiceFactory serviceFactory,
IPublisher publisher) : IPublisher publisher) :
INotificationHandler<AggerateEventArgs<ItemCategoryNavigationViewModel>> INotificationHandler<SynchronizeEventArgs<ItemCategoryNavigationViewModel>>
{ {
public Task Handle(AggerateEventArgs<ItemCategoryNavigationViewModel> args) public Task Handle(SynchronizeEventArgs<ItemCategoryNavigationViewModel> args)
{ {
bool selected = true; bool selected = true;
foreach (KeyValuePair<string, Func<ItemConfiguration>> configuration in configurations) foreach (KeyValuePair<string, Func<ItemConfiguration>> configuration in configurations)
@@ -0,0 +1,46 @@
using System.Reflection;
using Toolkit.Foundation;
namespace Bitvault;
public class SynchronizeItemContentFromCategoryViewModelHandler(IItemConfigurationCollection configurations,
IServiceFactory serviceFactory,
IMediator mediator,
IPublisher publisher) :
INotificationHandler<SynchronizeEventArgs<IItemEntryViewModel,
(string, ISynchronizationCollection<ItemSectionViewModel>)>>
{
public async Task Handle(SynchronizeEventArgs<IItemEntryViewModel, (string, ISynchronizationCollection<ItemSectionViewModel>)> args)
{
(string category, ISynchronizationCollection<ItemSectionViewModel> synchronization) = args.Value;
if (configurations.TryGetValue(category, out Func<ItemConfiguration>? factory))
{
if (factory.Invoke() is ItemConfiguration configuration)
{
foreach (ItemSectionConfiguration configurationSection in configuration.Sections)
{
string section = $"{nameof(ItemSection)}:{Guid.NewGuid()}";
if (serviceFactory.Create<ItemSectionViewModel>(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<object, IItemEntryViewModel?>(message, entryConfiguration.GetType().Name) is IItemEntryViewModel entryViewModel)
{
publisher.Publish(Create.As(entryViewModel), section);
}
}
}
}
}
}
}
}
}
@@ -2,12 +2,12 @@
namespace Bitvault; namespace Bitvault;
public class AggregateItemContentViewModelHandler(IMediator mediator, public class SynchronizeItemContentViewModelHandler(IMediator mediator,
IServiceFactory serviceFactory, IServiceFactory serviceFactory,
IPublisher publisher) : IPublisher publisher) :
INotificationHandler<AggerateEventArgs<IItemEntryViewModel>> INotificationHandler<SynchronizeEventArgs<IItemEntryViewModel>>
{ {
public Task Handle(AggerateEventArgs<IItemEntryViewModel> args) public Task Handle(SynchronizeEventArgs<IItemEntryViewModel> args)
{ {
//wModel>(false) is ItemHeaderViewModel viewModel) //wModel>(false) is ItemHeaderViewModel viewModel)
//{ //{
@@ -3,15 +3,13 @@ using Toolkit.Foundation;
namespace Bitvault; namespace Bitvault;
public class AggerateItemViewModelHandler(IMediator mediator, public class SynchronizeItemViewModelHandler(IMediator mediator,
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
ICache<Item<(Guid, string)>> cache, ICache<Item<(Guid, string)>> cache,
IPublisher publisher, IPublisher publisher) :
LockerViewModelConfiguration dd) : INotificationHandler<SynchronizeEventArgs<ItemNavigationViewModel, LockerViewModelConfiguration>>
INotificationHandler<AggerateEventArgs<ItemNavigationViewModel,
LockerViewModelConfiguration>>
{ {
public async Task Handle(AggerateEventArgs<ItemNavigationViewModel, public async Task Handle(SynchronizeEventArgs<ItemNavigationViewModel,
LockerViewModelConfiguration> args) LockerViewModelConfiguration> args)
{ {
if (args.Value is LockerViewModelConfiguration configuration) if (args.Value is LockerViewModelConfiguration configuration)
@@ -3,21 +3,23 @@ using Toolkit.Foundation;
namespace Bitvault; namespace Bitvault;
public class AggregateMainViewModelHandler(IPublisher publisher, public class SynchronizeMainViewModelHandler(IPublisher publisher,
ILockerHostCollection lockers) : ILockerHostCollection lockers) :
INotificationHandler<AggerateEventArgs<IMainNavigationViewModel>> INotificationHandler<SynchronizeEventArgs<IMainNavigationViewModel>>
{ {
public Task Handle(AggerateEventArgs<IMainNavigationViewModel> args) public Task Handle(SynchronizeEventArgs<IMainNavigationViewModel> args)
{ {
bool selected = true; bool selected = true;
foreach (IComponentHost locker in lockers.OrderBy(x => x.Services.GetRequiredService<IConfigurationDescriptor<LockerConfiguration>>() foreach (IComponentHost locker in lockers.OrderBy(x => x.Services.GetRequiredService<IConfigurationDescriptor<LockerConfiguration>>()
is IConfigurationDescriptor<LockerConfiguration> descriptor ? descriptor.Name : null)) is IConfigurationDescriptor<LockerConfiguration> descriptor ? descriptor.Name : null))
{ {
if (locker.Services.GetRequiredService<IConfigurationDescriptor<LockerConfiguration>>() is IConfigurationDescriptor<LockerConfiguration> descriptor) if (locker.Services.GetRequiredService<IConfigurationDescriptor<LockerConfiguration>>()
is IConfigurationDescriptor<LockerConfiguration> descriptor)
{ {
if (locker.Services.GetRequiredService<IServiceFactory>() is IServiceFactory factory) if (locker.Services.GetRequiredService<IServiceFactory>() is IServiceFactory factory)
{ {
if (factory.Create<LockerNavigationViewModel>(descriptor.Name, selected) is LockerNavigationViewModel viewModel) if (factory.Create<LockerNavigationViewModel>(descriptor.Name, selected)
is LockerNavigationViewModel viewModel)
{ {
publisher.Publish(Create.As<IMainNavigationViewModel>(viewModel), publisher.Publish(Create.As<IMainNavigationViewModel>(viewModel),
nameof(MainViewModel)); nameof(MainViewModel));