Decouple projects from rounds with RoundProject join table
Projects now exist at the program level instead of being locked to a single round. A new RoundProject join table enables many-to-many relationships with per-round status tracking. Rounds have sortOrder for configurable progression paths. - Add RoundProject model, programId on Project, sortOrder on Round - Migration preserves existing data (roundId -> RoundProject entries) - Update all routers to query through RoundProject join - Add assign/remove/advance/reorder round endpoints - Add Assign, Advance, Remove Projects dialogs on round detail page - Add round reorder controls (up/down arrows) on rounds list - Show all rounds on project detail page Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -149,18 +149,24 @@ export default function MentorDashboard() {
|
||||
<div className="space-y-1">
|
||||
<div className="flex items-center gap-2 text-sm text-muted-foreground">
|
||||
<span>
|
||||
{project.round.program.year} Edition
|
||||
{project.program.year} Edition
|
||||
</span>
|
||||
<span>•</span>
|
||||
<span>{project.round.name}</span>
|
||||
{project.roundProjects?.[0]?.round && (
|
||||
<>
|
||||
<span>•</span>
|
||||
<span>{project.roundProjects[0].round.name}</span>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
<CardTitle className="flex items-center gap-2">
|
||||
{project.title}
|
||||
<Badge
|
||||
variant={statusColors[project.status] || 'secondary'}
|
||||
>
|
||||
{project.status.replace('_', ' ')}
|
||||
</Badge>
|
||||
{project.roundProjects?.[0]?.status && (
|
||||
<Badge
|
||||
variant={statusColors[project.roundProjects[0].status] || 'secondary'}
|
||||
>
|
||||
{project.roundProjects[0].status.replace('_', ' ')}
|
||||
</Badge>
|
||||
)}
|
||||
</CardTitle>
|
||||
{project.teamName && (
|
||||
<CardDescription>{project.teamName}</CardDescription>
|
||||
|
||||
@@ -109,18 +109,24 @@ function ProjectDetailContent({ projectId }: { projectId: string }) {
|
||||
<div className="space-y-1">
|
||||
<div className="flex items-center gap-2 text-sm text-muted-foreground">
|
||||
<span>
|
||||
{project.round.program.year} Edition
|
||||
{project.program.year} Edition
|
||||
</span>
|
||||
<span>•</span>
|
||||
<span>{project.round.name}</span>
|
||||
{project.roundProjects?.[0]?.round && (
|
||||
<>
|
||||
<span>•</span>
|
||||
<span>{project.roundProjects[0].round.name}</span>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex items-center gap-3">
|
||||
<h1 className="text-2xl font-semibold tracking-tight">
|
||||
{project.title}
|
||||
</h1>
|
||||
<Badge variant={statusColors[project.status] || 'secondary'}>
|
||||
{project.status.replace('_', ' ')}
|
||||
</Badge>
|
||||
{project.roundProjects?.[0]?.status && (
|
||||
<Badge variant={statusColors[project.roundProjects[0].status] || 'secondary'}>
|
||||
{project.roundProjects[0].status.replace('_', ' ')}
|
||||
</Badge>
|
||||
)}
|
||||
</div>
|
||||
{project.teamName && (
|
||||
<p className="text-muted-foreground">{project.teamName}</p>
|
||||
|
||||
@@ -94,16 +94,22 @@ export default function MentorProjectsPage() {
|
||||
<div className="space-y-1">
|
||||
<div className="flex items-center gap-2 text-sm text-muted-foreground">
|
||||
<span>
|
||||
{project.round.program.year} Edition
|
||||
{project.program.year} Edition
|
||||
</span>
|
||||
<span>•</span>
|
||||
<span>{project.round.name}</span>
|
||||
{project.roundProjects?.[0]?.round && (
|
||||
<>
|
||||
<span>•</span>
|
||||
<span>{project.roundProjects[0].round.name}</span>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
<CardTitle className="flex items-center gap-2">
|
||||
{project.title}
|
||||
<Badge variant={statusColors[project.status] || 'secondary'}>
|
||||
{project.status.replace('_', ' ')}
|
||||
</Badge>
|
||||
{project.roundProjects?.[0]?.status && (
|
||||
<Badge variant={statusColors[project.roundProjects[0].status] || 'secondary'}>
|
||||
{project.roundProjects[0].status.replace('_', ' ')}
|
||||
</Badge>
|
||||
)}
|
||||
</CardTitle>
|
||||
{project.teamName && (
|
||||
<CardDescription>{project.teamName}</CardDescription>
|
||||
|
||||
Reference in New Issue
Block a user