diff --git a/src/app/(main)/articoli/page.tsx b/src/app/(main)/articoli/page.tsx index dcd7a57..f2cce0e 100644 --- a/src/app/(main)/articoli/page.tsx +++ b/src/app/(main)/articoli/page.tsx @@ -238,7 +238,6 @@ export default function ArticoliPage() { { setShowModal(false); setEditingArticle(null); }} onSave={handleSave} /> diff --git a/src/components/ArticleModal.tsx b/src/components/ArticleModal.tsx index dc07a97..c289718 100644 --- a/src/components/ArticleModal.tsx +++ b/src/components/ArticleModal.tsx @@ -2,11 +2,11 @@ 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[]; - stabilimentoId: number; onClose: () => void; onSave: (article: Article) => void; } @@ -14,7 +14,6 @@ interface ArticleModalProps { export default function ArticleModal({ article, families, - stabilimentoId, onClose, onSave, }: ArticleModalProps) { @@ -32,6 +31,12 @@ export default function ArticleModal({ 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); @@ -45,11 +50,35 @@ export default function ArticleModal({ id_magazzino: article.id_magazzino, prezzo: article.prezzo, quantita_minima: article.quantita_minima, - quantita: article.quantita, + 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") { @@ -72,19 +101,35 @@ export default function ArticleModal({ }; }, [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(formData), + body: JSON.stringify(payload), }); if (!res.ok) { @@ -117,14 +162,25 @@ export default function ArticleModal({ })); }; + 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"}

@@ -139,7 +195,7 @@ export default function ArticleModal({
{/* Form */} -
+ {error && (
{error} @@ -243,20 +299,78 @@ export default function ArticleModal({
- {/* Quantità iniziale (solo per nuovo articolo) */} + {/* 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 +

+ )} +
)} diff --git a/src/components/ArticlesGrid.tsx b/src/components/ArticlesGrid.tsx index 12837b2..ae768d8 100644 --- a/src/components/ArticlesGrid.tsx +++ b/src/components/ArticlesGrid.tsx @@ -237,7 +237,6 @@ export default function ArticlesGrid({ stabilimento }: ArticlesGridProps) { { setShowModal(false); setEditingArticle(null); diff --git a/src/components/ArticlesList.tsx b/src/components/ArticlesList.tsx index 52da297..4f2677e 100644 --- a/src/components/ArticlesList.tsx +++ b/src/components/ArticlesList.tsx @@ -194,7 +194,6 @@ export default function ArticlesList() { { setShowModal(false); setEditingArticle(null); }} onSave={handleSave} />