修正完整的管理者查看詳細功能

This commit is contained in:
2025-10-04 21:23:43 +08:00
parent 8965ec85f7
commit 40562c1bbd
3 changed files with 415 additions and 79 deletions

View File

@@ -55,6 +55,7 @@ interface Question {
userAnswer?: string | number
isCorrect?: boolean
score?: number
category?: 'innovation' | 'imagination' | 'flexibility' | 'originality'
created_at: string
}
@@ -394,82 +395,94 @@ function AdminResultDetailContent() {
</CardContent>
</Card>
{/* Score Overview */}
<Card className="text-center">
<CardHeader>
<div
className={`w-24 h-24 ${scoreLevel.color} rounded-full flex items-center justify-center mx-auto mb-4`}
>
<span className="text-3xl font-bold text-white">{result.score}</span>
</div>
<CardTitle className="text-3xl mb-2"></CardTitle>
<div className="flex items-center justify-center gap-2 mb-4">
<Badge variant="secondary" className="text-lg px-4 py-1">
{scoreLevel.level}
</Badge>
</div>
<p className="text-lg text-muted-foreground mb-3">{scoreLevel.description}</p>
<div className="bg-muted/50 rounded-lg p-4 text-sm">
<p className="text-muted-foreground">
<span className="font-medium">👉 </span>
{scoreLevel.suggestion}
</p>
</div>
</CardHeader>
<CardContent>
<div className="grid grid-cols-3 gap-4 mb-6">
{result.type === 'creative' ? (
<>
<div className="text-center">
<div className="text-2xl font-bold text-green-600 mb-1">{displayTotalScore}</div>
<div className="text-xs text-muted-foreground"></div>
{/* Logic Test Overview */}
{result.type === 'logic' && (
<Card className="text-center mb-6">
<CardHeader>
<div
className={`w-24 h-24 ${scoreLevel.color} rounded-full flex items-center justify-center mx-auto mb-4`}
>
<span className="text-3xl font-bold text-white">{result.score}</span>
</div>
<CardTitle className="text-3xl mb-2"></CardTitle>
<div className="flex items-center justify-center gap-2 mb-4">
<Badge variant="secondary" className="text-lg px-4 py-1">
{scoreLevel.level}
</Badge>
</div>
<p className="text-lg text-muted-foreground mb-3">{scoreLevel.description}</p>
<div className="bg-muted/50 rounded-lg p-4 text-sm">
<p className="text-muted-foreground">
<span className="font-medium">👉 </span>
{scoreLevel.suggestion}
</p>
</div>
</CardHeader>
<CardContent>
<div className="grid grid-cols-3 gap-4 mb-6">
<div className="text-center">
<div className="text-2xl font-bold text-green-600 mb-1">{correctAnswers}</div>
<div className="text-xs text-muted-foreground"></div>
</div>
<div className="text-center">
<div className="text-2xl font-bold text-primary mb-1">{totalQuestions}</div>
<div className="text-xs text-muted-foreground"></div>
</div>
<div className="text-center">
<div className="text-2xl font-bold text-accent mb-1">
{totalQuestions > 0 ? Math.round((correctAnswers / totalQuestions) * 100) : 0}%
</div>
<div className="text-center">
<div className="text-2xl font-bold text-primary mb-1">{displayMaxScore}</div>
<div className="text-xs text-muted-foreground">滿</div>
</div>
<div className="text-center">
<div className="text-2xl font-bold text-accent mb-1">
{displayScorePercentage}%
</div>
<div className="text-xs text-muted-foreground"></div>
</div>
</>
) : (
<>
<div className="text-center">
<div className="text-2xl font-bold text-green-600 mb-1">{correctAnswers}</div>
<div className="text-xs text-muted-foreground"></div>
</div>
<div className="text-center">
<div className="text-2xl font-bold text-primary mb-1">{totalQuestions}</div>
<div className="text-xs text-muted-foreground"></div>
</div>
<div className="text-center">
<div className="text-2xl font-bold text-accent mb-1">
{totalQuestions > 0 ? Math.round((correctAnswers / totalQuestions) * 100) : 0}%
</div>
<div className="text-xs text-muted-foreground"></div>
</div>
</>
)}
</div>
<Progress value={result.score} className="h-3 mb-4" />
</CardContent>
</Card>
<div className="text-xs text-muted-foreground"></div>
</div>
</div>
<Progress value={result.score} className="h-3 mb-4" />
</CardContent>
</Card>
)}
{/* Combined Test Analysis */}
{result.type === 'combined' && result.details && (
<CombinedAnalysis
overallScore={result.score}
logicScore={result.details.logicScore}
creativityScore={result.details.creativeScore}
balanceScore={result.details.abilityBalance}
level={getScoreLevel(result.score, result.type).level}
description={getScoreLevel(result.score, result.type).description}
logicBreakdown={result.details.breakdown}
creativityBreakdown={result.details.breakdown}
/>
{/* Creative Test Overview */}
{result.type === 'creative' && (
<Card className="text-center mb-6">
<CardHeader>
<div
className={`w-24 h-24 ${scoreLevel.color} rounded-full flex items-center justify-center mx-auto mb-4`}
>
<span className="text-3xl font-bold text-white">{result.score}</span>
</div>
<CardTitle className="text-3xl mb-2"></CardTitle>
<div className="flex items-center justify-center gap-2 mb-4">
<Badge variant="secondary" className="text-lg px-4 py-1">
{scoreLevel.level}
</Badge>
</div>
<p className="text-lg text-muted-foreground mb-3">{scoreLevel.description}</p>
<div className="bg-muted/50 rounded-lg p-4 text-sm">
<p className="text-muted-foreground">
<span className="font-medium">👉 </span>
{scoreLevel.suggestion}
</p>
</div>
</CardHeader>
<CardContent>
<div className="grid grid-cols-3 gap-4 mb-6">
<div className="text-center">
<div className="text-2xl font-bold text-green-600 mb-1">{displayTotalScore}</div>
<div className="text-xs text-muted-foreground"></div>
</div>
<div className="text-center">
<div className="text-2xl font-bold text-primary mb-1">{displayMaxScore}</div>
<div className="text-xs text-muted-foreground">滿</div>
</div>
<div className="text-center">
<div className="text-2xl font-bold text-accent mb-1">
{displayScorePercentage}%
</div>
<div className="text-xs text-muted-foreground"></div>
</div>
</div>
<Progress value={result.score} className="h-3 mb-4" />
</CardContent>
</Card>
)}
{/* Creative Analysis for Creative Tests */}
@@ -483,6 +496,31 @@ function AdminResultDetailContent() {
/>
)}
{/* Combined Test Analysis */}
{result.type === 'combined' && result.details && (
<CombinedAnalysis
overallScore={result.score}
logicScore={result.details.logicScore || 0}
creativityScore={result.details.creativeScore || 0}
balanceScore={result.details.abilityBalance || 0}
level={getScoreLevel(result.score, result.type).level}
description={getScoreLevel(result.score, result.type).description}
logicBreakdown={result.details.breakdown}
creativityBreakdown={result.details.breakdown}
// 個別測試結果的詳細資料
logicCorrectAnswers={logicQuestions.filter(q => q.isCorrect).length}
logicTotalQuestions={logicQuestions.length}
logicLevel={getScoreLevel(result.details.logicScore || 0, 'logic').level}
logicDescription={getScoreLevel(result.details.logicScore || 0, 'logic').description}
logicSuggestion={getScoreLevel(result.details.logicScore || 0, 'logic').suggestion}
creativityTotalScore={creativeQuestions.reduce((sum, q) => sum + (q.score || 0), 0)}
creativityMaxScore={creativeQuestions.length * 5}
creativityLevel={getScoreLevel(result.details.creativeScore || 0, 'creative').level}
creativityDescription={getScoreLevel(result.details.creativeScore || 0, 'creative').description}
creativitySuggestion={getScoreLevel(result.details.creativeScore || 0, 'creative').suggestion}
/>
)}
{/* Detailed Results */}
{questions.length > 0 && (
<Card>
@@ -571,7 +609,7 @@ function AdminResultDetailContent() {
</h3>
<div className="space-y-4">
{creativeQuestions.map((question, index) => {
const dimensionInfo = getDimensionInfo(question.category)
const dimensionInfo = getDimensionInfo(question.category || 'innovation')
return (
<div key={question.id} className={`border rounded-lg p-3 sm:p-4 ${dimensionInfo.borderColor} bg-opacity-30`} style={{ backgroundColor: `${dimensionInfo.color.replace('bg-', '')}10` }}>
<div className="flex items-start justify-between mb-2 sm:mb-3">