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);
}