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