diff --git a/frontend/src/components/MatchReportApiDialog.vue b/frontend/src/components/MatchReportApiDialog.vue index 4a4b1115..e5a8e037 100755 --- a/frontend/src/components/MatchReportApiDialog.vue +++ b/frontend/src/components/MatchReportApiDialog.vue @@ -307,29 +307,12 @@
👆 {{ $t('matchReportApi.clickToRemove') }}
- - - -
@@ -355,17 +338,12 @@
👆 Klicken zum Hinzufügen
- -
@@ -426,29 +404,12 @@
👆 {{ $t('matchReportApi.clickToRemove') }}
- - - -
@@ -474,17 +435,12 @@
👆 Klicken zum Hinzufügen
- -
@@ -537,64 +493,66 @@ - - - - - - - - - - - - - - - - - - -
#HeimGastSatz 1Satz 2Satz 3Satz 4Satz 5StatusErgebnis
+ + + + + +
@@ -2859,6 +2817,8 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr return Boolean(normalized) && ![ 'nicht angegeben', 'nicht angegeben / nicht angegeben', + 'nicht anwesend', + 'nicht anwesend / nicht anwesend', 'not specified', 'unknown', 'unbekannt', @@ -4670,8 +4630,13 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr const playerIndex = this.meetingDetails[teamKey].findIndex(p => p.nuLigaPersonId === player.nuLigaPersonId); if (playerIndex !== -1) { - // Toggle selection status - this.meetingDetails[teamKey][playerIndex].isSelected = !this.meetingDetails[teamKey][playerIndex].isSelected; + const selectedPlayer = this.meetingDetails[teamKey][playerIndex]; + selectedPlayer.isSelected = !selectedPlayer.isSelected; + // Eine Doppelposition ohne aufgestellten Spieler ist ungültig + // und darf weder Plätze blockieren noch in Paarungen auftauchen. + if (!selectedPlayer.isSelected) { + selectedPlayer.positionDouble = null; + } // Recalculate all positions for selected players this.recalculatePositions(teamKey); @@ -4702,6 +4667,14 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr ); }, + getDoublePositions() { + const positions = this.meetingDetails?.teamLineupDoublePositions; + if (Array.isArray(positions) && positions.length > 0) { + return [...new Set(positions.map(Number).filter(Number.isInteger))].sort((a, b) => a - b); + } + return [1, 2]; + }, + toggleDoublePosition(player, team, doublePosition) { if (this.viewOnly) return; if (this.isLineupLocked(team)) return; @@ -4711,11 +4684,13 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr const playerIndex = this.meetingDetails[teamKey].findIndex(p => p.nuLigaPersonId === player.nuLigaPersonId); if (playerIndex !== -1) { - const currentDoublePosition = this.meetingDetails[teamKey][playerIndex].positionDouble; + const selectedPlayer = this.meetingDetails[teamKey][playerIndex]; + if (!selectedPlayer.isSelected) return; + const currentDoublePosition = selectedPlayer.positionDouble; if (currentDoublePosition === doublePosition) { // Deselect if already selected - this.meetingDetails[teamKey][playerIndex].positionDouble = null; + selectedPlayer.positionDouble = null; } else { // Check if we can select this position if (!this.canSelectDoublePosition(player, team, doublePosition)) { @@ -4723,13 +4698,13 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr } // Select new position (automatically removes from previous position) - this.meetingDetails[teamKey][playerIndex].positionDouble = doublePosition; - + selectedPlayer.positionDouble = doublePosition; + } - // Ergebnisse neu berechnen, wenn nicht beide Aufstellungen zertifiziert sind - if (!this.isHomeLineupCertified || !this.isGuestLineupCertified) { - this.prepareResults(); - } + // Sowohl Setzen als auch Entfernen muss die Doppelzeilen + // unmittelbar aus den aktuellen Paaren neu auflösen. + if (!this.isHomeLineupCertified || !this.isGuestLineupCertified) { + this.prepareResults(); } } this.persistLocalDraftDebounced(); @@ -4743,15 +4718,20 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr const teamKey = team === 'home' ? 'teamLineupHomePlayers' : 'teamLineupGuestPlayers'; + // Doppelpartner müssen Teil der Aufstellung sein. Damit können + // Karten in „Verfügbare Spieler“ keine unsichtbaren Doppel belegen. + if (!player.isSelected) { + return false; + } + // Check if player is already selected for a different double position if (player.positionDouble && player.positionDouble !== doublePosition) { return false; // Player is already assigned to a different double position } - // Count how many players are already selected for this double position - // Include ALL players (both selected and available) who have this double position + // Pro Doppelposition sind genau zwei aufgestellte Spieler erlaubt. const playersInDoublePosition = this.meetingDetails[teamKey].filter(p => - p.positionDouble === doublePosition && p.nuLigaPersonId !== player.nuLigaPersonId && p.nuLigaPersonId > 0 + p.isSelected && p.positionDouble === doublePosition && p.nuLigaPersonId !== player.nuLigaPersonId && p.nuLigaPersonId > 0 ); // Allow selection if less than 2 players are already selected for this position @@ -6061,7 +6041,16 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr } .result-content { margin-top: 2px; } -.result-table { width: 100%; border-collapse: collapse; background: #fff; border: 1px solid #e0e0e0; border-radius: 8px; overflow: hidden; } +.result-table-wrap { + width: 100%; + overflow-x: auto; + overscroll-behavior-inline: contain; + border: 1px solid #e0e0e0; + border-radius: 8px; + background: #fff; +} +.result-table-wrap:focus { outline: 2px solid rgba(var(--primary-rgb), 0.35); outline-offset: 2px; } +.result-table { width: 100%; min-width: 960px; border-collapse: collapse; background: #fff; } .result-table th, .result-table td { border-bottom: 1px solid #eee; padding: 8px; text-align: left; } .result-table thead th { background: #f8f9fa; } .set-input-wrapper { @@ -6766,8 +6755,8 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr /* Doppel-Auswahl - Layout bereits oben definiert */ .player-main { - flex: 1; - width: 100%; + flex: 1 1 auto; + min-width: 0; border: 0; background: transparent; color: inherit; @@ -6780,6 +6769,12 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr -webkit-tap-highlight-color: transparent; } +.player-name, +.player-details, +.player-action { + overflow-wrap: anywhere; +} + .player-main:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);