import Link from "next/link"; import { FolderKanban } from "lucide-react"; import { requireAdmin } from "@/lib/session"; import { listProjects, pageNum, str } from "@/lib/queries/admin"; import { formatNumber, formatUsd } from "@/lib/format"; import { PageHeader } from "@/components/ui/page-header"; import { Badge } from "@/components/ui/badge"; import { EmptyState } from "@/components/ui/empty-state"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { DateCell, Mono, Pagination, Panel, PlanBadge, SearchForm, numCell } from "@/components/admin/primitives"; export const dynamic = "force-dynamic"; export default async function AdminProjectsPage({ searchParams }: { searchParams: Promise> }) { await requireAdmin(); const sp = await searchParams; const q = str(sp.q); const archived = str(sp.archived) === "1"; const page = pageNum(sp.page); const data = await listProjects({ q: q || undefined, page, includeArchived: archived }); return ( <> } /> {data.total === 0 ? (
) : ( <> Project Organization Env Requests 30d Spend 30d Keys Created Status {data.rows.map((p) => ( {p.name}
{p.id}
{p.orgName} {p.environment} {formatNumber(p.requests30d)} {formatUsd(p.spend30d)} {p.keys} {p.archivedAt ? archived : active}
))}
)}
); }