import React, { useState, useMemo } from 'react'; import { format } from 'date-fns'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Badge } from '@/components/ui/badge'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from '@/components/ui/collapsible'; import { Clock, CheckCircle, XCircle, Package, ChevronDown, ChevronUp, Search, FileText, Calendar, User, MessageSquare, } from 'lucide-react'; import { AssetRequest, RequestStatus, REQUEST_STATUS_LABELS, } from '@/types/asset-request'; interface MyAssetRequestsProps { requests: AssetRequest[]; isLoading?: boolean; onAcknowledge?: (requestId: number) => void; } const MyAssetRequests: React.FC = ({ requests, isLoading = false, onAcknowledge, }) => { const [searchTerm, setSearchTerm] = useState(''); const [expandedRequests, setExpandedRequests] = useState>(new Set()); const toggleExpanded = (requestID: number) => { setExpandedRequests((prev) => { const newSet = new Set(prev); if (newSet.has(requestID)) { newSet.delete(requestID); } else { newSet.add(requestID); } return newSet; }); }; // Filter requests by status const filterByStatus = (status?: RequestStatus) => { let filtered = requests; if (status) { filtered = filtered.filter((req) => req.status === status); } // Apply search filter if (searchTerm) { const term = searchTerm.toLowerCase(); filtered = filtered.filter( (req) => req.requestID.toString().includes(term) || req.justification.toLowerCase().includes(term) || req.requestedAssets.some((asset) => asset.assetType.toLowerCase().includes(term) ) || (req.adminComments && req.adminComments.toLowerCase().includes(term)) ); } return filtered.sort( (a, b) => new Date(b.submittedDate).getTime() - new Date(a.submittedDate).getTime() ); }; const allRequests = useMemo(() => filterByStatus(), [requests, searchTerm]); const pendingRequests = useMemo(() => filterByStatus('pending'), [requests, searchTerm]); const approvedRequests = useMemo(() => filterByStatus('approved'), [requests, searchTerm]); const rejectedRequests = useMemo(() => filterByStatus('rejected'), [requests, searchTerm]); const assignedRequests = useMemo(() => filterByStatus('assigned'), [requests, searchTerm]); const acknowledgedRequests = useMemo(() => filterByStatus('acknowledged'), [requests, searchTerm]); const getStatusIcon = (status: RequestStatus) => { switch (status) { case 'pending': return ; case 'approved': return ; case 'rejected': return ; case 'assigned': return ; case 'acknowledged': return ; } }; const getStatusColor = (status: RequestStatus) => { switch (status) { case 'pending': return 'bg-yellow-100 text-yellow-800 border-yellow-200'; case 'approved': return 'bg-green-100 text-green-800 border-green-200'; case 'rejected': return 'bg-red-100 text-red-800 border-red-200'; case 'assigned': return 'bg-blue-100 text-blue-800 border-blue-200'; case 'acknowledged': return 'bg-purple-100 text-purple-800 border-purple-200'; } }; const RequestCard: React.FC<{ request: AssetRequest }> = ({ request }) => { const isExpanded = expandedRequests.has(request.requestID); return ( toggleExpanded(request.requestID)}>
Request #{request.requestID} {getStatusIcon(request.status)} {REQUEST_STATUS_LABELS[request.status]}
{format(new Date(request.submittedDate), 'MMM dd, yyyy')} {request.requestedAssets.length} item(s)
{/* Requested Assets */}

Requested Assets

{request.requestedAssets.map((asset, index) => (

{asset.assetType}

Quantity: {asset.quantity}

{asset.specifications && (

Specs: {asset.specifications}

)}
))}
{/* Justification */}

Justification

{request.justification}

{/* Review Information */} {(request.reviewedDate || request.adminComments) && (

Review Information

{request.reviewedDate && (
Reviewed on {format(new Date(request.reviewedDate), 'MMM dd, yyyy')}
)} {request.reviewerName && (
Reviewed by {request.reviewerName}
)} {request.adminComments && (
Admin Comments:

{request.adminComments}

)}
)} {/* Assignment Information */} {request.assignedDate && (

Assignment Information

Assigned on {format(new Date(request.assignedDate), 'MMM dd, yyyy')}
{request.assignerName && (
Assigned by {request.assignerName}
)}
{/* Acknowledge Button - Only show if status is 'assigned' and not yet acknowledged */} {request.status === 'assigned' && !request.acknowledgedDate && onAcknowledge && (
)}
)} {/* Acknowledgement Information */} {request.acknowledgedDate && (

Acknowledgement Information

Acknowledged on {format(new Date(request.acknowledgedDate), 'MMM dd, yyyy')}
{request.acknowledgementComments && (
Comments:

{request.acknowledgementComments}

)}
)}
); }; const EmptyState: React.FC<{ message: string }> = ({ message }) => (

{message}

); const RequestList: React.FC<{ requests: AssetRequest[]; emptyMessage: string }> = ({ requests, emptyMessage, }) => { if (isLoading) { return (
); } if (requests.length === 0) { return ; } return (
{requests.map((request) => ( ))}
); }; return ( My Asset Requests
setSearchTerm(e.target.value)} className="pl-10" aria-label="Search asset requests" />
All ({allRequests.length}) Pending ({pendingRequests.length}) Approved ({approvedRequests.length}) Rejected ({rejectedRequests.length}) Assigned ({assignedRequests.length}) Acknowledged ({acknowledgedRequests.length})
); }; export default MyAssetRequests;