diff --git a/src/porchlight/admin/routes.py b/src/porchlight/admin/routes.py index 78500c4..a8423b0 100644 --- a/src/porchlight/admin/routes.py +++ b/src/porchlight/admin/routes.py @@ -30,5 +30,31 @@ async def users_list(request: Request) -> Response: if admin is None: return HTMLResponse("Forbidden", status_code=403) - # Placeholder — will be implemented in Task 4 - return HTMLResponse("Admin users list") + per_page = 20 + q = request.query_params.get("q", "") + offset = int(request.query_params.get("offset", "0")) + + user_repo = request.app.state.user_repo + if q: + users = await user_repo.search_users(q, offset, per_page) + total = await user_repo.count_users(query=q) + else: + users = await user_repo.list_users(offset, per_page) + total = await user_repo.count_users() + + context = { + "users": users, + "query": q, + "offset": offset, + "per_page": per_page, + "total": total, + "active_page": "users", + } + + # HTMX search requests get just the table rows partial + if request.headers.get("HX-Request") and request.headers.get("HX-Trigger-Name") == "q": + templates = request.app.state.templates + return templates.TemplateResponse(request, "admin/_user_rows.html", context) + + templates = request.app.state.templates + return templates.TemplateResponse(request, "admin/users.html", context) diff --git a/src/porchlight/templates/admin/_pagination.html b/src/porchlight/templates/admin/_pagination.html new file mode 100644 index 0000000..088724f --- /dev/null +++ b/src/porchlight/templates/admin/_pagination.html @@ -0,0 +1,13 @@ +{% if total > 0 %} + + Showing {{ offset + 1 }}–{{ offset + users|length }} of {{ total }} + +{% endif %} + + {% if offset > 0 %} + Previous + {% endif %} + {% if offset + per_page < total %} + Next + {% endif %} + diff --git a/src/porchlight/templates/admin/_user_rows.html b/src/porchlight/templates/admin/_user_rows.html new file mode 100644 index 0000000..48ab3cb --- /dev/null +++ b/src/porchlight/templates/admin/_user_rows.html @@ -0,0 +1,21 @@ +{% for user in users %} +
| Username | +Name | +Groups | +Status | +Created | +
|---|