From 8db9c72f4c145aca9d77e55ddf824e618fc9b5ca Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 2 Mar 2026 15:04:14 +0100 Subject: [PATCH] fix: ranking reorders persist across all admin sessions Apply saved reordersJson when initializing the dashboard so any admin sees the latest drag-reorder state, not just the original AI order. The latest reorder event per category is used as the initial localOrder. Co-Authored-By: Claude Opus 4.6 --- .../admin/round/ranking-dashboard.tsx | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/components/admin/round/ranking-dashboard.tsx b/src/components/admin/round/ranking-dashboard.tsx index 825bb9f..58893e3 100644 --- a/src/components/admin/round/ranking-dashboard.tsx +++ b/src/components/admin/round/ranking-dashboard.tsx @@ -406,15 +406,28 @@ export function RankingDashboard({ competitionId: _competitionId, roundId }: Ran if (!initialized.current && snapshot) { const startup = (snapshot.startupRankingJson ?? []) as unknown as RankedProjectEntry[] const concept = (snapshot.conceptRankingJson ?? []) as unknown as RankedProjectEntry[] - setLocalOrder({ - STARTUP: startup.map((r) => r.projectId), - BUSINESS_CONCEPT: concept.map((r) => r.projectId), - }) - // Track original order for override detection (same effect = always in sync) + + // Track original AI order for override detection (same effect = always in sync) const order: Record = {} startup.forEach((r, i) => { order[r.projectId] = i + 1 }) concept.forEach((r, i) => { order[r.projectId] = i + 1 }) setSnapshotOrder(order) + + // Apply saved reorders so the ranking persists across all admin sessions. + // reordersJson is append-only — the latest event per category is the current order. + const reorders = (snapshot.reordersJson as Array<{ + category: 'STARTUP' | 'BUSINESS_CONCEPT' + orderedProjectIds: string[] + }> | null) ?? [] + + const latestStartupReorder = [...reorders].reverse().find((r) => r.category === 'STARTUP') + const latestConceptReorder = [...reorders].reverse().find((r) => r.category === 'BUSINESS_CONCEPT') + + setLocalOrder({ + STARTUP: latestStartupReorder?.orderedProjectIds ?? startup.map((r) => r.projectId), + BUSINESS_CONCEPT: latestConceptReorder?.orderedProjectIds ?? concept.map((r) => r.projectId), + }) + initialized.current = true } }, [snapshot])