import { useParams, useNavigate } from 'react-router-dom' import { useState, useEffect } from 'react' import type { Employee } from '@skillmate/shared' // Dynamische Hierarchie für Darstellung der Nutzer-Skills import SkillLevelBar from '../components/SkillLevelBar' import OfficeMapModal from '../components/OfficeMapModal' import { employeeApi } from '../services/api' import { useAuthStore } from '../stores/authStore' export default function EmployeeDetail() { const { id } = useParams() const navigate = useNavigate() const { user } = useAuthStore() const [employee, setEmployee] = useState(null) const [error, setError] = useState('') const [showOfficeMap, setShowOfficeMap] = useState(false) const [hierarchy, setHierarchy] = useState<{ id: string; name: string; subcategories: { id: string; name: string; skills: { id: string; name: string }[] }[] }[]>([]) const API_BASE = (import.meta as any).env?.VITE_API_URL || 'http://localhost:3004/api' const PUBLIC_BASE = (import.meta as any).env?.VITE_API_PUBLIC_URL || API_BASE.replace(/\/api$/, '') const toPublic = (p?: string | null) => (p && p.startsWith('/uploads/')) ? `${PUBLIC_BASE}${p}` : (p || '') useEffect(() => { if (id) { fetchEmployee(id) } }, [id]) useEffect(() => { const load = async () => { try { const res = await fetch(((import.meta as any).env?.VITE_API_URL || 'http://localhost:3004/api') + '/skills/hierarchy', { headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` } }) const data = await res.json() if (data?.success) setHierarchy(data.data || []) } catch {} } load() }, []) const fetchEmployee = async (employeeId: string) => { try { const data = await employeeApi.getById(employeeId) setEmployee(data) } catch (error) { console.error('Failed to fetch employee:', error) // Fallback to mock data const mockEmployee: Employee = { id: '1', firstName: 'Max', lastName: 'Mustermann', employeeNumber: 'EMP001', position: 'Senior Analyst', department: 'Cybercrime', email: 'max.mustermann@behörde.de', phone: '+49 30 12345-100', mobile: '+49 170 1234567', office: 'Raum 3.42', availability: 'available', skills: [ { id: '1', name: 'Python', category: 'it', level: 'expert', verified: true }, { id: '2', name: 'Netzwerkforensik', category: 'it', level: 'advanced', verified: true }, { id: '3', name: 'OSINT-Tools', category: 'it', level: 'advanced' }, ], languages: [ { language: 'Deutsch', proficiency: 'native', isNative: true }, { language: 'Englisch', proficiency: 'fluent', certified: true, certificateType: 'C1' }, { language: 'Russisch', proficiency: 'intermediate' }, ], clearance: { level: 'Ü3', validUntil: new Date('2025-12-31'), issuedDate: new Date('2021-01-15'), }, specializations: ['Digitale Forensik', 'Malware-Analyse', 'Darknet-Ermittlungen'], createdAt: new Date(), updatedAt: new Date(), createdBy: 'admin', } setEmployee(mockEmployee) } } if (!employee) { return (

Mitarbeiter wird geladen...

) } // Hinweis: Verfügbarkeits-Badge wird im Mitarbeiter-Detail nicht angezeigt return (
{employee.photo ? ( Foto ) : (
{employee.firstName.charAt(0)}{employee.lastName.charAt(0)}
)}

{employee.firstName} {employee.lastName}

{employee.employeeNumber && (

{employee.employeeNumber}

)}

Kontaktdaten

E-Mail:

{employee.email}

Telefon:

{employee.phone}

{employee.mobile && (
Mobil:

{employee.mobile}

)} {employee.office && (
Büro:

{employee.office}

)}

Allgemeine Informationen

Position:

{employee.position}

Dienststelle:

{employee.department}

{employee.clearance && (
Sicherheitsüberprüfung:

{employee.clearance.level} (gültig bis {new Date(employee.clearance.validUntil).toLocaleDateString('de-DE')})

)}

Kompetenzen

{hierarchy.map(cat => { const subs = cat.subcategories.map(sub => { const selected = sub.skills.filter(sk => employee.skills.some(es => es.id === sk.id)) return { sub, selected } }).filter(x => x.selected.length > 0) if (subs.length === 0) return null return (

{cat.name}

{subs.map(({ sub, selected }) => (
{sub.name}
    {selected.map((sk) => { const info = employee.skills.find(es => es.id === sk.id) const levelVal = info?.level ? Number(info.level) : '' return (
  • {sk.name}
    {}} disabled showHelp={false} />
  • ) })}
))}
) })}
{employee.specializations.length > 0 && (

Spezialisierungen

{employee.specializations.map((spec, index) => ( {spec} ))}
)}
{/* Office Map Modal */} setShowOfficeMap(false)} targetEmployeeId={employee?.id} targetRoom={employee?.office || undefined} currentUserRoom="1-101" // This should come from logged-in user data employeeName={employee ? `${employee.firstName} ${employee.lastName}` : undefined} />
) }