Task & Time Integration Tool

Task & Time Integration Tool

Today's Schedule

to ${formatTime(task.endTime)}

(${duration})

${task.name}

${formatDate(task.date)}

${task.priority}
`; dashboardOutput.appendChild(card); }); } // --- TAB NAVIGATION --- function updateTabUI() { tabPanels.forEach((panel, index) => { panel.classList.toggle('hidden', index !== currentTab); }); tabButtons.forEach((button, index) => { button.classList.toggle('tab-active', index === currentTab); button.classList.toggle('tab-inactive', index !== currentTab); }); if (prevTabBtn) prevTabBtn.disabled = currentTab === 0; if (nextTabBtn) nextTabBtn.disabled = currentTab === totalTabs - 1; } function changeTab(newIndex) { if (newIndex >= 0 && newIndex < totalTabs) { currentTab = newIndex; updateTabUI(); } } // --- EVENT HANDLERS --- if (taskForm) { taskForm.addEventListener('submit', (e) => { e.preventDefault(); // Null checks for inputs if (!taskNameInput || !taskDateInput || !startTimeInput || !endTimeInput || !priorityInput || !taskIdInput) return; const id = taskIdInput.value ? parseInt(taskIdInput.value) : Date.now(); const taskData = { id: id, name: taskNameInput.value, date: taskDateInput.value, startTime: startTimeInput.value, endTime: endTimeInput.value, priority: priorityInput.value }; if (taskIdInput.value) { // Update existing task tasks = tasks.map(t => t.id === id ? taskData : t); } else { // Add new task tasks.push(taskData); } resetForm(); renderAll(); }); } if (formCancelBtn) { formCancelBtn.addEventListener('click', resetForm); } window.editTaskHandler = (id) => { const task = tasks.find(t => t.id === id); if (task && taskIdInput && taskNameInput && taskDateInput && startTimeInput && endTimeInput && priorityInput && formTitle && formSubmitBtn && formCancelBtn) { taskIdInput.value = task.id; taskNameInput.value = task.name; taskDateInput.value = task.date; startTimeInput.value = task.startTime; endTimeInput.value = task.endTime; priorityInput.value = task.priority; formTitle.textContent = 'Edit Task'; formSubmitBtn.textContent = 'Update Task'; formSubmitBtn.classList.remove('bg-green-600', 'hover:bg-green-700'); formSubmitBtn.classList.add('bg-yellow-500', 'hover:bg-yellow-600'); formCancelBtn.classList.remove('hidden'); changeTab(1); // Switch to config tab } }; window.deleteTaskHandler = (id) => { tasks = tasks.filter(t => t.id !== id); renderAll(); }; if (downloadPdfBtn) { downloadPdfBtn.addEventListener('click', generatePDF); } tabButtons.forEach(button => { button.addEventListener('click', () => { const tabIndex = parseInt(button.getAttribute('data-tab-index')); changeTab(tabIndex); }); }); if (nextTabBtn) { nextTabBtn.addEventListener('click', () => changeTab(currentTab + 1)); } if (prevTabBtn) { prevTabBtn.addEventListener('click', () => changeTab(currentTab - 1)); } // --- UTILITY FUNCTIONS --- function resetForm() { if (taskForm) taskForm.reset(); if (taskIdInput) taskIdInput.value = ''; if (formTitle) formTitle.textContent = 'Add New Task'; if (formSubmitBtn) { formSubmitBtn.textContent = 'Add Task'; formSubmitBtn.classList.remove('bg-yellow-500', 'hover:bg-yellow-600'); formSubmitBtn.classList.add('bg-green-600', 'hover:bg-green-700'); } if (formCancelBtn) formCancelBtn.classList.add('hidden'); } function getPriorityClass(priority) { switch (priority) { case 'High': return 'bg-red-100 text-red-800'; case 'Medium': return 'bg-yellow-100 text-yellow-800'; case 'Low': return 'bg-green-100 text-green-800'; default: return 'bg-gray-100 text-gray-800'; } } function getPriorityBorderClass(priority) { switch (priority) { case 'High': return 'border-red-500 bg-red-50'; case 'Medium': return 'border-yellow-500 bg-yellow-50'; case 'Low': return 'border-green-500 bg-green-50'; default: return 'border-gray-500 bg-gray-50'; } } function formatDate(dateString) { const options = { year: 'numeric', month: 'long', day: 'numeric' }; return new Date(dateString + 'T00:00:00').toLocaleDateString('en-US', options); } function formatTime(timeString) { const [hour, minute] = timeString.split(':'); const h = parseInt(hour); const ampm = h >= 12 ? 'PM' : 'AM'; const formattedHour = h % 12 === 0 ? 12 : h % 12; return `${formattedHour}:${minute} ${ampm}`; } function calculateDuration(start, end) { const startDate = new Date(`1970-01-01T${start}:00`); const endDate = new Date(`1970-01-01T${end}:00`); let diff = endDate.getTime() - startDate.getTime(); if (diff < 0) return 'N/A'; const hours = Math.floor(diff / (1000 * 60 * 60)); diff -= hours * (1000 * 60 * 60); const mins = Math.floor(diff / (1000 * 60)); let durationStr = ''; if (hours > 0) durationStr += `${hours}h `; if (mins > 0) durationStr += `${mins}m`; return durationStr.trim() || '0m'; } // --- PDF GENERATION --- function generatePDF() { const { jsPDF } = window.jspdf; const doc = new jsPDF(); doc.setFontSize(18); doc.text("Task Schedule", 14, 22); doc.setFontSize(11); doc.setTextColor(100); doc.text(`Generated on: ${new Date().toLocaleDateString('en-US')}`, 14, 29); const sortedTasks = [...tasks].sort((a, b) => new Date(`${a.date}T${a.startTime}`) - new Date(`${b.date}T${b.startTime}`)); const tableColumn = ["Task Name", "Date", "Start Time", "End Time", "Duration", "Priority"]; const tableRows = []; sortedTasks.forEach(task => { const taskData = [ task.name, formatDate(task.date), formatTime(task.startTime), formatTime(task.endTime), calculateDuration(task.startTime, task.endTime), task.priority ]; tableRows.push(taskData); }); doc.autoTable({ head: [tableColumn], body: tableRows, startY: 35, theme: 'grid', headStyles: { fillColor: [22, 160, 133] }, }); doc.save("task-schedule.pdf"); } // --- START THE APP --- initialize(); });
Scroll to Top