feat(classes): optimize teacher dashboard ui and implement grade management

This commit is contained in:
SpecialX
2026-01-14 13:59:11 +08:00
parent ade8d4346c
commit 9bfc621d3f
104 changed files with 12793 additions and 2309 deletions

View File

@@ -68,6 +68,10 @@ export const getExams = cache(async (params: GetExamsParams) => {
const data = await db.query.exams.findMany({
where: conditions.length ? and(...conditions) : undefined,
orderBy: [desc(exams.createdAt)],
with: {
subject: true,
gradeEntity: true,
}
})
// Transform and Filter (especially for JSON fields)
@@ -78,8 +82,8 @@ export const getExams = cache(async (params: GetExamsParams) => {
id: exam.id,
title: exam.title,
status: (exam.status as ExamStatus) || "draft",
subject: getString(meta, "subject") || "General",
grade: getString(meta, "grade") || "General",
subject: exam.subject?.name ?? getString(meta, "subject") ?? "General",
grade: exam.gradeEntity?.name ?? getString(meta, "grade") ?? "General",
difficulty: toExamDifficulty(getNumber(meta, "difficulty")),
totalScore: getNumber(meta, "totalScore") || 100,
durationMin: getNumber(meta, "durationMin") || 60,
@@ -103,6 +107,8 @@ export const getExamById = cache(async (id: string) => {
const exam = await db.query.exams.findFirst({
where: eq(exams.id, id),
with: {
subject: true,
gradeEntity: true,
questions: {
orderBy: (examQuestions, { asc }) => [asc(examQuestions.order)],
with: {
@@ -120,8 +126,8 @@ export const getExamById = cache(async (id: string) => {
id: exam.id,
title: exam.title,
status: (exam.status as ExamStatus) || "draft",
subject: getString(meta, "subject") || "General",
grade: getString(meta, "grade") || "General",
subject: exam.subject?.name ?? getString(meta, "subject") ?? "General",
grade: exam.gradeEntity?.name ?? getString(meta, "grade") ?? "General",
difficulty: toExamDifficulty(getNumber(meta, "difficulty")),
totalScore: getNumber(meta, "totalScore") || 100,
durationMin: getNumber(meta, "durationMin") || 60,
@@ -137,3 +143,18 @@ export const getExamById = cache(async (id: string) => {
})),
}
})
export const omitScheduledAtFromDescription = (description: string | null): string => {
if (!description) return "{}"
try {
const meta = JSON.parse(description)
if (typeof meta === "object" && meta !== null) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const { scheduledAt, ...rest } = meta as any
return JSON.stringify(rest)
}
return description
} catch {
return description || "{}"
}
}