@* Partial/Pagination.razor - Reusable pagination component *@
@if (TotalCount == 0) { No results } else { var from = (CurrentPage - 1) * PageSize + 1; var to = Math.Min(CurrentPage * PageSize, TotalCount); Showing @from-@to of @TotalCount results }
Rows per page
@foreach (var p in GetVisiblePages()) { if (p == -1) { ... } else { } }
@code { [Parameter] public int CurrentPage { get; set; } = 1; [Parameter] public int TotalPages { get; set; } = 1; [Parameter] public int PageSize { get; set; } = 10; [Parameter] public int TotalCount { get; set; } [Parameter] public EventCallback OnPageChanged { get; set; } [Parameter] public EventCallback OnPageSizeChanged { get; set; } private string GetPageButtonClass(int p) => p == CurrentPage ? "inline-flex h-8 w-8 items-center justify-center rounded-lg text-xs font-semibold transition-all bg-violet-600 text-white shadow-sm" : "inline-flex h-8 w-8 items-center justify-center rounded-lg text-xs font-semibold transition-all text-slate-600 hover:bg-white"; private async Task GoToPage(int p) { if (p < 1 || p > TotalPages || p == CurrentPage) return; await OnPageChanged.InvokeAsync(p); } private async Task HandlePageSizeChange(ChangeEventArgs e) { if (int.TryParse(e.Value?.ToString(), out var size) && size != PageSize) { await OnPageSizeChanged.InvokeAsync(size); } } private IEnumerable GetVisiblePages() { if (TotalPages <= 7) { return Enumerable.Range(1, TotalPages); } var pages = new List { 1 }; int start = Math.Max(2, CurrentPage - 1); int end = Math.Min(TotalPages - 1, CurrentPage + 1); if (start > 2) pages.Add(-1); for (int i = start; i <= end; i++) pages.Add(i); if (end < TotalPages - 1) pages.Add(-1); pages.Add(TotalPages); return pages; } }