"use client"; import { useState, useRef, useEffect } from "react"; import FullCalendar from "@fullcalendar/react"; import dayGridPlugin from "@fullcalendar/daygrid"; import timeGridPlugin from "@fullcalendar/timegrid"; import interactionPlugin from "@fullcalendar/interaction"; import frLocale from "@fullcalendar/core/locales/fr"; import { Card } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Loader2, Plus, Calendar as CalendarIcon, Check, X, User, Clock, BarChart2, Settings, ChevronRight, ChevronLeft, Bell, Users, MapPin, Tag, ChevronDown, ChevronUp } from "lucide-react"; import { Calendar, Event } from "@prisma/client"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Label } from "@/components/ui/label"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Separator } from "@/components/ui/separator"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import DatePicker, { registerLocale } from "react-datepicker"; import "react-datepicker/dist/react-datepicker.css"; import { fr } from "date-fns/locale"; import { Checkbox } from "@/components/ui/checkbox"; // Register French locale registerLocale('fr', fr); // Predefined professional color palette const colorPalette = [ "#4f46e5", // Indigo "#0891b2", // Cyan "#0e7490", // Teal "#16a34a", // Green "#65a30d", // Lime "#ca8a04", // Amber "#d97706", // Orange "#dc2626", // Red "#e11d48", // Rose "#9333ea", // Purple "#7c3aed", // Violet "#2563eb", // Blue ]; interface CalendarClientProps { initialCalendars: (Calendar & { events: Event[] })[]; userId: string; userProfile: { name: string; email: string; avatar?: string; }; } interface EventFormData { title: string; description: string | null; start: string; end: string; allDay: boolean; location: string | null; calendarId?: string; } interface CalendarDialogProps { open: boolean; onClose: () => void; onSave: (calendarData: Partial) => Promise; onDelete?: (calendarId: string) => Promise; initialData?: Partial; } function CalendarDialog({ open, onClose, onSave, onDelete, initialData }: CalendarDialogProps) { const [name, setName] = useState(initialData?.name || ""); const [color, setColor] = useState(initialData?.color || "#4f46e5"); const [description, setDescription] = useState(initialData?.description || ""); const [isSubmitting, setIsSubmitting] = useState(false); const [customColorMode, setCustomColorMode] = useState(false); const isMainCalendar = initialData?.name === "Calendrier principal"; useEffect(() => { if (open) { setName(initialData?.name || ""); setColor(initialData?.color || "#4f46e5"); setDescription(initialData?.description || ""); setCustomColorMode(!colorPalette.includes(initialData?.color || "#4f46e5")); } }, [open, initialData]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); try { await onSave({ id: initialData?.id, name, color, description }); resetForm(); } catch (error) { console.error("Erreur lors de la création du calendrier:", error); } finally { setIsSubmitting(false); } }; const handleDelete = async () => { if (!initialData?.id || !onDelete || isMainCalendar) return; if (!confirm("Êtes-vous sûr de vouloir supprimer ce calendrier ? Tous les événements associés seront également supprimés.")) { return; } setIsSubmitting(true); try { await onDelete(initialData.id); resetForm(); } catch (error) { console.error("Erreur lors de la suppression du calendrier:", error); } finally { setIsSubmitting(false); } }; const resetForm = () => { setName(""); setColor("#4f46e5"); setDescription(""); setCustomColorMode(false); onClose(); }; return ( !open && onClose()}> {initialData?.id ? "Modifier le calendrier" : "Créer un nouveau calendrier"}
setName(e.target.value)} placeholder="Nom du calendrier" required disabled={isMainCalendar} className="rounded-lg border-gray-300 focus:border-indigo-500 focus:ring-indigo-500" />
{colorPalette.map((paletteColor) => ( ))}
{customColorMode && (
setColor(e.target.value)} className="w-10 h-10 p-1 cursor-pointer rounded border-gray-300" /> setColor(e.target.value)} placeholder="#RRGGBB" className="w-28 rounded-lg" />
)}