'use client'; import { useState, useEffect } from 'react'; import { UsersIcon, TrashIcon, PencilSquareIcon, PlusIcon, MagnifyingGlassIcon, UserPlusIcon, KeyIcon, PhoneIcon, EnvelopeIcon, CalendarDaysIcon, IdentificationIcon, BuildingOffice2Icon } from '@heroicons/react/24/outline'; import { deleteEmployee } from '@/app/employees/actions'; import EmployeeModal from '@/components/employees/EmployeeModal'; import UserCreationModal from '@/components/employees/UserCreationModal'; interface EmployeeTableProps { initialEmployees: any[]; companies: any[]; roles: any[]; departments: any[]; sections: any[]; employmentTypes: any[]; jobTitles: any[]; } export default function EmployeeTable({ initialEmployees, companies, roles, departments, sections, employmentTypes, jobTitles }: EmployeeTableProps) { const [employees, setEmployees] = useState(initialEmployees); const [searchTerm, setSearchTerm] = useState(''); const [statusFilter, setStatusFilter] = useState('all'); const [isModalOpen, setIsModalOpen] = useState(false); const [isUserModalOpen, setIsUserModalOpen] = useState(false); const [editingEmployee, setEditingEmployee] = useState(null); useEffect(() => { setEmployees(initialEmployees); }, [initialEmployees]); const filteredEmployees = employees.filter(emp => { const fullName = `${emp.first_name || ''} ${emp.last_name || ''}`.toLowerCase(); const email = (emp.email || '').toLowerCase(); const tcNo = (emp.tc_no || '').toLowerCase(); const matchesSearch = fullName.includes(searchTerm.toLowerCase()) || email.includes(searchTerm.toLowerCase()) || tcNo.includes(searchTerm.toLowerCase()); const matchesStatus = statusFilter === 'all' || emp.status === statusFilter; return matchesSearch && matchesStatus; }); const employeesWithoutUser = employees.filter(emp => !emp.user_id && emp.email); const openEditModal = (emp: any) => { setEditingEmployee(emp); setIsModalOpen(true); }; const handleAdd = () => { setEditingEmployee(null); setIsModalOpen(true); }; const handleDelete = async (id: string) => { if (confirm('Bu personeli silmek istediğinize emin misiniz?')) { const result = await deleteEmployee(id); if (result.error) { alert(result.error); } } }; const formatDate = (dateString: string | null) => { if (!dateString) return '-'; return new Date(dateString).toLocaleDateString('tr-TR'); }; return (
{/* Header with Add Button */}

Personeller

Şirketinizdeki tüm personel kayıtlarını yönetin

{/* Filter & Search Bar */}
setSearchTerm(e.target.value)} placeholder="İsim, TC veya e-posta..." className="w-full pl-12 pr-4 py-3 bg-slate-50 dark:bg-zinc-800 border-none rounded-2xl text-sm font-medium focus:ring-2 focus:ring-[#CE0515] transition-all outline-none placeholder:text-slate-400 dark:text-white" />
{/* Table Section */}
{filteredEmployees.map((emp) => ( {/* Personel */} {/* Kurumsal */} {/* Bölüm / Görev */} {/* İletişim */} {/* Tarihler */} {/* Durum */} {/* İşlemler */} ))} {filteredEmployees.length === 0 && ( )}
Personel Kurumsal Bölüm / Görev İletişim Tarihler Durum İşlemler
{emp.photo_url ? ( ) : (
{emp.first_name?.[0]}{emp.last_name?.[0]}
)}

{emp.first_name} {emp.last_name}

{emp.tc_no || '--'}

{emp.companies?.name}

{emp.roles?.description} {emp.employment_types?.name || '-'}

{emp.departments?.name || '-'}

{emp.sections?.name ? `${emp.sections.name} / ` : ''}{emp.job_titles?.name || '-'}

{emp.email || '-'}

{emp.phone1 || '-'}

{formatDate(emp.start_date)}

{emp.leave_date && (

{formatDate(emp.leave_date)}

)}
{emp.status === 'active' ? 'Aktif' : 'Ayrılan'}
{!emp.user_id && emp.email && ( )}

Herhangi bir personel kaydı bulunamadı.

{/* Modals */} setIsModalOpen(false)} companies={companies} roles={roles} departments={departments} sections={sections} employmentTypes={employmentTypes} jobTitles={jobTitles} editingEmployee={editingEmployee} /> setIsUserModalOpen(false)} employeesWithoutUser={employeesWithoutUser} />
); }