Matrix: Header klickbar + konkrete Bürger:innen-Texte aus dem Lebensalltag

This commit is contained in:
Dotty Dotter 2026-04-10 23:43:57 +02:00
parent 632064d98f
commit 221d9426b7
2 changed files with 71 additions and 27 deletions

View File

@ -168,31 +168,31 @@ async def index(request: Request):
"parlament_names": parlament_names, "parlament_names": parlament_names,
"matrix_labels": MATRIX_LABELS, "matrix_labels": MATRIX_LABELS,
"matrix_explanations": { "matrix_explanations": {
"A1": "Werden bei öffentlichen Aufträgen Grundrechte in der Lieferkette beachtet?", "A1": "Wenn Ihre Stadt Büromöbel kauft: Wurden die unter menschenwürdigen Bedingungen hergestellt? Oder in einer Fabrik, in der Arbeiter:innen ausgebeutet werden? Hier geht es darum, ob die öffentliche Hand beim Einkauf auf Menschenrechte achtet.",
"A2": "Fließt öffentliches Geld in regionale Wertschöpfung statt Großkonzerne?", "A2": "Beauftragt die Stadt den Handwerksbetrieb aus dem Ort — oder den billigsten Konzern aus dem Ausland? Bleibt das Geld in der Region und schafft Arbeitsplätze vor Ort?",
"A3": "Achten Lieferant:innen auf Klimaschutz und Ressourcenschonung?", "A3": "Werden bei öffentlichen Aufträgen Klimastandards verlangt? Kommt das Schulessen von regionalen Bauernhöfen oder wird es quer durch Europa gekarrt?",
"A4": "Werden faire Löhne bei externen Dienstleistern sichergestellt?", "A4": "Verdienen die Reinigungskräfte im Rathaus einen fairen Lohn? Haben Subunternehmer die gleichen Arbeitsbedingungen wie Festangestellte?",
"A5": "Ist die Vergabe öffentlicher Aufträge transparent nachvollziehbar?", "A5": "Können Sie als Bürger:in nachschauen, welche Firma den Auftrag für den Straßenbau bekommen hat — und warum? Oder passiert das alles hinter verschlossenen Türen?",
"B1": "Wird mit öffentlichen Geldern ethisch umgegangen?", "B1": "Liegt das Geld Ihrer Stadt bei einer Bank, die auch Waffengeschäfte finanziert? Oder bei einer ethischen Bank, die in soziale Projekte investiert?",
"B2": "Werden Steuergelder für den Nutzen aller eingesetzt?", "B2": "Fließen Ihre Steuergelder in einen neuen Radweg für alle — oder in eine Umgehungsstraße, die nur dem Gewerbegebiet nützt?",
"B3": "Wird bei Investitionen der ökologische Fußabdruck berücksichtigt?", "B3": "Investiert Ihre Kommune in Solaranlagen auf Schuldächern? Oder wird das Geld in klimaschädliche Projekte gesteckt?",
"B4": "Ist die Verteilung öffentlicher Mittel sozial gerecht?", "B4": "Bekommen ärmere Stadtteile genauso viel Geld für Spielplätze und Schulen wie reiche? Oder konzentrieren sich die Investitionen dort, wo die Grundstückspreise schon hoch sind?",
"B5": "Können Bürger:innen mitentscheiden, wofür Geld ausgegeben wird?", "B5": "Gibt es einen Bürgerhaushalt, bei dem Sie mitbestimmen können, ob das Geld in die Bibliothek oder den Sportplatz fließt? Oder entscheidet das der Stadtrat allein?",
"C1": "Gibt es Gleichstellung und Diskriminierungsschutz in der Verwaltung?", "C1": "Werden in Ihrer Stadtverwaltung Frauen gleich bezahlt? Haben Menschen mit Behinderung faire Chancen auf eine Stelle? Gibt es Schutz vor Mobbing?",
"C2": "Arbeiten Verwaltung und Politik an gemeinsamen Gemeinwohl-Zielen?", "C2": "Hat Ihre Stadt ein Klimaschutzkonzept, das alle Ämter gemeinsam umsetzen? Oder kocht jedes Amt sein eigenes Süppchen?",
"C3": "Fördert die Verwaltung umweltbewusstes Handeln?", "C3": "Fahren die Mitarbeiter:innen des Rathauses mit dem Dienstrad oder dem SUV? Gibt es vegetarisches Essen in der Kantine?",
"C4": "Gibt es Chancengleichheit und familienfreundliche Arbeitszeiten?", "C4": "Können Eltern in der Verwaltung Teilzeit arbeiten, ohne Karrierenachteile? Gibt es flexible Arbeitszeiten für pflegende Angehörige?",
"C5": "Sind Entscheidungsprozesse in Politik und Verwaltung transparent?", "C5": "Können Sie die Sitzungsprotokolle des Stadtrats online lesen? Verstehen Sie, warum Entscheidungen so und nicht anders gefallen sind?",
"D1": "Werden Grundrechte geschützt? Gleichheit vor dem Gesetz?", "D1": "Werden Sie auf dem Amt fair behandelt — egal ob Sie einen deutschen oder ausländischen Namen haben? Schützt die Polizei alle gleich?",
"D2": "Profitieren möglichst viele Menschen — nicht nur einzelne Gruppen?", "D2": "Profitiert die ganze Stadt von dem Antrag — oder nur ein Stadtteil, eine Altersgruppe, eine Einkommensschicht?",
"D3": "Wird die Daseinsvorsorge ökologisch nachhaltig gestaltet?", "D3": "Kommt der Strom für die Straßenbeleuchtung aus Erneuerbaren? Wird das Regenwasser im Park versickert statt in die Kanalisation geleitet?",
"D4": "Haben alle Zugang zu Bildung, Gesundheit, Wohnen — unabhängig vom Einkommen?", "D4": "Kann sich die alleinerziehende Mutter den Kitaplatz leisten? Bekommt der Rentner noch einen Arzttermin? Findet die Familie mit drei Kindern eine bezahlbare Wohnung?",
"D5": "Werden Bürger:innen bei Entscheidungen einbezogen?", "D5": "Werden Sie gefragt, bevor die Straße vor Ihrem Haus umgebaut wird? Gibt es Bürgerversammlungen, Online-Beteiligung, Jugendparlamente?",
"E1": "Werden die Rechte künftiger Generationen mitgedacht?", "E1": "Hinterlassen wir unseren Enkeln einen Schuldenberg und versiegelte Flächen? Oder investieren wir heute so, dass auch 2050 noch gute Lebensbedingungen herrschen?",
"E2": "Hat der Antrag positive Wirkung über die Gemeindegrenzen hinaus?", "E2": "Hilft der Antrag nur Ihrer Stadt — oder auch den Nachbargemeinden? Gibt es regionale Kooperationen, von denen alle profitieren?",
"E3": "Werden ökologische Auswirkungen global bedacht?", "E3": "Denkt Ihre Kommune beim Einkauf auch an den CO₂-Fußabdruck? An die Abholzung von Regenwäldern für billiges Papier? An den Wasserverbrauch in Dürregebieten?",
"E4": "Trägt der Antrag zum sozialen Ausgleich bei — auch überregional?", "E4": "Unterstützt Ihre Stadt strukturschwache Regionen? Gibt es Partnerschaften mit Kommunen im globalen Süden?",
"E5": "Fördert der Antrag demokratische Mitbestimmung über die Gemeinde hinaus?", "E5": "Setzt sich Ihre Kommune für mehr Demokratie ein — auch auf Landes- und Bundesebene? Werden internationale Abkommen unterstützt?",
}, },
}) })

View File

@ -1015,6 +1015,50 @@
document.body.insertAdjacentHTML('beforeend', html); document.body.insertAdjacentHTML('beforeend', html);
} }
function showColumnInfo(col) {
const names = {1:'Menschenwürde',2:'Solidarität',3:'Ökologische Nachhaltigkeit',4:'Soziale Gerechtigkeit',5:'Transparenz & Mitbestimmung'};
const prinzipien = {1:'Rechtsstaatsprinzip',2:'Gemeinnutz',3:'Umwelt-Verantwortung',4:'Sozialstaatsprinzip',5:'Demokratie'};
const details = {
1: 'Werden Ihre Grundrechte geschützt? Sind Sie vor willkürlicher Behandlung durch Behörden sicher? Haben alle Menschen — unabhängig von Herkunft, Geschlecht oder Religion — die gleichen Rechte?',
2: 'Profitiert die Gemeinschaft? Wenn Ihre Kommune Geld ausgibt, kommt es bei den Menschen an? Werden Vereine, Nachbarschaftshilfe und ehrenamtliches Engagement gestärkt?',
3: 'Können Ihre Kinder noch saubere Luft atmen und in Seen schwimmen? Wird bei Entscheidungen an den Klimawandel gedacht? Gibt es mehr Grün in der Stadt, weniger Versiegelung?',
4: 'Kann sich jede Familie eine warme Wohnung leisten? Bekommen Kinder aus armen Familien die gleichen Bildungschancen? Gibt es bezahlbare Gesundheitsversorgung für alle?',
5: 'Können Sie als Bürger:in mitentscheiden, was in Ihrer Stadt passiert? Werden Sie rechtzeitig informiert? Sind Ratssitzungen öffentlich und verständlich?'
};
document.body.insertAdjacentHTML('beforeend', `
<div style="position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.4);z-index:300;display:flex;justify-content:center;align-items:center;" onclick="if(event.target===this)this.remove()">
<div style="background:white;border-radius:8px;padding:1.5rem;max-width:500px;width:90%;box-shadow:0 8px 24px rgba(0,0,0,0.2);">
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;">
<h3 style="color:var(--color-blue);margin:0;">Wert ${col}: ${names[col]}</h3>
<button onclick="this.closest('[style*=fixed]').remove()" style="background:none;border:none;font-size:1.2rem;cursor:pointer;"></button>
</div>
<p style="font-size:0.85rem;color:#666;margin-bottom:0.5rem;"><strong>Staatsprinzip:</strong> ${prinzipien[col]}</p>
<div style="background:#f8f9fa;padding:0.75rem;border-radius:6px;font-size:0.9rem;">${details[col]}</div>
</div>
</div>`);
}
function showRowInfo(row) {
const names = {'A':'Ausgelagerte Betriebe, Lieferant:innen, Dienstleister:innen','B':'Finanzpartner:innen, Geldgeber:innen, Steuerzahler:innen','C':'Politische Führung, Verwaltung, Ehrenamtliche','D':'Bürger:innen und Wirtschaft','E':'Staat, Gesellschaft und Natur'};
const details = {
'A': 'Wenn Ihre Stadt einen Spielplatz baut: Wer liefert das Material? Unter welchen Bedingungen wurde es hergestellt? Wird regional eingekauft — beim Handwerker um die Ecke — oder beim billigsten Anbieter aus dem Ausland? Diese Zeile bewertet, wie verantwortungsvoll die öffentliche Hand einkauft.',
'B': 'Wohin fließen Ihre Steuergelder? Liegt das Geld der Stadt bei einer ethischen Bank oder bei einem Finanzkonzern? Werden Investitionen so getätigt, dass sie der Allgemeinheit nutzen? Hier geht es um den verantwortungsvollen Umgang mit dem Geld, das Sie als Steuerzahler:in einzahlen.',
'C': 'Wie geht Ihre Stadtverwaltung mit den eigenen Mitarbeitenden um? Gibt es faire Bezahlung, Gleichstellung, familienfreundliche Arbeitszeiten? Engagieren sich Ehrenamtliche — und werden sie dafür wertgeschätzt? Diese Zeile bewertet die interne Kultur der öffentlichen Hand.',
'D': 'Das ist die Zeile, die Sie direkt betrifft: Funktioniert der Bus? Ist die Schule gut? Bekommen Sie einen Termin beim Amt? Können Sie sich die Miete leisten? Hier wird bewertet, ob die öffentliche Daseinsvorsorge bei Ihnen ankommt — bei allen, nicht nur bei wenigen.',
'E': 'Denkt Ihre Kommune über den eigenen Tellerrand hinaus? Wird beim Straßenbau an den Klimawandel gedacht? Gibt es Partnerschaften mit strukturschwachen Regionen? Hier wird bewertet, ob Entscheidungen auch für künftige Generationen und Menschen anderswo gut sind.'
};
document.body.insertAdjacentHTML('beforeend', `
<div style="position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.4);z-index:300;display:flex;justify-content:center;align-items:center;" onclick="if(event.target===this)this.remove()">
<div style="background:white;border-radius:8px;padding:1.5rem;max-width:500px;width:90%;box-shadow:0 8px 24px rgba(0,0,0,0.2);">
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;">
<h3 style="color:var(--color-blue);margin:0;">Gruppe ${row}: ${names[row]}</h3>
<button onclick="this.closest('[style*=fixed]').remove()" style="background:none;border:none;font-size:1.2rem;cursor:pointer;"></button>
</div>
<div style="background:#f8f9fa;padding:0.75rem;border-radius:6px;font-size:0.9rem;">${details[row]}</div>
</div>
</div>`);
}
// Sortierung (#100) // Sortierung (#100)
function setSortOrder(order) { function setSortOrder(order) {
currentSort = order; currentSort = order;
@ -1929,11 +1973,11 @@
const fieldExplain = {{ matrix_explanations | tojson }}; const fieldExplain = {{ matrix_explanations | tojson }};
let matrixTableHtml = '<table class="matrix-table"><thead><tr><th style="min-width:120px;"></th>'; let matrixTableHtml = '<table class="matrix-table"><thead><tr><th style="min-width:120px;"></th>';
for (let col = 1; col <= 5; col++) matrixTableHtml += `<th title="${colPrinzip[col]}" style="cursor:help;">${col}. ${colLabels[col]}</th>`; for (let col = 1; col <= 5; col++) matrixTableHtml += `<th style="cursor:pointer;" onclick="showColumnInfo(${col})">${col}. ${colLabels[col]}</th>`;
matrixTableHtml += '</tr></thead><tbody>'; matrixTableHtml += '</tr></thead><tbody>';
['A', 'B', 'C', 'D', 'E'].forEach(row => { ['A', 'B', 'C', 'D', 'E'].forEach(row => {
matrixTableHtml += `<tr><th title="${rowTooltips[row]}" style="cursor:help;text-align:left;font-size:0.8rem;">${row}: ${rowLabels[row]}</th>`; matrixTableHtml += `<tr><th style="cursor:pointer;text-align:left;font-size:0.8rem;" onclick="showRowInfo('${row}')">${row}: ${rowLabels[row]}</th>`;
for (let col = 1; col <= 5; col++) { for (let col = 1; col <= 5; col++) {
const field = `${row}${col}`; const field = `${row}${col}`;
const entry = matrixData[field]; const entry = matrixData[field];