From dee89550196f0ca477a92fed2d34c8ccfca0fbb3 Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Tue, 2 Nov 2010 14:55:01 -0700 Subject: [PATCH] A bit more work to get paging wrapped up including a Pager template overide for TheAdmin to use a number pager (e.g. < 1 2 3 >) --HG-- branch : dev --- .../Contents/Controllers/AdminController.cs | 6 +- .../Core/Shapes/Views/Pager.cshtml | 6 +- .../Controllers/BlogAdminController.cs | 29 ++++++--- .../Orchard.Blogs/Orchard.Blogs.csproj | 2 +- .../Orchard.Blogs/Services/BlogPostService.cs | 12 ++-- .../Services/IBlogPostService.cs | 1 + ...cshtml => Blogs.BlogPost.ListAdmin.cshtml} | 0 .../Controllers/AdminController.cs | 3 +- .../Themes/TheAdmin/Styles/site.css | 3 +- .../Themes/TheAdmin/Views/Pager.cshtml | 65 +++++++++++++++++++ src/Orchard.Web/Themes/Themes.csproj | 4 +- .../ContentManagement/DefaultContentQuery.cs | 3 +- 12 files changed, 107 insertions(+), 27 deletions(-) rename src/Orchard.Web/Modules/Orchard.Blogs/Views/Parts/{Blogs.BlogPost.List.Admin.cshtml => Blogs.BlogPost.ListAdmin.cshtml} (100%) create mode 100644 src/Orchard.Web/Themes/TheAdmin/Views/Pager.cshtml diff --git a/src/Orchard.Web/Core/Contents/Controllers/AdminController.cs b/src/Orchard.Web/Core/Contents/Controllers/AdminController.cs index 836d45c76..0dc8901ed 100644 --- a/src/Orchard.Web/Core/Contents/Controllers/AdminController.cs +++ b/src/Orchard.Web/Core/Contents/Controllers/AdminController.cs @@ -77,19 +77,17 @@ namespace Orchard.Core.Contents.Controllers { break; } - var pageOfContentItems = query.Slice(pager.GetStartIndex(), pager.PageSize).ToList(); - model.Options.SelectedFilter = model.TypeName; model.Options.FilterOptions = GetCreatableTypes() .Select(ctd => new KeyValuePair(ctd.Name, ctd.DisplayName)) .ToList().OrderBy(kvp => kvp.Key); + var pagerShape = Shape.Pager(pager).TotalItemCount(query.Count()); + var pageOfContentItems = query.Slice(pager.GetStartIndex(), pager.PageSize).ToList(); var list = Shape.List(); list.AddRange(pageOfContentItems.Select(ci => _contentManager.BuildDisplay(ci, "SummaryAdmin"))); - var pagerShape = Shape.Pager(pager).TotalItemCount(query.Count()); - var viewModel = Shape.ViewModel() .ContentItems(list) .Pager(pagerShape) diff --git a/src/Orchard.Web/Core/Shapes/Views/Pager.cshtml b/src/Orchard.Web/Core/Shapes/Views/Pager.cshtml index 411525e30..94825e86c 100644 --- a/src/Orchard.Web/Core/Shapes/Views/Pager.cshtml +++ b/src/Orchard.Web/Core/Shapes/Views/Pager.cshtml @@ -6,7 +6,7 @@ var queryString = ViewContext.HttpContext.Request.QueryString; if (queryString != null) { foreach (string key in queryString.Keys) { - if (!routeData.ContainsKey(key)) { + if (key != null && !routeData.ContainsKey(key)) { var value = queryString[key]; routeData[key] = queryString[key]; } @@ -27,13 +27,13 @@ @tag.StartElement if(hasNextPage) { routeData["page"] = Model.Page + 1; -
  • +
  • @Html.ActionLink((string)nextText, (string)routeData["action"], (string)routeData["controller"], routeData, null)
  • } if(Model.Page > 1) { routeData["page"] = Model.Page - 1; -
  • +
  • @Html.ActionLink((string)previousText, (string)routeData["action"], (string)routeData["controller"], routeData, null)
  • } diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Controllers/BlogAdminController.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Controllers/BlogAdminController.cs index 1a7d64535..39a7ddc4a 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Controllers/BlogAdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Controllers/BlogAdminController.cs @@ -10,6 +10,7 @@ using Orchard.Data; using Orchard.DisplayManagement; using Orchard.Localization; using Orchard.UI.Admin; +using Orchard.UI.Navigation; using Orchard.UI.Notify; namespace Orchard.Blogs.Controllers { @@ -27,7 +28,8 @@ namespace Orchard.Blogs.Controllers { IBlogPostService blogPostService, IContentManager contentManager, ITransactionManager transactionManager, - IBlogSlugConstraint blogSlugConstraint) { + IBlogSlugConstraint blogSlugConstraint, + IShapeFactory shapeFactory) { Services = services; _blogService = blogService; _blogPostService = blogPostService; @@ -35,8 +37,10 @@ namespace Orchard.Blogs.Controllers { _transactionManager = transactionManager; _blogSlugConstraint = blogSlugConstraint; T = NullLocalizer.Instance; + Shape = shapeFactory; } + dynamic Shape { get; set; } public Localizer T { get; set; } public IOrchardServices Services { get; set; } @@ -135,20 +139,25 @@ namespace Orchard.Blogs.Controllers { return View(viewModel); } - public ActionResult Item(string blogSlug) { + public ActionResult Item(string blogSlug, Pager pager) { BlogPart blogPart = _blogService.Get(blogSlug); if (blogPart == null) return HttpNotFound(); - //() => { - // var list = shapeHelper.List(); - // list.AddRange(_blogPostService.Get(part, VersionOptions.Latest) - // .Select(bp => _contentManager.BuildDisplay(bp, "SummaryAdmin"))); - // return shapeHelper.Parts_Blogs_BlogPost_List_Admin(ContentPart: part, ContentItems: list); - //}) - var model = Services.ContentManager.BuildDisplay(blogPart, "DetailAdmin"); - return View(model); + var blogPosts = _blogPostService.Get(blogPart, pager.GetStartIndex(), pager.PageSize, VersionOptions.Latest) + .Select(bp => _contentManager.BuildDisplay(bp, "SummaryAdmin")); + + var blog = Services.ContentManager.BuildDisplay(blogPart, "DetailAdmin"); + + var list = Shape.List(); + list.AddRange(blogPosts); + blog.Content.Add(Shape.Parts_Blogs_BlogPost_ListAdmin(ContentItems: list), "5"); + + var totalItemCount = _blogPostService.PostCount(blogPart, VersionOptions.Latest); + blog.Content.Add(Shape.Pager(pager).TotalItemCount(totalItemCount), "Content:after"); + + return View(blog); } bool IUpdateModel.TryUpdateModel(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) { diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj b/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj index e1316a27a..1b1b04662 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj @@ -131,7 +131,7 @@ - + Code diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostService.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostService.cs index 16fe8ba4c..18d6158ea 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostService.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostService.cs @@ -49,18 +49,22 @@ namespace Orchard.Blogs.Services { return GetBlogQuery(blogPart, versionOptions).List().Select(ci => ci.As()); } - public int PostCount(BlogPart blogPart, VersionOptions versionOptions) { - return GetBlogQuery(blogPart, versionOptions).Count(); + public IEnumerable Get(BlogPart blogPart, int skip, int count) { + return Get(blogPart, skip, count, VersionOptions.Published); } - public IEnumerable Get(BlogPart blogPart, int skip, int count) { - return GetBlogQuery(blogPart, VersionOptions.Published).Slice(skip, count).ToList().Select(ci => ci.As()); + public IEnumerable Get(BlogPart blogPart, int skip, int count, VersionOptions versionOptions) { + return GetBlogQuery(blogPart, versionOptions).Slice(skip, count).ToList().Select(ci => ci.As()); } public int PostCount(BlogPart blogPart) { return PostCount(blogPart, VersionOptions.Published); } + public int PostCount(BlogPart blogPart, VersionOptions versionOptions) { + return GetBlogQuery(blogPart, versionOptions).Count(); + } + public IEnumerable Get(BlogPart blogPart, ArchiveData archiveData) { var query = GetBlogQuery(blogPart, VersionOptions.Published); diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Services/IBlogPostService.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Services/IBlogPostService.cs index a24ae2890..6bce07c57 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Services/IBlogPostService.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Services/IBlogPostService.cs @@ -13,6 +13,7 @@ namespace Orchard.Blogs.Services { IEnumerable Get(BlogPart blogPart, VersionOptions versionOptions); IEnumerable Get(BlogPart blogPart, ArchiveData archiveData); IEnumerable Get(BlogPart blogPart, int skip, int count); + IEnumerable Get(BlogPart blogPart, int skip, int count, VersionOptions versionOptions); int PostCount(BlogPart blogPart); int PostCount(BlogPart blogPart, VersionOptions versionOptions); IEnumerable> GetArchives(BlogPart blogPart); diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Views/Parts/Blogs.BlogPost.List.Admin.cshtml b/src/Orchard.Web/Modules/Orchard.Blogs/Views/Parts/Blogs.BlogPost.ListAdmin.cshtml similarity index 100% rename from src/Orchard.Web/Modules/Orchard.Blogs/Views/Parts/Blogs.BlogPost.List.Admin.cshtml rename to src/Orchard.Web/Modules/Orchard.Blogs/Views/Parts/Blogs.BlogPost.ListAdmin.cshtml diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Comments/Controllers/AdminController.cs index 8e5b4f21f..57dbf21fd 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Controllers/AdminController.cs @@ -63,9 +63,8 @@ namespace Orchard.Comments.Controllers { throw new ArgumentOutOfRangeException(); } - var entries = comments.Slice(pager.GetStartIndex(), pager.PageSize).ToList().Select(comment => CreateCommentEntry(comment.Record)); - var pagerShape = Shape.Pager(pager).TotalItemCount(comments.Count()); + var entries = comments.Slice(pager.GetStartIndex(), pager.PageSize).ToList().Select(comment => CreateCommentEntry(comment.Record)); var model = new CommentsIndexViewModel { Comments = entries.ToList(), diff --git a/src/Orchard.Web/Themes/TheAdmin/Styles/site.css b/src/Orchard.Web/Themes/TheAdmin/Styles/site.css index 31437019b..d6e0eb925 100644 --- a/src/Orchard.Web/Themes/TheAdmin/Styles/site.css +++ b/src/Orchard.Web/Themes/TheAdmin/Styles/site.css @@ -803,8 +803,9 @@ table .button { .pager { list-style: none; padding: 0; margin: 12px 0 0 0; } .pager li { float: left; padding: 0 12px 0 0; margin: 0; } -.pager a { font-size: 1.077em; display: block; background-color: whiteSmoke; padding: 6px 6px; color: #333;} +.pager a, .pager span { font-size: 1.077em; display: block; background-color: whiteSmoke; padding: 6px 6px; color: #333;} .pager a:hover { background-color: #eaeaea; color: #333; } +.pager span { background-color:inherit; } /* Core Modules diff --git a/src/Orchard.Web/Themes/TheAdmin/Views/Pager.cshtml b/src/Orchard.Web/Themes/TheAdmin/Views/Pager.cshtml new file mode 100644 index 000000000..b8cb600b1 --- /dev/null +++ b/src/Orchard.Web/Themes/TheAdmin/Views/Pager.cshtml @@ -0,0 +1,65 @@ +@{ + var nextText = HasText(Model.NextText) ? Model.NextText : T(">").Text; + var previousText = HasText(Model.PreviousText) ? Model.PreviousText : T("<").Text; + + var routeData = new RouteValueDictionary(ViewContext.RouteData.Values); + var queryString = ViewContext.HttpContext.Request.QueryString; + if (queryString != null) { + foreach (string key in queryString.Keys) { + if (key != null && !routeData.ContainsKey(key)) { + var value = queryString[key]; + routeData[key] = queryString[key]; + } + } + } + + if (routeData.ContainsKey("id") && !HasText(routeData["id"])) { + routeData.Remove("id"); + } + + var totalPageCount = (int) Math.Ceiling((double) Model.TotalItemCount / Model.PageSize); + + Model.Classes.Add("pager"); + Model.Classes.Add("group"); + var tag = Tag(Model, "ul"); +} +@if (totalPageCount > 1) { + @tag.StartElement + // previous page + if(Model.Page > 1) { + if (Model.Page == 2 && routeData.ContainsKey("page")) { + routeData.Remove("page"); + } + else { + routeData["page"] = Model.Page - 1; + } +
  • + @Html.ActionLink((string)previousText, (string)routeData["action"], (string)routeData["controller"], routeData, null) +
  • + } + // page numbers + for (var p = 1; p <= totalPageCount; p++) { +
  • + @if (p == Model.Page) { + @p + } + else { + if (p == 1) { + routeData.Remove("page"); + } + else { + routeData["page"] = p; + } + @Html.ActionLink(p.ToString(), (string)routeData["action"], (string)routeData["controller"], routeData, null) + } +
  • + } + // next page + if(Model.Page < totalPageCount) { + routeData["page"] = Model.Page + 1; +
  • + @Html.ActionLink((string)nextText, (string)routeData["action"], (string)routeData["controller"], routeData, null) +
  • + } + @tag.EndElement +} \ No newline at end of file diff --git a/src/Orchard.Web/Themes/Themes.csproj b/src/Orchard.Web/Themes/Themes.csproj index 7b6afc1bf..7d12ed2ce 100644 --- a/src/Orchard.Web/Themes/Themes.csproj +++ b/src/Orchard.Web/Themes/Themes.csproj @@ -93,7 +93,9 @@ - + + +