From 4716b704d4e66b2cdec01283d57cb650dcb8c14d Mon Sep 17 00:00:00 2001 From: Rockstar Developer <5191402+rockstardev@users.noreply.github.com> Date: Fri, 19 Jul 2019 02:50:17 -0500 Subject: [PATCH] Paging on List Users page for big hosting providers like Esky (#905) --- BTCPayServer/Controllers/ServerController.cs | 15 +-- .../Models/ServerViewModels/UsersViewModel.cs | 25 ++--- BTCPayServer/Views/Server/ListUsers.cshtml | 102 +++++++++++++----- 3 files changed, 90 insertions(+), 52 deletions(-) diff --git a/BTCPayServer/Controllers/ServerController.cs b/BTCPayServer/Controllers/ServerController.cs index f3059d420..8692b10c3 100644 --- a/BTCPayServer/Controllers/ServerController.cs +++ b/BTCPayServer/Controllers/ServerController.cs @@ -154,17 +154,20 @@ namespace BTCPayServer.Controllers } [Route("server/users")] - public IActionResult ListUsers() + public IActionResult ListUsers(int skip = 0, int count = 50) { var users = new UsersViewModel(); users.StatusMessage = StatusMessage; - users.Users - = _UserManager.Users.Select(u => new UsersViewModel.UserViewModel() + users.Users = _UserManager.Users.Skip(skip).Take(count) + .Select(u => new UsersViewModel.UserViewModel { Name = u.UserName, Email = u.Email, Id = u.Id }).ToList(); + users.Skip = skip; + users.Count = count; + users.Total = _UserManager.Users.Count(); return View(users); } @@ -479,7 +482,7 @@ namespace BTCPayServer.Controllers if (command.StartsWith("remove-domain", StringComparison.InvariantCultureIgnoreCase)) { ModelState.Clear(); - var index = int.Parse(command.Substring(command.IndexOf(":",StringComparison.InvariantCultureIgnoreCase) + 1), CultureInfo.InvariantCulture); + var index = int.Parse(command.Substring(command.IndexOf(":", StringComparison.InvariantCultureIgnoreCase) + 1), CultureInfo.InvariantCulture); settings.DomainToAppMapping.RemoveAt(index); return View(settings); } @@ -569,7 +572,7 @@ namespace BTCPayServer.Controllers var storageSettings = await _SettingsRepository.GetSettingAsync(); result.ExternalStorageServices.Add(new ServicesViewModel.OtherExternalService() { - Name = storageSettings == null? "Not set": storageSettings.Provider.ToString(), + Name = storageSettings == null ? "Not set" : storageSettings.Provider.ToString(), Link = Url.Action("Storage") }); return View(result); @@ -577,7 +580,7 @@ namespace BTCPayServer.Controllers private async Task> GetAppSelectList() { -// load display app dropdown + // load display app dropdown using (var ctx = _ContextFactory.CreateContext()) { var userId = _UserManager.GetUserId(base.User); diff --git a/BTCPayServer/Models/ServerViewModels/UsersViewModel.cs b/BTCPayServer/Models/ServerViewModels/UsersViewModel.cs index 8dd79cbbc..c87eb53fc 100644 --- a/BTCPayServer/Models/ServerViewModels/UsersViewModel.cs +++ b/BTCPayServer/Models/ServerViewModels/UsersViewModel.cs @@ -10,25 +10,16 @@ namespace BTCPayServer.Models.ServerViewModels public class UserViewModel { public string Id { get; set; } - public string Name - { - get; set; - } - public string Email - { - get; set; - } + public string Name { get; set; } + public string Email { get; set; } } + + public int Skip { get; set; } + public int Count { get; set; } + public int Total { get; set; } + public string StatusMessage { get; set; } - public string StatusMessage - { - get; set; - } - - public List Users - { - get; set; - } = new List(); + public List Users { get; set; } = new List(); } } diff --git a/BTCPayServer/Views/Server/ListUsers.cshtml b/BTCPayServer/Views/Server/ListUsers.cshtml index 5149430d3..ab24e4a25 100644 --- a/BTCPayServer/Views/Server/ListUsers.cshtml +++ b/BTCPayServer/Views/Server/ListUsers.cshtml @@ -6,40 +6,84 @@
-
- -
+
Total Users: @Model.Total
-
- - +
+ + + + + + + + + @foreach (var user in Model.Users) + { - - - + + + - - - @foreach (var user in Model.Users) - { - - - - - - } - -
NameEmailActions
NameEmailActions@user.Name@user.EmailEdit - Remove
@user.Name@user.EmailEdit - Remove
-
+ } + + + + +@{ + string listUsers(int prevNext, int count) + { + var skip = Model.Skip; + if (prevNext == -1) + skip = Math.Max(0, Model.Skip - Model.Count); + else if (prevNext == 1) + skip = Model.Skip + count; + + var act = Url.Action("ListUsers", new + { + skip = skip, + count = count, + }); + + return act; + } +}