erp-platform/ui/src/views/hr/components/DepartmentViewModal.tsx

273 lines
10 KiB
TypeScript
Raw Normal View History

2025-09-15 09:31:47 +00:00
import React from "react";
import {
FaTimes,
FaBuilding,
FaUser,
FaDollarSign,
FaUsers,
FaCalendar,
FaEdit,
} from "react-icons/fa";
import { HrDepartment } from "../../../types/hr";
import { mockEmployees } from "../../../mocks/mockEmployees";
interface DepartmentViewModalProps {
isOpen: boolean;
onClose: () => void;
department: HrDepartment | null;
onEdit?: (department: HrDepartment) => void;
}
const DepartmentViewModal: React.FC<DepartmentViewModalProps> = ({
isOpen,
onClose,
department,
onEdit,
}) => {
const employeeCount = mockEmployees.filter(
(emp) => emp.departmantId === department?.id
).length;
const departmentEmployees = mockEmployees.filter(
(emp) => emp.departmantId === department?.id
);
return (
isOpen &&
department && (
<div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50">
<div className="bg-white rounded-lg p-4 w-full max-w-2xl max-h-[90vh] overflow-y-auto">
<div className="flex items-center justify-between mb-3">
<h2 className="text-base font-bold text-gray-900">
Departman Detayları
</h2>
<div className="flex items-center gap-2">
{onEdit && (
<button
onClick={() => onEdit(department)}
className="flex items-center gap-1 px-2 py-1 text-xs text-blue-600 bg-blue-50 rounded-md hover:bg-blue-100 transition-colors"
>
<FaEdit className="w-4 h-4" />
Düzenle
</button>
)}
<button
onClick={onClose}
className="p-2 text-gray-400 hover:text-gray-600"
>
<FaTimes className="w-5 h-5" />
</button>
</div>
</div>
<div className="space-y-3">
{/* Temel Bilgiler */}
<div className="bg-gray-50 rounded-lg p-3">
<h3 className="text-base font-semibold text-gray-900 mb-3 flex items-center gap-2">
<FaBuilding className="w-5 h-5" />
Temel Bilgiler
</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
<div>
<label className="block text-xs font-medium text-gray-600">
Departman Kodu
</label>
<p className="text-sm font-semibold text-gray-900">
{department.code}
</p>
</div>
<div>
<label className="block text-xs font-medium text-gray-600">
Departman Adı
</label>
<p className="text-sm font-semibold text-gray-900">
{department.name}
</p>
</div>
{department.description && (
<div className="md:col-span-2">
<label className="block text-xs font-medium text-gray-600">
ıklama
</label>
<p className="text-sm text-gray-900 mt-1">
{department.description}
</p>
</div>
)}
<div>
<label className="block text-xs font-medium text-gray-600">
Durum
</label>
<span
className={`inline-flex px-2 py-1 text-xs font-medium rounded-full ${
department.isActive
? "bg-green-100 text-green-800"
: "bg-red-100 text-red-800"
}`}
>
{department.isActive ? "Aktif" : "Pasif"}
</span>
</div>
</div>
</div>
{/* Hiyerarşi ve İlişkiler */}
<div className="bg-blue-50 rounded-lg p-3">
<h3 className="text-base font-semibold text-gray-900 mb-3 flex items-center gap-2">
<FaUser className="w-5 h-5" />
Hiyerarşi ve İlişkiler
</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-3 text-sm">
<div>
<label className="block text-xs font-medium text-gray-600">
Üst Departman
</label>
<p className="text-gray-900 mt-1">
{department.parentDepartment?.name || "Ana Departman"}
</p>
</div>
<div>
<label className="block text-xs font-medium text-gray-600">
Departman Yöneticisi
</label>
<p className="text-gray-900 mt-1">
{department.manager?.fullName || "Atanmamış"}
</p>
{department.manager && (
<p className="text-sm text-gray-500">
{department.manager.code}
</p>
)}
</div>
<div>
<label className="block text-xs font-medium text-gray-600">
Maliyet Merkezi
</label>
<p className="text-gray-900 mt-1">
{department.costCenter?.name || "Atanmamış"}
</p>
{department.costCenter && (
<p className="text-sm text-gray-500">
{department.costCenter.code}
</p>
)}
</div>
</div>
</div>
{/* Finansal Bilgiler */}
<div className="bg-green-50 rounded-lg p-3">
<h3 className="text-base font-semibold text-gray-900 mb-3 flex items-center gap-2">
<FaDollarSign className="w-5 h-5" />
Finansal Bilgiler
</h3>
<div className="grid grid-cols-1 md:grid-cols-3 gap-3">
<div>
<label className="block text-xs font-medium text-gray-600">
Departman Bütçesi
</label>
<p className="text-sm font-semibold text-gray-900">
{department.budget
? `${department.budget.toLocaleString()}`
: "Belirtilmemiş"}
</p>
</div>
</div>
</div>
{/* Personel Bilgileri */}
<div className="bg-purple-50 rounded-lg p-3">
<h3 className="text-base font-semibold text-gray-900 mb-3 flex items-center gap-2">
<FaUsers className="w-5 h-5" />
Personel Bilgileri
</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
<div>
<label className="block text-xs font-medium text-gray-600">
Toplam Personel Sayısı
</label>
<p className="text-lg font-bold text-gray-900">
{employeeCount}
</p>
</div>
</div>
{departmentEmployees.length > 0 && (
<div className="mt-3">
<label className="block text-sm font-medium text-gray-600 mb-2">
Departman Personeli
</label>
<div className="max-h-32 overflow-y-auto">
<div className="space-y-1">
{departmentEmployees.map((employee) => (
<div
key={employee.id}
className="flex items-center justify-between p-1.5 bg-white rounded border"
>
<div>
<p className="font-medium text-gray-900">
{employee.fullName}
</p>
<p className="text-sm text-gray-500">
{employee.code}
</p>
</div>
<div className="text-sm text-gray-600">
{employee.jobPosition?.name ||
"Pozisyon belirtilmemiş"}
</div>
</div>
))}
</div>
</div>
</div>
)}
</div>
{/* Sistem Bilgileri */}
<div className="bg-gray-50 rounded-lg p-3">
<h3 className="text-base font-semibold text-gray-900 mb-3 flex items-center gap-2">
<FaCalendar className="w-5 h-5" />
Sistem Bilgileri
</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-3 text-sm">
<div>
<label className="block text-xs font-medium text-gray-600">
Oluşturulma Tarihi
</label>
<p className="text-gray-900">
{new Date(department.creationTime).toLocaleDateString(
"tr-TR"
)}
</p>
</div>
<div>
<label className="block text-xs font-medium text-gray-600">
Son Güncelleme
</label>
<p className="text-gray-900">
{new Date(
department.lastModificationTime
).toLocaleDateString("tr-TR")}
</p>
</div>
</div>
</div>
</div>
{/* Close Button */}
<div className="flex justify-end pt-3 border-t mt-3">
<button
onClick={onClose}
className="px-3 py-1 text-sm text-gray-700 bg-gray-200 rounded-md hover:bg-gray-300 transition-colors"
>
Kapat
</button>
</div>
</div>
</div>
)
);
};
export default DepartmentViewModal;