'use client'; import { useState, useEffect, useRef } from 'react'; import { XMarkIcon, PhotoIcon } from '@heroicons/react/24/outline'; import { addEmployee, updateEmployee } from '@/app/employees/actions'; interface EmployeeModalProps { isOpen: boolean; onClose: () => void; companies: any[]; roles: any[]; departments: any[]; sections: any[]; employmentTypes: any[]; jobTitles: any[]; editingEmployee?: any; } export default function EmployeeModal({ isOpen, onClose, companies, roles, departments, sections, employmentTypes, jobTitles, editingEmployee }: EmployeeModalProps) { const [error, setError] = useState(null); const [loading, setLoading] = useState(false); const [activeTab, setActiveTab] = useState('personal'); const [selectedDept, setSelectedDept] = useState(editingEmployee?.department_id || ''); const [previewUrl, setPreviewUrl] = useState(editingEmployee?.photo_url || null); const fileInputRef = useRef(null); useEffect(() => { if (editingEmployee) { setSelectedDept(editingEmployee.department_id || ''); setPreviewUrl(editingEmployee.photo_url || null); } else { setSelectedDept(''); setPreviewUrl(null); } setActiveTab('personal'); }, [editingEmployee, isOpen]); if (!isOpen) return null; const filteredSections = sections.filter(s => s.department_id === selectedDept); const handlePhotoChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { const url = URL.createObjectURL(file); setPreviewUrl(url); } }; async function handleSubmit(formData: FormData) { setLoading(true); setError(null); try { let result; if (editingEmployee) { result = await updateEmployee(editingEmployee.id, formData); } else { result = await addEmployee(formData); } if (result.error) { setError(result.error); } else { onClose(); } } catch (err) { setError('Bir hata oluştu, lütfen tekrar deneyin.'); } finally { setLoading(false); } } const inputClass = "w-full rounded-2xl border-0 py-3 px-4 text-slate-900 dark:text-white bg-slate-50 dark:bg-zinc-800 ring-1 ring-inset ring-slate-200 dark:ring-zinc-700 focus:ring-2 focus:ring-[#173363] outline-none transition-all placeholder:text-slate-400 text-sm"; const labelClass = "block text-[10px] font-black uppercase tracking-widest text-slate-400 mb-1.5 ml-1"; return (
{/* Header */}

{editingEmployee ? 'Personel Düzenle' : 'Yeni Personel Ekle'}

Personel bilgilerini detaylı olarak yönetin.

{/* Tabs */}
{[ { id: 'personal', label: 'KİŞİSEL' }, { id: 'employment', label: 'ÇALIŞMA' }, { id: 'contact', label: 'İLETİŞİM' } ].map(tab => ( ))}
{/* Body */}
{error && (
{error}
)}
{/* Photo Upload */}
fileInputRef.current?.click()} className="w-40 h-40 rounded-[2.5rem] bg-slate-50 border-2 border-dashed border-slate-200 flex flex-col items-center justify-center cursor-pointer hover:border-[#173363] hover:bg-slate-100 transition-all overflow-hidden group" > {previewUrl ? ( Preview ) : ( <> FOTOĞRAF YÜKLE )}