simple-web-app

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 94d23ef5f841859e9e2b0481ecdb6ad5ddb839a7
parent 2143bc2bfa861cc0b31a8261ad46f7d760838806
Author: Silas Brack <silasbrack@gmail.com>
Date:   Sat,  4 Oct 2025 12:08:27 +0200

feat: disable load more button when we run out of content to show

Diffstat:
Msrc/simple_web_app/app.py | 8+++++---
Msrc/simple_web_app/templates/load_more.html | 2+-
Mtests/test_simple_web_app/test_app.py | 2++
3 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/simple_web_app/app.py b/src/simple_web_app/app.py @@ -103,11 +103,13 @@ async def show_home_page(request: Request): all_categories = await queries_basic.get_categories(request.state.conn, limit=20) rows = ( - await queries_basic.get_news_by_category(request.state.conn, category_id=category_id, limit=limit, offset=offset, max_published_time=current_time) + await queries_basic.get_news_by_category(request.state.conn, category_id=category_id, limit=limit + 1, offset=offset, max_published_time=current_time) if category_id else - await queries_basic.get_news(request.state.conn, limit=limit, offset=offset, max_published_time=current_time) + await queries_basic.get_news(request.state.conn, limit=limit + 1, offset=offset, max_published_time=current_time) ) + reached_end = len(rows) <= limit + rows = rows[:limit] categories = await asyncio.gather(*[queries_basic.get_categories_for_news(request.state.conn, news_item_id=row["id"]) for row in rows]) current_time_utc = datetime.datetime.now(tz=datetime.UTC) @@ -117,7 +119,7 @@ async def show_home_page(request: Request): times_since_published = [_get_time_since_published(row["published"], current_time_utc) for row in rows] news = [{**row, "categories": c, "time_since_published": tsp} for row, c, tsp in zip(rows, categories, times_since_published, strict=True)] - context = {"news": news, "categories": all_categories, "page": page, "current_time": current_time, "category_id": category_id} + context = {"news": news, "categories": all_categories, "page": page, "current_time": current_time, "category_id": category_id, "reached_end": reached_end} if is_htmx_request(request): context = context | {"oob": True} diff --git a/src/simple_web_app/templates/load_more.html b/src/simple_web_app/templates/load_more.html @@ -1 +1 @@ -<button id="load-more-btn" {% if oob %}hx-swap-oob="true"{% endif %} hx-target="#news-cards" hx-swap="beforeend" hx-get="/?page={{ page + 1 }}&current_time={{ current_time }}{% if category_id %}&category-id={{ category_id }}{% endif %}" preload class="secondary">Load more</button> +<button id="load-more-btn" {%- if reached_end %} disabled{% endif %} {% if oob %}hx-swap-oob="true"{% endif %} hx-target="#news-cards" hx-swap="beforeend" hx-get="/?page={{ page + 1 }}&current_time={{ current_time }}{% if category_id %}&category-id={{ category_id }}{% endif %}" preload class="secondary">Load more</button> diff --git a/tests/test_simple_web_app/test_app.py b/tests/test_simple_web_app/test_app.py @@ -118,6 +118,7 @@ async def test_select_chain(async_test_client, test_data): assert response.context["category_id"] == 1 soup = BeautifulSoup(response.text, features="html.parser") load_more_button = soup.find("button", {"id": "load-more-btn"}) + assert "disabled" not in load_more_button.attrs assert "page=1" in load_more_button.attrs["hx-get"] assert "category-id=1" in load_more_button.attrs["hx-get"] @@ -127,6 +128,7 @@ async def test_select_chain(async_test_client, test_data): assert response.context["category_id"] == 1 soup = BeautifulSoup(response.text, features="html.parser") load_more_button = soup.find("button", {"id": "load-more-btn"}) + assert "disabled" in load_more_button.attrs assert "page=2" in load_more_button.attrs["hx-get"] assert "category-id=1" in load_more_button.attrs["hx-get"]