diff --git a/frontend/src/components/MatchReportApiDialog.vue b/frontend/src/components/MatchReportApiDialog.vue
index 005a9e2..35dbe82 100644
--- a/frontend/src/components/MatchReportApiDialog.vue
+++ b/frontend/src/components/MatchReportApiDialog.vue
@@ -322,10 +322,13 @@
@@ -400,6 +403,13 @@
+
+
+
+
+
@@ -407,6 +417,17 @@
{{ getOverallScore() }}
+
+
+
+
+
+ Endzeit:
+ {{ formatTime(match.endDate) }}
+
+
+
+
@@ -841,6 +862,40 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
}
},
+ // Formatiere Zeit für Anzeige
+ formatTime(dateTime) {
+ if (!dateTime) return '—';
+ const date = new Date(dateTime);
+ return date.toLocaleTimeString('de-DE', {
+ hour: '2-digit',
+ minute: '2-digit'
+ });
+ },
+
+ // Setze aktuelle Zeit für Startzeit
+ setCurrentStartTime() {
+ const now = new Date();
+ const timeString = now.toTimeString().substring(0, 8); // HH:MM:SS Format
+ this.match.startDate = now;
+ console.log(`📅 Startzeit gesetzt auf: ${timeString}`);
+ },
+
+ // Setze aktuelle Zeit für Endzeit mit intelligenter Navigation
+ setEndTimeAndNavigate() {
+ const now = new Date();
+ const timeString = now.toTimeString().substring(0, 8); // HH:MM:SS Format
+ this.match.endDate = now;
+ console.log(`📅 Endzeit gesetzt auf: ${timeString}`);
+
+ // Prüfe ob alle notwendigen Spiele abgeschlossen sind und navigiere
+ this.checkAllMatchableCompletedAndNavigate();
+ },
+
+ // Setze aktuelle Zeit für Startzeit (Legacy für Kompatibilität)
+ setCurrentEndTime() {
+ this.setEndTimeAndNavigate();
+ },
+
// Auto-Fill für leere Matches
autoFillEmptyMatches() {
console.log('🔧 Starte Auto-Fill für leere Matches...');
@@ -897,6 +952,98 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
console.log(`🎯 Match ${matchIndex + 1} gefüllt und abgeschlossen: ${JSON.stringify(match.sets)}`);
},
+ // Prüfe ob alle Spiele gespielt sind und navigiere evtl. zu Abschluss
+ checkAndNavigateToCompletion() {
+ console.log('🔍 Prüfe auf Abschluss-Bereitschaft...');
+
+ if (!this.results || this.results.length === 0) {
+ console.log('❌ Keine Ergebnisse vorhanden');
+ return;
+ }
+
+ // Zähle abgeschlossene Matches
+ const completedMatches = this.results.filter(match => match.completed);
+ const totalMatches = this.results.length;
+ const playThrough = this.getPlayThrough();
+
+ console.log(`📊 Matches: ${completedMatches.length}/${totalMatches} abgeschlossen`);
+ console.log(`🎮 Play Through: ${playThrough}`);
+
+ // Prüfe ALLGAMES Modus
+ if (playThrough && playThrough.toUpperCase().includes('ALLGAMES')) {
+ // Im ALLGAMES Modus: alle Spiele müssen abgeschlossen sein
+ if (completedMatches.length === totalMatches) {
+ console.log('✅ ALLGAMES: Alle Spiele abgeschlossen → springe zu Abschluss');
+ this.setActiveSection('completion');
+ return;
+ } else {
+ console.log(`⚠️ ALLGAMES: Nur ${completedMatches.length}/${totalMatches} Spiele abgeschlossen`);
+ return;
+ }
+ } else {
+ // Normal Mode: mindestens ein Spiel muss abgeschlossen sein
+ if (completedMatches.length > 0) {
+ console.log(`✅ Normal Mode: ${completedMatches.length} Spiele abgeschlossen → springe zu Abschluss`);
+ this.setActiveSection('completion');
+ return;
+ } else {
+ console.log('⚠️ Normal Mode: Keine Spiele abgeschlossen');
+ return;
+ }
+ }
+ },
+
+ // Prüfe ob alle abgeschliebaren Spiele tatsächlich abgeschlossen sind
+ checkAllMatchableCompletedAndNavigate() {
+ console.log('🔍 Prüfe alle abgeschliebbaren Matches...');
+
+ if (!this.results || this.results.length === 0) {
+ console.log('❌ Keine Ergebnisse vorhanden');
+ return;
+ }
+
+ // Vereinfachte Logik: Alle Matches sind matchable wenn sie abgeschlossen sind
+ const completedMatches = this.results.filter(match => match.completed);
+ const totalMatches = this.results.length;
+
+ console.log(`📊 Abgeschlossene Matches: ${completedMatches.length}/${totalMatches}`);
+
+ // Wenn alle Matches abgeschlossen sind, navigiere zu Abschluss
+ if (completedMatches.length === totalMatches) {
+ console.log('✅ Alle Matches sind abgeschlossen → springe zu Abschluss');
+ this.setActiveSection('completion');
+ } else {
+ console.log(`⚠️ Nur ${completedMatches.length}/${totalMatches} Matches sind abgeschlossen`);
+ }
+ },
+
+ // Intelligente Navigation nach Zertifizierung
+ navigateAfterCertification() {
+ console.log('🧭 Intelligente Navigation nach Zertifizierung...');
+
+ // Prüfe ob beide Aufstellungen jetzt zertifiziert sind
+ const bothCertified = this.isHomeLineupCertified && this.isGuestLineupCertified;
+ console.log(`📋 Beide Aufstellungen zertifiziert: ${bothCertified}`);
+ console.log(`📝 Begrüßung abgeschlossen: ${this.isGreetingCompleted}`);
+
+ if (bothCertified) {
+ // Beide Aufstellungen sind jetzt zertifiziert
+ if (!this.isGreetingCompleted) {
+ // Begrüßung noch nicht abgeschlossen → zu Begrüßung
+ this.setActiveSection('greeting');
+ console.log('🎯 Beide Aufstellungen zertifiziert → Begrüßung');
+ } else {
+ // Begrüßung bereits abgeschlossen → zu Ergebniserfassung
+ this.setActiveSection('result');
+ console.log('🎯 Beide Aufstellungen zertifiziert + Begrüßung abgeschlossen → Ergebniserfassung');
+ }
+ } else {
+ // Nur eine Aufstellung zertifiziert → zu allgemeinem Tab
+ this.setActiveSection('general');
+ console.log('🎯 Nur eine Aufstellung zertifiziert → Allgemein');
+ }
+ },
+
// Methoden für Abschluss-Seite
getHomeDoublePairs() {
if (!this.results || this.results.length === 0) return [];
@@ -2554,8 +2701,8 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
this.showSigningSuccess(team);
- // Zurück zum Allgemein-Tab springen
- this.activeSection = 'general';
+ // Intelligente Navigation nach Zertifizierung
+ this.navigateAfterCertification();
// TODO: Hier würden wir die signierte Aufstellung an das Backend senden
// await this.submitSignedLineup(team);
@@ -3354,7 +3501,7 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
font-style: italic;
}
-.result-content { margin-top: 20px; }
+.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 th, .result-table td { border-bottom: 1px solid #eee; padding: 8px; text-align: left; }
.result-table thead th { background: #f8f9fa; }
@@ -4413,18 +4560,93 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
/* Ergebniserfassungs-Header */
.result-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
margin-bottom: 20px;
}
.result-header h3 {
- margin: 0;
+ margin: 0 0 15px 0;
+}
+
+.time-display {
+ background-color: #f8f9fa;
+ border-radius: 6px;
+}
+
+.time-row {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 8px;
+}
+
+.time-row:last-child {
+ margin-bottom: 0;
+}
+
+.time-row strong {
+ min-width: 60px;
+ color: #495057;
+}
+
+.time-btn-small {
+ background-color: #28a745;
+ color: white;
+ border: none;
+ padding: 4px 8px;
+ border-radius: 4px;
+ font-size: 12px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.time-btn-small:hover:not(:disabled) {
+ background-color: #218838;
+}
+
+.time-btn-small:disabled {
+ background-color: #6c757d;
+ color: #fff;
+ cursor: not-allowed;
+}
+
+.result-controls {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 10px;
+ flex-wrap: wrap;
+}
+
+.time-btn {
+ background-color: #28a745;
+ color: white;
+ border: none;
+ padding: 8px 16px;
+ border-radius: 6px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ font-size: 13px;
+ display: flex;
+ align-items: center;
+ gap: 6px;
+}
+
+.time-btn:hover:not(:disabled) {
+ background-color: #218838;
+ transform: translateY(-1px);
+}
+
+.time-btn:disabled {
+ background: #e5e7eb;
+ color: #9ca3af;
+ cursor: not-allowed;
+ transform: none;
}
.autofill-btn {
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ background-color: #28a745;
color: white;
border: none;
padding: 12px 20px;
@@ -4436,13 +4658,13 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
gap: 8px;
transition: all 0.3s ease;
font-size: 14px;
- box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
+ box-shadow: 0 4px 12px rgba(40, 167, 69, 0.3);
}
.autofill-btn:hover:not(:disabled) {
- background: linear-gradient(135deg, #5a67d8 0%, #6b46c1 100%);
+ background-color: #218838;
transform: translateY(-2px);
- box-shadow: 0 6px 16px rgba(102, 126, 234, 0.4);
+ box-shadow: 0 6px 16px rgba(40, 167, 69, 0.4);
}
.autofill-btn:disabled {
@@ -4453,6 +4675,17 @@ Wir wünschen den Spielen einen schönen, spannenden und fairen Verlauf und begr
box-shadow: none;
}
+.autofill-section {
+ margin: 20px 0;
+ display: flex;
+ justify-content: center;
+}
+
+.endtime-section {
+ margin-top: 20px;
+ margin-bottom: 0;
+}
+
/* Completion warning auf Ergebniserfassungs-Seite */
.completion-warning {
display: flex;