AI-Assessed Risk Level
${riskLevel}
Company Profile
Company: ${appData.companyName}
Industry: ${appData.industry}
Date: ${appData.assessmentDate}
Compliance by Category
Priority Recommendations
${recommendations.length === 0 ? '
No high-priority recommendations. All areas are fully compliant.
' : `
${recommendations.map(r => `- [${r.status}] ${r.text}
- ${r.recommendation} `).join('')}
`}
`;
getEl('dashboard-container').innerHTML = html;
// Render chart
if (complianceChart) complianceChart.destroy();
const ctx = getEl('complianceChart').getContext('2d');
complianceChart = new Chart(ctx, {
type: 'radar',
data: {
labels: assessmentData.map(s => s.category),
datasets: [{
label: 'Compliance Score (%)',
data: categoryScores,
fill: true,
backgroundColor: 'rgba(59, 130, 246, 0.2)',
borderColor: 'rgb(59, 130, 246)',
pointBackgroundColor: 'rgb(59, 130, 246)',
pointBorderColor: '#fff',
pointHoverBackgroundColor: '#fff',
pointHoverBorderColor: 'rgb(59, 130, 246)'
}]
},
options: {
scales: { r: { beginAtZero: true, max: 100 } },
maintainAspectRatio: false,
}
});
showTab(3);
}
async function handlePdfDownload() {
if (!appData.assessmentResults) { alert('Please generate a dashboard first.'); return; }
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
doc.setFontSize(20);
doc.text("Cyber Law Risk & Compliance Report", 105, 20, { align: 'center' });
doc.setFontSize(10);
doc.text(`Company: ${appData.companyName} | Industry: ${appData.industry} | Date: ${appData.assessmentDate}`, 105, 30, { align: 'center' });
doc.line(14, 35, 196, 35);
// Summary scores
const overallScore = Math.round(appData.assessmentResults.reduce((s, i) => s + i.value, 0) * 100 / (appData.assessmentResults.length * 2));
doc.setFontSize(12);
doc.text(`Overall Compliance Score: ${overallScore}%`, 14, 45);
// The risk level logic should be replicated here for the PDF
let riskLevel = 'Low'; let baseScore = overallScore;
if (appData.industry === 'Healthcare' || appData.industry === 'Finance') baseScore -= 10;
if (appData.regulations.gdpr) baseScore -= 5;
if (baseScore < 50) riskLevel = 'Critical'; else if (baseScore < 70) riskLevel = 'High'; else if (baseScore < 85) riskLevel = 'Medium';
doc.text(`AI-Assessed Risk Level: ${riskLevel}`, 196, 45, {align: 'right'});
// Chart Image
const chartImage = complianceChart.toBase64Image();
doc.setFontSize(12);
doc.text("Compliance by Category", 14, 60);
doc.addImage(chartImage, 'PNG', 14, 65, 180, 90);
// Recommendations
const recommendations = appData.assessmentResults.filter(r => r.value < 2).sort((a,b) => a.value - b.value);
if (recommendations.length > 0) {
const tableBody = recommendations.map(r => [r.category, r.text, r.status, r.recommendation]);
doc.autoTable({
startY: 165,
head: [['Category', 'Issue', 'Status', 'Recommendation']],
body: tableBody,
theme: 'grid',
headStyles: { fillColor: [29, 78, 216] },
didParseCell: function(data) {
if (data.section === 'body' && data.column.index === 2) {
if (data.cell.raw === 'Non-Compliant') data.cell.styles.textColor = [220, 53, 69];
if (data.cell.raw === 'Partially Compliant') data.cell.styles.textColor = [245, 158, 11];
}
}
});
} else {
doc.text("No high-priority recommendations found. All areas are fully compliant.", 14, 170);
}
doc.setFontSize(8);
doc.setTextColor(150);
doc.text("This report was generated by the AI-Based Cyber Law Risk & Compliance Tracker.", 105, doc.internal.pageSize.height - 10, { align: 'center' });
doc.save(`Cyber-Compliance-Report-${appData.companyName.replace(/\s/g, '_')}.pdf`);
}
// --- Event Listeners & Initialization ---
nextBtn.addEventListener('click', () => {
if (!validateTab(currentTab)) return;
saveTabData();
if (currentTab < totalTabs) {
if (currentTab === totalTabs - 1) {
generateDashboard();
} else {
showTab(currentTab + 1);
}
}
});
prevBtn.addEventListener('click', () => {
if (currentTab > 1) {
saveTabData();
showTab(currentTab - 1);
}
});
getEl('download-pdf-btn').addEventListener('click', handlePdfDownload);
// Initial load
populateAssessment();
updateNavigation();
});