`;
});
html += `
`;
reviewArea.innerHTML = html;
switchTab(2); // Switch to review tab
}
/**
* PDF Generation Function (Ensuring professional formatting)
*/
function downloadPDF() {
const meta = getMetaFormData();
if (careerSteps.length === 0) return;
const { jsPDF } = window.jspdf;
const doc = new jsPDF('p', 'pt', 'a4');
let currentY = 40;
const margin = 40;
const pageWidth = doc.internal.pageSize.width;
const maxWidth = pageWidth - (margin * 2);
const checkPageBreak = (spaceNeeded) => {
if (currentY + spaceNeeded > doc.internal.pageSize.height - margin) {
doc.addPage();
currentY = margin;
}
};
const addText = (text, size = 11, style = 'normal', color = [0, 0, 0], indent = 0) => {
doc.setFontSize(size);
doc.setFont('Helvetica', style);
doc.setTextColor(color[0], color[1], color[2]);
const lines = doc.splitTextToSize(text, maxWidth - indent);
checkPageBreak(lines.length * (size * 1.2));
doc.text(lines, margin + indent, currentY);
currentY += (lines.length * (size * 1.2));
doc.setTextColor(0); // Reset color
};
const addSectionHeader = (title) => {
checkPageBreak(30);
doc.setFontSize(16);
doc.setFont('Helvetica', 'bold');
doc.setTextColor(52, 152, 219); /* Info color */
doc.text(title, margin, currentY);
currentY += 10;
doc.setLineWidth(0.5);
doc.setDrawColor(200);
doc.line(margin, currentY, pageWidth - margin, currentY);
currentY += 15;
doc.setTextColor(0);
};
// --- PDF Content ---
// Title Block
doc.setFontSize(22);
doc.setFont('Helvetica', 'bold');
doc.setTextColor(0, 119, 182); /* Primary color */
doc.text(meta.title, pageWidth / 2, currentY, { align: 'center' });
currentY += 15;
// Metadata Table
const totalDuration = careerSteps.reduce((sum, step) => sum + step.durationYears, 0);
const metaBody = [
['Field/Domain:', meta.field],
['Current Role:', meta.current],
['Target Role:', meta.target],
['Target Year:', meta.year],
['Total Duration:', `${totalDuration} Years`]
];
doc.autoTable({
startY: currentY,
head: [['Career Path Metadata', '']],
body: metaBody,
theme: 'grid',
headStyles: { fillColor: [200, 200, 200], textColor: [0], fontStyle: 'bold' },
styles: { fontSize: 10, cellPadding: 4, font: 'Helvetica' },
columnStyles: { 0: { fontStyle: 'bold', cellWidth: 100 } }
});
currentY = doc.autoTable.previous.finalY + 20;
// 1. Overview
addSectionHeader("1. Trajectory Overview");
addText("Overall Vision:", 12, 'bold');
addText(meta.overview, 11, 'normal', [0, 0, 0], 5);
currentY += 5;
// 2. Metrics for Success
addSectionHeader("2. Metrics for Success");
const metricsList = meta.metrics.split('\n').filter(m => m.trim() !== '');
metricsList.forEach(m => {
addText(`• ${m}`, 11, 'normal', [0, 0, 0], 5);
});
currentY += 5;
// 3. Step-by-Step Milestones
addSectionHeader("3. Step-by-Step Milestones");
let cumulativeYears = 0;
careerSteps.forEach((step, index) => {
const startYear = meta.year - totalDuration + cumulativeYears;
cumulativeYears += step.durationYears;
const endYear = startYear + step.durationYears;
checkPageBreak(50 + (step.milestones.length * 15));
// Phase Header
doc.setFontSize(12);
doc.setFont('Helvetica', 'bold');
doc.setTextColor(0, 119, 182);
addText(`Step ${index + 1}: ${step.phaseName} (${step.durationYears} Years)`, 12, 'bold');
doc.setFontSize(10);
doc.setFont('Helvetica', 'normal');
doc.setTextColor(108, 117, 125);
addText(`Timeline: ${startYear} – ${endYear}`, 10, 'normal');
currentY += 5;
// Milestones List
step.milestones.forEach(m => {
addText(`• ${m}`, 11, 'normal', [0, 0, 0], 10);
});
currentY += 10;
});
doc.save('science_career_path_sheet.pdf');
}
// --- Tab Navigation ---
function switchTab(tabIndex) {
tabs.forEach((tab, index) => {
tab.classList.toggle('active', index === tabIndex);
contents[index].classList.toggle('active', index === tabIndex);
});
currentTab = tabIndex;
updateNavButtons();
if (tabIndex === 2) { // Review tab
generatePathSheet();
}
}
function updateNavButtons() {
prevBtn.disabled = currentTab === 0;
nextBtn.disabled = currentTab === tabs.length - 1;
}
tabs.forEach((tab, index) => {
tab.addEventListener('click', () => switchTab(index));
});
nextBtn.addEventListener('click', () => { if (currentTab < tabs.length - 1) switchTab(currentTab + 1); });
prevBtn.addEventListener('click', () => { if (currentTab > 0) switchTab(currentTab - 1); });
// --- Event Listeners ---
document.getElementById('target-year').value = new Date().getFullYear() + 5;
document.getElementById('step-add-update-btn').addEventListener('click', (e) => { e.preventDefault(); milestoneForm.dispatchEvent(new Event('submit')); });
document.getElementById('pdf-download-btn').addEventListener('click', downloadPDF);
// Event listener for review button inside Dashboard tab
document.querySelector('#careerInput .career-form-actions button').addEventListener('click', generatePathSheet);
// --- Initial Setup ---
renderStepsTable();
updateNavButtons();
});
