"use client"; import { useState } from "react"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Button } from "@/components/ui/button"; import { Users, Target, Building2, UserCheck, Filter } from "lucide-react"; import { Team, SkillCategory } from "@/lib/types"; import { TeamStatsCard, DirectionOverview, MultiSelectFilter, } from "@/components/admin"; import { TeamDetailModal } from "@/components/admin/team-detail-modal"; import { TeamStats, DirectionStats } from "@/services/admin-service"; interface AdminClientWrapperProps { teams: Team[]; skillCategories: SkillCategory[]; teamStats: TeamStats[]; directionStats: DirectionStats[]; } export function AdminClientWrapper({ teams, skillCategories, teamStats, directionStats, }: AdminClientWrapperProps) { // Filtres const [selectedDirections, setSelectedDirections] = useState([]); const [selectedTeams, setSelectedTeams] = useState([]); // Modale de détails const [selectedTeamForModal, setSelectedTeamForModal] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); // Fonctions de filtrage const getFilteredTeamStats = () => { let filtered = teamStats; if (selectedDirections.length > 0) { filtered = filtered.filter((team) => selectedDirections.includes(team.direction) ); } if (selectedTeams.length > 0) { filtered = filtered.filter((team) => selectedTeams.includes(team.teamId)); } return filtered; }; const getFilteredDirectionStats = () => { let filtered = directionStats; if (selectedDirections.length > 0) { filtered = filtered.filter((direction) => selectedDirections.includes(direction.direction) ); } // Si des équipes spécifiques sont sélectionnées, filtrer aussi les équipes dans les directions if (selectedTeams.length > 0) { filtered = filtered .map((direction) => ({ ...direction, teams: direction.teams.filter((team) => selectedTeams.includes(team.teamId) ), totalMembers: direction.teams .filter((team) => selectedTeams.includes(team.teamId)) .reduce((sum, team) => sum + team.totalMembers, 0), averageSkillLevel: direction.teams .filter((team) => selectedTeams.includes(team.teamId)) .reduce( (sum, team, _, arr) => sum + team.averageSkillLevel / arr.length, 0 ), })) .filter((direction) => direction.teams.length > 0); } return filtered; }; // Options pour les filtres const directionOptions = Array.from( new Set(teams.map((team) => team.direction)) ).map((direction) => ({ id: direction, label: direction, count: teams.filter((team) => team.direction === direction).length, })); const teamOptions = teams.map((team) => ({ id: team.id, label: `${team.name} (${team.direction})`, count: teamStats.find((stat) => stat.teamId === team.id)?.totalMembers || 0, })); // Fonctions pour les actions des équipes const handleViewTeamDetails = (team: TeamStats) => { setSelectedTeamForModal(team); setIsModalOpen(true); }; const handleExportTeamReport = (team: TeamStats) => { const reportData = { team: team.teamName, direction: team.direction, date: new Date().toLocaleDateString(), stats: { members: team.totalMembers, averageLevel: team.averageSkillLevel, coverage: team.skillCoverage, }, topSkills: team.topSkills, }; const dataStr = JSON.stringify(reportData, null, 2); const dataUri = "data:application/json;charset=utf-8," + encodeURIComponent(dataStr); const exportFileDefaultName = `rapport-${team.teamName.toLowerCase()}-${ new Date().toISOString().split("T")[0] }.json`; const linkElement = document.createElement("a"); linkElement.setAttribute("href", dataUri); linkElement.setAttribute("download", exportFileDefaultName); linkElement.click(); }; return (
{/* Background Effects */}
{/* Header */}
Administration

Dashboard Managérial

Vue d'ensemble des compétences par équipe et direction pour pilotage stratégique

{/* Overview Cards */}
{selectedDirections.length > 0 || selectedTeams.length > 0 ? "FILTRÉES" : "TOTAL"}

{selectedDirections.length > 0 || selectedTeams.length > 0 ? getFilteredTeamStats().length : teams.length}

{selectedDirections.length > 0 || selectedTeams.length > 0 ? "Équipes filtrées" : "Équipes"}

{(selectedDirections.length > 0 || selectedTeams.length > 0) && (

sur {teams.length} au total

)}
{selectedDirections.length > 0 || selectedTeams.length > 0 ? "FILTRÉS" : "TOTAL"}

{selectedDirections.length > 0 || selectedTeams.length > 0 ? getFilteredTeamStats().reduce( (sum, t) => sum + t.totalMembers, 0 ) : teamStats.reduce((sum, t) => sum + t.totalMembers, 0)}

{selectedDirections.length > 0 || selectedTeams.length > 0 ? "Membres filtrés" : "Membres"}

{(selectedDirections.length > 0 || selectedTeams.length > 0) && (

sur {teamStats.reduce((sum, t) => sum + t.totalMembers, 0)} au total

)}
{selectedDirections.length > 0 || selectedTeams.length > 0 ? "FILTRÉES" : "TOTAL"}

{selectedDirections.length > 0 || selectedTeams.length > 0 ? getFilteredDirectionStats().length : directionStats.length}

{selectedDirections.length > 0 || selectedTeams.length > 0 ? "Directions filtrées" : "Directions"}

{(selectedDirections.length > 0 || selectedTeams.length > 0) && (

sur {directionStats.length} au total

)}
RÉFÉRENTIEL

{skillCategories.reduce( (sum, cat) => sum + (cat.skills?.length || 0), 0 )}

Compétences suivies

{skillCategories.length} catégories

{/* Filtres */}

Filtres avancés

} />
} />
{/* Résumé des filtres actifs */} {(selectedDirections.length > 0 || selectedTeams.length > 0) && (
{getFilteredTeamStats().reduce( (sum, t) => sum + t.totalMembers, 0 )}{" "} membres
)}
{/* Main Content Tabs */}
Vue par Direction Vue par Équipe
{getFilteredDirectionStats().length > 0 ? ( getFilteredDirectionStats().map((direction) => ( )) ) : (

Aucune direction trouvée

Aucune direction ne correspond aux filtres sélectionnés.

)}
{getFilteredTeamStats().length > 0 ? ( getFilteredTeamStats().map((team) => ( handleViewTeamDetails(team)} onViewReport={() => handleExportTeamReport(team)} /> )) ) : (

Aucune équipe trouvée

Aucune équipe ne correspond aux filtres sélectionnés.

)}
{/* Modale de détails d'équipe */} setIsModalOpen(false)} team={selectedTeamForModal} />
); }