'use client' import { useState, useEffect, useCallback, useMemo } from 'react' import { useRouter, useParams } from 'next/navigation' import { useTheme } from '@/lib/ThemeContext' import { Sidebar } from '@/components/Sidebar' import { ThemeToggle } from '@/components/ThemeToggle' import { LanguageDropdown } from '@/components/LanguageDropdown' import { korrekturApi } from '@/lib/korrektur/api' import type { Klausur, StudentWork, FairnessAnalysis } from '../../types' import { GlassCard, Histogram, CriteriaHeatmap, OutlierList, FairnessScore } from './_components/FairnessCharts' export default function FairnessPage() { const { isDark } = useTheme() const router = useRouter() const params = useParams() const klausurId = params.klausurId as string const [klausur, setKlausur] = useState(null) const [students, setStudents] = useState([]) const [fairness, setFairness] = useState(null) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) const loadData = useCallback(async () => { if (!klausurId) return setIsLoading(true) setError(null) try { const [klausurData, studentsData, fairnessData] = await Promise.all([ korrekturApi.getKlausur(klausurId), korrekturApi.getStudents(klausurId), korrekturApi.getFairnessAnalysis(klausurId), ]) setKlausur(klausurData) setStudents(studentsData) setFairness(fairnessData) } catch (err) { console.error('Failed to load data:', err) setError(err instanceof Error ? err.message : 'Laden fehlgeschlagen') } finally { setIsLoading(false) } }, [klausurId]) useEffect(() => { loadData() }, [loadData]) const stats = useMemo(() => { if (!fairness) return null return { studentCount: fairness.student_count, average: fairness.average_grade, stdDev: fairness.std_deviation, spread: fairness.spread, outlierCount: fairness.outliers.length, warningCount: fairness.warnings.length, } }, [fairness]) return (

Fairness-Analyse

{klausur?.title}

{error && (
{error}
)} {isLoading && (
)} {!isLoading && fairness && ( <>

Arbeiten

{stats?.studentCount}

Durchschnitt

{stats?.average.toFixed(1)} P

Standardabw.

{stats?.stdDev.toFixed(2)}

Spannweite

{stats?.spread} P

Ausreisser

{stats?.outlierCount}

Warnungen

{stats?.warningCount}

{fairness.warnings.length > 0 && (

Warnungen

    {fairness.warnings.map((warning, index) => (
  • -{warning}
  • ))}
)}
router.push(`/korrektur/${klausurId}/${studentId}`)} isDark={isDark} />
)} {!isLoading && !fairness && !error && (

Keine Daten verfuegbar

Die Fairness-Analyse erfordert korrigierte Arbeiten.

)}
) }