From b998bb5ed025a0d11d97458de6fb00716f026c47 Mon Sep 17 00:00:00 2001 From: Artiom Chilaru Date: Sun, 6 Dec 2015 20:17:58 +0000 Subject: [PATCH] + New feature to freeze the results when paging, to avoid data shifting --- src/FlexLabs.Web.TablePager/ITableModel.cs | 1 + src/FlexLabs.Web.TablePager/TableModel.cs | 45 +++++++++++++++++-- src/FlexLabs.Web.TablePager/TablePager.cshtml | 3 ++ .../TablePager.generated.cs | 29 +++++++++++- src/FlexLabs.Web.TablePager/project.json | 7 +-- 5 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/FlexLabs.Web.TablePager/ITableModel.cs b/src/FlexLabs.Web.TablePager/ITableModel.cs index 3f6be15..7c09967 100644 --- a/src/FlexLabs.Web.TablePager/ITableModel.cs +++ b/src/FlexLabs.Web.TablePager/ITableModel.cs @@ -7,5 +7,6 @@ public interface ITableModel void UpdateSorter(); Object SortBy { get; set; } Boolean? SortAsc { get; set; } + Int64? FirstItemID { get; set; } } } diff --git a/src/FlexLabs.Web.TablePager/TableModel.cs b/src/FlexLabs.Web.TablePager/TableModel.cs index cee2606..f3a6fbb 100644 --- a/src/FlexLabs.Web.TablePager/TableModel.cs +++ b/src/FlexLabs.Web.TablePager/TableModel.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Web.Mvc; namespace FlexLabs.Web.TablePager @@ -43,15 +44,18 @@ public TableModel(TSorter defaultSorter, Boolean defaultAscending, Boolean pagin DefaultSortAsc = defaultAscending; PagingEnabled = pagingEnabled; } - private TSorter DefaultSortBy; - private Boolean DefaultSortAsc; - private Boolean PagingEnabled = true; + private readonly TSorter DefaultSortBy; + private readonly Boolean DefaultSortAsc; + private readonly Boolean PagingEnabled = true; + private Func FirstID64Selector = null; + private Func FirstID32Selector = null; public TSorter? ChangeSort { get; set; } public TSorter? SortBy { get; set; } public Boolean? SortAsc { get; set; } public Int32? PageSize { get; set; } public Int32? Page { get; set; } + public Int64? FirstItemID { get; set; } object ITableModel.SortBy { get { return SortBy; } set { SortBy = (TSorter?)value; } } public IPagedList PageItems; @@ -87,6 +91,41 @@ public void SetPageItems(IEnumerable items, Int32? totalItemCount = nul PageItems = new StaticPagedList(dataSet.OfType(), pageNumber, pageSize, totalItemCount ?? dataSet.Count()); else PageItems = new StaticPagedList(dataSet.Select(i => TranslateItem(i)), pageNumber, pageSize, totalItemCount ?? dataSet.Count()); + + if (PageItems.TotalItemCount > 0 && (FirstID32Selector != null || FirstID64Selector != null)) + { + FirstItemID = FirstID64Selector != null + ? items.Select(FirstID64Selector).FirstOrDefault() + : items.Select(FirstID32Selector).FirstOrDefault(); + } + } + + public Int64? GetFirstItemID(Func idSelector) + { + var showNewResults = !Page.HasValue && !ChangeSort.HasValue; + + if (showNewResults) + { + FirstID64Selector = idSelector; + return null; + } + + return FirstItemID; + } + + public Int32? GetFirstItemID(Func idSelector) + { + var showNewResults = !Page.HasValue && !ChangeSort.HasValue; + + if (showNewResults) + { + FirstID32Selector = idSelector; + return null; + } + + if (FirstItemID.HasValue) + return Convert.ToInt32(FirstItemID.Value); + return null; } public void UpdateSorter() diff --git a/src/FlexLabs.Web.TablePager/TablePager.cshtml b/src/FlexLabs.Web.TablePager/TablePager.cshtml index 08016f8..77c7d0d 100644 --- a/src/FlexLabs.Web.TablePager/TablePager.cshtml +++ b/src/FlexLabs.Web.TablePager/TablePager.cshtml @@ -71,4 +71,7 @@ @* Mvc Seems to prioritise the values from the request model, over the values changed in the code, so I have to go a bit "manual" here :) [Artiom] *@ + if (model.FirstItemID.HasValue) { + + } } diff --git a/src/FlexLabs.Web.TablePager/TablePager.generated.cs b/src/FlexLabs.Web.TablePager/TablePager.generated.cs index 63f9560..5ae07aa 100644 --- a/src/FlexLabs.Web.TablePager/TablePager.generated.cs +++ b/src/FlexLabs.Web.TablePager/TablePager.generated.cs @@ -600,13 +600,40 @@ public static System.Web.WebPages.HelperResult FormHidden(ITableModel model) #line 76 "..\..\TablePager.cshtml" + if (model.FirstItemID.HasValue) + { + + +#line default +#line hidden + WriteLiteralTo(__razor_helper_writer, " (model.FirstItemID + +#line default +#line hidden +, 3145), false) + ); + + WriteLiteralTo(__razor_helper_writer, " />\r\n"); + + +#line 78 "..\..\TablePager.cshtml" + } #line default #line hidden }); -#line 76 "..\..\TablePager.cshtml" +#line 79 "..\..\TablePager.cshtml" } #line default #line hidden diff --git a/src/FlexLabs.Web.TablePager/project.json b/src/FlexLabs.Web.TablePager/project.json index d6fded9..b382104 100644 --- a/src/FlexLabs.Web.TablePager/project.json +++ b/src/FlexLabs.Web.TablePager/project.json @@ -1,9 +1,10 @@ { - "version": "2.0.0-*", - "description": "", + "version": "2.0.5-*", + "title": "FlexLabs Table Pager", + "description": "Helps manage paging and page sorting in a ASP.NET MVC project. Works best when used in conjunction with FlexLabs.Util", "authors": [ "Artiom Chilaru" ], "tags": [ "" ], - "projectUrl": "", + "projectUrl": "https://github.com/artiomchi/TablePager", "licenseUrl": "", "dependencies": {