`;
});
// 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();
});
