/** * Upcoming Deadlines Section Component * Displays upcoming deadlines with pagination */ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Progress } from '@/components/ui/progress'; import { Calendar as CalendarIcon } from 'lucide-react'; import { UpcomingDeadline } from '@/services/dashboard.service'; import { Pagination } from '@/components/common/Pagination'; import { formatHoursMinutes } from '@/utils/slaTracker'; interface UpcomingDeadlinesSectionProps { isAdmin: boolean; upcomingDeadlines: UpcomingDeadline[]; pagination: { page: number; totalPages: number; totalRecords: number; }; onPageChange: (page: number) => void; onNavigate?: (path: string) => void; } export function UpcomingDeadlinesSection({ isAdmin, upcomingDeadlines, pagination, onPageChange, onNavigate, }: UpcomingDeadlinesSectionProps) { if (upcomingDeadlines.length === 0) return null; return (
Upcoming Deadlines {isAdmin ? 'Current active levels organization-wide' : 'Requests awaiting your approval'}
{upcomingDeadlines.map((deadline, idx) => { const tatPercentage = Number(deadline.tatPercentageUsed) || 0; const elapsedHours = Number(deadline.elapsedHours) || 0; const remainingHours = Number(deadline.remainingHours) || 0; return (
onNavigate?.(`request/${deadline.requestNumber}`)} data-testid={`deadline-item-${deadline.requestNumber}`} >
{deadline.requestNumber} {deadline.priority}

{deadline.requestTitle}

Level {deadline.levelNumber || '?'}/{(deadline as any).totalLevels || '?'} {deadline.approverName}

TAT Used

= 80 ? 'text-red-600' : tatPercentage >= 50 ? 'text-orange-600' : 'text-green-600' }`} > {tatPercentage.toFixed(0)}%

= 80 ? 'bg-red-100' : tatPercentage >= 50 ? 'bg-orange-100' : 'bg-green-100' }`} />
{formatHoursMinutes(elapsedHours)} elapsed {formatHoursMinutes(remainingHours)} left
); })}
{/* Pagination for Upcoming Deadlines */}
); }