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 (
{printer.name}
{printer.location}
Upload a floor plan to get started
Click the "Upload Floor Plan" button above
Name
{selectedPrinter.name}
Model
{selectedPrinter.model}
Serial Number
{selectedPrinter.serialNumber}
IP Address
{selectedPrinter.ipAddress}
Location
{selectedPrinter.location}
Department
{selectedPrinter.department}
Type
{selectedPrinter.type}
Status
{selectedPrinter.status}
Paper Capacity
{selectedPrinter.paperCapacity}
Notes
{selectedPrinter.notes}
Select a printer on the map to view details
or click "Add Printer" to place a new one
{printer.name}
{printer.location || 'No location'}