import React, { useState, useEffect, forwardRef, useImperativeHandle, } from 'react'; import { CheckCircle, Circle } from 'lucide-react'; const TreeView = forwardRef(function TreeView( { data, expandAll, onSelectionChange }, ref ) { const [openDomains, setOpenDomains] = useState({}); const [openCategories, setOpenCategories] = useState({}); const [selectedCompetencies, setSelectedCompetencies] = useState({}); // { [competence_id]: true } // N'ouvre ou ne ferme tout que si expandAll change explicitement useEffect(() => { if (!data) return; const allDomains = {}; const allCategories = {}; if (expandAll) { data.forEach((domaine) => { allDomains[domaine.domaine_id] = true; domaine.categories.forEach((cat) => { allCategories[cat.categorie_id] = true; }); }); setOpenDomains(allDomains); setOpenCategories(allCategories); } else { // On ne ferme tout que si l'utilisateur décoche explicitement "Tout dérouler" setOpenDomains({}); setOpenCategories({}); } }, [expandAll]); // <-- uniquement expandAll // Appelle le callback à chaque changement de sélection useEffect(() => { if (onSelectionChange) { const selected = Object.entries(selectedCompetencies) .filter(([_, selected]) => selected) .map(([id]) => id); onSelectionChange(selected); } }, [selectedCompetencies, onSelectionChange]); const toggleDomain = (id) => setOpenDomains((prev) => ({ ...prev, [id]: !prev[id] })); const toggleCategory = (id) => setOpenCategories((prev) => ({ ...prev, [id]: !prev[id] })); const handleCompetenceClick = (competence) => { if (competence.state === 'required') return; setSelectedCompetencies((prev) => { const next = { ...prev, [competence.competence_id]: !prev[competence.competence_id], }; console.log(competence); return next; }); }; // Pour exposer la sélection au parent useImperativeHandle(ref, () => ({ getSelectedCompetencies: () => { const selected = Object.entries(selectedCompetencies) .filter(([_, selected]) => selected) .map(([id]) => id); return selected; }, clearSelection: () => setSelectedCompetencies({}), })); return (
{data.map((domaine) => (
{openDomains[domaine.domaine_id] && (
{domaine.categories.map((categorie) => (
{openCategories[categorie.categorie_id] && (
    {categorie.competences.map((competence) => { const isSelected = selectedCompetencies[competence.competence_id]; return (
  • handleCompetenceClick(competence)} style={{ cursor: competence.state === 'required' ? 'default' : 'pointer', userSelect: 'none', }} > {competence.state === 'required' && ( )} {competence.nom}
  • ); })}
)}
))}
)}
))}
); }); export default TreeView;