Hide teams on the league sign up page after divisions have been created
Some checks are pending
E2E Tests / e2e (push) Waiting to run
Tests and checks on push / run-checks-and-tests (push) Waiting to run
Updates translation progress / update-translation-progress-issue (push) Waiting to run

Closes #2851
This commit is contained in:
Kalle
2026-03-23 22:00:23 +02:00
parent f417cd2e69
commit 574c1300e9
4 changed files with 47 additions and 10 deletions

View File

@@ -316,6 +316,17 @@ export async function findById(id: number) {
};
}
export async function hasChildTournaments(parentTournamentId: number) {
const row = await db
.selectFrom("Tournament")
.select("Tournament.id")
.where("Tournament.parentTournamentId", "=", parentTournamentId)
.limit(1)
.executeTakeFirst();
return Boolean(row);
}
export async function findChildTournaments(parentTournamentId: number) {
const rows = await db
.selectFrom("Tournament")

View File

@@ -1,6 +1,7 @@
import type { LoaderFunctionArgs } from "react-router";
import { getUser } from "~/features/auth/core/user.server";
import * as TournamentRepository from "~/features/tournament/TournamentRepository.server";
import { LEAGUES } from "~/features/tournament/tournament-constants";
import { tournamentDataCached } from "~/features/tournament-bracket/core/Tournament.server";
import { databaseTimestampToDate } from "~/utils/dates";
import { parseParams } from "~/utils/remix.server";
@@ -10,6 +11,7 @@ export type TournamentLoaderData = {
tournament: Awaited<ReturnType<typeof tournamentDataCached>>;
streamingParticipants: number[];
streamsCount: number;
hasChildTournaments: boolean;
friendCodes:
| Awaited<ReturnType<typeof TournamentRepository.friendCodesByTournamentId>>
| undefined;
@@ -53,9 +55,17 @@ export const loader = async ({ params }: LoaderFunctionArgs) => {
const showFriendCodes = tournamentStartedInTheLastMonth && isTournamentAdmin;
const isLeagueSignup = Object.values(LEAGUES)
.flat()
.some((entry) => entry.tournamentId === tournamentId);
const hasChildTournaments = isLeagueSignup
? await TournamentRepository.hasChildTournaments(tournamentId)
: false;
// skip expensive rr7 data serialization (hot path loader)
return JSON.stringify({
tournament,
hasChildTournaments,
friendCodes: showFriendCodes
? await TournamentRepository.friendCodesByTournamentId(tournamentId)
: undefined,

View File

@@ -1,10 +1,16 @@
import { tournamentTeamPage } from "~/utils/urls";
import { Redirect } from "~/components/Redirect";
import { tournamentDivisionsPage, tournamentTeamPage } from "~/utils/urls";
import { TeamWithRoster } from "../components/TeamWithRoster";
import { getBracketProgressionLabel } from "../tournament-utils";
import { useTournament } from "./to.$id";
import { useHasChildTournaments, useTournament } from "./to.$id";
export default function TournamentTeamsPage() {
const tournament = useTournament();
const hasChildTournaments = useHasChildTournaments();
if (tournament.isLeagueSignup && hasChildTournaments) {
return <Redirect to={tournamentDivisionsPage(tournament.ctx.id)} />;
}
const perBracketSeedCounters = new Map<number, number>();
const teamSeedInfo = tournament.ctx.teams.map((team, globalIndex) => {

View File

@@ -156,14 +156,18 @@ export function TournamentLayout() {
Divisions
</SubNavLink>
) : null}
<SubNavLink
to="teams"
end={false}
prefetch="render"
data-testid="teams-tab"
>
{t("tournament:tabs.teams", { count: tournament.ctx.teams.length })}
</SubNavLink>
{!(tournament.isLeagueSignup && data.hasChildTournaments) ? (
<SubNavLink
to="teams"
end={false}
prefetch="render"
data-testid="teams-tab"
>
{t("tournament:tabs.teams", {
count: tournament.ctx.teams.length,
})}
</SubNavLink>
) : null}
{!tournament.isInvitational &&
!tournament.everyBracketOver &&
!(tournament.isLeagueSignup && !tournament.registrationOpen) &&
@@ -206,6 +210,7 @@ export function TournamentLayout() {
tournament,
bracketExpanded,
setBracketExpanded,
hasChildTournaments: data.hasChildTournaments,
friendCodes: data.friendCodes,
preparedMaps: data.preparedMaps,
} satisfies TournamentContext
@@ -220,6 +225,7 @@ type TournamentContext = {
tournament: Tournament;
bracketExpanded: boolean;
setBracketExpanded: (expanded: boolean) => void;
hasChildTournaments: boolean;
friendCode?: string;
friendCodes?: TournamentLoaderData["friendCodes"];
preparedMaps: TournamentLoaderData["preparedMaps"];
@@ -236,6 +242,10 @@ export function useBracketExpanded() {
return { bracketExpanded, setBracketExpanded };
}
export function useHasChildTournaments() {
return useOutletContext<TournamentContext>().hasChildTournaments;
}
export function useTournamentFriendCodes() {
return useOutletContext<TournamentContext>().friendCodes;
}