diff --git a/WebCms/Utility/WebGridExtensions.cs b/WebCms/Utility/WebGridExtensions.cs new file mode 100644 index 0000000..4312429 --- /dev/null +++ b/WebCms/Utility/WebGridExtensions.cs @@ -0,0 +1,220 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Web.Helpers; +using System.Web.Mvc; +using System.Web.WebPages; + +namespace LeafWeb.WebCms.Utility +{ + public static class WebGridExtensions + { + public static HelperResult PagerList( + this WebGrid webGrid, + WebGridPagerModes mode = WebGridPagerModes.NextPrevious | WebGridPagerModes.Numeric, + string firstText = null, + string previousText = null, + string nextText = null, + string lastText = null, + int numericLinksCount = 5, + string paginationStyle = null) + { + return PagerList(webGrid, mode, firstText, previousText, nextText, lastText, numericLinksCount, paginationStyle, explicitlyCalled: true); + } + + private static HelperResult PagerList( + WebGrid webGrid, + WebGridPagerModes mode, + string firstText, + string previousText, + string nextText, + string lastText, + int numericLinksCount, + string paginationStyle, + bool explicitlyCalled) + { + + int currentPage = webGrid.PageIndex; + int totalPages = webGrid.PageCount; + int lastPage = totalPages - 1; + + var ul = new TagBuilder("ul"); + ul.AddCssClass(paginationStyle); + + var li = new List(); + + if(webGrid.TotalRowCount <= webGrid.PageCount) + { + return new HelperResult(writer => + { + writer.Write(string.Empty); + }); + } + + if(ModeEnabled(mode, WebGridPagerModes.FirstLast)) + { + if(String.IsNullOrEmpty(firstText)) + { + firstText = "First"; + } + + var part = new TagBuilder("li") + { + InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(0), firstText) + }; + + if(currentPage == 0) + { + part.MergeAttribute("class", "disabled"); + } + + li.Add(part); + + } + + if(ModeEnabled(mode, WebGridPagerModes.NextPrevious)) + { + if(String.IsNullOrEmpty(previousText)) + { + previousText = "Prev"; + } + + int page = currentPage == 0 ? 0 : currentPage - 1; + + var part = new TagBuilder("li") + { + InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(page), previousText) + }; + + if(currentPage == 0) + { + part.MergeAttribute("class", "disabled"); + } + + li.Add(part); + + } + + + if(ModeEnabled(mode, WebGridPagerModes.Numeric) && (totalPages > 1)) + { + int last = currentPage + (numericLinksCount / 2); + int first = last - numericLinksCount + 1; + if(last > lastPage) + { + first -= last - lastPage; + last = lastPage; + } + if(first < 0) + { + last = Math.Min(last + (0 - first), lastPage); + first = 0; + } + for(int i = first; i <= last; i++) + { + + var pageText = (i + 1).ToString(CultureInfo.InvariantCulture); + var part = new TagBuilder("li") + { + InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(i), pageText) + }; + + if(i == currentPage) + { + part.MergeAttribute("class", "active"); + } + + li.Add(part); + + } + } + + if(ModeEnabled(mode, WebGridPagerModes.NextPrevious)) + { + if(String.IsNullOrEmpty(nextText)) + { + nextText = "Next"; + } + + int page = currentPage == lastPage ? lastPage : currentPage + 1; + + var part = new TagBuilder("li") + { + InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(page), nextText) + }; + + if(currentPage == lastPage) + { + part.MergeAttribute("class", "disabled"); + } + + li.Add(part); + + } + + if(ModeEnabled(mode, WebGridPagerModes.FirstLast)) + { + if(String.IsNullOrEmpty(lastText)) + { + lastText = "Last"; + } + + var part = new TagBuilder("li") + { + InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(lastPage), lastText) + }; + + if(currentPage == lastPage) + { + part.MergeAttribute("class", "disabled"); + } + + li.Add(part); + + } + + ul.InnerHtml = string.Join("", li); + + var html = ""; + if(explicitlyCalled && webGrid.IsAjaxEnabled) + { + var span = new TagBuilder("span"); + span.MergeAttribute("data-swhgajax", "true"); + span.MergeAttribute("data-swhgcontainer", webGrid.AjaxUpdateContainerId); + span.MergeAttribute("data-swhgcallback", webGrid.AjaxUpdateCallback); + + span.InnerHtml = ul.ToString(); + html = span.ToString(); + + } + else + { + html = ul.ToString(); + } + + return new HelperResult(writer => + { + writer.Write(html); + }); + } + + private static String GridLink(WebGrid webGrid, string url, string text) + { + TagBuilder builder = new TagBuilder("a"); + builder.SetInnerText(text); + builder.MergeAttribute("href", url); + if(webGrid.IsAjaxEnabled) + { + builder.MergeAttribute("data-swhglnk", "true"); + } + return builder.ToString(TagRenderMode.Normal); + } + + + private static bool ModeEnabled(WebGridPagerModes mode, WebGridPagerModes modeCheck) + { + return (mode & modeCheck) == modeCheck; + } + + } +}