Science Career Path Sheet Generator

Science Career Path Sheet Generator

1. Career Trajectory
2. High-Level Plan
Add/Edit Career Step

Career Path Milestones

Phase Years Milestones Actions

Click "Generate Path Sheet" to view your structured career plan.

Timeline: ${startYear} – ${endYear}

Key Milestones:

    ${step.milestones.map(m => `
  • ${m}
  • `).join('')}
`; }); 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(); });
Scroll to Top