mirror of
https://github.com/bitwarden/browser
synced 2025-12-22 11:13:46 +00:00
view grouping of ciphers for a collection
This commit is contained in:
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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'
|
||||
});
|
||||
};
|
||||
|
||||
@@ -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'
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -39,7 +39,7 @@
|
||||
<span>{{vaultFolders.length}}</span>
|
||||
</div>
|
||||
<div class="list-section-items">
|
||||
<a href="#" stop-click ng-click="viewGrouping(folder)" class="list-section-item"
|
||||
<a href="#" stop-click ng-click="viewGrouping(folder, true)" class="list-section-item"
|
||||
ng-repeat="folder in vaultFolders | orderBy: folderSort track by $index">
|
||||
<i class="fa fa-fw text-muted"
|
||||
ng-class="{'fa-folder-open': folder.id, 'fa-folder-open-o': !folder.id}"></i>
|
||||
@@ -55,7 +55,7 @@
|
||||
<span>{{vaultCollections.length}}</span>
|
||||
</div>
|
||||
<div class="list-section-items">
|
||||
<a href="#" stop-click ng-click="viewGrouping(collection)" class="list-section-item"
|
||||
<a href="#" stop-click ng-click="viewGrouping(collection, false)" class="list-section-item"
|
||||
ng-repeat="collection in vaultCollections | orderBy: ['name'] track by $index">
|
||||
<i class="fa fa-cube fa-fw text-muted"></i>
|
||||
{{collection.name}}
|
||||
|
||||
@@ -3,10 +3,11 @@
|
||||
<a ui-sref="tabs.vault({animation: 'out-slide-right'})"><i class="fa fa-chevron-left"></i> {{i18n.back}}</a>
|
||||
</div>
|
||||
<div class="search">
|
||||
<input type="search" placeholder="{{i18n.searchFolder}}" ng-model="searchText" ng-change="searchCiphers()" id="search" />
|
||||
<input type="search" placeholder="{{collectionGrouping ? i18n.searchCollection : i18n.searchFolder}}"
|
||||
ng-model="searchText" ng-change="searchCiphers()" id="search" />
|
||||
<i class="fa fa-search"></i>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="right" ng-if="folderGrouping">
|
||||
<a href="" ng-click="addCipher()"><i class="fa fa-plus fa-lg"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -16,7 +17,7 @@
|
||||
<div class="list">
|
||||
<div class="list-section" style="padding-bottom: 0;">
|
||||
<div class="list-section-header">
|
||||
{{folder.name}}
|
||||
{{grouping.name}}
|
||||
<span>{{vaultCiphers.length}}</span>
|
||||
</div>
|
||||
<a href="#" stop-click ng-click="viewCipher(cipher)"
|
||||
Reference in New Issue
Block a user