readonly and partial login updates
This commit is contained in:
parent
1818dad0d1
commit
072de1ea44
|
@ -27,6 +27,7 @@
|
||||||
listSubvaults: { url: _apiUri + '/ciphers/subvaults', method: 'GET', params: {} },
|
listSubvaults: { url: _apiUri + '/ciphers/subvaults', method: 'GET', params: {} },
|
||||||
'import': { url: _apiUri + '/ciphers/import', method: 'POST', params: {} },
|
'import': { url: _apiUri + '/ciphers/import', method: 'POST', params: {} },
|
||||||
favorite: { url: _apiUri + '/ciphers/:id/favorite', method: 'POST', params: { id: '@id' } },
|
favorite: { url: _apiUri + '/ciphers/:id/favorite', method: 'POST', params: { id: '@id' } },
|
||||||
|
putPartial: { url: _apiUri + '/ciphers/:id/partial', method: 'POST', params: { id: '@id' } },
|
||||||
move: { url: _apiUri + '/ciphers/:id/move', method: 'POST', params: { id: '@id' } },
|
move: { url: _apiUri + '/ciphers/:id/move', method: 'POST', params: { id: '@id' } },
|
||||||
del: { url: _apiUri + '/ciphers/:id/delete', method: 'POST', params: { id: '@id' } }
|
del: { url: _apiUri + '/ciphers/:id/delete', method: 'POST', params: { id: '@id' } }
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
angular.module("bit")
|
angular.module("bit")
|
||||||
.constant("appSettings", {"rememberedEmailCookieName":"bit.rememberedEmail","apiUri":"https://api.bitwarden.com","version":"1.9.1","environment":"Production"});
|
.constant("appSettings", {"rememberedEmailCookieName":"bit.rememberedEmail","apiUri":"http://localhost:4000","version":"1.9.1","environment":"Development"});
|
||||||
|
|
|
@ -62,7 +62,6 @@
|
||||||
editModel.result.then(function (returnVal) {
|
editModel.result.then(function (returnVal) {
|
||||||
if (returnVal.action === 'edit') {
|
if (returnVal.action === 'edit') {
|
||||||
var loginToUpdate = $filter('filter')($scope.logins, { id: returnVal.data.id }, true);
|
var loginToUpdate = $filter('filter')($scope.logins, { id: returnVal.data.id }, true);
|
||||||
|
|
||||||
if (loginToUpdate && loginToUpdate.length > 0) {
|
if (loginToUpdate && loginToUpdate.length > 0) {
|
||||||
loginToUpdate[0].folderId = returnVal.data.folderId;
|
loginToUpdate[0].folderId = returnVal.data.folderId;
|
||||||
loginToUpdate[0].name = returnVal.data.name;
|
loginToUpdate[0].name = returnVal.data.name;
|
||||||
|
@ -70,6 +69,13 @@
|
||||||
loginToUpdate[0].favorite = returnVal.data.favorite;
|
loginToUpdate[0].favorite = returnVal.data.favorite;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (returnVal.action === 'partialEdit') {
|
||||||
|
var loginToUpdate = $filter('filter')($scope.logins, { id: returnVal.data.id }, true);
|
||||||
|
if (loginToUpdate && loginToUpdate.length > 0) {
|
||||||
|
loginToUpdate[0].folderId = returnVal.data.folderId;
|
||||||
|
loginToUpdate[0].favorite = returnVal.data.favorite;
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (returnVal.action === 'delete') {
|
else if (returnVal.action === 'delete') {
|
||||||
var loginToDelete = $filter('filter')($scope.logins, { id: returnVal.data }, true);
|
var loginToDelete = $filter('filter')($scope.logins, { id: returnVal.data }, true);
|
||||||
if (loginToDelete && loginToDelete.length > 0) {
|
if (loginToDelete && loginToDelete.length > 0) {
|
||||||
|
|
|
@ -1,25 +1,46 @@
|
||||||
angular
|
angular
|
||||||
.module('bit.vault')
|
.module('bit.vault')
|
||||||
|
|
||||||
.controller('vaultEditLoginController', function ($scope, apiService, $uibModalInstance, cryptoService, cipherService, passwordService, loginId, folders, $analytics) {
|
.controller('vaultEditLoginController', function ($scope, apiService, $uibModalInstance, cryptoService, cipherService,
|
||||||
|
passwordService, loginId, folders, $analytics) {
|
||||||
$analytics.eventTrack('vaultEditLoginController', { category: 'Modal' });
|
$analytics.eventTrack('vaultEditLoginController', { category: 'Modal' });
|
||||||
$scope.folders = folders;
|
$scope.folders = folders;
|
||||||
$scope.login = {};
|
$scope.login = {};
|
||||||
|
$scope.readOnly = false;
|
||||||
|
|
||||||
apiService.logins.get({ id: loginId }, function (login) {
|
apiService.logins.get({ id: loginId }, function (login) {
|
||||||
$scope.login = cipherService.decryptLogin(login);
|
$scope.login = cipherService.decryptLogin(login);
|
||||||
|
$scope.readOnly = !login.Edit;
|
||||||
});
|
});
|
||||||
|
|
||||||
$scope.save = function (model) {
|
$scope.save = function (model) {
|
||||||
var login = cipherService.encryptLogin(model);
|
if ($scope.readOnly) {
|
||||||
$scope.savePromise = apiService.logins.put({ id: loginId }, login, function (loginResponse) {
|
$scope.savePromise = apiService.ciphers.putPartial({ id: loginId }, {
|
||||||
$analytics.eventTrack('Edited Login');
|
folderId: model.folderId,
|
||||||
var decLogin = cipherService.decryptLogin(loginResponse);
|
favorite: model.favorite
|
||||||
$uibModalInstance.close({
|
}, function (response) {
|
||||||
action: 'edit',
|
$analytics.eventTrack('Partially Edited Login');
|
||||||
data: decLogin
|
$uibModalInstance.close({
|
||||||
});
|
action: 'partialEdit',
|
||||||
}).$promise;
|
data: {
|
||||||
|
id: loginId,
|
||||||
|
favorite: model.favorite,
|
||||||
|
folderId: model.folderId && model.folderId !== '' ? model.folderId : null
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).$promise;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var login = cipherService.encryptLogin(model);
|
||||||
|
$scope.savePromise = apiService.logins.put({ id: loginId }, login, function (loginResponse) {
|
||||||
|
$analytics.eventTrack('Edited Login');
|
||||||
|
var decLogin = cipherService.decryptLogin(loginResponse);
|
||||||
|
$uibModalInstance.close({
|
||||||
|
action: 'edit',
|
||||||
|
data: decLogin
|
||||||
|
});
|
||||||
|
}).$promise;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.generatePassword = function () {
|
$scope.generatePassword = function () {
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<button type="button" class="close" ng-click="close()" aria-label="Close"><span aria-hidden="true">×</span></button>
|
<button type="button" class="close" ng-click="close()" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||||
<h4 class="modal-title" id="editLoginModelLabel"><i class="fa fa-globe"></i> Login Information <small>{{login.name}}</small></h4>
|
<h4 class="modal-title" id="editLoginModelLabel">
|
||||||
|
<i class="fa fa-globe"></i> Login Information <small>{{login.name}}</small>
|
||||||
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<form name="editLoginForm" ng-submit="editLoginForm.$valid && save(login)" api-form="savePromise">
|
<form name="editLoginForm" ng-submit="editLoginForm.$valid && save(login)" api-form="savePromise">
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
|
@ -14,14 +16,17 @@
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="form-group" show-errors>
|
<div class="form-group" show-errors>
|
||||||
<label for="name">Name</label> <span>*</span>
|
<label for="name">Name</label> <span>*</span>
|
||||||
<input type="text" id="name" name="Name" ng-model="login.name" class="form-control" required api-field />
|
<input type="text" id="name" name="Name" ng-model="login.name" class="form-control"
|
||||||
|
ng-readonly="readOnly" required api-field />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="form-group" show-errors>
|
<div class="form-group" show-errors>
|
||||||
<label for="folder">Folder</label>
|
<label for="folder">Folder</label>
|
||||||
<select id="folder" name="FolderId" ng-model="login.folderId" class="form-control" api-field>
|
<select id="folder" name="FolderId" ng-model="login.folderId" class="form-control" api-field>
|
||||||
<option ng-repeat="folder in folders | orderBy: folderSort" value="{{folder.id}}">{{folder.name}}</option>
|
<option ng-repeat="folder in folders | orderBy: folderSort" value="{{folder.id}}">
|
||||||
|
{{folder.name}}
|
||||||
|
</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -29,14 +34,16 @@
|
||||||
<div class="form-group" show-errors>
|
<div class="form-group" show-errors>
|
||||||
<label for="uri">URI</label>
|
<label for="uri">URI</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" id="uri" name="Uri" ng-model="login.uri" class="form-control" placeholder="http://..." api-field />
|
<input type="text" id="uri" name="Uri" ng-model="login.uri" class="form-control" placeholder="http://..."
|
||||||
|
ng-readonly="readOnly" api-field />
|
||||||
<span class="input-group-btn">
|
<span class="input-group-btn">
|
||||||
<button tabindex="-1" class="btn btn-default btn-flat" type="button" uib-tooltip="Copy URI" tooltip-placement="left" ngclipboard
|
<button class="btn btn-default btn-flat" type="button" uib-tooltip="Copy URI"
|
||||||
ngclipboard-error="clipboardError(e)"
|
tooltip-placement="left" ngclipboard ngclipboard-error="clipboardError(e)"
|
||||||
data-clipboard-target="#uri">
|
data-clipboard-target="#uri">
|
||||||
<i class="fa fa-clipboard"></i>
|
<i class="fa fa-clipboard"></i>
|
||||||
</button>
|
</button>
|
||||||
<a href="{{login.uri}}" target="_blank" class="btn btn-default btn-flat" uib-tooltip="Go To Login" tooltip-placement="left">
|
<a href="{{login.uri}}" target="_blank" class="btn btn-default btn-flat" uib-tooltip="Go To Login"
|
||||||
|
tooltip-placement="left">
|
||||||
<i class="fa fa-share"></i>
|
<i class="fa fa-share"></i>
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
|
@ -47,9 +54,10 @@
|
||||||
<div class="form-group" show-errors>
|
<div class="form-group" show-errors>
|
||||||
<label for="username">Username</label>
|
<label for="username">Username</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" id="username" name="Username" ng-model="login.username" class="form-control" api-field />
|
<input type="text" id="username" name="Username" ng-model="login.username" class="form-control"
|
||||||
|
ng-readonly="readOnly" api-field />
|
||||||
<span class="input-group-btn" uib-tooltip="Copy Username" tooltip-placement="left">
|
<span class="input-group-btn" uib-tooltip="Copy Username" tooltip-placement="left">
|
||||||
<button tabindex="-1" class="btn btn-default btn-flat" type="button" ngclipboard
|
<button class="btn btn-default btn-flat" type="button" ngclipboard
|
||||||
ngclipboard-error="clipboardError(e)"
|
ngclipboard-error="clipboardError(e)"
|
||||||
data-clipboard-target="#username">
|
data-clipboard-target="#username">
|
||||||
<i class="fa fa-clipboard"></i>
|
<i class="fa fa-clipboard"></i>
|
||||||
|
@ -61,29 +69,32 @@
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="form-group" show-errors>
|
<div class="form-group" show-errors>
|
||||||
<div class="pull-right password-options">
|
<div class="pull-right password-options">
|
||||||
<i class="fa fa-lg fa-refresh" uib-tooltip="Generate Password" tooltip-placement="left" ng-click="generatePassword()"></i>
|
<i class="fa fa-lg fa-refresh" uib-tooltip="Generate Password" tooltip-placement="left"
|
||||||
<i class="fa fa-lg fa-eye" uib-tooltip="Toggle Password" tooltip-placement="left" password-viewer="#password"></i>
|
ng-click="generatePassword()" ng-show="!readOnly"></i>
|
||||||
|
<i class="fa fa-lg fa-eye" uib-tooltip="Toggle Password" tooltip-placement="left"
|
||||||
|
password-viewer="#password"></i>
|
||||||
</div>
|
</div>
|
||||||
<label for="password">Password</label>
|
<label for="password">Password</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" id="password-text" value="{{login.password}}" style="margin-left: -9999px;" />
|
<input type="password" id="password" name="Password" ng-model="login.password" class="form-control"
|
||||||
<input type="password" id="password" name="Password" ng-model="login.password" class="form-control" api-field />
|
ng-readonly="readOnly" api-field />
|
||||||
<span class="input-group-btn" uib-tooltip="Copy Password" tooltip-placement="left">
|
<span class="input-group-btn" uib-tooltip="Copy Password" tooltip-placement="left">
|
||||||
<button tabindex="-1" class="btn btn-default btn-flat" type="button" ngclipboard
|
<button class="btn btn-default btn-flat" type="button" ngclipboard
|
||||||
ngclipboard-success="clipboardSuccess(e)"
|
ngclipboard-success="clipboardSuccess(e)" ngclipboard-error="clipboardError(e, true)"
|
||||||
ngclipboard-error="clipboardError(e, true)"
|
data-clipboard-text="{{login.password}}">
|
||||||
data-clipboard-target="#password-text">
|
|
||||||
<i class="fa fa-clipboard"></i>
|
<i class="fa fa-clipboard"></i>
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="margin: -10px 0 15px 0;" password-meter="login.password" password-meter-username="login.username" outer-class="xs"></div>
|
<div style="margin: -10px 0 15px 0;" password-meter="login.password" password-meter-username="login.username"
|
||||||
|
outer-class="xs"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group" show-errors>
|
<div class="form-group" show-errors>
|
||||||
<label for="notes">Notes</label>
|
<label for="notes">Notes</label>
|
||||||
<textarea id="notes" name="Notes" class="form-control" ng-model="login.notes" api-field></textarea>
|
<textarea id="notes" name="Notes" class="form-control" ng-model="login.notes"
|
||||||
|
ng-readonly="readOnly" api-field></textarea>
|
||||||
</div>
|
</div>
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label>
|
<label>
|
||||||
|
@ -97,7 +108,7 @@
|
||||||
<i class="fa fa-refresh fa-spin loading-icon" ng-show="editLoginForm.$loading"></i>Save
|
<i class="fa fa-refresh fa-spin loading-icon" ng-show="editLoginForm.$loading"></i>Save
|
||||||
</button>
|
</button>
|
||||||
<button type="button" class="btn btn-default btn-flat" ng-click="close()">Close</button>
|
<button type="button" class="btn btn-default btn-flat" ng-click="close()">Close</button>
|
||||||
<button type="button" class="btn btn-link pull-right" ng-click="delete()" uib-tooltip="Delete">
|
<button type="button" class="btn btn-link pull-right" ng-click="delete()" uib-tooltip="Delete" ng-disabled="readOnly">
|
||||||
<i class="fa fa-trash fa-lg"></i>
|
<i class="fa fa-trash fa-lg"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue