From ca4b3cb7d854281d1842ec3531e73ff0cefc9b8e Mon Sep 17 00:00:00 2001
From: Kalle <38327916+Sendouc@users.noreply.github.com>
Date: Mon, 1 Jul 2024 10:15:56 +0300
Subject: [PATCH] Fix round names on tournament team page Closes #1796
---
.../tournament-bracket/core/Tournament.ts | 102 +++++++++++++++++-
.../tournament/routes/to.$id.teams.$tid.tsx | 9 +-
app/features/tournament/tournament.css | 1 +
locales/en/tournament.json | 11 --
locales/es-ES/tournament.json | 11 --
locales/es-US/tournament.json | 11 --
locales/fr-CA/tournament.json | 9 --
locales/fr-EU/tournament.json | 9 --
locales/he/tournament.json | 9 --
locales/ja/tournament.json | 11 --
locales/pt-BR/tournament.json | 11 --
locales/zh/tournament.json | 9 --
12 files changed, 106 insertions(+), 97 deletions(-)
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}} 名替补",