From ded7dc47c6f655e0c2690588a67755590600a9d9 Mon Sep 17 00:00:00 2001 From: Hamid Reza Mohammadi Date: Sun, 30 Aug 2026 07:41:08 +0330 Subject: [PATCH] pagination fix --- GanjooRazor/Areas/Admin/Pages/Users.cshtml.cs | 65 +++++++++++++++---- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/GanjooRazor/Areas/Admin/Pages/Users.cshtml.cs b/GanjooRazor/Areas/Admin/Pages/Users.cshtml.cs index bef72eb1..6b8d3687 100644 --- a/GanjooRazor/Areas/Admin/Pages/Users.cshtml.cs +++ b/GanjooRazor/Areas/Admin/Pages/Users.cshtml.cs @@ -66,19 +66,7 @@ namespace GanjooRazor.Areas.Admin.Pages Paging = JsonConvert.DeserializeObject(values.FirstOrDefault()); if (Paging != null) { - for (int p = 1; p <= Paging.totalPages; p++) - { - var pageUrl = $"?pageNumber={p}&pageSize={PageSize}"; - if (!string.IsNullOrEmpty(FilterByEmail)) - pageUrl += $"&filterByEmail={Uri.EscapeDataString(FilterByEmail)}"; - if (!string.IsNullOrEmpty(FilterByNickName)) - pageUrl += $"&filterByNickName={Uri.EscapeDataString(FilterByNickName)}"; - PaginationLinks.Add(new NameIdUrlImage() - { - Name = p.ToString(), - Url = p == PageNumber ? "" : pageUrl - }); - } + PaginationLinks = BuildPaginationLinks(PageNumber, Paging.totalPages, PageSize, FilterByEmail, FilterByNickName); } } } @@ -96,6 +84,57 @@ namespace GanjooRazor.Areas.Admin.Pages return Page(); } + /// + /// Builds a compact pager: first/prev, a window of page numbers around the + /// current page (with first/last always included and "…" for gaps), next/last. + /// Avoids listing every single page number when there are many pages. + /// + private static List BuildPaginationLinks(int currentPage, int totalPages, int pageSize, string filterByEmail, string filterByNickName) + { + var links = new List(); + if (totalPages < 1) + return links; + + string UrlFor(int p) + { + var u = $"?pageNumber={p}&pageSize={pageSize}"; + if (!string.IsNullOrEmpty(filterByEmail)) + u += $"&filterByEmail={Uri.EscapeDataString(filterByEmail)}"; + if (!string.IsNullOrEmpty(filterByNickName)) + u += $"&filterByNickName={Uri.EscapeDataString(filterByNickName)}"; + return u; + } + + // first / previous + links.Add(new NameIdUrlImage() { Name = "▶▶ اول", Url = currentPage <= 1 ? "" : UrlFor(1) }); + links.Add(new NameIdUrlImage() { Name = "▶ قبلی", Url = currentPage <= 1 ? "" : UrlFor(currentPage - 1) }); + + // window of page numbers around current, always including page 1 and totalPages + const int windowRadius = 2; + var pagesToShow = new SortedSet(); + for (int p = Math.Max(1, currentPage - windowRadius); p <= Math.Min(totalPages, currentPage + windowRadius); p++) + pagesToShow.Add(p); + pagesToShow.Add(1); + pagesToShow.Add(totalPages); + + int? previousShown = null; + foreach (var p in pagesToShow) + { + if (previousShown.HasValue && p > previousShown.Value + 1) + { + links.Add(new NameIdUrlImage() { Name = "…", Url = "" }); + } + links.Add(new NameIdUrlImage() { Name = p.ToString(), Url = p == currentPage ? "" : UrlFor(p) }); + previousShown = p; + } + + // next / last + links.Add(new NameIdUrlImage() { Name = "بعدی ◀", Url = currentPage >= totalPages ? "" : UrlFor(currentPage + 1) }); + links.Add(new NameIdUrlImage() { Name = "آخر ◀◀", Url = currentPage >= totalPages ? "" : UrlFor(totalPages) }); + + return links; + } + /// /// role names for a specific user - ?handler=Roles&id=... ///