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, } from "../../../utils/erp"; 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;