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
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 55s
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user