diff --git a/frontend/src/components/MatchReportApiDialog.vue b/frontend/src/components/MatchReportApiDialog.vue
index f361305..9895a32 100644
--- a/frontend/src/components/MatchReportApiDialog.vue
+++ b/frontend/src/components/MatchReportApiDialog.vue
@@ -354,9 +354,10 @@
{
+ if (set && set.includes(':')) {
+ const [home, guest] = set.split(':').map(s => parseInt(s) || 0);
+
+ if (player === 'home' && home > guest) {
+ wins++;
+ } else if (player === 'guest' && guest > home) {
+ wins++;
+ }
+ }
+ });
+ return wins;
+ },
+
+ // Prüfe ob ein Satz-Input-Feld deaktiviert werden sollte
+ isSetInputDisabled(matchIndex, setIndex) {
+ const match = this.results[matchIndex];
+
+ // Wenn Match bereits abgeschlossen, alle Felder deaktiviert
+ if (match.completed) {
+ return true;
+ }
+
+ // Berechne aktuelle Gewinne ohne das zu prüfende Feld
+ let homeWins = 0;
+ let guestWins = 0;
+
+ match.sets.forEach((set, index) => {
+ // Überspringe das aktuell zu prüfende Feld
+ if (index === setIndex) {
+ return;
+ }
+
+ if (set && set.includes(':')) {
+ const [home, guest] = set.split(':').map(s => parseInt(s) || 0);
+
+ if (home > guest) {
+ homeWins++;
+ } else if (guest > home) {
+ guestWins++;
+ }
+ }
+ });
+
+ // Prüfe ob das aktuelle Feld bereits ausgefüllt ist
+ const currentSet = match.sets[setIndex];
+ const currentFieldHasValue = currentSet && currentSet.trim() !== '' && currentSet.includes(':');
+
+ // Wenn ein Spieler bereits 3 Sätze gewonnen hat UND das aktuelle Feld leer ist,
+ // dann dieses Feld deaktivieren (bereits ausgefüllte Felder bleiben aktiv)
+ if ((homeWins >= 3 || guestWins >= 3) && !currentFieldHasValue) {
+ return true;
+ }
+
+ return false;
+ },
+
+ // Prüfe ob es leere Input-Felder gibt, die nicht am Ende stehen
+ hasGapInSets(match) {
+ const problematicGaps = [];
+
+ for (let i = 0; i < match.sets.length; i++) {
+ const hasCurrentValue = match.sets[i] && match.sets[i].trim() !== '' && match.sets[i].includes(':');
+
+ // Wenn dieses Feld leer ist, prüfe ob es ein Problem darstellt
+ if (!hasCurrentValue) {
+ // Prüfe ob es ausgefüllte Felder nach diesem gibt
+ const hasFilledAfter = match.sets.slice(i + 1).some(set =>
+ set && set.trim() !== '' && set.includes(':')
+ );
+
+ if (hasFilledAfter) {
+ problematicGaps.push(i);
+ }
+ }
+ }
+
+ return problematicGaps.length > 0 ? problematicGaps : false;
+ },
+
+ // Prüfe ob ein Satz-Input rot umrandet werden sollte
+ shouldHighlightSetInput(matchIndex, setIndex) {
+ const match = this.results[matchIndex];
+
+ // Wenn Match schon abgeschlossen, keine Hervorhebung
+ if (match.completed) {
+ return false;
+ }
+
+ // Hole alle Lücken-Indizes
+ const gapIndices = this.hasGapInSets(match);
+
+ if (gapIndices === false) {
+ return false;
+ }
+
+ // Prüfe ob dieses Feld eine der problematischen Lücken ist
+ if (Array.isArray(gapIndices) && gapIndices.includes(setIndex)) {
+ const currentSet = match.sets[setIndex];
+ return !currentSet || currentSet.trim() === '' || !currentSet.includes(':');
+ }
+
+ return false;
+ },
+
parseAndValidateScore(inputValue, matchIndex, setIndex) {
const match = this.results[matchIndex];
// Entferne Leerzeichen
const cleanedValue = inputValue.trim();
+ // Prüfe ob das Feld überhaupt bearbeitet werden darf
+ if (this.isSetInputDisabled(matchIndex, setIndex)) {
+ // Wenn das Feld deaktiviert werden soll, Eingabe ignorieren
+ return;
+ }
+
// Verschiedene Eingabeformate unterstützen:
// "3:1", "3-1", "3 1", "3:1 ", "3", "-3"
let homeScore, guestScore;
@@ -1657,6 +1772,17 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
validateMatchCompletion(matchIndex) {
const match = this.results[matchIndex];
+
+ // Prüfe auf Lücken in der Sätze-Reihenfolge
+ const gapIndices = this.hasGapInSets(match);
+ if (gapIndices !== false && Array.isArray(gapIndices) && gapIndices.length > 0) {
+ const gapNumbers = gapIndices.map(idx => idx + 1).join(', ');
+ return {
+ isValid: false,
+ error: `Satz ${gapNumbers} muss ausgefüllt werden, bevor weitere Sätze eingegeben werden können.`
+ };
+ }
+
let homeWins = 0;
let guestWins = 0;
@@ -3510,6 +3636,25 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
gap: 6px;
}
+/* Satz-Input Warnung für Lücken */
+.set-input.gap-warning {
+ border: 2px solid #dc3545 !important;
+ background-color: #fef5f5 !important;
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25) !important;
+}
+
+.set-input.gap-warning:focus {
+ border: 2px solid #dc3545 !important;
+ box-shadow: 0 0 0 0.3rem rgba(220, 53, 69, 0.25) !important;
+}
+
+.set-input:disabled {
+ opacity: 0.6 !important;
+ cursor: not-allowed !important;
+ background-color: #f8f9fa !important;
+ border-color: #dee2e6 !important;
+}
+
/* Zertifizierung-Styles */
.section-btn.certified {
background-color: #d4edda;
|