'use client' import { useState } from 'react' import type { DeskewResult, DeskewGroundTruth } from '@/app/(admin)/ai/ocr-pipeline/types' interface DeskewControlsProps { deskewResult: DeskewResult | null showBinarized: boolean onToggleBinarized: () => void showGrid: boolean onToggleGrid: () => void onManualDeskew: (angle: number) => void onGroundTruth: (gt: DeskewGroundTruth) => void onNext: () => void isApplying: boolean } const METHOD_LABELS: Record = { hough: 'Hough-Linien', word_alignment: 'Wortausrichtung', manual: 'Manuell', } export function DeskewControls({ deskewResult, showBinarized, onToggleBinarized, showGrid, onToggleGrid, onManualDeskew, onGroundTruth, onNext, isApplying, }: DeskewControlsProps) { const [manualAngle, setManualAngle] = useState(0) const [gtFeedback, setGtFeedback] = useState<'correct' | 'incorrect' | null>(null) const [gtNotes, setGtNotes] = useState('') const [gtSaved, setGtSaved] = useState(false) const handleGroundTruth = (isCorrect: boolean) => { setGtFeedback(isCorrect ? 'correct' : 'incorrect') if (isCorrect) { onGroundTruth({ is_correct: true }) setGtSaved(true) } } const handleGroundTruthIncorrect = () => { onGroundTruth({ is_correct: false, corrected_angle: manualAngle !== 0 ? manualAngle : undefined, notes: gtNotes || undefined, }) setGtSaved(true) } return (
{/* Results */} {deskewResult && (
Winkel:{' '} {deskewResult.angle_applied}°
Methode:{' '} {METHOD_LABELS[deskewResult.method_used] || deskewResult.method_used}
Konfidenz:{' '} {Math.round(deskewResult.confidence * 100)}%
Hough: {deskewResult.angle_hough}° | WA: {deskewResult.angle_word_alignment}°
{/* Toggles */}
)} {/* Manual angle */} {deskewResult && (
Manuelle Korrektur
-5° setManualAngle(parseFloat(e.target.value))} className="flex-1 h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer dark:bg-gray-700 accent-teal-500" /> +5° {manualAngle.toFixed(1)}°
)} {/* Ground Truth */} {deskewResult && (
Rotation korrekt?

Nur die Drehung bewerten — Woelbung/Verzerrung wird im naechsten Schritt korrigiert.

{!gtSaved ? (
{gtFeedback === 'incorrect' && (