"use client" import { useState, useEffect } from "react" import { ProtectedRoute } from "@/components/protected-route" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Badge } from "@/components/ui/badge" import { Brain, Lightbulb, BarChart3, ArrowLeft, Search, Download, Filter } from "lucide-react" import Link from "next/link" import { useAuth, type User } from "@/lib/hooks/use-auth" interface TestResult { userId: string userName: string userDepartment: string type: "logic" | "creative" | "combined" score: number completedAt: string details?: any } export default function AdminResultsPage() { return ( ) } function AdminResultsContent() { const { user } = useAuth() const [results, setResults] = useState([]) const [filteredResults, setFilteredResults] = useState([]) const [users, setUsers] = useState([]) const [searchTerm, setSearchTerm] = useState("") const [departmentFilter, setDepartmentFilter] = useState("all") const [testTypeFilter, setTestTypeFilter] = useState("all") const [stats, setStats] = useState({ totalResults: 0, averageScore: 0, totalUsers: 0, completionRate: 0, }) const departments = ["人力資源部", "資訊技術部", "財務部", "行銷部", "業務部", "研發部", "客服部", "其他"] useEffect(() => { loadData() }, []) useEffect(() => { filterResults() }, [results, searchTerm, departmentFilter, testTypeFilter]) const loadData = () => { // Load users const usersData = JSON.parse(localStorage.getItem("hr_users") || "[]") setUsers(usersData) // Load all test results const allResults: TestResult[] = [] usersData.forEach((user: User) => { // Check for logic test results const logicKey = `logicTestResults_${user.id}` const logicResults = localStorage.getItem(logicKey) if (logicResults) { const data = JSON.parse(logicResults) allResults.push({ userId: user.id, userName: user.name, userDepartment: user.department, type: "logic", score: data.score, completedAt: data.completedAt, details: data, }) } // Check for creative test results const creativeKey = `creativeTestResults_${user.id}` const creativeResults = localStorage.getItem(creativeKey) if (creativeResults) { const data = JSON.parse(creativeResults) allResults.push({ userId: user.id, userName: user.name, userDepartment: user.department, type: "creative", score: data.score, completedAt: data.completedAt, details: data, }) } // Check for combined test results const combinedKey = `combinedTestResults_${user.id}` const combinedResults = localStorage.getItem(combinedKey) if (combinedResults) { const data = JSON.parse(combinedResults) allResults.push({ userId: user.id, userName: user.name, userDepartment: user.department, type: "combined", score: data.overallScore, completedAt: data.completedAt, details: data, }) } }) // Sort by completion date (newest first) allResults.sort((a, b) => new Date(b.completedAt).getTime() - new Date(a.completedAt).getTime()) setResults(allResults) // Calculate statistics const totalResults = allResults.length const averageScore = totalResults > 0 ? Math.round(allResults.reduce((sum, r) => sum + r.score, 0) / totalResults) : 0 const totalUsers = usersData.length const usersWithResults = new Set(allResults.map((r) => r.userId)).size const completionRate = totalUsers > 0 ? Math.round((usersWithResults / totalUsers) * 100) : 0 setStats({ totalResults, averageScore, totalUsers, completionRate, }) } const filterResults = () => { let filtered = results // Filter by search term (user name) if (searchTerm) { filtered = filtered.filter((result) => result.userName.toLowerCase().includes(searchTerm.toLowerCase())) } // Filter by department if (departmentFilter !== "all") { filtered = filtered.filter((result) => result.userDepartment === departmentFilter) } // Filter by test type if (testTypeFilter !== "all") { filtered = filtered.filter((result) => result.type === testTypeFilter) } setFilteredResults(filtered) } const getTestTypeInfo = (type: string) => { switch (type) { case "logic": return { name: "邏輯思維", icon: Brain, color: "bg-primary", textColor: "text-primary", } case "creative": return { name: "創意能力", icon: Lightbulb, color: "bg-accent", textColor: "text-accent", } case "combined": return { name: "綜合能力", icon: BarChart3, color: "bg-gradient-to-r from-primary to-accent", textColor: "text-primary", } default: return { name: "未知", icon: BarChart3, color: "bg-muted", textColor: "text-muted-foreground", } } } const getScoreLevel = (score: number) => { if (score >= 90) return { level: "優秀", color: "bg-green-500" } if (score >= 80) return { level: "良好", color: "bg-blue-500" } if (score >= 70) return { level: "中等", color: "bg-yellow-500" } if (score >= 60) return { level: "及格", color: "bg-orange-500" } return { level: "不及格", color: "bg-red-500" } } const exportResults = () => { const csvContent = [ ["姓名", "部門", "測試類型", "分數", "等級", "完成時間"], ...filteredResults.map((result) => [ result.userName, result.userDepartment, getTestTypeInfo(result.type).name, result.score.toString(), getScoreLevel(result.score).level, new Date(result.completedAt).toLocaleString("zh-TW"), ]), ] .map((row) => row.join(",")) .join("\n") const blob = new Blob(["\uFEFF" + csvContent], { type: "text/csv;charset=utf-8;" }) const link = document.createElement("a") const url = URL.createObjectURL(blob) link.setAttribute("href", url) link.setAttribute("download", `測試結果_${new Date().toISOString().split("T")[0]}.csv`) link.style.visibility = "hidden" document.body.appendChild(link) link.click() document.body.removeChild(link) } return (
{/* Header */}

所有測試結果

查看和分析所有員工的測試結果

{/* Statistics Overview */}
{stats.totalResults}
總測試次數
{stats.averageScore}
平均分數
{stats.totalUsers}
總用戶數
{stats.completionRate}%
參與率
{/* Filters */} 篩選條件
setSearchTerm(e.target.value)} className="pl-10" />
{/* Results Table */} 測試結果列表 顯示 {filteredResults.length} 筆結果(共 {results.length} 筆) 用戶 部門 測試類型 分數 等級 完成時間 {filteredResults.map((result, index) => { const testInfo = getTestTypeInfo(result.type) const scoreLevel = getScoreLevel(result.score) const Icon = testInfo.icon return (
{result.userName}
{result.userDepartment}
{testInfo.name}
{result.score}
{scoreLevel.level}
{new Date(result.completedAt).toLocaleString("zh-TW")}
) })}
{filteredResults.length === 0 && (
沒有找到符合條件的測試結果
)}
) }