Admin dashboard & round management UX overhaul
All checks were successful
Build and Push Docker Image / build (push) Successful in 8m43s

- Extract round detail monolith (2900→600 lines) into 13 standalone components
- Add shared round/status config (round-config.ts) replacing 4 local copies
- Delete 12 legacy competition-scoped pages, merge project pool into projects page
- Add round-type-specific dashboard stat panels (submission, mentoring, live final, deliberation, summary)
- Add contextual header quick actions based on active round type
- Improve pipeline visualization: progress bars, checkmarks, chevron connectors, overflow fix
- Add config tab completion dots (green/amber/red) and inline validation warnings
- Enhance juries page with round assignments, member avatars, and cap mode badges
- Add context-aware project list (recent submissions vs active evaluations)
- Move competition settings into Manage Editions page

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-22 17:14:00 +01:00
parent f7bc3b4dd2
commit f26ee3f076
51 changed files with 4530 additions and 6276 deletions

View File

@@ -21,6 +21,7 @@ import {
} from '@/components/ui/table'
import { ArrowLeft, Pencil, Plus } from 'lucide-react'
import { formatDateOnly } from '@/lib/utils'
import { CompetitionSettings } from '@/components/admin/program/competition-settings'
interface ProgramDetailPageProps {
params: Promise<{ id: string }>
@@ -84,6 +85,24 @@ export default async function ProgramDetailPage({ params }: ProgramDetailPagePro
</Card>
)}
{(() => {
const comp = (program as any).competitions?.[0]
if (!comp) return null
return (
<CompetitionSettings
competitionId={comp.id}
initialSettings={{
categoryMode: comp.categoryMode ?? 'SHARED',
startupFinalistCount: comp.startupFinalistCount ?? 3,
conceptFinalistCount: comp.conceptFinalistCount ?? 3,
notifyOnRoundAdvance: comp.notifyOnRoundAdvance ?? true,
notifyOnDeadlineApproach: comp.notifyOnDeadlineApproach ?? true,
deadlineReminderDays: comp.deadlineReminderDays ?? [7, 3, 1],
}}
/>
)
})()}
<Card>
<CardHeader className="flex flex-row items-center justify-between">
<div>
@@ -93,9 +112,9 @@ export default async function ProgramDetailPage({ params }: ProgramDetailPagePro
</CardDescription>
</div>
<Button asChild>
<Link href={`/admin/competitions?programId=${id}` as Route}>
<Link href={'/admin/rounds' as Route}>
<Plus className="mr-2 h-4 w-4" />
Manage Competitions
Manage Rounds
</Link>
</Button>
</CardHeader>