Contract Text
${contract.content}
`;
modal.classList.remove('hidden');
setTimeout(() => {
modal.classList.remove('opacity-0');
modal.querySelector('.modal-content').classList.remove('scale-95');
}, 10);
}
function closeModal() {
modal.classList.add('opacity-0');
modal.querySelector('.modal-content').classList.add('scale-95');
setTimeout(() => modal.classList.add('hidden'), 300);
}
closeModalBtn.addEventListener('click', closeModal);
modal.addEventListener('click', e => { if (e.target === modal) closeModal(); });
// --- PDF GENERATION ---
downloadPdfBtn.addEventListener('click', () => {
pdfLoader.classList.remove('hidden');
downloadPdfBtn.disabled = true;
try {
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
const reportTitle = "Contract Archive Report";
doc.setFontSize(18);
doc.text(reportTitle, 14, 22);
doc.setFontSize(11);
doc.setTextColor(100);
doc.text(`Generated on: ${new Date().toLocaleDateString()}`, 14, 30);
doc.text(`Filter Status: ${filterStatus.options[filterStatus.selectedIndex].text}`, 14, 38);
const head = [['Title', 'Party A', 'Party B', 'Signing Date', 'Expiry Date', 'Status']];
const body = currentFilteredData.map(c => {
const isExpired = new Date(c.expiryDate) < new Date();
return [
c.title,
c.partyA,
c.partyB,
new Date(c.signingDate+'T00:00:00').toLocaleDateString(),
new Date(c.expiryDate+'T00:00:00').toLocaleDateString(),
isExpired ? 'Expired' : 'Active'
];
});
doc.autoTable({
head: head,
body: body,
startY: 45,
theme: 'striped',
headStyles: { fillColor: [22, 160, 133] }
});
doc.save('Contract-Archive-Report.pdf');
} catch (e) {
console.error("PDF generation failed:", e);
alert("An error occurred while generating the PDF.");
} finally {
pdfLoader.classList.add('hidden');
downloadPdfBtn.disabled = false;
}
});
// --- INITIALIZATION ---
renderContracts();
showTab(0);
});