From 6f5c1593ba4e7d0e69c5f1bc08dac84bc85c8147 Mon Sep 17 00:00:00 2001 From: michelleyeoh Date: Wed, 8 Apr 2026 14:39:49 -0700 Subject: [PATCH 1/4] normalize judge before editing fix --- .../admin/_components/Judges/JudgeCard.tsx | 7 +++-- .../admin/_components/Teams/TeamForm.tsx | 26 +++++++++++++------ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/app/(pages)/admin/_components/Judges/JudgeCard.tsx b/app/(pages)/admin/_components/Judges/JudgeCard.tsx index fdc0ad126..4a640ef17 100644 --- a/app/(pages)/admin/_components/Judges/JudgeCard.tsx +++ b/app/(pages)/admin/_components/Judges/JudgeCard.tsx @@ -59,8 +59,11 @@ export default function JudgeCard({ ))}
- {judge.teams.map((team: Team) => ( -
+ {judge.teams.map((team: Team, index: number) => ( +
{team.name}
))} diff --git a/app/(pages)/admin/_components/Teams/TeamForm.tsx b/app/(pages)/admin/_components/Teams/TeamForm.tsx index 931196d8b..d176c855d 100644 --- a/app/(pages)/admin/_components/Teams/TeamForm.tsx +++ b/app/(pages)/admin/_components/Teams/TeamForm.tsx @@ -42,15 +42,25 @@ export default function TeamForm({ judges.body.map((judge: any) => [judge._id, judge]) ); - if (data?._id) { - data.judges = data.judges.map((judge: any) => { - return judgeMap[judge._id]; - }); - } + const normalizeJudges = (incomingJudges: any[] = []) => + incomingJudges + .map((judge: any) => { + const judgeId = typeof judge === 'string' ? judge : judge?._id; + if (!judgeId) return null; + return judgeMap[judgeId] ?? null; + }) + .filter((judge): judge is User => Boolean(judge)); + + const normalizedJudges = normalizeJudges(data?.judges ?? []); const onSubmit = async (event: React.FormEvent) => { event.preventDefault(); + const formData: any = { + ...data, + judges: normalizeJudges(data?.judges ?? []), + }; + try { const verificationList = [ { @@ -85,7 +95,7 @@ export default function TeamForm({ ]; verificationList.forEach(({ field, validation }) => { - if (!validation(data?.[field])) { + if (!validation(formData?.[field])) { throw new Error(`Form field ${field} failed validation.`); } }); @@ -95,7 +105,7 @@ export default function TeamForm({ return; } - const { _id, submissions: _, judges, ...body } = data; + const { _id, submissions: _, judges, ...body } = formData; let team_id = _id; if (!team_id) { @@ -176,7 +186,7 @@ export default function TeamForm({ /> updateField('judges', value)} itemRenderer={({ key, item, deleteItem, shiftUp, shiftDown }) => { From 27fce5fc3e8fa715f7964650c0f0c08afe73063a Mon Sep 17 00:00:00 2001 From: michelleyeoh Date: Wed, 8 Apr 2026 14:46:57 -0700 Subject: [PATCH 2/4] added scroll to top when edit team --- app/(pages)/admin/teams/page.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/(pages)/admin/teams/page.tsx b/app/(pages)/admin/teams/page.tsx index 29faa7045..31ebfbe4c 100644 --- a/app/(pages)/admin/teams/page.tsx +++ b/app/(pages)/admin/teams/page.tsx @@ -55,6 +55,16 @@ export default function Teams() { (team) => team.reports?.length > 0 && team.active ); + const handleEditTeam = (team: TeamWithJudges) => { + setData(team); + window.scrollTo({ top: 0, behavior: 'smooth' }); + + const listContainer = document.querySelector( + `.${styles.teams_list}` + ) as HTMLElement | null; + listContainer?.scrollTo({ top: 0, behavior: 'smooth' }); + }; + return (

Team Manager

@@ -127,7 +137,10 @@ export default function Teams() { className={styles.team_card_wrapper} key={team._id} > - setData(team)} /> + handleEditTeam(team)} + />
))}
From c8d9534ff1a01fe4af84beb5b10c8d6a49c3e336 Mon Sep 17 00:00:00 2001 From: michelleyeoh Date: Wed, 8 Apr 2026 23:17:34 -0700 Subject: [PATCH 3/4] fix table number and team key --- app/(pages)/admin/_components/Judges/JudgeCard.tsx | 2 +- app/(pages)/admin/_components/Teams/TeamForm.tsx | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/(pages)/admin/_components/Judges/JudgeCard.tsx b/app/(pages)/admin/_components/Judges/JudgeCard.tsx index 4a640ef17..f49dd675b 100644 --- a/app/(pages)/admin/_components/Judges/JudgeCard.tsx +++ b/app/(pages)/admin/_components/Judges/JudgeCard.tsx @@ -61,7 +61,7 @@ export default function JudgeCard({
{judge.teams.map((team: Team, index: number) => (
{team.name} diff --git a/app/(pages)/admin/_components/Teams/TeamForm.tsx b/app/(pages)/admin/_components/Teams/TeamForm.tsx index d176c855d..022bb6b61 100644 --- a/app/(pages)/admin/_components/Teams/TeamForm.tsx +++ b/app/(pages)/admin/_components/Teams/TeamForm.tsx @@ -69,7 +69,8 @@ export default function TeamForm({ }, { field: 'tableNumber', - validation: Number.isFinite, + validation: (tableNumber: any) => + typeof tableNumber === 'string' && tableNumber.trim().length > 0, }, { field: 'name', @@ -147,9 +148,9 @@ export default function TeamForm({ required /> updateField('tableNumber', newTableNumber) } From a083e52dde837ccca3ad69517b8bd8e54430fba6 Mon Sep 17 00:00:00 2001 From: michelleyeoh Date: Wed, 8 Apr 2026 23:26:20 -0700 Subject: [PATCH 4/4] fix team and judge id swap --- app/(api)/_actions/teams/updateTeamWithJudges.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/(api)/_actions/teams/updateTeamWithJudges.ts b/app/(api)/_actions/teams/updateTeamWithJudges.ts index 6c5c69933..a9ec9ebea 100644 --- a/app/(api)/_actions/teams/updateTeamWithJudges.ts +++ b/app/(api)/_actions/teams/updateTeamWithJudges.ts @@ -161,7 +161,7 @@ export async function updateTeamWithJudges( } const deleteSubmissionResList = await Promise.all( - deleteList.map((judge_id) => removeJudgeFromTeam(judge_id, team_id)) + deleteList.map((judge_id) => removeJudgeFromTeam(team_id, judge_id)) ); if (!deleteSubmissionResList.every((res: any) => res.ok)) { throw new Error(