import { useState } from "react"; import { addDays, format, startOfMonth } from "date-fns"; import { Calendar as CalendarUI } from "@/components/ui/calendar"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Dropdown } from "@/components/ui/dropdown"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import Layout from "@/components/layout/layout"; import { CalendarClock, CalendarPlus, CalendarRange, Check, Filter, Users } from "lucide-react"; type EventType = "meeting" | "deadline" | "reminder" | "task"; type EventPriority = "low" | "medium" | "high"; interface CalendarEvent { id: string; title: string; date: Date; type: EventType; priority: EventPriority; assignees?: string[]; description?: string; } const CalendarPage = () => { const [date, setDate] = useState(new Date()); const [events, setEvents] = useState([ { id: "1", title: "Team Standup", date: new Date(), type: "meeting", priority: "medium", assignees: ["Team Alpha"], description: "Daily team standup meeting" }, { id: "2", title: "Project Deadline", date: addDays(new Date(), 7), type: "deadline", priority: "high", description: "Final delivery of the UI components" }, { id: "3", title: "Review Backlog", date: addDays(new Date(), 2), type: "task", priority: "low", description: "Go through backlog and prioritize tasks" } ]); const [showAddEvent, setShowAddEvent] = useState(false); const [newEvent, setNewEvent] = useState>({ title: "", date: new Date(), type: "meeting", priority: "medium", description: "" }); const [selectedView, setSelectedView] = useState<"month" | "week" | "day">("month"); const [filter, setFilter] = useState("all"); const handleAddEvent = () => { if (newEvent.title && newEvent.date) { const event: CalendarEvent = { id: Math.random().toString(36).substring(2, 9), title: newEvent.title, date: newEvent.date, type: newEvent.type as EventType, priority: newEvent.priority as EventPriority, description: newEvent.description }; setEvents([...events, event]); setNewEvent({ title: "", date: new Date(), type: "meeting", priority: "medium", description: "" }); setShowAddEvent(false); } }; const filteredEvents = events.filter(event => { if (filter === "all") return true; return event.type === filter; }); const getEventsForDate = (date: Date) => { return filteredEvents.filter(event => event.date.getDate() === date.getDate() && event.date.getMonth() === date.getMonth() && event.date.getFullYear() === date.getFullYear() ); }; const eventsForSelectedDate = getEventsForDate(date); const getPriorityColor = (priority: EventPriority) => { switch (priority) { case "high": return "text-red-500"; case "medium": return "text-amber-500"; case "low": return "text-green-500"; default: return ""; } }; const getEventTypeIcon = (type: EventType) => { switch (type) { case "meeting": return ; case "deadline": return ; case "reminder": return ; case "task": return ; default: return null; } }; return (
Calendar
setSelectedView(value as "month" | "week" | "day")} placeholder="View" className="w-[120px]" /> Filter Events Show events by type
setFilter(value as EventType | "all")} placeholder="Filter by type" />
Add New Event Create a new event for your calendar
setNewEvent({...newEvent, title: e.target.value})} placeholder="Event title" />
date && setNewEvent({...newEvent, date})} className="p-3 pointer-events-auto" />
setNewEvent({...newEvent, type: value as EventType})} placeholder="Select type" />
setNewEvent({...newEvent, priority: value as "low" | "medium" | "high"})} placeholder="Select priority" />
setNewEvent({...newEvent, description: e.target.value})} placeholder="Event description" />
{format(date, "MMMM yyyy")}
newDate && setDate(newDate)} className="p-3 pointer-events-auto" month={startOfMonth(date)} />
Events for {format(date, "MMMM d, yyyy")} {eventsForSelectedDate.length} {eventsForSelectedDate.length === 1 ? "event" : "events"} scheduled {eventsForSelectedDate.length > 0 ? (
{eventsForSelectedDate.map((event) => (
{getEventTypeIcon(event.type)}

{event.title}

{event.description}
{event.assignees && (
{event.assignees.join(", ")}
)}
{event.priority}
))}
) : (

No events scheduled for this day

)}
); }; export default CalendarPage;