From da22ae8d679b01e6637fc2ed224d26f6f6c5a217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksander=20Fl=C3=B8tten?= Date: Tue, 23 Jun 2026 15:56:56 +0200 Subject: [PATCH 01/12] Add kiosk mode --- changelog.d/1938.added.md | 1 + src/argus/htmx/incident/urls.py | 1 + src/argus/htmx/incident/views.py | 24 +++++++++++++++---- .../htmx/incident/_filter_controls.html | 20 ++++++++++++++++ .../incident/_filter_controls_script.html | 7 ++++-- .../htmx/incident/_incident_filterbox.html | 7 +++++- .../incident/_incident_table_autorefresh.html | 2 +- .../htmx/incident/_incident_table_footer.html | 24 ++++++++++--------- .../_incident_table_paginator_pageitem.html | 2 +- .../htmx/incident/_incident_toolbar.html | 10 ++++---- .../cells/_incident_filter_dropdown_body.html | 6 ++++- .../cells/_incident_sort_button_element.html | 2 +- .../cells/search_fields/input_search.html | 1 - .../responses/_incident_list_refresh.html | 4 ++++ 14 files changed, 84 insertions(+), 27 deletions(-) create mode 100644 changelog.d/1938.added.md diff --git a/changelog.d/1938.added.md b/changelog.d/1938.added.md new file mode 100644 index 000000000..c5f956cec --- /dev/null +++ b/changelog.d/1938.added.md @@ -0,0 +1 @@ +Added a kiosk mode to the main view, providing a minimal version of the incident list suitable for passive Argus usage. diff --git a/src/argus/htmx/incident/urls.py b/src/argus/htmx/incident/urls.py index c33247357..8e34aeb01 100644 --- a/src/argus/htmx/incident/urls.py +++ b/src/argus/htmx/incident/urls.py @@ -6,6 +6,7 @@ app_name = "htmx" urlpatterns = [ path("", views.incident_list, name="incident-list"), + path("kiosk/", views.incident_list_kiosk, name="incident-list-kiosk"), path("/", views.incident_detail, name="incident-detail"), path("update//", views.incident_update, name="incident-update"), path("filter/", views.filter_form, name="incident-filter"), diff --git a/src/argus/htmx/incident/views.py b/src/argus/htmx/incident/views.py index d48322238..22f8e87a0 100644 --- a/src/argus/htmx/incident/views.py +++ b/src/argus/htmx/incident/views.py @@ -3,7 +3,7 @@ import logging from collections.abc import Iterable from datetime import datetime -from urllib.parse import urlencode +from urllib.parse import urlencode, urlparse from typing import Optional, Any from django import forms @@ -18,6 +18,7 @@ QueryDict, ) from django.shortcuts import render, get_object_or_404 +from django.urls import reverse from django.utils.timezone import now as tznow from django.views.decorators.http import require_POST, require_GET @@ -46,6 +47,7 @@ User = get_user_model() LOG = logging.getLogger(__name__) +KIOSK_URL_NAME = "htmx:incident-list-kiosk" # Map request trigger to parameters for incidents update @@ -190,19 +192,22 @@ def delete_filter(request: HtmxHttpRequest, pk: int): @require_GET def filter_select(request: HtmxHttpRequest): + current_url = request.META.get("HTTP_HX_CURRENT_URL", "") + kiosk_mode = urlparse(current_url).path == reverse(KIOSK_URL_NAME) if current_url else False + filter_id = request.GET.get("filter", None) if filter_id and get_object_or_404(Filter, id=filter_id): request.session["selected_filter"] = filter_id incident_list_filter = get_filter_function() filter_form, _ = incident_list_filter(request, None) - context = {"filter_form": filter_form} + context = {"filter_form": filter_form, "kiosk_mode": kiosk_mode} return render(request, "htmx/incident/_incident_filterbox.html", context=context) else: request.session["selected_filter"] = None if request.htmx.trigger: incident_list_filter = get_filter_function() filter_form, _ = incident_list_filter(request, None, use_empty_filter=True) - context = {"filter_form": filter_form} + context = {"filter_form": filter_form, "kiosk_mode": kiosk_mode} return render(request, "htmx/incident/_incident_filterbox.html", context=context) else: return retarget(HttpResponse(), "#incident-filter-select") @@ -266,7 +271,7 @@ def search_tags(request): @require_GET -def incident_list(request: HtmxHttpRequest) -> HttpResponse: +def incident_list(request: HtmxHttpRequest, kiosk_mode: bool = False) -> HttpResponse: LOG = logging.getLogger(__name__ + ".incident_list") LOG.debug("GET at start: %s", request.GET) request.GET = dedupe_querydict(request.GET) @@ -275,6 +280,8 @@ def incident_list(request: HtmxHttpRequest) -> HttpResponse: preferences = request.user.get_preferences_context() column_layout_name = preferences["argus_htmx"]["incidents_table_column_name"] columns = get_incident_table_columns(column_layout_name) + if kiosk_mode: + columns = [c for c in columns if c.name != "row_select"] # Handle sorting sort_form = SortForm(request.GET) @@ -345,6 +352,8 @@ def incident_list(request: HtmxHttpRequest) -> HttpResponse: else: base_template = "htmx/incident/_base.html" + incident_list_url = reverse(KIOSK_URL_NAME if kiosk_mode else "htmx:incident-list") + LOG.debug("GET at end: %s", request.GET) context = { "columns": columns, @@ -358,5 +367,12 @@ def incident_list(request: HtmxHttpRequest) -> HttpResponse: "page": page, "last_page_num": last_page_num, "second_to_last_page": last_page_num - 1, + "kiosk_mode": kiosk_mode, + "incident_list_url": incident_list_url, } return render(request, "htmx/incident/incident_list.html", context=context) + + +@require_GET +def incident_list_kiosk(request: HtmxHttpRequest) -> HttpResponse: + return incident_list(request, kiosk_mode=True) diff --git a/src/argus/htmx/templates/htmx/incident/_filter_controls.html b/src/argus/htmx/templates/htmx/incident/_filter_controls.html index 045f072fb..024793d6b 100644 --- a/src/argus/htmx/templates/htmx/incident/_filter_controls.html +++ b/src/argus/htmx/templates/htmx/incident/_filter_controls.html @@ -49,4 +49,24 @@ + {% if kiosk_mode %} + + + Exit kiosk + + + After filtering: + {{ refresh_info.filtered_count }} + + + Last refreshed: + {{ refresh_info.last_refreshed|date:preferences.argus_htmx.datetime_format|default:"?" }} + + {% else %} + + + Kiosk + + {% endif %} diff --git a/src/argus/htmx/templates/htmx/incident/_filter_controls_script.html b/src/argus/htmx/templates/htmx/incident/_filter_controls_script.html index bd4dc04fc..9e31116d0 100644 --- a/src/argus/htmx/templates/htmx/incident/_filter_controls_script.html +++ b/src/argus/htmx/templates/htmx/incident/_filter_controls_script.html @@ -1,4 +1,5 @@