Checkpoint: Inventaire PC distinct par année : clé budgetsi_inventaire_data_YYYY dans localStorage, ImportModal utilise l'année active (useAnnee), indicateur visuel des imports par année dans la modale, useBudgetData + Budget2027 + DsiCapex rechargent l'inventaire à chaque changement d'année

This commit is contained in:
Manus
2026-06-10 08:47:32 +00:00
parent f64a7db3f3
commit 3145e9c84f
5 changed files with 109 additions and 35 deletions

View File

@@ -28,9 +28,9 @@ import type { BudgetData } from '../types/budget';
const bp2027Data = bp2027Raw as BP2027Data;
function loadInventaireData(): BudgetData | null {
function loadInventaireData(annee: number): BudgetData | null {
try {
const raw = localStorage.getItem('budgetsi_inventaire_data');
const raw = localStorage.getItem(`budgetsi_inventaire_data_${annee}`);
return raw ? JSON.parse(raw) as BudgetData : null;
} catch { return null; }
}
@@ -99,20 +99,32 @@ export default function DsiCapex() {
const [sortDir, setSortDir] = useState<SortDir>('asc');
const [showOnlyFilled, setShowOnlyFilled] = useState(false);
const [lastRefresh, setLastRefresh] = useState(Date.now());
const [inventaire, setInventaire] = useState<BudgetData | null>(() => loadInventaireData());
const [inventaire, setInventaire] = useState<BudgetData | null>(() => loadInventaireData(annee));
useEffect(() => {
setSaisies(loadSaisiesForAnnee(annee));
}, [lastRefresh, annee]);
// Recharger l'inventaire quand l'année change
useEffect(() => {
const onImport = () => setInventaire(loadInventaireData());
setInventaire(loadInventaireData(annee));
}, [annee]);
useEffect(() => {
const onImport = (e: Event) => {
const detail = (e as CustomEvent).detail;
if (!detail || detail.annee === annee) setInventaire(loadInventaireData(annee));
};
const onStorage = (e: StorageEvent) => {
if (e.key === `budgetsi_inventaire_data_${annee}`) setInventaire(loadInventaireData(annee));
};
window.addEventListener('budgetsi_inventaire_updated', onImport);
window.addEventListener('storage', (e: StorageEvent) => {
if (e.key === 'budgetsi_inventaire_data') onImport();
});
return () => window.removeEventListener('budgetsi_inventaire_updated', onImport);
}, []);
window.addEventListener('storage', onStorage);
return () => {
window.removeEventListener('budgetsi_inventaire_updated', onImport);
window.removeEventListener('storage', onStorage);
};
}, [annee]);
const handleRefresh = () => setLastRefresh(Date.now());