diff --git a/Bitvault.Avalonia/AddItemNavigationView.axaml b/Bitvault.Avalonia/AddItemNavigationView.axaml index 0965e33..b5c583d 100644 --- a/Bitvault.Avalonia/AddItemNavigationView.axaml +++ b/Bitvault.Avalonia/AddItemNavigationView.axaml @@ -1,6 +1,6 @@ - - - + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + Header="Add item" + IsClickEnabled="True" /> diff --git a/Bitvault.Avalonia/AddItemNavigationView.axaml.cs b/Bitvault.Avalonia/AddItemNavigationView.axaml.cs index b2e1b7c..59c5190 100644 --- a/Bitvault.Avalonia/AddItemNavigationView.axaml.cs +++ b/Bitvault.Avalonia/AddItemNavigationView.axaml.cs @@ -1,8 +1,10 @@ -using Avalonia.Controls; +using Toolkit.UI.Controls.Avalonia; namespace Bitvault.Avalonia; -public partial class AddItemNavigationView : UserControl +public partial class AddItemNavigationView : + SettingsExpander { - public AddItemNavigationView() => InitializeComponent(); + public AddItemNavigationView() => + InitializeComponent(); } diff --git a/Bitvault.Avalonia/App.axaml.cs b/Bitvault.Avalonia/App.axaml.cs index cbe7d5d..b496864 100644 --- a/Bitvault.Avalonia/App.axaml.cs +++ b/Bitvault.Avalonia/App.axaml.cs @@ -136,6 +136,13 @@ public partial class App : Application services.AddHandler(); services.AddHandler(); + services.AddTemplate(); + + services.AddTemplate(); + services.AddTemplate(); + services.AddTemplate(); + services.AddTemplate(); + services.AddTemplate("ItemCommandHeader"); services.AddTemplate(); @@ -146,11 +153,6 @@ public partial class App : Application services.AddTemplate(); services.AddTemplate(); - services.AddTemplate(); - services.AddTemplate(); - services.AddTemplate(); - services.AddTemplate(); - services.AddHandler(nameof(ItemState.Write)); services.AddHandler(nameof(ItemState.New)); diff --git a/Bitvault.Avalonia/ItemDropdownEntryView.axaml b/Bitvault.Avalonia/ItemDropdownEntryView.axaml index 51666c6..eaaa648 100644 --- a/Bitvault.Avalonia/ItemDropdownEntryView.axaml +++ b/Bitvault.Avalonia/ItemDropdownEntryView.axaml @@ -1,8 +1,11 @@ - - Welcome to Avalonia! - + + + + + \ No newline at end of file diff --git a/Bitvault.Avalonia/ItemDropdownEntryView.axaml.cs b/Bitvault.Avalonia/ItemDropdownEntryView.axaml.cs index cdcb0d6..0f21859 100644 --- a/Bitvault.Avalonia/ItemDropdownEntryView.axaml.cs +++ b/Bitvault.Avalonia/ItemDropdownEntryView.axaml.cs @@ -1,12 +1,10 @@ -using Avalonia.Controls; +using Toolkit.UI.Controls.Avalonia; -namespace Bitvault.Avalonia +namespace Bitvault.Avalonia; + +public partial class ItemDropdownEntryView : + SettingsExpander { - public partial class ItemDropdownEntryView : UserControl - { - public ItemDropdownEntryView() - { - InitializeComponent(); - } - } + public ItemDropdownEntryView() => + InitializeComponent(); } diff --git a/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml index 08628f8..9016933 100644 --- a/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml +++ b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml @@ -1,8 +1,11 @@ - - Welcome to Avalonia! - + + + + + \ No newline at end of file diff --git a/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml.cs b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml.cs index 9d7d161..dab8020 100644 --- a/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml.cs +++ b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml.cs @@ -1,12 +1,11 @@ -using Avalonia.Controls; +using Toolkit.UI.Controls.Avalonia; namespace Bitvault.Avalonia { - public partial class ItemMaskedTextEntryView : UserControl + public partial class ItemMaskedTextEntryView : + SettingsExpander { - public ItemMaskedTextEntryView() - { + public ItemMaskedTextEntryView() => InitializeComponent(); - } } } diff --git a/Bitvault.Avalonia/ItemPasswordEntryView.axaml b/Bitvault.Avalonia/ItemPasswordEntryView.axaml index 35401e4..90d20e0 100644 --- a/Bitvault.Avalonia/ItemPasswordEntryView.axaml +++ b/Bitvault.Avalonia/ItemPasswordEntryView.axaml @@ -1,8 +1,14 @@ - - Welcome to Avalonia! - + + + + + diff --git a/Bitvault.Avalonia/ItemPasswordEntryView.axaml.cs b/Bitvault.Avalonia/ItemPasswordEntryView.axaml.cs index 7a898cf..1bc3e63 100644 --- a/Bitvault.Avalonia/ItemPasswordEntryView.axaml.cs +++ b/Bitvault.Avalonia/ItemPasswordEntryView.axaml.cs @@ -1,12 +1,10 @@ -using Avalonia.Controls; +using Toolkit.UI.Controls.Avalonia; -namespace Bitvault.Avalonia +namespace Bitvault.Avalonia; + +public partial class ItemPasswordEntryView : + SettingsExpander { - public partial class ItemPasswordEntryView : UserControl - { - public ItemPasswordEntryView() - { - InitializeComponent(); - } - } + public ItemPasswordEntryView() => + InitializeComponent(); } diff --git a/Bitvault.Avalonia/ItemSectionView.axaml b/Bitvault.Avalonia/ItemSectionView.axaml new file mode 100644 index 0000000..4a6adf9 --- /dev/null +++ b/Bitvault.Avalonia/ItemSectionView.axaml @@ -0,0 +1,8 @@ + + + diff --git a/Bitvault.Avalonia/ItemSectionView.axaml.cs b/Bitvault.Avalonia/ItemSectionView.axaml.cs new file mode 100644 index 0000000..75d379a --- /dev/null +++ b/Bitvault.Avalonia/ItemSectionView.axaml.cs @@ -0,0 +1,10 @@ +using Avalonia.Controls; + +namespace Bitvault.Avalonia; + +public partial class ItemSectionView : + UserControl +{ + public ItemSectionView() => + InitializeComponent(); +} diff --git a/Bitvault.Avalonia/ItemTextEntryView.axaml b/Bitvault.Avalonia/ItemTextEntryView.axaml index bce68b6..7759ee8 100644 --- a/Bitvault.Avalonia/ItemTextEntryView.axaml +++ b/Bitvault.Avalonia/ItemTextEntryView.axaml @@ -1,8 +1,11 @@ - - Welcome to Avalonia! - + + + + + diff --git a/Bitvault.Avalonia/ItemTextEntryView.axaml.cs b/Bitvault.Avalonia/ItemTextEntryView.axaml.cs index 0b55188..f284bba 100644 --- a/Bitvault.Avalonia/ItemTextEntryView.axaml.cs +++ b/Bitvault.Avalonia/ItemTextEntryView.axaml.cs @@ -1,12 +1,10 @@ -using Avalonia.Controls; +using Toolkit.UI.Controls.Avalonia; -namespace Bitvault.Avalonia +namespace Bitvault.Avalonia; + +public partial class ItemTextEntryView : + SettingsExpander { - public partial class ItemTextEntryView : UserControl - { - public ItemTextEntryView() - { - InitializeComponent(); - } - } + public ItemTextEntryView() => + InitializeComponent(); } diff --git a/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs b/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs index 3883dc6..9c4cc5c 100644 --- a/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs +++ b/Bitvault/AggregateItemContentFromCategoryViewModelHandler.cs @@ -3,6 +3,7 @@ namespace Bitvault; public class AggregateItemContentFromCategoryViewModelHandler(IItemConfigurationCollection configurations, + IServiceFactory serviceFactory, IMediator mediator, IPublisher publisher) : INotificationHandler> @@ -15,12 +16,21 @@ public class AggregateItemContentFromCategoryViewModelHandler(IItemConfiguration { if (factory.Invoke() is ItemConfiguration configuration) { + int index = 0; + foreach (ItemSectionConfiguration section in configuration.Sections) { - foreach (ItemEntryConfiguration entryConfiguration in section.Entries) + if (serviceFactory.Create($"{nameof(ItemSection)}{index}") is ItemSectionViewModel sectionViewModel) { - var dod = await mediator.Handle(entryConfiguration, - entryConfiguration.GetType().Name); + publisher.Publish(Create.As(sectionViewModel), nameof(ItemContentViewModel)); + foreach (ItemEntryConfiguration entryConfiguration in section.Entries) + { + if (await mediator.Handle(entryConfiguration, + entryConfiguration.GetType().Name) is IItemEntryViewModel entryViewModel) + { + publisher.Publish(Create.As(entryViewModel), $"{nameof(ItemSection)}{index}"); + } + } } } } diff --git a/Bitvault/ConfirmCreateItemHandler.cs b/Bitvault/ConfirmCreateItemHandler.cs index 4e2fe7f..8b5777f 100644 --- a/Bitvault/ConfirmCreateItemHandler.cs +++ b/Bitvault/ConfirmCreateItemHandler.cs @@ -8,22 +8,16 @@ public class ConfirmCreateItemHandler(IMediator mediator, { public async Task Handle(ConfirmEventArgs args) { - ItemHeaderConfiguration? configuration = await mediator.Handle, - ItemHeaderConfiguration>(args); + string? name = await mediator.Handle, + string?>(args, nameof(ItemHeader)); - if (configuration is not null) + if (name is not null) { - publisher.Publish(Notify.As(configuration)); - Guid id = Guid.NewGuid(); - - string? name = configuration.Name; - string? category = configuration.Name; - publisher.Publish(Created.As(new Item<(Guid, string)>((id, name)))); await mediator.Handle, bool>(new CreateEventArgs<(Guid, string, string, ItemConfiguration)>((id, name, category, + ItemConfiguration)>, bool>(new CreateEventArgs<(Guid, string, string, ItemConfiguration)>((id, name, "", new ItemConfiguration()))); } } diff --git a/Bitvault/ItemCollectionViewModel.cs b/Bitvault/ItemCollectionViewModel.cs index 6e01523..372a48a 100644 --- a/Bitvault/ItemCollectionViewModel.cs +++ b/Bitvault/ItemCollectionViewModel.cs @@ -3,7 +3,6 @@ using Toolkit.Foundation; namespace Bitvault; -[Notification(typeof(AggerateEventArgs), nameof(ItemCollectionViewModel))] [Notification(typeof(CreateEventArgs), nameof(ItemCollectionViewModel))] [Notification(typeof(InsertEventArgs), nameof(ItemCollectionViewModel))] [Notification(typeof(MoveToEventArgs), nameof(ItemCollectionViewModel))] diff --git a/Bitvault/ItemConfiguration.cs b/Bitvault/ItemConfiguration.cs index abb81e3..cfb455e 100644 --- a/Bitvault/ItemConfiguration.cs +++ b/Bitvault/ItemConfiguration.cs @@ -44,13 +44,25 @@ public record ItemConfiguration } }; - public static ItemConfiguration Login => new() { Sections = new List { - + new() + { + Entries = new List + { + new TextEntryConfiguration + { + Label = "Username" + }, + new PasswordEntryConfiguration + { + Label = "Password" + } + } + } } }; @@ -58,7 +70,16 @@ public record ItemConfiguration { Sections = new List { - + new() + { + Entries = new List + { + new PasswordEntryConfiguration + { + Label = "Password" + } + } + } } }; diff --git a/Bitvault/ItemContent.cs b/Bitvault/ItemContent.cs new file mode 100644 index 0000000..fc80092 --- /dev/null +++ b/Bitvault/ItemContent.cs @@ -0,0 +1,3 @@ +namespace Bitvault; + +public record ItemContent; \ No newline at end of file diff --git a/Bitvault/ItemContentViewModel.cs b/Bitvault/ItemContentViewModel.cs index 85a15c6..393c780 100644 --- a/Bitvault/ItemContentViewModel.cs +++ b/Bitvault/ItemContentViewModel.cs @@ -2,6 +2,7 @@ namespace Bitvault; +[Notification(typeof(CreateEventArgs), nameof(ItemContentViewModel))] public partial class ItemContentViewModel(IServiceProvider provider, IServiceFactory factory, IMediator mediator, IPublisher publisher, @@ -9,7 +10,7 @@ public partial class ItemContentViewModel(IServiceProvider provider, IDisposer disposer, IContentTemplate template, ItemState state = ItemState.Read) : - ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer), + ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer), IItemEntryViewModel, INotificationHandler>> { diff --git a/Bitvault/ItemDropdownEntryViewModel.cs b/Bitvault/ItemDropdownEntryViewModel.cs index 14c4681..a809efb 100644 --- a/Bitvault/ItemDropdownEntryViewModel.cs +++ b/Bitvault/ItemDropdownEntryViewModel.cs @@ -7,6 +7,7 @@ public partial class ItemDropdownEntryViewModel(IServiceProvider provider, IMediator mediator, IPublisher publisher, ISubscription subscriber, - IDisposer disposer) : - Observable(provider, factory, mediator, publisher, subscriber, disposer), + IDisposer disposer, + string? key = default, + object? value = default) : Observable(provider, factory, mediator, publisher, subscriber, disposer, key, value), IItemEntryViewModel; diff --git a/Bitvault/ItemDropdownEntryViewModelHandler.cs b/Bitvault/ItemDropdownEntryViewModelHandler.cs index df6379a..4e54ce7 100644 --- a/Bitvault/ItemDropdownEntryViewModelHandler.cs +++ b/Bitvault/ItemDropdownEntryViewModelHandler.cs @@ -8,7 +8,7 @@ public class ItemDropdownEntryViewModelHandler(IServiceFactory serviceFactory) : public Task Handle(DropdownEntryConfiguration args, CancellationToken cancellationToken) { - if (serviceFactory.Create() is ItemDropdownEntryViewModel viewModel) + if (serviceFactory.Create(args.Label, args.Value ?? new object()) is ItemDropdownEntryViewModel viewModel) { return Task.FromResult(viewModel); } diff --git a/Bitvault/ItemHeader.cs b/Bitvault/ItemHeader.cs new file mode 100644 index 0000000..59669bd --- /dev/null +++ b/Bitvault/ItemHeader.cs @@ -0,0 +1,3 @@ +namespace Bitvault; + +public record ItemHeader; \ No newline at end of file diff --git a/Bitvault/ItemHeaderViewModel.cs b/Bitvault/ItemHeaderViewModel.cs index 685ac64..9307d80 100644 --- a/Bitvault/ItemHeaderViewModel.cs +++ b/Bitvault/ItemHeaderViewModel.cs @@ -3,9 +3,11 @@ using Toolkit.Foundation; namespace Bitvault; -public partial class ItemHeaderViewModel : Observable, +[Notification(typeof(ConfirmEventArgs), nameof(ItemHeader))] +public partial class ItemHeaderViewModel : + Observable, IHandler, bool>, - IHandler, ItemHeaderConfiguration>, + IHandler, string?>, INotificationHandler>, INotificationHandler>, INotificationHandler>, @@ -38,9 +40,6 @@ public partial class ItemHeaderViewModel : Observable, return Task.FromResult(true); } - public Task Handle(ConfirmEventArgs args, - CancellationToken cancellationToken) => Task.FromResult(new ItemHeaderConfiguration { Name = Value! }); - public Task Handle(UpdateEventArgs args) => Task.FromResult(State = ItemState.Write); @@ -69,4 +68,7 @@ public partial class ItemHeaderViewModel : Observable, return Task.CompletedTask; } + + 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 2a41556..5dc40b1 100644 --- a/Bitvault/ItemMaskedTextEntryViewModel.cs +++ b/Bitvault/ItemMaskedTextEntryViewModel.cs @@ -7,5 +7,7 @@ public partial class ItemMaskedTextEntryViewModel(IServiceProvider provider, IMediator mediator, IPublisher publisher, ISubscription subscriber, - IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer), - IItemEntryViewModel; \ No newline at end of file + IDisposer disposer, + string? key = default, + object? value = default) : Observable(provider, factory, mediator, publisher, subscriber, disposer, key, value), + IItemEntryViewModel; diff --git a/Bitvault/ItemMaskedTextEntryViewModelHandler.cs b/Bitvault/ItemMaskedTextEntryViewModelHandler.cs index 5c12ad7..d0c3e58 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() is ItemMaskedTextEntryViewModel viewModel) + if (serviceFactory.Create(args.Label, args.Value ?? new object()) is ItemMaskedTextEntryViewModel viewModel) { return Task.FromResult(viewModel); } diff --git a/Bitvault/ItemPasswordEntryViewModel.cs b/Bitvault/ItemPasswordEntryViewModel.cs index d5a6a2f..84a6d84 100644 --- a/Bitvault/ItemPasswordEntryViewModel.cs +++ b/Bitvault/ItemPasswordEntryViewModel.cs @@ -7,5 +7,7 @@ public partial class ItemPasswordEntryViewModel(IServiceProvider provider, IMediator mediator, IPublisher publisher, ISubscription subscriber, - IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer), - IItemEntryViewModel; \ No newline at end of file + IDisposer disposer, + string? key = default, + object? value = default) : Observable(provider, factory, mediator, publisher, subscriber, disposer, key, value), + IItemEntryViewModel; diff --git a/Bitvault/ItemPasswordEntryViewModelHandler.cs b/Bitvault/ItemPasswordEntryViewModelHandler.cs index a3177f2..b61b6a6 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() is ItemPasswordEntryViewModel viewModel) + if (serviceFactory.Create(args.Label, args.Value ?? new object()) is ItemPasswordEntryViewModel viewModel) { return Task.FromResult(viewModel); } diff --git a/Bitvault/ItemSection.cs b/Bitvault/ItemSection.cs new file mode 100644 index 0000000..bbb8d06 --- /dev/null +++ b/Bitvault/ItemSection.cs @@ -0,0 +1,3 @@ +namespace Bitvault; + +public record ItemSection; \ No newline at end of file diff --git a/Bitvault/ItemSectionViewModel.cs b/Bitvault/ItemSectionViewModel.cs new file mode 100644 index 0000000..b3540f7 --- /dev/null +++ b/Bitvault/ItemSectionViewModel.cs @@ -0,0 +1,17 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using Toolkit.Foundation; + +namespace Bitvault; + +[Notification(typeof(CreateEventArgs), nameof(Section))] +public partial class ItemSectionViewModel(IServiceProvider provider, + IServiceFactory factory, + IMediator mediator, + IPublisher publisher, + ISubscription subscriber, + IDisposer disposer, + string section) : ObservableCollection(provider, factory, mediator, publisher, subscriber, disposer) +{ + [ObservableProperty] + private string section = section; +} diff --git a/Bitvault/ItemTextEntryViewModel.cs b/Bitvault/ItemTextEntryViewModel.cs index 1150ac2..8e356d4 100644 --- a/Bitvault/ItemTextEntryViewModel.cs +++ b/Bitvault/ItemTextEntryViewModel.cs @@ -7,5 +7,7 @@ public partial class ItemTextEntryViewModel(IServiceProvider provider, IMediator mediator, IPublisher publisher, ISubscription subscriber, - IDisposer disposer) : Observable(provider, factory, mediator, publisher, subscriber, disposer), - IItemEntryViewModel; \ No newline at end of file + IDisposer disposer, + string? key = default, + string? value = default) : Observable(provider, factory, mediator, publisher, subscriber, disposer, key, value), + IItemEntryViewModel; diff --git a/Bitvault/ItemTextEntryViewModelHandler.cs b/Bitvault/ItemTextEntryViewModelHandler.cs index 022d673..f14e5ad 100644 --- a/Bitvault/ItemTextEntryViewModelHandler.cs +++ b/Bitvault/ItemTextEntryViewModelHandler.cs @@ -8,7 +8,7 @@ public class ItemTextEntryViewModelHandler(IServiceFactory serviceFactory) : public Task Handle(TextEntryConfiguration args, CancellationToken cancellationToken) { - if (serviceFactory.Create() is ItemTextEntryViewModel viewModel) + if (serviceFactory.Create(args.Label, args.Value ?? "") is ItemTextEntryViewModel viewModel) { return Task.FromResult(viewModel); }