diff --git a/src/components/admin/round/ranking-dashboard.tsx b/src/components/admin/round/ranking-dashboard.tsx index a125109..ef49b6f 100644 --- a/src/components/admin/round/ranking-dashboard.tsx +++ b/src/components/admin/round/ranking-dashboard.tsx @@ -362,6 +362,8 @@ export function RankingDashboard({ competitionId: _competitionId, roundId }: Ran const config = roundData.configJson as Record const advConfig = config.advancementConfig as Record | undefined return { + advanceMode: (config.advanceMode as string) ?? 'count', + advanceScoreThreshold: (config.advanceScoreThreshold as number) ?? undefined, startupAdvanceCount: (advConfig?.startupCount ?? config.startupAdvanceCount ?? 0) as number, conceptAdvanceCount: (advConfig?.conceptCount ?? config.conceptAdvanceCount ?? 0) as number, } @@ -785,11 +787,15 @@ export function RankingDashboard({ competitionId: _competitionId, roundId }: Ran {categoryLabels[category]} - {evalConfig && (category === 'STARTUP' ? evalConfig.startupAdvanceCount : evalConfig.conceptAdvanceCount) > 0 && ( + {evalConfig && evalConfig.advanceMode === 'threshold' && evalConfig.advanceScoreThreshold != null ? ( + + (Score ≥ {evalConfig.advanceScoreThreshold} advance) + + ) : evalConfig && (category === 'STARTUP' ? evalConfig.startupAdvanceCount : evalConfig.conceptAdvanceCount) > 0 ? ( (Top {category === 'STARTUP' ? evalConfig.startupAdvanceCount : evalConfig.conceptAdvanceCount} advance) - )} + ) : null} @@ -810,11 +816,24 @@ export function RankingDashboard({ competitionId: _competitionId, roundId }: Ran
{localOrder[category].map((projectId, index) => { - const advanceCount = category === 'STARTUP' + const isThresholdMode = evalConfig?.advanceMode === 'threshold' && evalConfig.advanceScoreThreshold != null + const advanceCount = isThresholdMode ? 0 : (category === 'STARTUP' ? (evalConfig?.startupAdvanceCount ?? 0) - : (evalConfig?.conceptAdvanceCount ?? 0) - const isAdvancing = advanceCount > 0 && index < advanceCount - const isCutoffRow = advanceCount > 0 && index === advanceCount - 1 + : (evalConfig?.conceptAdvanceCount ?? 0)) + // In threshold mode, check if this project's avg score meets the threshold + const entry = rankingMap.get(projectId) + const projectAvg = entry?.avgGlobalScore ?? 0 + const threshold = evalConfig?.advanceScoreThreshold ?? 0 + const isAdvancing = isThresholdMode + ? projectAvg >= threshold + : (advanceCount > 0 && index < advanceCount) + // Show cutoff line: in threshold mode, after last project above threshold + const nextProjectId = localOrder[category][index + 1] + const nextEntry = nextProjectId ? rankingMap.get(nextProjectId) : null + const nextAvg = nextEntry?.avgGlobalScore ?? 0 + const isCutoffRow = isThresholdMode + ? (projectAvg >= threshold && nextAvg < threshold) + : (advanceCount > 0 && index === advanceCount - 1) return ( @@ -839,7 +858,7 @@ export function RankingDashboard({ competitionId: _competitionId, roundId }: Ran
- Advancement cutoff — Top {advanceCount} + Advancement cutoff — {isThresholdMode ? `Score ≥ ${threshold}` : `Top ${advanceCount}`}