namespace ReserveManagementSystemLib.Models { public class PaginatedListResponse { public List 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 items, int count, int pageIndex, int pageSize, int pageRangeSize) { PageIndex = pageIndex; TotalItems = count; TotalPages = (int)Math.Ceiling(count / (double)pageSize); PageRangeSize = pageRangeSize; SetFirstAndLastPageToShow(); List loanList = new List(); loanList.AddRange(items); LoanList = loanList; } public bool HasPreviousPage { get { return (PageIndex > 1); } } public bool HasNextPage { get { return (PageIndex < TotalPages); } } public static async Task CreateListAsync(IQueryable 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); } } }