using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Components; using OneOf; namespace AntDesign { public partial class PaginationDefault : AntDomComponentBase { [Parameter] public string Size { get; set; } [Parameter] public bool Disabled { get; set; } [Parameter] public bool ShowSizeChanger { get; set; } [Parameter] public bool ShowQuickJumper { get; set; } [Parameter] public int Total { get; set; } = 0; [Parameter] public int PageIndex { get; set; } = 1; [Parameter] public int PageSize { get; set; } = 10; [Parameter] public int[] PageSizeOptions { get; set; } = { 10, 20, 30, 40 }; [Parameter] public EventCallback PageIndexChange { get; set; } [Parameter] public EventCallback PageSizeChange { get; set; } [CascadingParameter] public Pagination Pagination { get; set; } private OneOf, RenderFragment> _showTotal; private (int, int) _ranges = (0, 0); private IEnumerable _listOfPageItem = Enumerable.Empty(); private PaginationTotalContext TotalContext => new PaginationTotalContext { Total = Total, Range = _ranges }; protected override void OnInitialized() { if (Pagination != null) { this._showTotal = Pagination.ShowTotal; } base.OnInitialized(); } protected override void OnParametersSet() { this._ranges = ((this.PageIndex - 1) * this.PageSize + 1, Math.Min(this.PageIndex * this.PageSize, this.Total)); this.BuildIndexes(); base.OnParametersSet(); } private void JumpPage(int index) { this.OnPageIndexChange(index); } private void JumpDiff(int diff) { this.JumpPage(this.PageIndex + diff); } private void OnPageIndexChange(int index) { this.PageIndexChange.InvokeAsync(index); } private void OnPageSizeChange(int size) { this.PageSizeChange.InvokeAsync(size); } private void BuildIndexes() { var lastIndex = this.GetLastIndex(this.Total, this.PageSize); this._listOfPageItem = this.GetListOfPageItem(this.PageIndex, lastIndex); } private int GetLastIndex(int total, int pageSize) { return (total - 1) / pageSize + 1; } private IEnumerable GetListOfPageItem(int pageIndex, int lastIndex) { IEnumerable ConcatWithPrevNext(IEnumerable listOfPage) { var prevItem = new PaginationItem() { Type = "prev", Disabled = pageIndex == 1 }; var nextItem = new PaginationItem() { Type = "next", Disabled = pageIndex == lastIndex }; return new[] { prevItem }.Concat(listOfPage).Concat(new[] { nextItem }); } IEnumerable GeneratePage(int start, int end) { return Enumerable.Range(start, end - start + 1).Select(x => new PaginationItem() { Index = x, Type = "page" }); } if (lastIndex <= 9) { return ConcatWithPrevNext(GeneratePage(1, lastIndex)); } else { IEnumerable GenerateRangeItem(int selected, int last) { var listOfRange = Enumerable.Empty(); var prevFiveItem = new[] { new PaginationItem() { Type = "prev_5" } }; var nextFiveItem = new[] { new PaginationItem() { Type = "next_5" } }; var firstPageItem = GeneratePage(1, 1); var lastPageItem = GeneratePage(lastIndex, lastIndex); if (selected < 4) { listOfRange = GeneratePage(2, 5).Concat(nextFiveItem); } else if (selected < last - 3) { listOfRange = prevFiveItem.Concat(GeneratePage(selected - 2, selected + 2)) .Concat(nextFiveItem); } else { listOfRange = prevFiveItem.Concat(GeneratePage(last - 4, last - 1)); } return firstPageItem.Concat(listOfRange).Concat(lastPageItem); } return ConcatWithPrevNext(GenerateRangeItem(pageIndex, lastIndex)); } } } }