Checkpoint: Renouvellement PC et CAPEX-Synthèse : KPIs, barre de filtres et tableau sont masqués pour les années sans données importées/saisies. Seul l'écran vide explicite s'affiche. Les années 2026-2027 restent pleinement fonctionnelles sur Renouvellement PC. CAPEX-Synthèse se vide dès qu'aucun budget n'a été saisi pour l'année sélectionnée.
This commit is contained in:
@@ -92,53 +92,56 @@ export default function Home() {
|
||||
</div>
|
||||
</header>
|
||||
|
||||
{/* KPIs globaux */}
|
||||
<div className="px-6 py-4 border-b border-border bg-muted/20 flex-shrink-0">
|
||||
<div className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3">
|
||||
<KpiCard
|
||||
icon={Euro}
|
||||
label="Budget global"
|
||||
value={formatEuros(meta.budget_global)}
|
||||
subtitle={`TTC — exercice ${annee}`}
|
||||
accentColor="text-orange-600"
|
||||
delay={0}
|
||||
/>
|
||||
<KpiCard
|
||||
icon={Building2}
|
||||
label="Établissements"
|
||||
value={formatNumber(meta.nb_etablissements)}
|
||||
subtitle="dans le périmètre"
|
||||
accentColor="text-primary"
|
||||
delay={60}
|
||||
/>
|
||||
<KpiCard
|
||||
icon={Monitor}
|
||||
label="PC Fixes à renouveler"
|
||||
value={formatNumber(meta.total_fixes_renouveler)}
|
||||
subtitle={`sur ${formatNumber(meta.total_fixes)} au total`}
|
||||
accentColor="text-primary"
|
||||
delay={120}
|
||||
/>
|
||||
<KpiCard
|
||||
icon={Laptop}
|
||||
label="PC Portables à renouveler"
|
||||
value={formatNumber(meta.total_portables_renouveler)}
|
||||
subtitle={`sur ${formatNumber(meta.total_portables)} au total`}
|
||||
accentColor="text-primary"
|
||||
delay={180}
|
||||
/>
|
||||
<KpiCard
|
||||
icon={AlertTriangle}
|
||||
label="Équipements à renouveler"
|
||||
value={formatNumber(meta.total_fixes_renouveler + meta.total_portables_renouveler)}
|
||||
subtitle="fixes + portables"
|
||||
accentColor="text-orange-500"
|
||||
delay={240}
|
||||
/>
|
||||
{/* KPIs globaux — uniquement si données disponibles */}
|
||||
{hasDonnees && (
|
||||
<div className="px-6 py-4 border-b border-border bg-muted/20 flex-shrink-0">
|
||||
<div className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3">
|
||||
<KpiCard
|
||||
icon={Euro}
|
||||
label="Budget global"
|
||||
value={formatEuros(meta.budget_global)}
|
||||
subtitle={`TTC — exercice ${annee}`}
|
||||
accentColor="text-orange-600"
|
||||
delay={0}
|
||||
/>
|
||||
<KpiCard
|
||||
icon={Building2}
|
||||
label="Établissements"
|
||||
value={formatNumber(meta.nb_etablissements)}
|
||||
subtitle="dans le périmètre"
|
||||
accentColor="text-primary"
|
||||
delay={60}
|
||||
/>
|
||||
<KpiCard
|
||||
icon={Monitor}
|
||||
label="PC Fixes à renouveler"
|
||||
value={formatNumber(meta.total_fixes_renouveler)}
|
||||
subtitle={`sur ${formatNumber(meta.total_fixes)} au total`}
|
||||
accentColor="text-primary"
|
||||
delay={120}
|
||||
/>
|
||||
<KpiCard
|
||||
icon={Laptop}
|
||||
label="PC Portables à renouveler"
|
||||
value={formatNumber(meta.total_portables_renouveler)}
|
||||
subtitle={`sur ${formatNumber(meta.total_portables)} au total`}
|
||||
accentColor="text-primary"
|
||||
delay={180}
|
||||
/>
|
||||
<KpiCard
|
||||
icon={AlertTriangle}
|
||||
label="Équipements à renouveler"
|
||||
value={formatNumber(meta.total_fixes_renouveler + meta.total_portables_renouveler)}
|
||||
subtitle="fixes + portables"
|
||||
accentColor="text-orange-500"
|
||||
delay={240}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Barre de filtres + toggle vue */}
|
||||
{/* Barre de filtres + toggle vue — uniquement si données disponibles */}
|
||||
{hasDonnees && (
|
||||
<div className="px-6 py-3 border-b border-border bg-card flex-shrink-0">
|
||||
<div className="flex flex-wrap items-center gap-3">
|
||||
{/* Recherche */}
|
||||
@@ -232,6 +235,7 @@ export default function Home() {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Contenu — vue vignettes ou liste */}
|
||||
<div className="flex-1 overflow-y-auto px-6 py-5">
|
||||
|
||||
Reference in New Issue
Block a user