pmtool / src /components /asset-management /shared /RelatedEntitiesNav.tsx
devarshia5's picture
Upload 487 files
d97b8f9 verified
Raw
History Blame Contribute Delete
8.92 kB
import React from 'react';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import {
Package,
Settings,
Users,
ExternalLink,
ArrowRight,
Clock,
CheckCircle,
AlertCircle
} from 'lucide-react';
import { Asset, SystemDetails, AssetAssignment } from '@/types/asset-management';
interface RelatedEntitiesNavProps {
asset?: Asset;
systemDetails?: SystemDetails;
assignments?: AssetAssignment[];
onNavigateToAsset?: (assetId: number) => void;
onNavigateToSystemDetails?: (systemDetailsId: number) => void;
onNavigateToAssignments?: () => void;
onNavigateToEmployee?: (employeeId: number) => void;
currentView?: 'asset' | 'systemDetails' | 'assignments';
}
const RelatedEntitiesNav: React.FC<RelatedEntitiesNavProps> = ({
asset,
systemDetails,
assignments = [],
onNavigateToAsset,
onNavigateToSystemDetails,
onNavigateToAssignments,
onNavigateToEmployee,
currentView
}) => {
const activeAssignments = assignments.filter(a => !a.returnedDate);
const completedAssignments = assignments.filter(a => a.returnedDate);
return (
<div className="space-y-4">
<h3 className="text-lg font-semibold">Related Information</h3>
<div className="grid grid-cols-1 gap-4">
{/* Asset Information */}
{asset && (
<Card className={currentView === 'asset' ? 'border-primary bg-primary/5' : ''}>
<CardHeader className="pb-3">
<CardTitle className="text-sm flex items-center gap-2">
<Package className="h-4 w-4" />
Asset Information
{currentView === 'asset' && (
<Badge variant="secondary" className="text-xs">Current</Badge>
)}
</CardTitle>
</CardHeader>
<CardContent className="pt-0">
<div className="space-y-2">
<div>
<p className="font-medium">{asset.assetType}</p>
<p className="text-sm text-muted-foreground">{asset.brandModel}</p>
</div>
<div className="flex items-center justify-between">
<div>
<p className="text-xs text-muted-foreground">Serial: {asset.serialNumber}</p>
<p className="text-xs text-muted-foreground">Condition: {asset.assetCondition}</p>
</div>
{onNavigateToAsset && currentView !== 'asset' && (
<Button
variant="ghost"
size="sm"
onClick={() => onNavigateToAsset(asset.assetID)}
>
<ExternalLink className="h-3 w-3 mr-1" />
View
</Button>
)}
</div>
</div>
</CardContent>
</Card>
)}
{/* System Details */}
<Card className={currentView === 'systemDetails' ? 'border-primary bg-primary/5' : ''}>
<CardHeader className="pb-3">
<CardTitle className="text-sm flex items-center gap-2">
<Settings className="h-4 w-4" />
System Details
{currentView === 'systemDetails' && (
<Badge variant="secondary" className="text-xs">Current</Badge>
)}
</CardTitle>
</CardHeader>
<CardContent className="pt-0">
{systemDetails ? (
<div className="space-y-2">
<div>
<p className="font-medium">{systemDetails.systemModel}</p>
<p className="text-sm text-muted-foreground">{systemDetails.manufacturer}</p>
</div>
<div className="flex items-center justify-between">
<div>
<p className="text-xs text-muted-foreground">CPU: {systemDetails.processor}</p>
<p className="text-xs text-muted-foreground">RAM: {systemDetails.installedRAM}</p>
</div>
{onNavigateToSystemDetails && currentView !== 'systemDetails' && (
<Button
variant="ghost"
size="sm"
onClick={() => onNavigateToSystemDetails(systemDetails.systemDetailsID)}
>
<ExternalLink className="h-3 w-3 mr-1" />
View
</Button>
)}
</div>
</div>
) : (
<div className="text-center py-4">
<AlertCircle className="h-8 w-8 mx-auto mb-2 text-muted-foreground opacity-50" />
<p className="text-sm text-muted-foreground">No system details available</p>
</div>
)}
</CardContent>
</Card>
{/* Assignment History */}
<Card className={currentView === 'assignments' ? 'border-primary bg-primary/5' : ''}>
<CardHeader className="pb-3">
<CardTitle className="text-sm flex items-center gap-2">
<Users className="h-4 w-4" />
Assignment History
{currentView === 'assignments' && (
<Badge variant="secondary" className="text-xs">Current</Badge>
)}
</CardTitle>
</CardHeader>
<CardContent className="pt-0">
{assignments.length > 0 ? (
<div className="space-y-3">
{/* Current Assignment */}
{activeAssignments.length > 0 && (
<div>
<div className="flex items-center gap-2 mb-2">
<Badge variant="default" className="bg-green-600 text-xs">
<Clock className="h-3 w-3 mr-1" />
Active
</Badge>
<span className="text-xs text-muted-foreground">Current Assignment</span>
</div>
{activeAssignments.map(assignment => (
<div key={assignment.assignmentID} className="flex items-center justify-between">
<div>
<p className="text-sm font-medium">{assignment.employeeName || `Employee #${assignment.employeeID}`}</p>
<p className="text-xs text-muted-foreground">
Since {new Date(assignment.assignedDate).toLocaleDateString()}
</p>
</div>
{onNavigateToEmployee && (
<Button
variant="ghost"
size="sm"
onClick={() => onNavigateToEmployee(assignment.employeeID)}
>
<ExternalLink className="h-3 w-3 mr-1" />
View
</Button>
)}
</div>
))}
</div>
)}
{/* Assignment Summary */}
<div className="flex items-center justify-between pt-2 border-t">
<div className="flex items-center gap-4 text-xs text-muted-foreground">
<span className="flex items-center gap-1">
<Clock className="h-3 w-3" />
{activeAssignments.length} active
</span>
<span className="flex items-center gap-1">
<CheckCircle className="h-3 w-3" />
{completedAssignments.length} completed
</span>
</div>
{onNavigateToAssignments && currentView !== 'assignments' && (
<Button
variant="ghost"
size="sm"
onClick={onNavigateToAssignments}
>
<ExternalLink className="h-3 w-3 mr-1" />
View All
</Button>
)}
</div>
</div>
) : (
<div className="text-center py-4">
<Users className="h-8 w-8 mx-auto mb-2 text-muted-foreground opacity-50" />
<p className="text-sm text-muted-foreground">No assignments yet</p>
</div>
)}
</CardContent>
</Card>
</div>
</div>
);
};
export default RelatedEntitiesNav;