Add infinity scrolling for /domains

This commit is contained in:
Joakim Hellsén 2024-03-26 02:39:30 +01:00
commit 816700a63b
No known key found for this signature in database
GPG key ID: D196AE66FEBE1DC9
3 changed files with 33 additions and 24 deletions

View file

@ -13,7 +13,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.views import LoginView, LogoutView, PasswordChangeView from django.contrib.auth.views import LoginView, LogoutView, PasswordChangeView
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.core.exceptions import SuspiciousOperation from django.core.exceptions import SuspiciousOperation
from django.core.paginator import EmptyPage, Paginator from django.core.paginator import EmptyPage, Page, Paginator
from django.db.models.manager import BaseManager from django.db.models.manager import BaseManager
from django.http import FileResponse, Http404, HttpRequest, HttpResponse from django.http import FileResponse, Http404, HttpRequest, HttpResponse
from django.shortcuts import get_object_or_404, render from django.shortcuts import get_object_or_404, render
@ -89,11 +89,11 @@ class FeedsView(View):
page_number = int(request.GET.get("page", default=1)) page_number = int(request.GET.get("page", default=1))
try: try:
pages = paginator.get_page(page_number) pages: Page = paginator.get_page(page_number)
except EmptyPage: except EmptyPage:
return HttpResponse("") return HttpResponse("")
context = { context: dict[str, str | Page | int] = {
"feeds": pages, "feeds": pages,
"description": "An archive of all feeds", "description": "An archive of all feeds",
"keywords": "feed, rss, atom, archive, rss list", "keywords": "feed, rss, atom, archive, rss list",
@ -405,19 +405,30 @@ class RobotsView(View):
class DomainsView(View): class DomainsView(View):
"""All domains.""" """All domains."""
def get(self: DomainsView, request: HttpRequest) -> HttpResponse: def get(self: DomainsView, request: HtmxHttpRequest) -> HttpResponse:
"""Load the domains page.""" """Load the domains page."""
domains: BaseManager[Domain] = Domain.objects.all() domains: BaseManager[Domain] = Domain.objects.only("id", "url", "created_at")
template = loader.get_template(template_name="domains.html")
context = { paginator = Paginator(object_list=domains, per_page=100)
"domains": domains, page_number = int(request.GET.get("page", default=1))
try:
pages: Page = paginator.get_page(page_number)
except EmptyPage:
return HttpResponse("")
context: dict[str, str | Page | int] = {
"domains": pages,
"description": "Domains", "description": "Domains",
"keywords": "feed, rss, atom, archive, rss list", "keywords": "feed, rss, atom, archive, rss list",
"author": "TheLovinator", "author": "TheLovinator",
"canonical": "https://feedvault.se/domains/", "canonical": "https://feedvault.se/domains/",
"title": "Domains", "title": "Domains",
"page": page_number,
} }
return HttpResponse(content=template.render(context=context, request=request))
template_name = "partials/domains.html" if request.htmx else "domains.html"
return render(request, template_name, context)
class DomainView(View): class DomainView(View):

View file

@ -1,19 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block content %} {% block content %}
<h2>Domains</h2> <h2>Domains</h2>
<p> {% include "partials/domains.html" %}
These are the domains that have been added to the database.
{% if domains|length > 0 %}There are {{ domains|length }} domains in the database.{% endif %}
</p>
<ul>
{% for domain in domains %}
{% if not domain.hidden %}
<li>
<a href="{% url 'domain' domain.id %}">{{ domain.url }}</a> - {{ domain.created_at|date }}
</li>
{% endif %}
{% empty %}
<li>Found no domains in the database.</li>
{% endfor %}
</ul>
{% endblock %} {% endblock %}

View file

@ -0,0 +1,12 @@
{% if domains %}
{% for domain in domains %}
<a href="{% url 'domain' domain.id %}">{{ domain.url }}</a> - {{ domain.created_at|date }}
<br>
{% endfor %}
{% else %}
<p>No domains yet. Time to add some!</p>
{% endif %}
<div hx-get="{% url 'domains' %}?page={{ page|add:1 }}"
hx-trigger="revealed"
hx-target="this"
hx-swap="outerHTML">Loading...</div>