feat(match-report): enhance score input validation and parsing in MatchReportApiDialog

- Improved score input handling by allowing whitespace in valid patterns and ensuring robust parsing of various score formats.
- Updated logic to handle edge cases for score entry, including explicit handling of negative scores and single positive numbers.
- Enhanced overall user experience by ensuring cleaner input processing and validation, maintaining data integrity during score entry.
This commit is contained in:
Torsten Schulz (local)
2026-02-26 16:52:52 +01:00
parent 00e058a665
commit 0ee9e486b5

View File

@@ -2375,16 +2375,15 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
processScoreInput(matchIndex, setIndex) {
const match = this.results[matchIndex];
const inputValue = match.sets[setIndex];
if (!inputValue || inputValue.trim() === '') {
const inputValue = String(match.sets[setIndex] ?? '').trim();
if (!inputValue) {
return;
}
// Validiere Eingabe: nur Zahlen, Bindestriche und Doppelpunkte
const validPattern = /^[0-9:\-]*$/;
const validPattern = /^[0-9:\-\s]*$/;
if (!validPattern.test(inputValue)) {
// Entferne ungültige Zeichen
const cleanedValue = inputValue.replace(/[^0-9:\-]/g, '');
match.sets[setIndex] = cleanedValue;
return;
@@ -2518,44 +2517,46 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
parseAndValidateScore(inputValue, matchIndex, setIndex) {
const match = this.results[matchIndex];
// Entferne Leerzeichen
const cleanedValue = inputValue.trim();
const cleanedValue = String(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;
if (cleanedValue.includes(':')) {
// Format: "3:1"
// Format: "3:1" (explizit mit Doppelpunkt)
const parts = cleanedValue.split(':');
homeScore = parseInt(parts[0]) || 0;
guestScore = parseInt(parts[1]) || 0;
homeScore = parseInt(parts[0], 10) || 0;
guestScore = parseInt(parts[1], 10) || 0;
} else if (cleanedValue.startsWith('-')) {
// Format: "-0" bis "-X" -> "X:max(11, X+2)"
const valueStr = cleanedValue.substring(1); // Entferne das Minus
const value = parseInt(valueStr) || 0;
// Format: "-8" -> Gast gewinnt 8:11 (Heim hat 8, Gast 11)
const valueStr = cleanedValue.substring(1).trim();
const value = parseInt(valueStr, 10) || 0;
homeScore = value;
guestScore = Math.max(11, value + 2);
} else if (/^\d+$/.test(cleanedValue)) {
// Nur eine positive Zahl: "8" -> Heim gewinnt 11:8 (Gast hat 8 Punkte)
const value = parseInt(cleanedValue, 10) || 0;
homeScore = Math.max(11, value + 2);
guestScore = value;
} else if (cleanedValue.includes('-') && cleanedValue.split('-').length === 2) {
// Format: "3-1" (zwei Teile mit Bindestrich)
const parts = cleanedValue.split('-');
homeScore = parseInt(parts[0]) || 0;
guestScore = parseInt(parts[1]) || 0;
homeScore = parseInt(parts[0], 10) || 0;
guestScore = parseInt(parts[1], 10) || 0;
} else if (cleanedValue.includes(' ')) {
// Format: "3 1"
const parts = cleanedValue.split(' ');
homeScore = parseInt(parts[0]) || 0;
guestScore = parseInt(parts[1]) || 0;
const parts = cleanedValue.split(/\s+/);
homeScore = parseInt(parts[0], 10) || 0;
guestScore = parseInt(parts[1], 10) || 0;
} else {
// Format: "0" bis "X" -> "max(11,X+2):X"
const value = parseInt(cleanedValue) || 0;
// Fallback: wie eine einzelne Zahl behandeln
const value = parseInt(cleanedValue, 10) || 0;
homeScore = Math.max(11, value + 2);
guestScore = value;
}