);
}
function CompleteTaskModal({ open, task, onClose, onSubmit }) {
const [reason, setReason] = React.useState("");
const [note, setNote] = React.useState("");
const [doc, setDoc] = React.useState(null);
const [docs, setDocs] = React.useState([]);
const [pasted, setPasted] = React.useState(false);
const isProjectTask = !!(task && task.project);
const late = task ? isOverdue(task.target) : false;
const revising = task ? task.status === "revision" : false;
const pdfOnly = !!(task && task.needSign);
const isPdf = (f) => !!f && f.ok && f.kind !== "image";
// Dokumen hasil unduhan yang sudah ber-TTD ("...-ttd.pdf") tidak boleh diunggah ulang:
// tanda tangannya sudah menyatu di halaman, sehingga TTD berikutnya akan menumpuk.
const signedName = (f) => !!f && /-ttd(\.[a-z0-9]+)?$/i.test(String(f.name || ""));
const docOk = pdfOnly
? (isProjectTask ? docs.some((f) => isPdf(f) && !signedName(f)) : isPdf(doc) && !signedName(doc))
: (isProjectTask ? docs.some((f) => f.ok) : !!(doc && doc.ok));
const reasonOk = !late || reason.trim().length > 0;
// paste a screenshot in any notes field → it lands in the evidence slot
const attachPasted = async (file) => {
if (pdfOnly) return; // task bertanda tangan hanya menerima PDF
const f = await readPastedImage(file);
if (isProjectTask) setDocs((l) => [...l, f]); else setDoc(f);
setPasted(true);
};
return (
>}>
1. {isProjectTask ? "Minimal satu file; file tambahan opsional." : "Tanpa dokumen, task tidak bisa dikirim untuk verifikasi."}2. {pdfOnly
? "Task ini butuh tanda tangan Admin, jadi hanya PDF yang diterima — screenshot tidak bisa dipakai."
: "Screenshot bisa langsung di-paste (Ctrl+V) pada kolom catatan untuk Admin — otomatis jadi bukti dokumen."}
)}>
{isProjectTask
? setDocs((l) => [...l, f])} onRemove={(i) => setDocs((l) => l.filter((_, x) => x !== i))} />
: setDoc(null)} />}
{pasted && (
Screenshot dari clipboard ditambahkan sebagai bukti dokumen.
)}
{revising && task.revision && (