import React, { useState } from 'react' import { Link } from 'react-router-dom' import { useQuery } from '@tanstack/react-query' import { FaUsers, FaPlus, FaSearch, FaFilter, FaDownload, FaEdit, FaEye, FaPhone, FaEnvelope, FaCalendar, FaBuilding, FaAward, FaExclamationTriangle, FaList, FaTh, FaBriefcase, } from 'react-icons/fa' import classNames from 'classnames' import { EmployeeStatusEnum, HrEmployee } from '../../../types/hr' import dayjs from 'dayjs' import { mockEmployees } from '../../../mocks/mockEmployees' import EmployeeView from './EmployeeView' import Widget from '../../../components/common/Widget' import { getEmploymentTypeColor, getEmploymentTypeText, getEmployeeStatusColor, getEmployeeStatusIcon, getEmployeeStatusText, } from '../../../utils/erp' import { Container } from '@/components/shared' const EmployeeList: React.FC = () => { const [searchTerm, setSearchTerm] = useState('') const [filterStatus, setFilterStatus] = useState('all') const [filterDepartment, setFilterDepartment] = useState('all') const [showFilters, setShowFilters] = useState(false) const [viewMode, setViewMode] = useState<'list' | 'cards'>('list') // Modal states const [isViewModalOpen, setIsViewModalOpen] = useState(false) const [selectedEmployee, setSelectedEmployee] = useState(null) const { data: employees, isLoading, error, } = useQuery({ queryKey: ['employees', searchTerm, filterStatus, filterDepartment], queryFn: async () => { await new Promise((resolve) => setTimeout(resolve, 500)) return mockEmployees.filter((employee) => { const matchesSearch = employee.code.toLowerCase().includes(searchTerm.toLowerCase()) || employee.fullName.toLowerCase().includes(searchTerm.toLowerCase()) || employee.email.toLowerCase().includes(searchTerm.toLowerCase()) const matchesStatus = filterStatus === 'all' || employee.employeeStatus === filterStatus const matchesDepartment = filterDepartment === 'all' || employee.department?.code === filterDepartment return matchesSearch && matchesStatus && matchesDepartment }) }, }) // Modal handlers const handleViewEmployee = (employee: HrEmployee) => { setSelectedEmployee(employee) setIsViewModalOpen(true) } const handleCloseViewModal = () => { setIsViewModalOpen(false) setSelectedEmployee(null) } const handleEditFromView = (employee: HrEmployee) => { setIsViewModalOpen(false) // Navigate to edit page - you can replace this with a modal if preferred window.location.href = `/admin/hr/employees/edit/${employee.id}` } if (isLoading) { return (
Personel listesi yükleniyor...
) } if (error) { return (
Personel listesi yüklenirken hata oluştu.
) } return (
{/* Header */}
{/* Title & Description */}

Personel Listesi

Şirket çalışanlarının listesi

{/* Header Actions */}
{/* View Mode Toggle */}
{/* Search Box */}
setSearchTerm(e.target.value)} className="pl-10 pr-4 py-1 text-sm w-full sm:w-64 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* Filter Button */} {/* Export Button */} {/* Add New Employee */} Yeni Personel
{/* Filters Panel */} {showFilters && (
)} {/* Statistics Cards */}
e.employeeStatus === EmployeeStatusEnum.Active).length || 0 } color="green" icon="FaCheckCircle" /> e.employeeStatus === EmployeeStatusEnum.OnLeave).length || 0 } color="yellow" icon="FaCalendar" /> dayjs(e.hireDate).isAfter(dayjs().subtract(30, 'day'))) .length || 0 } color="purple" icon="FaArrowUp" />
{/* Employees Display */} {viewMode === 'list' ? (

Personel Listesi

{employees?.map((employee) => ( ))}
Personel Bilgileri İletişim Pozisyon / Departman İstihdam Bilgileri Maaş Durum İşlemler
{employee.code}
{employee.fullName}
{employee.badgeNumber && (
Rozet: {employee.badgeNumber}
)}
{employee.email}
{employee.phone && (
{employee.phone}
)}
{employee.jobPosition?.name}
{employee.department?.name}
{employee.workLocation}
{getEmploymentTypeText(employee.employmentType)}
{dayjs(employee.hireDate).format('DD.MM.YYYY')}
{dayjs().diff(employee.hireDate, 'year')} yıl deneyim
₺{employee.baseSalary.toLocaleString()}
{employee.payrollGroup}
{getEmployeeStatusIcon(employee.employeeStatus)} {getEmployeeStatusText(employee.employeeStatus)}
{(!employees || employees.length === 0) && (

Personel bulunamadı

Yeni personel ekleyerek başlayın.

Yeni Personel Ekle
)}
) : (
{employees?.map((employee) => (
{/* Card Header */}
{employee.firstName.charAt(0)} {employee.lastName.charAt(0)}

{employee.fullName}

{employee.code}

{getEmployeeStatusIcon(employee.employeeStatus)} {getEmployeeStatusText(employee.employeeStatus)}
{/* Card Content */}
{employee.jobPosition?.name || 'Pozisyon belirtilmemiş'}
{employee.department?.name || 'Departman belirtilmemiş'}
{employee.email}
{employee.phone && (
{employee.phone}
)}
İşe Başlama: {dayjs(employee.hireDate).format('DD.MM.YYYY')}
İstihdam Türü: {employee.employmentType}
{/* Card Actions */}
))}
)} {(!employees || employees.length === 0) && (

Personel bulunamadı

Yeni personel ekleyerek başlayın.

Yeni Personel Ekle
)}
{/* Employee View Modal */}
) } export default EmployeeList