From d25db2e06c4ec2b012302ca87acb7289c42cb50c Mon Sep 17 00:00:00 2001 From: Robert Muehsig Date: Tue, 17 Jun 2014 20:26:48 +0200 Subject: [PATCH] "UI" Paging in profiles --- .../Controllers/UsersController.cs | 8 +--- src/NuGetGallery/UrlExtensions.cs | 41 +++++++++++++------ .../ViewModels/UserProfileModel.cs | 36 ++++++++++++---- src/NuGetGallery/Views/Users/Profiles.cshtml | 16 +++++--- 4 files changed, 70 insertions(+), 31 deletions(-) diff --git a/src/NuGetGallery/Controllers/UsersController.cs b/src/NuGetGallery/Controllers/UsersController.cs index 5db156a70d..50794f10b1 100644 --- a/src/NuGetGallery/Controllers/UsersController.cs +++ b/src/NuGetGallery/Controllers/UsersController.cs @@ -253,7 +253,7 @@ public virtual async Task Confirm(string username, string token) return View(model); } - public virtual ActionResult Profiles(string username) + public virtual ActionResult Profiles(string username, int page = 1) { var user = UserService.FindByUsername(username); if (user == null) @@ -269,11 +269,7 @@ public virtual ActionResult Profiles(string username) Version = null }).ToList(); - var model = new UserProfileModel(user) - { - Packages = packages, - TotalPackageDownloadCount = packages.Sum(p => p.TotalDownloadCount), - }; + var model = new UserProfileModel(user, packages, page - 1, Constants.DefaultPackageListPageSize, Url); return View(model); } diff --git a/src/NuGetGallery/UrlExtensions.cs b/src/NuGetGallery/UrlExtensions.cs index fbdbb96eea..93821428f3 100644 --- a/src/NuGetGallery/UrlExtensions.cs +++ b/src/NuGetGallery/UrlExtensions.cs @@ -70,6 +70,8 @@ public static string PackageList(this UrlHelper url, int page, string q) }); } + + public static string CuratedPackageList(this UrlHelper url, int page, string q, string curatedFeedName) { return url.Action("ListPackages", "CuratedFeeds", new @@ -141,7 +143,7 @@ public static string PackageDownload(this UrlHelper url, int feedVersion, string string routeName = "v" + feedVersion + RouteName.DownloadPackage; string protocol = url.RequestContext.HttpContext.Request.IsSecureConnection ? "https" : "http"; string result = url.RouteUrl(routeName, new { Id = id, Version = version }, protocol: protocol); - + // Ensure trailing slashes for versionless package URLs, as a fix for package filenames that look like known file extensions return version == null ? EnsureTrailingSlash(result) : result; } @@ -198,14 +200,26 @@ public static string UploadPackage(this UrlHelper url) return url.RouteUrl(RouteName.UploadPackage); } - public static string User(this UrlHelper url, User user, string scheme = null) + public static string User(this UrlHelper url, User user, int page = 1, string scheme = null) { - string result = url.Action( - actionName: "Profiles", - controllerName: "Users", - routeValues: new { username = user.Username }, - protocol: scheme); - return EnsureTrailingSlash(result); + string result; + if (page == 1) + { + result = url.Action(actionName: "Profiles", + controllerName: "Users", + routeValues: new { username = user.Username }, + protocol: scheme); + } + else + { + result = url.Action(actionName: "Profiles", + controllerName: "Users", + routeValues: new { username = user.Username, page = page }, + protocol: scheme); + } + + + return result; } public static string EditPackage(this UrlHelper url, string id, string version) @@ -221,9 +235,10 @@ public static string EditPackage(this UrlHelper url, string id, string version) public static string DeletePackage(this UrlHelper url, IPackageVersionModel package) { return url.Action( - actionName: "Delete", - controllerName: "Packages", - routeValues: new { + actionName: "Delete", + controllerName: "Packages", + routeValues: new + { id = package.Id, version = package.Version }); @@ -252,8 +267,8 @@ public static string ConfirmationUrl(this UrlHelper url, string action, string c rvd["username"] = username; rvd["token"] = token; return url.Action( - action, - controller, + action, + controller, rvd, url.RequestContext.HttpContext.Request.Url.Scheme, url.RequestContext.HttpContext.Request.Url.Host); diff --git a/src/NuGetGallery/ViewModels/UserProfileModel.cs b/src/NuGetGallery/ViewModels/UserProfileModel.cs index ee8e4865c0..f630e3aa2d 100644 --- a/src/NuGetGallery/ViewModels/UserProfileModel.cs +++ b/src/NuGetGallery/ViewModels/UserProfileModel.cs @@ -1,22 +1,44 @@ using System.Collections.Generic; +using System.Linq; +using System.Web.Mvc; namespace NuGetGallery { public class UserProfileModel { - public UserProfileModel() { } - - public UserProfileModel(User user) + public UserProfileModel(User user, List allPackages, int pageIndex, int pageSize, UrlHelper url) { Username = user.Username; EmailAddress = user.EmailAddress; UnconfirmedEmailAddress = user.UnconfirmedEmailAddress; + AllPackages = allPackages; + TotalPackages = allPackages.Count; + PackagePage = pageIndex; + PackagePageSize = pageSize; + + TotalPackageDownloadCount = AllPackages.Sum(p => p.TotalDownloadCount); + + PackagePageTotalCount = (TotalPackages + PackagePageSize - 1) / PackagePageSize; + + var pager = new PreviousNextPagerViewModel(allPackages, pageIndex, PackagePageTotalCount, + page => url.User(user, page)); + + Pager = pager; + PagedPackages = AllPackages.Skip(PackagePageSize * pageIndex) + .Take(PackagePageSize).ToList(); } - public string Username { get; set; } - public string EmailAddress { get; set; } + public int PackagePageTotalCount { get; private set; } + public string Username { get; private set; } + public string EmailAddress { get; private set; } public string UnconfirmedEmailAddress { get; set; } - public ICollection Packages { get; set; } - public int TotalPackageDownloadCount { get; set; } + public ICollection AllPackages { get; private set; } + public ICollection PagedPackages { get; private set; } + public int TotalPackageDownloadCount { get; private set; } + public int TotalPackages { get; private set; } + public int PackagePage { get; private set; } + public int PackagePageSize { get; private set; } + public IPreviousNextPager Pager { get; private set; } + } } \ No newline at end of file diff --git a/src/NuGetGallery/Views/Users/Profiles.cshtml b/src/NuGetGallery/Views/Users/Profiles.cshtml index 666de66e6f..2d96ce4f75 100644 --- a/src/NuGetGallery/Views/Users/Profiles.cshtml +++ b/src/NuGetGallery/Views/Users/Profiles.cshtml @@ -12,8 +12,8 @@ }
-

@Model.Packages.Count.ToString("n0")

-

@(Model.Packages.Count == 1 ? "Package" : "Packages")

+

@Model.AllPackages.Count.ToString("n0")

+

@(Model.AllPackages.Count == 1 ? "Package" : "Packages")

@Model.TotalPackageDownloadCount.ToString("n0")

@@ -24,9 +24,13 @@

@Model.Username's Profile

-

Packages

+

Packages + @if (Model.PackagePageTotalCount > 1) +{ + (Page @(Model.PackagePage + 1) of @Model.PackagePageTotalCount) +}

    - @foreach (var package in Model.Packages) + @foreach (var package in Model.PagedPackages) {
  • @@ -59,4 +63,6 @@
  • } -
\ No newline at end of file + + +@ViewHelpers.PreviousNextPager(Model.Pager) \ No newline at end of file