"use client"; import { useState, useMemo, useRef, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { UserProfile, Team } from "@/lib/types"; import { Search, Building2, ChevronDown, Check } from "lucide-react"; interface ProfileFormProps { teams: Team[]; initialProfile?: UserProfile; onSubmit: (profile: UserProfile) => void; } export function ProfileForm({ teams, initialProfile, onSubmit, }: ProfileFormProps) { const [firstName, setFirstName] = useState(initialProfile?.firstName || ""); const [lastName, setLastName] = useState(initialProfile?.lastName || ""); const [teamId, setTeamId] = useState(initialProfile?.teamId || ""); const [searchTerm, setSearchTerm] = useState(""); const [isTeamDropdownOpen, setIsTeamDropdownOpen] = useState(false); const teamDropdownRef = useRef(null); const [dropdownPosition, setDropdownPosition] = useState<"below" | "above">( "below" ); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (firstName && lastName && teamId) { onSubmit({ firstName, lastName, teamId }); } }; const isValid = firstName.length > 0 && lastName.length > 0 && teamId.length > 0; // Group teams by direction and filter by search term const teamsByDirection = useMemo(() => { const filteredTeams = teams.filter( (team) => team.name.toLowerCase().includes(searchTerm.toLowerCase()) || team.direction.toLowerCase().includes(searchTerm.toLowerCase()) ); return filteredTeams.reduce((acc, team) => { if (!acc[team.direction]) { acc[team.direction] = []; } acc[team.direction].push(team); return acc; }, {} as Record); }, [teams, searchTerm]); // Calculate dropdown position when opening const handleDropdownToggle = () => { if (!isTeamDropdownOpen && teamDropdownRef.current) { const rect = teamDropdownRef.current.getBoundingClientRect(); const viewportHeight = window.innerHeight; const spaceBelow = viewportHeight - rect.bottom; const spaceAbove = rect.top; const dropdownHeight = 300; // max-height of dropdown setDropdownPosition( spaceBelow >= dropdownHeight || spaceBelow > spaceAbove ? "below" : "above" ); } setIsTeamDropdownOpen(!isTeamDropdownOpen); }; // Close dropdown when clicking outside useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( teamDropdownRef.current && !teamDropdownRef.current.contains(event.target as Node) ) { setIsTeamDropdownOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); const selectedTeam = teams.find((team) => team.id === teamId); return ( Informations personnelles Renseignez vos informations pour commencer votre auto-évaluation
setFirstName(e.target.value)} placeholder="Votre prénom" required />
setLastName(e.target.value)} placeholder="Votre nom" required />
{isTeamDropdownOpen && (
{/* Barre de recherche */}
setSearchTerm(e.target.value)} className="pl-8 h-8 text-sm" autoFocus />
{/* Liste des équipes groupées par direction */} {Object.entries(teamsByDirection).map( ([direction, directionTeams]) => (
{/* En-tête de direction (non-cliquable) */}
{direction}
{/* Équipes de cette direction */} {directionTeams.map((team) => ( ))}
) )} {/* Message si aucune équipe trouvée */} {Object.keys(teamsByDirection).length === 0 && (
Aucune équipe trouvée pour "{searchTerm}"
)}
)}
); }