From c66ee44f365ebf399f0c48c7a4c13473dd1ed245 Mon Sep 17 00:00:00 2001 From: AV77web Date: Fri, 29 May 2026 16:08:27 +0200 Subject: [PATCH] selettore stabilimento unico per macchine e articoli --- src/app/(main)/layout.tsx | 11 +- src/components/ArticlesList.tsx | 27 ++--- src/components/GlobalStabilimentoSelector.tsx | 105 +++++++++++++++++ src/components/MacchineTree.tsx | 57 ++-------- src/components/Navbar.tsx | 92 +++------------ src/contexts/StabilimentoContext.tsx | 106 ++++++++++++++++++ 6 files changed, 252 insertions(+), 146 deletions(-) create mode 100644 src/components/GlobalStabilimentoSelector.tsx create mode 100644 src/contexts/StabilimentoContext.tsx diff --git a/src/app/(main)/layout.tsx b/src/app/(main)/layout.tsx index f704add..73f7760 100644 --- a/src/app/(main)/layout.tsx +++ b/src/app/(main)/layout.tsx @@ -3,6 +3,7 @@ import { redirect } from "next/navigation"; import { auth } from "@/src/auth"; import SignOutButton from "@/src/components/auth/SignOutButton"; import Navbar from "@/src/components/Navbar"; +import { StabilimentoProvider } from "@/src/contexts/StabilimentoContext"; export default async function MainLayout({ children, @@ -17,9 +18,11 @@ export default async function MainLayout({ } return ( -
- } /> -
{children}
-
+ +
+ } /> +
{children}
+
+
); } diff --git a/src/components/ArticlesList.tsx b/src/components/ArticlesList.tsx index 63757d4..436e4e7 100644 --- a/src/components/ArticlesList.tsx +++ b/src/components/ArticlesList.tsx @@ -2,13 +2,12 @@ import { useState, useEffect, useCallback } from "react"; import type { Article, ArticleFamily } from "@/src/types/article"; -import type { Stabilimento, Magazzino } from "@/src/types/stabilimento"; import type { GiacenzePerArticolo } from "@/src/types/giacenza"; import type { TipoMovimento } from "@/src/types/movimento"; import ArticleCard from "./ArticleCard"; import ArticleModal from "./ArticleModal"; import MovimentoModal from "./MovimentoModal"; -import StabilimentoMagazzinoSelector from "./StabilimentoMagazzinoSelector"; +import { useStabilimento } from "@/src/contexts/StabilimentoContext"; export default function ArticlesList() { const [articles, setArticles] = useState([]); @@ -25,8 +24,7 @@ export default function ArticlesList() { const [movimentoArticle, setMovimentoArticle] = useState
(null); const [movimentoTipo, setMovimentoTipo] = useState("carico"); - const [selectedStabilimento, setSelectedStabilimento] = useState(null); - const [selectedMagazzino, setSelectedMagazzino] = useState(null); + const { selectedStabilimento, selectedMagazzino } = useStabilimento(); const fetchArticles = useCallback(async () => { setLoading(true); @@ -79,14 +77,6 @@ export default function ArticlesList() { fetchGiacenze(); }, [fetchGiacenze]); - const handleSelectionChange = ({ stabilimento, magazzino }: { - stabilimento: Stabilimento | null; - magazzino: Magazzino | null - }) => { - setSelectedStabilimento(stabilimento); - setSelectedMagazzino(magazzino); - }; - const handleEdit = (article: Article) => { setEditingArticle(article); setShowModal(true); @@ -156,10 +146,15 @@ export default function ArticlesList() { - {/* Selettore Stabilimento/Magazzino */} -
- -
+ {/* Info selezione corrente */} + {selectedStabilimento && ( +
+ Filtro: {selectedMagazzino + ? `${selectedStabilimento.descrizione} → ${selectedMagazzino.descrizione}` + : `${selectedStabilimento.descrizione} (tutti i magazzini)` + } +
+ )} {/* Ricerca */}
diff --git a/src/components/GlobalStabilimentoSelector.tsx b/src/components/GlobalStabilimentoSelector.tsx new file mode 100644 index 0000000..1d5c327 --- /dev/null +++ b/src/components/GlobalStabilimentoSelector.tsx @@ -0,0 +1,105 @@ +"use client"; + +import { useStabilimento } from "@/src/contexts/StabilimentoContext"; + +export default function GlobalStabilimentoSelector() { + const { + stabilimenti, + selectedStabilimento, + selectedMagazzino, + filteredMagazzini, + loading, + setSelectedStabilimento, + setSelectedMagazzino, + resetSelection, + } = useStabilimento(); + + if (loading) { + return ( +
+ + + + +
+ ); + } + + return ( +
+ {/* Stabilimenti */} +
+ + {stabilimenti.map((stab) => ( + + ))} +
+ + {/* Separatore */} + {selectedStabilimento && filteredMagazzini.length > 0 && ( +
+ )} + + {/* Magazzini */} + {selectedStabilimento && filteredMagazzini.length > 0 && ( +
+ Mag: + + {filteredMagazzini.map((mag) => ( + + ))} +
+ )} +
+ ); +} diff --git a/src/components/MacchineTree.tsx b/src/components/MacchineTree.tsx index 773df16..13d4401 100644 --- a/src/components/MacchineTree.tsx +++ b/src/components/MacchineTree.tsx @@ -2,18 +2,17 @@ import { useState, useEffect, useCallback, useMemo } from "react"; import type { MacchinaWithDetails, ArticoliPerMacchina } from "@/src/types/macchina"; -import type { Stabilimento } from "@/src/types/stabilimento"; import TreeNode from "./TreeNode"; import MacchinaModal from "./MacchinaModal"; +import { useStabilimento } from "@/src/contexts/StabilimentoContext"; export default function MacchineTree() { const [nodes, setNodes] = useState([]); - const [stabilimenti, setStabilimenti] = useState([]); const [articlesByMacchina, setArticlesByMacchina] = useState({}); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); - const [selectedStabilimento, setSelectedStabilimento] = useState(null); + const { selectedStabilimento, stabilimenti } = useStabilimento(); const [copiedNodeId, setCopiedNodeId] = useState(null); const [isCloning, setIsCloning] = useState(false); @@ -38,23 +37,12 @@ export default function MacchineTree() { } }, []); - const fetchStabilimenti = useCallback(async () => { - try { - const res = await fetch("/api/stabilimenti"); - if (!res.ok) throw new Error("Errore nel caricamento stabilimenti"); - const data = await res.json(); - setStabilimenti(data.stabilimenti || []); - } catch (err) { - console.error("Errore stabilimenti:", err); - } - }, []); - const loadInitialData = useCallback(async () => { setLoading(true); setError(null); - await Promise.all([fetchNodes(), fetchStabilimenti()]); + await fetchNodes(); setLoading(false); - }, [fetchNodes, fetchStabilimenti]); + }, [fetchNodes]); useEffect(() => { loadInitialData(); @@ -238,39 +226,12 @@ export default function MacchineTree() {
- {/* Filtro Stabilimento */} -
- -
- - {stabilimenti.map((stab) => ( - - ))} + {/* Info selezione corrente */} + {selectedStabilimento && ( +
+ Filtro attivo: {selectedStabilimento.descrizione}
-
+ )} {/* Indicatore clonazione */} {isCloning && ( diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 789adfb..3cfe1aa 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -7,46 +7,26 @@ "use client" import { useState , MouseEvent, ReactNode} from "react"; import Link from "next/link"; +import GlobalStabilimentoSelector from "./GlobalStabilimentoSelector"; interface NavLink { href: string; label: string; } -interface ServiceLink { - href: string; - label: string; -} - const navLinks: NavLink[] = [ { href: "/", label: "Home"}, { href: "/movimenti", label: "Movimenti"}, { href: "/articoli", label: "Articoli"}, { href: "/macchine", label: "Macchine"}, { href: "/utenti", label: "Utenti"}, - ]; -const serviceLinks: ServiceLink[] = [ - { href: "/services/web", label: "Web Development"}, - { href: "/services/mobile", label: "Mobile Development"}, - { href: "/services/consulting", label: "Consulting"}, - -] - export default function Navbar({ actions }: { actions?: ReactNode }) { - - const [ isServicesOpen, setIsServicesOpen] = useState(false); - - const toggleServices = ( e: MouseEvent) => { - e.preventDefault(); - setIsServicesOpen(!isServicesOpen); - } - return ( -