diff --git a/components/admin/team-detail/team-detail-client-wrapper.tsx b/components/admin/team-detail/team-detail-client-wrapper.tsx index a2f4201..e46cc87 100644 --- a/components/admin/team-detail/team-detail-client-wrapper.tsx +++ b/components/admin/team-detail/team-detail-client-wrapper.tsx @@ -15,6 +15,7 @@ interface TeamDetailClientWrapperProps { interface SkillAnalysis { skillName: string; category: string; + importance: "incontournable" | "majeure" | "standard"; experts: Array<{ name: string; level: number; @@ -29,14 +30,27 @@ interface SkillAnalysis { expertCount: number; learnerCount: number; proficiencyRate: number; + coverage: number; } interface TeamInsights { averageTeamLevel: number; totalExperts: number; totalLearners: number; - skillGaps: number; - strongSkills: number; + skillGaps: { + incontournable: number; + majeure: number; + standard: number; + }; + strongSkills: { + incontournable: number; + majeure: number; + standard: number; + }; + criticalSkillsCoverage: { + incontournable: number; + majeure: number; + }; } export function TeamDetailClientWrapper({ @@ -51,16 +65,24 @@ export function TeamDetailClientWrapper({ // Analyser les compétences avec les vraies données const skillMap = new Map(); + // Créer un Map pour stocker les infos d'importance des skills + const skillImportanceMap = new Map(); + team.topSkills.forEach((skill) => { + skillImportanceMap.set(skill.skillName, skill.importance); + }); + team.members.forEach((member) => { member.skills.forEach((skill) => { if (!skillMap.has(skill.skillName)) { skillMap.set(skill.skillName, { skillName: skill.skillName, category: skill.category, + importance: skillImportanceMap.get(skill.skillName) || "standard", experts: [], learners: [], averageLevel: 0, totalEvaluations: 0, + coverage: 0, }); } @@ -94,9 +116,19 @@ export function TeamDetailClientWrapper({ learnerCount: skill.learners.length, proficiencyRate: (skill.experts.length / skill.totalEvaluations) * 100, + coverage: (skill.experts.length / team.totalMembers) * 100, }) ) - .sort((a, b) => b.averageLevel - a.averageLevel); + .sort((a, b) => { + // D'abord par importance + const importanceOrder = { incontournable: 2, majeure: 1, standard: 0 }; + const importanceDiff = + importanceOrder[b.importance] - importanceOrder[a.importance]; + if (importanceDiff !== 0) return importanceDiff; + + // Ensuite par niveau moyen + return b.averageLevel - a.averageLevel; + }); setSkillAnalysis(skills); }, [team]); @@ -151,8 +183,29 @@ export function TeamDetailClientWrapper({ (sum, member) => sum + member.skills.filter((s) => s.wantsToLearn).length, 0 ), - skillGaps: skillAnalysis.filter((s) => s.averageLevel < 1.5).length, - strongSkills: skillAnalysis.filter((s) => s.averageLevel >= 2.5).length, + skillGaps: { + incontournable: skillAnalysis.filter( + (s) => s.importance === "incontournable" && s.coverage < 75 + ).length, + majeure: skillAnalysis.filter( + (s) => s.importance === "majeure" && s.coverage < 60 + ).length, + standard: skillAnalysis.filter( + (s) => s.importance === "standard" && s.averageLevel < 1.5 + ).length, + }, + strongSkills: { + incontournable: skillAnalysis.filter( + (s) => s.importance === "incontournable" && s.coverage >= 75 + ).length, + majeure: skillAnalysis.filter( + (s) => s.importance === "majeure" && s.coverage >= 60 + ).length, + standard: skillAnalysis.filter( + (s) => s.importance === "standard" && s.averageLevel >= 2.5 + ).length, + }, + criticalSkillsCoverage: team.criticalSkillsCoverage, }; return ( diff --git a/components/admin/team-detail/team-detail-tabs.tsx b/components/admin/team-detail/team-detail-tabs.tsx index 3dcab23..2a99539 100644 --- a/components/admin/team-detail/team-detail-tabs.tsx +++ b/components/admin/team-detail/team-detail-tabs.tsx @@ -10,6 +10,7 @@ import { TeamStats, TeamMember } from "@/lib/admin-types"; interface SkillAnalysis { skillName: string; category: string; + importance: "incontournable" | "majeure" | "standard"; experts: Array<{ name: string; level: number; @@ -24,14 +25,27 @@ interface SkillAnalysis { expertCount: number; learnerCount: number; proficiencyRate: number; + coverage: number; } interface TeamInsights { averageTeamLevel: number; totalExperts: number; totalLearners: number; - skillGaps: number; - strongSkills: number; + skillGaps: { + incontournable: number; + majeure: number; + standard: number; + }; + strongSkills: { + incontournable: number; + majeure: number; + standard: number; + }; + criticalSkillsCoverage: { + incontournable: number; + majeure: number; + }; } interface TeamDetailTabsProps { diff --git a/components/admin/team-detail/team-insights-tab.tsx b/components/admin/team-detail/team-insights-tab.tsx index 415d825..8c72c65 100644 --- a/components/admin/team-detail/team-insights-tab.tsx +++ b/components/admin/team-detail/team-insights-tab.tsx @@ -5,6 +5,7 @@ import { TrendingUp, MessageSquare, Lightbulb } from "lucide-react"; interface SkillAnalysis { skillName: string; category: string; + importance: "incontournable" | "majeure" | "standard"; experts: Array<{ name: string; level: number; @@ -19,14 +20,27 @@ interface SkillAnalysis { expertCount: number; learnerCount: number; proficiencyRate: number; + coverage: number; } interface TeamInsights { averageTeamLevel: number; totalExperts: number; totalLearners: number; - skillGaps: number; - strongSkills: number; + skillGaps: { + incontournable: number; + majeure: number; + standard: number; + }; + strongSkills: { + incontournable: number; + majeure: number; + standard: number; + }; + criticalSkillsCoverage: { + incontournable: number; + majeure: number; + }; } interface TeamInsightsTabProps { @@ -41,35 +55,68 @@ export function TeamInsightsTab({ return ( <>
- {/* Compétences à développer */} + {/* Compétences critiques à développer */}

- Compétences à développer + Compétences critiques à développer

-
+
+ {/* Incontournables */} {skillAnalysis - .filter((s) => s.averageLevel < 1.5) - .slice(0, 5) + .filter( + (s) => s.importance === "incontournable" && s.coverage < 75 + ) .map((skill, idx) => (
-
-
- {skill.skillName} +
+
+
+ {skill.skillName} +
+
+ {skill.category} +
-
- {skill.category} +
+
+ Objectif: 75% +
+
+ {skill.coverage.toFixed(0)}% +
-
-
- {skill.averageLevel.toFixed(1)} +
+ ))} + + {/* Majeures */} + {skillAnalysis + .filter((s) => s.importance === "majeure" && s.coverage < 60) + .map((skill, idx) => ( +
+
+
+
+ {skill.skillName} +
+
+ {skill.category} +
-
- {skill.learnerCount} intéressés +
+
+ Objectif: 60% +
+
+ {skill.coverage.toFixed(0)}% +
@@ -83,34 +130,66 @@ export function TeamInsightsTab({ Opportunités de mentorat -
+
{skillAnalysis .filter( (s) => s.experts.filter((e) => e.canMentor).length > 0 && - s.learnerCount > 0 + s.learnerCount > 0 && + (s.importance === "incontournable" || + s.importance === "majeure") ) - .slice(0, 5) + .sort((a, b) => { + // D'abord par importance + const importanceOrder = { + incontournable: 2, + majeure: 1, + standard: 0, + }; + const importanceDiff = + importanceOrder[b.importance] - importanceOrder[a.importance]; + if (importanceDiff !== 0) return importanceDiff; + + // Ensuite par nombre d'apprenants + return b.learnerCount - a.learnerCount; + }) .map((skill, idx) => ( -
-
-
- {skill.skillName} +
+
+
+
+ {skill.skillName} +
+
+ {skill.importance === "incontournable" + ? "Incontournable" + : "Majeure"} +
-
- {skill.category} -
-
-
-
- {skill.experts.filter((e) => e.canMentor).length} mentor - {skill.experts.filter((e) => e.canMentor).length > 1 - ? "s" - : ""} -
-
- {skill.learnerCount} apprenant - {skill.learnerCount > 1 ? "s" : ""} +
+
+ {skill.experts.filter((e) => e.canMentor).length} mentor + {skill.experts.filter((e) => e.canMentor).length > 1 + ? "s" + : ""} +
+
+ {skill.learnerCount} apprenant + {skill.learnerCount > 1 ? "s" : ""} +
@@ -126,58 +205,104 @@ export function TeamInsightsTab({ Recommandations pour l'équipe
-
-

- 🎯 Formations prioritaires +
+

+ 🎯 Compétences incontournables

- Organiser des formations sur{" "} - {skillAnalysis - .filter((s) => s.averageLevel < 1.5) - .slice(0, 2) - .map((s) => s.skillName) - .join(" et ")} - pour combler les lacunes identifiées. + {teamInsights.skillGaps.incontournable > 0 ? ( + <> + Priorité: combler les lacunes sur{" "} + {teamInsights.skillGaps.incontournable} compétence + {teamInsights.skillGaps.incontournable > 1 ? "s" : ""}{" "} + incontournable + {teamInsights.skillGaps.incontournable > 1 ? "s" : ""} sous + l'objectif de 75%. + + ) : ( + <> + Excellent ! Toutes les compétences incontournables atteignent + leur objectif de couverture. + + )} +

+
+ +
+

+ 🎓 Compétences majeures +

+

+ {teamInsights.skillGaps.majeure > 0 ? ( + <> + Attention: {teamInsights.skillGaps.majeure} compétence + {teamInsights.skillGaps.majeure > 1 ? "s" : ""} majeure + {teamInsights.skillGaps.majeure > 1 ? "s" : ""} n'atteigne + {teamInsights.skillGaps.majeure > 1 ? "nt" : ""} pas + l'objectif de 60%. + + ) : ( + <> + Bravo ! Toutes les compétences majeures atteignent leur + objectif de couverture. + + )}

- 🤝 Programme de mentorat + 🤝 Opportunités de mentorat

- Mettre en place un système de mentorat avec{" "} - {skillAnalysis.reduce( - (sum, skill) => - sum + skill.experts.filter((e) => e.canMentor).length, - 0 - )}{" "} - mentors disponibles. -

-
- -
-

- 📈 Capitaliser sur les forces -

-

- Exploiter l'expertise en{" "} - {skillAnalysis - .filter((s) => s.averageLevel >= 2.5) - .slice(0, 2) - .map((s) => s.skillName) - .join(" et ")} - pour des projets ambitieux. + {skillAnalysis.filter( + (s) => + s.experts.filter((e) => e.canMentor).length > 0 && + s.learnerCount > 0 && + (s.importance === "incontournable" || + s.importance === "majeure") + ).length > 0 ? ( + <> + { + skillAnalysis.filter( + (s) => + s.experts.filter((e) => e.canMentor).length > 0 && + s.learnerCount > 0 && + (s.importance === "incontournable" || + s.importance === "majeure") + ).length + }{" "} + opportunité + {skillAnalysis.filter( + (s) => + s.experts.filter((e) => e.canMentor).length > 0 && + s.learnerCount > 0 && + (s.importance === "incontournable" || + s.importance === "majeure") + ).length > 1 + ? "s" + : ""}{" "} + de mentorat sur des compétences critiques. + + ) : ( + <> + Aucune opportunité de mentorat identifiée sur les compétences + critiques. + + )}

- 🔄 Plan de développement + 📊 Couverture globale

- Créer des parcours de montée en compétences personnalisés pour{" "} - {teamInsights.totalLearners} objectifs d'apprentissage. + Incontournables:{" "} + {teamInsights.criticalSkillsCoverage.incontournable.toFixed(0)}% + {" • "} + Majeures: {teamInsights.criticalSkillsCoverage.majeure.toFixed(0)} + %

diff --git a/components/admin/team-detail/team-member-modal.tsx b/components/admin/team-detail/team-member-modal.tsx index ef006a1..66f3286 100644 --- a/components/admin/team-detail/team-member-modal.tsx +++ b/components/admin/team-detail/team-member-modal.tsx @@ -48,7 +48,7 @@ export function TeamMemberModal({ return ( - +
@@ -78,98 +78,198 @@ export function TeamMemberModal({
{/* Stats du membre */} -
-
-
+
+
+
{member.skills.length}
-
Compétences évaluées
+
compétences
-
-
+
+
+ +
{ member.skills.filter((s) => s.level >= 2 && s.canMentor) .length }
-
Peut mentorer
+
mentorables
-
-
+
+
+ +
{member.skills.filter((s) => s.wantsToLearn).length}
-
Souhaite apprendre
+
à apprendre
{/* Compétences détaillées */} -
-

- Portfolio de compétences -

-
- {member.skills - .sort((a, b) => b.level - a.level) - .map((skill, idx) => ( -
-
-
-
-
- {skill.skillName} -
-
- {skill.category} -
-
-
- - {getSkillLevelLabel(skill.level)} - -
-
- -
-
-
- -
- {skill.canMentor && ( - - - Mentor - - )} - {skill.wantsToLearn && ( - - - Apprenant - - )} -
-
+
+
+

+ Portfolio de compétences +

+
+
+
+
+ Inc.
- ))} +
+
+ Maj. +
+
+
+
+ Exp. +
+
+
+ Auto. +
+
+
+ Prog. +
+
+
+ Déb. +
+
+
+
+
+ + + + + + + + + + + + + + + {member.skills + .sort((a, b) => { + // D'abord par importance + const importanceOrder = { + incontournable: 2, + majeure: 1, + standard: 0, + }; + const importanceDiff = + importanceOrder[b.importance] - + importanceOrder[a.importance]; + if (importanceDiff !== 0) return importanceDiff; + + // Ensuite par niveau de maîtrise + return b.level - a.level; + }) + .map((skill, idx) => ( + + + + + + ))} + +
+ Compétence + + Niveau + + Statut +
+
+
+
+
+ {skill.skillName} +
+
+
+ {skill.category} +
+ + • + +
+ {skill.importance === "incontournable" + ? "Inc." + : skill.importance === "majeure" + ? "Maj." + : "Std."} +
+
+
+
+
+
+
+ {skill.level.toFixed(1)} +
+
+
+
+
+
+
+ {skill.canMentor && ( + + + Mentor + + )} + {skill.wantsToLearn && ( + + + Apprenant + + )} +
+
diff --git a/components/admin/team-detail/team-members-tab.tsx b/components/admin/team-detail/team-members-tab.tsx index 08530ce..d6b8a41 100644 --- a/components/admin/team-detail/team-members-tab.tsx +++ b/components/admin/team-detail/team-members-tab.tsx @@ -35,112 +35,107 @@ export function TeamMembersTab({ onMemberClick, }: TeamMembersTabProps) { return ( -
- {members.map((member) => { - const memberAvg = - member.skills.reduce((sum, skill) => sum + skill.level, 0) / - member.skills.length; - const expertSkills = member.skills.filter( - (s) => s.level >= 2 && s.canMentor - ).length; - const learningGoals = member.skills.filter( - (s) => s.wantsToLearn - ).length; +
+
+ + + + + + + + + + + + {members.map((member) => { + const memberAvg = + member.skills.reduce((sum, skill) => sum + skill.level, 0) / + member.skills.length; + const expertSkills = member.skills.filter( + (s) => s.level >= 2 && s.canMentor + ).length; + const learningGoals = member.skills.filter( + (s) => s.wantsToLearn + ).length; - return ( -
onMemberClick(member)} - > -
-
-
- -
-
-
- {member.firstName} {member.lastName} -
-
- {new Date(member.joinDate).toLocaleDateString()} -
-
-
-
- - {getSkillLevelLabel(memberAvg)} - -
-
- -
-
- Niveau moyen: - - {memberAvg.toFixed(1)}/3 - -
- -
-
-
- -
-
-
- {member.skills.length} -
-
Compétences
-
-
-
- {expertSkills} -
-
Expertises
-
-
-
- {learningGoals} -
-
Objectifs
-
-
- - {expertSkills > 0 && ( -
- - - Peut mentorer {expertSkills} compétence - {expertSkills > 1 ? "s" : ""} - -
- )} - - {learningGoals > 0 && ( -
- - - Souhaite apprendre {learningGoals} compétence - {learningGoals > 1 ? "s" : ""} - -
- )} -
-
- ); - })} + return ( +
onMemberClick(member)} + > + + + + + + + ); + })} + +
+ Membre + + Niveau + + Compétences + + Expertises + + Objectifs +
+
+
+ +
+
+
+ {member.firstName} {member.lastName} +
+
+ {new Date(member.joinDate).toLocaleDateString()} +
+
+
+
+
+
+ {memberAvg.toFixed(1)} +
+
+
+
+
+
+ + {member.skills.length} + + +
+ + + {expertSkills} + +
+
+
+ + + {learningGoals} + +
+
+
); } diff --git a/components/admin/team-detail/team-metrics-cards.tsx b/components/admin/team-detail/team-metrics-cards.tsx index ac679ae..2c5edc0 100644 --- a/components/admin/team-detail/team-metrics-cards.tsx +++ b/components/admin/team-detail/team-metrics-cards.tsx @@ -6,8 +6,20 @@ interface TeamInsights { averageTeamLevel: number; totalExperts: number; totalLearners: number; - skillGaps: number; - strongSkills: number; + skillGaps: { + incontournable: number; + majeure: number; + standard: number; + }; + strongSkills: { + incontournable: number; + majeure: number; + standard: number; + }; + criticalSkillsCoverage: { + incontournable: number; + majeure: number; + }; } interface TeamMetricsCardsProps { @@ -58,6 +70,50 @@ export function TeamMetricsCards({
+
+
+
+ +
+ + Incontournables + +
+
+ {teamInsights.criticalSkillsCoverage.incontournable.toFixed(0)}% +
+
+ {teamInsights.skillGaps.incontournable} à renforcer +
+
+ +
+
+
+ +
+ Majeures +
+
+ {teamInsights.criticalSkillsCoverage.majeure.toFixed(0)}% +
+
+ {teamInsights.skillGaps.majeure} à renforcer +
+
+
@@ -68,38 +124,10 @@ export function TeamMetricsCards({
{teamInsights.totalExperts}
-
compétences expertes
-
- -
-
-
- -
- - Apprentissages - -
-
- {teamInsights.totalLearners} -
- objectifs d'apprentissage -
-
- -
-
-
- -
- Lacunes -
-
- {teamInsights.skillGaps} -
-
- compétences à renforcer + {teamInsights.strongSkills.incontournable + + teamInsights.strongSkills.majeure}{" "} + critiques maîtrisées
diff --git a/components/admin/team-detail/team-overview-tab.tsx b/components/admin/team-detail/team-overview-tab.tsx index f82a154..ecbfb62 100644 --- a/components/admin/team-detail/team-overview-tab.tsx +++ b/components/admin/team-detail/team-overview-tab.tsx @@ -7,6 +7,7 @@ import { TechIcon } from "@/components/icons/tech-icon"; interface SkillAnalysis { skillName: string; category: string; + importance: "incontournable" | "majeure" | "standard"; experts: Array<{ name: string; level: number; @@ -21,14 +22,27 @@ interface SkillAnalysis { expertCount: number; learnerCount: number; proficiencyRate: number; + coverage: number; } interface TeamInsights { averageTeamLevel: number; totalExperts: number; totalLearners: number; - skillGaps: number; - strongSkills: number; + skillGaps: { + incontournable: number; + majeure: number; + standard: number; + }; + strongSkills: { + incontournable: number; + majeure: number; + standard: number; + }; + criticalSkillsCoverage: { + incontournable: number; + majeure: number; + }; } interface TeamOverviewTabProps { @@ -66,22 +80,70 @@ export function TeamOverviewTab({
{skill.icon && ( -
+
)} - - {skill.skillName} - +
+ + {skill.skillName} + +
+ {skill.importance === "incontournable" + ? "Incontournable" + : skill.importance === "majeure" + ? "Majeure" + : "Standard"} +
+
+
+
+
+ {skill.coverage.toFixed(0)}% +
+
-
@@ -120,6 +182,139 @@ export function TeamOverviewTab({
+ {/* Compétences critiques */} +
+

+ + Compétences critiques +

+
+ {/* Incontournables */} +
+
+

+ Incontournables +

+
+ + {teamInsights.strongSkills.incontournable} + + / + + {teamInsights.strongSkills.incontournable + + teamInsights.skillGaps.incontournable} + +
+
+
+ {skillAnalysis + .filter((s) => s.importance === "incontournable") + .sort((a, b) => b.coverage - a.coverage) + .map((skill, idx) => ( +
+
+ {skill.icon && ( +
+ +
+ )} + + {skill.skillName} + +
+
+ + {skill.coverage.toFixed(0)}% + +
+
+
+
+
+ ))} +
+
+ + {/* Majeures */} +
+
+

Majeures

+
+ + {teamInsights.strongSkills.majeure} + + / + + {teamInsights.strongSkills.majeure + + teamInsights.skillGaps.majeure} + +
+
+
+ {skillAnalysis + .filter((s) => s.importance === "majeure") + .sort((a, b) => b.coverage - a.coverage) + .map((skill, idx) => ( +
+
+ {skill.icon && ( +
+ +
+ )} + + {skill.skillName} + +
+
+ + {skill.coverage.toFixed(0)}% + +
+
+
+
+
+ ))} +
+
+
+
+ {/* Distribution des niveaux */}
@@ -203,17 +398,80 @@ export function TeamOverviewTab({
- Couverture des compétences - - {team.skillCoverage.toFixed(1)}% + + Compétences incontournables +
+ + {teamInsights.criticalSkillsCoverage.incontournable.toFixed( + 0 + )} + % + +
+
+
+ + {teamInsights.skillGaps.incontournable} à renforcer + +
+
- Compétences fortes - - {teamInsights.strongSkills} - + Compétences majeures +
+ + {teamInsights.criticalSkillsCoverage.majeure.toFixed(0)}% + +
+
+
+ + {teamInsights.skillGaps.majeure} à renforcer + +
+ +
+ Compétences standards +
+ + {teamInsights.skillGaps.standard} + + à renforcer +
+
+
Objectifs d'apprentissage diff --git a/components/admin/team-detail/team-skills-tab.tsx b/components/admin/team-detail/team-skills-tab.tsx index a6e74dc..abde675 100644 --- a/components/admin/team-detail/team-skills-tab.tsx +++ b/components/admin/team-detail/team-skills-tab.tsx @@ -7,6 +7,7 @@ import { Badge } from "@/components/ui/badge"; interface SkillAnalysis { skillName: string; category: string; + importance: "incontournable" | "majeure" | "standard"; experts: Array<{ name: string; level: number; @@ -21,6 +22,7 @@ interface SkillAnalysis { expertCount: number; learnerCount: number; proficiencyRate: number; + coverage: number; } interface TeamSkillsTabProps { @@ -95,101 +97,156 @@ export function TeamSkillsTab({ skillAnalysis }: TeamSkillsTabProps) {
{/* Liste des compétences détaillée */} -
- {filteredSkills.map((skill, idx) => ( -
-
-
-

- {skill.skillName} -

-

{skill.category}

-
-
- - {getSkillLevelLabel(skill.averageLevel)} - -
-
+
+
+ + + + + + + + + + + + + {filteredSkills.map((skill, idx) => { + const target = + skill.importance === "incontournable" + ? 75 + : skill.importance === "majeure" + ? 60 + : 0; + const isUnderTarget = target > 0 && skill.coverage < target; -
-
- Niveau: - - {skill.averageLevel.toFixed(1)}/3 - -
- -
-
-
- -
-
-
- {skill.totalEvaluations} -
-
Éval.
-
-
-
- {skill.expertCount} -
-
Experts
-
-
-
- {skill.learnerCount} -
-
Appren.
-
-
- - {skill.experts.filter((e) => e.canMentor).length > 0 && ( -
-
Mentors:
-
- {skill.experts - .filter((e) => e.canMentor) - .slice(0, 2) - .map((expert, i) => ( - +
+ + + + + + + ); + })} + +
+ Compétence + + Niveau + + Experts + + Appren. + + Couv. + + Mentors +
+
+
+
+
+ {skill.skillName} +
+
+ {skill.category} +
+
+
+
+
+
- {expert.name.split(" ")[0]} - - ))} - {skill.experts.filter((e) => e.canMentor).length > 2 && ( - - +{skill.experts.filter((e) => e.canMentor).length - 2} - - )} -
-
- )} - - - ))} + {skill.averageLevel.toFixed(1)} + +
+
+
+
+
+ + {skill.expertCount} + + + + {skill.learnerCount} + + +
+
+ {skill.coverage.toFixed(0)}% +
+
+
+
+
+
+
+ {skill.experts + .filter((e) => e.canMentor) + .slice(0, 2) + .map((expert, i) => ( + + {expert.name.split(" ")[0]} + + ))} + {skill.experts.filter((e) => e.canMentor).length > + 2 && ( + + + + {skill.experts.filter((e) => e.canMentor).length - + 2} + + )} +
+
+
); diff --git a/lib/admin-types.ts b/lib/admin-types.ts index 41a7b29..6387bf2 100644 --- a/lib/admin-types.ts +++ b/lib/admin-types.ts @@ -8,6 +8,7 @@ export interface TeamMember { skillId: string; skillName: string; category: string; + importance: "incontournable" | "majeure" | "standard"; level: number; canMentor: boolean; wantsToLearn: boolean; diff --git a/services/admin-service.ts b/services/admin-service.ts index ab079eb..1b84e37 100644 --- a/services/admin-service.ts +++ b/services/admin-service.ts @@ -99,6 +99,7 @@ export class AdminService { 'skillId', ss.skill_id, 'skillName', ss.skill_name, 'category', ss.category_name, + 'importance', ss.importance, 'level', ss.level_numeric, 'canMentor', ss.can_mentor, 'wantsToLearn', ss.wants_to_learn