From 741faae8ff516a1075d63604ee3512ef86e092ab Mon Sep 17 00:00:00 2001 From: Dotty Dotter Date: Wed, 6 May 2026 15:52:09 +0200 Subject: [PATCH] feat(#169): eigene /stimmverhalten-View als linker Nav-Eintrag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neue Route /stimmverhalten rendert dieselbe auswertungen.html, aber mit default_tab='stimmverhalten' und v2_active_nav='stimmverhalten'. Linker Nav-Eintrag 'Stimmverhalten' (Icon scales) zwischen Auswertungen und Aktuelle Themen. Beim Page-Load aktiviert das DOMContentLoaded-Handler den im Context gesetzten Tab — fuer /auswertungen ist es 'bl-partei' (Default), fuer /stimmverhalten direkt 'stimmverhalten'. Kein Code-Duplikat im Tab-Inhalt. Refs: #169 Co-Authored-By: Claude Opus 4.7 (1M context) --- app/main.py | 22 ++++++++++++++++++++++ app/templates/v2/base.html | 1 + app/templates/v2/screens/auswertungen.html | 14 +++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/app/main.py b/app/main.py index 3439aac..df99c84 100644 --- a/app/main.py +++ b/app/main.py @@ -2062,6 +2062,28 @@ async def auswertungen_page(request: Request, current_user: dict = Depends(requi "v2_active_nav": "auswertungen", "wahlperioden": wahlperioden, "bl_codes": bl_codes, + "default_tab": "bl-partei", + **_v2_template_context(current_user), + }) + + +@app.get("/stimmverhalten", response_class=HTMLResponse) +async def stimmverhalten_page(request: Request, current_user: dict = Depends(require_auth)): + """Eigene View für Stimmverhalten × GWÖ (#169). Rendert auswertungen.html + mit default_tab=stimmverhalten und Active-Nav 'stimmverhalten'.""" + from .auswertungen import get_wahlperioden + from .bundeslaender import alle_bundeslaender + + wahlperioden = get_wahlperioden() + bl_codes = sorted(bl.code for bl in alle_bundeslaender() if bl.aktiv) + + return templates.TemplateResponse("v2/screens/auswertungen.html", { + "request": request, + "app_name": settings.app_name, + "v2_active_nav": "stimmverhalten", + "wahlperioden": wahlperioden, + "bl_codes": bl_codes, + "default_tab": "stimmverhalten", **_v2_template_context(current_user), }) diff --git a/app/templates/v2/base.html b/app/templates/v2/base.html index f41bba4..e43cb37 100644 --- a/app/templates/v2/base.html +++ b/app/templates/v2/base.html @@ -56,6 +56,7 @@
— Daten
{{ icon("chart-bar", 14) }} Auswertungen + {{ icon("scales", 14) }} Stimmverhalten {{ icon("book-open", 14) }} Aktuelle Themen {{ icon("file-csv", 14) }} Export · API {{ icon("rss", 14) }} Atom-Feed diff --git a/app/templates/v2/screens/auswertungen.html b/app/templates/v2/screens/auswertungen.html index c32c06c..8952d9c 100644 --- a/app/templates/v2/screens/auswertungen.html +++ b/app/templates/v2/screens/auswertungen.html @@ -518,7 +518,19 @@ window.addEventListener('v2-bl-changed', function () { // Stimmverhalten reagiert NICHT auf globalen BL-Filter — eigener Selector. }); -document.addEventListener('DOMContentLoaded', function () { loadBlMatrix(); }); +document.addEventListener('DOMContentLoaded', function () { + // Default-Tab aus Server-Context — z.B. /stimmverhalten setzt 'stimmverhalten' + const initialTab = {{ default_tab | default('bl-partei') | tojson }}; + if (initialTab && initialTab !== 'bl-partei') { + const tabBtn = document.querySelector(`.auswert-tab[onclick*="'${initialTab}'"]`); + if (tabBtn) { + switchTab(initialTab, tabBtn); + tabBtn.scrollIntoView({block: 'nearest', inline: 'center'}); + return; + } + } + loadBlMatrix(); +}); function scoreClass(avg) { if (avg == null) return '';