Files
2026-03-17 08:54:34 -05:00

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);
}
}
}