Checkpoint: Sélecteur d'année global (2025, 2026, 2027+) sur Renouvellement PC, CAPEX-Construction, CAPEX-Synthèse et DSI-OPEX. Données CAPEX isolées par année en localStorage. Titres dynamiques selon l'année sélectionnée.

This commit is contained in:
Manus
2026-06-03 09:49:14 +00:00
parent 858f0dc4d9
commit 787928c722
7 changed files with 189 additions and 55 deletions

View File

@@ -0,0 +1,52 @@
// AnneeContext.tsx — Contexte global pour l'année sélectionnée
// Partagé entre toutes les pages : Renouvellement PC, CAPEX-Construction, CAPEX-Synthèse, DSI-OPEX
import { createContext, useContext, useState, ReactNode } from 'react';
export const ANNEES_DISPONIBLES = [2025, 2026, 2027, 2028, 2029, 2030];
export const ANNEE_DEFAUT = 2027;
interface AnneeContextType {
annee: number;
setAnnee: (a: number) => void;
}
const AnneeContext = createContext<AnneeContextType>({
annee: ANNEE_DEFAUT,
setAnnee: () => {},
});
export function AnneeProvider({ children }: { children: ReactNode }) {
const [annee, setAnneeState] = useState<number>(() => {
try {
const stored = localStorage.getItem('itinova_annee_selectionnee');
const parsed = stored ? parseInt(stored, 10) : ANNEE_DEFAUT;
return ANNEES_DISPONIBLES.includes(parsed) ? parsed : ANNEE_DEFAUT;
} catch { return ANNEE_DEFAUT; }
});
const setAnnee = (a: number) => {
setAnneeState(a);
try { localStorage.setItem('itinova_annee_selectionnee', String(a)); } catch {}
};
return (
<AnneeContext.Provider value={{ annee, setAnnee }}>
{children}
</AnneeContext.Provider>
);
}
export function useAnnee() {
return useContext(AnneeContext);
}
// Génère la clé localStorage pour les saisies CAPEX d'une année donnée
export function getCapexStorageKey(annee: number): string {
return `itinova_budget_capex_${annee}`;
}
// Génère la clé localStorage pour les saisies OPEX d'une année donnée
export function getOpexStorageKey(annee: number): string {
return `itinova_budget_opex_${annee}`;
}