Successful
${successCount}
| Order ID |
Customer |
Status |
Details |
${tableRows}
`;
document.getElementById('download-pdf-btn').addEventListener('click', handlePdfDownload);
lucide.createIcons();
}
async function handlePdfDownload() {
if (!lastResults) return;
const { jsPDF } = window.jspdf;
const total = lastResults.length;
const successCount = lastResults.filter(r => r.status === 'Success').length;
const failCount = total - successCount;
// Populate PDF container
document.getElementById('pdf-report-date').textContent = new Date().toLocaleDateString();
document.getElementById('pdf-summary-total').innerHTML = `
Total Orders
${total}
`;
document.getElementById('pdf-summary-success').innerHTML = `
Successful
${successCount}
`;
document.getElementById('pdf-summary-fail').innerHTML = `
Failed
${failCount}
`;
let tableHtml = `
| Order ID |
Customer |
Product |
Status |
Details |
${lastResults.map(r => `
| ${r.id} |
${r.customer} |
${r.product} |
${r.status} |
${r.details} |
`).join('')}
`;
document.getElementById('pdf-results-table').innerHTML = tableHtml;
try {
const canvas = await html2canvas(document.getElementById('pdf-content'), { scale: 2 });
const imgData = canvas.toDataURL('image/png');
const pdf = new jsPDF({ orientation: 'portrait', unit: 'pt', format: 'a4' });
const pdfWidth = pdf.internal.pageSize.getWidth();
const imgProps = pdf.getImageProperties(imgData);
const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;
pdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight);
pdf.save('Dropshipping_Batch_Report.pdf');
} catch (e) {
console.error("PDF generation failed:", e);
alert("An error occurred generating the PDF.");
}
}
// --- Event Listeners ---
tabs.forEach((tab, index) => tab.btn.addEventListener('click', () => switchTab(index)));
prevBtn.addEventListener('click', () => switchTab(currentTab - 1));
nextBtn.addEventListener('click', () => switchTab(currentTab + 1));
processOrdersBtn.addEventListener('click', handleProcessOrders);
failureRateSlider.addEventListener('input', (e) => {
failureRateValue.textContent = `${e.target.value}%`;
});
// --- Initialization ---
orderDataInput.value = sampleData;
switchTab(0);
updateNavButtons();
lucide.createIcons();
});