feat(classes): optimize teacher dashboard ui and implement grade management
This commit is contained in:
@@ -1,9 +1,5 @@
|
||||
"use client"
|
||||
|
||||
import { ScrollArea } from "@/shared/components/ui/scroll-area"
|
||||
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/shared/components/ui/dialog"
|
||||
import { Button } from "@/shared/components/ui/button"
|
||||
import { Eye, Printer } from "lucide-react"
|
||||
import type { ExamNode } from "./selected-question-list"
|
||||
|
||||
type ChoiceOption = {
|
||||
@@ -86,55 +82,33 @@ export function ExamPaperPreview({ title, subject, grade, durationMin, totalScor
|
||||
}
|
||||
|
||||
return (
|
||||
<Dialog>
|
||||
<DialogTrigger asChild>
|
||||
<Button variant="secondary" size="sm" className="gap-2">
|
||||
<Eye className="h-4 w-4" />
|
||||
Preview Exam
|
||||
</Button>
|
||||
</DialogTrigger>
|
||||
<DialogContent className="max-w-4xl h-[90vh] flex flex-col p-0 gap-0">
|
||||
<DialogHeader className="p-6 pb-2 border-b shrink-0">
|
||||
<div className="flex items-center justify-between">
|
||||
<DialogTitle>Exam Preview</DialogTitle>
|
||||
<Button variant="outline" size="sm" onClick={() => window.print()} className="hidden">
|
||||
<Printer className="h-4 w-4 mr-2" />
|
||||
Print
|
||||
</Button>
|
||||
</div>
|
||||
</DialogHeader>
|
||||
|
||||
<ScrollArea className="flex-1 p-8 bg-white/50 dark:bg-zinc-950/50">
|
||||
<div className="max-w-3xl mx-auto bg-card shadow-sm border p-12 min-h-[1000px] print:shadow-none print:border-none">
|
||||
{/* Header */}
|
||||
<div className="text-center space-y-4 mb-12 border-b-2 border-primary/20 pb-8">
|
||||
<h1 className="text-3xl font-black tracking-tight text-foreground">{title}</h1>
|
||||
<div className="flex justify-center gap-8 text-sm text-muted-foreground font-medium uppercase tracking-wide">
|
||||
<span>Subject: {subject}</span>
|
||||
<span>Grade: {grade}</span>
|
||||
<span>Time: {durationMin} mins</span>
|
||||
<span>Total: {totalScore} pts</span>
|
||||
</div>
|
||||
<div className="flex justify-center gap-12 text-sm pt-4">
|
||||
<div className="w-32 border-b border-foreground/20 text-left px-1">Class:</div>
|
||||
<div className="w-32 border-b border-foreground/20 text-left px-1">Name:</div>
|
||||
<div className="w-32 border-b border-foreground/20 text-left px-1">No.:</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="bg-card shadow-sm border p-12 print:shadow-none print:border-none">
|
||||
{/* Header */}
|
||||
<div className="text-center space-y-4 mb-12 border-b-2 border-primary/20 pb-8">
|
||||
<h1 className="text-3xl font-black tracking-tight text-foreground">{title}</h1>
|
||||
<div className="flex justify-center gap-8 text-sm text-muted-foreground font-medium uppercase tracking-wide">
|
||||
<span>Subject: {subject}</span>
|
||||
<span>Grade: {grade}</span>
|
||||
<span>Time: {durationMin} mins</span>
|
||||
<span>Total: {totalScore} pts</span>
|
||||
</div>
|
||||
<div className="flex justify-center gap-12 text-sm pt-4">
|
||||
<div className="w-32 border-b border-foreground/20 text-left px-1">Class:</div>
|
||||
<div className="w-32 border-b border-foreground/20 text-left px-1">Name:</div>
|
||||
<div className="w-32 border-b border-foreground/20 text-left px-1">No.:</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Content */}
|
||||
<div className="space-y-2">
|
||||
{nodes.length === 0 ? (
|
||||
<div className="text-center py-20 text-muted-foreground">
|
||||
Empty Exam Paper
|
||||
</div>
|
||||
) : (
|
||||
nodes.map(node => renderNode(node))
|
||||
)}
|
||||
</div>
|
||||
{/* Content */}
|
||||
<div className="space-y-2">
|
||||
{nodes.length === 0 ? (
|
||||
<div className="text-center py-20 text-muted-foreground">
|
||||
Empty Exam Paper
|
||||
</div>
|
||||
</ScrollArea>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
) : (
|
||||
nodes.map(node => renderNode(node))
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user