diff --git a/src/App/Abstractions/Services/IFolderService.cs b/src/App/Abstractions/Services/IFolderService.cs index 3b1c56ebd..9fcde5512 100644 --- a/src/App/Abstractions/Services/IFolderService.cs +++ b/src/App/Abstractions/Services/IFolderService.cs @@ -6,6 +6,7 @@ namespace Bit.App.Abstractions { public interface IFolderService { + Task GetByIdAsync(int id); Task> GetAllAsync(); Task SaveAsync(Folder folder); } diff --git a/src/App/Pages/VaultAddFolderPage.cs b/src/App/Pages/VaultAddFolderPage.cs index f845c874a..fbc35ce55 100644 --- a/src/App/Pages/VaultAddFolderPage.cs +++ b/src/App/Pages/VaultAddFolderPage.cs @@ -39,8 +39,9 @@ namespace Bit.App.Pages var folder = new Folder { - Name = new CipherString(nameEntry.Text) + Name = nameEntry.Text.Encrypt() }; + await folderService.SaveAsync(folder); await Navigation.PopAsync(); }, ToolbarItemOrder.Default, 0); diff --git a/src/App/Pages/VaultAddSitePage.cs b/src/App/Pages/VaultAddSitePage.cs index 904ea6552..8ed8dd3ab 100644 --- a/src/App/Pages/VaultAddSitePage.cs +++ b/src/App/Pages/VaultAddSitePage.cs @@ -16,10 +16,19 @@ namespace Bit.App.Pages { var cryptoService = Resolver.Resolve(); var siteService = Resolver.Resolve(); + var folderService = Resolver.Resolve(); + + var folders = folderService.GetAllAsync().GetAwaiter().GetResult().OrderBy(f => f.Name); var uriEntry = new Entry { Keyboard = Keyboard.Url }; var nameEntry = new Entry(); - var folderEntry = new Entry { }; + var folderPicker = new Picker { Title = "Folder" }; + folderPicker.Items.Add("(none)"); + folderPicker.SelectedIndex = 0; + foreach(var folder in folders) + { + folderPicker.Items.Add(folder.Name.Decrypt()); + } var usernameEntry = new Entry(); var passwordEntry = new Entry { IsPassword = true }; var notesEditor = new Editor(); @@ -30,7 +39,7 @@ namespace Bit.App.Pages stackLayout.Children.Add(new Label { Text = "Name" }); stackLayout.Children.Add(nameEntry); stackLayout.Children.Add(new Label { Text = "Folder" }); - stackLayout.Children.Add(folderEntry); + stackLayout.Children.Add(folderPicker); stackLayout.Children.Add(new Label { Text = "Username" }); stackLayout.Children.Add(usernameEntry); stackLayout.Children.Add(new Label { Text = "Password" }); @@ -64,9 +73,14 @@ namespace Bit.App.Pages Name = nameEntry.Text.Encrypt(), Username = usernameEntry.Text?.Encrypt(), Password = passwordEntry.Text?.Encrypt(), - Notes = notesEditor.Text?.Encrypt() + Notes = notesEditor.Text?.Encrypt(), }; + if(folderPicker.SelectedIndex > 0) + { + site.FolderId = folders.ElementAt(folderPicker.SelectedIndex - 1).Id; + } + await siteService.SaveAsync(site); await Navigation.PopAsync(); }, ToolbarItemOrder.Default, 0); diff --git a/src/App/Pages/VaultListPage.cs b/src/App/Pages/VaultListPage.cs index 770892b77..558e392f8 100644 --- a/src/App/Pages/VaultListPage.cs +++ b/src/App/Pages/VaultListPage.cs @@ -22,8 +22,18 @@ namespace Bit.App.Pages var addSiteToolBarItem = new ToolbarItem("+", null, async () => { - var addSitePage = new VaultAddSitePage(); - await Navigation.PushAsync(addSitePage); + var selection = await DisplayActionSheet("Add", "Cancel", null, "Add New Folder", "Add New Site"); + if(selection == "Add New Folder") + { + var addFolderPage = new VaultAddFolderPage(); + await Navigation.PushAsync(addFolderPage); + } + else + { + var addSitePage = new VaultAddSitePage(); + await Navigation.PushAsync(addSitePage); + + } }, ToolbarItemOrder.Default, 0); ToolbarItems.Add(addSiteToolBarItem); diff --git a/src/App/Services/FolderService.cs b/src/App/Services/FolderService.cs index 4c28116ce..b51f0717f 100644 --- a/src/App/Services/FolderService.cs +++ b/src/App/Services/FolderService.cs @@ -20,6 +20,12 @@ namespace Bit.App.Services _authService = authService; } + public new Task GetByIdAsync(int id) + { + var data = Connection.Table().Where(f => f.UserId == _authService.UserId && f.Id == id).FirstOrDefault(); + return Task.FromResult(new Folder(data)); + } + public new Task> GetAllAsync() { var data = Connection.Table().Where(f => f.UserId == _authService.UserId).Cast(); diff --git a/src/App/Services/SiteService.cs b/src/App/Services/SiteService.cs index 67b6429a6..9c2535b9c 100644 --- a/src/App/Services/SiteService.cs +++ b/src/App/Services/SiteService.cs @@ -11,13 +11,16 @@ namespace Bit.App.Services public class SiteService : Repository, ISiteService { private readonly IAuthService _authService; + private readonly IFolderService _folderService; public SiteService( ISqlService sqlService, - IAuthService authService) + IAuthService authService, + IFolderService folderService) : base(sqlService) { _authService = authService; + _folderService = folderService; } public new Task> GetAllAsync() @@ -31,6 +34,15 @@ namespace Bit.App.Services var data = new SiteData(site, _authService.UserId); data.RevisionDateTime = DateTime.UtcNow; + if(site.FolderId.HasValue && site.ServerFolderId == null) + { + var folder = await _folderService.GetByIdAsync(site.FolderId.Value); + if(folder != null) + { + site.ServerFolderId = folder.ServerId; + } + } + if(site.Id == 0) { await CreateAsync(data);