diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index b67f9ca9d7f..a026e6d0aeb 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -485,6 +485,9 @@ "searchFolder": { "message": "Search folder" }, + "searchCollection": { + "message": "Search collection" + }, "noneFolder": { "message": "No Folder", "description": "This is the folder for uncategorized items" diff --git a/src/background.js b/src/background.js index 6a6ba511d5f..17a8a451521 100644 --- a/src/background.js +++ b/src/background.js @@ -109,7 +109,7 @@ var bg_isBackground = true, window.bg_cipherService = bg_cipherService = new CipherService(bg_cryptoService, bg_userService, bg_settingsService, bg_apiService); window.bg_folderService = bg_folderService = new FolderService(bg_cryptoService, bg_userService, bg_i18nService, bg_apiService); window.bg_collectionService = bg_collectionService = new CollectionService(bg_cryptoService, bg_userService, bg_i18nService, bg_apiService); - window.bg_lockService = bg_lockService = new LockService(bg_cipherService, bg_folderService, bg_cryptoService, bg_utilsService, setIcon, refreshBadgeAndMenu); + window.bg_lockService = bg_lockService = new LockService(bg_cipherService, bg_folderService, bg_collectionService, bg_cryptoService, bg_utilsService, setIcon, refreshBadgeAndMenu); window.bg_syncService = bg_syncService = new SyncService(bg_userService, bg_apiService, bg_settingsService, bg_folderService, bg_cipherService, bg_cryptoService, bg_collectionService, logout); window.bg_passwordGenerationService = bg_passwordGenerationService = new PasswordGenerationService(bg_cryptoService); window.bg_totpService = bg_totpService = new TotpService(); diff --git a/src/popup/app/app.js b/src/popup/app/app.js index ebe6da44be6..8d493f1d93b 100644 --- a/src/popup/app/app.js +++ b/src/popup/app/app.js @@ -110,7 +110,7 @@ require('./accounts/accountsHintController.js'); require('./accounts/accountsRegisterController.js'); require('./vault/vaultModule.js'); require('./vault/vaultController.js'); -require('./vault/vaultViewFolderController.js'); +require('./vault/vaultViewGroupingController.js'); require('./vault/vaultAddCipherController.js'); require('./vault/vaultEditCipherController.js'); require('./vault/vaultViewCipherController.js'); diff --git a/src/popup/app/config.js b/src/popup/app/config.js index b2aa814780c..c0c253f4478 100644 --- a/src/popup/app/config.js +++ b/src/popup/app/config.js @@ -128,10 +128,10 @@ angular component: 'tools' }) - .state('viewFolder', { - url: '/view-folder?folderId', - template: require('./vault/views/vaultViewFolder.html'), - controller: 'vaultViewFolderController', + .state('viewGrouping', { + url: '/view-grouping?folderId&collectionId', + template: require('./vault/views/vaultViewGrouping.html'), + controller: 'vaultViewGroupingController', data: { authorize: true }, params: { animation: null, from: 'vault' } }) @@ -273,7 +273,7 @@ angular if ($state.current.name.indexOf('tabs.') > -1 && toState.name.indexOf('tabs.') > -1) { stateService.removeState('vault'); - stateService.removeState('viewFolder'); + stateService.removeState('viewGrouping'); } const userService = trans.injector().get('userService'); diff --git a/src/popup/app/vault/vaultAddCipherController.js b/src/popup/app/vault/vaultAddCipherController.js index 6808b5dd7cc..4c9d506f6bf 100644 --- a/src/popup/app/vault/vaultAddCipherController.js +++ b/src/popup/app/vault/vaultAddCipherController.js @@ -8,7 +8,7 @@ angular $scope.addFieldType = constantsService.fieldType.text.toString(); $scope.selectedType = constantsService.cipherType.login.toString(); var from = $stateParams.from, - folderId = $stateParams.folderId; + folderId = $stateParams.folderId && $stateParams.folderId !== '0' ? $stateParams.folderId : null; $scope.cipher = { folderId: folderId, @@ -76,10 +76,9 @@ angular animation: 'out-slide-down' }); } - else if (from === 'folder') { - $state.go('viewFolder', { - animation: 'out-slide-down', - folderId: folderId + else if (from === 'grouping') { + $state.go('viewGrouping', { + animation: 'out-slide-down' }); } else { diff --git a/src/popup/app/vault/vaultController.js b/src/popup/app/vault/vaultController.js index a3629dddd4a..c5cab2ee469 100644 --- a/src/popup/app/vault/vaultController.js +++ b/src/popup/app/vault/vaultController.js @@ -172,10 +172,11 @@ angular }, 200); }; - $scope.viewGrouping = function (grouping) { + $scope.viewGrouping = function (grouping, folder) { storeState(); - $state.go('viewFolder', { - folderId: grouping.id || '0', + $state.go('viewGrouping', { + folderId: (folder && grouping.id) || '0', + collectionId: (!folder && grouping.id) || '0', animation: 'in-slide-left' }); }; diff --git a/src/popup/app/vault/vaultViewCipherController.js b/src/popup/app/vault/vaultViewCipherController.js index efbd84b6dc5..cc01df3bef7 100644 --- a/src/popup/app/vault/vaultViewCipherController.js +++ b/src/popup/app/vault/vaultViewCipherController.js @@ -76,8 +76,8 @@ angular animation: 'out-slide-down' }); } - else if (from === 'folder') { - $state.go('viewFolder', { + else if (from === 'grouping') { + $state.go('viewGrouping', { animation: 'out-slide-down' }); } diff --git a/src/popup/app/vault/vaultViewFolderController.js b/src/popup/app/vault/vaultViewGroupingController.js similarity index 73% rename from src/popup/app/vault/vaultViewFolderController.js rename to src/popup/app/vault/vaultViewGroupingController.js index 9221e5aab3e..0b0c3713eee 100644 --- a/src/popup/app/vault/vaultViewFolderController.js +++ b/src/popup/app/vault/vaultViewGroupingController.js @@ -1,21 +1,34 @@ angular .module('bit.vault') - .controller('vaultViewFolderController', function ($scope, cipherService, folderService, $q, $state, $stateParams, toastr, - syncService, $analytics, i18nService, stateService, utilsService, $timeout, $window) { - var stateKey = 'viewFolder', + .controller('vaultViewGroupingController', function ($scope, cipherService, folderService, $q, $state, $stateParams, toastr, + syncService, $analytics, i18nService, stateService, utilsService, $timeout, $window, collectionService) { + var stateKey = 'viewGrouping', state = stateService.getState(stateKey) || {}; state.folderId = $stateParams.folderId || state.folderId; + state.collectionId = $stateParams.collectionId || state.collectionId; var pageSize = 100, - decFolder = null, + decGrouping = null, decCiphers = []; - $scope.folder = { - id: !state.folderId || state.folderId === '0' ? null : state.folderId, + $scope.grouping = { + id: null, name: i18nService.noneFolder }; + $scope.folderGrouping = false; + $scope.collectionGrouping = false; + + if (state.folderId && state.folderId !== '0') { + $scope.grouping.id = state.folderId; + $scope.folderGrouping = true; + } + else if (state.collectionId && state.collectionId !== '0') { + $scope.grouping.id = state.collectionId; + $scope.collectionGrouping = true; + } + $scope.i18n = i18nService; document.getElementById('search').focus(); @@ -28,32 +41,41 @@ angular function loadVault() { var promises = []; - if ($scope.folder.id) { - var getPromise = folderService.get($scope.folder.id).then(function (folder) { + if ($scope.grouping.id && $scope.folderGrouping) { + var getPromise = folderService.get($scope.grouping.id).then(function (folder) { return folder.decrypt(); }).then(function (model) { - decFolder = model; + decGrouping = model; + }); + promises.push(getPromise); + } + else if ($scope.grouping.id && $scope.collectionGrouping) { + var getPromise = collectionService.get($scope.grouping.id).then(function (collection) { + return collection.decrypt(); + }).then(function (model) { + decGrouping = model; }); promises.push(getPromise); } - var cipherPromise = cipherService.getAllDecryptedForFolder($scope.folder.id).then(function (ciphers) { - if (utilsService.isEdge()) { - // Edge is super slow at sorting - decCiphers = ciphers; - } - else { - decCiphers = ciphers.sort(cipherSort); - } - }); + var cipherPromise = cipherService.getAllDecryptedForGrouping($scope.grouping.id, $scope.folderGrouping) + .then(function (ciphers) { + if (utilsService.isEdge()) { + // Edge is super slow at sorting + decCiphers = ciphers; + } + else { + decCiphers = ciphers.sort(cipherSort); + } + }); promises.push(cipherPromise); $q.all(promises).then(function () { $scope.loaded = true; $scope.vaultCiphers = decCiphers; - if (decFolder) { - $scope.folder.name = decFolder.name; + if (decGrouping) { + $scope.grouping.name = decGrouping.name; } if (state.searchText) { @@ -153,8 +175,8 @@ angular storeState(); $state.go('addCipher', { animation: 'in-slide-up', - from: 'folder', - folderId: $scope.folder.id + from: 'grouping', + folderId: state.folderId }); }; @@ -178,7 +200,7 @@ angular $state.go('viewCipher', { cipherId: cipher.id, animation: 'in-slide-up', - from: 'folder' + from: 'grouping' }); // clean up diff --git a/src/popup/app/vault/views/vault.html b/src/popup/app/vault/views/vault.html index db54feb1765..d391fd1d066 100644 --- a/src/popup/app/vault/views/vault.html +++ b/src/popup/app/vault/views/vault.html @@ -39,7 +39,7 @@ {{vaultFolders.length}}