"""HTML views for the live Gitea queue dashboard (#429).""" from __future__ import annotations import html from webui.queue_loader import PaginationMeta, QueueItem, QueueSnapshot def _badge_html(badges: tuple[str, ...]) -> str: if not badges: return "" chips = "".join( f'{html.escape(b)}' for b in badges ) return f'{chips}' def _pagination_html(label: str, meta: PaginationMeta | None) -> str: if meta is None: return ( f"

{html.escape(label)} pagination: " "unavailable

" ) status = "complete" if meta.inventory_complete else "partial" more = "yes" if meta.has_more else "no" return ( f"

{html.escape(label)} pagination ({status}): " f"returned {meta.returned_count} · per_page {meta.per_page} · " f"pages_fetched {meta.pages_fetched} · has_more {more} · " f"final_page {'yes' if meta.is_final_page else 'no'}

" ) def _queue_table( *, title: str, items: tuple[QueueItem, ...], columns: tuple[tuple[str, str], ...], ) -> str: if not items: return f"

{html.escape(title)}

No open items.

" headers = "".join(f"{html.escape(label)}" for _, label in columns) rows = [] for item in items: cells = [] for key, _ in columns: if key == "number": cells.append(f"#{item.number}") elif key == "title": cells.append( f"{html.escape(item.title)}{_badge_html(item.badges)}" ) else: cells.append(f"{html.escape(item.extra.get(key, ''))}") rows.append("" + "".join(cells) + "") body = ( f"

{html.escape(title)}

" f"{headers}" f"{''.join(rows)}
" ) return body def render_queue_page(snapshot: QueueSnapshot) -> str: error_block = "" if snapshot.fetch_error: error_block = ( f'

Queue unavailable: ' f"{html.escape(snapshot.fetch_error)}

" ) pr_section = _queue_table( title="Open pull requests", items=snapshot.prs, columns=( ("number", "#"), ("title", "Title"), ("branch", "Branch"), ("head_sha", "Head"), ("mergeable", "Mergeable"), ("linked_issue", "Linked issue"), ), ) issue_section = _queue_table( title="Open issues", items=snapshot.issues, columns=( ("number", "#"), ("title", "Title"), ("labels", "Labels"), ("assignee", "Assignee"), ("state", "State"), ), ) return ( "

Live queue

" f"

Repository: {html.escape(snapshot.repo_label)} " f"· project {html.escape(snapshot.project_id)}

" f"{error_block}" f"{_pagination_html('PR', snapshot.pr_pagination)}" f"{pr_section}" f"{_pagination_html('Issue', snapshot.issue_pagination)}" f"{issue_section}" "

Read-only MVP — claims, reviews, and merges stay in Gitea/MCP tools.

" )