import React, { useState } from "react"; import { FaPlus, FaSearch, FaFilter, FaExclamationTriangle, FaClock, FaUser, FaMapMarkerAlt, FaEdit, FaTrash, FaEye, FaFileAlt, FaCamera, FaPhone, } from "react-icons/fa"; import { NotificationStatusEnum, PmFaultNotification, PmWorkCenter, } from "../../../types/pm"; import { mockFaultNotifications } from "../../../mocks/mockFaultNotifications"; import NewFaultNotificationModal from "./NewFaultNotificationModal"; import ViewFaultNotificationModal from "./ViewFaultNotificationModal"; import EditFaultNotificationModal from "./EditFaultNotificationModal"; import CreateWorkOrderFromNotificationModal from "./CreateWorkOrderFromNotificationModal"; import AssignNotificationModal from "./AssignNotificationModal"; import ChangeNotificationStatusModal from "./ChangeNotificationStatusModal"; import Widget from "../../../components/common/Widget"; import { PriorityEnum } from "../../../types/common"; import { getFaultTypeColor, getFaultTypeText, getPriorityColor, getPriorityText, getCriticalityLevelColor, getNotificationStatusColor, getNotificationStatusIcon, getNotificationStatusText, } from "../../../utils/erp"; interface AssignmentData { notificationIds: string[]; assignedTo?: string; teamId?: string; } interface StatusChangeData { notificationIds: string[]; status: NotificationStatusEnum; } const FaultNotifications: React.FC = () => { const [searchTerm, setSearchTerm] = useState(""); const [statusFilter, setStatusFilter] = useState< NotificationStatusEnum | "all" >("all"); const [priorityFilter, setPriorityFilter] = useState( "all" ); const [showModal, setShowModal] = useState(false); const [editingNotification, setEditingNotification] = useState(null); const [viewingNotification, setViewingNotification] = useState(null); const [selectedNotifications, setSelectedNotifications] = useState( [] ); const [showCreateWorkOrderModal, setShowCreateWorkOrderModal] = useState(false); const [showAssignModal, setShowAssignModal] = useState(false); const [showStatusChangeModal, setShowStatusChangeModal] = useState(false); // Mock data - replace with actual API calls const [notifications, setNotifications] = useState( mockFaultNotifications ); const filteredNotifications = notifications.filter((notification) => { const matchesSearch = notification.notificationCode .toLowerCase() .includes(searchTerm.toLowerCase()) || notification.title.toLowerCase().includes(searchTerm.toLowerCase()) || notification.workCenter.code .toLowerCase() .includes(searchTerm.toLowerCase()) || notification.reportedBy.toLowerCase().includes(searchTerm.toLowerCase()); const matchesStatus = statusFilter === "all" || notification.status === statusFilter; const matchesPriority = priorityFilter === "all" || notification.priority === priorityFilter; return matchesSearch && matchesStatus && matchesPriority; }); const getTimeAgo = (date: Date) => { const now = new Date(); const diffInMs = now.getTime() - date.getTime(); const diffInHours = Math.floor(diffInMs / (1000 * 60 * 60)); const diffInDays = Math.floor(diffInMs / (1000 * 60 * 60 * 24)); if (diffInHours < 1) { const diffInMinutes = Math.floor(diffInMs / (1000 * 60)); return `${diffInMinutes} dakika önce`; } else if (diffInHours < 24) { return `${diffInHours} saat önce`; } else { return `${diffInDays} gün önce`; } }; const handleAddNotification = () => { setEditingNotification(null); setShowModal(true); }; const handleEdit = (notification: PmFaultNotification) => { setEditingNotification(notification); setShowModal(true); }; const handleView = (notification: PmFaultNotification) => { setViewingNotification(notification); }; const handleSelectNotification = (notificationId: string) => { setSelectedNotifications((prev) => prev.includes(notificationId) ? prev.filter((id) => id !== notificationId) : [...prev, notificationId] ); }; const handleSaveNotification = ( notificationData: Partial ) => { if (editingNotification) { // Update existing notification setNotifications((prev) => prev.map((n) => n.id === editingNotification.id ? { ...n, ...notificationData } : n ) ); } else { // Add new notification setNotifications((prev) => [ ...prev, notificationData as PmFaultNotification, ]); } }; const handleCreateWorkOrder = () => { setShowCreateWorkOrderModal(true); }; const handleAssignNotifications = () => { setShowAssignModal(true); }; const handleChangeStatus = () => { setShowStatusChangeModal(true); }; const handleWorkOrderSave = (workOrderData: PmWorkCenter) => { console.log("İş emri oluşturuldu:", workOrderData); // Here you would typically save to backend setSelectedNotifications([]); }; const handleAssignmentSave = (assignmentData: AssignmentData) => { console.log("Atama yapıldı:", assignmentData); // Here you would typically save to backend // Update notifications with assignment setNotifications((prev) => prev.map((n) => assignmentData.notificationIds.includes(n.id) ? { ...n, assignedTo: assignmentData.assignedTo, status: NotificationStatusEnum.Assigned, } : n ) ); setSelectedNotifications([]); }; const handleStatusChangeSave = (statusChangeData: StatusChangeData) => { console.log("Durum değiştirildi:", statusChangeData); // Here you would typically save to backend // Update notifications with new status setNotifications((prev) => prev.map((n) => statusChangeData.notificationIds.includes(n.id) ? { ...n, status: statusChangeData.status, lastModificationTime: new Date(), } : n ) ); setSelectedNotifications([]); }; return (
{/* Header */}

Arıza Bildirimleri

İş merkezi arızalarını takip edin ve yönetin

{/* Summary Cards */}
n.status === NotificationStatusEnum.Open ).length } color="red" icon="FaExclamationTriangle" /> n.status === NotificationStatusEnum.InProgress ).length } color="orange" icon="FaClock" /> n.status === NotificationStatusEnum.Resolved ).length } color="green" icon="FaCheckCircle" /> n.priority === PriorityEnum.Urgent) .length } color="red" icon="FaTimesCircle" />
{/* Filters */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-1.5 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" />
{/* Notifications List */}
{filteredNotifications.map((notification) => (
handleSelectNotification(notification.id)} className="mt-1 rounded border-gray-300 text-blue-600 focus:ring-blue-500" />

{notification.notificationCode}

{getNotificationStatusIcon(notification.status)} {getNotificationStatusText(notification.status)} {getPriorityText(notification.priority)} {getFaultTypeText(notification.faultType)}

{notification.title}

{notification.description.length > 150 ? `${notification.description.substring(0, 150)}...` : notification.description}

İş Merkezi:

{notification.workCenter.code}

{notification.workCenter.name}

Konum:

{notification.location}

Bildiren:

{notification.reportedBy}

Süre:

{notification.estimatedRepairTime ? `~${notification.estimatedRepairTime} dk` : "-"}

{notification.assignedTo && (
Atanan: {notification.assignedTo}
)} {notification.images && notification.images.length > 0 && (
{notification.images.length} fotoğraf
)} {notification.resolutionNotes && (
Çözüm Notları:

{notification.resolutionNotes}

)}
Bildirilme: {getTimeAgo(notification.reportedAt)}
{notification.workOrderId && (
İş Emri: {notification.workOrderId}
)} {notification.followUpRequired && (
Takip Gerekli
)}
))}
{filteredNotifications.length === 0 && (

Bildirim bulunamadı

Arama kriterlerinizi değiştirin veya yeni bir bildirim oluşturun.

)} {/* Bulk Actions */} {selectedNotifications.length > 0 && (
{selectedNotifications.length} bildirim seçildi
)} {/* Modals */} {showModal && !editingNotification && ( setShowModal(false)} onSave={handleSaveNotification} /> )} {editingNotification && ( { setShowModal(false); setEditingNotification(null); }} onSave={handleSaveNotification} notification={editingNotification} /> )} {viewingNotification && ( setViewingNotification(null)} onEdit={(notification) => { setViewingNotification(null); setEditingNotification(notification); setShowModal(true); }} notification={viewingNotification} /> )} {showCreateWorkOrderModal && selectedNotifications.length > 0 && ( setShowCreateWorkOrderModal(false)} onSave={handleWorkOrderSave} notifications={notifications.filter((n) => selectedNotifications.includes(n.id) )} /> )} {showAssignModal && selectedNotifications.length > 0 && ( setShowAssignModal(false)} onSave={handleAssignmentSave} notifications={notifications.filter((n) => selectedNotifications.includes(n.id) )} /> )} {showStatusChangeModal && selectedNotifications.length > 0 && ( setShowStatusChangeModal(false)} onSave={handleStatusChangeSave} notifications={notifications.filter((n) => selectedNotifications.includes(n.id) )} /> )}
); }; export default FaultNotifications;