From 40e70e64f090a6ff462892264752126c0477a544 Mon Sep 17 00:00:00 2001 From: tegwick Date: Wed, 13 May 2026 23:45:10 +0200 Subject: [PATCH] fix(feedback): inline edit + live status change without reload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replaced broken status_aendern (missing status_choices in response) with a single eintrag_bearbeiten view that always returns the full partial context - eintrag_zeile.html is now a with two rows: display row + collapsible edit form - Click anywhere on a row to expand the edit form; @click.stop on the status cell prevents accidental toggles - Status dropdown in the display row posts via HTMX and swaps the whole — no page reload needed - Edit form covers all fields: titel, beschreibung, kategorie, dringlichkeit, status, bewertung, entscheidung Co-Authored-By: Claude Sonnet 4.6 --- vergabe_teilnahme/apps/feedback/urls.py | 2 +- vergabe_teilnahme/apps/feedback/views.py | 37 +++-- .../templates/feedback/backlog.html | 8 +- .../feedback/partials/eintrag_zeile.html | 154 +++++++++++++----- 4 files changed, 145 insertions(+), 56 deletions(-) diff --git a/vergabe_teilnahme/apps/feedback/urls.py b/vergabe_teilnahme/apps/feedback/urls.py index fc10e38..a1e7dfd 100644 --- a/vergabe_teilnahme/apps/feedback/urls.py +++ b/vergabe_teilnahme/apps/feedback/urls.py @@ -8,5 +8,5 @@ urlpatterns = [ path('modal/', views.modal, name='modal'), path('', views.submit, name='submit'), path('backlog/', views.backlog, name='backlog'), - path('backlog//status/', views.status_aendern, name='status_aendern'), + path('backlog//bearbeiten/', views.eintrag_bearbeiten, name='eintrag_bearbeiten'), ] diff --git a/vergabe_teilnahme/apps/feedback/views.py b/vergabe_teilnahme/apps/feedback/views.py index 34c3854..e590146 100644 --- a/vergabe_teilnahme/apps/feedback/views.py +++ b/vergabe_teilnahme/apps/feedback/views.py @@ -65,17 +65,32 @@ def backlog(request): return render(request, 'feedback/backlog.html', ctx) +def _eintrag_ctx(eintrag): + return { + 'eintrag': eintrag, + 'status_choices': Feedbackeintrag.STATUS_CHOICES, + 'kategorie_choices': Feedbackeintrag.KATEGORIE_CHOICES, + 'dringlichkeit_choices': Feedbackeintrag.DRINGLICHKEIT_CHOICES, + } + + @require_POST -def status_aendern(request, pk): +def eintrag_bearbeiten(request, pk): eintrag = get_object_or_404(Feedbackeintrag, pk=pk) - neuer_status = request.POST.get('status') - if neuer_status in dict(Feedbackeintrag.STATUS_CHOICES): - eintrag.status = neuer_status - bewertung = request.POST.get('bewertung') - if bewertung is not None: - eintrag.bewertung = bewertung - entscheidung = request.POST.get('entscheidung') - if entscheidung is not None: - eintrag.entscheidung = entscheidung + for field, choices in [ + ('status', Feedbackeintrag.STATUS_CHOICES), + ('kategorie', Feedbackeintrag.KATEGORIE_CHOICES), + ('dringlichkeit', Feedbackeintrag.DRINGLICHKEIT_CHOICES), + ]: + val = request.POST.get(field) + if val and val in dict(choices): + setattr(eintrag, field, val) + for field in ('beschreibung', 'bewertung', 'entscheidung'): + val = request.POST.get(field) + if val is not None: + setattr(eintrag, field, val) + titel = request.POST.get('titel', '').strip() + if titel: + eintrag.titel = titel eintrag.save() - return render(request, 'feedback/partials/eintrag_zeile.html', {'eintrag': eintrag}) + return render(request, 'feedback/partials/eintrag_zeile.html', _eintrag_ctx(eintrag)) diff --git a/vergabe_teilnahme/templates/feedback/backlog.html b/vergabe_teilnahme/templates/feedback/backlog.html index 43899fc..121c632 100644 --- a/vergabe_teilnahme/templates/feedback/backlog.html +++ b/vergabe_teilnahme/templates/feedback/backlog.html @@ -43,11 +43,9 @@ Datum - - {% for eintrag in eintraege %} - {% include "feedback/partials/eintrag_zeile.html" with status_choices=status_choices %} - {% endfor %} - + {% for eintrag in eintraege %} + {% include "feedback/partials/eintrag_zeile.html" %} + {% endfor %} {% else %}

Keine Einträge gefunden.

diff --git a/vergabe_teilnahme/templates/feedback/partials/eintrag_zeile.html b/vergabe_teilnahme/templates/feedback/partials/eintrag_zeile.html index b480ff3..f9b3e29 100644 --- a/vergabe_teilnahme/templates/feedback/partials/eintrag_zeile.html +++ b/vergabe_teilnahme/templates/feedback/partials/eintrag_zeile.html @@ -1,39 +1,115 @@ - - - {{ eintrag.titel|truncatechars:60 }} - {% if eintrag.ausschreibung %} - {{ eintrag.ausschreibung.titel|truncatechars:40 }} - {% endif %} - - {{ eintrag.beschreibung|truncatechars:100 }} - - - {{ eintrag.get_kategorie_display }} - - - - - {{ eintrag.get_dringlichkeit_display }} - - - -
- {% csrf_token %} - -
- - {{ eintrag.datum|date:"d.m.Y" }} - + + + {# display row #} + + + + + + {{ eintrag.titel }} + {% if eintrag.ausschreibung %} + {{ eintrag.ausschreibung.titel|truncatechars:40 }} + {% endif %} + + + + {{ eintrag.beschreibung|truncatechars:120 }} + + + {{ eintrag.get_kategorie_display }} + + + + + {{ eintrag.get_dringlichkeit_display }} + + + +
+ {% csrf_token %} + +
+ + {{ eintrag.datum|date:"d.m.Y" }} + + + {# edit row #} + + +
+ {% csrf_token %} +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + + +