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
This commit is contained in:
Nathan Heskew
2010-11-02 14:55:01 -07:00
parent e0352aa87d
commit dee8955019
12 changed files with 107 additions and 27 deletions

View File

@@ -77,19 +77,17 @@ namespace Orchard.Core.Contents.Controllers {
break; break;
} }
var pageOfContentItems = query.Slice(pager.GetStartIndex(), pager.PageSize).ToList();
model.Options.SelectedFilter = model.TypeName; model.Options.SelectedFilter = model.TypeName;
model.Options.FilterOptions = GetCreatableTypes() model.Options.FilterOptions = GetCreatableTypes()
.Select(ctd => new KeyValuePair<string, string>(ctd.Name, ctd.DisplayName)) .Select(ctd => new KeyValuePair<string, string>(ctd.Name, ctd.DisplayName))
.ToList().OrderBy(kvp => kvp.Key); .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(); var list = Shape.List();
list.AddRange(pageOfContentItems.Select(ci => _contentManager.BuildDisplay(ci, "SummaryAdmin"))); list.AddRange(pageOfContentItems.Select(ci => _contentManager.BuildDisplay(ci, "SummaryAdmin")));
var pagerShape = Shape.Pager(pager).TotalItemCount(query.Count());
var viewModel = Shape.ViewModel() var viewModel = Shape.ViewModel()
.ContentItems(list) .ContentItems(list)
.Pager(pagerShape) .Pager(pagerShape)

View File

@@ -6,7 +6,7 @@
var queryString = ViewContext.HttpContext.Request.QueryString; var queryString = ViewContext.HttpContext.Request.QueryString;
if (queryString != null) { if (queryString != null) {
foreach (string key in queryString.Keys) { foreach (string key in queryString.Keys) {
if (!routeData.ContainsKey(key)) { if (key != null && !routeData.ContainsKey(key)) {
var value = queryString[key]; var value = queryString[key];
routeData[key] = queryString[key]; routeData[key] = queryString[key];
} }
@@ -27,13 +27,13 @@
@tag.StartElement @tag.StartElement
if(hasNextPage) { if(hasNextPage) {
routeData["page"] = Model.Page + 1; routeData["page"] = Model.Page + 1;
<li class="older"> <li class="page-next">
@Html.ActionLink((string)nextText, (string)routeData["action"], (string)routeData["controller"], routeData, null) @Html.ActionLink((string)nextText, (string)routeData["action"], (string)routeData["controller"], routeData, null)
</li> </li>
} }
if(Model.Page > 1) { if(Model.Page > 1) {
routeData["page"] = Model.Page - 1; routeData["page"] = Model.Page - 1;
<li class="newer"> <li class="page-previous">
@Html.ActionLink((string)previousText, (string)routeData["action"], (string)routeData["controller"], routeData, null) @Html.ActionLink((string)previousText, (string)routeData["action"], (string)routeData["controller"], routeData, null)
</li> </li>
} }

View File

@@ -10,6 +10,7 @@ using Orchard.Data;
using Orchard.DisplayManagement; using Orchard.DisplayManagement;
using Orchard.Localization; using Orchard.Localization;
using Orchard.UI.Admin; using Orchard.UI.Admin;
using Orchard.UI.Navigation;
using Orchard.UI.Notify; using Orchard.UI.Notify;
namespace Orchard.Blogs.Controllers { namespace Orchard.Blogs.Controllers {
@@ -27,7 +28,8 @@ namespace Orchard.Blogs.Controllers {
IBlogPostService blogPostService, IBlogPostService blogPostService,
IContentManager contentManager, IContentManager contentManager,
ITransactionManager transactionManager, ITransactionManager transactionManager,
IBlogSlugConstraint blogSlugConstraint) { IBlogSlugConstraint blogSlugConstraint,
IShapeFactory shapeFactory) {
Services = services; Services = services;
_blogService = blogService; _blogService = blogService;
_blogPostService = blogPostService; _blogPostService = blogPostService;
@@ -35,8 +37,10 @@ namespace Orchard.Blogs.Controllers {
_transactionManager = transactionManager; _transactionManager = transactionManager;
_blogSlugConstraint = blogSlugConstraint; _blogSlugConstraint = blogSlugConstraint;
T = NullLocalizer.Instance; T = NullLocalizer.Instance;
Shape = shapeFactory;
} }
dynamic Shape { get; set; }
public Localizer T { get; set; } public Localizer T { get; set; }
public IOrchardServices Services { get; set; } public IOrchardServices Services { get; set; }
@@ -135,20 +139,25 @@ namespace Orchard.Blogs.Controllers {
return View(viewModel); return View(viewModel);
} }
public ActionResult Item(string blogSlug) { public ActionResult Item(string blogSlug, Pager pager) {
BlogPart blogPart = _blogService.Get(blogSlug); BlogPart blogPart = _blogService.Get(blogSlug);
if (blogPart == null) if (blogPart == null)
return HttpNotFound(); 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"); var blogPosts = _blogPostService.Get(blogPart, pager.GetStartIndex(), pager.PageSize, VersionOptions.Latest)
return View(model); .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>(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) { bool IUpdateModel.TryUpdateModel<TModel>(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) {

View File

@@ -131,7 +131,7 @@
<Content Include="Views\Parts\Blogs.Blog.Manage.cshtml" /> <Content Include="Views\Parts\Blogs.Blog.Manage.cshtml" />
<Content Include="Views\Parts\Blogs.Blog.Description.cshtml" /> <Content Include="Views\Parts\Blogs.Blog.Description.cshtml" />
<Content Include="Views\EditorTemplates\Parts\Blogs.Blog.Fields.cshtml" /> <Content Include="Views\EditorTemplates\Parts\Blogs.Blog.Fields.cshtml" />
<Content Include="Views\Parts\Blogs.BlogPost.List.Admin.cshtml"> <Content Include="Views\Parts\Blogs.BlogPost.ListAdmin.cshtml">
<SubType>Code</SubType> <SubType>Code</SubType>
</Content> </Content>
<Content Include="Views\Items\Content-Blog.SummaryAdmin.cshtml" /> <Content Include="Views\Items\Content-Blog.SummaryAdmin.cshtml" />

View File

@@ -49,18 +49,22 @@ namespace Orchard.Blogs.Services {
return GetBlogQuery(blogPart, versionOptions).List().Select(ci => ci.As<BlogPostPart>()); return GetBlogQuery(blogPart, versionOptions).List().Select(ci => ci.As<BlogPostPart>());
} }
public int PostCount(BlogPart blogPart, VersionOptions versionOptions) { public IEnumerable<BlogPostPart> Get(BlogPart blogPart, int skip, int count) {
return GetBlogQuery(blogPart, versionOptions).Count(); return Get(blogPart, skip, count, VersionOptions.Published);
} }
public IEnumerable<BlogPostPart> Get(BlogPart blogPart, int skip, int count) { public IEnumerable<BlogPostPart> Get(BlogPart blogPart, int skip, int count, VersionOptions versionOptions) {
return GetBlogQuery(blogPart, VersionOptions.Published).Slice(skip, count).ToList().Select(ci => ci.As<BlogPostPart>()); return GetBlogQuery(blogPart, versionOptions).Slice(skip, count).ToList().Select(ci => ci.As<BlogPostPart>());
} }
public int PostCount(BlogPart blogPart) { public int PostCount(BlogPart blogPart) {
return PostCount(blogPart, VersionOptions.Published); return PostCount(blogPart, VersionOptions.Published);
} }
public int PostCount(BlogPart blogPart, VersionOptions versionOptions) {
return GetBlogQuery(blogPart, versionOptions).Count();
}
public IEnumerable<BlogPostPart> Get(BlogPart blogPart, ArchiveData archiveData) { public IEnumerable<BlogPostPart> Get(BlogPart blogPart, ArchiveData archiveData) {
var query = GetBlogQuery(blogPart, VersionOptions.Published); var query = GetBlogQuery(blogPart, VersionOptions.Published);

View File

@@ -13,6 +13,7 @@ namespace Orchard.Blogs.Services {
IEnumerable<BlogPostPart> Get(BlogPart blogPart, VersionOptions versionOptions); IEnumerable<BlogPostPart> Get(BlogPart blogPart, VersionOptions versionOptions);
IEnumerable<BlogPostPart> Get(BlogPart blogPart, ArchiveData archiveData); IEnumerable<BlogPostPart> Get(BlogPart blogPart, ArchiveData archiveData);
IEnumerable<BlogPostPart> Get(BlogPart blogPart, int skip, int count); IEnumerable<BlogPostPart> Get(BlogPart blogPart, int skip, int count);
IEnumerable<BlogPostPart> Get(BlogPart blogPart, int skip, int count, VersionOptions versionOptions);
int PostCount(BlogPart blogPart); int PostCount(BlogPart blogPart);
int PostCount(BlogPart blogPart, VersionOptions versionOptions); int PostCount(BlogPart blogPart, VersionOptions versionOptions);
IEnumerable<KeyValuePair<ArchiveData, int>> GetArchives(BlogPart blogPart); IEnumerable<KeyValuePair<ArchiveData, int>> GetArchives(BlogPart blogPart);

View File

@@ -63,9 +63,8 @@ namespace Orchard.Comments.Controllers {
throw new ArgumentOutOfRangeException(); 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 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 { var model = new CommentsIndexViewModel {
Comments = entries.ToList(), Comments = entries.ToList(),

View File

@@ -803,8 +803,9 @@ table .button {
.pager { list-style: none; padding: 0; margin: 12px 0 0 0; } .pager { list-style: none; padding: 0; margin: 12px 0 0 0; }
.pager li { float: left; padding: 0 12px 0 0; margin: 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 a:hover { background-color: #eaeaea; color: #333; }
.pager span { background-color:inherit; }
/* Core Modules /* Core Modules

View File

@@ -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;
}
<li class="page-previous">
@Html.ActionLink((string)previousText, (string)routeData["action"], (string)routeData["controller"], routeData, null)
</li>
}
// page numbers
for (var p = 1; p <= totalPageCount; p++) {
<li class="page-@p">
@if (p == Model.Page) {
<span>@p</span>
}
else {
if (p == 1) {
routeData.Remove("page");
}
else {
routeData["page"] = p;
}
@Html.ActionLink(p.ToString(), (string)routeData["action"], (string)routeData["controller"], routeData, null)
}
</li>
}
// next page
if(Model.Page < totalPageCount) {
routeData["page"] = Model.Page + 1;
<li class="page-next">
@Html.ActionLink((string)nextText, (string)routeData["action"], (string)routeData["controller"], routeData, null)
</li>
}
@tag.EndElement
}

View File

@@ -93,7 +93,9 @@
<Content Include="TheAdmin\Views\Header.cshtml" /> <Content Include="TheAdmin\Views\Header.cshtml" />
<Content Include="TheThemeMachine\Views\Layout.cshtml" /> <Content Include="TheThemeMachine\Views\Layout.cshtml" />
</ItemGroup> </ItemGroup>
<ItemGroup /> <ItemGroup>
<Content Include="TheAdmin\Views\Pager.cshtml" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" /> <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -196,7 +196,8 @@ namespace Orchard.ContentManagement {
} }
int IContentQuery<T>.Count() { int IContentQuery<T>.Count() {
var criteria = _query.BindItemVersionCriteria(); var criteria = (ICriteria)_query.BindItemVersionCriteria().Clone();
criteria.ClearOrders();
return criteria.SetProjection( Projections.RowCount() ).UniqueResult<Int32>(); return criteria.SetProjection( Projections.RowCount() ).UniqueResult<Int32>();
} }