Fix customer-reported survey results and list issues

Behebt die Fehler aus der Kunden-Testrunde (Praktikantin, Juli 2026):

- Ergebnisreihenfolge: Fragen werden vor dem Finalisieren nach _sorting
  sortiert. finalizeQuestionResult entfernt _sorting, daher fiel die
  bisherige Nachsortierung auf den alphabetischen Fallback zurück. Online,
  PDF und Excel folgen jetzt derselben Frage-Sortierung.
- Excel-Export: Eigene Fragetext-Zeile über den Antwortspalten (je Frage
  über die zugehörigen Spalten zusammengeführt). Zuvor fehlte der Fragetext.
- Range-Ergebnis: Verteilung deckt die komplette Skala rangeMin..rangeMax in
  rangeStep-Schritten ab, damit die X-Achse linear und vollständig ist
  (vorher nur tatsächlich vorkommende Werte in gleichen Abständen).
- Teilnahmen/Rücklauf pro Frage als absolute Zahlen ("X von Y beantwortet",
  "Z übersprungen") statt reiner Prozent-Rücklaufquote.
- Freitextantworten gruppiert: jede Antwort einmal mit exakter Häufigkeit,
  ohne Prozentangaben und ohne Doppel-Auflistung.
- Frontend-Liste: "Link kopieren"-Button (absolute Reader-URL) für
  veröffentlichte Umfragen; Aktiv-Umschalter mit Textlabel statt nur Punkt;
  Aktionslinks öffnen im selben Tab statt in neuen Tabs.
- Duplizieren: Titel-Kollisionsprüfung ohne Ausschluss der Quell-ID, damit
  aus "... - Kopie" korrekt "... - Kopie 2" wird statt eines Dubletten-Titels.

Der internalNote-Fehler beim Anlegen/Duplizieren war ein fehlendes
DB-Schema-Update (Spalte tl_survey.internalNote) und wurde per
contao:migrate auf der Testumgebung nachgezogen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-05 19:30:34 +02:00
parent 788f5ccde0
commit c7439e4822
11 changed files with 242 additions and 80 deletions
@@ -440,15 +440,36 @@
transform: translateY(0);
}
.survey-visibility-toggle {
display: inline-flex;
align-items: center;
gap: 0.55rem;
padding: 0.35rem 0.9rem 0.35rem 0.4rem;
border-radius: 999px;
border: 1px solid rgba(162, 168, 180, 0.5);
background: rgba(255, 255, 255, 0.88);
color: var(--survey-gray-dark);
font-weight: 700;
font-size: 0.9rem;
line-height: 1;
cursor: pointer;
transition: border-color 0.18s ease, color 0.18s ease;
}
.survey-visibility-toggle.is-on {
border-color: rgba(10, 131, 46, 0.45);
color: #0a6e28;
}
.survey-visibility-dot {
aspect-ratio: 1;
height: 42px;
height: 28px;
border-radius: 999px;
background: #a6adb7;
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
flex-shrink: 0;
transition: background 0.18s ease;
}
@@ -456,6 +477,10 @@
background: #0a832e;
}
.survey-visibility-label {
white-space: nowrap;
}
.survey-button-row {
display: flex;
flex-wrap: wrap;