From 66f8a7b708e1738825839e7eab4b1cc3eefde4fc Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Sat, 11 Apr 2026 00:55:56 +0200 Subject: [PATCH] Improve vocab-worksheet UX: better status messages + error details - Change "PDF wird analysiert..." to "PDF wird hochgeladen..." (accurate) - Switch to pages tab immediately after upload (before thumbnails load) - Show progressive status: "5 Seiten erkannt. Vorschau wird geladen..." - Show backend error detail instead of generic "HTTP 404" - Backend returns helpful message when session not in memory after restart Co-Authored-By: Claude Opus 4.6 (1M context) --- klausur-service/backend/vocab_worksheet_api.py | 5 ++++- studio-v2/app/vocab-worksheet/page.tsx | 17 +++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/klausur-service/backend/vocab_worksheet_api.py b/klausur-service/backend/vocab_worksheet_api.py index cbceaa5..fe0d6d0 100644 --- a/klausur-service/backend/vocab_worksheet_api.py +++ b/klausur-service/backend/vocab_worksheet_api.py @@ -1302,7 +1302,10 @@ async def process_single_page( logger.info(f"Processing SINGLE page {page_number + 1} for session {session_id}") if session_id not in _sessions: - raise HTTPException(status_code=404, detail="Session not found") + raise HTTPException( + status_code=404, + detail="Session nicht im Speicher. Bitte erstellen Sie eine neue Session und laden Sie das PDF erneut hoch.", + ) session = _sessions[session_id] pdf_data = session.get("pdf_data") diff --git a/studio-v2/app/vocab-worksheet/page.tsx b/studio-v2/app/vocab-worksheet/page.tsx index 2516b7e..85ceeba 100644 --- a/studio-v2/app/vocab-worksheet/page.tsx +++ b/studio-v2/app/vocab-worksheet/page.tsx @@ -351,7 +351,7 @@ export default function VocabWorksheetPage() { } if (isPdf) { - setExtractionStatus('PDF wird analysiert...') + setExtractionStatus('PDF wird hochgeladen...') const formData = new FormData() formData.append('file', file) @@ -367,10 +367,15 @@ export default function VocabWorksheetPage() { const pdfInfo = await pdfInfoRes.json() setPdfPageCount(pdfInfo.page_count) + setSelectedPages(Array.from({ length: pdfInfo.page_count }, (_, i) => i)) + // Switch to pages tab immediately so user sees progress + setActiveTab('pages') + setExtractionStatus(`${pdfInfo.page_count} Seiten erkannt. Vorschau wird geladen...`) setIsLoadingThumbnails(true) - const thumbnails: string[] = [] + // Load thumbnails progressively + const thumbnails: string[] = [] for (let i = 0; i < pdfInfo.page_count; i++) { try { const thumbRes = await fetch(`${API_BASE}/api/v1/vocab/sessions/${sessionData.id}/pdf-thumbnail/${i}?hires=true`) @@ -385,9 +390,7 @@ export default function VocabWorksheetPage() { setPagesThumbnails(thumbnails) setIsLoadingThumbnails(false) - setSelectedPages(Array.from({ length: pdfInfo.page_count }, (_, i) => i)) - setActiveTab('pages') - setExtractionStatus(`PDF hat ${pdfInfo.page_count} Seiten. Bitte waehlen Sie die zu verarbeitenden Seiten.`) + setExtractionStatus(`${pdfInfo.page_count} Seiten bereit. Waehlen Sie die zu verarbeitenden Seiten.`) } else { setExtractionStatus('KI analysiert das Bild... (kann 30-60 Sekunden dauern)') @@ -442,7 +445,9 @@ export default function VocabWorksheetPage() { }) if (!res.ok) { - return { success: false, vocabulary: [], error: `Seite ${pageIndex + 1}: HTTP ${res.status}` } + const errBody = await res.json().catch(() => ({})) + const detail = errBody.detail || `HTTP ${res.status}` + return { success: false, vocabulary: [], error: `Seite ${pageIndex + 1}: ${detail}` } } const data = await res.json()