From 1fdd6e6ec77f2e69ab14e26214ddc6b7ab130716 Mon Sep 17 00:00:00 2001 From: Luke Policinski Date: Sat, 19 Sep 2026 09:41:59 -0400 Subject: [PATCH 1/2] bug: fix active stage --- .../tournament/SimpleTournamentDisplay.vue | 13 ++++++++++- .../tournament/TournamentCompactCard.vue | 10 +++++++++ components/tournament/TournamentDetail.vue | 3 +++ .../tournament/TournamentFeatureCard.vue | 10 +++++++-- .../tournament/TournamentStageBuilder.vue | 18 +++++++++++++++ graphql/simpleTournamentFields.ts | 12 +++++++++- pages/teams/[id].vue | 5 ++++- utilities/tournamentCurrentStage.ts | 22 +++++++++++++++++++ 8 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 utilities/tournamentCurrentStage.ts diff --git a/components/tournament/SimpleTournamentDisplay.vue b/components/tournament/SimpleTournamentDisplay.vue index fba946ab9..fa4614077 100644 --- a/components/tournament/SimpleTournamentDisplay.vue +++ b/components/tournament/SimpleTournamentDisplay.vue @@ -66,7 +66,14 @@ import MapDisplay from "~/components/MapDisplay.vue"; variant="outline" class="text-xs bg-black/70 text-white border-white/30 backdrop-blur-sm" > - {{ stageCount }} {{ $t("tournament.stage.stages") }} + + import { generateQuery } from "~/graphql/graphqlGen"; import { tournamentPlayerRankLabel } from "~/utilities/tournamentPlayerRank"; +import { tournamentCurrentStage } from "~/utilities/tournamentCurrentStage"; export default { props: { @@ -149,6 +157,9 @@ export default { stageCount() { return this.tournament?.stages?.length || 0; }, + currentStage() { + return tournamentCurrentStage(this.tournament); + }, singleStageType() { if ( this.stageCount === 1 && diff --git a/components/tournament/TournamentCompactCard.vue b/components/tournament/TournamentCompactCard.vue index 75ec465c7..d65878455 100644 --- a/components/tournament/TournamentCompactCard.vue +++ b/components/tournament/TournamentCompactCard.vue @@ -3,6 +3,7 @@ import { computed } from "vue"; import { useI18n } from "vue-i18n"; import { CalendarClock, + GitBranch, RadioTower, TicketCheck, Trophy, @@ -13,6 +14,7 @@ import AwardBadge from "~/components/award/AwardBadge.vue"; import TournamentMapMosaic from "~/components/tournament/TournamentMapMosaic.vue"; import { tournamentMapPosters } from "~/utilities/tournamentMapPosters"; import { tournamentPlayerRankLabel } from "~/utilities/tournamentPlayerRank"; +import { tournamentCurrentStage } from "~/utilities/tournamentCurrentStage"; const { t } = useI18n(); @@ -150,6 +152,8 @@ const primaryStage = computed(() => { )[0]; }); +const currentStage = computed(() => tournamentCurrentStage(props.tournament)); + // When the tournament organizer disabled awards, fall back to plain // rank boxes (1ST / 2ND / 3RD) instead of the procedural award art. const awardsEnabled = computed( @@ -438,6 +442,12 @@ const runnerUps = computed(() => { {{ teamsCount }} {{ $t("tournament.compact_card.teams") }} + + + + {{ $t("tournament.stage.stage_tab", { stage: currentStage.order }) }} + + diff --git a/components/tournament/TournamentDetail.vue b/components/tournament/TournamentDetail.vue index 8916a8c2b..84c7d678e 100644 --- a/components/tournament/TournamentDetail.vue +++ b/components/tournament/TournamentDetail.vue @@ -1214,6 +1214,9 @@ export default { name: true, start: true, status: true, + // Cast: current_stage is a new computed field; drop it once + // `yarn codegen` has run against a migrated stack. + ...({ current_stage: true } as {}), auto_start: true, scheduling_mode: true, awards_enabled: true, diff --git a/components/tournament/TournamentFeatureCard.vue b/components/tournament/TournamentFeatureCard.vue index a0bab7a04..e6e1e817c 100644 --- a/components/tournament/TournamentFeatureCard.vue +++ b/components/tournament/TournamentFeatureCard.vue @@ -7,6 +7,7 @@ import TournamentMapMosaic from "~/components/tournament/TournamentMapMosaic.vue import { formatPrizePool } from "~/utilities/prizePool"; import { tournamentMapPosters } from "~/utilities/tournamentMapPosters"; import { tournamentPlayerRankLabel } from "~/utilities/tournamentPlayerRank"; +import { tournamentCurrentStage } from "~/utilities/tournamentCurrentStage"; type TournamentStatusVariant = "default" | "finished" | "live" | "registration"; @@ -83,8 +84,10 @@ const primaryStage = computed(() => { )[0]; }); +const currentStage = computed(() => tournamentCurrentStage(props.tournament)); + const stageLabel = computed(() => { - const stage = primaryStage.value; + const stage = currentStage.value ?? primaryStage.value; const stageType = stage?.e_tournament_stage_type?.description || stage?.type || @@ -93,7 +96,10 @@ const stageLabel = computed(() => { stage?.options?.best_of || stage?.default_best_of || props.tournament?.options?.best_of; - return bestOf ? `${stageType} · BO${bestOf}` : stageType; + const label = bestOf ? `${stageType} · BO${bestOf}` : stageType; + return currentStage.value + ? `${t("tournament.stage.stage_tab", { stage: stage.order })} · ${label}` + : label; }); const playerRankLabel = computed(() => diff --git a/components/tournament/TournamentStageBuilder.vue b/components/tournament/TournamentStageBuilder.vue index de40affbc..ac4e6064e 100644 --- a/components/tournament/TournamentStageBuilder.vue +++ b/components/tournament/TournamentStageBuilder.vue @@ -118,6 +118,7 @@ import { v-if="shouldShowTabs" v-model="activeTab" default-value="stage-1" + @update:model-value="stagePicked = true" class="w-full" >