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:
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 }}¤t_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 }}¤t_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"]