// frontend/src/pages/Employees/EmployeeManagement.tsx import React, { useState, useEffect } from 'react'; import { Employee } from '../../models/Employee'; import { employeeService } from '../../services/employeeService'; import EmployeeList from './components/EmployeeList'; import EmployeeForm from './components/EmployeeForm'; import AvailabilityManager from './components/AvailabilityManager'; import { useAuth } from '../../contexts/AuthContext'; import { useNotification } from '../../contexts/NotificationContext'; type ViewMode = 'list' | 'create' | 'edit' | 'availability'; const EmployeeManagement: React.FC = () => { const [employees, setEmployees] = useState([]); const [loading, setLoading] = useState(true); const [viewMode, setViewMode] = useState('list'); const [selectedEmployee, setSelectedEmployee] = useState(null); const { hasRole } = useAuth(); const { showNotification, confirmDialog } = useNotification(); useEffect(() => { loadEmployees(); }, []); const loadEmployees = async () => { try { setLoading(true); console.log('🔄 Loading employees...'); // Add cache-busting parameter to prevent browser caching const data = await employeeService.getEmployees(true); console.log('✅ Employees loaded:', data); setEmployees(data); } catch (err: any) { console.error('❌ Error loading employees:', err); showNotification({ type: 'error', title: 'Fehler', message: 'Mitarbeiter konnten nicht geladen werden: ' + err.message }); } finally { setLoading(false); } }; const handleCreateEmployee = () => { setSelectedEmployee(null); setViewMode('create'); }; const handleEditEmployee = (employee: Employee) => { setSelectedEmployee(employee); setViewMode('edit'); }; const handleManageAvailability = (employee: Employee) => { setSelectedEmployee(employee); setViewMode('availability'); }; const handleBackToList = () => { setViewMode('list'); setSelectedEmployee(null); }; const handleEmployeeCreated = () => { loadEmployees(); setViewMode('list'); showNotification({ type: 'success', title: 'Erfolg', message: 'Mitarbeiter wurde erfolgreich erstellt' }); }; const handleEmployeeUpdated = () => { loadEmployees(); setViewMode('list'); showNotification({ type: 'success', title: 'Erfolg', message: 'Mitarbeiter wurde erfolgreich aktualisiert' }); }; // Helper function to get full name const getFullName = (employee: Employee): string => { return `${employee.firstname} ${employee.lastname}`; }; // Verbesserte Lösch-Funktion mit BestĂ€tigungs-Dialog const handleDeleteEmployee = async (employee: Employee) => { try { const fullName = getFullName(employee); // BestĂ€tigungs-Dialog basierend auf Rolle let confirmMessage = `Möchten Sie den Mitarbeiter "${fullName}" (${employee.email}) wirklich PERMANENT LÖSCHEN?\n\nDie Daten des Mitarbeiters werden unwiderruflich gelöscht. Diese Aktion kann nicht rĂŒckgĂ€ngig gemacht werden.`; let confirmTitle = 'Mitarbeiter löschen'; // Check if employee has admin role (now in roles array) const isAdmin = employee.roles?.includes('admin') || false; if (isAdmin) { const adminCount = employees.filter(emp => (emp.roles?.includes('admin') || false) && emp.isActive ).length; if (adminCount <= 1) { showNotification({ type: 'error', title: 'Aktion nicht möglich', message: 'Mindestens ein Administrator muss im System verbleiben' }); return; } confirmTitle = 'Administrator löschen'; confirmMessage = `Möchten Sie den Administrator "${fullName}" (${employee.email}) wirklich PERMANENT LÖSCHEN?\n\nAchtung: Diese Aktion ist permanent und kann nicht rĂŒckgĂ€ngig gemacht werden.`; } const confirmed = await confirmDialog({ title: confirmTitle, message: confirmMessage, confirmText: 'Permanent löschen', cancelText: 'Abbrechen', type: 'warning' }); if (!confirmed) return; console.log('Starting deletion process for employee:', fullName); await employeeService.deleteEmployee(employee.id); console.log('Employee deleted, reloading list'); // Force a fresh reload of employees const updatedEmployees = await employeeService.getEmployees(); setEmployees(updatedEmployees); showNotification({ type: 'success', title: 'Erfolg', message: `Mitarbeiter "${fullName}" wurde erfolgreich gelöscht` }); } catch (err: any) { if (err.message.includes('Mindestens ein Administrator')) { showNotification({ type: 'error', title: 'Aktion nicht möglich', message: err.message }); } else { showNotification({ type: 'error', title: 'Fehler', message: 'Mitarbeiter konnte nicht gelöscht werden' }); } } }; if (loading && viewMode === 'list') { return (
⏳ Lade Mitarbeiter...
); } return (

đŸ‘„ Mitarbeiter Verwaltung

{employees.length} Mitarbeiter gefunden

{viewMode === 'list' && hasRole(['admin']) && ( )} {viewMode !== 'list' && ( )}
{/* Inhalt basierend auf View Mode */} {viewMode === 'list' && ( )} {viewMode === 'create' && ( )} {viewMode === 'edit' && selectedEmployee && ( )} {viewMode === 'availability' && selectedEmployee && ( )}
); }; export default EmployeeManagement;