diff --git a/src/Controllers/HomeController.cs b/src/Controllers/HomeController.cs index 4b30b38..4578bfa 100644 --- a/src/Controllers/HomeController.cs +++ b/src/Controllers/HomeController.cs @@ -75,22 +75,56 @@ public class HomeController : Controller [Authorize(Roles = "CanManageUsers")] [HttpGet("Users")] - public async Task UsersAsync() + public async Task UsersAsync([FromQuery] int page = 1, [FromQuery] int pageSize = 50) { - IEnumerable users = await _ldap.ListUsersAsync([.. _ldap.UsersAttributes.Where(attr => attr != "jpegPhoto" && attr != "userPassword")]); + page = Math.Max(1, page); + pageSize = Math.Clamp(pageSize, 10, 100); + + // Fetch all users with jpegPhoto (but not userPassword) + IEnumerable allUsers = await _ldap.ListUsersAsync([.. _ldap.UsersAttributes.Where(attr => attr != "userPassword")]); + List usersList = allUsers.ToList(); + int totalUsers = usersList.Count; + + List paginatedUsers = usersList + .Skip((page - 1) * pageSize) + .Take(pageSize) + .ToList(); + List UserTableViewModels = []; - foreach (UserModel user in users) + foreach (UserModel user in paginatedUsers) { + string? jpegPhotoBase64 = null; + if (user.JpegPhoto != null) + { + try + { + byte[] photoBytes = Convert.FromBase64String(user.JpegPhoto); + jpegPhotoBase64 = ImageHelper.ResizeAndConvertToBase64(photoBytes, 48); + } + catch + { + // If image processing fails, leave as null + } + } + UserTableViewModels.Add(new() { Name = user.Cn ?? "", Surname = user.Sn ?? "", Title = user.Title ?? "", Uid = user.Uid, - Description = user.Description ?? new() {Address = new(), BirthDate = "", Workplace = "", Groups = []} + Description = user.Description ?? new() {Address = new(), BirthDate = "", Workplace = "", Groups = []}, + JpegPhotoBase64 = jpegPhotoBase64 }); } - return View(new UsersIndexViewModel() { UserTableViewModels = UserTableViewModels }); + + return View(new UsersIndexViewModel() + { + UserTableViewModels = UserTableViewModels, + CurrentPage = page, + PageSize = pageSize, + TotalUsers = totalUsers + }); } [Authorize(Roles = "CanManageUsers")] diff --git a/src/Models/UserModels.cs b/src/Models/UserModels.cs index 9fa36d0..5821e62 100644 --- a/src/Models/UserModels.cs +++ b/src/Models/UserModels.cs @@ -69,4 +69,5 @@ public class UserTableViewModel public required string Name { get; set; } public required string Surname { get; set; } public required UserDescription Description { get; set; } + public string? JpegPhotoBase64 { get; set; } } \ No newline at end of file diff --git a/src/Models/UsersViewModel.cs b/src/Models/UsersViewModel.cs index 1729968..3e18d30 100644 --- a/src/Models/UsersViewModel.cs +++ b/src/Models/UsersViewModel.cs @@ -3,4 +3,8 @@ namespace Berufsschule_HAM.Models; public class UsersIndexViewModel { public required IEnumerable UserTableViewModels { get; set; } + public int CurrentPage { get; set; } = 1; + public int PageSize { get; set; } = 50; + public int TotalUsers { get; set; } + public int TotalPages => (int)Math.Ceiling((double)TotalUsers / PageSize); } \ No newline at end of file diff --git a/src/Views/Home/Users.cshtml b/src/Views/Home/Users.cshtml index 3e5a255..3e3ec25 100644 --- a/src/Views/Home/Users.cshtml +++ b/src/Views/Home/Users.cshtml @@ -41,7 +41,16 @@ { - Photo + @if (!string.IsNullOrEmpty(userTableViewModel.JpegPhotoBase64)) + { + Photo + } + else + { +
+ @userTableViewModel.Name.FirstOrDefault()@userTableViewModel.Surname.FirstOrDefault() +
+ } @userTableViewModel.Uid @userTableViewModel.Title @@ -79,6 +88,64 @@ + + @* Pagination Controls *@ + @if (Model.TotalPages > 1) + { + + }