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 EmployeeViewModal from "./EmployeeViewModal"; import Widget from "../../../components/common/Widget"; import { getEmploymentTypeColor, getEmploymentTypeText, getEmployeeStatusColor, getEmployeeStatusIcon, getEmployeeStatusText, } from "../../../utils/erp"; 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;