diff --git a/src/features/grid/components/heatmap-grid.tsx b/src/features/grid/components/heatmap-grid.tsx index b606af7..732e426 100644 --- a/src/features/grid/components/heatmap-grid.tsx +++ b/src/features/grid/components/heatmap-grid.tsx @@ -13,7 +13,7 @@ import { RowSelectionState, } from "@tanstack/react-table"; import { useVirtualizer } from "@tanstack/react-virtual"; -import { ChevronUp, ChevronDown, ChevronsUpDown, Copy, Check, Store, SlidersHorizontal, ShoppingCart, PackageOpen, Warehouse, AlertTriangle, TrendingUp, TrendingDown, Minus } from "lucide-react"; +import { ChevronUp, ChevronDown, ChevronsUpDown, Copy, Check, Store, SlidersHorizontal, ShoppingCart, PackageOpen, Warehouse, AlertTriangle, TrendingUp, TrendingDown, Minus, CalendarRange, Eye, EyeOff } from "lucide-react"; import { DropdownMenu, DropdownMenuCheckboxItem, @@ -24,6 +24,8 @@ import { useGridStore } from "@/features/grid/store/use-grid-store"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { GammeSelect } from "@/features/grid/components/gamme-select"; import { HeatmapCell } from "@/features/grid/components/heatmap-cell"; +import { TuileStat } from "@/features/grid/components/stat-tile"; +import { ProductMonthlyModal } from "@/features/grid/components/product-monthly-modal"; import type { ProductRow, GammeCode } from "@/types/grid"; import { cn } from "@/lib/utils"; import { @@ -245,36 +247,6 @@ interface CellDetailData { receptions: number | null; } -/** - * Tuile de statistique : intitulé en phrase, valeur en chiffres proportionnels. - * - * Pas de `tabular-nums` ici : à grande taille, des chiffres de largeur égale font - * paraître un nombre court anormalement lâche. Les chiffres tabulaires sont - * réservés aux colonnes qui s'alignent verticalement (tableau, axes). - */ -function TuileStat({ label, valeur, indice, couleur, icone: Icone }: { - label: string; - valeur: string; - indice?: string; - couleur?: string; - icone?: React.ComponentType<{ className?: string; style?: React.CSSProperties }>; -}) { - return ( -
| + Magasin + | + {mois.map((m) => ( ++ {formatMonthLabel(m)} + | + ))} +
|---|---|
|
+ {l.nom}
+ {/* La date de dernière entrée explique un stock qui ne bouge
+ plus : elle est écrite, pas réservée au survol. */}
+
+ {l.derniereEntree ? `dern. entrée ${formatDate(l.derniereEntree)}` : "aucune entrée"}
+
+ |
+ {l.valeurs.map((v, i) => (
+ + {fmt(v)} + | + ))} +
| + Total + | + {totaux.map((v, i) => ( ++ {fmt(v)} + | + ))} +
+ {row.codein} + {row.reference ? ` · ${row.reference}` : ""} + {" · "} + {libelleMagasin} + {" · 12 mois glissants, mois en cours exclu"} +
+