79 lines
2.4 KiB
C#
79 lines
2.4 KiB
C#
namespace ReserveManagementSystemLib.Models
|
|
{
|
|
public class PaginatedListResponse
|
|
{
|
|
public List<Loan> LoanList { get; set; }
|
|
|
|
public int PageIndex { get; set; }
|
|
|
|
public int TotalPages { get; set; }
|
|
|
|
public int TotalItems { get; set; }
|
|
|
|
public int FirstPage { get; set; }
|
|
|
|
public int LastPage { get; set; }
|
|
|
|
public int PageRangeSize { get; set; }
|
|
|
|
public PaginatedListResponse() {}
|
|
|
|
public void SetFirstAndLastPageToShow()
|
|
{
|
|
if (TotalPages < PageRangeSize) { PageRangeSize = TotalPages; }
|
|
var half = PageRangeSize / 2; //this should be set to an odd number to evenly set page range
|
|
if (PageIndex - half <= 0)
|
|
{
|
|
FirstPage = 1;
|
|
LastPage = (PageRangeSize > TotalPages) ? TotalPages : PageRangeSize;
|
|
}
|
|
else if (PageIndex == TotalPages || PageIndex + half > TotalPages)
|
|
{
|
|
FirstPage = TotalPages - PageRangeSize + 1;
|
|
LastPage = TotalPages;
|
|
}
|
|
else //increment page range slightly by the half difference
|
|
{
|
|
FirstPage = PageIndex - half;
|
|
LastPage = PageIndex + half;
|
|
}
|
|
}
|
|
|
|
public PaginatedListResponse(List<Loan> items, int count, int pageIndex, int pageSize, int pageRangeSize)
|
|
{
|
|
PageIndex = pageIndex;
|
|
TotalItems = count;
|
|
TotalPages = (int)Math.Ceiling(count / (double)pageSize);
|
|
PageRangeSize = pageRangeSize;
|
|
|
|
SetFirstAndLastPageToShow();
|
|
List<Loan> loanList = new List<Loan>();
|
|
loanList.AddRange(items);
|
|
LoanList = loanList;
|
|
}
|
|
|
|
public bool HasPreviousPage
|
|
{
|
|
get
|
|
{
|
|
return (PageIndex > 1);
|
|
}
|
|
}
|
|
|
|
public bool HasNextPage
|
|
{
|
|
get
|
|
{
|
|
return (PageIndex < TotalPages);
|
|
}
|
|
}
|
|
|
|
public static async Task<PaginatedListResponse> CreateListAsync(IQueryable<Loan> source, int pageIndex, int pageSize, int pageRangeSize)
|
|
{
|
|
var count = source.Count();
|
|
var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
|
|
return new PaginatedListResponse(items, count, pageIndex, pageSize, pageRangeSize);
|
|
}
|
|
}
|
|
}
|