manage URIS on add/edit

This commit is contained in:
Kyle Spearrin 2019-05-08 16:49:32 -04:00
parent 8d0dc2d230
commit 49c355e52f
3 changed files with 109 additions and 0 deletions

View File

@ -340,6 +340,51 @@
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
<StackLayout StyleClass="box" IsVisible="{Binding IsLogin}">
<StackLayout StyleClass="box-row-header">
<Label Text="{u:I18n URIs}"
StyleClass="box-header, box-header-platform" />
</StackLayout>
<controls:RepeaterView ItemsSource="{Binding Uris}">
<controls:RepeaterView.ItemTemplate>
<DataTemplate x:DataType="views:LoginUriView">
<StackLayout Spacing="0" Padding="0">
<Grid StyleClass="box-row">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Label
Text="{u:I18n URI}"
StyleClass="box-label"
Grid.Row="0"
Grid.Column="0" />
<Entry
Text="{Binding Uri}"
Keyboard="Url"
StyleClass="box-value"
Grid.Row="1"
Grid.Column="0" />
<controls:FaButton
StyleClass="box-row-button, box-row-button-platform"
Text="&#xf013;"
Command="{Binding BindingContext.UriOptionsCommand, Source={x:Reference _page}}"
CommandParameter="{Binding .}"
Grid.Row="0"
Grid.Column="1"
Grid.RowSpan="2" />
</Grid>
</StackLayout>
</DataTemplate>
</controls:RepeaterView.ItemTemplate>
</controls:RepeaterView>
<Button Text="{u:I18n NewUri}" StyleClass="box-button-row"
Clicked="NewUri_Clicked"></Button>
</StackLayout>
<StackLayout StyleClass="box"> <StackLayout StyleClass="box">
<StackLayout StyleClass="box-row-header"> <StackLayout StyleClass="box-row-header">
<Label Text="{u:I18n Notes}" <Label Text="{u:I18n Notes}"

View File

@ -56,5 +56,10 @@ namespace Bit.App.Pages
await _vm.SubmitAsync(); await _vm.SubmitAsync();
} }
} }
private void NewUri_Clicked(object sender, System.EventArgs e)
{
_vm.AddUri();
}
} }
} }

View File

@ -38,6 +38,17 @@ namespace Bit.App.Pages
nameof(ShowAttachments), nameof(ShowAttachments),
nameof(ShowIdentityAddress), nameof(ShowIdentityAddress),
}; };
private List<KeyValuePair<UriMatchType?, string>> _matchDetectionOptions =
new List<KeyValuePair<UriMatchType?, string>>
{
new KeyValuePair<UriMatchType?, string>(null, AppResources.Default),
new KeyValuePair<UriMatchType?, string>(UriMatchType.Domain, AppResources.BaseDomain),
new KeyValuePair<UriMatchType?, string>(UriMatchType.Host, AppResources.Host),
new KeyValuePair<UriMatchType?, string>(UriMatchType.StartsWith, AppResources.StartsWith),
new KeyValuePair<UriMatchType?, string>(UriMatchType.RegularExpression, AppResources.RegEx),
new KeyValuePair<UriMatchType?, string>(UriMatchType.Exact, AppResources.Exact),
new KeyValuePair<UriMatchType?, string>(UriMatchType.Never, AppResources.Never),
};
public AddEditPageViewModel() public AddEditPageViewModel()
{ {
@ -51,6 +62,8 @@ namespace Bit.App.Pages
TogglePasswordCommand = new Command(TogglePassword); TogglePasswordCommand = new Command(TogglePassword);
ToggleCardCodeCommand = new Command(ToggleCardCode); ToggleCardCodeCommand = new Command(ToggleCardCode);
CheckPasswordCommand = new Command(CheckPasswordAsync); CheckPasswordCommand = new Command(CheckPasswordAsync);
UriOptionsCommand = new Command<LoginUriView>(UriOptions);
Uris = new ExtendedObservableCollection<LoginUriView>();
TypeOptions = new List<KeyValuePair<string, CipherType>> TypeOptions = new List<KeyValuePair<string, CipherType>>
{ {
@ -102,6 +115,7 @@ namespace Bit.App.Pages
public Command TogglePasswordCommand { get; set; } public Command TogglePasswordCommand { get; set; }
public Command ToggleCardCodeCommand { get; set; } public Command ToggleCardCodeCommand { get; set; }
public Command CheckPasswordCommand { get; set; } public Command CheckPasswordCommand { get; set; }
public Command UriOptionsCommand { get; set; }
public string CipherId { get; set; } public string CipherId { get; set; }
public string OrganizationId { get; set; } public string OrganizationId { get; set; }
public string FolderId { get; set; } public string FolderId { get; set; }
@ -111,6 +125,7 @@ namespace Bit.App.Pages
public List<KeyValuePair<string, string>> CardBrandOptions { get; set; } public List<KeyValuePair<string, string>> CardBrandOptions { get; set; }
public List<KeyValuePair<string, string>> CardExpMonthOptions { get; set; } public List<KeyValuePair<string, string>> CardExpMonthOptions { get; set; }
public List<KeyValuePair<string, string>> IdentityTitleOptions { get; set; } public List<KeyValuePair<string, string>> IdentityTitleOptions { get; set; }
public ExtendedObservableCollection<LoginUriView> Uris { get; set; }
public int TypeSelectedIndex public int TypeSelectedIndex
{ {
get => _typeSelectedIndex; get => _typeSelectedIndex;
@ -238,6 +253,11 @@ namespace Bit.App.Pages
IdentityTitleSelectedIndex = 0; IdentityTitleSelectedIndex = 0;
// TODO: org/collection stuff // TODO: org/collection stuff
} }
if(Cipher.Login.Uris != null)
{
Uris.ResetWithRange(Cipher.Login.Uris);
}
} }
public async Task<bool> SubmitAsync() public async Task<bool> SubmitAsync()
@ -250,6 +270,7 @@ namespace Bit.App.Pages
return false; return false;
} }
Cipher.Login.Uris = Uris.ToList();
if(!EditMode && Cipher.Type == CipherType.Login && (Cipher.Login.Uris?.Count ?? 0) == 1 && if(!EditMode && Cipher.Type == CipherType.Login && (Cipher.Login.Uris?.Count ?? 0) == 1 &&
string.IsNullOrWhiteSpace(Cipher.Login.Uris.First().Uri)) string.IsNullOrWhiteSpace(Cipher.Login.Uris.First().Uri))
{ {
@ -312,6 +333,44 @@ namespace Bit.App.Pages
// TODO: push modal for generate page // TODO: push modal for generate page
} }
public async void UriOptions(LoginUriView uri)
{
if(!(Page as AddEditPage).DoOnce())
{
return;
}
var selection = await Page.DisplayActionSheet(AppResources.Options, AppResources.Cancel, null,
AppResources.MatchDetection, AppResources.Remove);
if(selection == AppResources.Remove)
{
Uris.Remove(uri);
}
else if(selection == AppResources.MatchDetection)
{
var options = _matchDetectionOptions.Select(o => o.Key == uri.Match ? $"✓ {o.Value}" : o.Value);
var matchSelection = await Page.DisplayActionSheet(AppResources.URIMatchDetection,
AppResources.Cancel, null, options.ToArray());
if(matchSelection != null && matchSelection != AppResources.Cancel)
{
var matchSelectionClean = matchSelection.Replace("✓ ", string.Empty);
uri.Match = _matchDetectionOptions.FirstOrDefault(o => o.Value == matchSelectionClean).Key;
}
}
}
public void AddUri()
{
if(Cipher.Type != CipherType.Login)
{
return;
}
if(Uris == null)
{
Uris = new ExtendedObservableCollection<LoginUriView>();
}
Uris.Add(new LoginUriView());
}
public void TogglePassword() public void TogglePassword()
{ {
ShowPassword = !ShowPassword; ShowPassword = !ShowPassword;