@namespace ZB.MOM.WW.ScadaBridge.CentralUI.Components.Shared
@* Reusable offset-pagination bar. Purely presentational: the host page
owns page-number state, query execution, and the HasNextPage decision.
Parameters: Page, PageChanged, HasNextPage, TotalCount, PageSize, Disabled,
HideWhenSinglePage. *@
@if (!IsSinglePageAndHidden)
{
@SummaryText
}
@code {
[Parameter] public int Page { get; set; } = 1;
[Parameter] public EventCallback PageChanged { get; set; }
[Parameter] public bool HasNextPage { get; set; }
[Parameter] public int? TotalCount { get; set; }
[Parameter] public int PageSize { get; set; }
[Parameter] public bool Disabled { get; set; }
///
/// When true, the whole bar is suppressed once the result set is
/// provably a single page — the conventional behaviour for a pager whose only
/// controls would be permanently disabled. Opt-in (default false)
/// because the summary span doubles as the "N total" result-count readout on
/// pages that have no other place to show it; a host that relies on that
/// readout leaves this off.
///
[Parameter] public bool HideWhenSinglePage { get; set; }
private bool HasPrev => Page > 1;
// Hide only when single-page-ness is POSITIVELY established: a known page
// count of 0/1, sitting on page 1, with no next page. A null TotalCount
// (host cannot count) or any disagreement between the signals renders the
// bar, so the controls never vanish while a further page still exists.
private bool IsSinglePageAndHidden =>
HideWhenSinglePage && PageCount is <= 1 && Page <= 1 && !HasNextPage;
private int? PageCount =>
TotalCount is { } t && PageSize > 0
? (int)Math.Ceiling(t / (double)PageSize)
: (int?)null;
private string SummaryText
{
get
{
var text = $"Page {Page}";
if (PageCount is { } pc) text += $" of {pc}";
if (TotalCount is { } total) text += $" · {total} total";
return text;
}
}
private Task OnPrevAsync() => PageChanged.InvokeAsync(Page - 1);
private Task OnNextAsync() => PageChanged.InvokeAsync(Page + 1);
}