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' import { Container } from '@/components/shared' 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('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