Fix quiz attempts page: fetch users separately (no User relation on QuizAttempt)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -13,20 +13,13 @@ export default async function AdminQuizAttemptsPage({ params }: Props) {
|
|||||||
where: { id: quizId },
|
where: { id: quizId },
|
||||||
include: {
|
include: {
|
||||||
questions: { orderBy: { order: "asc" } },
|
questions: { orderBy: { order: "asc" } },
|
||||||
attempts: {
|
attempts: { orderBy: { completedAt: "desc" } },
|
||||||
orderBy: { completedAt: "desc" },
|
|
||||||
include: {
|
|
||||||
user: { select: { name: true, email: true } },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
lesson: {
|
lesson: {
|
||||||
select: {
|
select: {
|
||||||
id: true,
|
|
||||||
title: true,
|
title: true,
|
||||||
module: {
|
module: {
|
||||||
select: {
|
select: {
|
||||||
id: true,
|
course: { select: { title: true } },
|
||||||
course: { select: { id: true, title: true } },
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -36,8 +29,12 @@ export default async function AdminQuizAttemptsPage({ params }: Props) {
|
|||||||
|
|
||||||
if (!quiz) notFound();
|
if (!quiz) notFound();
|
||||||
|
|
||||||
const courseId = quiz.lesson.module.course.id;
|
const userIds = [...new Set(quiz.attempts.map((a) => a.userId))];
|
||||||
const moduleId = quiz.lesson.module.id;
|
const users = await prisma.user.findMany({
|
||||||
|
where: { id: { in: userIds } },
|
||||||
|
select: { id: true, name: true, email: true },
|
||||||
|
});
|
||||||
|
const userMap = Object.fromEntries(users.map((u) => [u.id, u]));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="p-8 max-w-4xl">
|
<div className="p-8 max-w-4xl">
|
||||||
@@ -67,6 +64,7 @@ export default async function AdminQuizAttemptsPage({ params }: Props) {
|
|||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
{quiz.attempts.map((attempt) => {
|
{quiz.attempts.map((attempt) => {
|
||||||
const answers = attempt.answers as Record<string, string>;
|
const answers = attempt.answers as Record<string, string>;
|
||||||
|
const user = userMap[attempt.userId];
|
||||||
const date = new Date(attempt.completedAt).toLocaleString("ru-RU", {
|
const date = new Date(attempt.completedAt).toLocaleString("ru-RU", {
|
||||||
day: "2-digit",
|
day: "2-digit",
|
||||||
month: "2-digit",
|
month: "2-digit",
|
||||||
@@ -83,9 +81,9 @@ export default async function AdminQuizAttemptsPage({ params }: Props) {
|
|||||||
>
|
>
|
||||||
<div className="flex items-center justify-between gap-2">
|
<div className="flex items-center justify-between gap-2">
|
||||||
<div>
|
<div>
|
||||||
<p className="text-sm font-medium">{attempt.user.name}</p>
|
<p className="text-sm font-medium">{user?.name ?? "—"}</p>
|
||||||
<p className="text-xs" style={{ color: "var(--muted-foreground)" }}>
|
<p className="text-xs" style={{ color: "var(--muted-foreground)" }}>
|
||||||
{attempt.user.email}
|
{user?.email ?? attempt.userId}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<span className="text-xs" style={{ color: "var(--muted-foreground)" }}>
|
<span className="text-xs" style={{ color: "var(--muted-foreground)" }}>
|
||||||
@@ -93,7 +91,7 @@ export default async function AdminQuizAttemptsPage({ params }: Props) {
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="space-y-2 pt-1" style={{ borderTop: "1px solid var(--border)" }}>
|
<div className="space-y-2 pt-2" style={{ borderTop: "1px solid var(--border)" }}>
|
||||||
{quiz.questions.map((q, idx) => (
|
{quiz.questions.map((q, idx) => (
|
||||||
<div key={q.id}>
|
<div key={q.id}>
|
||||||
<p
|
<p
|
||||||
|
|||||||
Reference in New Issue
Block a user