diff --git a/src/Umbraco.Core/Security/BackOfficeUserStore.cs b/src/Umbraco.Core/Security/BackOfficeUserStore.cs
index 9e8d5c6170..322e1a2f86 100644
--- a/src/Umbraco.Core/Security/BackOfficeUserStore.cs
+++ b/src/Umbraco.Core/Security/BackOfficeUserStore.cs
@@ -545,6 +545,9 @@ namespace Umbraco.Core.Security
///
///
///
+ * usersResource.clearAvatar(1)
+ * .then(function() {
+ * alert("avatar is gone");
+ * });
+ *
+ *
+ * @param {Array} id id of user.
+ * @returns {Promise} resourcePromise object.
+ *
+ */
function clearAvatar(userId) {
return umbRequestHelper.resourcePromise(
@@ -22,6 +42,26 @@
'Failed to clear the user avatar ' + userId);
}
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.usersResource#disableUsers
+ * @methodOf umbraco.resources.usersResource
+ *
+ * @description
+ * Disables a collection of users
+ *
+ * ##usage
+ *
+ * usersResource.disableUsers([1, 2, 3, 4, 5])
+ * .then(function() {
+ * alert("users were disabled");
+ * });
+ *
+ *
+ * @param {Array} ids ids of users to disable.
+ * @returns {Promise} resourcePromise object.
+ *
+ */
function disableUsers(userIds) {
if (!userIds) {
throw "userIds not specified";
@@ -39,6 +79,26 @@
'Failed to disable the users ' + userIds.join(","));
}
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.usersResource#enableUsers
+ * @methodOf umbraco.resources.usersResource
+ *
+ * @description
+ * Enables a collection of users
+ *
+ * ##usage
+ *
+ * usersResource.enableUsers([1, 2, 3, 4, 5])
+ * .then(function() {
+ * alert("users were enabled");
+ * });
+ *
+ *
+ * @param {Array} ids ids of users to enable.
+ * @returns {Promise} resourcePromise object.
+ *
+ */
function enableUsers(userIds) {
if (!userIds) {
throw "userIds not specified";
@@ -55,6 +115,63 @@
'Failed to enable the users ' + userIds.join(","));
}
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.usersResource#unlockUsers
+ * @methodOf umbraco.resources.usersResource
+ *
+ * @description
+ * Unlocks a collection of users
+ *
+ * ##usage
+ *
+ * usersResource.unlockUsers([1, 2, 3, 4, 5])
+ * .then(function() {
+ * alert("users were unlocked");
+ * });
+ *
+ *
+ * @param {Array} ids ids of users to unlock.
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ function unlockUsers(userIds) {
+ if (!userIds) {
+ throw "userIds not specified";
+ }
+
+ //we need to create a custom query string for the usergroup array, so create it now and we can append the user groups if needed
+ var qry = "userIds=" + userIds.join("&userIds=");
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "userApiBaseUrl",
+ "PostUnlockUsers", qry)),
+ 'Failed to enable the users ' + userIds.join(","));
+ }
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.usersResource#setUserGroupsOnUsers
+ * @methodOf umbraco.resources.usersResource
+ *
+ * @description
+ * Overwrites the existing user groups on a collection of users
+ *
+ * ##usage
+ *
+ * usersResource.setUserGroupsOnUsers(['admin', 'editor'], [1, 2, 3, 4, 5])
+ * .then(function() {
+ * alert("users were updated");
+ * });
+ *
+ *
+ * @param {Array} userGroupAliases aliases of user groups.
+ * @param {Array} ids ids of users to update.
+ * @returns {Promise} resourcePromise object.
+ *
+ */
function setUserGroupsOnUsers(userGroups, userIds) {
var userGroupAliases = userGroups.map(function(o) { return o.alias; });
var query = "userGroupAliases=" + userGroupAliases.join("&userGroupAliases=") + "&userIds=" + userIds.join("&userIds=");
@@ -67,6 +184,34 @@
'Failed to set user groups ' + userGroupAliases.join(",") + ' on the users ' + userIds.join(","));
}
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.usersResource#getPagedResults
+ * @methodOf umbraco.resources.usersResource
+ *
+ * @description
+ * Get users
+ *
+ * ##usage
+ *
+ * usersResource.getPagedResults({pageSize: 10, pageNumber: 2})
+ * .then(function(data) {
+ * var users = data.items;
+ * alert('they are here!');
+ * });
+ *
+ *
+ * @param {Object} options optional options object
+ * @param {Int} options.pageSize if paging data, number of users per page, default = 25
+ * @param {Int} options.pageNumber if paging data, current page index, default = 1
+ * @param {String} options.filter if provided, query will only return those with names matching the filter
+ * @param {String} options.orderDirection can be `Ascending` or `Descending` - Default: `Ascending`
+ * @param {String} options.orderBy property to order users by, default: `Username`
+ * @param {Array} options.userGroups property to filter users by user group
+ * @param {Array} options.userStates property to filter users by user state
+ * @returns {Promise} resourcePromise object containing an array of content items.
+ *
+ */
function getPagedResults(options) {
var defaults = {
pageSize: 25,
@@ -119,6 +264,26 @@
'Failed to retrieve users paged result');
}
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.usersResource#getUser
+ * @methodOf umbraco.resources.usersResource
+ *
+ * @description
+ * Gets a user
+ *
+ * ##usage
+ *
+ * usersResource.getUser(1)
+ * .then(function(user) {
+ * alert("It's here");
+ * });
+ *
+ *
+ * @param {Array} id user id.
+ * @returns {Promise} resourcePromise object containing the user.
+ *
+ */
function getUser(userId) {
return umbRequestHelper.resourcePromise(
@@ -130,6 +295,26 @@
"Failed to retrieve data for user " + userId);
}
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.usersResource#createUser
+ * @methodOf umbraco.resources.usersResource
+ *
+ * @description
+ * Creates a new user
+ *
+ * ##usage
+ *
+ * usersResource.createUser(user)
+ * .then(function(newUser) {
+ * alert("It's here");
+ * });
+ *
+ *
+ * @param {Object} user user to create
+ * @returns {Promise} resourcePromise object containing the new user.
+ *
+ */
function createUser(user) {
if (!user) {
throw "user not specified";
@@ -147,6 +332,26 @@
"Failed to save user");
}
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.usersResource#inviteUser
+ * @methodOf umbraco.resources.usersResource
+ *
+ * @description
+ * Creates and sends an email invitation to a new user
+ *
+ * ##usage
+ *
+ * usersResource.inviteUser(user)
+ * .then(function(newUser) {
+ * alert("It's here");
+ * });
+ *
+ *
+ * @param {Object} user user to invite
+ * @returns {Promise} resourcePromise object containing the new user.
+ *
+ */
function inviteUser(user) {
if (!user) {
throw "user not specified";
@@ -164,6 +369,26 @@
"Failed to invite user");
}
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.usersResource#saveUser
+ * @methodOf umbraco.resources.usersResource
+ *
+ * @description
+ * Saves a user
+ *
+ * ##usage
+ *
+ * usersResource.saveUser(user)
+ * .then(function(updatedUser) {
+ * alert("It's here");
+ * });
+ *
+ *
+ * @param {Object} user object to save
+ * @returns {Promise} resourcePromise object containing the updated user.
+ *
+ */
function saveUser(user) {
if (!user) {
throw "user not specified";
@@ -185,6 +410,7 @@
var resource = {
disableUsers: disableUsers,
enableUsers: enableUsers,
+ unlockUsers: unlockUsers,
setUserGroupsOnUsers: setUserGroupsOnUsers,
getPagedResults: getPagedResults,
getUser: getUser,
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-badge.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-badge.less
index 6998afa556..522b7564c1 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-badge.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-badge.less
@@ -9,7 +9,6 @@
display: inline-flex;
align-items: center;
justify-content: center;
- text-transform: capitalize;
}
// Colors
diff --git a/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js
index e060eaf393..a9b17998d5 100644
--- a/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js
@@ -30,6 +30,7 @@
vm.removeSelectedItem = removeSelectedItem;
vm.disableUser = disableUser;
vm.enableUser = enableUser;
+ vm.unlockUser = unlockUser;
vm.clearAvatar = clearAvatar;
vm.save = save;
vm.toggleChangePassword = toggleChangePassword;
@@ -254,11 +255,11 @@
function disableUser() {
vm.disableUserButtonState = "busy";
usersResource.disableUsers([vm.user.id]).then(function (data) {
- vm.user.userState = 1;
- setUserDisplayState();
- vm.disableUserButtonState = "success";
- formHelper.showNotifications(data);
- }, function(error){
+ vm.user.userState = 1;
+ setUserDisplayState();
+ vm.disableUserButtonState = "success";
+ formHelper.showNotifications(data);
+ }, function (error) {
vm.disableUserButtonState = "error";
formHelper.showNotifications(error.data);
});
@@ -267,16 +268,28 @@
function enableUser() {
vm.enableUserButtonState = "busy";
usersResource.enableUsers([vm.user.id]).then(function (data) {
- vm.user.userState = 0;
- setUserDisplayState();
- vm.enableUserButtonState = "success";
- formHelper.showNotifications(data);
- }, function(error){
- vm.disableUserButtonState = "error";
+ vm.user.userState = 0;
+ setUserDisplayState();
+ vm.enableUserButtonState = "success";
+ formHelper.showNotifications(data);
+ }, function (error) {
+ vm.enableUserButtonState = "error";
+ formHelper.showNotifications(error.data);
+ });
+ }
+
+ function unlockUser() {
+ vm.unlockUserButtonState = "busy";
+ usersResource.unlockUsers([vm.user.id]).then(function (data) {
+ vm.user.userState = 0;
+ setUserDisplayState();
+ vm.unlockUserButtonState = "success";
+ formHelper.showNotifications(data);
+ }, function (error) {
+ vm.unlockUserButtonState = "error";
formHelper.showNotifications(error.data);
});
}
-
function clearAvatar() {
// get user
diff --git a/src/Umbraco.Web.UI.Client/src/views/users/user.html b/src/Umbraco.Web.UI.Client/src/views/users/user.html
index 94c8360346..8dd5a74e5d 100644
--- a/src/Umbraco.Web.UI.Client/src/views/users/user.html
+++ b/src/Umbraco.Web.UI.Client/src/views/users/user.html
@@ -1,6 +1,8 @@