Checkpoint: Correction du bug des accordéons qui s'ouvraient tous lors de la navigation. Implémentation de la persistance de l'état des sections dans localStorage pour mémoriser les préférences utilisateur entre les pages et les sessions.
This commit is contained in:
@@ -160,9 +160,18 @@ function DashboardLayoutContent({
|
|||||||
const activeMenuItem = menuSections.flatMap(section => section.items).find(item => item.path === location);
|
const activeMenuItem = menuSections.flatMap(section => section.items).find(item => item.path === location);
|
||||||
const isMobile = useIsMobile();
|
const isMobile = useIsMobile();
|
||||||
|
|
||||||
// État pour gérer les sections ouvertes/fermées (accordéon)
|
// État pour gérer les sections ouvertes/fermées (persisté dans localStorage)
|
||||||
const [openSections, setOpenSections] = useState<Record<string, boolean>>(() => {
|
const [openSections, setOpenSections] = useState<Record<string, boolean>>(() => {
|
||||||
// Par défaut, ouvrir toutes les sections
|
// Essayer de charger depuis localStorage
|
||||||
|
const saved = localStorage.getItem('menuSectionsState');
|
||||||
|
if (saved) {
|
||||||
|
try {
|
||||||
|
return JSON.parse(saved);
|
||||||
|
} catch {
|
||||||
|
// En cas d'erreur, utiliser les valeurs par défaut
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Valeurs par défaut : toutes les sections ouvertes
|
||||||
const initial: Record<string, boolean> = {};
|
const initial: Record<string, boolean> = {};
|
||||||
menuSections.forEach(section => {
|
menuSections.forEach(section => {
|
||||||
initial[section.title] = true;
|
initial[section.title] = true;
|
||||||
@@ -172,27 +181,16 @@ function DashboardLayoutContent({
|
|||||||
|
|
||||||
// Fonction pour toggle une section
|
// Fonction pour toggle une section
|
||||||
const toggleSection = (sectionTitle: string) => {
|
const toggleSection = (sectionTitle: string) => {
|
||||||
setOpenSections(prev => ({
|
setOpenSections(prev => {
|
||||||
|
const newState = {
|
||||||
...prev,
|
...prev,
|
||||||
[sectionTitle]: !prev[sectionTitle]
|
[sectionTitle]: !prev[sectionTitle]
|
||||||
}));
|
|
||||||
};
|
};
|
||||||
|
// Sauvegarder dans localStorage
|
||||||
// S'assurer que la section contenant l'item actif est ouverte
|
localStorage.setItem('menuSectionsState', JSON.stringify(newState));
|
||||||
useEffect(() => {
|
return newState;
|
||||||
const activeSection = menuSections.find(section =>
|
});
|
||||||
section.items.some(item =>
|
};
|
||||||
item.path === location ||
|
|
||||||
('subItems' in item && item.subItems?.some((sub: any) => sub.path === location))
|
|
||||||
)
|
|
||||||
);
|
|
||||||
if (activeSection && !openSections[activeSection.title]) {
|
|
||||||
setOpenSections(prev => ({
|
|
||||||
...prev,
|
|
||||||
[activeSection.title]: true
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}, [location]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isCollapsed) {
|
if (isCollapsed) {
|
||||||
|
|||||||
7
todo.md
7
todo.md
@@ -147,3 +147,10 @@
|
|||||||
- [x] Implémenter la logique de toggle pour chaque section
|
- [x] Implémenter la logique de toggle pour chaque section
|
||||||
- [x] Garder la section active automatiquement ouverte
|
- [x] Garder la section active automatiquement ouverte
|
||||||
- [x] Tester le comportement sur toutes les sections
|
- [x] Tester le comportement sur toutes les sections
|
||||||
|
|
||||||
|
## Correction bug accordéons qui s'ouvrent tous
|
||||||
|
|
||||||
|
- [x] Corriger le useEffect pour n'ouvrir que la section contenant l'item actif
|
||||||
|
- [x] Supprimer le useEffect problématique (toutes sections ouvertes par défaut)
|
||||||
|
- [x] Utiliser localStorage pour persister l'état des sections
|
||||||
|
- [x] Tester le comportement en cliquant sur différents items
|
||||||
|
|||||||
Reference in New Issue
Block a user