import React from 'react'; import { Card, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Calendar, User, Clock, CheckCircle, ArrowRight, Edit, Trash2, ExternalLink } from 'lucide-react'; import { AssetAssignment } from '@/types/asset-management'; import { format, formatDistanceToNow, isAfter, isBefore } from 'date-fns'; interface AssignmentTimelineProps { assignments: AssetAssignment[]; onEditAssignment?: (assignment: AssetAssignment) => void; onDeleteAssignment?: (assignment: AssetAssignment) => void; onNavigateToEmployee?: (employeeId: number) => void; showActions?: boolean; } const AssignmentTimeline: React.FC = ({ assignments, onEditAssignment, onDeleteAssignment, onNavigateToEmployee, showActions = true }) => { // Sort assignments by assigned date (most recent first) const sortedAssignments = [...assignments].sort((a, b) => new Date(b.assignedDate).getTime() - new Date(a.assignedDate).getTime() ); const getAssignmentStatus = (assignment: AssetAssignment) => { if (!assignment.returnedDate) { return 'active'; } return 'completed'; }; const getStatusBadge = (assignment: AssetAssignment) => { const status = getAssignmentStatus(assignment); if (status === 'active') { return ( Active ); } return ( Completed ); }; const getDuration = (assignment: AssetAssignment) => { const startDate = new Date(assignment.assignedDate); const endDate = assignment.returnedDate ? new Date(assignment.returnedDate) : new Date(); if (!assignment.returnedDate) { return `${formatDistanceToNow(startDate)} (ongoing)`; } const durationMs = endDate.getTime() - startDate.getTime(); const days = Math.floor(durationMs / (1000 * 60 * 60 * 24)); if (days < 1) { return 'Less than 1 day'; } else if (days === 1) { return '1 day'; } else if (days < 30) { return `${days} days`; } else if (days < 365) { const months = Math.floor(days / 30); return months === 1 ? '1 month' : `${months} months`; } else { const years = Math.floor(days / 365); return years === 1 ? '1 year' : `${years} years`; } }; if (assignments.length === 0) { return (

No assignment history available.

); } return (
{/* Timeline */}
{/* Timeline line */}
{sortedAssignments.map((assignment, index) => { const isActive = getAssignmentStatus(assignment) === 'active'; const isLast = index === sortedAssignments.length - 1; return (
{/* Timeline dot */}
{isActive ? ( ) : ( )}
{/* Timeline content */}
{/* Header */}
{getStatusBadge(assignment)} Assignment #{assignment.assignmentID}
{/* Employee info */}
{assignment.employeeName || `Employee #${assignment.employeeID}`} {onNavigateToEmployee && ( )}
{/* Date range */}
{format(new Date(assignment.assignedDate), 'PPP')} {assignment.returnedDate && ( <> {format(new Date(assignment.returnedDate), 'PPP')} )}
{/* Duration */}
Duration: {getDuration(assignment)}
{/* Remarks */} {assignment.remarks && (

Remarks:

{assignment.remarks}

)}
{/* Actions */} {showActions && (
{onEditAssignment && ( )} {onDeleteAssignment && ( )}
)}
); })}
); }; export default AssignmentTimeline;