feat(match-report): add double-only player markers and improve lineup filtering logic
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 55s

This commit is contained in:
Torsten Schulz (local)
2026-09-02 15:02:12 +02:00
parent d2d73e4548
commit 8e1da793d5

View File

@@ -205,7 +205,7 @@
<div v-if="meetingDetails && meetingDetails.teamLineupHomePlayers" class="lineup-section">
<h4>{{ $t('matchReportApi.selectedPlayers') }}</h4>
<div class="players-grid">
<div v-for="player in meetingDetails.teamLineupHomePlayers.filter(p => p.isSelected && p.nuLigaPersonId > 0)"
<div v-for="player in meetingDetails.teamLineupHomePlayers.filter(p => p.isSelected && p.nuLigaPersonId > 0 && isSingleLineupPlayer(p))"
:key="player.nuLigaPersonId" class="player-card selected">
<div class="player-main" @click="togglePlayerSelection(player, 'home')">
<div class="player-name">{{ player.firstname }} {{ player.lastname }}</div>
@@ -248,6 +248,13 @@
</div>
</div>
<div v-if="getDoubleOnlyLineupPlayers('home').length" class="double-only-markers">
<span class="double-only-label">Nur Doppel:</span>
<span v-for="player in getDoubleOnlyLineupPlayers('home')" :key="`home-double-${player.nuLigaPersonId}`" class="double-only-marker">
D{{ player.positionDouble }} · {{ player.firstname }} {{ player.lastname }}
</span>
</div>
<h4>{{ $t('matchReportApi.availablePlayers') }}</h4>
<div class="players-grid">
<div v-for="player in meetingDetails.teamLineupHomePlayers.filter(p => !p.isSelected && p.nuLigaPersonId > 0)"
@@ -311,7 +318,7 @@
<div v-if="meetingDetails && meetingDetails.teamLineupGuestPlayers" class="lineup-section">
<h4>{{ $t('matchReportApi.selectedPlayers') }}</h4>
<div class="players-grid">
<div v-for="player in meetingDetails.teamLineupGuestPlayers.filter(p => p.isSelected && p.nuLigaPersonId > 0)"
<div v-for="player in meetingDetails.teamLineupGuestPlayers.filter(p => p.isSelected && p.nuLigaPersonId > 0 && isSingleLineupPlayer(p))"
:key="player.nuLigaPersonId" class="player-card selected">
<div class="player-main" @click="togglePlayerSelection(player, 'guest')">
<div class="player-name">{{ player.firstname }} {{ player.lastname }}</div>
@@ -354,6 +361,13 @@
</div>
</div>
<div v-if="getDoubleOnlyLineupPlayers('guest').length" class="double-only-markers">
<span class="double-only-label">Nur Doppel:</span>
<span v-for="player in getDoubleOnlyLineupPlayers('guest')" :key="`guest-double-${player.nuLigaPersonId}`" class="double-only-marker">
D{{ player.positionDouble }} · {{ player.firstname }} {{ player.lastname }}
</span>
</div>
<h4>{{ $t('matchReportApi.availablePlayers') }}</h4>
<div class="players-grid">
<div v-for="player in meetingDetails.teamLineupGuestPlayers.filter(p => !p.isSelected && p.nuLigaPersonId > 0)"
@@ -4073,6 +4087,21 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
this.syncDraftToServerDebounced(700);
},
isSingleLineupPlayer(player) {
return Number(player?.positionSingle) > 0 ||
(Array.isArray(player?.positions) && player.positions.some(position => /^E\d+$/i.test(String(position))));
},
getDoubleOnlyLineupPlayers(team) {
const teamKey = team === 'home' ? 'teamLineupHomePlayers' : 'teamLineupGuestPlayers';
return (this.meetingDetails?.[teamKey] || []).filter(player =>
player?.isSelected &&
player?.nuLigaPersonId > 0 &&
player?.positionDouble &&
!this.isSingleLineupPlayer(player)
);
},
toggleDoublePosition(player, team, doublePosition) {
if (this.isLineupLocked(team)) return;
if (!this.meetingDetails) return;
@@ -4826,6 +4855,10 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
},
isLineupLocked(team) {
// Im Testmodus bleiben Aufstellungen auch nach einer Test-Signatur editierbar.
if (this.isTestMode) {
return false;
}
return team === 'home' ? this.isHomeLineupCertified : this.isGuestLineupCertified;
},
@@ -4835,6 +4868,9 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
// Prüfe ob Aufstellung-Tab geöffnet werden kann
canOpenLineupTab(team) {
if (this.isTestMode) {
return true;
}
if ((team === 'home' && this.teamNotAppeared === 'home') ||
(team === 'guest' && this.teamNotAppeared === 'guest')) {
return false;
@@ -5881,6 +5917,29 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
padding-bottom: 8px;
}
.double-only-markers {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 0.45rem;
margin: 0.75rem 0 1.25rem;
}
.double-only-label {
color: #666;
font-size: 0.9em;
font-weight: 600;
}
.double-only-marker {
padding: 0.25rem 0.5rem;
border-radius: 999px;
background: #fff3cd;
color: #7a5200;
font-size: 0.85em;
font-weight: 600;
}
.player-card.selected {
border-color: var(--primary-color);
background-color: #f8f9fa;