Implement tab-scoped runs pagination state

This commit is contained in:
Abel Luck 2026-03-31 12:12:36 +02:00
parent dce67ea9e3
commit c834c3c254
6 changed files with 444 additions and 62 deletions

View file

@ -242,8 +242,27 @@ def _completed_row(execution: Mapping[str, object]) -> tuple[Node, ...]:
)
def _completed_page_href(page: int) -> str:
return f"/runs?completed_page={page}"
def _completed_page_action_path(page: int) -> str:
return f"/actions/runs/completed-page/{page}"
def _pagination_button(
*,
label: str,
page: int,
current: bool = False,
class_name: str,
) -> Renderable:
attributes = {
"data-on:pointerdown": f"@post('{_completed_page_action_path(page)}')",
}
if current:
attributes["aria-current"] = "page"
return h.button(
attributes,
type="button",
class_=class_name,
)[label]
def _completed_history_pagination(
@ -258,8 +277,9 @@ def _completed_history_pagination(
start_result = ((completed_page - 1) * completed_page_size) + 1
end_result = min(completed_total_count, completed_page * completed_page_size)
link_class = (
button_class = (
"relative inline-flex items-center px-4 py-2 text-sm font-semibold text-slate-700 "
"cursor-pointer "
"ring-1 ring-inset ring-slate-200 hover:bg-stone-50"
)
@ -267,16 +287,22 @@ def _completed_history_pagination(
class_="flex items-center justify-between border-t border-slate-200 bg-white px-4 py-3 sm:px-6"
)[
h.div(class_="flex flex-1 justify-between sm:hidden")[
h.a(
href=_completed_page_href(max(1, completed_page - 1)),
class_="relative inline-flex items-center rounded-xl border border-slate-200 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-stone-50",
)["Previous"],
h.a(
href=_completed_page_href(
min(completed_total_pages, completed_page + 1)
_pagination_button(
label="Previous",
page=max(1, completed_page - 1),
class_name=(
"relative inline-flex items-center rounded-xl border border-slate-200 "
"bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-stone-50"
),
class_="relative ml-3 inline-flex items-center rounded-xl border border-slate-200 bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-stone-50",
)["Next"],
),
_pagination_button(
label="Next",
page=min(completed_total_pages, completed_page + 1),
class_name=(
"relative ml-3 inline-flex items-center rounded-xl border border-slate-200 "
"bg-white px-4 py-2 text-sm font-medium text-slate-700 hover:bg-stone-50"
),
),
],
h.div(class_="hidden sm:flex sm:flex-1 sm:items-center sm:justify-between")[
h.p(class_="text-sm text-slate-600")[
@ -293,17 +319,16 @@ def _completed_history_pagination(
class_="isolate inline-flex -space-x-px rounded-xl shadow-xs",
)[
(
h.a(
href=_completed_page_href(page_number),
aria_current=(
"page" if page_number == completed_page else None
),
class_=(
_pagination_button(
label=str(page_number),
page=page_number,
current=page_number == completed_page,
class_name=(
"relative z-10 inline-flex items-center bg-amber-500 px-4 py-2 text-sm font-semibold text-slate-950"
if page_number == completed_page
else link_class
else button_class
),
)[str(page_number)]
)
for page_number in range(1, completed_total_pages + 1)
)
],