import React, { useState, useRef } from 'react'; import { Printer, Upload, Edit2, Trash2, Save, X, Plus, Move } from 'lucide-react'; const PrinterMap = () => { const [floorPlanImage, setFloorPlanImage] = useState(null); const [printers, setPrinters] = useState([]); const [selectedPrinter, setSelectedPrinter] = useState(null); const [editingPrinter, setEditingPrinter] = useState(null); const [isDragging, setIsDragging] = useState(false); const [draggedPrinterId, setDraggedPrinterId] = useState(null); const [isAddingPrinter, setIsAddingPrinter] = useState(false); const fileInputRef = useRef(null); const mapRef = useRef(null); const defaultPrinterData = { name: '', model: '', serialNumber: '', ipAddress: '', location: '', department: '', type: 'Color', status: 'Available', paperCapacity: '', notes: '' }; const handleImageUpload = (e) => { const file = e.target.files[0]; if (file) { const reader = new FileReader(); reader.onload = (event) => { setFloorPlanImage(event.target.result); }; reader.readAsDataURL(file); } }; const handleMapClick = (e) => { if (!isAddingPrinter) return; const rect = mapRef.current.getBoundingClientRect(); const x = ((e.clientX - rect.left) / rect.width) * 100; const y = ((e.clientY - rect.top) / rect.height) * 100; const newPrinter = { id: Date.now(), x, y, ...defaultPrinterData, name: `Printer ${printers.length + 1}` }; setPrinters([...printers, newPrinter]); setEditingPrinter(newPrinter); setIsAddingPrinter(false); }; const handlePrinterMouseDown = (e, printerId) => { e.stopPropagation(); setIsDragging(true); setDraggedPrinterId(printerId); setSelectedPrinter(printers.find(p => p.id === printerId)); }; const handleMouseMove = (e) => { if (!isDragging || !draggedPrinterId) return; const rect = mapRef.current.getBoundingClientRect(); const x = Math.max(0, Math.min(100, ((e.clientX - rect.left) / rect.width) * 100)); const y = Math.max(0, Math.min(100, ((e.clientY - rect.top) / rect.height) * 100)); setPrinters(printers.map(p => p.id === draggedPrinterId ? { ...p, x, y } : p )); }; const handleMouseUp = () => { setIsDragging(false); setDraggedPrinterId(null); }; const handleUpdatePrinter = (updatedData) => { setPrinters(printers.map(p => p.id === editingPrinter.id ? { ...p, ...updatedData } : p )); setEditingPrinter({ ...editingPrinter, ...updatedData }); if (selectedPrinter?.id === editingPrinter.id) { setSelectedPrinter({ ...selectedPrinter, ...updatedData }); } }; const handleDeletePrinter = (printerId) => { setPrinters(printers.filter(p => p.id !== printerId)); if (selectedPrinter?.id === printerId) setSelectedPrinter(null); if (editingPrinter?.id === printerId) setEditingPrinter(null); }; const getStatusColor = (status) => { switch (status) { case 'Available': return '#10b981'; case 'In Use': return '#f59e0b'; case 'Offline': return '#ef4444'; case 'Maintenance': return '#8b5cf6'; default: return '#6b7280'; } }; const getTypeColor = (type) => { switch (type) { case 'Color': return '#3b82f6'; case 'Black & White': return '#6b7280'; case 'Large Format': return '#8b5cf6'; case 'Multifunction': return '#06b6d4'; default: return '#6b7280'; } }; return (

Building Floor Plan

{floorPlanImage && ( )}
{floorPlanImage ? ( <> Floor Plan {printers.map(printer => (
handlePrinterMouseDown(e, printer.id)} onClick={(e) => { e.stopPropagation(); setSelectedPrinter(printer); }} >
{selectedPrinter?.id === printer.id && (
)}

{printer.name}

{printer.location}

))} ) : (

Upload a floor plan to get started

Click the "Upload Floor Plan" button above

)}
{isAddingPrinter && (
Add Printer Mode: Click anywhere on the floor plan to place a new printer
)}
{editingPrinter ? (

Edit Printer

handleUpdatePrinter({ name: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
handleUpdatePrinter({ model: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
handleUpdatePrinter({ serialNumber: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
handleUpdatePrinter({ ipAddress: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
handleUpdatePrinter({ location: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
handleUpdatePrinter({ department: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
handleUpdatePrinter({ paperCapacity: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="e.g., 500 sheets" />