Online Real-Time Employee Feedback Collector

Real-Time Employee Feedback Collector

Submit and visualize anonymous feedback instantly.

Share Your Feedback Anonymously

Total Submissions

0

Praise

0

Suggestions

0

Concerns

0

Feedback by Category

Live Feedback Feed

${item.text}

`; }); // Chart if (categoryChart) categoryChart.destroy(); const ctx = document.getElementById('categoryChart').getContext('2d'); categoryChart = new Chart(ctx, { type: 'doughnut', data: { labels: ['Praise', 'Suggestion', 'Concern'], datasets: [{ data: [counts.Praise, counts.Suggestion, counts.Concern], backgroundColor: ['#10B981', '#F59E0B', '#EF4444'] }] }, options: { responsive: true } }); }; const renderFeedbackTable = () => { const tableBody = document.getElementById('feedbackTable'); tableBody.innerHTML = ''; [...feedbackData].reverse().forEach(item => { tableBody.innerHTML += ` ${new Date(item.timestamp).toLocaleDateString()} ${item.category} ${item.text} `; }); }; // --- CORE LOGIC --- document.getElementById('feedbackForm').addEventListener('submit', (e) => { e.preventDefault(); const text = document.getElementById('feedbackText').value; if (!text.trim()) return; const newFeedback = { id: Date.now(), category: document.getElementById('feedbackCategory').value, text: text, timestamp: new Date().toISOString() }; feedbackData.push(newFeedback); saveData(); renderDashboard(); renderFeedbackTable(); document.getElementById('feedbackForm').reset(); alert('Thank you, your feedback has been submitted anonymously.'); }); app.deleteFeedback = (id) => { if (confirm('Are you sure you want to delete this feedback entry?')) { feedbackData = feedbackData.filter(item => item.id !== id); saveData(); renderDashboard(); renderFeedbackTable(); } }; // --- UTILS & HELPERS --- app.changeTab = (tabIndex) => { document.querySelectorAll('[id^="tabContent-"]').forEach(el => el.classList.add('hidden')); document.querySelectorAll('[id^="tab-"]').forEach(el => el.classList.replace('tab-active', 'tab-inactive')); document.getElementById(`tabContent-${tabIndex}`).classList.remove('hidden'); document.getElementById(`tab-${tabIndex}`).classList.replace('tab-inactive', 'tab-active'); }; app.downloadReportPDF = () => { const { jsPDF } = window.jspdf; const doc = new jsPDF(); doc.setFontSize(20); doc.text('Employee Feedback Report', 105, 20, { align: 'center' }); doc.setFontSize(12); doc.text(`Generated on: ${new Date().toLocaleDateString()}`, 105, 28, { align: 'center' }); const kpiText = `Total Submissions: ${feedbackData.length}\nPraise: ${document.getElementById('kpiPraise').textContent}\nSuggestions: ${document.getElementById('kpiSuggestion').textContent}\nConcerns: ${document.getElementById('kpiConcern').textContent}`; doc.text(kpiText, 15, 45); const head = [['Date', 'Category', 'Feedback']]; const body = feedbackData.map(item => [new Date(item.timestamp).toLocaleString(), item.category, item.text]); doc.autoTable({ head, body, startY: 65, didDrawPage: function (data) { // Header doc.setFontSize(20); doc.setTextColor(40); if (data.pageNumber === 1) { // No header on first page } else { doc.text('Employee Feedback Report (Continued)', data.settings.margin.left, 15); } } }); doc.save('employee_feedback_report.pdf'); }; // --- INITIALIZATION --- loadData(); renderDashboard(); renderFeedbackTable(); });
Scroll to Top