Smart Employee Exit Interview Analyzer
Key Exit Interview Insights
0
Total Interviews Analyzed
0.0
Avg. Satisfaction (1-5)
N/A
Top Reason for Leaving
Common Themes from Feedback
Manage Exit Interview Data
Add, edit, or remove exit interview records. The dashboard will update automatically to reflect the new data.
Current Interview Records
| Employee ID | Department | Reason for Leaving | Satisfaction | Actions |
|---|
No feedback to analyze.
'; return; } // Calculate average satisfaction const totalSatisfaction = this.state.interviews.reduce((sum, i) => sum + i.satisfaction, 0); const avgSat = totalSatisfaction / total; if (this.elements.avgSatisfaction) this.elements.avgSatisfaction.textContent = avgSat.toFixed(1); // Find top reason for leaving const reasonCounts = this.state.interviews.reduce((acc, i) => { acc[i.reason] = (acc[i.reason] || 0) + 1; return acc; }, {}); const topReason = Object.keys(reasonCounts).reduce((a, b) => reasonCounts[a] > reasonCounts[b] ? a : b, 'N/A'); if (this.elements.topReason) this.elements.topReason.textContent = topReason; // Generate keyword cloud this.renderKeywordCloud(); }, renderKeywordCloud() { const cloud = this.elements.keywordCloud; if (!cloud) return; const allFeedback = this.state.interviews.map(i => i.feedback).join(' '); const commonWords = new Set(['and', 'the', 'was', 'a', 'to', 'for', 'in', 'it', 'is', 'of', 'with', 'my', 'not']); const wordCounts = allFeedback .toLowerCase() .replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g,"") .split(/\s+/) .filter(word => word.length > 3 && !commonWords.has(word)) .reduce((acc, word) => { acc[word] = (acc[word] || 0) + 1; return acc; }, {}); const sortedKeywords = Object.entries(wordCounts) .sort(([,a],[,b]) => b - a) .slice(0, 15); // Get top 15 keywords if(sortedKeywords.length === 0) { cloud.innerHTML = 'No common keywords found in feedback.
'; return; } cloud.innerHTML = ''; sortedKeywords.forEach(([word, count]) => { const keywordEl = document.createElement('span'); keywordEl.className = 'seia-keyword'; keywordEl.textContent = word; // Optional: Adjust size based on count const fontSize = 1 + (count / Math.max(...sortedKeywords.map(([,c])=>c))) * 0.8; keywordEl.style.fontSize = `${fontSize}em`; cloud.appendChild(keywordEl); }); }, renderInterviewsTable() { const tableBody = this.elements.interviewsTableBody; if (!tableBody) return; tableBody.innerHTML = ''; this.state.interviews.forEach(interview => { const row = `