diff --git a/app/dashboard/kelola-data/CetakInstanModal.tsx b/app/dashboard/kelola-data/CetakInstanModal.tsx index 49c7a3a..13253cf 100644 --- a/app/dashboard/kelola-data/CetakInstanModal.tsx +++ b/app/dashboard/kelola-data/CetakInstanModal.tsx @@ -16,6 +16,7 @@ interface HasilItem { id_balita: number tinggi_badan: number | null berat_badan: number | null + z_score: number | null status_stunting: boolean | null pesan_ai: string | null tanggal_upload: string | null @@ -72,7 +73,12 @@ function build5MonthData(allData: HasilItem[], rowDate: Date) { return id.getFullYear() === slot.year && id.getMonth() + 1 === slot.month && id <= rowDate }) const label = new Date(slot.year, slot.month - 1, 1).toLocaleDateString('id-ID', { month: 'short', year: '2-digit' }) - return { label, tinggi: match?.tinggi_badan ?? null, berat: match?.berat_badan ?? null } + return { + label, + tinggi: match?.tinggi_badan ?? null, + berat: match?.berat_badan ?? null, + zscore: match?.z_score ?? null, + } }) } @@ -185,7 +191,7 @@ export function CetakInstanModal() { // --- Update template and wait for render --- setActivePrintData({ pengguna: b, row: rowForMonth, allHasil: balitaHasil }) // Give React and Recharts some time to finish rendering the hidden template - await new Promise(r => setTimeout(r, 600)) // 600ms buffer for Recharts animations/stable DOM + await new Promise(r => setTimeout(r, 1000)) // 1s buffer for stable DOM & Recharts if (!templateRef.current) continue @@ -197,14 +203,21 @@ export function CetakInstanModal() { logging: false, }) - const imgData = canvas.toDataURL('image/png') + const imgData = canvas.toDataURL('image/jpeg', 0.95) + + // Safety check: ensure imgData is a valid Data URI + if (!imgData || !imgData.startsWith('data:image/')) { + console.error('Invalid image data generated for', b.nama_anak) + continue + } + const pdf = new jsPDF('p', 'mm', 'a4') const pageW = pdf.internal.pageSize.getWidth() const pageH = pdf.internal.pageSize.getHeight() const imgH = (canvas.height * pageW) / canvas.width if (imgH <= pageH) { - pdf.addImage(imgData, 'PNG', 0, 0, pageW, imgH) + pdf.addImage(imgData, 'JPEG', 0, 0, pageW, imgH) } else { let yPos = 0 const sliceH = canvas.width * (pageH / pageW) @@ -215,7 +228,7 @@ export function CetakInstanModal() { const ctx = sliceCanvas.getContext('2d')! ctx.drawImage(canvas, 0, -yPos) if (yPos > 0) pdf.addPage() - pdf.addImage(sliceCanvas.toDataURL('image/png'), 'PNG', 0, 0, pageW, pageH) + pdf.addImage(sliceCanvas.toDataURL('image/jpeg', 0.95), 'JPEG', 0, 0, pageW, pageH) yPos += sliceH } } @@ -242,7 +255,7 @@ export function CetakInstanModal() { clearInterval(timer) setStep('done') - await showSwal.success('Selesai!', `Berhasil mencetak ${progress.total} file PDF.`) + await showSwal.success('Selesai!', `Berhasil mencetak ${targets.length} file PDF.`) handleClose() } catch (err: any) { clearInterval(timer) @@ -410,7 +423,7 @@ export function CetakInstanModal() { {/* ─── HIDDEN PDF TEMPLATE (Rich HTML) ─── */} {activePrintData && ( -
| {h} | ))}|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {activePrintData.row.tinggi_badan} cm | {activePrintData.row.berat_badan} kg | +{activePrintData.row.z_score} SD |
{isStunting ? 'Stunting' : 'Normal'}
diff --git a/app/dashboard/kelola-data/[id]/CetakPDFButton.tsx b/app/dashboard/kelola-data/[id]/CetakPDFButton.tsx
index 434b73f..b54621c 100644
--- a/app/dashboard/kelola-data/[id]/CetakPDFButton.tsx
+++ b/app/dashboard/kelola-data/[id]/CetakPDFButton.tsx
@@ -13,6 +13,7 @@ interface HasilItem {
id: number
tinggi_badan: number | null
berat_badan: number | null
+ z_score: number | null
status_stunting: boolean | null
pesan_ai: string | null
tanggal_upload: string | null
@@ -68,6 +69,7 @@ function build5MonthData(allData: HasilItem[], rowDate: Date) {
label,
tinggi: match?.tinggi_badan ?? null,
berat: match?.berat_badan ?? null,
+ zscore: match?.z_score ?? null,
}
})
}
@@ -210,6 +212,7 @@ export function CetakPDFButton({ row, allData, pengguna }: Props) {
@@ -231,11 +234,34 @@ export function CetakPDFButton({ row, allData, pengguna }: Props) {
+ {/* Z-Score PDF Chart */}
+
+
{/* ── Data Pemeriksaan ── */}
@@ -246,15 +272,16 @@ export function CetakPDFButton({ row, allData, pengguna }: Props) {
📈 Z-Score (SD)
+
|