feat(match-report): enhance test mode with validation results display and improve original report comparison layout
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:
@@ -40,8 +40,8 @@
|
||||
</div>
|
||||
|
||||
<div v-if="isTestMode" class="test-data-inspector">
|
||||
<details v-if="originalTestReport" class="original-report-comparison">
|
||||
<summary>Originalbericht zum Vergleich</summary>
|
||||
<section v-if="originalTestReport" class="original-report-comparison">
|
||||
<h3>Originalbericht zum Vergleich</h3>
|
||||
<div class="comparison-summary">
|
||||
<span><strong>Status:</strong> {{ getOriginalReportStatus() }}</span>
|
||||
<span><strong>Spielstand:</strong> {{ getOriginalReportScore() }}</span>
|
||||
@@ -75,7 +75,7 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</details>
|
||||
</section>
|
||||
<details>
|
||||
<summary>Originaldaten anzeigen (technisch)</summary>
|
||||
<pre>{{ formatTestData(originalTestReport || originalTestInput) }}</pre>
|
||||
@@ -86,6 +86,15 @@
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<div v-if="isTestMode && testSubmissionResult" class="test-submit-result"
|
||||
:class="testSubmissionResult.valid ? 'test-success' : 'test-error'">
|
||||
<strong>{{ testSubmissionResult.valid ? '✓ Testprüfung erfolgreich' : '⚠ Testprüfung fehlgeschlagen' }}</strong>
|
||||
<p>{{ testSubmissionResult.summary }}</p>
|
||||
<ul v-if="testSubmissionResult.messages.length">
|
||||
<li v-for="message in testSubmissionResult.messages" :key="message">{{ message }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div v-if="isTestMode && (meetingDetails?.isCompleted || meetingData?.isCompleted)" class="test-verification">
|
||||
<button type="button" class="btn-secondary" @click="verifyCompletedMatchProjection">
|
||||
🧪 Gespeicherte Paarungen prüfen
|
||||
@@ -852,6 +861,7 @@ export default {
|
||||
error: null,
|
||||
isTestMode: this.standaloneTest,
|
||||
testVerification: null,
|
||||
testSubmissionResult: null,
|
||||
originalTestInput: null,
|
||||
// Unveränderliche Referenz auf den offiziellen Bericht, bevor der
|
||||
// Testmodus seinen vollständig leeren lokalen Zustand erzeugt.
|
||||
@@ -1185,6 +1195,7 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
|
||||
handler() {
|
||||
// Ein früherer Prüfhinweis gilt nach einer lokalen Änderung nicht mehr.
|
||||
this.testVerification = null;
|
||||
this.testSubmissionResult = null;
|
||||
this.persistLocalDraftDebounced();
|
||||
},
|
||||
deep: true
|
||||
@@ -1194,6 +1205,7 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
|
||||
// Änderungen an Aufstellung, Doppelbesetzung oder Spieldaten
|
||||
// machen einen bereits angezeigten Abgleich hinfällig.
|
||||
this.testVerification = null;
|
||||
this.testSubmissionResult = null;
|
||||
this.persistLocalDraftDebounced();
|
||||
},
|
||||
deep: true
|
||||
@@ -1909,17 +1921,40 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
|
||||
return true;
|
||||
},
|
||||
|
||||
runTestValidation() {
|
||||
const messages = [];
|
||||
const teamNotAppeared = this.teamNotAppeared !== null;
|
||||
|
||||
if (!teamNotAppeared) {
|
||||
if (!this.areAllMatchResultsValid()) {
|
||||
messages.push('Die Ergebniserfassung enthält unvollständige oder ungültige Spiele.');
|
||||
}
|
||||
if (!this.areStartAndEndTimesValid()) {
|
||||
messages.push('Start- und Endzeit müssen beide gesetzt sein.');
|
||||
}
|
||||
if (!this.isHomeLineupCertified) {
|
||||
messages.push('Die Heimaufstellung wurde noch nicht bestätigt.');
|
||||
}
|
||||
if (!this.isGuestLineupCertified) {
|
||||
messages.push('Die Gastaufstellung wurde noch nicht bestätigt.');
|
||||
}
|
||||
}
|
||||
|
||||
this.testSubmissionResult = {
|
||||
valid: messages.length === 0,
|
||||
summary: messages.length === 0
|
||||
? 'Der lokale Testbericht erfüllt alle Prüfregeln. Es wurden keine Daten an NuScore übermittelt.'
|
||||
: 'Der lokale Testbericht kann in diesem Zustand nicht abgeschlossen werden. Es wurden keine Daten an NuScore übermittelt.',
|
||||
messages
|
||||
};
|
||||
},
|
||||
|
||||
async submitMatchReport() {
|
||||
try {
|
||||
console.log('🚀 Starte Spielbericht-Absendung...');
|
||||
|
||||
if (this.isTestMode) {
|
||||
if (this.standaloneTest) {
|
||||
this.submitSucceeded = true;
|
||||
this.meetingData.isCompleted = true;
|
||||
this.meetingDetails.isCompleted = true;
|
||||
}
|
||||
alert('🧪 Testmodus: Der Spielbericht wurde nur lokal geprüft und nicht an nuScore übermittelt.');
|
||||
this.runTestValidation();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3375,6 +3410,7 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
|
||||
this.submitSucceeded = false;
|
||||
this.initialCompletionState = false;
|
||||
this.testVerification = null;
|
||||
this.testSubmissionResult = null;
|
||||
this.activeSection = 'general';
|
||||
|
||||
await this.$nextTick();
|
||||
@@ -5212,6 +5248,12 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
|
||||
background: #f7fbf8 !important;
|
||||
}
|
||||
|
||||
.original-report-comparison h3 {
|
||||
margin: 0 0 10px;
|
||||
color: #216e39;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.comparison-summary {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
@@ -5293,6 +5335,23 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
|
||||
background: #fffaf0;
|
||||
}
|
||||
|
||||
.test-submit-result {
|
||||
margin: 0 0 16px;
|
||||
padding: 12px 14px;
|
||||
border: 1px solid currentColor;
|
||||
border-radius: 8px;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.test-submit-result p {
|
||||
margin: 6px 0 0;
|
||||
}
|
||||
|
||||
.test-submit-result ul {
|
||||
margin: 8px 0 0;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.test-verification p {
|
||||
margin: 10px 0 0;
|
||||
font-size: 13px;
|
||||
|
||||
Reference in New Issue
Block a user