(() => { const { Modal, Button, Badge, Icon, Textarea, IconButton, Field } = window.TaskFlowDesignSystem_dd53c2; /* Anotasi PDF saat verifikasi: Direktur menempel pin bernomor di halaman dokumen dan menulis catatan per pin. Pin disimpan sebagai koordinat persen (bukan gambar), jadi ringan dan tetap akurat di layar mana pun. */ function AnnotatePdfModal({ task, onClose, onSubmit }) { const narrow = useBreakpoint() !== "desktop"; const [page, setPage] = React.useState(1); const [pdfPages, setPdfPages] = React.useState(0); const pages = pdfPages || 1; const [pins, setPins] = React.useState(() => (task && task.annotations ? task.annotations.slice() : [])); const [active, setActive] = React.useState(null); const ev = task && task.evidence ? task.evidence : { name: "bukti-task.pdf", compressed: 480000 }; const src = fileSrc(ev) || (ev.file instanceof Blob ? URL.createObjectURL(ev.file) : null); const isImage = ev.kind === "image" || /\.(png|jpe?g|webp)$/i.test(ev.name || ""); if (!task) return null; const addPin = (e) => { const r = e.currentTarget.getBoundingClientRect(); const x = Math.min(97, Math.max(3, ((e.clientX - r.left) / r.width) * 100)); const y = Math.min(97, Math.max(3, ((e.clientY - r.top) / r.height) * 100)); setPins((p) => [...p, { n: p.length + 1, page, x, y, note: "" }]); setActive(pins.length); }; const setNote = (i, note) => setPins((p) => p.map((x, j) => (j === i ? { ...x, note } : x))); const remove = (i) => setPins((p) => p.filter((_, j) => j !== i).map((x, j) => ({ ...x, n: j + 1 }))); const filled = pins.filter((p) => p.note.trim()); const asPoints = () => filled.map((p) => `${p.n}. [hal ${p.page}] ${p.note.trim()}`).join("\n"); return ( setPage((p) => Math.max(1, p - 1))} /> {page} / {pages} setPage((p) => Math.min(pages, p + 1))} /> }>
{src && !isImage &&
} {src && isImage && {ev.name}} {!src && (
Klinik BBMC {task.type} Pratinjau halaman {page} — file asli tersimpan di server
{Array.from({ length: 12 }).map((_, i) => ( ))}
)} {pins.filter((p) => p.page === page).map((p) => { const i = pins.indexOf(p); return ( ); })}
{pins.length} pin {pins.length > 0 && } {pins.length === 0 && ( Klik bagian dokumen yang perlu diperbaiki, lalu tulis catatannya di sini. Pin tanpa catatan tidak dikirim. )} {pins.map((p, i) => (
setActive(i)} style={{ display: "flex", flexDirection: "column", gap: 6, padding: "10px 11px", borderRadius: "var(--radius-sm)", background: active === i ? "var(--coral-50)" : "var(--neutral-50)", border: `1px solid ${active === i ? "var(--coral-100)" : "var(--border-subtle)"}` }}> #{p.n} halaman {p.page} { if (e) e.stopPropagation(); remove(i); }} />