diff --git a/app/features/tournament-bracket/core/Tournament.ts b/app/features/tournament-bracket/core/Tournament.ts index 090619eb1..add416886 100644 --- a/app/features/tournament-bracket/core/Tournament.ts +++ b/app/features/tournament-bracket/core/Tournament.ts @@ -18,11 +18,15 @@ import invariant from "~/utils/invariant"; import { logger } from "~/utils/logger"; import { assertUnreachable } from "~/utils/types"; import { userSubmittedImage } from "~/utils/urls"; -import { fillWithNullTillPowerOfTwo } from "../tournament-bracket-utils"; +import { + fillWithNullTillPowerOfTwo, + groupNumberToLetter, +} from "../tournament-bracket-utils"; import { Bracket } from "./Bracket"; import * as Swiss from "./Swiss"; import type { TournamentData, TournamentDataTeam } from "./Tournament.server"; import { getTournamentManager } from "./brackets-manager"; +import { getRounds } from "./rounds"; export type OptionalIdObject = { id: number } | undefined; @@ -767,6 +771,102 @@ export class Tournament { return this.ctx.settings.autonomousSubs ?? true; } + matchNameById(matchId: number) { + let bracketName: string | undefined; + let roundName: string | undefined; + + for (const bracket of this.brackets) { + if (bracket.preview) continue; + + for (const match of bracket.data.match) { + if (match.id === matchId) { + bracketName = bracket.name; + + if (bracket.type === "round_robin") { + const group = bracket.data.group.find( + (group) => group.id === match.group_id, + ); + const round = bracket.data.round.find( + (round) => round.id === match.round_id, + ); + + roundName = `Groups ${group?.number ? groupNumberToLetter(group.number) : ""}${round?.number ?? ""}.${match.number}`; + } else if (bracket.type === "swiss") { + const group = bracket.data.group.find( + (group) => group.id === match.group_id, + ); + const round = bracket.data.round.find( + (round) => round.id === match.round_id, + ); + + const oneGroupOnly = bracket.data.group.length === 1; + + roundName = `Swiss${oneGroupOnly ? "" : " Group"} ${group?.number && !oneGroupOnly ? groupNumberToLetter(group.number) : ""} ${round?.number ?? ""}.${match.number}`; + } else if ( + bracket.type === "single_elimination" || + bracket.type === "double_elimination" + ) { + const rounds = + bracket.type === "single_elimination" + ? getRounds({ type: "single", bracket }) + : [ + ...getRounds({ type: "winners", bracket }), + ...getRounds({ type: "losers", bracket }), + ]; + + const round = rounds.find((round) => round.id === match.round_id); + + if (round) { + const specifier = () => { + if ( + [ + "WB Finals", + "Grand Finals", + "Bracket Reset", + "Finals", + "LB Finals", + "LB Semis", + "3rd place match", + ].includes(round.name) + ) { + return ""; + } + + const roundNameEndsInDigit = /\d$/.test(round.name); + + if (!roundNameEndsInDigit) { + return ` ${match.number}`; + } + + return `.${match.number}`; + }; + roundName = `${round.name}${specifier()}`; + } + } else { + assertUnreachable(bracket.type); + } + } + } + } + + const roundNameWithoutMatchIdentifier = (roundName?: string) => { + if (!roundName) return; + + if (roundName.includes("Semis")) { + return roundName.replace(/\d/g, ""); + } + + return roundName.split(".")[0]; + }; + + return { + bracketName, + roundName, + roundNameWithoutMatchIdentifier: + roundNameWithoutMatchIdentifier(roundName), + }; + } + bracketByIdxOrDefault(idx: number): Bracket { const bracket = this.brackets[idx]; if (bracket) return bracket; diff --git a/app/features/tournament/routes/to.$id.teams.$tid.tsx b/app/features/tournament/routes/to.$id.teams.$tid.tsx index 64a2f4b5c..0d739745d 100644 --- a/app/features/tournament/routes/to.$id.teams.$tid.tsx +++ b/app/features/tournament/routes/to.$id.teams.$tid.tsx @@ -24,7 +24,6 @@ import { } from "../core/sets.server"; import { tournamentIdFromParams, - tournamentRoundI18nKey, tournamentTeamIdFromParams, } from "../tournament-utils"; import { useTournament } from "./to.$id"; @@ -192,6 +191,9 @@ function SetInfo({ set, team }: { set: PlayedSet; team: TournamentDataTeam }) { } }; + const { bracketName, roundNameWithoutMatchIdentifier } = + tournament.matchNameById(set.tournamentMatchId); + return (
@@ -205,10 +207,7 @@ function SetInfo({ set, team }: { set: PlayedSet; team: TournamentDataTeam }) { })} className="tournament__team__set__round-name" > - {t(`tournament:${tournamentRoundI18nKey(set.round)}`, { - round: set.round.round, - })}{" "} - - {set.stageName} + {roundNameWithoutMatchIdentifier} - {bracketName}
diff --git a/app/features/tournament/tournament.css b/app/features/tournament/tournament.css index 5c9e967d3..e54c2b6e3 100644 --- a/app/features/tournament/tournament.css +++ b/app/features/tournament/tournament.css @@ -521,6 +521,7 @@ .tournament__team__set__score { font-size: var(--fonts-xl); font-weight: var(--bold); + white-space: nowrap; } .tournament__team__set__round-name { diff --git a/locales/en/tournament.json b/locales/en/tournament.json index 8cf0d00d6..f02a542d2 100644 --- a/locales/en/tournament.json +++ b/locales/en/tournament.json @@ -82,17 +82,6 @@ "staff.role.ORGANIZER": "organizer", "staff.role.STREAMER": "streamer", - "bracket.winners": "Winners Round {{round}}", - "bracket.winners.finals": "Winners Finals", - "bracket.losers": "Losers Round {{round}}", - "bracket.losers.finals": "Losers Finals", - "bracket.single_elim": "Round {{round}}", - "bracket.round_robin": "Groups Round {{round}}", - "bracket.swiss": "Swiss Round {{round}}", - "bracket.single_elim.finals": "Finals", - "bracket.grand_finals": "Grand Finals", - "bracket.grand_finals.bracket_reset": "Bracket Reset", - "actions.addSub": "Add sub", "actions.shareLink": "Share your invite link to add members: {{inviteLink}}", "actions.sub.prompt_other": "You can still add {{count}} subs to your roster", diff --git a/locales/es-ES/tournament.json b/locales/es-ES/tournament.json index e9ad343be..ff8a921fc 100644 --- a/locales/es-ES/tournament.json +++ b/locales/es-ES/tournament.json @@ -80,17 +80,6 @@ "staff.role.ORGANIZER": "organizador", "staff.role.STREAMER": "streamer", - "bracket.winners": "Cuadro de ganadores {{round}}", - "bracket.winners.finals": "Final de ganadores", - "bracket.losers": "Cuadro de perdedores {{round}}", - "bracket.losers.finals": "Final de perdedores", - "bracket.single_elim": "Cuadro {{round}}", - "bracket.round_robin": "Cuadro de grupos {{round}}", - "bracket.swiss": "Cuadro Suizo {{round}}", - "bracket.single_elim.finals": "Final", - "bracket.grand_finals": "Gran Final", - "bracket.grand_finals.bracket_reset": "Reinicio de cuadro", - "actions.addSub": "Añadir sub", "actions.shareLink": "Comparte enlace de invitación para añadir miembros: {{inviteLink}}", "actions.sub.prompt_other": "Aún puedes añadir {{count}} subs a tu equipo", diff --git a/locales/es-US/tournament.json b/locales/es-US/tournament.json index e9ad343be..ff8a921fc 100644 --- a/locales/es-US/tournament.json +++ b/locales/es-US/tournament.json @@ -80,17 +80,6 @@ "staff.role.ORGANIZER": "organizador", "staff.role.STREAMER": "streamer", - "bracket.winners": "Cuadro de ganadores {{round}}", - "bracket.winners.finals": "Final de ganadores", - "bracket.losers": "Cuadro de perdedores {{round}}", - "bracket.losers.finals": "Final de perdedores", - "bracket.single_elim": "Cuadro {{round}}", - "bracket.round_robin": "Cuadro de grupos {{round}}", - "bracket.swiss": "Cuadro Suizo {{round}}", - "bracket.single_elim.finals": "Final", - "bracket.grand_finals": "Gran Final", - "bracket.grand_finals.bracket_reset": "Reinicio de cuadro", - "actions.addSub": "Añadir sub", "actions.shareLink": "Comparte enlace de invitación para añadir miembros: {{inviteLink}}", "actions.sub.prompt_other": "Aún puedes añadir {{count}} subs a tu equipo", diff --git a/locales/fr-CA/tournament.json b/locales/fr-CA/tournament.json index 6c38a425a..d635df00a 100644 --- a/locales/fr-CA/tournament.json +++ b/locales/fr-CA/tournament.json @@ -68,15 +68,6 @@ "admin.actions.REMOVE_MEMBER": "Retirer membre", "admin.actions.DELETE_TEAM": "Effacer l'équipe", - "bracket.winners": "Manche des gagnants {{round}}", - "bracket.winners.finals": "Finale des gagnants", - "bracket.losers": "Manche des perdants {{round}}", - "bracket.losers.finals": "Finale des perdants", - "bracket.single_elim": "Manche {{round}}", - "bracket.single_elim.finals": "Finale", - "bracket.grand_finals": "Grande Finale", - "bracket.grand_finals.bracket_reset": "Bracket Reset", - "actions.addSub": "Ajouter remplaçant", "actions.shareLink": "Partagez votre lien d'invitation pour ajouter des membres: {{inviteLink}}", "actions.sub.prompt_other": "Vous pouvez encore ajouter {{count}} remplaçants à votre liste", diff --git a/locales/fr-EU/tournament.json b/locales/fr-EU/tournament.json index 6c38a425a..d635df00a 100644 --- a/locales/fr-EU/tournament.json +++ b/locales/fr-EU/tournament.json @@ -68,15 +68,6 @@ "admin.actions.REMOVE_MEMBER": "Retirer membre", "admin.actions.DELETE_TEAM": "Effacer l'équipe", - "bracket.winners": "Manche des gagnants {{round}}", - "bracket.winners.finals": "Finale des gagnants", - "bracket.losers": "Manche des perdants {{round}}", - "bracket.losers.finals": "Finale des perdants", - "bracket.single_elim": "Manche {{round}}", - "bracket.single_elim.finals": "Finale", - "bracket.grand_finals": "Grande Finale", - "bracket.grand_finals.bracket_reset": "Bracket Reset", - "actions.addSub": "Ajouter remplaçant", "actions.shareLink": "Partagez votre lien d'invitation pour ajouter des membres: {{inviteLink}}", "actions.sub.prompt_other": "Vous pouvez encore ajouter {{count}} remplaçants à votre liste", diff --git a/locales/he/tournament.json b/locales/he/tournament.json index 6915ae263..f281760a0 100644 --- a/locales/he/tournament.json +++ b/locales/he/tournament.json @@ -69,15 +69,6 @@ "admin.actions.REMOVE_MEMBER": "הורדת חבר צוות", "admin.actions.DELETE_TEAM": "מחיקת צוות", - "bracket.winners": "סיבוב מנצחים {{round}}", - "bracket.winners.finals": "גמר המנצחים", - "bracket.losers": "סיבוב מפסידים {{round}}", - "bracket.losers.finals": "גמר מפסידים", - "bracket.single_elim": "סיבוב {{round}}", - "bracket.single_elim.finals": "גמר", - "bracket.grand_finals": "הגמר הגדול", - "bracket.grand_finals.bracket_reset": "מערך אופס", - "actions.addSub": "הוסיפו ממלא מקום", "actions.shareLink": "שתפו קישור הזמנה להוספת חברי צוות: {{inviteLink}}", "actions.sub.prompt_other": "אתם עדיין יכולים להוסיף {{count}} ממלאי מקום לצוות שלכם", diff --git a/locales/ja/tournament.json b/locales/ja/tournament.json index 9bea84fc1..c1bd2762b 100644 --- a/locales/ja/tournament.json +++ b/locales/ja/tournament.json @@ -81,17 +81,6 @@ "staff.role.ORGANIZER": "主催者", "staff.role.STREAMER": "配信者", - "bracket.winners": "ウィナーズ・ラウンド {{round}}", - "bracket.winners.finals": "ウィナーズ・ファイナル", - "bracket.losers": "ルーザーズ・ラウンド {{round}}", - "bracket.losers.finals": "ルーザーズ・ファイナル", - "bracket.single_elim": "ラウンド {{round}}", - "bracket.round_robin": "ラウンドロビン {{round}}", - "bracket.swiss": "スイスラウンド {{round}}", - "bracket.single_elim.finals": "ファイナル", - "bracket.grand_finals": "グランド・ファイナル", - "bracket.grand_finals.bracket_reset": "ブラケットをリセット", - "actions.addSub": "サブを追加", "actions.shareLink": "メンバー招待リンクをシェアする: {{inviteLink}}", "actions.sub.prompt_other": "あと {{count}} 人のサブをメンバーに追加できます", diff --git a/locales/pt-BR/tournament.json b/locales/pt-BR/tournament.json index 70b0eec33..1b05f59ec 100644 --- a/locales/pt-BR/tournament.json +++ b/locales/pt-BR/tournament.json @@ -80,17 +80,6 @@ "staff.role.ORGANIZER": "organizador(a)", "staff.role.STREAMER": "streamer", - "bracket.winners": "Round dos Vencedores {{round}}", - "bracket.winners.finals": "Finais dos Vencedores", - "bracket.losers": "Round dos Perdedores {{round}}", - "bracket.losers.finals": "Finais dos Perdedores", - "bracket.single_elim": "Round {{round}}", - "bracket.round_robin": "Round de Grupos {{round}}", - "bracket.swiss": "Round Suíço {{round}}", - "bracket.single_elim.finals": "Finais", - "bracket.grand_finals": "Grandes Finais", - "bracket.grand_finals.bracket_reset": "Reset do Bracket", - "actions.addSub": "Adicionar substituto(a)", "actions.shareLink": "Compartilhe seu link de convite para adicionar membros: {{inviteLink}}", "actions.sub.prompt_other": "Você ainda pode adicionar {{count}} substitutos(as) à sua lista", diff --git a/locales/zh/tournament.json b/locales/zh/tournament.json index 4041834e5..bb3df59ed 100644 --- a/locales/zh/tournament.json +++ b/locales/zh/tournament.json @@ -69,15 +69,6 @@ "admin.actions.REMOVE_MEMBER": "移除成员", "admin.actions.DELETE_TEAM": "删除队伍", - "bracket.winners": "胜者组 Round {{round}}", - "bracket.winners.finals": "胜者组决赛", - "bracket.losers": "败者组 Round {{round}}", - "bracket.losers.finals": "败者组决赛", - "bracket.single_elim": "单败制 Round {{round}}", - "bracket.single_elim.finals": "单败制决赛", - "bracket.grand_finals": "总决赛", - "bracket.grand_finals.bracket_reset": "加赛", - "actions.addSub": "添加替补", "actions.shareLink": "分享您的邀请链接以添加成员: {{inviteLink}}", "actions.sub.prompt_other": "您还可以添加 {{count}} 名替补",