Document page: two-row layout - details|summary+notes top, OCR|PDF bottom
This commit is contained in:
parent
6adfefff7a
commit
1b49dac87f
|
|
@ -49,17 +49,14 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Row 1: Details (left) | Summary + Notes (right) — equal height -->
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
||||
<!-- Left Column: Details -->
|
||||
<div class="space-y-6">
|
||||
<!-- Metadata Card -->
|
||||
<div class="bg-white dark:bg-gray-800 rounded-2xl shadow-sm border border-gray-100 dark:border-gray-700 overflow-hidden">
|
||||
<div class="bg-white dark:bg-gray-800 rounded-2xl shadow-sm border border-gray-100 dark:border-gray-700 overflow-hidden flex flex-col">
|
||||
<div class="px-6 py-4 border-b border-gray-100 dark:border-gray-700">
|
||||
<h2 class="font-semibold text-gray-900 dark:text-white">Details</h2>
|
||||
</div>
|
||||
<div class="p-6">
|
||||
<div class="p-6 flex-1">
|
||||
<div class="grid grid-cols-2 gap-x-8 gap-y-4">
|
||||
<!-- Left column -->
|
||||
<dl class="space-y-4">
|
||||
<div>
|
||||
<dt class="text-sm text-gray-500 dark:text-gray-400">Category</dt>
|
||||
|
|
@ -85,7 +82,6 @@
|
|||
</div>
|
||||
{{end}}
|
||||
</dl>
|
||||
<!-- Right column -->
|
||||
<dl class="space-y-4">
|
||||
{{if .Document.Date}}
|
||||
<div>
|
||||
|
|
@ -110,24 +106,19 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Summary -->
|
||||
<div class="bg-white dark:bg-gray-800 rounded-2xl shadow-sm border border-gray-100 dark:border-gray-700 overflow-hidden flex flex-col">
|
||||
{{if .Document.Summary}}
|
||||
<div class="bg-white dark:bg-gray-800 rounded-2xl shadow-sm border border-gray-100 dark:border-gray-700 overflow-hidden">
|
||||
<div class="px-6 py-4 border-b border-gray-100 dark:border-gray-700">
|
||||
<h2 class="font-semibold text-gray-900 dark:text-white">Summary</h2>
|
||||
</div>
|
||||
<div class="p-6">
|
||||
<div class="p-6 border-b border-gray-100 dark:border-gray-700">
|
||||
<p class="text-gray-700 dark:text-gray-300 whitespace-pre-wrap">{{.Document.Summary}}</p>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<!-- Notes -->
|
||||
<div class="bg-white dark:bg-gray-800 rounded-2xl shadow-sm border border-gray-100 dark:border-gray-700 overflow-hidden">
|
||||
<div class="px-6 py-4 border-b border-gray-100 dark:border-gray-700">
|
||||
<h2 class="font-semibold text-gray-900 dark:text-white">Notes</h2>
|
||||
</div>
|
||||
<div class="p-6">
|
||||
<div class="p-6 flex-1">
|
||||
{{if .Document.Notes}}
|
||||
<p class="text-gray-700 dark:text-gray-300 whitespace-pre-wrap">{{.Document.Notes}}</p>
|
||||
{{else}}
|
||||
|
|
@ -135,49 +126,45 @@
|
|||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Full Text -->
|
||||
<!-- Row 2: OCR Text (left) | PDF Viewer (right) -->
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
||||
{{if .Document.FullText}}
|
||||
<div class="bg-white dark:bg-gray-800 rounded-2xl shadow-sm border border-gray-100 dark:border-gray-700 overflow-hidden">
|
||||
<div class="px-6 py-4 border-b border-gray-100 dark:border-gray-700 flex items-center justify-between">
|
||||
<h2 class="font-semibold text-gray-900 dark:text-white">OCR Text</h2>
|
||||
<button onclick="copyText()" class="text-sm text-brand-600 dark:text-brand-400 hover:underline">Copy</button>
|
||||
</div>
|
||||
<div class="p-6 max-h-96 overflow-auto">
|
||||
<div class="p-6 max-h-[700px] overflow-auto">
|
||||
<div id="ocr-text" class="text-sm text-gray-700 dark:text-gray-300 prose dark:prose-invert max-w-none">{{.Document.FullText | safe}}</div>
|
||||
<script>
|
||||
// Simple markdown rendering
|
||||
(function() {
|
||||
const el = document.getElementById('ocr-text');
|
||||
let md = el.textContent;
|
||||
// Headers
|
||||
md = md.replace(/^### (.+)$/gm, '<h4 class="font-semibold mt-4 mb-2">$1</h4>');
|
||||
md = md.replace(/^## (.+)$/gm, '<h3 class="font-semibold text-lg mt-4 mb-2">$1</h3>');
|
||||
// Bold
|
||||
md = md.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
|
||||
// Tables (simple)
|
||||
md = md.replace(/\|(.+)\|/g, function(match) {
|
||||
const cells = match.split('|').filter(c => c.trim());
|
||||
return '<tr>' + cells.map(c => '<td class="border px-2 py-1">' + c.trim() + '</td>').join('') + '</tr>';
|
||||
});
|
||||
md = md.replace(/(<tr>.*<\/tr>\n?)+/g, '<table class="border-collapse border my-2">$&</table>');
|
||||
// Bullets
|
||||
md = md.replace(/^- (.+)$/gm, '<li>$1</li>');
|
||||
md = md.replace(/(<li>.*<\/li>\n?)+/g, '<ul class="list-disc ml-4 my-2">$&</ul>');
|
||||
// Line breaks
|
||||
md = md.replace(/\n/g, '<br>');
|
||||
el.innerHTML = md;
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<div></div>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<!-- Right Column: PDF Viewer -->
|
||||
<div>
|
||||
{{if .Document.PDFPath}}
|
||||
<div class="bg-white dark:bg-gray-800 rounded-2xl shadow-sm border border-gray-100 dark:border-gray-700 overflow-hidden sticky top-6">
|
||||
<div class="bg-white dark:bg-gray-800 rounded-2xl shadow-sm border border-gray-100 dark:border-gray-700 overflow-hidden">
|
||||
<div class="px-6 py-4 border-b border-gray-100 dark:border-gray-700 flex items-center justify-between">
|
||||
<h2 class="font-semibold text-gray-900 dark:text-white">Document Preview</h2>
|
||||
<div class="flex items-center space-x-2">
|
||||
|
|
|
|||
Loading…
Reference in New Issue