From ac0594f5dba1c1cd9882ba46fc6efa1424bb3a8e Mon Sep 17 00:00:00 2001 From: Manus Date: Thu, 30 Jul 2026 12:24:15 +0000 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Zone=20de=20filtres=20Factures=20?= =?UTF-8?q?refactoris=C3=A9e=20en=203=20lignes=20dans=20un=20cartouche=20b?= =?UTF-8?q?leu=20pastel=20:=20ligne=201=20(recherche=20+=20compact/d=C3=A9?= =?UTF-8?q?tail),=20ligne=202=20(destinataire,=20abonnement,=20entit=C3=A9?= =?UTF-8?q?,=20ventilation=20comptable),=20ligne=203=20(boutons=20statut?= =?UTF-8?q?=20export=20+=20tri=20par=20date).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/pages/Invoices.tsx | 268 +++++++++++++++++++--------------- 1 file changed, 149 insertions(+), 119 deletions(-) diff --git a/client/src/pages/Invoices.tsx b/client/src/pages/Invoices.tsx index 8d74218..0089aa4 100644 --- a/client/src/pages/Invoices.tsx +++ b/client/src/pages/Invoices.tsx @@ -54,6 +54,7 @@ export default function Invoices() { const [recipientFilter, setRecipientFilter] = useState("all"); const [subscriptionFilter, setSubscriptionFilter] = useState("all"); // all | yes | no const [entityFilter, setEntityFilter] = useState("all"); // all | santinova | itinova + const [ventilationFilter, setVentilationFilter] = useState("all"); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [invoiceToDelete, setInvoiceToDelete] = useState(null); const [addDialogOpen, setAddDialogOpen] = useState(false); @@ -199,6 +200,12 @@ export default function Invoices() { ) ).sort(); + const uniqueVentilations = Array.from( + new Set( + (invoices || []).map(inv => (inv as any).ventilationComptable).filter(Boolean) + ) + ).sort(); + const handleSort = (field: SortField) => { if (sortField === field) { setSortDir(d => d === "asc" ? "desc" : "asc"); @@ -250,6 +257,14 @@ export default function Invoices() { if (entityFilter === "santinova" && service !== "DSI SANTINOVA") return false; if (entityFilter === "itinova" && service === "DSI SANTINOVA") return false; } + // Filter by ventilation comptable + if (ventilationFilter !== "all") { + if (ventilationFilter === "__empty__") { + if ((inv as any).ventilationComptable) return false; + } else { + if ((inv as any).ventilationComptable !== ventilationFilter) return false; + } + } return true; }); @@ -405,135 +420,150 @@ export default function Invoices() { - - - {/* Search + Recipient Filter */} -
-
- - setSearchQuery(e.target.value)} - className="pl-10" - /> -
-
- - -
- {/* Filtre Abonnement */} -
- -
- {/* Filtre Entité */} -
- -
-
- - {/* Mode compact/détail + Tri */} -
-
- - -
-
- Trier par : - - -
-
+ {/* ===== CARTOUCHE FILTRES ===== */} +
- {/* Status Filters */} -
+ {/* Ligne 1 : Recherche + affichage compact/détail */} +
+
+ + setSearchQuery(e.target.value)} + className="pl-10 bg-white border-blue-200 focus:border-blue-400" + /> +
+
- -
+
+ + {/* Ligne 2 : Filtres destinataire, abonnement, entité, ventilation */} +
+ + + + + +
+ + {/* Ligne 3 : Boutons statut export + tri */} +
+ + + + +
+ Trier : + + +
+
+
+ {/* ===== FIN CARTOUCHE ===== */} + + + {/* Table */} {isLoading ? (