Added role management functionality to the user details page

This commit is contained in:
Matěj Kubíček
2026-05-01 20:16:08 +02:00
parent 3480ce3613
commit 6490c42a9d
3 changed files with 53 additions and 4 deletions
@@ -8,20 +8,23 @@ namespace TemplateWeb.Areas.Admin.Controllers;
public class UsersController : AdminBaseController public class UsersController : AdminBaseController
{ {
private readonly UserManager<UserEntity> _userManager; private readonly UserManager<UserEntity> _userManager;
private readonly RoleManager<IdentityRole> _roleManager;
public UsersController(UserManager<UserEntity> userManager) public UsersController(UserManager<UserEntity> userManager, RoleManager<IdentityRole> roleManager)
{ {
_userManager = userManager; _userManager = userManager;
_roleManager = roleManager;
} }
public async Task<IActionResult> Index() public async Task<IActionResult> Index()
{ {
var allRoles = _roleManager.Roles.Select(r => r.Name!).ToList();
var users = _userManager.Users.ToList(); var users = _userManager.Users.ToList();
var viewModels = new List<UserWithRolesViewModel>(); var viewModels = new List<UserWithRolesViewModel>();
foreach (var user in users) foreach (var user in users)
{ {
var roles = await _userManager.GetRolesAsync(user); var roles = await _userManager.GetRolesAsync(user);
viewModels.Add(new UserWithRolesViewModel { UserEntity = user, Roles = roles }); viewModels.Add(new UserWithRolesViewModel { UserEntity = user, Roles = roles, AllRoles = allRoles });
} }
return View(viewModels); return View(viewModels);
} }
@@ -32,6 +35,23 @@ public class UsersController : AdminBaseController
if (user == null) return NotFound(); if (user == null) return NotFound();
var roles = await _userManager.GetRolesAsync(user); var roles = await _userManager.GetRolesAsync(user);
return View(new UserWithRolesViewModel { UserEntity = user, Roles = roles }); var allRoles = _roleManager.Roles.Select(r => r.Name!).ToList();
return View(new UserWithRolesViewModel { UserEntity = user, Roles = roles, AllRoles = allRoles });
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> UpdateRoles(string id, List<string> selectedRoles)
{
var user = await _userManager.FindByIdAsync(id);
if (user == null) return NotFound();
var currentRoles = await _userManager.GetRolesAsync(user);
await _userManager.RemoveFromRolesAsync(user, currentRoles);
if (selectedRoles.Count > 0)
await _userManager.AddToRolesAsync(user, selectedRoles);
TempData["SuccessMessage"] = "Roles updated successfully.";
return RedirectToAction(nameof(Details), new { id });
} }
} }
@@ -7,7 +7,12 @@
<a asp-action="Index" class="btn btn-secondary">&larr; Back to List</a> <a asp-action="Index" class="btn btn-secondary">&larr; Back to List</a>
</div> </div>
<div class="card"> @if (TempData["SuccessMessage"] != null)
{
<div class="alert alert-success">@TempData["SuccessMessage"]</div>
}
<div class="card mb-4">
<div class="card-header bg-primary text-white"> <div class="card-header bg-primary text-white">
<h3 class="card-title mb-0">User Information: @Model.UserEntity.UserName</h3> <h3 class="card-title mb-0">User Information: @Model.UserEntity.UserName</h3>
</div> </div>
@@ -32,3 +37,26 @@
</dl> </dl>
</div> </div>
</div> </div>
<div class="card">
<div class="card-header">
<h5 class="mb-0">Edit Roles</h5>
</div>
<div class="card-body">
<form asp-action="UpdateRoles" asp-route-id="@Model.UserEntity.Id" method="post">
@Html.AntiForgeryToken()
<div class="d-flex gap-4 flex-wrap mb-3">
@foreach (var role in Model.AllRoles)
{
<div class="form-check">
<input class="form-check-input" type="checkbox"
name="selectedRoles" value="@role" id="role_@role"
@(Model.Roles.Contains(role) ? "checked" : "") />
<label class="form-check-label" for="role_@role">@role</label>
</div>
}
</div>
<button type="submit" class="btn btn-primary">Save Roles</button>
</form>
</div>
</div>
@@ -6,4 +6,5 @@ public class UserWithRolesViewModel
{ {
public UserEntity UserEntity { get; set; } = null!; public UserEntity UserEntity { get; set; } = null!;
public IList<string> Roles { get; set; } = []; public IList<string> Roles { get; set; } = [];
public IList<string> AllRoles { get; set; } = [];
} }