-
Notifications
You must be signed in to change notification settings - Fork 2
feat: replace numeric table assignment with dynamic two-floor lettere… #426
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -329,6 +329,83 @@ export function sortTracks( | |||||
| return ordered; | ||||||
| } | ||||||
|
|
||||||
| // Table number assignment | ||||||
| const ALL_ROWS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''); | ||||||
|
|
||||||
| // Max teams per row on Floor 1 (Prioritize hardware teams)) | ||||||
| const FLOOR1_MAX_PER_ROW = 5; | ||||||
|
|
||||||
| // Max teams per row on Floor 2 | ||||||
| const FLOOR2_MAX_PER_ROW = 10; | ||||||
|
|
||||||
| /** | ||||||
| * Spreads teams evenly across rows, filling earlier rows first when there is a remainder | ||||||
| * | ||||||
| * Each team's tableNumber is set to e.g. "A3", "B1" | ||||||
| */ | ||||||
|
|
||||||
| function distributeAcrossRows(teams: ParsedRecord[], rows: string[]): void { | ||||||
| if (teams.length === 0 || rows.length === 0) return; | ||||||
| const baseCount = Math.floor(teams.length / rows.length); | ||||||
| const remainder = teams.length % rows.length; | ||||||
|
|
||||||
| let i = 0; | ||||||
| for (let rowIdx = 0; rowIdx < rows.length; rowIdx++) { | ||||||
| const letter = rows[rowIdx]; | ||||||
| const rowSize = baseCount + (rowIdx < remainder ? 1 : 0); | ||||||
| for (let seat = 1; seat <= rowSize; seat++) { | ||||||
| teams[i].tableNumber = `${letter}${seat}` as any; | ||||||
| i++; | ||||||
| } | ||||||
| } | ||||||
| } | ||||||
|
|
||||||
| /** | ||||||
| * Assigns two-floor lettered table numbers: | ||||||
| * | ||||||
| * Floor 1 — Hardware Hack teams first, with leftover seats filled by other teams in .csv order. | ||||||
| * | ||||||
| * Floor 2 — remaining other teams after floor 1 spillover is accounted for. | ||||||
| * Rows start immediately after floor 1's last letter. | ||||||
| */ | ||||||
| function assignTableNumbers( | ||||||
| hardwareTeams: ParsedRecord[], | ||||||
| otherTeams: ParsedRecord[] | ||||||
| ): void { | ||||||
| // Total row count for floor 1 for hardware teams | ||||||
| const floor1RowCount = Math.max( | ||||||
| 1, | ||||||
| Math.ceil(hardwareTeams.length / FLOOR1_MAX_PER_ROW) | ||||||
| ); | ||||||
|
|
||||||
| // How many seats are available on floor 1 vs how many hardware teams fill them. | ||||||
| const floor1Capacity = floor1RowCount * FLOOR1_MAX_PER_ROW; | ||||||
| const floor1Spillover = floor1Capacity - hardwareTeams.length; | ||||||
|
|
||||||
| // Pull enough other teams to fill the leftover floor 1 seats. | ||||||
| const floor1OtherTeams = otherTeams.slice(0, floor1Spillover); | ||||||
| const floor2Teams = otherTeams.slice(floor1Spillover); | ||||||
|
|
||||||
| const floor1Teams = [...hardwareTeams, ...floor1OtherTeams]; | ||||||
|
|
||||||
| // Total row count for floor 2 | ||||||
| const floor2RowCount = Math.max( | ||||||
| 1, | ||||||
| Math.ceil(floor2Teams.length / FLOOR2_MAX_PER_ROW) | ||||||
| ); | ||||||
|
|
||||||
| // Deligate table letters based on row counts for each floor | ||||||
|
||||||
| // Deligate table letters based on row counts for each floor | |
| // Delegate table letters based on row counts for each floor |
Copilot
AI
Mar 24, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ALL_ROWS is limited to A–Z. If floor1RowCount or floor1RowCount + floor2RowCount exceeds 26, slice(...) will return fewer/zero rows, causing distributeAcrossRows to assign too many seats per letter and/or leave some teams without a tableNumber (since rows.length === 0 early-returns). Add an explicit guard with a clear error when required rows exceed available labels, or implement multi-letter labels (AA, AB, …) so all teams get assigned deterministically.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
teams[i].tableNumber =${letter}${seat}as any;bypasses typing, butParsedRecord.tableNumber(and the persistedTeam.tableNumber) are currently typed/used asnumberthroughout the codebase. Persisting a string like "A3" will break consumers that compare or query by numeric tableNumber. Prefer updating the relevant types and downstream consumers (API queries, floor calculations, UI) to accept the new string format, or introduce a separate field (e.g.tableLabel) while keepingtableNumbernumeric.