63 lines
2.3 KiB
TypeScript
63 lines
2.3 KiB
TypeScript
import React, { useState } from 'react';
|
|
import { useAppContext } from '../context/AppContext.tsx';
|
|
import { FileInvoiceIcon } from './icons/Icons.tsx';
|
|
import OcrStats from './ocr/OcrStats.tsx';
|
|
import OcrUpload from './ocr/OcrUpload.tsx';
|
|
import OcrDocumentsTable from './ocr/OcrDocumentsTable.tsx';
|
|
import OcrReviewModal from './ocr/OcrReviewModal.tsx';
|
|
import { OcrDocument } from '../types.ts';
|
|
import AiInsightCard from './shared/AiInsightCard.tsx';
|
|
|
|
const OcrProcessingPage: React.FC = () => {
|
|
const { ocrDocuments, onUpdateOcrDocument, apiMode } = useAppContext();
|
|
const [reviewingDoc, setReviewingDoc] = useState<OcrDocument | null>(null);
|
|
|
|
return (
|
|
<main className="px-4 sm:px-6 lg:px-8 pb-8">
|
|
<div className="flex items-center mb-6">
|
|
<FileInvoiceIcon className="text-3xl text-red-600 mr-4" />
|
|
<div>
|
|
<h1 className="text-3xl font-bold text-gray-800">Pemrosesan Dokumen OCR</h1>
|
|
<p className="mt-1 text-gray-600">
|
|
Unggah, ekstrak, dan validasi data dari dokumen operasional secara otomatis.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="space-y-8">
|
|
<OcrStats documents={ocrDocuments} />
|
|
{apiMode === 'DEMO' && (
|
|
<AiInsightCard title="AI Insight: Anomali Data">
|
|
<p>
|
|
Jumlah pakan pada faktur{' '}
|
|
<span className="font-semibold">'faktur_pakan_CP511.jpg'</span> (200 karung) tidak
|
|
sesuai dengan data penerimaan gudang (195 karung). Mohon lakukan verifikasi manual.
|
|
</p>
|
|
<button className="text-xs font-semibold text-purple-800 hover:text-purple-900 hover:underline">
|
|
Lihat Dokumen →
|
|
</button>
|
|
</AiInsightCard>
|
|
)}
|
|
<div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
|
|
<div className="lg:col-span-1 space-y-8">
|
|
<OcrUpload />
|
|
</div>
|
|
<div className="lg:col-span-2">
|
|
<OcrDocumentsTable documents={ocrDocuments} onReview={setReviewingDoc} />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{reviewingDoc && (
|
|
<OcrReviewModal
|
|
isOpen={!!reviewingDoc}
|
|
onClose={() => setReviewingDoc(null)}
|
|
document={reviewingDoc}
|
|
onSave={onUpdateOcrDocument}
|
|
/>
|
|
)}
|
|
</main>
|
|
);
|
|
};
|
|
|
|
export default OcrProcessingPage;
|