diff --git a/src/app/pages/tournaments/tournaments.component.css b/src/app/pages/tournaments/tournaments.component.css
index e102bd0..aac96e8 100644
--- a/src/app/pages/tournaments/tournaments.component.css
+++ b/src/app/pages/tournaments/tournaments.component.css
@@ -340,6 +340,13 @@
}
.pairing-ongoing svg { animation: pulse 1.4s ease-in-out infinite; }
+.pairing-review {
+ font-size: 10px; font-weight: 700; letter-spacing: 0.06em;
+ text-transform: uppercase; color: var(--nc-neon);
+ opacity: 0; transition: opacity 0.15s;
+}
+.pairing-row.is-watchable:hover .pairing-review { opacity: 1; }
+
/* Official bot join section */
.join-divider {
display: flex; align-items: center; gap: 10px;
diff --git a/src/app/pages/tournaments/tournaments.component.html b/src/app/pages/tournaments/tournaments.component.html
index d19b08a..e7bb974 100644
--- a/src/app/pages/tournaments/tournaments.component.html
+++ b/src/app/pages/tournaments/tournaments.component.html
@@ -186,6 +186,35 @@
}
+
+ @if (previousRoundsLoading) {
+
Loading previous rounds…
+ }
+ @for (rp of previousRoundPairings; track rp.round) {
+
+ Round {{ rp.round }} pairings
+
+ @for (p of rp.pairings; track pairingKey(p)) {
+ @let gid = firstGameId(p);
+
+ {{ p.white?.name ?? 'Bye' }}
+ vs
+ {{ p.black.name }}
+ @if (p.winner) {
+
+ {{ p.winner === 'draw' ? '½–½' : p.winner === 'white' ? '1–0' : '0–1' }}
+
+ }
+ @if (gid) {
+ Review
+ }
+
+ }
+
+
+ }
+
}
diff --git a/src/app/pages/tournaments/tournaments.component.ts b/src/app/pages/tournaments/tournaments.component.ts
index ebf0283..a22f02f 100644
--- a/src/app/pages/tournaments/tournaments.component.ts
+++ b/src/app/pages/tournaments/tournaments.component.ts
@@ -44,6 +44,8 @@ export class TournamentsComponent implements OnInit {
selectedTournament: Tournament | null = null;
pairings: RoundPairings | null = null;
pairingsLoading = false;
+ previousRoundPairings: RoundPairings[] = [];
+ previousRoundsLoading = false;
showCreateDialog = false;
createForm: FormGroup = this.fb.group({
@@ -116,19 +118,35 @@ export class TournamentsComponent implements OnInit {
this.tab = tab;
this.selectedTournament = null;
this.pairings = null;
+ this.previousRoundPairings = [];
}
selectTournament(t: Tournament): void {
if (this.selectedTournament?.id === t.id) {
this.selectedTournament = null;
this.pairings = null;
+ this.previousRoundPairings = [];
return;
}
this.selectedTournament = t;
this.pairings = null;
+ this.previousRoundPairings = [];
if (t.round > 0) {
this.loadPairings(t.id, t.round);
}
+ if (t.round > 1) {
+ this.previousRoundsLoading = true;
+ const rounds = Array.from({ length: t.round - 1 }, (_, i) => i + 1);
+ forkJoin(rounds.map(r => this.tournamentService.roundPairings(t.id, r)))
+ .pipe(takeUntilDestroyed(this.destroyRef))
+ .subscribe({
+ next: results => {
+ this.previousRoundPairings = [...results].reverse();
+ this.previousRoundsLoading = false;
+ },
+ error: () => { this.previousRoundsLoading = false; }
+ });
+ }
}
get activeList(): Tournament[] {