// DueDateAlertsWidget - Shows projects with approaching/overdue deadlines function DueDateAlertsWidget({ projects, onViewChange }) { // Categorize projects by deadline urgency const categorizedProjects = React.useMemo(() => { const now = new Date(); now.setHours(0, 0, 0, 0); const overdue = []; const urgent = []; const upcoming = []; projects.forEach(p => { if (!p.due_date || p.status === 'completato' || p.is_archived) return; const due = new Date(p.due_date); due.setHours(0, 0, 0, 0); const daysUntil = Math.ceil((due - now) / (1000 * 60 * 60 * 24)); const projectWithDays = { ...p, daysUntil }; if (daysUntil < 0) { overdue.push(projectWithDays); } else if (daysUntil <= 3) { urgent.push(projectWithDays); } else if (daysUntil <= 7) { upcoming.push(projectWithDays); } }); // Sort each category by urgency overdue.sort((a, b) => a.daysUntil - b.daysUntil); urgent.sort((a, b) => a.daysUntil - b.daysUntil); upcoming.sort((a, b) => a.daysUntil - b.daysUntil); return { overdue, urgent, upcoming }; }, [projects]); const totalAlerts = categorizedProjects.overdue.length + categorizedProjects.urgent.length + categorizedProjects.upcoming.length; // Get badge style based on category const getBadgeStyle = (category) => { switch (category) { case 'overdue': return 'bg-red-100 text-red-700 border-red-200'; case 'urgent': return 'bg-amber-100 text-amber-700 border-amber-200'; case 'upcoming': return 'bg-blue-100 text-blue-700 border-blue-200'; default: return 'bg-slate-100 text-slate-700 border-slate-200'; } }; // Get label based on days const getDaysLabel = (daysUntil) => { if (daysUntil < 0) { const days = Math.abs(daysUntil); return days === 1 ? 'Scaduto ieri' : `Scaduto da ${days} giorni`; } else if (daysUntil === 0) { return 'Scade oggi'; } else if (daysUntil === 1) { return 'Scade domani'; } else { return `Scade tra ${daysUntil} giorni`; } }; // Get priority badge const getPriorityBadge = (priority) => { const styles = { high: 'bg-red-50 text-red-600', medium: 'bg-amber-50 text-amber-600', low: 'bg-slate-50 text-slate-600' }; const labels = { high: 'Alta', medium: 'Media', low: 'Bassa' }; return ( {labels[priority] || priority} ); }; // Render a project item const renderProjectItem = (project, category) => (