// frontend/src/pages/Employees/components/EmployeeForm.tsx import React, { useState, useEffect } from 'react'; import { Employee, CreateEmployeeRequest, UpdateEmployeeRequest } from '../../../types/employee'; import { employeeService } from '../../../services/employeeService'; import { useAuth } from '../../../contexts/AuthContext'; interface EmployeeFormProps { mode: 'create' | 'edit'; employee?: Employee; onSuccess: () => void; onCancel: () => void; } // Rollen Definition const ROLE_OPTIONS = [ { value: 'user', label: 'Mitarbeiter', description: 'Kann eigene Schichten einsehen' }, { value: 'instandhalter', label: 'Instandhalter', description: 'Kann Schichtpläne erstellen und Mitarbeiter verwalten' }, { value: 'admin', label: 'Administrator', description: 'Voller Zugriff auf alle Funktionen' } ] as const; const EmployeeForm: React.FC = ({ mode, employee, onSuccess, onCancel }) => { const [formData, setFormData] = useState({ name: '', email: '', password: '', role: 'user' as 'admin' | 'instandhalter' | 'user', phone: '', department: '', isActive: true }); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const { hasRole } = useAuth(); useEffect(() => { if (mode === 'edit' && employee) { setFormData({ name: employee.name, email: employee.email, password: '', // Passwort wird beim Editieren nicht angezeigt role: employee.role, phone: employee.phone || '', department: employee.department || '', isActive: employee.isActive }); } }, [mode, employee]); const handleChange = (e: React.ChangeEvent) => { const { name, value, type } = e.target; setFormData(prev => ({ ...prev, [name]: type === 'checkbox' ? (e.target as HTMLInputElement).checked : value })); }; // NEU: Checkbox für Rollen const handleRoleChange = (roleValue: 'admin' | 'instandhalter' | 'user') => { setFormData(prev => ({ ...prev, role: roleValue })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); setError(''); try { if (mode === 'create') { const createData: CreateEmployeeRequest = { name: formData.name, email: formData.email, password: formData.password, role: formData.role, phone: formData.phone || undefined, department: formData.department || undefined }; await employeeService.createEmployee(createData); } else if (employee) { const updateData: UpdateEmployeeRequest = { name: formData.name, role: formData.role, isActive: formData.isActive, phone: formData.phone || undefined, department: formData.department || undefined }; await employeeService.updateEmployee(employee.id, updateData); } onSuccess(); } catch (err: any) { setError(err.message || `Fehler beim ${mode === 'create' ? 'Erstellen' : 'Aktualisieren'} des Mitarbeiters`); } finally { setLoading(false); } }; const isFormValid = () => { if (mode === 'create') { return formData.name.trim() && formData.email.trim() && formData.password.length >= 6; } return formData.name.trim() && formData.email.trim(); }; // Bestimme welche Rollen der aktuelle Benutzer vergeben darf const getAvailableRoles = () => { if (hasRole(['admin'])) { return ROLE_OPTIONS; // Admins können alle Rollen vergeben } if (hasRole(['instandhalter'])) { return ROLE_OPTIONS.filter(role => role.value !== 'admin'); // Instandhalter können keine Admins erstellen } return ROLE_OPTIONS.filter(role => role.value === 'user'); // Normale User können gar nichts (sollte nicht vorkommen) }; const availableRoles = getAvailableRoles(); return (

{mode === 'create' ? '👤 Neuen Mitarbeiter erstellen' : '✏️ Mitarbeiter bearbeiten'}

{error && (
Fehler: {error}
)}
{/* Name */}
{/* E-Mail */}
{/* Passwort (nur bei Erstellung) */} {mode === 'create' && (
Das Passwort muss mindestens 6 Zeichen lang sein.
)} {/* Telefon */}
{/* Abteilung */}
{/* NEU: Rollen als Checkboxes */}
{availableRoles.map(role => (
handleRoleChange(role.value)} > handleRoleChange(role.value)} style={{ marginRight: '12px', marginTop: '2px', width: '18px', height: '18px' }} />
{role.label}
{role.description}
{/* Role Badge */}
{role.value.toUpperCase()}
))}
{/* Info über Berechtigungen */}
Info: { formData.role === 'admin' ? 'Administratoren haben vollen Zugriff auf alle Funktionen.' : formData.role === 'instandhalter' ? 'Instandhalter können Schichtpläne erstellen und Mitarbeiter verwalten.' : 'Mitarbeiter können ihre eigenen Schichten und Verfügbarkeiten einsehen.' }
{/* Aktiv Status (nur beim Bearbeiten) */} {mode === 'edit' && (
Inaktive Mitarbeiter können sich nicht anmelden und werden nicht für Schichten eingeplant.
)}
{/* Buttons */}
); }; export default EmployeeForm;