import React, { useState } from 'react' import { FaCalendar, FaClock, FaPlus, FaFilter, FaChevronLeft, FaChevronRight, FaEdit, FaUser, } from 'react-icons/fa' import { WorkOrderStatusEnum, CalendarView, PmCalendarEvent } from '../../../types/pm' import { mockCalendarEvents } from '../../../mocks/mockMaintenanceCalendarEvent' import NewCalendarEventModal from './NewCalendarEventModal' import { getPriorityColor, getWorkOrderStatusColor, getWorkOrderStatusIcon, getWorkOrderStatusText, } from '../../../utils/erp' import { Container } from '@/components/shared' const MaintenanceCalendar: React.FC = () => { const [currentDate, setCurrentDate] = useState(new Date()) const [view, setView] = useState('month') const [showEventDetailModal, setShowEventDetailModal] = useState(false) const [showNewEventModal, setShowNewEventModal] = useState(false) const [selectedEvent, setSelectedEvent] = useState(null) const [selectedDate, setSelectedDate] = useState(null) const [statusFilter, setStatusFilter] = useState<'all' | WorkOrderStatusEnum>('all') // Mock data - replace with actual API calls const [events, setEvents] = useState(mockCalendarEvents) const getDaysInMonth = (date: Date) => { return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate() } const getFirstDayOfMonth = (date: Date) => { return new Date(date.getFullYear(), date.getMonth(), 1).getDay() } const formatDate = (date: Date) => { return date.toLocaleDateString('tr-TR', { year: 'numeric', month: 'long', }) } const getEventsForDate = (date: Date) => { return events.filter((event) => { const eventDate = new Date(event.date) return eventDate.toDateString() === date.toDateString() }) } const navigateMonth = (direction: 'prev' | 'next') => { const newDate = new Date(currentDate) if (direction === 'prev') { newDate.setMonth(newDate.getMonth() - 1) } else { newDate.setMonth(newDate.getMonth() + 1) } setCurrentDate(newDate) } const handleEventClick = (event: PmCalendarEvent) => { setSelectedEvent(event) setShowEventDetailModal(true) } const handleDayClick = (date: Date) => { setSelectedDate(date) setShowNewEventModal(true) } const handleNewEventSave = (newEvent: Partial) => { if (newEvent.id) { setEvents((prevEvents) => [...prevEvents, newEvent as PmCalendarEvent]) } setShowNewEventModal(false) setSelectedDate(null) } const renderMonthView = () => { const daysInMonth = getDaysInMonth(currentDate) const firstDay = getFirstDayOfMonth(currentDate) const days = [] // Empty cells for days before the first day of the month for (let i = 0; i < firstDay; i++) { days.push(
) } // Days of the month for (let day = 1; day <= daysInMonth; day++) { const date = new Date(currentDate.getFullYear(), currentDate.getMonth(), day) const dayEvents = getEventsForDate(date) const filteredDayEvents = dayEvents.filter( (event) => statusFilter === 'all' || event.status === statusFilter, ) const isToday = date.toDateString() === new Date().toDateString() days.push(
handleDayClick(date)} >
{day}
{filteredDayEvents.slice(0, 3).map((event) => (
{ e.stopPropagation() handleEventClick(event) }} className={`text-xs p-0.5 rounded border-l-2 cursor-pointer hover:bg-gray-50 ${getPriorityColor( event.priority, )} ${getWorkOrderStatusColor(event.status)}`} >
{event.title}
{getWorkOrderStatusIcon(event.status)} {event.startTime} {event.workCenterCode && ( ({event.workCenterCode}) )}
))} {filteredDayEvents.length > 3 && (
+{filteredDayEvents.length - 3} daha...
)}
, ) } return (
{/* Header */} {['Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt', 'Paz'].map((day) => (
{day}
))} {days}
) } const renderWeekView = () => { const startOfWeek = new Date(currentDate) startOfWeek.setDate(currentDate.getDate() - currentDate.getDay() + 1) // Start from Monday const weekDays: Date[] = [] for (let i = 0; i < 7; i++) { const date = new Date(startOfWeek) date.setDate(startOfWeek.getDate() + i) weekDays.push(date) } return (
Saat
{weekDays.map((date, index) => (
{date.toLocaleDateString('tr-TR', { weekday: 'short' })}
{date.getDate()}
))}
{Array.from({ length: 12 }, (_, hour) => hour + 8).map((hour) => (
{hour}:00
{weekDays.map((date, dayIndex) => { const dayEvents = getEventsForDate(date).filter((event) => { const eventHour = parseInt(event.startTime?.split(':')[0] || '0') return ( eventHour === hour && (statusFilter === 'all' || event.status === statusFilter) ) }) return (
{ const selectedDateTime = new Date(date) selectedDateTime.setHours(hour, 0, 0, 0) handleDayClick(selectedDateTime) }} > {dayEvents.map((event) => (
{ e.stopPropagation() handleEventClick(event) }} className={`text-xs p-1 rounded mb-1 border-l-2 cursor-pointer hover:bg-gray-50 ${getPriorityColor( event.priority, )} ${getWorkOrderStatusColor(event.status)}`} >
{event.title}
{event.startTime}-{event.endTime}
))}
) })}
))}
) } const getTodayEvents = () => { const today = new Date() return getEventsForDate(today).filter( (event) => statusFilter === 'all' || event.status === statusFilter, ) } return (
{/* Header */}

Bakım Takvimi

Bakım planları ve iş emirlerini takip edin. Yeni planlama için gün/saat seçin.

{/* Calendar Controls */}

{formatDate(currentDate)}

{(['month', 'week'] as CalendarView[]).map((viewType) => ( ))}
{/* Calendar View */}
{view === 'month' && renderMonthView()} {view === 'week' && renderWeekView()}
{/* Today's Events Sidebar */}

Bugünün Etkinlikleri

{getTodayEvents().map((event) => (
handleEventClick(event)} className={`p-2 border-l-4 rounded-r-lg cursor-pointer hover:bg-gray-50 ${getPriorityColor( event.priority, )}`} >
{event.title}

{event.workCenterCode}

{event.startTime} - {event.endTime}
{event.assignedTo && (
{event.assignedTo}
)}
{event.status === WorkOrderStatusEnum.Planned ? 'Planlandı' : event.status === WorkOrderStatusEnum.InProgress ? 'Devam Ediyor' : event.status === WorkOrderStatusEnum.Completed ? 'Tamamlandı' : 'Bekliyor'}
))} {getTodayEvents().length === 0 && (

Bugün için planlanan etkinlik yok

)}
{/* Event Details Modal */} {showEventDetailModal && selectedEvent && (

{selectedEvent.title}

{selectedEvent.workCenterCode}

{selectedEvent.date.toLocaleDateString('tr-TR')} - {selectedEvent.startTime} /{' '} {selectedEvent.endTime}

{selectedEvent.duration} dakika

{selectedEvent.assignedTo || 'Atanmadı'}

{selectedEvent.status === WorkOrderStatusEnum.Planned ? 'Planlandı' : selectedEvent.status === WorkOrderStatusEnum.InProgress ? 'Devam Ediyor' : selectedEvent.status === WorkOrderStatusEnum.Completed ? 'Tamamlandı' : 'Bekliyor'}
)} {/* New Calendar Event Modal */} { setShowNewEventModal(false) setSelectedDate(null) }} onSave={handleNewEventSave} selectedDate={selectedDate || undefined} />
) } export default MaintenanceCalendar