No insights generated yet. Please configure your data.
Data Configuration
Define your custom metrics, targets, and actuals. Click 'Add Metric' to add more rows.
Custom Analytics Dashboard Report
Key Performance Indicators
Analytics Insights
Areas for Improvement: Metrics currently below target include: ${metricsBelowTarget.map(m => `${m.name} (${m.progress}%)`).join(', ')}. Focus efforts on these to bridge the gap.
`;
}
insightsForPdf += `
`;
}
pdfAnalyticsInsights.innerHTML = `
Analytics Insights
${insightsForPdf}`;
// Show the hidden content temporarily for html2canvas to render it
pdfContent.style.display = 'block';
showMessage('Generating PDF...', 'info');
try {
const canvas = await html2canvas(pdfContent, {
scale: 2, // Increase scale for better quality
useCORS: true, // If you have external images, enable CORS
logging: false // Disable console logging from html2canvas
});
const imgData = canvas.toDataURL('image/png');
const { jsPDF } = window.jspdf;
const pdf = new jsPDF('p', 'mm', 'a4'); // 'p' for portrait, 'mm' for millimeters, 'a4' size
const imgWidth = 210; // A4 width in mm
const pageHeight = 297; // A4 height in mm
const imgHeight = canvas.height * imgWidth / canvas.width;
let heightLeft = imgHeight;
let position = 0;
pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
heightLeft -= pageHeight;
while (heightLeft >= 0) {
position = heightLeft - imgHeight;
pdf.addPage();
pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
heightLeft -= pageHeight;
}
pdf.save('Custom_Analytics_Dashboard.pdf');
showMessage('PDF downloaded successfully!', 'success');
} catch (error) {
console.error("Error generating PDF:", error);
showMessage('Error generating PDF. Please try again.', 'error');
} finally {
// Hide the content again after PDF generation
pdfContent.style.display = 'none';
}
};
}
// --- Initial Load ---
switchTab('dashboard'); // Start on the dashboard tab
renderAllMetricInputRows(); // Render initial data in config tab
renderAllKpiCards(); // Render initial data in dashboard tab
generateAnalyticsInsights(); // Generate initial insights
});