"use client"; import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; import { Users, TrendingUp, BarChart3, ExternalLink, Target, Award, Star, ChevronRight, Baby, User, Zap, Crown, AlertTriangle, } from "lucide-react"; import { TechIcon } from "@/components/icons/tech-icon"; import { getImportanceColors } from "@/lib/tech-colors"; import { COVERAGE_OBJECTIVES, isCoverageBelowObjective, } from "@/lib/evaluation-utils"; interface TeamStatsRowProps { teamId: string; teamName: string; direction: string; totalMembers: number; averageSkillLevel: number; topSkills: Array<{ skillName: string; averageLevel: number; color?: string; icon?: string; importance: "incontournable" | "majeure" | "standard"; coverage: number; }>; skillCoverage: number; criticalSkillsCoverage: { incontournable: number; majeure: number; }; onViewDetails?: () => void; onViewReport?: () => void; } export function getSkillLevelLabel(level: number): string { if (level < 0.5) return "Débutant"; if (level < 1.5) return "Intermédiaire"; if (level < 2.5) return "Avancé"; return "Expert"; } export function getSkillLevelColor(level: number): string { if (level < 0.5) return "bg-red-500"; if (level < 1.5) return "bg-orange-500"; if (level < 2.5) return "bg-blue-500"; return "bg-green-500"; } export function getSkillLevelBadgeClasses(level: number): string { if (level < 0.5) return "bg-red-500/20 border-red-500/30 text-red-300"; if (level < 1.5) return "bg-orange-500/20 border-orange-500/30 text-orange-300"; if (level < 2.5) return "bg-blue-500/20 border-blue-500/30 text-blue-300"; return "bg-green-500/20 border-green-500/30 text-green-300"; } export function getProgressColor( percentage: number, importance: "incontournable" | "majeure" | "standard" ): string { if (isCoverageBelowObjective(percentage, importance)) return "bg-red-500"; return "bg-green-500"; } export function TeamStatsRow({ teamId, teamName, direction, totalMembers, averageSkillLevel, topSkills, skillCoverage, criticalSkillsCoverage, onViewDetails, onViewReport, }: TeamStatsRowProps) { // Calculer les alertes sur les compétences critiques const hasIncontournableAlert = isCoverageBelowObjective( criticalSkillsCoverage.incontournable, "incontournable" ); const hasMajeureAlert = isCoverageBelowObjective( criticalSkillsCoverage.majeure, "majeure" ); return (
{/* Layout horizontal compact */}
{/* Informations de base */}

{teamName}

{totalMembers}
{/* Mini barre de progression */}
Niveau {((averageSkillLevel / 3) * 100).toFixed(0)}%
{/* Indicateurs clés compacts */}
{criticalSkillsCoverage.incontournable.toFixed(0)}%
Incont.

Couverture des compétences incontournables
Objectif : {COVERAGE_OBJECTIVES.incontournable}%

{criticalSkillsCoverage.majeure.toFixed(0)}%
Maj.

Couverture des compétences majeures
Objectif : {COVERAGE_OBJECTIVES.majeure}%

{averageSkillLevel < 0.5 ? "D" : averageSkillLevel < 1.5 ? "I" : averageSkillLevel < 2.5 ? "A" : "E"}

{getSkillLevelLabel(averageSkillLevel)}

{/* Top skills mini */}
{topSkills.slice(0, 3).map((skill, idx) => { const colors = getImportanceColors(skill.importance); const target = COVERAGE_OBJECTIVES[skill.importance]; const isUnderTarget = isCoverageBelowObjective( skill.coverage, skill.importance ); return (
{skill.skillName}
{skill.coverage.toFixed(0)}%

{skill.skillName}

{skill.importance === "incontournable" ? "Compétence incontournable" : skill.importance === "majeure" ? "Compétence majeure" : "Compétence standard"}

{target > 0 && (

Objectif : {target}%

)}
); })}
{/* Actions compactes */}
); }