import { Suspense } from 'react' import Link from 'next/link' import type { Route } from 'next' import { prisma } from '@/lib/prisma' export const dynamic = 'force-dynamic' import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Skeleton } from '@/components/ui/skeleton' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { Plus, MoreHorizontal, FolderKanban, Eye, Pencil, Copy, } from 'lucide-react' import { formatDateOnly } from '@/lib/utils' async function ProgramsContent() { const programs = await prisma.program.findMany({ // Note: PROGRAM_ADMIN filtering should be handled via middleware or a separate relation include: { pipelines: { include: { tracks: { include: { stages: { select: { id: true, status: true }, }, }, }, }, }, }, orderBy: { createdAt: 'desc' }, }) // Flatten stages per program for convenience const programsWithStageCounts = programs.map((p) => { const allStages = p.pipelines.flatMap((pl) => pl.tracks.flatMap((t) => t.stages) ) const activeStages = allStages.filter((s) => s.status === 'STAGE_ACTIVE') return { ...p, stageCount: allStages.length, activeStageCount: activeStages.length } }) if (programsWithStageCounts.length === 0) { return (

No programs yet

Create your first program to start managing projects and rounds

) } const statusColors: Record = { ACTIVE: 'default', COMPLETED: 'success', DRAFT: 'secondary', ARCHIVED: 'secondary', } return ( <> {/* Desktop table view */} Program Year Stages Status Created Actions {programsWithStageCounts.map((program) => (

{program.name}

{program.description && (

{program.description}

)}
{program.year}

{program.stageCount} total

{program.activeStageCount > 0 && (

{program.activeStageCount} active

)}
{program.status} {formatDateOnly(program.createdAt)} View Details Edit Apply Settings
))}
{/* Mobile card view */}
{programsWithStageCounts.map((program) => (
{program.name} {program.year}
{program.status}
Stages {program.stageCount} ({program.activeStageCount} active)
Created {formatDateOnly(program.createdAt)}
))}
) } function ProgramsSkeleton() { return (
{[...Array(5)].map((_, i) => (
))}
) } export default function ProgramsPage() { return (
{/* Header */}

Programs

Manage your ocean protection programs

{/* Content */} }>
) }