diff --git a/app/features/tournament/TournamentRepository.server.ts b/app/features/tournament/TournamentRepository.server.ts
index 9cd9c889a..fc48d4295 100644
--- a/app/features/tournament/TournamentRepository.server.ts
+++ b/app/features/tournament/TournamentRepository.server.ts
@@ -335,6 +335,22 @@ export function checkOut({
return query.execute();
}
+export function updateTeamName({
+ tournamentTeamId,
+ name,
+}: {
+ tournamentTeamId: number;
+ name: string;
+}) {
+ return db
+ .updateTable("TournamentTeam")
+ .set({
+ name,
+ })
+ .where("id", "=", tournamentTeamId)
+ .execute();
+}
+
export function addStaff({
tournamentId,
userId,
diff --git a/app/features/tournament/routes/to.$id.admin.tsx b/app/features/tournament/routes/to.$id.admin.tsx
index 146869382..b8fbdba4e 100644
--- a/app/features/tournament/routes/to.$id.admin.tsx
+++ b/app/features/tournament/routes/to.$id.admin.tsx
@@ -101,6 +101,21 @@ export const action: ActionFunction = async ({ request, params }) => {
break;
}
+ case "CHANGE_TEAM_NAME": {
+ validateIsTournamentOrganizer();
+ validate(
+ tournament.ctx.inProgressBrackets.length === 0,
+ "Tournament started",
+ );
+ const team = tournament.teamById(data.teamId);
+ validate(team, "Invalid team id");
+
+ await TournamentRepository.updateTeamName({
+ tournamentTeamId: data.teamId,
+ name: data.teamName,
+ });
+ break;
+ }
case "CHECK_IN": {
validateIsTournamentOrganizer();
const team = tournament.teamById(data.teamId);
@@ -331,6 +346,11 @@ const actions = [
inputs: ["USER", "TEAM_NAME"] as Input[],
when: ["TOURNAMENT_BEFORE_START"],
},
+ {
+ type: "CHANGE_TEAM_NAME",
+ inputs: ["REGISTERED_TEAM", "TEAM_NAME"] as Input[],
+ when: ["TOURNAMENT_BEFORE_START"],
+ },
{
type: "CHANGE_TEAM_OWNER",
inputs: ["ROSTER_MEMBER", "REGISTERED_TEAM"] as Input[],
@@ -445,7 +465,7 @@ function TeamActions() {
) : null}
{selectedAction.inputs.includes("TEAM_NAME") ? (
-
+
) : null}
diff --git a/app/features/tournament/tournament-schemas.server.ts b/app/features/tournament/tournament-schemas.server.ts
index af3303b35..ff7ffabf6 100644
--- a/app/features/tournament/tournament-schemas.server.ts
+++ b/app/features/tournament/tournament-schemas.server.ts
@@ -10,10 +10,12 @@ import {
import { TOURNAMENT } from "./tournament-constants";
import { bracketIdx } from "../tournament-bracket/tournament-bracket-schemas.server";
+const teamName = z.string().trim().min(1).max(TOURNAMENT.TEAM_NAME_MAX_LENGTH);
+
export const registerSchema = z.union([
z.object({
_action: _action("UPSERT_TEAM"),
- teamName: z.string().min(1).max(TOURNAMENT.TEAM_NAME_MAX_LENGTH),
+ teamName,
prefersNotToHost: z.preprocess(checkboxValueToBoolean, z.boolean()),
noScreen: z.preprocess(checkboxValueToBoolean, z.boolean()),
}),
@@ -54,6 +56,11 @@ export const adminActionSchema = z.union([
teamId: id,
memberId: id,
}),
+ z.object({
+ _action: _action("CHANGE_TEAM_NAME"),
+ teamId: id,
+ teamName,
+ }),
z.object({
_action: _action("CHECK_IN"),
teamId: id,
@@ -81,7 +88,7 @@ export const adminActionSchema = z.union([
z.object({
_action: _action("ADD_TEAM"),
userId: id,
- teamName: z.string().min(1).max(TOURNAMENT.TEAM_NAME_MAX_LENGTH),
+ teamName,
}),
z.object({
_action: _action("ADD_STAFF"),
diff --git a/e2e/tournament.spec.ts b/e2e/tournament.spec.ts
index 37eb40129..ab46c734c 100644
--- a/e2e/tournament.spec.ts
+++ b/e2e/tournament.spec.ts
@@ -116,9 +116,22 @@ test.describe("Tournament", () => {
await page.getByTestId("admin-tab").click();
const actionSelect = page.getByLabel("Action");
- const teamSelect = page.getByLabel("Team");
+ const teamSelect = page.getByLabel("Team", { exact: true });
const memberSelect = page.getByLabel("Member");
+ // Change team name
+ {
+ await actionSelect.selectOption("CHANGE_TEAM_NAME");
+ await teamSelect.selectOption("1");
+ await page.getByLabel("Team name").fill("NSTC");
+ await submit(page);
+
+ const data = await fetchTournamentLoaderData();
+ const firstTeam = data.tournament.ctx.teams.find((t) => t.id === 1);
+ invariant(firstTeam, "First team not found");
+ expect(firstTeam.name).toBe("NSTC");
+ }
+
// Change team owner
let data = await fetchTournamentLoaderData();
expect(getIsOwnerOfUser({ data, userId: ADMIN_ID, teamId: 1 })).toBe(1);
diff --git a/locales/en/tournament.json b/locales/en/tournament.json
index 275bb0da3..167481641 100644
--- a/locales/en/tournament.json
+++ b/locales/en/tournament.json
@@ -67,6 +67,7 @@
"admin.download": "Download participants",
"admin.actions.CHANGE_TEAM_OWNER": "Change captain",
+ "admin.actions.CHANGE_TEAM_NAME": "Change team name",
"admin.actions.CHECK_IN": "Check in",
"admin.actions.CHECK_OUT": "Check out",
"admin.actions.ADD_MEMBER": "Add member",