"use client"; import { useState, useEffect, useRef } from "react"; import type { Article, ArticleInput, ArticleFamily } from "@/src/types/article"; import type { Stabilimento, Magazzino } from "@/src/types/stabilimento"; interface ArticleModalProps { article: Article | null; families: ArticleFamily[]; onClose: () => void; onSave: (article: Article) => void; } export default function ArticleModal({ article, families, onClose, onSave, }: ArticleModalProps) { const isEdit = article !== null; const modalRef = useRef(null); const [formData, setFormData] = useState({ codice: "", descrizione: "", barcode: "", id_famiglia: null, id_magazzino: null, prezzo: 0, quantita_minima: 0, quantita: 0, }); const [stabilimenti, setStabilimenti] = useState([]); const [magazzini, setMagazzini] = useState([]); const [selectedStabilimento, setSelectedStabilimento] = useState(null); const [selectedMagazzino, setSelectedMagazzino] = useState(null); const [quantitaIniziale, setQuantitaIniziale] = useState(0); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); useEffect(() => { if (article) { setFormData({ codice: article.codice, descrizione: article.descrizione, barcode: article.barcode || "", id_famiglia: article.id_famiglia, id_magazzino: article.id_magazzino, prezzo: article.prezzo, quantita_minima: article.quantita_minima, quantita: 0, }); } }, [article]); useEffect(() => { if (!isEdit) { async function fetchData() { try { const [stabRes, magRes] = await Promise.all([ fetch("/api/stabilimenti"), fetch("/api/magazzini"), ]); if (stabRes.ok && magRes.ok) { const stabData = await stabRes.json(); const magData = await magRes.json(); setStabilimenti(stabData.stabilimenti); setMagazzini(magData.magazzini); } } catch (error) { console.error("Errore caricamento stabilimenti/magazzini:", error); } } fetchData(); } }, [isEdit]); useEffect(() => { function handleKeyDown(e: KeyboardEvent) { if (e.key === "Escape") { onClose(); } } function handleClickOutside(e: MouseEvent) { if (modalRef.current && !modalRef.current.contains(e.target as Node)) { onClose(); } } document.addEventListener("keydown", handleKeyDown); document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("keydown", handleKeyDown); document.removeEventListener("mousedown", handleClickOutside); }; }, [onClose]); const filteredMagazzini = selectedStabilimento ? magazzini.filter((m) => m.id_stabilimento === selectedStabilimento) : []; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); if (!isEdit && quantitaIniziale > 0 && !selectedMagazzino) { setError("Seleziona un magazzino per la giacenza iniziale"); return; } setSaving(true); try { const url = isEdit ? `/api/articoli/${article.id}` : "/api/articoli"; const method = isEdit ? "PUT" : "POST"; const payload = { ...formData, id_magazzino: selectedMagazzino, quantita: quantitaIniziale, }; const res = await fetch(url, { method, headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload), }); if (!res.ok) { const data = await res.json(); throw new Error(data.error || "Errore durante il salvataggio"); } const data = await res.json(); onSave(data.article); } catch (err) { setError(err instanceof Error ? err.message : "Errore sconosciuto"); } finally { setSaving(false); } }; const handleChange = ( e: React.ChangeEvent ) => { const { name, value, type } = e.target; setFormData((prev) => ({ ...prev, [name]: type === "number" ? value === "" ? 0 : parseFloat(value) : name === "id_famiglia" ? value === "" ? null : parseInt(value, 10) : value, })); }; const handleStabilimentoChange = (e: React.ChangeEvent) => { const value = e.target.value ? parseInt(e.target.value, 10) : null; setSelectedStabilimento(value); setSelectedMagazzino(null); }; const handleMagazzinoChange = (e: React.ChangeEvent) => { const value = e.target.value ? parseInt(e.target.value, 10) : null; setSelectedMagazzino(value); }; return (
{/* Header */}

{isEdit ? "Modifica Articolo" : "Nuovo Articolo"}

{/* Form */}
{error && (
{error}
)} {/* Descrizione */}
{/* Codice e Barcode */}
{/* Famiglia */}
{/* Prezzo e Quantità minima */}
{/* Giacenza iniziale (solo per nuovo articolo) */} {!isEdit && (

Giacenza iniziale

{/* Stabilimento */}
{/* Magazzino (visibile solo se stabilimento selezionato) */} {selectedStabilimento && (
)} {/* Quantità */}
setQuantitaIniziale(parseFloat(e.target.value) || 0)} min="0" className="w-full px-3 py-2 rounded-lg bg-zinc-800 border border-zinc-700 text-white text-sm focus:outline-none focus:border-green-500 transition-colors" placeholder="0" />
{quantitaIniziale > 0 && !selectedMagazzino && (

Seleziona un magazzino per registrare la giacenza iniziale

)}
)} {/* Actions */}
); }