From 15312ddb33a6b3db2e8dfb7c8ec566c9dca91251 Mon Sep 17 00:00:00 2001 From: AV77web Date: Fri, 29 May 2026 23:51:46 +0200 Subject: [PATCH] creato modale per visualizzare gli articoli di una macchina/parte/gruppo --- src/components/ArticoliMacchinaModal.tsx | 249 +++++++++++++++++++++++ src/components/MacchineTree.tsx | 69 ++----- 2 files changed, 261 insertions(+), 57 deletions(-) create mode 100644 src/components/ArticoliMacchinaModal.tsx diff --git a/src/components/ArticoliMacchinaModal.tsx b/src/components/ArticoliMacchinaModal.tsx new file mode 100644 index 0000000..09a2c5f --- /dev/null +++ b/src/components/ArticoliMacchinaModal.tsx @@ -0,0 +1,249 @@ +"use client"; + +import { useState } from "react"; +import type { ArticoloAssegnatoMacchina } from "@/src/types/artMacchineParti"; + +interface ArticoliMacchinaModalProps { + macchinaId: number; + macchinaNome: string; + articoli: ArticoloAssegnatoMacchina[]; + onClose: () => void; + onArticoloRimosso: () => void; +} + +interface RimuoviModalState { + articolo: ArticoloAssegnatoMacchina; + quantita: number; + opzione: "carico" | "elimina"; +} + +export default function ArticoliMacchinaModal({ + macchinaId, + macchinaNome, + articoli, + onClose, + onArticoloRimosso, +}: ArticoliMacchinaModalProps) { + const [rimuoviModal, setRimuoviModal] = useState(null); + const [saving, setSaving] = useState(false); + const [error, setError] = useState(null); + + const handleRimuoviClick = (articolo: ArticoloAssegnatoMacchina) => { + setRimuoviModal({ + articolo, + quantita: 1, + opzione: "carico", + }); + setError(null); + }; + + const handleConfermaRimozione = async () => { + if (!rimuoviModal) return; + + setSaving(true); + setError(null); + + try { + const res = await fetch( + `/api/art-macchine-parti/${macchinaId}/${rimuoviModal.articolo.id_articolo}`, + { + method: "DELETE", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + quantita: rimuoviModal.quantita, + opzione: rimuoviModal.opzione, + }), + } + ); + + if (!res.ok) { + const data = await res.json(); + throw new Error(data.error || "Errore nella rimozione"); + } + + setRimuoviModal(null); + onArticoloRimosso(); + } catch (err) { + setError(err instanceof Error ? err.message : "Errore sconosciuto"); + } finally { + setSaving(false); + } + }; + + return ( +
+
+
+
+
+

Articoli Assegnati

+

{macchinaNome}

+
+ +
+ +
+ {articoli.length === 0 ? ( +
+ Nessun articolo assegnato +
+ ) : ( +
+ {articoli.map((art) => ( +
+
+

{art.descrizione}

+

{art.codice}

+
+
+
+
{art.quantita}
+
assegnati
+
+ +
+
+ ))} +
+ )} +
+ +
+ + Totale: {articoli.reduce((sum, a) => sum + a.quantita, 0)} pezzi in {articoli.length} articoli + + +
+
+ + {/* Modal conferma rimozione */} + {rimuoviModal && ( +
+
!saving && setRimuoviModal(null)} /> +
+
+

Rimuovi Articolo

+

{rimuoviModal.articolo.descrizione}

+
+ +
+ {error && ( +
+ {error} +
+ )} + +
+ + + setRimuoviModal({ + ...rimuoviModal, + quantita: Math.min( + Math.max(1, parseInt(e.target.value) || 1), + rimuoviModal.articolo.quantita + ), + }) + } + className="w-full px-3 py-2 bg-zinc-800 border border-zinc-700 rounded-lg text-white focus:outline-none focus:ring-2 focus:ring-teal-500" + /> +
+ +
+ +
+ + +
+
+
+ +
+ + +
+
+
+ )} +
+ ); +} diff --git a/src/components/MacchineTree.tsx b/src/components/MacchineTree.tsx index bdde112..21e9a37 100644 --- a/src/components/MacchineTree.tsx +++ b/src/components/MacchineTree.tsx @@ -5,6 +5,7 @@ import type { MacchinaWithDetails } from "@/src/types/macchina"; import type { ArticoloAssegnatoMacchina } from "@/src/types/artMacchineParti"; import TreeNode from "./TreeNode"; import MacchinaModal from "./MacchinaModal"; +import ArticoliMacchinaModal from "./ArticoliMacchinaModal"; import { useStabilimento } from "@/src/contexts/StabilimentoContext"; interface DroppedArticle { @@ -479,63 +480,17 @@ export default function MacchineTree() { {/* Show Articles Modal */} {showArticlesModal && ( -
-
setShowArticlesModal(null)} /> -
-
-
-

Articoli Assegnati

-

{showArticlesModal.macchinaNome}

-
- -
- -
- {showArticlesModal.articoli.length === 0 ? ( -
- Nessun articolo assegnato -
- ) : ( -
- {showArticlesModal.articoli.map((art) => ( -
-
-

{art.descrizione}

-

{art.codice}

-
-
-
{art.quantita}
-
assegnati
-
-
- ))} -
- )} -
- -
- - Totale: {showArticlesModal.articoli.reduce((sum, a) => sum + a.quantita, 0)} pezzi in {showArticlesModal.articoli.length} articoli - - -
-
-
+ setShowArticlesModal(null)} + onArticoloRimosso={() => { + fetchArticoliPerMacchina(); + window.dispatchEvent(new CustomEvent("articoli-updated")); + setShowArticlesModal(null); + }} + /> )} {/* Drop Article Modal */}