From 018a7c9f960ef7fd3700c829685da1340a3f4aa3 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Mon, 13 May 2019 14:43:23 -0400 Subject: [PATCH] generator UI elements --- src/App/Pages/Generator/GeneratorPage.xaml | 193 +++++++++++++++--- .../Pages/Generator/GeneratorPageViewModel.cs | 193 ++++++++++++++++-- src/App/Styles/Base.xaml | 7 + 3 files changed, 351 insertions(+), 42 deletions(-) diff --git a/src/App/Pages/Generator/GeneratorPage.xaml b/src/App/Pages/Generator/GeneratorPage.xaml index 2989518d0..58a52cd46 100644 --- a/src/App/Pages/Generator/GeneratorPage.xaml +++ b/src/App/Pages/Generator/GeneratorPage.xaml @@ -22,35 +22,174 @@ Order="Secondary" /> - - - - - - + + + + + + + + + + + + + + - - - - - + diff --git a/src/App/Pages/Generator/GeneratorPageViewModel.cs b/src/App/Pages/Generator/GeneratorPageViewModel.cs index 2504a8b89..faef96ffe 100644 --- a/src/App/Pages/Generator/GeneratorPageViewModel.cs +++ b/src/App/Pages/Generator/GeneratorPageViewModel.cs @@ -2,9 +2,7 @@ using Bit.Core.Abstractions; using Bit.Core.Models.Domain; using Bit.Core.Utilities; -using System; using System.Collections.Generic; -using System.Text; using System.Threading.Tasks; namespace Bit.App.Pages @@ -17,7 +15,18 @@ namespace Bit.App.Pages private PasswordGenerationOptions _options; private string _password; private bool _isPassword; + private bool _uppercase; + private bool _lowercase; + private bool _number; + private bool _special; + private bool _avoidAmbiguous; + private int _minNumber; + private int _minSpecial; + private int _length; + private int _numWords; + private string _wordSeparator; private int _typeSelectedIndex; + private bool _doneIniting; public GeneratorPageViewModel() { @@ -42,10 +51,134 @@ namespace Bit.App.Pages set => SetProperty(ref _isPassword, value); } - public PasswordGenerationOptions Options + public int Length { - get => _options; - set => SetProperty(ref _options, value); + get => _length; + set + { + if(SetProperty(ref _length, value)) + { + _options.Length = value; + var task = SaveOptionsAsync(); + } + } + } + + public bool Uppercase + { + get => _uppercase; + set + { + if(SetProperty(ref _uppercase, value)) + { + _options.Uppercase = value; + var task = SaveOptionsAsync(); + } + } + } + + public bool Lowercase + { + get => _lowercase; + set + { + if(SetProperty(ref _lowercase, value)) + { + _options.Lowercase = value; + var task = SaveOptionsAsync(); + } + } + } + + public bool Number + { + get => _number; + set + { + if(SetProperty(ref _number, value)) + { + _options.Number = value; + var task = SaveOptionsAsync(); + } + } + } + + public bool Special + { + get => _special; + set + { + if(SetProperty(ref _special, value)) + { + _options.Special = value; + var task = SaveOptionsAsync(); + } + } + } + + public bool AvoidAmbiguous + { + get => _avoidAmbiguous; + set + { + if(SetProperty(ref _avoidAmbiguous, value)) + { + _options.Ambiguous = !value; + var task = SaveOptionsAsync(); + } + } + } + + public int MinNumber + { + get => _minNumber; + set + { + if(SetProperty(ref _minNumber, value)) + { + _options.MinNumber = value; + var task = SaveOptionsAsync(); + } + } + } + + public int MinSpecial + { + get => _minSpecial; + set + { + if(SetProperty(ref _minSpecial, value)) + { + _options.MinSpecial = value; + var task = SaveOptionsAsync(); + } + } + } + + public int NumWords + { + get => _numWords; + set + { + if(SetProperty(ref _numWords, value)) + { + _options.NumWords = value; + var task = SaveOptionsAsync(); + } + } + } + + public string WordSeparator + { + get => _wordSeparator; + set + { + if(SetProperty(ref _wordSeparator, value)) + { + _options.WordSeparator = value; + var task = SaveOptionsAsync(); + } + } } public int TypeSelectedIndex @@ -55,29 +188,37 @@ namespace Bit.App.Pages { if(SetProperty(ref _typeSelectedIndex, value)) { - TypeChanged(); + IsPassword = value == 0; + var task = SaveOptionsAsync(); } } } public async Task InitAsync() { - Options = await _passwordGenerationService.GetOptionsAsync(); - TypeSelectedIndex = Options.Type == "passphrase" ? 1 : 0; - Password = await _passwordGenerationService.GeneratePasswordAsync(Options); + _options = await _passwordGenerationService.GetOptionsAsync(); + LoadFromOptions(); + Password = await _passwordGenerationService.GeneratePasswordAsync(_options); await _passwordGenerationService.AddHistoryAsync(Password); + _doneIniting = true; } public async Task RegenerateAsync() { - Password = await _passwordGenerationService.GeneratePasswordAsync(Options); + Password = await _passwordGenerationService.GeneratePasswordAsync(_options); await _passwordGenerationService.AddHistoryAsync(Password); } public async Task SaveOptionsAsync(bool regenerate = true) { - _passwordGenerationService.NormalizeOptions(Options); - await _passwordGenerationService.SaveOptionsAsync(Options); + if(!_doneIniting) + { + return; + } + SetOptions(); + _passwordGenerationService.NormalizeOptions(_options); + await _passwordGenerationService.SaveOptionsAsync(_options); + LoadFromOptions(); if(regenerate) { await RegenerateAsync(); @@ -90,11 +231,33 @@ namespace Bit.App.Pages _platformUtilsService.ShowToast("success", null, AppResources.CopiedPassword); } - public async void TypeChanged() + private void LoadFromOptions() { + AvoidAmbiguous = !_options.Ambiguous.GetValueOrDefault(); + TypeSelectedIndex = _options.Type == "passphrase" ? 1 : 0; IsPassword = TypeSelectedIndex == 0; - Options.Type = IsPassword ? "password" : "passphrase"; - await SaveOptionsAsync(); + MinNumber = _options.MinNumber.GetValueOrDefault(); + MinSpecial = _options.MinSpecial.GetValueOrDefault(); + Special = _options.Special.GetValueOrDefault(); + Number = _options.Number.GetValueOrDefault(); + NumWords = _options.NumWords.GetValueOrDefault(); + WordSeparator = _options.WordSeparator; + Uppercase = _options.Uppercase.GetValueOrDefault(); + Lowercase = _options.Lowercase.GetValueOrDefault(); + } + + private void SetOptions() + { + _options.Ambiguous = !AvoidAmbiguous; + _options.Type = TypeSelectedIndex == 1 ? "passphrase" : "password"; + _options.MinNumber = MinNumber; + _options.MinSpecial = MinSpecial; + _options.Special = Special; + _options.NumWords = NumWords; + _options.Number = Number; + _options.WordSeparator = WordSeparator; + _options.Uppercase = Uppercase; + _options.Lowercase = Lowercase; } } } diff --git a/src/App/Styles/Base.xaml b/src/App/Styles/Base.xaml index 970c84a1a..d3b65a237 100644 --- a/src/App/Styles/Base.xaml +++ b/src/App/Styles/Base.xaml @@ -257,6 +257,13 @@ +