// File: frontend/components/admin/ai/OcrPromptTab.tsx // Change Log // - 2026-06-17: Created OcrPromptTab for OCR system prompt management (Feature 238) // - 2026-06-18: Fixed linting errors (no-console, no-explicit-any) 'use client'; import { useState, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { Textarea } from '@/components/ui/textarea'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { adminAiPromptService, AiPromptVersion } from '@/lib/services/admin-ai-prompt.service'; import PromptVersionHistory from './PromptVersionHistory'; import { RefreshCw, Save, AlertCircle } from 'lucide-react'; import { AiPrompt } from '@/types/ai-prompts'; /** * Component สำหรับจัดการ OCR System Prompt * - แสดง version history * - แก้ไข template * - บันทึก version ใหม่ * - เปิดใช้งาน version ที่ต้องการ */ export function OcrPromptTab() { const [versions, setVersions] = useState([]); const [activeVersion, setActiveVersion] = useState(null); const [newTemplate, setNewTemplate] = useState(''); const [isSaving, setIsSaving] = useState(false); const [isActivating, setIsActivating] = useState(false); const [isDeleting, setIsDeleting] = useState(false); const [error, setError] = useState(null); const [showRefreshDialog, setShowRefreshDialog] = useState(false); const loadVersions = async () => { try { const data = await adminAiPromptService.getPrompts('ocr_system'); setVersions(data); const active = data.find((v) => v.isActive); setActiveVersion(active || null); setNewTemplate(active?.template || ''); setError(null); } catch { setError('Failed to load prompt versions'); } }; useEffect(() => { loadVersions(); }, []); const handleSaveNewVersion = async () => { if (!newTemplate.trim()) { setError('Template cannot be empty'); return; } setIsSaving(true); setError(null); try { await adminAiPromptService.createPrompt('ocr_system', newTemplate); await loadVersions(); } catch (err: unknown) { if (err instanceof Error && err.message.includes('409')) { setShowRefreshDialog(true); setError('Version conflict - data was modified by another user'); } else { setError('Failed to save new version'); } } finally { setIsSaving(false); } }; const handleActivate = async (versionNumber: number) => { const version = versions.find(v => v.versionNumber === versionNumber); setIsActivating(true); setError(null); try { await adminAiPromptService.activatePrompt('ocr_system', versionNumber, version?.version); await loadVersions(); } catch (err: unknown) { if (err instanceof Error && err.message.includes('409')) { setShowRefreshDialog(true); setError('Version conflict - data was modified by another user'); } else { setError('Failed to activate version'); } } finally { setIsActivating(false); } }; const handleRefresh = () => { setShowRefreshDialog(false); loadVersions(); }; const handleDelete = async (versionNumber: number) => { setIsDeleting(true); setError(null); try { await adminAiPromptService.deletePrompt('ocr_system', versionNumber); await loadVersions(); } catch { setError('Failed to delete version'); } finally { setIsDeleting(false); } }; const handleLoadTemplate = (version: AiPromptVersion) => { setNewTemplate(version.template); }; return (
{error && (
{error}
)} OCR System Prompt Editor System prompt สำหรับ OCR engine (np-dms-ocr) - ใช้สำหรับกำหนดวิธีการสกัดข้อความจาก PDF