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[] {