From 05a6cd4540860cb8880a82432a0c0bd2aae1d082 Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Thu, 6 Jun 2024 23:01:23 +0100 Subject: [PATCH] Initial support for masking --- Bitvault.Avalonia/ItemMaskedTextEntryView.axaml | 13 +------------ Bitvault.Avalonia/ItemMaskedTextEntryView.axaml.cs | 2 +- Bitvault.Avalonia/ItemNavigationView.axaml | 1 + Bitvault.Avalonia/ItemTextEntryView.axaml | 6 +++++- Bitvault/ItemConfiguration.cs | 13 ++++++++++--- Bitvault/ItemDropdownEntryViewModel.cs | 3 ++- Bitvault/ItemDropdownEntryViewModelHandler.cs | 2 +- Bitvault/ItemEntryViewModel.cs | 3 ++- Bitvault/ItemMaskedTextEntryViewModel.cs | 11 +++++++++-- Bitvault/ItemMaskedTextEntryViewModelHandler.cs | 2 +- Bitvault/ItemPasswordEntryViewModel.cs | 3 ++- Bitvault/ItemPasswordEntryViewModelHandler.cs | 2 +- Bitvault/ItemTextEntryViewModel.cs | 3 ++- Bitvault/ItemTextEntryViewModelHandler.cs | 2 +- ...ronizeItemContentFromCategoryViewModelHandler.cs | 2 +- Bitvault/SynchronizeItemContentViewModelHandler.cs | 2 +- 16 files changed, 41 insertions(+), 29 deletions(-) diff --git a/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml index 0d02a8d..5cdfec6 100644 --- a/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml +++ b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml @@ -6,17 +6,6 @@ x:DataType="vm:ItemMaskedTextEntryViewModel" Header="{Binding Key}"> - - - - - - - - - - - - + \ No newline at end of file diff --git a/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml.cs b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml.cs index dab8020..8439e2d 100644 --- a/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml.cs +++ b/Bitvault.Avalonia/ItemMaskedTextEntryView.axaml.cs @@ -5,7 +5,7 @@ namespace Bitvault.Avalonia public partial class ItemMaskedTextEntryView : SettingsExpander { - public ItemMaskedTextEntryView() => + public ItemMaskedTextEntryView() => InitializeComponent(); } } diff --git a/Bitvault.Avalonia/ItemNavigationView.axaml b/Bitvault.Avalonia/ItemNavigationView.axaml index 6de7b0f..490e22f 100644 --- a/Bitvault.Avalonia/ItemNavigationView.axaml +++ b/Bitvault.Avalonia/ItemNavigationView.axaml @@ -19,6 +19,7 @@ + diff --git a/Bitvault.Avalonia/ItemTextEntryView.axaml b/Bitvault.Avalonia/ItemTextEntryView.axaml index 6bb9d06..25d9a3d 100644 --- a/Bitvault.Avalonia/ItemTextEntryView.axaml +++ b/Bitvault.Avalonia/ItemTextEntryView.axaml @@ -6,12 +6,16 @@ x:DataType="vm:ItemTextEntryViewModel" Header="{Binding Key}"> - + + + + + diff --git a/Bitvault/ItemConfiguration.cs b/Bitvault/ItemConfiguration.cs index cfb455e..666dd8a 100644 --- a/Bitvault/ItemConfiguration.cs +++ b/Bitvault/ItemConfiguration.cs @@ -98,18 +98,25 @@ public record ItemConfiguration new DropdownEntryConfiguration { Label = "Type", + Values = ["American Express", "Discover", "Maestro", "Mastercard", "Visa"], }, new MaskedTextEntryConfiguration { - Label = "Card number" + Label = "Card number", + Pattern = "0000-0000-0000-0000", + Value = "____-____-____-____", }, new MaskedTextEntryConfiguration { - Label = "Expiry date" + Label = "Expiry date", + Pattern = "00/00", + Value = "__/__", }, new MaskedTextEntryConfiguration { - Label = "Card verification code" + Label = "Card verification code", + Pattern = "000", + Value = "___", }, } } diff --git a/Bitvault/ItemDropdownEntryViewModel.cs b/Bitvault/ItemDropdownEntryViewModel.cs index 795eca9..ddfa54e 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, + ItemState state, ItemEntryConfiguration configuration, string? key = default, - object? value = default) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, configuration, key, value); \ No newline at end of file + object? value = default) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value); \ No newline at end of file diff --git a/Bitvault/ItemDropdownEntryViewModelHandler.cs b/Bitvault/ItemDropdownEntryViewModelHandler.cs index 012110a..34e31f2 100644 --- a/Bitvault/ItemDropdownEntryViewModelHandler.cs +++ b/Bitvault/ItemDropdownEntryViewModelHandler.cs @@ -10,7 +10,7 @@ public class ItemDropdownEntryViewModelHandler(IServiceFactory serviceFactory) : { if (args.Value is DropdownEntryConfiguration configuration) { - if (serviceFactory.Create(configuration, configuration.Label, configuration.Value ?? "") + if (serviceFactory.Create([.. args.Parameters, configuration, configuration.Label, configuration.Value ?? ""]) is ItemDropdownEntryViewModel viewModel) { return Task.FromResult(viewModel); diff --git a/Bitvault/ItemEntryViewModel.cs b/Bitvault/ItemEntryViewModel.cs index 4b7fb76..c1ebc48 100644 --- a/Bitvault/ItemEntryViewModel.cs +++ b/Bitvault/ItemEntryViewModel.cs @@ -9,6 +9,7 @@ public partial class ItemEntryViewModel(IServiceProvider provider, IPublisher publisher, ISubscription subscriber, IDisposer disposer, + ItemState state, ItemEntryConfiguration configuration, string? key = default, object? value = default) : @@ -19,7 +20,7 @@ public partial class ItemEntryViewModel(IServiceProvider provider, INotificationHandler> { [ObservableProperty] - private ItemState state = ItemState.Read; + private ItemState state = state; protected override void OnValueChanged() => configuration.Value = Value; diff --git a/Bitvault/ItemMaskedTextEntryViewModel.cs b/Bitvault/ItemMaskedTextEntryViewModel.cs index b472804..5753b68 100644 --- a/Bitvault/ItemMaskedTextEntryViewModel.cs +++ b/Bitvault/ItemMaskedTextEntryViewModel.cs @@ -1,4 +1,5 @@ -using Toolkit.Foundation; +using CommunityToolkit.Mvvm.ComponentModel; +using Toolkit.Foundation; namespace Bitvault; @@ -8,6 +9,12 @@ public partial class ItemMaskedTextEntryViewModel(IServiceProvider provider, IPublisher publisher, ISubscription subscriber, IDisposer disposer, + ItemState state, ItemEntryConfiguration configuration, + string? pattern, string? key = default, - object? value = default) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, configuration, key, value); \ No newline at end of file + object? value = default) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value) +{ + [ObservableProperty] + private string? pattern = pattern; +} \ No newline at end of file diff --git a/Bitvault/ItemMaskedTextEntryViewModelHandler.cs b/Bitvault/ItemMaskedTextEntryViewModelHandler.cs index 29c7f0d..165f730 100644 --- a/Bitvault/ItemMaskedTextEntryViewModelHandler.cs +++ b/Bitvault/ItemMaskedTextEntryViewModelHandler.cs @@ -10,7 +10,7 @@ public class ItemMaskedTextEntryViewModelHandler(IServiceFactory serviceFactory) { if (args.Value is MaskedTextEntryConfiguration configuration) { - if (serviceFactory.Create(configuration, configuration.Label, configuration.Value ?? "") + if (serviceFactory.Create([.. args.Parameters, configuration, configuration.Pattern, configuration.Label, configuration.Value]) is ItemMaskedTextEntryViewModel viewModel) { return Task.FromResult(viewModel); diff --git a/Bitvault/ItemPasswordEntryViewModel.cs b/Bitvault/ItemPasswordEntryViewModel.cs index 90c92fe..7b415c5 100644 --- a/Bitvault/ItemPasswordEntryViewModel.cs +++ b/Bitvault/ItemPasswordEntryViewModel.cs @@ -8,6 +8,7 @@ public partial class ItemPasswordEntryViewModel(IServiceProvider provider, IPublisher publisher, ISubscription subscriber, IDisposer disposer, + ItemState state, ItemEntryConfiguration configuration, string? key = default, - object? value = default) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, configuration, key, value); \ No newline at end of file + object? value = default) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value); \ No newline at end of file diff --git a/Bitvault/ItemPasswordEntryViewModelHandler.cs b/Bitvault/ItemPasswordEntryViewModelHandler.cs index 295e019..fe8da09 100644 --- a/Bitvault/ItemPasswordEntryViewModelHandler.cs +++ b/Bitvault/ItemPasswordEntryViewModelHandler.cs @@ -10,7 +10,7 @@ public class ItemPasswordEntryViewModelHandler(IServiceFactory serviceFactory) : { if (args.Value is PasswordEntryConfiguration configuration) { - if (serviceFactory.Create(configuration, configuration.Label, configuration.Value ?? "") + if (serviceFactory.Create([.. args.Parameters, configuration, configuration.Label, configuration.Value ?? ""]) is ItemPasswordEntryViewModel viewModel) { return Task.FromResult(viewModel); diff --git a/Bitvault/ItemTextEntryViewModel.cs b/Bitvault/ItemTextEntryViewModel.cs index 1e66169..bfdc832 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, + ItemState state, ItemEntryConfiguration configuration, string? key = default, - object? value = default) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, configuration, key, value); \ No newline at end of file + object? value = default) : ItemEntryViewModel(provider, factory, mediator, publisher, subscriber, disposer, state, configuration, key, value); \ No newline at end of file diff --git a/Bitvault/ItemTextEntryViewModelHandler.cs b/Bitvault/ItemTextEntryViewModelHandler.cs index 946aa54..4d30ba0 100644 --- a/Bitvault/ItemTextEntryViewModelHandler.cs +++ b/Bitvault/ItemTextEntryViewModelHandler.cs @@ -10,7 +10,7 @@ public class ItemTextEntryViewModelHandler(IServiceFactory serviceFactory) : { if (args.Value is TextEntryConfiguration configuration) { - if (serviceFactory.Create(configuration, configuration.Label, configuration.Value ?? "") + if (serviceFactory.Create([.. args.Parameters, configuration, configuration.Label, configuration.Value ?? ""]) is ItemTextEntryViewModel viewModel) { return Task.FromResult(viewModel); diff --git a/Bitvault/SynchronizeItemContentFromCategoryViewModelHandler.cs b/Bitvault/SynchronizeItemContentFromCategoryViewModelHandler.cs index ed76780..04b9d4b 100644 --- a/Bitvault/SynchronizeItemContentFromCategoryViewModelHandler.cs +++ b/Bitvault/SynchronizeItemContentFromCategoryViewModelHandler.cs @@ -31,7 +31,7 @@ public class SynchronizeItemContentFromCategoryViewModelHandler(IItemConfigurati 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 (constructor?.Invoke(new object[] { entryConfiguration, new object[] { ItemState.New } }) is object message) { if (await mediator.Handle(message, entryConfiguration.GetType().Name) is IItemEntryViewModel entryViewModel) diff --git a/Bitvault/SynchronizeItemContentViewModelHandler.cs b/Bitvault/SynchronizeItemContentViewModelHandler.cs index 9d715c2..42b7bfc 100644 --- a/Bitvault/SynchronizeItemContentViewModelHandler.cs +++ b/Bitvault/SynchronizeItemContentViewModelHandler.cs @@ -34,7 +34,7 @@ public class SynchronizeItemContentViewModelHandler(IDecoratorService).MakeGenericType(entryConfiguration.GetType()); ConstructorInfo? constructor = messageType.GetConstructor([entryConfiguration.GetType(), typeof(object[])]); - if (constructor?.Invoke(new object[] { entryConfiguration, new object[] { sectionViewModel } }) is object message) + if (constructor?.Invoke(new object[] { entryConfiguration, new object[] { ItemState.Read } }) is object message) { if (await mediator.Handle(message, entryConfiguration.GetType().Name) is IItemEntryViewModel entryViewModel)