Merge remote-tracking branch 'origin/user-group-permissions' into temp-U4-10106

# Conflicts:
#	src/Umbraco.Web.UI/umbraco/config/lang/en.xml
#	src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml
This commit is contained in:
Shannon
2017-07-14 10:53:07 +10:00
7 changed files with 122 additions and 41 deletions

View File

@@ -55,6 +55,18 @@
'Failed to enable the users ' + userIds.join(","));
}
function setUserGroupsOnUsers(userGroups, userIds) {
var userGroupAliases = userGroups.map(function(o) { return o.alias; });
var query = "userGroupAliases=" + userGroupAliases.join("&userGroupAliases=") + "&userIds=" + userIds.join("&userIds=");
return umbRequestHelper.resourcePromise(
$http.post(
umbRequestHelper.getApiUrl(
"userApiBaseUrl",
"PostSetUserGroupsOnUsers",
query)),
'Failed to set user groups ' + userGroupAliases.join(",") + ' on the users ' + userIds.join(","));
}
function getPagedResults(options) {
var defaults = {
pageSize: 25,
@@ -173,6 +185,7 @@
var resource = {
disableUsers: disableUsers,
enableUsers: enableUsers,
setUserGroupsOnUsers: setUserGroupsOnUsers,
getPagedResults: getPagedResults,
getUser: getUser,
createUser: createUser,

View File

@@ -22,7 +22,7 @@
vm.enableUser = enableUser;
vm.clearAvatar = clearAvatar;
vm.save = save;
vm.maxFileSize = Umbraco.Sys.ServerVariables.umbracoSettings.maxFileSize + "KB"
vm.maxFileSize = Umbraco.Sys.ServerVariables.umbracoSettings.maxFileSize + "KB";
vm.acceptedFileTypes = mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.imageFileTypes);
vm.toggleChangePassword = toggleChangePassword;
vm.emailIsUsername = true;
@@ -56,8 +56,7 @@
vm.loading = false;
});
});
});
}
function toggleChangePassword() {
@@ -91,13 +90,9 @@
//the user has a password if they are not states: Invited, NoCredentials
vm.changePasswordModel.config.hasPassword = vm.user.userState !== 3 && vm.user.userState !== 4;
}, function (err) {
vm.page.saveButtonState = "error";
});
}
function goToPage(ancestor) {
@@ -303,7 +298,6 @@
});
}
function makeBreadcrumbs() {
vm.breadcrumbs = [
{
@@ -322,9 +316,6 @@
}
init();
}
angular.module("umbraco").controller("Umbraco.Editors.Users.UserController", UserEditController);
})();

View File

@@ -24,6 +24,8 @@
vm.newUser.userGroups = [];
vm.usersViewState = 'overview';
vm.selectedBulkUserGroups = [];
vm.allowDisableUser = true;
vm.allowEnableUser = true;
vm.allowSetUserGroup = true;
@@ -73,6 +75,7 @@
vm.clickUser = clickUser;
vm.disableUsers = disableUsers;
vm.enableUsers = enableUsers;
vm.openBulkUserGroupPicker = openBulkUserGroupPicker;
vm.openUserGroupPicker = openUserGroupPicker;
vm.removeSelectedUserGroup = removeSelectedUserGroup;
vm.selectAll = selectAll;
@@ -216,13 +219,47 @@
}
function getUserFromArrayById(userId, users) {
var userFound;
angular.forEach(users, function(user){
if(userId === user.id) {
userFound = user;
return _.find(users, function(u) { return u.id === userId });
}
function openBulkUserGroupPicker(event) {
var firstSelectedUser = getUserFromArrayById(vm.selection[0], vm.users);
vm.selectedBulkUserGroups = _.clone(firstSelectedUser.userGroups);
vm.userGroupPicker = {
title: "Select user groups",
view: "usergrouppicker",
selection: vm.selectedBulkUserGroups,
closeButtonLabel: "Cancel",
show: true,
submit: function (model) {
usersResource.setUserGroupsOnUsers(model.selection, vm.selection).then(function (data) {
// sorting to ensure they show up in right order when updating the UI
vm.selectedBulkUserGroups.sort(function (a, b) {
return a.alias > b.alias ? 1 : a.alias < b.alias ? -1 : 0;
});
// apply changes to UI
_.each(vm.selection,
function(userId) {
var user = getUserFromArrayById(userId, vm.users);
user.userGroups = vm.selectedBulkUserGroups;
});
vm.selectedBulkUserGroups = [];
vm.userGroupPicker.show = false;
vm.userGroupPicker = null;
formHelper.showNotifications(data);
clearSelection();
}, function (error) {
formHelper.showNotifications(error.data);
});
},
close: function (oldModel) {
vm.selectedBulkUserGroups = [];
vm.userGroupPicker.show = false;
vm.userGroupPicker = null;
}
});
return userFound;
};
}
function openUserGroupPicker(event) {
@@ -488,6 +525,8 @@
vm.allowEnableUser = true;
vm.allowSetUserGroup = true;
var firstSelectedUserGroups;
angular.forEach(users, function (user) {
if (!user.selected) {
@@ -514,6 +553,19 @@
vm.allowEnableUser = false;
}
// store the user group aliases of the first selected user
if (!firstSelectedUserGroups) {
firstSelectedUserGroups = user.userGroups.map(function (ug) { return ug.alias; });
vm.allowSetUserGroup = true;
} else if (vm.allowSetUserGroup === true) {
// for 2nd+ selected user, compare the user group aliases to determine if we should allow bulk editing.
// we don't allow bulk editing of users not currently having the same assigned user groups, as we can't
// really support that in the user group picker.
var userGroups = user.userGroups.map(function(ug) { return ug.alias; });
if (_.difference(firstSelectedUserGroups, userGroups).length > 0) {
vm.allowSetUserGroup = false;
}
}
});
}

View File

@@ -47,7 +47,7 @@
<umb-editor-sub-header-section>
<umb-button type="button"
label="Clear selection"
size="xs"
size="xs"
label-key="buttons_clearSelection"
action="vm.clearSelection()"
disabled="actionInProgress">
@@ -60,32 +60,32 @@
<umb-editor-sub-header-content-right ng-if="vm.selection.length > 0">
<div style="margin-right: 5px;">
<umb-button ng-if="vm.allowSetUserGroup"
type="button"
size="xs"
label="Set group"
icon="icon-users"
action="vm.setUserGroup()">
<umb-button ng-if="vm.allowSetUserGroup"
type="button"
size="xs"
label="Set group"
icon="icon-users"
action="vm.openBulkUserGroupPicker()">
</umb-button>
</div>
<div style="margin-right: 5px;">
<umb-button ng-if="vm.allowEnableUser"
type="button"
size="xs"
state="vm.enableUserButtonState"
label="Enable"
icon="icon-check"
action="vm.enableUsers()">
<umb-button ng-if="vm.allowEnableUser"
type="button"
size="xs"
state="vm.enableUserButtonState"
label="Enable"
icon="icon-check"
action="vm.enableUsers()">
</umb-button>
</div>
<div>
<umb-button ng-if="vm.allowDisableUser"
type="button"
size="xs"
state="vm.disableUserButtonState"
label="Disable"
icon="icon-block"
action="vm.disableUsers()">
<umb-button ng-if="vm.allowDisableUser"
type="button"
size="xs"
state="vm.disableUserButtonState"
label="Disable"
icon="icon-block"
action="vm.disableUsers()">
</umb-button>
</div>
</umb-editor-sub-header-content-right>

View File

@@ -1128,6 +1128,15 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="cssErrorText">An error occurred saving the file.</key>
<key alias="deleteUserGroupsSuccess">Deleted %0% user groups</key>
<key alias="deleteUserGroupSuccess">%0% was deleted</key>
<key alias="enableUsersSuccess">Enabled %0% users</key>
<key alias="enableUsersError">An error occurred while enabling the users</key>
<key alias="disableUsersSuccess">Disabled %0% users</key>
<key alias="disableUsersError">An error occurred while disabling the users</key>
<key alias="enableUserSuccess">%0% is now enabled</key>
<key alias="enableUserError">An error occurred while enabling the user</key>
<key alias="disableUserSuccess">%0% is now disabled</key>
<key alias="disableUserError">An error occurred while disabling the user</key>
<key alias="setUserGroupOnUsersSuccess">User groups have been set</key>
</area>
<area alias="stylesheet">
<key alias="aliasHelp">Uses CSS syntax ex: h1, .redHeader, .blueTex</key>

View File

@@ -1095,16 +1095,15 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="scriptErrorHeader">Script view not saved</key>
<key alias="scriptErrorText">An error occurred saving the file.</key>
<key alias="cssErrorText">An error occurred saving the file.</key>
<key alias="enableUsersSuccess">Enabled %0% users</key>
<key alias="enableUsersError">An error occurred while enabling the users</key>
<key alias="disableUsersSuccess">Disabled %0% users</key>
<key alias="disableUsersError">An error occurred while disabling the users</key>
<key alias="enableUserSuccess">%0% is now enabled </key>
<key alias="enableUserSuccess">%0% is now enabled</key>
<key alias="enableUserError">An error occurred while enabling the user</key>
<key alias="disableUserSuccess">%0% is now disabled</key>
<key alias="disableUserError">An error occurred while disabling the user</key>
<key alias="setUserGroupOnUsersSuccess">User groups have been set</key>
<key alias="deleteUserGroupsSuccess">Deleted %0% user groups</key>
<key alias="deleteUserGroupSuccess">%0% was deleted</key>
</area>

View File

@@ -546,6 +546,23 @@ namespace Umbraco.Web.Editors
Services.TextService.Localize("speechBubbles/enableUserSuccess", new[] { users[0].Name }));
}
public HttpResponseMessage PostSetUserGroupsOnUsers([FromUri]string[] userGroupAliases, [FromUri]int[] userIds)
{
var users = Services.UserService.GetUsersById(userIds).ToArray();
var userGroups = Services.UserService.GetUserGroupsByAlias(userGroupAliases).Select(x => x.ToReadOnlyGroup()).ToArray();
foreach (var u in users)
{
u.ClearGroups();
foreach (var userGroup in userGroups)
{
u.AddGroup(userGroup);
}
}
Services.UserService.Save(users);
return Request.CreateNotificationSuccessResponse(
Services.TextService.Localize("speechBubbles/setUserGroupOnUsersSuccess"));
}
public class PagedUserResult : PagedResult<UserBasic>
{
public PagedUserResult(long totalItems, long pageNumber, long pageSize) : base(totalItems, pageNumber, pageSize)