Online Task-Based Employee Management Tool

Task-Based Employee Management Tool

Session ID: Loading... (Share with your team)

No tasks assigned.

'; } tasksHtml += '
'; empCard.innerHTML = `

${emp.name}

${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); }
Scroll to Top