From 52cf70f9aebe6db01b37a3ecc10dbc174615f721 Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Sun, 22 Dec 2024 12:55:35 +0200 Subject: [PATCH] Many starting brackets (#1992) * Initial * Fixes * Fix types * Unit tests * Clarify which discord * progression selector tweaks * Adjust input UI * Done --- app/db/tables.ts | 2 + .../calendar/CalendarRepository.server.ts | 13 ++ .../components/BracketProgressionSelector.tsx | 26 +++- .../core/Progression.test.ts | 15 -- .../tournament-bracket/core/Progression.ts | 12 -- .../core/Tournament.test.ts | 46 ++++++ .../tournament-bracket/core/Tournament.ts | 47 +++++- .../core/summarizer.test.ts | 1 + .../tournament-bracket/core/tests/mocks-li.ts | 86 ++++++++++ .../core/tests/mocks-sos.ts | 52 +++++++ .../tournament-bracket/core/tests/mocks.ts | 104 +++++++++++++ .../core/tests/test-utils.ts | 3 +- .../routes/to.$id.brackets.tsx | 21 ++- .../tournament/TournamentRepository.server.ts | 9 ++ .../TournamentTeamRepository.server.ts | 28 ++++ .../tournament/routes/to.$id.register.tsx | 10 +- .../tournament/routes/to.$id.seeds.tsx | 147 +++++++++++++++++- .../tournament/tournament-schemas.server.ts | 22 ++- docs/tournament-creation.md | 5 +- e2e/tournament-bracket.spec.ts | 45 ++++++ migrations/077-starting-bracket-idx.js | 7 + public/static-assets/img/sq-header/1.avif | Bin 0 -> 4712 bytes public/static-assets/img/sq-header/1.png | Bin 0 -> 71750 bytes tsconfig.json | 2 +- 24 files changed, 652 insertions(+), 51 deletions(-) create mode 100644 migrations/077-starting-bracket-idx.js create mode 100644 public/static-assets/img/sq-header/1.avif create mode 100644 public/static-assets/img/sq-header/1.png diff --git a/app/db/tables.ts b/app/db/tables.ts index 2d3e9b4c4..8e523c2b0 100644 --- a/app/db/tables.ts +++ b/app/db/tables.ts @@ -622,6 +622,8 @@ export interface TournamentTeam { noScreen: Generated; droppedOut: Generated; seed: number | null; + /** For formats that have many starting brackets, where should the team start? */ + startingBracketIdx: number | null; activeRosterUserIds: ColumnType< number[] | null, string | null, diff --git a/app/features/calendar/CalendarRepository.server.ts b/app/features/calendar/CalendarRepository.server.ts index aed9bb941..f4dc98712 100644 --- a/app/features/calendar/CalendarRepository.server.ts +++ b/app/features/calendar/CalendarRepository.server.ts @@ -695,6 +695,19 @@ export async function update(args: UpdateArgs) { .returning("mapPickingStyle") .executeTakeFirstOrThrow(); + if ( + Progression.changedBracketProgressionFormat( + existingBracketProgression, + args.bracketProgression, + ) + ) { + await trx + .updateTable("TournamentTeam") + .set({ startingBracketIdx: null }) + .where("tournamentId", "=", tournamentId) + .execute(); + } + mapPickingStyle = _mapPickingStyle; } diff --git a/app/features/calendar/components/BracketProgressionSelector.tsx b/app/features/calendar/components/BracketProgressionSelector.tsx index 2a77c2e3f..8b86c5250 100644 --- a/app/features/calendar/components/BracketProgressionSelector.tsx +++ b/app/features/calendar/components/BracketProgressionSelector.tsx @@ -181,7 +181,7 @@ function TournamentFormatBracketSelector({ /> - {!isFirstBracket ? ( + {bracket.sources ? (
) : null} - {!isFirstBracket ? ( + {bracket.sources ? (
{" "}
- {isFirstBracket ? ( + {!isFirstBracket ? ( +
+ + updateBracket({ + sources: checked ? [] : undefined, + requiresCheckIn: false, + startTime: undefined, + }) + } + disabled={bracket.disabled} + /> + +
+ ) : null} + {!bracket.sources ? ( {isInvitationalTournament ? ( <>Participants added by the organizer diff --git a/app/features/tournament-bracket/core/Progression.test.ts b/app/features/tournament-bracket/core/Progression.test.ts index f08c453ae..6c6f48f70 100644 --- a/app/features/tournament-bracket/core/Progression.test.ts +++ b/app/features/tournament-bracket/core/Progression.test.ts @@ -419,21 +419,6 @@ describe("validatedSources - other rules", () => { expect(error.type).toBe("NO_DE_POSITIVE"); expect((error as any).bracketIdx).toEqual(1); }); - - it("throws an error if many missing sources", () => { - expect(() => - getValidatedBrackets([ - { - settings: {}, - type: "round_robin", - }, - { - settings: {}, - type: "single_elimination", - }, - ]), - ).toThrow(); - }); }); describe("isFinals", () => { diff --git a/app/features/tournament-bracket/core/Progression.ts b/app/features/tournament-bracket/core/Progression.ts index 8990134ab..f4a5ecde2 100644 --- a/app/features/tournament-bracket/core/Progression.ts +++ b/app/features/tournament-bracket/core/Progression.ts @@ -173,8 +173,6 @@ export function validatedBrackets( throw e; } - validateOnlyOneEntry(parsed); - const validationError = bracketsToValidationError(parsed); if (validationError) { @@ -184,16 +182,6 @@ export function validatedBrackets( return parsed; } -function validateOnlyOneEntry(brackets: ParsedBracket[]) { - const entryBracketCount = brackets.filter( - (bracket) => !bracket.sources, - ).length; - - if (entryBracketCount !== 1) { - throw new Error("Only one bracket can have no sources"); - } -} - /** Checks parsed brackets for any errors related to how the progression is laid out */ export function bracketsToValidationError( brackets: ParsedBracket[], diff --git a/app/features/tournament-bracket/core/Tournament.test.ts b/app/features/tournament-bracket/core/Tournament.test.ts index bcf8f7453..80358395e 100644 --- a/app/features/tournament-bracket/core/Tournament.test.ts +++ b/app/features/tournament-bracket/core/Tournament.test.ts @@ -8,6 +8,11 @@ import { PADDLING_POOL_257, } from "./tests/mocks"; import { SWIM_OR_SINK_167 } from "./tests/mocks-sos"; +import { + progressions, + testTournament, + tournamentCtxTeam, +} from "./tests/test-utils"; describe("Follow-up bracket progression", () => { const tournamentPP257 = new Tournament(PADDLING_POOL_257()); @@ -355,3 +360,44 @@ describe("Bracket progression override", () => { expect(tournament.brackets[1].seeding?.at(-1)).toBe(14737); }); }); + +describe("Adjusting team starting bracket", () => { + const createTournament = (teamStartingBracketIdx: (number | null)[]) => { + return testTournament({ + ctx: { + teams: teamStartingBracketIdx.map((startingBracketIdx, i) => + tournamentCtxTeam(i + 1, { startingBracketIdx }), + ), + settings: { + bracketProgression: progressions.manyStartBrackets, + }, + }, + }); + }; + + it("defaults to bracket idx = 0", () => { + const tournament = createTournament([null, null, null, null]); + + expect(tournament.brackets[0].participantTournamentTeamIds).toHaveLength(4); + }); + + it("setting starting bracket idx has an effect", () => { + const tournament = createTournament([0, 0, 1, 1]); + + expect(tournament.brackets[0].participantTournamentTeamIds).toHaveLength(2); + expect(tournament.brackets[1].participantTournamentTeamIds).toHaveLength(2); + }); + + it("handles too high bracket idx gracefully", () => { + const tournament = createTournament([0, 0, 0, 10]); + + expect(tournament.brackets[0].participantTournamentTeamIds).toHaveLength(4); + }); + + it("handles bracket idx is not a valid starting bracket idx gracefully", () => { + // 2 is not valid because it is a follow-up bracket + const tournament = createTournament([0, 0, 0, 2]); + + expect(tournament.brackets[0].participantTournamentTeamIds).toHaveLength(4); + }); +}); diff --git a/app/features/tournament-bracket/core/Tournament.ts b/app/features/tournament-bracket/core/Tournament.ts index e87ebafdf..d7db20474 100644 --- a/app/features/tournament-bracket/core/Tournament.ts +++ b/app/features/tournament-bracket/core/Tournament.ts @@ -163,10 +163,7 @@ export class Tournament { } else if (type === "swiss") { const { teams, relevantMatchesFinished } = sources ? this.resolveTeamsFromSources(sources, bracketIdx) - : { - teams: this.ctx.teams.map((team) => team.id), - relevantMatchesFinished: true, - }; + : this.resolveTeamsFromSignups(bracketIdx); const { checkedInTeams, notCheckedInTeams } = this.divideTeamsToCheckedInAndNotCheckedIn({ @@ -210,10 +207,7 @@ export class Tournament { } else { const { teams, relevantMatchesFinished } = sources ? this.resolveTeamsFromSources(sources, bracketIdx) - : { - teams: this.ctx.teams.map((team) => team.id), - relevantMatchesFinished: true, - }; + : this.resolveTeamsFromSignups(bracketIdx); const { checkedInTeams, notCheckedInTeams } = this.divideTeamsToCheckedInAndNotCheckedIn({ @@ -332,6 +326,34 @@ export class Tournament { }; } + private resolveTeamsFromSignups(bracketIdx: number) { + const teams = this.isMultiStartingBracket + ? this.ctx.teams.filter((team) => { + // 0 is the default + if (typeof team.startingBracketIdx !== "number") { + return bracketIdx === 0; + } + + const startingBracket = this.ctx.settings.bracketProgression.at( + team.startingBracketIdx, + ); + if (!startingBracket || startingBracket.sources) { + logger.warn( + "resolveTeamsFromSignups: Starting bracket index invalid", + ); + return bracketIdx === 0; + } + + return team.startingBracketIdx === bracketIdx; + }) + : this.ctx.teams; + + return { + teams: teams.map((team) => team.id), + relevantMatchesFinished: true, + }; + } + private avoidReplaysOfPreviousBracketOpponent( teams: number[], bracket: { @@ -995,6 +1017,15 @@ export class Tournament { return bracket; } + get isMultiStartingBracket() { + let count = 0; + for (const bracket of this.ctx.settings.bracketProgression) { + if (!bracket.sources) count++; + } + + return count > 1; + } + ownedTeamByUser( user: OptionalIdObject, ): ((typeof this.ctx.teams)[number] & { inviteCode: string }) | null { diff --git a/app/features/tournament-bracket/core/summarizer.test.ts b/app/features/tournament-bracket/core/summarizer.test.ts index 19e91405d..3158f2f91 100644 --- a/app/features/tournament-bracket/core/summarizer.test.ts +++ b/app/features/tournament-bracket/core/summarizer.test.ts @@ -16,6 +16,7 @@ describe("tournamentSummary()", () => { id: teamId, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, mapPool: [], members: userIds.map((userId) => ({ country: null, diff --git a/app/features/tournament-bracket/core/tests/mocks-li.ts b/app/features/tournament-bracket/core/tests/mocks-li.ts index 97d8691f9..eff01d39c 100644 --- a/app/features/tournament-bracket/core/tests/mocks-li.ts +++ b/app/features/tournament-bracket/core/tests/mocks-li.ts @@ -7575,6 +7575,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733157607, activeRosterUserIds: [25875, 21063, 11226, 31597], pickupAvatarUrl: null, @@ -7664,6 +7665,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733157629, activeRosterUserIds: [14837, 27260, 42704, 9379], pickupAvatarUrl: null, @@ -7753,6 +7755,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1733161494, activeRosterUserIds: [34424, 31195, 31395, 26103], pickupAvatarUrl: null, @@ -7842,6 +7845,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733166918, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -7919,6 +7923,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733166213, activeRosterUserIds: [32160, 29267, 25591, 36962], pickupAvatarUrl: null, @@ -8003,6 +8008,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1733189945, activeRosterUserIds: [12418, 34355, 2319, 7430], pickupAvatarUrl: null, @@ -8092,6 +8098,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733244862, activeRosterUserIds: [29425, 31524, 35674, 26285], pickupAvatarUrl: null, @@ -8181,6 +8188,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733282085, activeRosterUserIds: [26747, 27292, 5708, 6309], pickupAvatarUrl: null, @@ -8282,6 +8290,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733291438, activeRosterUserIds: [24459, 40851, 23974, 43608], pickupAvatarUrl: null, @@ -8383,6 +8392,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1733439755, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -8460,6 +8470,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733485884, activeRosterUserIds: [30686, 1961, 30685, 22396], pickupAvatarUrl: null, @@ -8561,6 +8572,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733937993, activeRosterUserIds: [12434, 30263, 5861, 24275], pickupAvatarUrl: null, @@ -8662,6 +8674,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733166818, activeRosterUserIds: [32670, 38046, 42638, 34589], pickupAvatarUrl: "pickup-logo-Hj-Us_Roj5Ksfv000ceBo-1733166818832.webp", @@ -8751,6 +8764,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733167616, activeRosterUserIds: [45102, 26711, 41739, 4533], pickupAvatarUrl: null, @@ -8840,6 +8854,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1733201503, activeRosterUserIds: [20807, 31556, 33373, 42703], pickupAvatarUrl: null, @@ -8941,6 +8956,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733218069, activeRosterUserIds: [26509, 7959, 7690, 7958], pickupAvatarUrl: null, @@ -9030,6 +9046,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733319202, activeRosterUserIds: [10714, 21685, 8840, 10028], pickupAvatarUrl: null, @@ -9131,6 +9148,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1733471556, activeRosterUserIds: [17532, 30204, 36007, 38896], pickupAvatarUrl: null, @@ -9220,6 +9238,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733501938, activeRosterUserIds: [30495, 43073, 30488, 45295], pickupAvatarUrl: null, @@ -9309,6 +9328,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733622364, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -9380,6 +9400,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733635706, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -9457,6 +9478,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733671856, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -9529,6 +9551,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733810204, activeRosterUserIds: [1959, 17352, 33954, 22403], pickupAvatarUrl: "pickup-logo-3KZntw8OZ9LkW4XqZRLS9-1733810204048.webp", @@ -9613,6 +9636,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733889961, activeRosterUserIds: [6696, 32107, 33402, 30619], pickupAvatarUrl: null, @@ -9697,6 +9721,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733892132, activeRosterUserIds: [21670, 8993, 8395, 3566], pickupAvatarUrl: null, @@ -9786,6 +9811,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734035170, activeRosterUserIds: [24510, 10670, 22577, 31143], pickupAvatarUrl: null, @@ -9875,6 +9901,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734107844, activeRosterUserIds: [28170, 14309, 17310, 23164], pickupAvatarUrl: null, @@ -9964,6 +9991,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734132225, activeRosterUserIds: null, pickupAvatarUrl: "pickup-logo-_asHjlVchhJ50PH_mDBtw-1734132224819.webp", @@ -10036,6 +10064,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733194304, activeRosterUserIds: [40505, 29011, 23082, 45036], pickupAvatarUrl: null, @@ -10125,6 +10154,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733195091, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -10202,6 +10232,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733364647, activeRosterUserIds: [22801, 31150, 35354, 27747], pickupAvatarUrl: null, @@ -10291,6 +10322,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733374295, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -10368,6 +10400,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733433864, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -10463,6 +10496,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733513814, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -10540,6 +10574,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733602400, activeRosterUserIds: [10826, 4248, 20419, 11180], pickupAvatarUrl: null, @@ -10629,6 +10664,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733753214, activeRosterUserIds: [27903, 28446, 34634, 30728], pickupAvatarUrl: null, @@ -10718,6 +10754,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733914001, activeRosterUserIds: [32909, 10190, 35922, 40304], pickupAvatarUrl: null, @@ -10819,6 +10856,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733966548, activeRosterUserIds: [35617, 37669, 37436, 35811], pickupAvatarUrl: null, @@ -10908,6 +10946,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734032213, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -10985,6 +11024,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734106606, activeRosterUserIds: [37173, 43269, 43623, 16054], pickupAvatarUrl: null, @@ -11074,6 +11114,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734116765, activeRosterUserIds: [25312, 10378, 46771, 26044], pickupAvatarUrl: null, @@ -11175,6 +11216,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734125312, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -11252,6 +11294,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734134382, activeRosterUserIds: [26758, 25689, 42164, 44475], pickupAvatarUrl: null, @@ -11336,6 +11379,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733156802, activeRosterUserIds: [9036, 7434, 3738, 9112], pickupAvatarUrl: null, @@ -11425,6 +11469,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733157391, activeRosterUserIds: [5935, 38204, 3741, 8080], pickupAvatarUrl: null, @@ -11526,6 +11571,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733162274, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -11603,6 +11649,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733367806, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -11680,6 +11727,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733456080, activeRosterUserIds: [10386, 33369, 29617, 22942], pickupAvatarUrl: null, @@ -11769,6 +11817,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733579092, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -11840,6 +11889,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733769667, activeRosterUserIds: [3481, 38022, 41269, 43551], pickupAvatarUrl: null, @@ -11941,6 +11991,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733794148, activeRosterUserIds: [22820, 29636, 27036, 28959], pickupAvatarUrl: null, @@ -12042,6 +12093,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1733820540, activeRosterUserIds: null, pickupAvatarUrl: "pickup-logo-t2-mrQNINFqIoFNYuxbmW-1733820600291.webp", @@ -12114,6 +12166,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733825084, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -12191,6 +12244,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1733865890, activeRosterUserIds: [15425, 41975, 28938, 8587], pickupAvatarUrl: null, @@ -12280,6 +12334,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1733873149, activeRosterUserIds: [40550, 7115, 29674, 30031], pickupAvatarUrl: null, @@ -12381,6 +12436,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733875608, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -12458,6 +12514,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733888417, activeRosterUserIds: null, pickupAvatarUrl: "pickup-logo-c9a1igcMT4m2otyRdTs_0-1733888672873.webp", @@ -12530,6 +12587,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1734008857, activeRosterUserIds: [30266, 37341, 22699, 28145], pickupAvatarUrl: null, @@ -12619,6 +12677,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1734018352, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -12696,6 +12755,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734019701, activeRosterUserIds: [35421, 33524, 22500, 32802], pickupAvatarUrl: "pickup-logo-u4oKxXYjamTXZ1x-bgNFp-1734019701188.webp", @@ -12792,6 +12852,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1734023441, activeRosterUserIds: [1852, 2898, 25763, 3466], pickupAvatarUrl: null, @@ -12881,6 +12942,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734099744, activeRosterUserIds: [39098, 22624, 28137, 2769], pickupAvatarUrl: null, @@ -12970,6 +13032,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734109256, activeRosterUserIds: [29661, 15158, 35067, 31655], pickupAvatarUrl: "pickup-logo-An13SrR78qDNIM2t95ujb-1734109256283.webp", @@ -13066,6 +13129,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734125682, activeRosterUserIds: [36575, 30425, 32430, 24290], pickupAvatarUrl: null, @@ -13167,6 +13231,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1733515005, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -13244,6 +13309,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733521735, activeRosterUserIds: [44772, 38912, 36853, 42599], pickupAvatarUrl: null, @@ -13333,6 +13399,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733525617, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -13410,6 +13477,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733847805, activeRosterUserIds: [33615, 32015, 45778, 32970], pickupAvatarUrl: null, @@ -13499,6 +13567,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733858126, activeRosterUserIds: [34545, 35567, 41108, 41255], pickupAvatarUrl: null, @@ -13588,6 +13657,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733966096, activeRosterUserIds: [39470, 42874, 32878, 25741], pickupAvatarUrl: null, @@ -13677,6 +13747,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734021147, activeRosterUserIds: [45250, 45174, 6976, 10222], pickupAvatarUrl: "pickup-logo-v3boyVjbFsTyMlQylz4Dn-1734021152539.webp", @@ -13766,6 +13837,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734040772, activeRosterUserIds: null, pickupAvatarUrl: "pickup-logo-Jx6JnhFJQjOnM10s_79ld-1734041234919.webp", @@ -13843,6 +13915,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1734033803, activeRosterUserIds: [27800, 12235, 30044, 29531], pickupAvatarUrl: null, @@ -13932,6 +14005,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734099612, activeRosterUserIds: [24572, 7058, 37641, 33913], pickupAvatarUrl: "pickup-logo-RrPQW5kG_K1cvjdU5TKcF-1734099611923.webp", @@ -14016,6 +14090,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1734113463, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -14093,6 +14168,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734118202, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -14164,6 +14240,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1734134334, activeRosterUserIds: [11186, 27611, 25952, 23481], pickupAvatarUrl: null, @@ -14253,6 +14330,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1733169181, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -14330,6 +14408,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1733247691, activeRosterUserIds: null, pickupAvatarUrl: "pickup-logo--fZF6IGlzuuHeotc6Z00p-1733762912138.webp", @@ -14407,6 +14486,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733452618, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -14485,6 +14565,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733481710, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -14568,6 +14649,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733508949, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -14645,6 +14727,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733611261, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -14717,6 +14800,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 0, inviteCode: null, + startingBracketIdx: null, createdAt: 1733841846, activeRosterUserIds: [41943, 46289, 45290, 46394], pickupAvatarUrl: null, @@ -14806,6 +14890,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 0, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1733878153, activeRosterUserIds: null, pickupAvatarUrl: null, @@ -14883,6 +14968,7 @@ export const LOW_INK_DECEMBER_2024 = (): TournamentData => ({ noScreen: 1, droppedOut: 1, inviteCode: null, + startingBracketIdx: null, createdAt: 1734135144, activeRosterUserIds: null, pickupAvatarUrl: "pickup-logo-obQfxdRnJg0CsbrE6OXdl-1734135144301.webp", diff --git a/app/features/tournament-bracket/core/tests/mocks-sos.ts b/app/features/tournament-bracket/core/tests/mocks-sos.ts index 14b5a2536..b22fa47b5 100644 --- a/app/features/tournament-bracket/core/tests/mocks-sos.ts +++ b/app/features/tournament-bracket/core/tests/mocks-sos.ts @@ -2548,6 +2548,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14800, @@ -2640,6 +2641,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14743, @@ -2744,6 +2746,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14801, @@ -2836,6 +2839,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14792, @@ -2928,6 +2932,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14670, @@ -3049,6 +3054,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14661, @@ -3158,6 +3164,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14804, @@ -3267,6 +3274,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14732, @@ -3364,6 +3372,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14747, @@ -3468,6 +3477,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14748, @@ -3572,6 +3582,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14803, @@ -3664,6 +3675,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14795, @@ -3773,6 +3785,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14445, @@ -3894,6 +3907,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14810, @@ -3948,6 +3962,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14777, @@ -4040,6 +4055,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14805, @@ -4132,6 +4148,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14806, @@ -4224,6 +4241,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14653, @@ -4345,6 +4363,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14708, @@ -4454,6 +4473,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14715, @@ -4551,6 +4571,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14796, @@ -4643,6 +4664,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14797, @@ -4735,6 +4757,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14750, @@ -4818,6 +4841,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14809, @@ -4927,6 +4951,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14709, @@ -5024,6 +5049,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14783, @@ -5071,6 +5097,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14702, @@ -5163,6 +5190,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14735, @@ -5272,6 +5300,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14798, @@ -5376,6 +5405,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14663, @@ -5473,6 +5503,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14517, @@ -5582,6 +5613,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14741, @@ -5691,6 +5723,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14711, @@ -5774,6 +5807,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14655, @@ -5895,6 +5929,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14634, @@ -5966,6 +6001,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14799, @@ -6063,6 +6099,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14784, @@ -6129,6 +6166,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14733, @@ -6221,6 +6259,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14611, @@ -6304,6 +6343,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14713, @@ -6408,6 +6448,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14687, @@ -6517,6 +6558,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14742, @@ -6638,6 +6680,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14764, @@ -6730,6 +6773,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14802, @@ -6834,6 +6878,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14696, @@ -6943,6 +6988,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14808, @@ -7035,6 +7081,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14620, @@ -7151,6 +7198,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14737, @@ -7260,6 +7308,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14503, @@ -7331,6 +7380,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14739, @@ -7423,6 +7473,7 @@ export const SWIM_OR_SINK_167 = ( mapPool: [], team: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, { id: 14607, @@ -7520,6 +7571,7 @@ export const SWIM_OR_SINK_167 = ( deletedAt: null, }, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, }, ], tieBreakerMapPool: [], diff --git a/app/features/tournament-bracket/core/tests/mocks.ts b/app/features/tournament-bracket/core/tests/mocks.ts index f4552f8b5..7e27ab731 100644 --- a/app/features/tournament-bracket/core/tests/mocks.ts +++ b/app/features/tournament-bracket/core/tests/mocks.ts @@ -2109,6 +2109,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709743534, @@ -2223,6 +2224,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709737918, @@ -2349,6 +2351,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709743523, @@ -2463,6 +2466,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709743262, @@ -2577,6 +2581,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709741396, @@ -2701,6 +2706,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709711811, @@ -2825,6 +2831,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709738831, @@ -2948,6 +2955,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709737837, @@ -3059,6 +3067,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709741719, @@ -3196,6 +3205,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709730354, @@ -3320,6 +3330,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709745630, @@ -3441,6 +3452,7 @@ export const PADDLING_POOL_257 = () => prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709592381, @@ -3575,6 +3587,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709723749, @@ -3698,6 +3711,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709668399, @@ -3832,6 +3846,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709735267, @@ -3947,6 +3962,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709745849, @@ -4062,6 +4078,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709742258, @@ -4181,6 +4198,7 @@ export const PADDLING_POOL_257 = () => prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709738744, @@ -4303,6 +4321,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709746054, @@ -4415,6 +4434,7 @@ export const PADDLING_POOL_257 = () => prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709744894, @@ -4525,6 +4545,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709728278, @@ -4635,6 +4656,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709715006, @@ -4745,6 +4767,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709660578, @@ -4860,6 +4883,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709721869, @@ -4984,6 +5008,7 @@ export const PADDLING_POOL_257 = () => prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709743633, @@ -5099,6 +5124,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709738747, @@ -5226,6 +5252,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709626047, @@ -5348,6 +5375,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709727951, @@ -5458,6 +5486,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709741482, @@ -5589,6 +5618,7 @@ export const PADDLING_POOL_257 = () => prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709744451, @@ -5704,6 +5734,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709726536, @@ -5814,6 +5845,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709558706, @@ -5929,6 +5961,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709744323, @@ -6056,6 +6089,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709677397, @@ -6166,6 +6200,7 @@ export const PADDLING_POOL_257 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1709618711, @@ -8000,6 +8035,7 @@ export const PADDLING_POOL_255 = () => prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708476597, @@ -8113,6 +8149,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708535137, @@ -8227,6 +8264,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708533764, @@ -8350,6 +8388,7 @@ export const PADDLING_POOL_255 = () => prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708537512, @@ -8476,6 +8515,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708533309, @@ -8590,6 +8630,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708430641, @@ -8716,6 +8757,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708536306, @@ -8827,6 +8869,7 @@ export const PADDLING_POOL_255 = () => prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708526368, @@ -8939,6 +8982,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708506060, @@ -9075,6 +9119,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708526814, @@ -9183,6 +9228,7 @@ export const PADDLING_POOL_255 = () => prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708466421, @@ -9305,6 +9351,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708377426, @@ -9424,6 +9471,7 @@ export const PADDLING_POOL_255 = () => prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708448289, @@ -9558,6 +9606,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708532602, @@ -9668,6 +9717,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708535205, @@ -9790,6 +9840,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708515945, @@ -9900,6 +9951,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708453334, @@ -10007,6 +10059,7 @@ export const PADDLING_POOL_255 = () => prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708522730, @@ -10129,6 +10182,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708375443, @@ -10251,6 +10305,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708532665, @@ -10366,6 +10421,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708364254, @@ -10493,6 +10549,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708464101, @@ -10617,6 +10674,7 @@ export const PADDLING_POOL_255 = () => prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708520249, @@ -10739,6 +10797,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708535804, @@ -10849,6 +10908,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708535891, @@ -10971,6 +11031,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708521749, @@ -11093,6 +11154,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708536584, @@ -11203,6 +11265,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708537772, @@ -11343,6 +11406,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708379916, @@ -11465,6 +11529,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708519753, @@ -11592,6 +11657,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708534312, @@ -11716,6 +11782,7 @@ export const PADDLING_POOL_255 = () => prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708531929, @@ -11826,6 +11893,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708477155, @@ -11941,6 +12009,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708531564, @@ -12092,6 +12161,7 @@ export const PADDLING_POOL_255 = () => team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1708503356, @@ -14202,6 +14272,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707443313, @@ -14303,6 +14374,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707366405, @@ -14404,6 +14476,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1706912643, @@ -14505,6 +14578,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707359335, @@ -14632,6 +14706,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707171426, @@ -14746,6 +14821,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707342696, @@ -14860,6 +14936,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707513942, @@ -14987,6 +15064,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707526815, @@ -15114,6 +15192,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707583385, @@ -15215,6 +15294,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707486395, @@ -15316,6 +15396,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707513290, @@ -15417,6 +15498,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707531084, @@ -15518,6 +15600,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707568466, @@ -15632,6 +15715,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707481625, @@ -15733,6 +15817,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707530166, @@ -15833,6 +15918,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707181792, @@ -15947,6 +16033,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707550321, @@ -16066,6 +16153,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707575096, @@ -16180,6 +16268,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707569490, @@ -16307,6 +16396,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707537425, @@ -16408,6 +16498,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707564691, @@ -16538,6 +16629,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707145818, @@ -16646,6 +16738,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707558330, @@ -16744,6 +16837,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707586842, @@ -16843,6 +16937,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707583597, @@ -16964,6 +17059,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707429804, @@ -17073,6 +17169,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707539973, @@ -17188,6 +17285,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707507831, @@ -17297,6 +17395,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707586297, @@ -17403,6 +17502,7 @@ export const IN_THE_ZONE_32 = ({ prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707583885, @@ -17524,6 +17624,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707578076, @@ -17636,6 +17737,7 @@ export const IN_THE_ZONE_32 = ({ prefersNotToHost: 1, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707582953, @@ -17733,6 +17835,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707575330, @@ -17849,6 +17952,7 @@ export const IN_THE_ZONE_32 = ({ team: null, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, activeRosterUserIds: [], pickupAvatarUrl: null, createdAt: 1707527645, diff --git a/app/features/tournament-bracket/core/tests/test-utils.ts b/app/features/tournament-bracket/core/tests/test-utils.ts index c48ea09f7..16aa461e1 100644 --- a/app/features/tournament-bracket/core/tests/test-utils.ts +++ b/app/features/tournament-bracket/core/tests/test-utils.ts @@ -4,7 +4,7 @@ import type * as Progression from "../Progression"; import { Tournament } from "../Tournament"; import type { TournamentData } from "../Tournament.server"; -const tournamentCtxTeam = ( +export const tournamentCtxTeam = ( teamId: number, partial?: Partial, ): TournamentData["ctx"]["teams"][0] => { @@ -14,6 +14,7 @@ const tournamentCtxTeam = ( id: teamId, inviteCode: null, avgSeedingSkillOrdinal: null, + startingBracketIdx: null, team: null, mapPool: [], members: [], diff --git a/app/features/tournament-bracket/routes/to.$id.brackets.tsx b/app/features/tournament-bracket/routes/to.$id.brackets.tsx index bcaa99285..68536569b 100644 --- a/app/features/tournament-bracket/routes/to.$id.brackets.tsx +++ b/app/features/tournament-bracket/routes/to.$id.brackets.tsx @@ -413,11 +413,22 @@ export default function TournamentBracketsPage() { return null; }; - const totalTeamsAvailableForTheBracket = () => - bracketIdx === 0 - ? tournament.ctx.teams.length - : (bracket.teamsPendingCheckIn ?? []).length + - bracket.participantTournamentTeamIds.length; + const totalTeamsAvailableForTheBracket = () => { + if (bracket.sources) { + return ( + (bracket.teamsPendingCheckIn ?? []).length + + bracket.participantTournamentTeamIds.length + ); + } + + if (!tournament.isMultiStartingBracket) { + return tournament.ctx.teams.length; + } + + return tournament.ctx.teams.filter( + (team) => (team.startingBracketIdx ?? 0) === bracketIdx, + ).length; + }; return (
diff --git a/app/features/tournament/TournamentRepository.server.ts b/app/features/tournament/TournamentRepository.server.ts index 15c9cb6a2..6ca086d5a 100644 --- a/app/features/tournament/TournamentRepository.server.ts +++ b/app/features/tournament/TournamentRepository.server.ts @@ -171,6 +171,7 @@ export async function findById(id: number) { "TournamentTeam.inviteCode", "TournamentTeam.createdAt", "TournamentTeam.activeRosterUserIds", + "TournamentTeam.startingBracketIdx", "UserSubmittedImage.url as pickupAvatarUrl", jsonArrayFrom( innerEb @@ -686,6 +687,14 @@ export function updateProgression({ allTournamentTeamsOfTournament, ) .execute(); + + await trx + .updateTable("TournamentTeam") + .set({ + startingBracketIdx: null, + }) + .where("tournamentId", "=", tournamentId) + .execute(); } const newSettings: Tables["Tournament"]["settings"] = { diff --git a/app/features/tournament/TournamentTeamRepository.server.ts b/app/features/tournament/TournamentTeamRepository.server.ts index 1cd2b89d4..e48a7af25 100644 --- a/app/features/tournament/TournamentTeamRepository.server.ts +++ b/app/features/tournament/TournamentTeamRepository.server.ts @@ -209,3 +209,31 @@ export function deleteLogo(tournamentTeamId: number) { .where("TournamentTeam.id", "=", tournamentTeamId) .execute(); } + +export function updateStartingBrackets( + startingBrackets: { + tournamentTeamId: number; + startingBracketIdx: number; + }[], +) { + const grouped = Object.groupBy( + startingBrackets, + (sb) => sb.startingBracketIdx, + ); + + return db.transaction().execute(async (trx) => { + for (const [startingBracketIdx, tournamentTeamIds = []] of Object.entries( + grouped, + )) { + await trx + .updateTable("TournamentTeam") + .set({ startingBracketIdx: Number(startingBracketIdx) }) + .where( + "TournamentTeam.id", + "in", + tournamentTeamIds.map((t) => t.tournamentTeamId), + ) + .execute(); + } + }); +} diff --git a/app/features/tournament/routes/to.$id.register.tsx b/app/features/tournament/routes/to.$id.register.tsx index 5c836e702..a6a2c29ed 100644 --- a/app/features/tournament/routes/to.$id.register.tsx +++ b/app/features/tournament/routes/to.$id.register.tsx @@ -40,6 +40,7 @@ import invariant from "~/utils/invariant"; import { LOG_IN_URL, SENDOU_INK_BASE_URL, + SENDOU_INK_DISCORD_URL, navIconUrl, readonlyMapsPage, tournamentJoinPage, @@ -859,7 +860,14 @@ function FriendCode() { {user?.friendCode ? (
- Is the friend code above wrong? Post a message on our Discord helpdesk + Is the friend code above wrong? Post a message on the{" "} + + sendou.ink Discord helpdesk + {" "} to change it.
) : null} diff --git a/app/features/tournament/routes/to.$id.seeds.tsx b/app/features/tournament/routes/to.$id.seeds.tsx index 8fcc31f96..9e5000836 100644 --- a/app/features/tournament/routes/to.$id.seeds.tsx +++ b/app/features/tournament/routes/to.$id.seeds.tsx @@ -22,8 +22,10 @@ import * as React from "react"; import { Alert } from "~/components/Alert"; import { Button } from "~/components/Button"; import { Catcher } from "~/components/Catcher"; +import { Dialog } from "~/components/Dialog"; import { Draggable } from "~/components/Draggable"; import { SubmitButton } from "~/components/SubmitButton"; +import { Table } from "~/components/Table"; import { requireUser } from "~/features/auth/core/user.server"; import { type TournamentDataTeam, @@ -37,6 +39,7 @@ import { tournamentBracketsPage, userResultsPage } from "~/utils/urls"; import { Avatar } from "../../../components/Avatar"; import { InfoPopover } from "../../../components/InfoPopover"; import { ordinalToRoundedSp } from "../../mmr/mmr-utils"; +import * as TournamentTeamRepository from "../TournamentTeamRepository.server"; import { updateTeamSeeds } from "../queries/updateTeamSeeds.server"; import { seedsActionSchema } from "../tournament-schemas.server"; import { tournamentIdFromParams } from "../tournament-utils"; @@ -54,7 +57,30 @@ export const action: ActionFunction = async ({ request, params }) => { validate(tournament.isOrganizer(user)); validate(!tournament.hasStarted, "Tournament has started"); - updateTeamSeeds({ tournamentId, teamIds: data.seeds }); + switch (data._action) { + case "UPDATE_SEEDS": { + updateTeamSeeds({ tournamentId, teamIds: data.seeds }); + break; + } + case "UPDATE_STARTING_BRACKETS": { + const validBracketIdxs = + tournament.ctx.settings.bracketProgression.flatMap( + (bracket, bracketIdx) => (!bracket.sources ? [bracketIdx] : []), + ); + + validate( + data.startingBrackets.every((t) => + validBracketIdxs.includes(t.startingBracketIdx), + ), + "Invalid starting bracket idx", + ); + + await TournamentTeamRepository.updateStartingBrackets( + data.startingBrackets, + ); + break; + } + } clearTournamentDataCache(tournamentId); @@ -149,6 +175,13 @@ export default function TournamentSeedsPage() { )}
+ {tournament.isMultiStartingBracket ? ( + team.startingBracketIdx ?? 0) + .join()} + /> + ) : null}
  • @@ -245,6 +278,118 @@ export default function TournamentSeedsPage() { ); } +function StartingBracketDialog() { + const fetcher = useFetcher(); + const tournament = useTournament(); + + const [isOpen, setIsOpen] = React.useState(false); + const [teamStartingBrackets, setTeamStartingBrackets] = React.useState( + tournament.ctx.teams.map((team) => ({ + tournamentTeamId: team.id, + startingBracketIdx: team.startingBracketIdx ?? 0, + })), + ); + + const startingBrackets = tournament.ctx.settings.bracketProgression + .flatMap((bracket, bracketIdx) => (!bracket.sources ? [bracketIdx] : [])) + .map((bracketIdx) => tournament.bracketByIdx(bracketIdx)!); + + return ( +
    + + setIsOpen(false)} className="w-max"> + +

    Setting starting brackets

    +
    + {startingBrackets.map((bracket) => { + const teamCount = teamStartingBrackets.filter( + (t) => t.startingBracketIdx === bracket.idx, + ).length; + + return ( +
    + {bracket.name} + ({teamCount} teams) +
    + ); + })} +
    + + + + + + + + + + + + + {tournament.ctx.teams.map((team) => { + const { startingBracketIdx } = teamStartingBrackets.find( + ({ tournamentTeamId }) => tournamentTeamId === team.id, + )!; + + return ( + + + + + ); + })} + +
    TeamStarting bracket
    {team.name} + +
    + + Save + +
    +
    +
    + ); +} + function SeedAlert({ teamOrder }: { teamOrder: number[] }) { const tournament = useTournament(); const [teamOrderInDb, setTeamOrderInDb] = React.useState(teamOrder); diff --git a/app/features/tournament/tournament-schemas.server.ts b/app/features/tournament/tournament-schemas.server.ts index 2ade11107..81ae44984 100644 --- a/app/features/tournament/tournament-schemas.server.ts +++ b/app/features/tournament/tournament-schemas.server.ts @@ -8,6 +8,7 @@ import { safeJSONParse, stageId, } from "~/utils/zod"; +import { bracketIdx } from "../tournament-bracket/tournament-bracket-schemas.server"; import { TOURNAMENT } from "./tournament-constants"; export const teamName = z @@ -53,9 +54,24 @@ export const registerSchema = z.union([ }), ]); -export const seedsActionSchema = z.object({ - seeds: z.preprocess(safeJSONParse, z.array(id)), -}); +export const seedsActionSchema = z.union([ + z.object({ + _action: _action("UPDATE_SEEDS"), + seeds: z.preprocess(safeJSONParse, z.array(id)), + }), + z.object({ + _action: _action("UPDATE_STARTING_BRACKETS"), + startingBrackets: z.preprocess( + safeJSONParse, + z.array( + z.object({ + tournamentTeamId: id, + startingBracketIdx: bracketIdx, + }), + ), + ), + }), +]); export const joinSchema = z.object({ trust: z.preprocess(checkboxValueToBoolean, z.boolean()), diff --git a/docs/tournament-creation.md b/docs/tournament-creation.md index d8a2f6d98..2533f8a7e 100644 --- a/docs/tournament-creation.md +++ b/docs/tournament-creation.md @@ -113,6 +113,10 @@ Choose the tournament format. You can have at most 10 brackets with teams advanc Source bracket means a bracket where teams come from. Target bracket means a bracket where teams go to after first playing some other bracket. A bracket can be both at the same time. +### Is follow-up bracket + +If toggled off, teams join from the sign-up. Turns this bracket into a source bracket. You can set which teams start from which bracket in the seeding page. Note that when this option is enabled you are creating a tournament where teams that start in separate brackets will not meet (so in essence they are separate tournaments but just happening on the same tournament page). + ### Placements Placements is a comma separated list of placements. So e.g. the following are valid: @@ -140,6 +144,5 @@ Current limitations. Feel free to leave feedback if it's blocking you from runni - Single-elimination can not be a source bracket - Double-elimination can only be a source bracket when it comes to people who drop in the losers round (negative placements) -- All teams start the tournament in the same bracket - Only one source bracket per target bracket. diff --git a/e2e/tournament-bracket.spec.ts b/e2e/tournament-bracket.spec.ts index 6f2fd9bf4..21fdf10b0 100644 --- a/e2e/tournament-bracket.spec.ts +++ b/e2e/tournament-bracket.spec.ts @@ -492,6 +492,51 @@ test.describe("Tournament bracket", () => { await expect(page.getByTestId("back-to-bracket-button")).toBeVisible(); }); + test("conducts a tournament with many starting brackets", async ({ + page, + }) => { + const tournamentId = 4; + + await seed(page, "SMALL_SOS"); + await impersonate(page); + + await navigate({ + page, + url: tournamentAdminPage(tournamentId), + }); + + await page.getByTestId("edit-event-info-button").click(); + await page.getByTestId("delete-bracket-button").last().click(); + await page.getByTestId("delete-bracket-button").last().click(); + await page.getByTestId("delete-bracket-button").last().click(); + + await page.getByLabel("Is follow-up bracket").click(); + await page.getByLabel("Format").first().selectOption("Single-elimination"); + + await submit(page); + + await page.getByText("Seeds").click(); + await page.getByTestId("set-starting-brackets").click(); + + await page + .getByTestId("starting-bracket-select") + .first() + .selectOption("Great White"); + await page + .getByTestId("starting-bracket-select") + .nth(1) + .selectOption("Great White"); + + await submit(page, "set-starting-brackets-submit-button"); + await page.getByTestId("brackets-tab").click(); + await page.getByText("Great White").click(); + await page.getByTestId("finalize-bracket-button").click(); + await page.getByTestId("confirm-finalize-bracket-button").click(); + + await expect(page.locator('[data-match-id="1"]')).toBeVisible(); + await isNotVisible(page.locator('[data-match-id="2"]')); + }); + test("organizer edits a match after it is done", async ({ page }) => { const tournamentId = 3; diff --git a/migrations/077-starting-bracket-idx.js b/migrations/077-starting-bracket-idx.js new file mode 100644 index 000000000..1257aa998 --- /dev/null +++ b/migrations/077-starting-bracket-idx.js @@ -0,0 +1,7 @@ +export function up(db) { + db.transaction(() => { + db.prepare( + /* sql */ `alter table "TournamentTeam" add "startingBracketIdx" integer`, + ).run(); + })(); +} diff --git a/public/static-assets/img/sq-header/1.avif b/public/static-assets/img/sq-header/1.avif new file mode 100644 index 0000000000000000000000000000000000000000..8d065683473ff29295c5df0a89c94742a23b6d7d GIT binary patch literal 4712 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 Z4~FTNE7zu#C!*Jwh!ilJnn=hP{s({7qk#Yb literal 0 HcmV?d00001 diff --git a/public/static-assets/img/sq-header/1.png b/public/static-assets/img/sq-header/1.png new file mode 100644 index 0000000000000000000000000000000000000000..a28f91fac35657269c6045b5eb2765fcb988aa25 GIT binary patch literal 71750 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 $a^CUjSS%_Z_z|KQ(VxB(> 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