"use client"; import { useState } from "react"; import { ChevronLeft, ChevronRight, Calendar as CalendarIcon, Clock, MapPin } from "lucide-react"; // --- Tipe Data Mock --- type Booking = { id: number; room: string; date: string; // Format YYYY-MM-DD startTime: string; endTime: string; purpose: string; status: "Approved" | "Pending"; }; // --- Data Dummy (Mock Data) --- const mockBookings: Booking[] = [ { id: 1, room: "Ruang T-301", date: "2026-02-05", startTime: "07:30", endTime: "10:00", purpose: "Kuliah Sistem Kendali", status: "Approved", }, { id: 2, room: "Lab IoT", date: "2026-02-05", // Tanggal sama dengan atas startTime: "13:00", endTime: "15:00", purpose: "Praktikum Embedded System", status: "Approved", }, { id: 3, room: "Ruang T-302", date: "2026-02-12", startTime: "09:00", endTime: "11:30", purpose: "Seminar Proposal", status: "Pending", }, { id: 4, room: "Lab Kendali", date: "2026-02-20", startTime: "10:00", endTime: "12:00", purpose: "Riset Skripsi", status: "Approved", }, ]; export default function CalendarPage() { const [currentDate, setCurrentDate] = useState(new Date(2026, 1)); // Februari 2026 const [selectedDate, setSelectedDate] = useState(null); // --- Helper Functions --- const getDaysInMonth = (year: number, month: number) => new Date(year, month + 1, 0).getDate(); const getFirstDayOfMonth = (year: number, month: number) => new Date(year, month, 1).getDay(); const handlePrevMonth = () => { setCurrentDate(new Date(currentDate.getFullYear(), currentDate.getMonth() - 1)); setSelectedDate(null); }; const handleNextMonth = () => { setCurrentDate(new Date(currentDate.getFullYear(), currentDate.getMonth() + 1)); setSelectedDate(null); }; const handleDateClick = (day: number) => { const year = currentDate.getFullYear(); const month = String(currentDate.getMonth() + 1).padStart(2, "0"); const dateStr = String(day).padStart(2, "0"); const fullDate = `${year}-${month}-${dateStr}`; // Toggle seleksi: Jika diklik lagi, tutup detailnya if (selectedDate === fullDate) { setSelectedDate(null); } else { setSelectedDate(fullDate); } }; // --- Generate Calendar Grid --- const year = currentDate.getFullYear(); const month = currentDate.getMonth(); const daysInMonth = getDaysInMonth(year, month); const firstDay = getFirstDayOfMonth(year, month); // Array kosong untuk padding hari sebelum tanggal 1 const emptyDays = Array.from({ length: firstDay }, (_, i) => i); // Array tanggal 1 sampai akhir bulan const days = Array.from({ length: daysInMonth }, (_, i) => i + 1); // Nama Bulan const monthNames = [ "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember" ]; // Filter booking untuk tanggal yang dipilih const selectedBookings = mockBookings.filter((b) => b.date === selectedDate); return (
{/* --- KIRI: KALENDER --- */}
{/* Header Kalender */}

{monthNames[month]} {year}

Pilih tanggal untuk melihat detail.

{/* Grid Kalender */}
{/* Nama Hari */}
{["Min", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"].map((d) => ( {d} ))}
{/* Tanggal */}
{/* Render Empty Cells */} {emptyDays.map((_, i) => (
))} {/* Render Date Cells */} {days.map((day) => { // Format tanggal hari ini untuk pengecekan data const currentDayStr = `${year}-${String(month + 1).padStart(2, "0")}-${String(day).padStart(2, "0")}`; const hasBooking = mockBookings.some((b) => b.date === currentDayStr); const isSelected = selectedDate === currentDayStr; return (
handleDateClick(day)} className={`relative flex h-24 sm:h-32 cursor-pointer flex-col justify-between rounded border p-2 transition hover:bg-gray-50 dark:hover:bg-meta-4 ${isSelected ? "border-yellow-500 bg-yellow-50 dark:bg-slate-800" : "border-stroke border-gray-200 bg-white dark:bg-boxdark" }`} > {day} {/* Indikator Booking (Dot / Bar) */} {hasBooking && (
{mockBookings .filter(b => b.date === currentDayStr) .slice(0, 2) // Batasi tampilan max 2 baris di grid .map((b, idx) => (
{b.startTime} - {b.room}
))} {mockBookings.filter(b => b.date === currentDayStr).length > 2 && ( + Lainnya )}
)}
); })}
{/* --- KANAN: DETAIL SIDEBAR --- */} {selectedDate && (

Jadwal {selectedDate}

{selectedBookings.length > 0 ? (
{selectedBookings.map((booking) => (
{booking.status}

{booking.purpose}

{booking.room}
{booking.startTime} - {booking.endTime}
))}
) : (

Tidak ada jadwal pada tanggal ini.

)}
)}
); }