';
empCard.innerHTML = `
${tasksHtml}
`;
container.appendChild(empCard);
}
// Add event listeners after rendering
addDashboardEventListeners();
}
function addDashboardEventListeners() {
document.querySelectorAll('.status-select').forEach(select => {
select.addEventListener('change', (e) => updateTaskStatus(e.target.dataset.taskId, e.target.value));
});
document.querySelectorAll('.delete-task').forEach(button => {
button.addEventListener('click', (e) => deleteTask(e.currentTarget.dataset.taskId));
});
document.querySelectorAll('.delete-employee').forEach(button => {
button.addEventListener('click', (e) => deleteEmployee(e.currentTarget.dataset.empId));
});
}
function updateEmployeeSelect() {
const select = document.getElementById('employeeSelect');
select.innerHTML = '';
for (const [id, emp] of Object.entries(sessionData.employees)) {
select.innerHTML += ``;
}
}
// --- DATABASE OPERATIONS ---
document.getElementById('addEmployeeBtn').addEventListener('click', async () => {
const name = document.getElementById('employeeNameInput').value.trim();
if (!name) return showMessage("Employee name is required.", true);
const empId = 'emp_' + Date.now();
const path = `employees.${empId}`;
await updateDoc(sessionDocRef, { [path]: { name } });
document.getElementById('employeeNameInput').value = '';
showMessage("Employee added successfully.");
});
async function deleteEmployee(empId) {
// Also delete tasks assigned to this employee
const tasksToDelete = Object.keys(sessionData.tasks).filter(taskId => sessionData.tasks[taskId].employeeId === empId);
const updates = {};
updates[`employees.${empId}`] = deleteField();
tasksToDelete.forEach(taskId => {
updates[`tasks.${taskId}`] = deleteField();
});
await updateDoc(sessionDocRef, updates);
showMessage("Employee and their tasks have been removed.");
}
document.getElementById('assignTaskBtn').addEventListener('click', async () => {
const employeeId = document.getElementById('employeeSelect').value;
const text = document.getElementById('taskInput').value.trim();
if (!employeeId || !text) {
return showMessage("Please select an employee and enter a task.", true);
}
const taskId = 'task_' + Date.now();
const path = `tasks.${taskId}`;
const newTask = { employeeId, text, status: 'To-Do', assignedAt: new Date().toISOString() };
await updateDoc(sessionDocRef, { [path]: newTask });
document.getElementById('taskInput').value = '';
showMessage("Task assigned successfully.");
});
async function updateTaskStatus(taskId, status) {
const path = `tasks.${taskId}.status`;
await updateDoc(sessionDocRef, { [path]: status });
}
async function deleteTask(taskId) {
const path = `tasks.${taskId}`;
await updateDoc(sessionDocRef, { [path]: deleteField() });
}
// --- UI & PDF ---
const tabs = document.querySelectorAll('.tab-content');
const tabLinks = document.querySelectorAll('.tab-link');
window.showTab = (tabIndex) => {
tabs.forEach((t, i) => { t.style.display = i === tabIndex ? 'block' : 'none'; });
tabLinks.forEach((l, i) => { l.classList.toggle('active', i === tabIndex); l.classList.toggle('inactive', i !== tabIndex); });
};
document.getElementById('downloadPdfBtn').addEventListener('click', () => {
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
const { employees, tasks } = sessionData;
const pageHeight = doc.internal.pageSize.height;
const margin = 15;
let y = margin;
doc.setFontSize(22); doc.setFont("helvetica", "bold");
doc.text("Employee Task Report", doc.internal.pageSize.width / 2, y, { align: 'center' });
y += 10;
doc.setFontSize(12); doc.setFont("helvetica", "normal");
doc.text(`Session ID: ${currentSessionId}`, doc.internal.pageSize.width / 2, y, { align: 'center' });
y += 15;
for (const [empId, emp] of Object.entries(employees)) {
if (y + 20 > pageHeight - margin) { doc.addPage(); y = margin; }
doc.setFontSize(16); doc.setFont("helvetica", "bold");
doc.text(emp.name, margin, y);
y += 10;
const empTasks = Object.values(tasks).filter(task => task.employeeId === empId);
doc.setFontSize(12); doc.setFont("helvetica", "normal");
if (empTasks.length > 0) {
empTasks.forEach(task => {
const taskText = `[${task.status}] ${task.text}`;
const lines = doc.splitTextToSize(taskText, doc.internal.pageSize.width - margin * 2 - 5);
if (y + (lines.length * 7) > pageHeight - margin) { doc.addPage(); y = margin; }
doc.text(lines, margin + 5, y);
y += lines.length * 7;
});
} else {
if (y + 10 > pageHeight - margin) { doc.addPage(); y = margin; }
doc.text("No tasks assigned.", margin + 5, y);
y += 7;
}
y += 5; // Extra space between employees
}
doc.save(`task-report-${currentSessionId}.pdf`);
});
function showMessage(message, isError = false) {
const box = document.getElementById('messageBox');
box.textContent = message;
box.className = `fixed top-5 right-5 text-white py-2 px-4 rounded-lg shadow-lg ${isError ? 'bg-red-500' : 'bg-green-500'}`;
setTimeout(() => { box.className += ' hidden'; }, 3000);
}
