import React, { useState } from 'react'; import { Button, Box, Typography, IconButton } from '@mui/material'; import { Add as AddIcon, Delete as DeleteIcon, UploadFile as UploadFileIcon, Refresh as RefreshIcon } from '@mui/icons-material'; import UploadDialog from './UploadDialog'; import {ApiError, Dewar, Shipment, ShipmentsService} from '../../openapi'; import { SxProps } from '@mui/material'; import bottleGrey from '/src/assets/icons/bottle-svgrepo-com-grey.svg'; import bottleYellow from '/src/assets/icons/bottle-svgrepo-com-yellow.svg'; import bottleGreen from '/src/assets/icons/bottle-svgrepo-com-green.svg'; import bottleRed from '/src/assets/icons/bottle-svgrepo-com-red.svg'; interface ShipmentPanelProps { setCreatingShipment: (value: boolean) => void; activePgroup: string; selectShipment: (shipment: Shipment | null) => void; selectedShipment: Shipment | null; sx?: SxProps; shipments: Shipment[]; refreshShipments: () => void; error: string | null; } const statusIconMap: Record = { 'In Transit': bottleYellow, 'Delivered': bottleGreen, 'Pending': bottleGrey, 'Unknown': bottleRed, }; const ShipmentPanel: React.FC = ({ activePgroup, setCreatingShipment, selectShipment, selectedShipment, sx, shipments, refreshShipments, error, }) => { const [uploadDialogOpen, setUploadDialogOpen] = useState(false); console.log('Active Pgroup:', activePgroup); const handleDeleteShipment = async () => { if (selectedShipment) { const confirmDelete = window.confirm( `Are you sure you want to delete the shipment: ${selectedShipment.shipment_name}?` ); if (!confirmDelete) return; // Try to delete the shipment await deleteShipment(selectedShipment.id); } }; const deleteShipment = async (shipmentId: number) => { if (!shipmentId) return; try { await ShipmentsService.deleteShipmentProtectedShipmentsShipmentIdDelete(shipmentId); refreshShipments(); selectShipment(null); alert("Shipment deleted successfully."); } catch (error: any) { console.error("Failed to delete shipment:", error); let errorMessage = "Failed to delete shipment."; if (error instanceof ApiError && error.body) { errorMessage = error.body.detail || errorMessage; } alert(errorMessage); } }; const handleShipmentSelection = (shipment: Shipment) => { const isSelected = selectedShipment?.id === shipment.id; selectShipment(isSelected ? null : shipment); }; const openUploadDialog = (event: React.MouseEvent) => { event.stopPropagation(); setUploadDialogOpen(true); }; const closeUploadDialog = () => setUploadDialogOpen(false); const getNumberOfDewars = (shipment: Shipment): number => shipment.dewars?.length || 0; return ( {error && {error}} Shipments {shipments.map((shipment) => { const isSelected = selectedShipment?.id === shipment.id; return ( handleShipmentSelection(shipment)} > {`Status: {getNumberOfDewars(shipment)} {shipment.shipment_name} {shipment.shipment_date} Total Pucks: {shipment.dewars?.reduce((total, dewar: Dewar) => total + (dewar.number_of_pucks || 0), 0) ?? 0} {isSelected && ( { event.stopPropagation(); openUploadDialog(event); }} color="primary" title="Upload Sample Data Sheet" sx={{ marginLeft: 1 }} > { event.stopPropagation(); handleDeleteShipment(); }} color="error" title="Delete Shipment" sx={{ marginLeft: 1 }} > )} ); })} ); }; export default ShipmentPanel;