"use client"; import { useState } from "react"; import { Team, SkillCategory } from "@/lib/types"; import { TeamStats, DirectionStats } from "@/services/admin-service"; import { TeamDetailModal } from "@/components/admin/team-detail-modal"; import { AdminHeader } from "./admin-header"; import { AdminOverviewCards } from "./admin-overview-cards"; import { AdminFilters } from "./admin-filters"; import { AdminContentTabs } from "./admin-content-tabs"; 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; }; // 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 */} {/* Overview Cards */} {/* Filtres */} {/* Main Content Tabs */} {/* Modale de détails d'équipe */} setIsModalOpen(false)} team={selectedTeamForModal} />
); }