diff --git a/app/features/tournament-bracket/components/Bracket/PlacementsTable.tsx b/app/features/tournament-bracket/components/Bracket/PlacementsTable.tsx index 30cf5b8ed..ed603388b 100644 --- a/app/features/tournament-bracket/components/Bracket/PlacementsTable.tsx +++ b/app/features/tournament-bracket/components/Bracket/PlacementsTable.tsx @@ -76,10 +76,12 @@ export function PlacementsTable({ const destinationBracket = (placement: number) => bracket.tournament.brackets.find( (b) => - b.id !== bracket.id && - b.sources?.some( - (s) => s.bracketIdx === 0 && s.placements.includes(placement), - ), + b.idx === + Progression.destinationByPlacement({ + sourceBracketIdx: bracket.idx, + placement, + progression: bracket.tournament.ctx.settings.bracketProgression, + }), ); const possibleDestinationBrackets = Progression.destinationsFromBracketIdx( diff --git a/app/features/tournament-bracket/core/Progression.test.ts b/app/features/tournament-bracket/core/Progression.test.ts index 6c6f48f70..7522838f1 100644 --- a/app/features/tournament-bracket/core/Progression.test.ts +++ b/app/features/tournament-bracket/core/Progression.test.ts @@ -588,3 +588,41 @@ describe("destinationsFromBracketIdx", () => { ).toEqual([]); }); }); + +describe("destinationByPlacement", () => { + it("returns correct destination for a given placement", () => { + const result = Progression.destinationByPlacement({ + sourceBracketIdx: 0, + placement: 1, + progression: progressions.roundRobinToSingleElimination, + }); + expect(result).toBe(1); + }); + + it("returns null if no destination for the given placement", () => { + const result = Progression.destinationByPlacement({ + sourceBracketIdx: 0, + placement: 5, + progression: progressions.roundRobinToSingleElimination, + }); + expect(result).toBeNull(); + }); + + it("returns correct destination for negative placements", () => { + const result = Progression.destinationByPlacement({ + sourceBracketIdx: 0, + placement: -1, + progression: progressions.doubleEliminationWithUnderground, + }); + expect(result).toBe(1); + }); + + it("returns correct destination for many start brackets", () => { + const result = Progression.destinationByPlacement({ + sourceBracketIdx: 1, + placement: 1, + progression: progressions.manyStartBrackets, + }); + expect(result).toBe(3); + }); +}); diff --git a/app/features/tournament-bracket/core/Progression.ts b/app/features/tournament-bracket/core/Progression.ts index f4a5ecde2..a88645e35 100644 --- a/app/features/tournament-bracket/core/Progression.ts +++ b/app/features/tournament-bracket/core/Progression.ts @@ -699,3 +699,26 @@ export function destinationsFromBracketIdx( return destinations; } + +export function destinationByPlacement({ + sourceBracketIdx, + placement, + progression, +}: { + sourceBracketIdx: number; + placement: number; + progression: ParsedBracket[]; +}): number | null { + const destinations = destinationsFromBracketIdx( + sourceBracketIdx, + progression, + ); + + const destination = destinations.find((destinationBracketIdx) => + progression[destinationBracketIdx].sources?.some((source) => + source.placements.includes(placement), + ), + ); + + return destination ?? null; +}