Initial commit: FL-Akademie LMS mit Docker, Admin, Portal und Dokumentation.

Made-with: Cursor
This commit is contained in:
lo
2026-04-13 23:17:07 +02:00
commit d3367f0046
66 changed files with 3641 additions and 0 deletions

View File

@@ -0,0 +1,54 @@
import Link from "next/link";
import { prisma } from "@/lib/prisma";
import { requireSession } from "@/lib/session-helpers";
export default async function PortalCertificatesPage() {
const session = await requireSession();
const rows = await prisma.certificate.findMany({
where: { userId: session.user.id },
orderBy: { issuedAt: "desc" },
include: { course: { select: { title: true, slug: true } } },
});
return (
<div>
<h1 className="page-title">Zertifikate</h1>
<p className="muted subtitle">Teilnahmebestätigungen nach vollständigem Kursabschluss.</p>
{rows.length === 0 ? (
<div className="panel">
<p className="muted">Noch keine Zertifikate schließe zuerst alle Lektionen eines Kurses ab.</p>
<Link href="/portal" className="btn btn-primary">
Zu deinen Kursen
</Link>
</div>
) : (
<div className="table-wrap">
<table className="simple">
<thead>
<tr>
<th>Kurs</th>
<th>Ausgestellt</th>
<th>Code</th>
<th />
</tr>
</thead>
<tbody>
{rows.map((r) => (
<tr key={r.id}>
<td>{r.course.title}</td>
<td className="muted">{r.issuedAt.toLocaleDateString("de-DE")}</td>
<td className="muted">{r.code}</td>
<td>
<Link href={`/zertifikat/${r.code}`}>Ansehen / Drucken</Link>
</td>
</tr>
))}
</tbody>
</table>
</div>
)}
</div>
);
}