import React, { useState } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Separator } from '@/components/ui/separator'; import { Monitor, Laptop, Smartphone, Printer, HardDrive, Edit, Trash2, User, Calendar, Settings, History, Info, ArrowLeft, Package } from 'lucide-react'; import { Asset, AssetWithDetails, SystemDetails, AssetAssignment, AssetItem, AssetCondition } from '@/types/asset-management'; import { format } from 'date-fns'; import { LoadingSpinner, ConfirmDialog } from './shared'; import AssetItemList from './AssetItemList'; import AssignmentTimeline from './shared/AssignmentTimeline'; import RelatedEntitiesNav from './shared/RelatedEntitiesNav'; // Helper function to get badge variant based on asset condition const getConditionBadgeVariant = (condition: AssetCondition) => { switch (condition) { case 'Excellent': return 'default'; case 'Good': return 'secondary'; case 'Fair': return 'outline'; case 'Poor': return 'destructive'; default: return 'outline'; } }; // Helper function to get asset type icon const getAssetTypeIcon = (assetType: string) => { const type = assetType.toLowerCase(); if (type.includes('laptop')) return ; if (type.includes('monitor')) return ; if (type.includes('phone') || type.includes('tablet')) return ; if (type.includes('printer') || type.includes('scanner')) return ; return ; }; interface AssetDetailProps { asset: AssetWithDetails; systemDetails?: SystemDetails; assignments?: AssetAssignment[]; items?: AssetItem[]; isLoading?: boolean; onEdit?: (asset: Asset) => void; onDelete?: (asset: Asset) => void; onBack?: () => void; onEditSystemDetails?: (systemDetails: SystemDetails) => void; onCreateSystemDetails?: (assetId: number) => void; onDeleteSystemDetails?: (systemDetails: SystemDetails) => void; onEditAssignment?: (assignment: AssetAssignment) => void; onCreateAssignment?: (assetId: number) => void; onDeleteAssignment?: (assignment: AssetAssignment) => void; onEditItem?: (item: AssetItem) => void; onCreateItem?: () => void; onDeleteItem?: (item: AssetItem) => void; onNavigateToEmployee?: (employeeId: number) => void; onNavigateToSystemDetails?: (systemDetailsId: number) => void; showRelatedEntities?: boolean; } const AssetDetail: React.FC = ({ asset, systemDetails, assignments = [], items = [], isLoading = false, onEdit, onDelete, onBack, onEditSystemDetails, onCreateSystemDetails, onDeleteSystemDetails, onEditAssignment, onCreateAssignment, onDeleteAssignment, onEditItem, onCreateItem, onDeleteItem, onNavigateToEmployee, onNavigateToSystemDetails, showRelatedEntities = true }) => { const [showDeleteDialog, setShowDeleteDialog] = useState(false); const [showDeleteSystemDetailsDialog, setShowDeleteSystemDetailsDialog] = useState(false); const [showDeleteAssignmentDialog, setShowDeleteAssignmentDialog] = useState(false); const [selectedAssignment, setSelectedAssignment] = useState(null); const currentAssignment = assignments.find(a => !a.returnedDate); const pastAssignments = assignments.filter(a => a.returnedDate); const handleDeleteAsset = () => { // Check for active assignments before allowing deletion const activeAssignments = assignments.filter(a => !a.returnedDate); if (activeAssignments.length > 0) { // This should be handled by the API, but we add a client-side check for better UX console.warn('Cannot delete asset with active assignments'); return; } if (onDelete) { onDelete(asset); setShowDeleteDialog(false); } }; const handleDeleteSystemDetails = () => { if (onDeleteSystemDetails && systemDetails) { onDeleteSystemDetails(systemDetails); setShowDeleteSystemDetailsDialog(false); } }; const handleDeleteAssignment = () => { if (onDeleteAssignment && selectedAssignment) { onDeleteAssignment(selectedAssignment); setShowDeleteAssignmentDialog(false); setSelectedAssignment(null); } }; if (isLoading) { return (
); } return (
{/* Header */}
{onBack && ( )}

{asset.assetType}

{asset.brandModel}

{/* Quick Assign Button - Only show if asset is available */} {onCreateAssignment && !currentAssignment && ( )} {onEdit && ( )} {onDelete && ( )}
{/* Asset Overview Card */}

{asset.assetCode}

{asset.assetCondition}

{asset.serialNumber}

{currentAssignment ? ( <> to {currentAssignment.employeeName} (since {format(new Date(currentAssignment.assignedDate), 'MMM d, yyyy')}) ) : ( <> Ready to be assigned )}
{onCreateAssignment && !currentAssignment && ( )}
{/* Main Content Layout */}
{/* Main Content */}
{/* Tabbed Content */} {/* System Details Tab */}
Technical Specifications
{systemDetails ? ( <> {onEditSystemDetails && ( )} {onDeleteSystemDetails && ( )} ) : ( onCreateSystemDetails && ( ) )}
{systemDetails ? (

{systemDetails.systemModel}

{systemDetails.manufacturer}

{systemDetails.processor}

{systemDetails.installedRAM}

{systemDetails.graphics}

{systemDetails.screenResolution}

{systemDetails.diskModel}

{systemDetails.diskSize}

) : (

No system details available for this asset.

{onCreateSystemDetails && ( )}
)}
{/* Items Tab */}
Asset Items & Components {onCreateItem && ( )}
{/* Assignments Tab */}
Assignment History {onCreateAssignment && ( )}
{ setSelectedAssignment(assignment); setShowDeleteAssignmentDialog(true); }} onNavigateToEmployee={onNavigateToEmployee} showActions={true} />
{/* Related Entities Sidebar */} {showRelatedEntities && (
)}
{/* Delete Dialogs */} setShowDeleteDialog(false)} onConfirm={handleDeleteAsset} title="Delete Asset" description={

Are you sure you want to delete this asset?

{asset.assetType} - {asset.brandModel} ({asset.serialNumber})

{assignments.filter(a => !a.returnedDate).length > 0 ? (

Cannot Delete Asset

This asset has {assignments.filter(a => !a.returnedDate).length} active assignment(s). Please return all active assignments before deleting this asset.

) : assignments.length > 0 ? (

Warning

This will also delete {assignments.length} assignment record(s) and any associated system details.

) : null}

This action cannot be undone.

} confirmText="Delete Asset" type="delete" /> setShowDeleteSystemDetailsDialog(false)} onConfirm={handleDeleteSystemDetails} title="Delete System Details" description="Are you sure you want to delete the system details for this asset? This action cannot be undone." confirmText="Delete System Details" type="delete" /> setShowDeleteAssignmentDialog(false)} onConfirm={handleDeleteAssignment} title="Delete Assignment" description="Are you sure you want to delete this assignment record? This action cannot be undone." confirmText="Delete Assignment" type="delete" />
); }; export default AssetDetail;