From 554c12382a2efb6a420f0c8eb89a8b3980f875a7 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Tue, 4 Jun 2024 12:14:00 +0100 Subject: [PATCH] Added ICollectionSynchronization --- Bitvault.Avalonia/App.axaml.cs | 21 +++++++--- .../ItemMaskedTextEntryView.axaml | 2 +- Bitvault.Avalonia/ItemPasswordEntryView.axaml | 3 +- Bitvault.Avalonia/ItemTextEntryView.axaml | 2 +- Bitvault.Data/BlobEntry.cs | 4 +- Bitvault.Data/DocumentType.cs | 7 ---- ...ItemContentFromCategoryViewModelHandler.cs | 12 +++--- Bitvault/AggregateItemViewModelHandler.cs | 4 +- Bitvault/ArchiveItemHandler.cs | 4 +- Bitvault/ConfirmCreateItemHandler.cs | 7 +++- Bitvault/ConfirmUpdateItemHandler.cs | 12 +++--- Bitvault/CreateItemHandler.cs | 1 + Bitvault/CreateLockerHandler.cs | 2 +- Bitvault/FavouriteItemHandler.cs | 4 +- Bitvault/FooterViewModel.cs | 5 ++- Bitvault/ItemCategoryCollectionViewModel.cs | 5 ++- Bitvault/ItemCollectionViewModel.cs | 5 ++- Bitvault/ItemCommandHeaderViewModel.cs | 5 ++- Bitvault/ItemContentEntry.cs | 5 +++ Bitvault/ItemContentViewModel.cs | 5 ++- Bitvault/ItemCreatedHandler.cs | 4 +- Bitvault/ItemDropdownEntryViewModel.cs | 5 ++- Bitvault/ItemDropdownEntryViewModelHandler.cs | 3 +- Bitvault/ItemEntryViewModel.cs | 39 ++++++++++--------- Bitvault/ItemHeader.cs | 2 + Bitvault/ItemHeaderConfiguration.cs | 6 --- Bitvault/ItemHeaderViewModel.cs | 9 ++--- Bitvault/ItemMaskedTextEntryViewModel.cs | 5 ++- .../ItemMaskedTextEntryViewModelHandler.cs | 2 +- Bitvault/ItemModifiedHandler.cs | 4 +- Bitvault/ItemNavigationViewModel.cs | 14 ++++--- Bitvault/ItemPasswordEntryViewModel.cs | 6 +-- Bitvault/ItemPasswordEntryViewModelHandler.cs | 2 +- Bitvault/ItemSectionViewModel.cs | 5 ++- Bitvault/ItemTextEntryViewModel.cs | 5 ++- Bitvault/ItemTextEntryViewModelHandler.cs | 3 +- Bitvault/ItemViewModel.cs | 5 ++- Bitvault/LockerHeaderViewModel.cs | 5 ++- Bitvault/LockerNavigationViewModel.cs | 5 ++- Bitvault/LockerStorageFactory.cs | 2 +- Bitvault/MainViewModel.cs | 6 ++- Bitvault/ManageViewModel.cs | 5 ++- Bitvault/UnarchiveItemHandler.cs | 4 +- Bitvault/UnfavouriteItemHandler.cs | 4 +- 44 files changed, 149 insertions(+), 116 deletions(-) delete mode 100644 Bitvault.Data/DocumentType.cs create mode 100644 Bitvault/ItemContentEntry.cs delete mode 100644 Bitvault/ItemHeaderConfiguration.cs diff --git a/Bitvault.Avalonia/App.axaml.cs b/Bitvault.Avalonia/App.axaml.cs index b496864..e499153 100644 --- a/Bitvault.Avalonia/App.axaml.cs +++ b/Bitvault.Avalonia/App.axaml.cs @@ -79,13 +79,13 @@ public partial class App : Application return new ItemConfigurationCollection(items.ToDictionary(x => x.Name, x => (Func)(() => x.Value))); }); - services.TryAddSingleton, ValueStore>(); - services.TryAddSingleton, ValueStore>(); + services.TryAddSingleton, DecoratorService>(); + services.TryAddSingleton, DecoratorService>(); services.AddDbContextFactory((provider, args) => { - if (provider.GetRequiredService>() - is IValueStore connection) + if (provider.GetRequiredService>() + is IDecoratorService connection) { args.UseSqlite($"{connection.Value}"); } @@ -111,6 +111,11 @@ public partial class App : Application services.AddTemplate("Locker"); services.AddTemplate("ContentItemCollection"); + services.AddSingleton>, + DecoratorService>>(); + + services.AddSingleton(provider => provider.GetRequiredService>>().Value!); + services.AddHandler(); services.AddTemplate("LockerHeader"); @@ -123,7 +128,7 @@ public partial class App : Application services.AddHandler(); - services.AddScoped>, ValueStore>>(); + services.AddScoped>, DecoratorService>>(); services.AddTemplate(); @@ -143,6 +148,12 @@ public partial class App : Application services.AddTemplate(); services.AddTemplate(); + services.AddScoped>, + DecoratorService>>(); + + services.AddScoped(provider => provider.GetRequiredService>>().Value!); + + services.AddTemplate("ItemCommandHeader"); services.AddTemplate(); diff --git a/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml index 9016933..7799e08 100644 --- a/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml +++ b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml @@ -6,6 +6,6 @@ x:DataType="vm:ItemMaskedTextEntryViewModel" Header="{Binding Key}"> - + \ No newline at end of file diff --git a/Bitvault.Avalonia/ItemPasswordEntryView.axaml b/Bitvault.Avalonia/ItemPasswordEntryView.axaml index 90d20e0..72968fe 100644 --- a/Bitvault.Avalonia/ItemPasswordEntryView.axaml +++ b/Bitvault.Avalonia/ItemPasswordEntryView.axaml @@ -9,6 +9,7 @@ + PasswordChar="●" + Text="{Binding Value}" /> diff --git a/Bitvault.Avalonia/ItemTextEntryView.axaml b/Bitvault.Avalonia/ItemTextEntryView.axaml index 7759ee8..cb92f7a 100644 --- a/Bitvault.Avalonia/ItemTextEntryView.axaml +++ b/Bitvault.Avalonia/ItemTextEntryView.axaml @@ -6,6 +6,6 @@ x:DataType="vm:ItemTextEntryViewModel" Header="{Binding Key}"> - + diff --git a/Bitvault.Data/BlobEntry.cs b/Bitvault.Data/BlobEntry.cs index bdc6fd8..5f93d14 100644 --- a/Bitvault.Data/BlobEntry.cs +++ b/Bitvault.Data/BlobEntry.cs @@ -8,8 +8,10 @@ public record BlobEntry { public byte[]? Data { get; set; } - public DocumentType Type { get; set; } + public int Type { get; set; } [Key] public int Id { get; set; } + + public DateTimeOffset DateTime { get; set; } } \ No newline at end of file diff --git a/Bitvault.Data/DocumentType.cs b/Bitvault.Data/DocumentType.cs deleted file mode 100644 index e5c36e8..0000000 --- a/Bitvault.Data/DocumentType.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Bitvault.Data; - -public enum DocumentType -{ - Form, - File -} \ No newline at end of file diff --git a/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs b/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs index 9c4cc5c..a360daf 100644 --- a/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs +++ b/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs @@ -16,19 +16,19 @@ public class AggregateItemContentFromCategoryViewModelHandler(IItemConfiguration { if (factory.Invoke() is ItemConfiguration configuration) { - int index = 0; - - foreach (ItemSectionConfiguration section in configuration.Sections) + foreach (ItemSectionConfiguration configurationSection in configuration.Sections) { - if (serviceFactory.Create($"{nameof(ItemSection)}{index}") is ItemSectionViewModel sectionViewModel) + string section = $"{nameof(ItemSection)}:{Guid.NewGuid}"; + if (serviceFactory.Create(section) + is ItemSectionViewModel sectionViewModel) { publisher.Publish(Create.As(sectionViewModel), nameof(ItemContentViewModel)); - foreach (ItemEntryConfiguration entryConfiguration in section.Entries) + foreach (ItemEntryConfiguration entryConfiguration in configurationSection.Entries) { if (await mediator.Handle(entryConfiguration, entryConfiguration.GetType().Name) is IItemEntryViewModel entryViewModel) { - publisher.Publish(Create.As(entryViewModel), $"{nameof(ItemSection)}{index}"); + publisher.Publish(Create.As(entryViewModel), section); } } } diff --git a/Bitvault/AggregateItemViewModelHandler.cs b/Bitvault/AggregateItemViewModelHandler.cs index 4e21875..5f2d629 100644 --- a/Bitvault/AggregateItemViewModelHandler.cs +++ b/Bitvault/AggregateItemViewModelHandler.cs @@ -30,13 +30,13 @@ public class AggerateItemViewModelHandler(IMediator mediator, { IServiceScope serviceScope = serviceProvider.CreateScope(); IServiceFactory serviceFactory = serviceScope.ServiceProvider.GetRequiredService(); - IValueStore> valueStore = serviceScope.ServiceProvider.GetRequiredService>>(); + IDecoratorService> decoratorService = serviceScope.ServiceProvider.GetRequiredService>>(); if (serviceFactory.Create(Id, Name, "Description", Category, selected, Favourite, Archived) is ItemNavigationViewModel viewModel) { Item<(Guid, string)> item = new((Id, Name)); - valueStore.Set(item); + decoratorService.Set(item); cache.Add(item); publisher.Publish(Create.As(viewModel), nameof(ItemCollectionViewModel)); diff --git a/Bitvault/ArchiveItemHandler.cs b/Bitvault/ArchiveItemHandler.cs index c2fbf57..0bfab99 100644 --- a/Bitvault/ArchiveItemHandler.cs +++ b/Bitvault/ArchiveItemHandler.cs @@ -2,7 +2,7 @@ namespace Bitvault; -public class ArchiveItemHandler(IValueStore> valueStore, +public class ArchiveItemHandler(IDecoratorService> decoratorService, ICache> cache, IMediator mediator) : INotificationHandler> @@ -11,7 +11,7 @@ public class ArchiveItemHandler(IValueStore> valueStore, { try { - if (valueStore.Value is Item<(Guid, string)> item) + if (decoratorService.Value is Item<(Guid, string)> item) { if (cache.Contains(item)) { diff --git a/Bitvault/ConfirmCreateItemHandler.cs b/Bitvault/ConfirmCreateItemHandler.cs index 8b5777f..e6baa49 100644 --- a/Bitvault/ConfirmCreateItemHandler.cs +++ b/Bitvault/ConfirmCreateItemHandler.cs @@ -8,11 +8,14 @@ public class ConfirmCreateItemHandler(IMediator mediator, { public async Task Handle(ConfirmEventArgs args) { - string? name = await mediator.Handle, - string?>(args, nameof(ItemHeader)); + string? name = await mediator.Handle, + string>(Confirm.As()); if (name is not null) { + IList entries = await mediator.HandleMany, + ItemEntryConfiguration>(Confirm.As()); + Guid id = Guid.NewGuid(); publisher.Publish(Created.As(new Item<(Guid, string)>((id, name)))); diff --git a/Bitvault/ConfirmUpdateItemHandler.cs b/Bitvault/ConfirmUpdateItemHandler.cs index eab0c09..3caa074 100644 --- a/Bitvault/ConfirmUpdateItemHandler.cs +++ b/Bitvault/ConfirmUpdateItemHandler.cs @@ -2,24 +2,24 @@ namespace Bitvault; -public class ConfirmUpdateItemHandler(IValueStore> store, +public class ConfirmUpdateItemHandler(IDecoratorService> store, IMediator mediator, IPublisher publisher) : INotificationHandler> { public async Task Handle(ConfirmEventArgs args) { - ItemHeaderConfiguration? configuration = await mediator.Handle, - ItemHeaderConfiguration>(args); + string? name = await mediator.Handle, + string>(Confirm.As()); - if (configuration is not null) + if (name is not null) { - publisher.Publish(Notify.As(configuration)); + + publisher.Publish(Notify.As(new ItemHeader(name))); if (store?.Value is Item<(Guid, string)> item) { (Guid id, string _) = item.Value; - string? name = configuration.Name; Item<(Guid, string)> newItem = new((id, name)); publisher.Publish(Modified.As(item, newItem)); diff --git a/Bitvault/CreateItemHandler.cs b/Bitvault/CreateItemHandler.cs index 7658079..179f354 100644 --- a/Bitvault/CreateItemHandler.cs +++ b/Bitvault/CreateItemHandler.cs @@ -22,6 +22,7 @@ public class CreateItemHandler(IDbContextFactory dbContextFactory { result = await context.AddAsync(new ItemEntry { Id = id, Name = name, Category = category }, cancellationToken); await context.SaveChangesAsync(cancellationToken); + }, cancellationToken); if (result is not null) diff --git a/Bitvault/CreateLockerHandler.cs b/Bitvault/CreateLockerHandler.cs index a078b00..dedcd02 100644 --- a/Bitvault/CreateLockerHandler.cs +++ b/Bitvault/CreateLockerHandler.cs @@ -18,7 +18,7 @@ public class CreateLockerHandler(ILockerFactory componentFactory, if (componentFactory.Create(name) is IComponentHost host) { ISecurityKeyFactory keyVaultFactory = host.Services.GetRequiredService(); - IValueStore secureKeyStore = host.Services.GetRequiredService>(); + IDecoratorService secureKeyStore = host.Services.GetRequiredService>(); ILockerStorageFactory lockerStorageFactory = host.Services.GetRequiredService(); if (keyVaultFactory.Create(Encoding.UTF8.GetBytes(password)) is SecurityKey key) diff --git a/Bitvault/FavouriteItemHandler.cs b/Bitvault/FavouriteItemHandler.cs index 09cefbf..e081d48 100644 --- a/Bitvault/FavouriteItemHandler.cs +++ b/Bitvault/FavouriteItemHandler.cs @@ -2,7 +2,7 @@ namespace Bitvault; -public class FavouriteItemHandler(IValueStore> valueStore, +public class FavouriteItemHandler(IDecoratorService> decoratorService, IMediator mediator) : INotificationHandler> { @@ -10,7 +10,7 @@ public class FavouriteItemHandler(IValueStore> valueStore, { try { - if (valueStore.Value is Item<(Guid, string)> item) + if (decoratorService.Value is Item<(Guid, string)> item) { (Guid id, string name) = item.Value; await mediator.Handle, bool>(new UpdateEventArgs<(Guid, int)>((id, 1))); diff --git a/Bitvault/FooterViewModel.cs b/Bitvault/FooterViewModel.cs index c503c8c..4213248 100644 --- a/Bitvault/FooterViewModel.cs +++ b/Bitvault/FooterViewModel.cs @@ -5,12 +5,13 @@ namespace Bitvault; public partial class FooterViewModel : ObservableCollection { - public FooterViewModel(IServiceProvider provider, + public FooterViewModel(ICollectionSynchronizer synchronizer, + IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, - IDisposer disposer) : base(provider, factory, mediator, publisher, subscriber, disposer) + IDisposer disposer) : base(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) { Add(); } diff --git a/Bitvault/ItemCategoryCollectionViewModel.cs b/Bitvault/ItemCategoryCollectionViewModel.cs index e6b975c..e0accb5 100644 --- a/Bitvault/ItemCategoryCollectionViewModel.cs +++ b/Bitvault/ItemCategoryCollectionViewModel.cs @@ -4,14 +4,15 @@ using Toolkit.Foundation; namespace Bitvault; [Notification(typeof(CreateEventArgs), nameof(ItemCategoryCollectionViewModel))] -public partial class ItemCategoryCollectionViewModel(IServiceProvider provider, +public partial class ItemCategoryCollectionViewModel(ICollectionSynchronizer synchronizer, + IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, IContentTemplate template) : - ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer) + ObservableCollection(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) { [ObservableProperty] private IContentTemplate template = template; diff --git a/Bitvault/ItemCollectionViewModel.cs b/Bitvault/ItemCollectionViewModel.cs index 372a48a..770d28d 100644 --- a/Bitvault/ItemCollectionViewModel.cs +++ b/Bitvault/ItemCollectionViewModel.cs @@ -18,7 +18,8 @@ public partial class ItemCollectionViewModel : private LockerViewModelConfiguration configuration; - public ItemCollectionViewModel(IServiceProvider provider, + public ItemCollectionViewModel(ICollectionSynchronizer synchronizer, + IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, @@ -27,7 +28,7 @@ public partial class ItemCollectionViewModel : IContentTemplate template, NamedComponent named, LockerViewModelConfiguration configuration, - string? filter = null) : base(provider, factory, mediator, publisher, subscriber, disposer) + string? filter = null) : base(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) { Template = template; Named = $"{named}"; diff --git a/Bitvault/ItemCommandHeaderViewModel.cs b/Bitvault/ItemCommandHeaderViewModel.cs index 1391038..5e393bd 100644 --- a/Bitvault/ItemCommandHeaderViewModel.cs +++ b/Bitvault/ItemCommandHeaderViewModel.cs @@ -2,14 +2,15 @@ namespace Bitvault; -public partial class ItemCommandHeaderViewModel(IServiceProvider provider, +public partial class ItemCommandHeaderViewModel(ICollectionSynchronizer synchronizer, + IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, IContentTemplate template) : - ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer), + ObservableCollection(synchronizer, provider, factory, mediator, publisher, subscriber, disposer), INotificationHandler> { public IContentTemplate Template { get; set; } = template; diff --git a/Bitvault/ItemContentEntry.cs b/Bitvault/ItemContentEntry.cs new file mode 100644 index 0000000..d9d4ecd --- /dev/null +++ b/Bitvault/ItemContentEntry.cs @@ -0,0 +1,5 @@ +namespace Bitvault; + +public record ItemContentEntry(TValue Value); + +public record ItemContentEntry; diff --git a/Bitvault/ItemContentViewModel.cs b/Bitvault/ItemContentViewModel.cs index 393c780..dc43dfd 100644 --- a/Bitvault/ItemContentViewModel.cs +++ b/Bitvault/ItemContentViewModel.cs @@ -3,14 +3,15 @@ namespace Bitvault; [Notification(typeof(CreateEventArgs), nameof(ItemContentViewModel))] -public partial class ItemContentViewModel(IServiceProvider provider, +public partial class ItemContentViewModel(ICollectionSynchronizer synchronizer, + 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), + ObservableCollection(synchronizer, provider, factory, mediator, publisher, subscriber, disposer), IItemEntryViewModel, INotificationHandler>> { diff --git a/Bitvault/ItemCreatedHandler.cs b/Bitvault/ItemCreatedHandler.cs index 4bec2df..16cefa0 100644 --- a/Bitvault/ItemCreatedHandler.cs +++ b/Bitvault/ItemCreatedHandler.cs @@ -16,7 +16,7 @@ public class ItemCreatedHandler(IServiceProvider serviceProvider, IServiceScope serviceScope = serviceProvider.CreateScope(); IServiceFactory serviceFactory = serviceScope.ServiceProvider.GetRequiredService(); - IValueStore> valueStore = serviceScope.ServiceProvider.GetRequiredService>>(); + IDecoratorService> decoratorService = serviceScope.ServiceProvider.GetRequiredService>>(); if (serviceFactory.Create(id, name, "Description", true) is ItemNavigationViewModel viewModel) @@ -24,7 +24,7 @@ public class ItemCreatedHandler(IServiceProvider serviceProvider, cache.Add(item); int index = cache.IndexOf(item); - valueStore.Set(item); + decoratorService.Set(item); publisher.Publish(Insert.As(index, viewModel), nameof(ItemCollectionViewModel)); diff --git a/Bitvault/ItemDropdownEntryViewModel.cs b/Bitvault/ItemDropdownEntryViewModel.cs index a809efb..01d82a5 100644 --- a/Bitvault/ItemDropdownEntryViewModel.cs +++ b/Bitvault/ItemDropdownEntryViewModel.cs @@ -8,6 +8,7 @@ public partial class ItemDropdownEntryViewModel(IServiceProvider provider, IPublisher publisher, ISubscription subscriber, IDisposer disposer, + ICollectionSynchronization synchronization, + ItemEntryConfiguration configuration, string? key = default, - object? value = default) : Observable(provider, factory, mediator, publisher, subscriber, disposer, key, value), - IItemEntryViewModel; + 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 4e54ce7..5c31b9b 100644 --- a/Bitvault/ItemDropdownEntryViewModelHandler.cs +++ b/Bitvault/ItemDropdownEntryViewModelHandler.cs @@ -8,7 +8,8 @@ public class ItemDropdownEntryViewModelHandler(IServiceFactory serviceFactory) : public Task Handle(DropdownEntryConfiguration args, CancellationToken cancellationToken) { - if (serviceFactory.Create(args.Label, args.Value ?? new object()) is ItemDropdownEntryViewModel viewModel) + if (serviceFactory.Create(args, args.Label, args.Value ?? "") + is ItemDropdownEntryViewModel viewModel) { return Task.FromResult(viewModel); } diff --git a/Bitvault/ItemEntryViewModel.cs b/Bitvault/ItemEntryViewModel.cs index 978e374..28a800d 100644 --- a/Bitvault/ItemEntryViewModel.cs +++ b/Bitvault/ItemEntryViewModel.cs @@ -1,24 +1,27 @@ -using CommunityToolkit.Mvvm.ComponentModel; -using Toolkit.Foundation; +using Toolkit.Foundation; namespace Bitvault; -public partial class ItemEntryViewModel : - Observable +public partial class ItemEntryViewModel(IServiceProvider provider, + IServiceFactory factory, + IMediator mediator, + IPublisher publisher, + ISubscription subscriber, + IDisposer disposer, + ICollectionSynchronization synchronization, + ItemEntryConfiguration configuration, + TKey? key = default, + TValue? value = default) : + Observable(provider, factory, mediator, publisher, subscriber, disposer, key, value), + IHandler, ItemEntryConfiguration>, + IItemEntryViewModel, + IIndexable { - public ItemEntryViewModel(IServiceProvider provider, - IServiceFactory factory, - IMediator mediator, - IPublisher publisher, - ISubscription subscriber, - IDisposer disposer, - string type, - TKey? key = default, - TValue? value = default) : base(provider, factory, mediator, publisher, subscriber, disposer, key, value) - { - Type = type; - } + public int Index => synchronization.IndexOf(this); - [ObservableProperty] - private string type; + public Task Handle(ConfirmEventArgs args, + CancellationToken cancellationToken) + { + return Task.FromResult(configuration with { Value = Value }); + } } diff --git a/Bitvault/ItemHeader.cs b/Bitvault/ItemHeader.cs index 59669bd..63a8cea 100644 --- a/Bitvault/ItemHeader.cs +++ b/Bitvault/ItemHeader.cs @@ -1,3 +1,5 @@ namespace Bitvault; +public record ItemHeader(TValue Value); + public record ItemHeader; \ No newline at end of file diff --git a/Bitvault/ItemHeaderConfiguration.cs b/Bitvault/ItemHeaderConfiguration.cs deleted file mode 100644 index 634cb0d..0000000 --- a/Bitvault/ItemHeaderConfiguration.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Bitvault; - -public record ItemHeaderConfiguration -{ - public string Name { get; init; } = ""; -} \ No newline at end of file diff --git a/Bitvault/ItemHeaderViewModel.cs b/Bitvault/ItemHeaderViewModel.cs index 9307d80..87eb496 100644 --- a/Bitvault/ItemHeaderViewModel.cs +++ b/Bitvault/ItemHeaderViewModel.cs @@ -3,14 +3,13 @@ using Toolkit.Foundation; namespace Bitvault; -[Notification(typeof(ConfirmEventArgs), nameof(ItemHeader))] public partial class ItemHeaderViewModel : Observable, - IHandler, bool>, - IHandler, string?>, INotificationHandler>, INotificationHandler>, INotificationHandler>, + IHandler, bool>, + IHandler, string?>, INotificationHandler>> { [ObservableProperty] @@ -34,7 +33,7 @@ public partial class ItemHeaderViewModel : Track(nameof(Value), () => Value, newValue => Value = newValue); } - public Task Handle(ValidationEventArgs args, + public Task Handle(ValidationEventArgs args, CancellationToken cancellationToken) { return Task.FromResult(true); @@ -69,6 +68,6 @@ public partial class ItemHeaderViewModel : return Task.CompletedTask; } - public Task Handle(ConfirmEventArgs args, + public Task Handle(ConfirmEventArgs args, CancellationToken cancellationToken) => Task.FromResult(Value); } \ No newline at end of file diff --git a/Bitvault/ItemMaskedTextEntryViewModel.cs b/Bitvault/ItemMaskedTextEntryViewModel.cs index 5dc40b1..8b56b79 100644 --- a/Bitvault/ItemMaskedTextEntryViewModel.cs +++ b/Bitvault/ItemMaskedTextEntryViewModel.cs @@ -8,6 +8,7 @@ public partial class ItemMaskedTextEntryViewModel(IServiceProvider provider, IPublisher publisher, ISubscription subscriber, IDisposer disposer, + ICollectionSynchronization synchronization, + ItemEntryConfiguration configuration, string? key = default, - object? value = default) : Observable(provider, factory, mediator, publisher, subscriber, disposer, key, value), - IItemEntryViewModel; + 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 49970dc..c99c85a 100644 --- a/Bitvault/ItemMaskedTextEntryViewModelHandler.cs +++ b/Bitvault/ItemMaskedTextEntryViewModelHandler.cs @@ -8,7 +8,7 @@ public class ItemMaskedTextEntryViewModelHandler(IServiceFactory serviceFactory) public Task Handle(MaskedTextEntryConfiguration args, CancellationToken cancellationToken) { - if (serviceFactory.Create(args.Label, args.Value ?? new object()) is + if (serviceFactory.Create(args, args.Label, args.Value ?? "") is ItemMaskedTextEntryViewModel viewModel) { return Task.FromResult(viewModel); diff --git a/Bitvault/ItemModifiedHandler.cs b/Bitvault/ItemModifiedHandler.cs index 2943dc6..200c3a7 100644 --- a/Bitvault/ItemModifiedHandler.cs +++ b/Bitvault/ItemModifiedHandler.cs @@ -18,7 +18,7 @@ public class ItemModifiedHandler(IServiceProvider serviceProvider, if (cachedItem is not null) { IServiceScope serviceScope = serviceProvider.CreateScope(); - IValueStore> valueStore = serviceScope.ServiceProvider.GetRequiredService>>(); + IDecoratorService> decoratorService = serviceScope.ServiceProvider.GetRequiredService>>(); int oldIndex = cache.IndexOf(cachedItem); cache.Remove(cachedItem); @@ -26,7 +26,7 @@ public class ItemModifiedHandler(IServiceProvider serviceProvider, cache.Add(newItem); int newIndex = cache.IndexOf(newItem); - valueStore.Set(newItem); + decoratorService.Set(newItem); publisher.Publish(MoveTo.As(oldIndex, newIndex), nameof(ItemCollectionViewModel)); diff --git a/Bitvault/ItemNavigationViewModel.cs b/Bitvault/ItemNavigationViewModel.cs index 9d44d25..10e4996 100644 --- a/Bitvault/ItemNavigationViewModel.cs +++ b/Bitvault/ItemNavigationViewModel.cs @@ -1,6 +1,5 @@ using CommunityToolkit.Mvvm.ComponentModel; using Toolkit.Foundation; -using Toolkit.UI.Avalonia; namespace Bitvault; @@ -11,6 +10,7 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, ISubscription subscriber, IDisposer disposer, IContentTemplate template, + ICollectionSynchronization synchronization, NamedComponent named, Guid id, string name = "", @@ -24,8 +24,9 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, INotificationHandler>, INotificationHandler>, INotificationHandler>, - INotificationHandler>, + INotificationHandler>>, ISelectable, + IIndexable, IRemovable { [ObservableProperty] @@ -52,7 +53,8 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, [ObservableProperty] private bool selected = selected; - public bool Attached { get; set; } + public int Index => synchronization.IndexOf(this); + public IContentTemplate Template { get; set; } = template; public Task Handle(ArchiveEventArgs args) => @@ -67,11 +69,11 @@ public partial class ItemNavigationViewModel(IServiceProvider provider, public Task Handle(UnfavouriteEventArgs args) => Task.FromResult(Favourite = false); - public Task Handle(NotifyEventArgs args) + public Task Handle(NotifyEventArgs> args) { - if (args.Value is ItemHeaderConfiguration configuration) + if (args.Value is ItemHeader header) { - Name = configuration.Name; + Name = header.Value; } return Task.CompletedTask; diff --git a/Bitvault/ItemPasswordEntryViewModel.cs b/Bitvault/ItemPasswordEntryViewModel.cs index 86302e1..3854a47 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, - string type, + ICollectionSynchronization synchronization, + ItemEntryConfiguration configuration, string? key = default, - object? value = default) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, type, key, value), - IItemEntryViewModel; \ No newline at end of file + 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 4868049..9c98a56 100644 --- a/Bitvault/ItemPasswordEntryViewModelHandler.cs +++ b/Bitvault/ItemPasswordEntryViewModelHandler.cs @@ -8,7 +8,7 @@ public class ItemPasswordEntryViewModelHandler(IServiceFactory serviceFactory) : public Task Handle(PasswordEntryConfiguration args, CancellationToken cancellationToken) { - if (serviceFactory.Create("Password", args.Label, args.Value ?? new object()) + if (serviceFactory.Create(args, args.Label, args.Value ?? "") is ItemPasswordEntryViewModel viewModel) { return Task.FromResult(viewModel); diff --git a/Bitvault/ItemSectionViewModel.cs b/Bitvault/ItemSectionViewModel.cs index 05660f8..ecdbc4b 100644 --- a/Bitvault/ItemSectionViewModel.cs +++ b/Bitvault/ItemSectionViewModel.cs @@ -4,14 +4,15 @@ using Toolkit.Foundation; namespace Bitvault; [Notification(typeof(CreateEventArgs), nameof(Section))] -public partial class ItemSectionViewModel(IServiceProvider provider, +public partial class ItemSectionViewModel(ICollectionSynchronizer synchronizer, + IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, IContentTemplate template, - string section) : ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer) + string section) : ObservableCollection(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) { [ObservableProperty] private string section = section; diff --git a/Bitvault/ItemTextEntryViewModel.cs b/Bitvault/ItemTextEntryViewModel.cs index 8e356d4..35f0f1c 100644 --- a/Bitvault/ItemTextEntryViewModel.cs +++ b/Bitvault/ItemTextEntryViewModel.cs @@ -8,6 +8,7 @@ public partial class ItemTextEntryViewModel(IServiceProvider provider, IPublisher publisher, ISubscription subscriber, IDisposer disposer, + ICollectionSynchronization synchronization, + ItemEntryConfiguration configuration, string? key = default, - string? value = default) : Observable(provider, factory, mediator, publisher, subscriber, disposer, key, value), - IItemEntryViewModel; + 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 f14e5ad..6c3b893 100644 --- a/Bitvault/ItemTextEntryViewModelHandler.cs +++ b/Bitvault/ItemTextEntryViewModelHandler.cs @@ -8,7 +8,8 @@ public class ItemTextEntryViewModelHandler(IServiceFactory serviceFactory) : public Task Handle(TextEntryConfiguration args, CancellationToken cancellationToken) { - if (serviceFactory.Create(args.Label, args.Value ?? "") is ItemTextEntryViewModel viewModel) + if (serviceFactory.Create(args, args.Label, args.Value ?? "") + is ItemTextEntryViewModel viewModel) { return Task.FromResult(viewModel); } diff --git a/Bitvault/ItemViewModel.cs b/Bitvault/ItemViewModel.cs index ee1a23c..ff9e45b 100644 --- a/Bitvault/ItemViewModel.cs +++ b/Bitvault/ItemViewModel.cs @@ -29,7 +29,8 @@ public partial class ItemViewModel : [ObservableProperty] private bool fromCategory; - public ItemViewModel(IServiceProvider provider, + public ItemViewModel(ICollectionSynchronizer synchronizer, + IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, @@ -41,7 +42,7 @@ public partial class ItemViewModel : bool fromCategory = false, string name = "", bool favourite = false, - bool archived = false) : base(provider, factory, mediator, publisher, subscriber, disposer) + bool archived = false) : base(synchronizer,provider, factory, mediator, publisher, subscriber, disposer) { Template = template; Named = $"{named}"; diff --git a/Bitvault/LockerHeaderViewModel.cs b/Bitvault/LockerHeaderViewModel.cs index 085bf49..5d6e64a 100644 --- a/Bitvault/LockerHeaderViewModel.cs +++ b/Bitvault/LockerHeaderViewModel.cs @@ -2,14 +2,15 @@ namespace Bitvault; -public partial class LockerHeaderViewModel(IServiceProvider provider, +public partial class LockerHeaderViewModel(ICollectionSynchronizer synchronizer, + IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, IContentTemplate template) : - ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer), + ObservableCollection(synchronizer, provider, factory, mediator, publisher, subscriber, disposer), INotificationHandler> { public IContentTemplate Template { get; set; } = template; diff --git a/Bitvault/LockerNavigationViewModel.cs b/Bitvault/LockerNavigationViewModel.cs index bb19ce8..e5f7bf8 100644 --- a/Bitvault/LockerNavigationViewModel.cs +++ b/Bitvault/LockerNavigationViewModel.cs @@ -27,7 +27,8 @@ public partial class LockerNavigationViewModel : [ObservableProperty] private bool selected; - public LockerNavigationViewModel(IServiceProvider provider, + public LockerNavigationViewModel(ICollectionSynchronizer synchronizer, + IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, @@ -35,7 +36,7 @@ public partial class LockerNavigationViewModel : IDisposer disposer, IContentTemplate template, string name, - bool selected) : base(provider, factory, mediator, publisher, subscriber, disposer) + bool selected) : base(synchronizer,provider, factory, mediator, publisher, subscriber, disposer) { Template = template; Name = name; diff --git a/Bitvault/LockerStorageFactory.cs b/Bitvault/LockerStorageFactory.cs index ba6868b..38addac 100644 --- a/Bitvault/LockerStorageFactory.cs +++ b/Bitvault/LockerStorageFactory.cs @@ -6,7 +6,7 @@ using Toolkit.Foundation; namespace Bitvault; -public class LockerStorageFactory(IValueStore connection, +public class LockerStorageFactory(IDecoratorService connection, IHostEnvironment environment, IServiceProvider provider) : ILockerStorageFactory diff --git a/Bitvault/MainViewModel.cs b/Bitvault/MainViewModel.cs index d434a04..1e804f7 100644 --- a/Bitvault/MainViewModel.cs +++ b/Bitvault/MainViewModel.cs @@ -1,4 +1,5 @@ using CommunityToolkit.Mvvm.ComponentModel; +using Microsoft.Extensions.DependencyInjection; using Toolkit.Foundation; namespace Bitvault; @@ -10,14 +11,15 @@ public partial class MainViewModel : [ObservableProperty] private FooterViewModel footer; - public MainViewModel(IServiceProvider provider, + public MainViewModel(ICollectionSynchronizer synchronizer, + IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, IContentTemplate template, - FooterViewModel footer) : base(provider, factory, mediator, publisher, subscriber, disposer) + FooterViewModel footer) : base(synchronizer, provider, factory, mediator, publisher, subscriber, disposer) { Template = template; Footer = footer; diff --git a/Bitvault/ManageViewModel.cs b/Bitvault/ManageViewModel.cs index 3559420..46128d8 100644 --- a/Bitvault/ManageViewModel.cs +++ b/Bitvault/ManageViewModel.cs @@ -6,13 +6,14 @@ public partial class ManageViewModel : ObservableCollection, IMainNavigationViewModel { - public ManageViewModel(IServiceProvider provider, + public ManageViewModel(ICollectionSynchronizer synchronizer, + IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, ISubscription subscriber, IDisposer disposer, - IContentTemplate template) : base(provider, factory, mediator, publisher, subscriber, disposer) + IContentTemplate template) : base(synchronizer,provider, factory, mediator, publisher, subscriber, disposer) { Template = template; diff --git a/Bitvault/UnarchiveItemHandler.cs b/Bitvault/UnarchiveItemHandler.cs index b156956..db78507 100644 --- a/Bitvault/UnarchiveItemHandler.cs +++ b/Bitvault/UnarchiveItemHandler.cs @@ -4,7 +4,7 @@ using Toolkit.Foundation; namespace Bitvault; -public class UnarchiveItemHandler(IValueStore> valueStore, +public class UnarchiveItemHandler(IDecoratorService> decoratorService, IDbContextFactory dbContextFactory) : INotificationHandler> { @@ -12,7 +12,7 @@ public class UnarchiveItemHandler(IValueStore> valueStore, { try { - if (valueStore.Value is Item<(Guid, string)> item) + if (decoratorService.Value is Item<(Guid, string)> item) { (Guid id, string name) = item.Value; await Task.Run(async () => diff --git a/Bitvault/UnfavouriteItemHandler.cs b/Bitvault/UnfavouriteItemHandler.cs index 420d6e5..cd04389 100644 --- a/Bitvault/UnfavouriteItemHandler.cs +++ b/Bitvault/UnfavouriteItemHandler.cs @@ -1,7 +1,7 @@ using Toolkit.Foundation; namespace Bitvault; -public class UnfavouriteItemHandler(IValueStore> valueStore, +public class UnfavouriteItemHandler(IDecoratorService> decoratorService, IMediator mediator) : INotificationHandler> { @@ -9,7 +9,7 @@ public class UnfavouriteItemHandler(IValueStore> valueStore { try { - if (valueStore.Value is Item<(Guid, string)> item) + if (decoratorService.Value is Item<(Guid, string)> item) { (Guid id, string name) = item.Value; await mediator.Handle, bool>(new UpdateEventArgs<(Guid, int)>((id, 0)));