public async Task <IHtmlContent> Pager_Links(Shape shape, DisplayContext displayContext, IShapeFactory shapeFactory, IHtmlHelper Html, string PagerId, int Page, int PageSize, double TotalItemCount, int?Quantity, object FirstText, object PreviousText, object NextText, object LastText, object GapText, bool ShowNext) { var noFollow = shape.Attributes.ContainsKey("rel") && shape.Attributes["rel"] == "no-follow"; var currentPage = Page; if (currentPage < 1) { currentPage = 1; } var pageSize = PageSize; var numberOfPagesToShow = Quantity ?? 0; if (Quantity == null || Quantity < 0) { numberOfPagesToShow = 7; } var totalPageCount = pageSize > 0 ? (int)Math.Ceiling(TotalItemCount / pageSize) : 1; // return shape early if pager is not needed. if (totalPageCount < 2) { shape.Metadata.Type = "List"; return(await displayContext.DisplayHelper.ShapeExecuteAsync(shape)); } var firstText = FirstText ?? S["<<"]; var previousText = PreviousText ?? S["<"]; var nextText = NextText ?? S[">"]; var lastText = LastText ?? S[">>"]; var gapText = GapText ?? S["..."]; var httpContextAccessor = displayContext.ServiceProvider.GetService <IHttpContextAccessor>(); var httpContext = httpContextAccessor.HttpContext; var routeData = new RouteValueDictionary(Html.ViewContext.RouteData.Values); if (httpContext != null) { var queryString = httpContext.Request.Query; if (queryString != null) { foreach (var key in from string key in queryString.Keys where key != null && !routeData.ContainsKey(key) let value = queryString[key] select key) { routeData[key] = queryString[key]; } } } // specific cross-requests route data can be passed to the shape directly (e.g., OrchardCore.Users) var shapeRouteData = shape.GetProperty <RouteData>("RouteData"); if (shapeRouteData != null) { foreach (var rd in shapeRouteData.Values) { routeData[rd.Key] = rd.Value; } } var firstPage = Math.Max(1, Page - (numberOfPagesToShow / 2)); var lastPage = Math.Min(totalPageCount, Page + (numberOfPagesToShow / 2)); var pageKey = String.IsNullOrEmpty(PagerId) ? "page" : PagerId; shape.Classes.Add("pager"); shape.Metadata.Alternates.Clear(); shape.Metadata.Type = "List"; // first and previous pages if ((Page > 1) && (routeData.ContainsKey(pageKey))) { routeData.Remove(pageKey); // to keep from having "page=1" in the query string } // first var firstItem = await shapeFactory.CreateAsync("Pager_First", Arguments.From(new { Value = firstText, RouteValues = new RouteValueDictionary(routeData), Pager = shape, Disabled = Page < 2 })); if (noFollow) { firstItem.Attributes["rel"] = "no-follow"; } await shape.AddAsync(firstItem); // previous if ((Page > 1) && (currentPage > 2)) { // also to keep from having "page=1" in the query string routeData[pageKey] = currentPage - 1; } var previousItem = await shapeFactory.CreateAsync("Pager_Previous", Arguments.From(new { Value = previousText, RouteValues = new RouteValueDictionary(routeData), Pager = shape, Disabled = Page < 2 })); if (noFollow) { previousItem.Attributes["rel"] = "no-follow"; } await shape.AddAsync(previousItem); // gap at the beginning of the pager if (firstPage > 1 && numberOfPagesToShow > 0) { await shape.AddAsync(await shapeFactory.CreateAsync("Pager_Gap", Arguments.From(new { Value = gapText, Pager = shape }))); } // page numbers if (numberOfPagesToShow > 0 && lastPage > 1) { for (var p = firstPage; p <= lastPage; p++) { if (p == currentPage) { routeData[pageKey] = currentPage; var currentPageItem = await shapeFactory.CreateAsync("Pager_CurrentPage", Arguments.From(new { Value = p, RouteValues = new RouteValueDictionary(routeData), Pager = shape })); if (noFollow) { currentPageItem.Attributes["rel"] = "no-follow"; } await shape.AddAsync(currentPageItem); } else { if (p == 1) { routeData.Remove(pageKey); } else { routeData[pageKey] = p; } var pagerItem = await shapeFactory.CreateAsync("Pager_Link", Arguments.From(new { Value = p, RouteValues = new RouteValueDictionary(routeData), Pager = shape })); if (p > currentPage) { pagerItem.Attributes["rel"] = noFollow ? "no-follow" : "next"; } else if (p < currentPage) { pagerItem.Attributes["rel"] = noFollow ? "no-follow" : "prev"; } await shape.AddAsync(pagerItem); } } } // gap at the end of the pager if (lastPage < totalPageCount && numberOfPagesToShow > 0) { await shape.AddAsync(await shapeFactory.CreateAsync("Pager_Gap", Arguments.From(new { Value = gapText, Pager = shape }))); } // Next routeData[pageKey] = Page + 1; var pagerNextItem = await shapeFactory.CreateAsync("Pager_Next", Arguments.From(new { Value = nextText, RouteValues = new RouteValueDictionary(routeData), Pager = shape, Disabled = Page >= totalPageCount && !ShowNext })); if (noFollow) { pagerNextItem.Attributes["rel"] = "no-follow"; } await shape.AddAsync(pagerNextItem); // Last routeData[pageKey] = totalPageCount; var pagerLastItem = await shapeFactory.CreateAsync("Pager_Last", Arguments.From(new { Value = lastText, RouteValues = new RouteValueDictionary(routeData), Pager = shape, Disabled = Page >= totalPageCount })); if (noFollow) { pagerLastItem.Attributes["rel"] = "no-follow"; } await shape.AddAsync(pagerLastItem); return(await displayContext.DisplayHelper.ShapeExecuteAsync(shape)); }
public async Task <IHtmlContent> PagerSlim(Shape shape, DisplayContext displayContext, IShapeFactory shapeFactory, IHtmlHelper Html, object PreviousText, object NextText, string PreviousClass, string NextClass, Dictionary <string, string> UrlParams) { var noFollow = shape.Attributes.ContainsKey("rel") && shape.Attributes["rel"] == "no-follow"; var previousText = PreviousText ?? S["<"]; var nextText = NextText ?? S[">"]; shape.Classes.Add("pager"); shape.Metadata.Alternates.Clear(); shape.Metadata.Type = "List"; var routeData = new RouteValueDictionary(Html.ViewContext.RouteData.Values); // Allows to pass custom url params to PagerSlim if (UrlParams != null) { foreach (var item in UrlParams) { routeData.Add(item.Key, item.Value); } } if (shape.TryGetProperty("Before", out string before)) { var beforeRouteData = new RouteValueDictionary(routeData) { ["before"] = before }; var previousItem = await shapeFactory.CreateAsync("Pager_Previous", Arguments.From(new { Value = previousText, RouteValues = beforeRouteData, Pager = shape })); if (noFollow) { previousItem.Attributes["rel"] = "no-follow"; } await shape.AddAsync(previousItem); shape.Properties["FirstClass"] = PreviousClass; } if (shape.TryGetProperty("After", out string after)) { var afterRouteData = new RouteValueDictionary(routeData) { ["after"] = after }; var nextItem = await shapeFactory.CreateAsync("Pager_Next", Arguments.From(new { Value = nextText, RouteValues = afterRouteData, Pager = shape })); if (noFollow) { nextItem.Attributes["rel"] = "no-follow"; } await shape.AddAsync(nextItem); shape.Properties["LastClass"] = NextClass; } return(await displayContext.DisplayHelper.ShapeExecuteAsync(shape)); }
public async Task <IHtmlContent> Pager_Links(Shape shape, DisplayContext displayContext, IShapeFactory shapeFactory, IHtmlHelper Html, string PagerId, int Page, int PageSize, double TotalItemCount, int?Quantity, object FirstText, object PreviousText, object NextText, object LastText, object GapText, bool ShowNext, Dictionary <string, string> UrlParams) { var noFollow = shape.Attributes.ContainsKey("rel") && shape.Attributes["rel"] == "no-follow"; var currentPage = Page; if (currentPage < 1) { currentPage = 1; } var pageSize = PageSize; var numberOfPagesToShow = Quantity ?? 0; if (Quantity == null || Quantity < 0) { numberOfPagesToShow = 7; } var totalPageCount = pageSize > 0 ? (int)Math.Ceiling(TotalItemCount / pageSize) : 1; // return shape early if pager is not needed. if (totalPageCount < 2) { shape.Metadata.Type = "List"; return(await displayContext.DisplayHelper.ShapeExecuteAsync(shape)); } var firstText = FirstText ?? S["<<"]; var previousText = PreviousText ?? S["<"]; var nextText = NextText ?? S[">"]; var lastText = LastText ?? S[">>"]; var gapText = GapText ?? S["..."]; var routeData = GetRouteData(shape, displayContext, Html); SetCustomUrlParams(UrlParams, routeData); var firstPage = Math.Max(1, Page - (numberOfPagesToShow / 2)); var lastPage = Math.Min(totalPageCount, Page + (numberOfPagesToShow / 2)); var pageKey = String.IsNullOrEmpty(PagerId) ? "pagenum" : PagerId; shape.Classes.Add("pager"); shape.Metadata.Alternates.Clear(); shape.Metadata.Type = "List"; // first and previous pages if ((Page > 1) && (routeData.ContainsKey(pageKey))) { routeData.Remove(pageKey); // to keep from having "pagenum=1" in the query string } // first var firstItem = await shapeFactory.CreateAsync("Pager_First", Arguments.From(new { Value = firstText, RouteValues = new RouteValueDictionary(routeData), Pager = shape, Disabled = Page < 2 })); if (noFollow) { firstItem.Attributes["rel"] = "no-follow"; } await shape.AddAsync(firstItem); // previous if ((Page > 1) && (currentPage > 2)) { // also to keep from having "pagenum=1" in the query string routeData[pageKey] = currentPage - 1; } var previousItem = await shapeFactory.CreateAsync("Pager_Previous", Arguments.From(new { Value = previousText, RouteValues = new RouteValueDictionary(routeData), Pager = shape, Disabled = Page < 2 })); if (noFollow) { previousItem.Attributes["rel"] = "no-follow"; } await shape.AddAsync(previousItem); // gap at the beginning of the pager if (firstPage > 1 && numberOfPagesToShow > 0) { await shape.AddAsync(await shapeFactory.CreateAsync("Pager_Gap", Arguments.From(new { Value = gapText, Pager = shape }))); } // page numbers if (numberOfPagesToShow > 0 && lastPage > 1) { for (var p = firstPage; p <= lastPage; p++) { if (p == 1) { // to keep from having "pagenum=1" in the query string routeData.Remove(pageKey); } else { routeData[pageKey] = p; } if (p == currentPage) { var currentPageItem = await shapeFactory.CreateAsync("Pager_CurrentPage", Arguments.From(new { Value = p, RouteValues = new RouteValueDictionary(routeData), Pager = shape })); if (noFollow) { currentPageItem.Attributes["rel"] = "no-follow"; } await shape.AddAsync(currentPageItem); } else { var pagerItem = await shapeFactory.CreateAsync("Pager_Link", Arguments.From(new { Value = p, RouteValues = new RouteValueDictionary(routeData), Pager = shape })); if (p > currentPage) { pagerItem.Attributes["rel"] = noFollow ? "no-follow" : "next"; } else if (p < currentPage) { pagerItem.Attributes["rel"] = noFollow ? "no-follow" : "prev"; } await shape.AddAsync(pagerItem); } } } // gap at the end of the pager if (lastPage < totalPageCount && numberOfPagesToShow > 0) { await shape.AddAsync(await shapeFactory.CreateAsync("Pager_Gap", Arguments.From(new { Value = gapText, Pager = shape }))); } // Next routeData[pageKey] = Page + 1; var pagerNextItem = await shapeFactory.CreateAsync("Pager_Next", Arguments.From(new { Value = nextText, RouteValues = new RouteValueDictionary(routeData), Pager = shape, Disabled = Page >= totalPageCount && !ShowNext })); if (noFollow) { pagerNextItem.Attributes["rel"] = "no-follow"; } await shape.AddAsync(pagerNextItem); // Last routeData[pageKey] = totalPageCount; var pagerLastItem = await shapeFactory.CreateAsync("Pager_Last", Arguments.From(new { Value = lastText, RouteValues = new RouteValueDictionary(routeData), Pager = shape, Disabled = Page >= totalPageCount })); if (noFollow) { pagerLastItem.Attributes["rel"] = "no-follow"; } await shape.AddAsync(pagerLastItem); return(await displayContext.DisplayHelper.ShapeExecuteAsync(shape)); }