import { notFound } from "next/navigation"; import Link from "next/link"; import { db } from "@/lib/db"; import { auth } from "@/auth"; import { Badge } from "@/components/ui/badge"; import { ProjectTabsClient } from "./ProjectTabsClient"; import { Film, Layers, CheckCircle2, ListTodo, } from "lucide-react"; export async function generateMetadata({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; const project = await db.project.findUnique({ where: { id }, select: { name: true } }); return { title: project?.name ?? "Project" }; } async function getProject(id: string) { return db.project.findUnique({ where: { id }, include: { client: true, producer: { select: { id: true, name: true, image: true, email: true } }, supervisor: { select: { id: true, name: true, image: true, email: true } }, shots: { orderBy: { createdAt: "asc" }, include: { artist: { select: { id: true, name: true, image: true, email: true } }, versions: { take: 1, orderBy: { versionNumber: "desc" }, include: { comments: { select: { id: true, isResolved: true } }, }, }, }, }, assets: { orderBy: { assetCode: "asc" }, include: { lead: { select: { id: true, name: true, email: true, image: true } }, _count: { select: { tasks: true } }, tasks: { orderBy: { sortOrder: "asc" }, include: { assignedArtist: { select: { id: true, name: true, email: true, image: true } }, _count: { select: { versions: true } }, versions: { take: 1, orderBy: { versionNumber: "desc" }, select: { id: true, versionNumber: true, approvalStatus: true, createdAt: true }, }, }, }, }, }, tasks: { orderBy: [{ status: "asc" }, { sortOrder: "asc" }], include: { shot: { select: { id: true, shotCode: true } }, asset: { select: { id: true, assetCode: true, name: true } }, assignedArtist: { select: { id: true, name: true, email: true, image: true } }, _count: { select: { versions: true } }, versions: { take: 1, orderBy: { versionNumber: "desc" }, select: { id: true, versionNumber: true, approvalStatus: true, createdAt: true }, }, }, }, }, }); } async function getProjectArtists() { return db.user.findMany({ where: { isActive: true }, select: { id: true, name: true, email: true }, orderBy: { name: "asc" }, }); } async function getClients() { return db.client.findMany({ where: { isActive: true }, select: { id: true, company: true }, orderBy: { company: "asc" }, }); } async function getTeamMembers() { return db.user.findMany({ where: { isActive: true, role: { in: ["ADMIN", "PRODUCER", "SUPERVISOR"] } }, select: { id: true, name: true, email: true, role: true }, orderBy: { name: "asc" }, }); } export default async function ProjectPage({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; const session = await auth(); const [project, artists, clients, teamMembers] = await Promise.all([ getProject(id), getProjectArtists(), getClients(), getTeamMembers(), ]); if (!project) notFound(); const canManage = session?.user && ["ADMIN", "PRODUCER", "SUPERVISOR"].includes(session.user.role); const totalShots = project.shots.length; const approvedShots = project.shots.filter((s) => s.status === "COMPLETE").length; const totalTasks = project.tasks.length; const doneTasks = project.tasks.filter((t) => t.status === "DONE").length; return (
{/* Breadcrumb */}
Projects / {project.name}
{/* Header */}
{project.code} {project.client && ( • {project.client.company} )} {project.status.replace("_", " ")}

{project.name}

{project.description && (

{project.description}

)}
{/* Stats row */}
{totalShots} shots
{approvedShots} approved
{totalTasks} tasks
{doneTasks} done
{/* Tabs */}
); }