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.messages.views import SuccessMessageMixin
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.http import FileResponse, Http404, HttpRequest, HttpResponse
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))
try:
pages = paginator.get_page(page_number)
pages: Page = paginator.get_page(page_number)
except EmptyPage:
return HttpResponse("")
context = {
context: dict[str, str | Page | int] = {
"feeds": pages,
"description": "An archive of all feeds",
"keywords": "feed, rss, atom, archive, rss list",
@ -405,19 +405,30 @@ class RobotsView(View):
class DomainsView(View):
"""All domains."""
def get(self: DomainsView, request: HttpRequest) -> HttpResponse:
def get(self: DomainsView, request: HtmxHttpRequest) -> HttpResponse:
"""Load the domains page."""
domains: BaseManager[Domain] = Domain.objects.all()
template = loader.get_template(template_name="domains.html")
context = {
"domains": domains,
domains: BaseManager[Domain] = Domain.objects.only("id", "url", "created_at")
paginator = Paginator(object_list=domains, per_page=100)
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",
"keywords": "feed, rss, atom, archive, rss list",
"author": "TheLovinator",
"canonical": "https://feedvault.se/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):

View file

@ -1,19 +1,5 @@
{% extends "base.html" %}
{% block content %}
<h2>Domains</h2>
<p>
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>
{% include "partials/domains.html" %}
{% 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>