sa2kit 1.6.78 → 1.6.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/llm/electron/index.js +2 -2
- package/dist/ai/llm/electron/index.js.map +1 -1
- package/dist/ai/llm/electron/index.mjs +2 -2
- package/dist/ai/llm/electron/index.mjs.map +1 -1
- package/dist/ai/llm/ui/electron/index.js +2 -2
- package/dist/ai/llm/ui/electron/index.js.map +1 -1
- package/dist/ai/llm/ui/electron/index.mjs +2 -2
- package/dist/ai/llm/ui/electron/index.mjs.map +1 -1
- package/dist/ai/llm/ui/web/index.js +2 -2
- package/dist/ai/llm/ui/web/index.js.map +1 -1
- package/dist/ai/llm/ui/web/index.mjs +2 -2
- package/dist/ai/llm/ui/web/index.mjs.map +1 -1
- package/dist/ai/llm/web/index.js +2 -2
- package/dist/ai/llm/web/index.js.map +1 -1
- package/dist/ai/llm/web/index.mjs +2 -2
- package/dist/ai/llm/web/index.mjs.map +1 -1
- package/dist/ar/index.d.mts +2 -2
- package/dist/ar/index.d.ts +2 -2
- package/dist/ar/index.js +43 -4
- package/dist/ar/index.js.map +1 -1
- package/dist/ar/index.mjs +43 -4
- package/dist/ar/index.mjs.map +1 -1
- package/dist/{booking-BX_0AXU6.d.mts → booking-473Db8Bo.d.mts} +6 -0
- package/dist/{booking-BX_0AXU6.d.ts → booking-473Db8Bo.d.ts} +6 -0
- package/dist/{bookingAdminService-ChzuoCUx.d.ts → bookingAdminService-DqQ7hEGw.d.ts} +1 -1
- package/dist/{bookingAdminService-B_D_Jq1W.d.mts → bookingAdminService-SBX4JA_U.d.mts} +1 -1
- package/dist/calendar/index.js +8 -4
- package/dist/calendar/index.js.map +1 -1
- package/dist/calendar/index.mjs +8 -4
- package/dist/calendar/index.mjs.map +1 -1
- package/dist/calendar/web/index.js +8 -4
- package/dist/calendar/web/index.js.map +1 -1
- package/dist/calendar/web/index.mjs +8 -4
- package/dist/calendar/web/index.mjs.map +1 -1
- package/dist/{client-B6JtOkEq.d.ts → client-Bkn6mRI7.d.ts} +1 -1
- package/dist/{client-DkSveTk-.d.mts → client-exYn2Qla.d.mts} +1 -1
- package/dist/components/index.d.mts +2 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.js +8 -4
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +8 -4
- package/dist/components/index.mjs.map +1 -1
- package/dist/{index-B9vIHUEv.d.ts → index-BJpxvH7X.d.ts} +1 -1
- package/dist/{index-C3_UPPdv.d.ts → index-CdTIsNsy.d.ts} +2 -2
- package/dist/{index-DDuTPOHu.d.mts → index-Cum2EknK.d.mts} +1 -1
- package/dist/{index-D6ZIkvt-.d.mts → index-DyxLpkmm.d.mts} +2 -2
- package/dist/{index-BjYZSfZa.d.ts → index-XTV6IU-M.d.ts} +2 -2
- package/dist/{index-3qQN9Lh_.d.mts → index-z15F7afa.d.mts} +2 -2
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -4
- package/dist/index.mjs.map +1 -1
- package/dist/mmd/index.d.mts +9 -3
- package/dist/mmd/index.d.ts +9 -3
- package/dist/mmd/index.js +95 -13
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +95 -13
- package/dist/mmd/index.mjs.map +1 -1
- package/dist/portfolio/index.js +2 -2
- package/dist/portfolio/index.js.map +1 -1
- package/dist/portfolio/index.mjs +2 -2
- package/dist/portfolio/index.mjs.map +1 -1
- package/dist/showmasterpiece/core.d.mts +3 -3
- package/dist/showmasterpiece/core.d.ts +3 -3
- package/dist/showmasterpiece/db.d.mts +25 -0
- package/dist/showmasterpiece/db.d.ts +25 -0
- package/dist/showmasterpiece/db.js +35 -0
- package/dist/showmasterpiece/db.js.map +1 -1
- package/dist/showmasterpiece/db.mjs +35 -0
- package/dist/showmasterpiece/db.mjs.map +1 -1
- package/dist/showmasterpiece/index.js +279 -226
- package/dist/showmasterpiece/index.js.map +1 -1
- package/dist/showmasterpiece/index.mjs +279 -226
- package/dist/showmasterpiece/index.mjs.map +1 -1
- package/dist/showmasterpiece/logic/index.d.mts +2 -2
- package/dist/showmasterpiece/logic/index.d.ts +2 -2
- package/dist/showmasterpiece/server/index.js +35 -0
- package/dist/showmasterpiece/server/index.js.map +1 -1
- package/dist/showmasterpiece/server/index.mjs +35 -0
- package/dist/showmasterpiece/server/index.mjs.map +1 -1
- package/dist/showmasterpiece/service/api/index.d.mts +1 -1
- package/dist/showmasterpiece/service/api/index.d.ts +1 -1
- package/dist/showmasterpiece/service/client-business/index.d.mts +3 -3
- package/dist/showmasterpiece/service/client-business/index.d.ts +3 -3
- package/dist/showmasterpiece/service/index.d.mts +6 -6
- package/dist/showmasterpiece/service/index.d.ts +6 -6
- package/dist/showmasterpiece/service/miniapp/index.d.mts +2 -2
- package/dist/showmasterpiece/service/miniapp/index.d.ts +2 -2
- package/dist/showmasterpiece/service/web/index.d.mts +4 -4
- package/dist/showmasterpiece/service/web/index.d.ts +4 -4
- package/dist/showmasterpiece/ui/miniapp/index.d.mts +2 -2
- package/dist/showmasterpiece/ui/miniapp/index.d.ts +2 -2
- package/dist/showmasterpiece/ui/miniapp/index.js +38 -8
- package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -1
- package/dist/showmasterpiece/ui/miniapp/index.mjs +38 -8
- package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -1
- package/dist/showmasterpiece/ui/web/index.js +279 -226
- package/dist/showmasterpiece/ui/web/index.js.map +1 -1
- package/dist/showmasterpiece/ui/web/index.mjs +279 -226
- package/dist/showmasterpiece/ui/web/index.mjs.map +1 -1
- package/dist/showmasterpiece/web/index.js +279 -226
- package/dist/showmasterpiece/web/index.js.map +1 -1
- package/dist/showmasterpiece/web/index.mjs +279 -226
- package/dist/showmasterpiece/web/index.mjs.map +1 -1
- package/dist/{types-CvKvpyN8.d.mts → types-D4vSK3AJ.d.mts} +2 -1
- package/dist/{types-CvKvpyN8.d.ts → types-D4vSK3AJ.d.ts} +2 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/calendar/types/index.ts","../../../src/calendar/utils/dateUtils.ts","../../../src/calendar/hooks/useEvents.ts","../../../src/calendar/services/eventTypeService.ts","../../../src/calendar/hooks/useEnhancedEvents.ts","../../../src/calendar/hooks/useEventDrag.ts","../../../src/calendar/services/exportService.ts","../../../src/calendar/services/importService.ts","../../../src/calendar/services/recurrenceService.ts","../../../src/calendar/services/reminderService.ts","../../../src/calendar/utils/deviceUtils.ts","../../../src/calendar/core/index.ts","../../../src/calendar/components/CalendarSettings.tsx","../../../src/calendar/components/DraggableEvent.tsx","../../../src/calendar/components/DroppableCalendarCell.tsx","../../../src/calendar/components/DraggableMonthView.tsx","../../../src/calendar/components/EventForm.tsx","../../../src/components/SearchBox.tsx","../../../src/logger/console-adapter.ts","../../../src/logger/Logger.ts","../../../src/utils/cn.ts","../../../src/components/Button.tsx","../../../src/components/Card.tsx","../../../src/components/Badge.tsx","../../../src/components/Input.tsx","../../../src/components/Label.tsx","../../../src/components/internal/ui-core.tsx","../../../src/components/Tabs.tsx","../../../src/components/Dialog.tsx","../../../src/components/AlertDialog.tsx","../../../src/components/DropdownMenu.tsx","../../../src/components/Popover.tsx","../../../src/components/Progress.tsx","../../../src/components/ScrollArea.tsx","../../../src/components/Select.tsx","../../../src/components/Separator.tsx","../../../src/components/Sheet.tsx","../../../src/components/Textarea.tsx","../../../src/components/Tooltip.tsx","../../../src/components/Avatar.tsx","../../../src/components/PopWindow.tsx","../../../src/calendar/components/EventList.tsx","../../../src/calendar/components/EventModal.tsx","../../../src/calendar/components/EventSearch.tsx","../../../src/calendar/components/ImprovedEventModal.tsx","../../../src/calendar/components/internal/PopWindow.tsx","../../../src/calendar/pages/CalendarPage.tsx","../../../src/calendar/pages/EventDetailPage.tsx"],"names":["RecurrenceType","ReminderType","ReminderStatus","CalendarViewType","EventColor","EventPriority","EventSortField","SortDirection","EventListDisplayMode","useState","useCallback","EventType","RecurrencePattern","formatTime","useEffect","React","clsx","useDraggable","useDroppable","useMemo","_","isWeekend","DndContext","DragOverlay","twMerge","cva","React7","React8","React10","React11","React12","createPortal","React13","React14","X","React15","React16","Check","Circle","ChevronRight","React17","React18","React19","React20","ChevronDown","ChevronUp","React21","React22","React23","React24","React25","Modal","getMonthName","error","e"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 日历模块类型定义\n * \n * 定义了日历模块中使用的所有TypeScript类型,包括:\n * - 事件相关类型\n * - 日历视图类型 \n * - 重复规则类型\n * - 提醒类型\n * - API响应类型\n * - 组件Props类型\n */\n\n// ===== 基础数据类型 =====\n\n/**\n * 日历事件\n */\nexport interface CalendarEvent {\n id: number;\n title: string;\n description?: string;\n startTime: Date;\n endTime: Date;\n allDay: boolean;\n location?: string;\n color: string;\n priority: EventPriority;\n userId: number;\n createdAt: Date;\n updatedAt: Date;\n // 关联数据\n recurrenceRule?: RecurrenceRule;\n reminders?: Reminder[];\n}\n\n/**\n * 重复规则\n */\nexport interface RecurrenceRule {\n id: number;\n eventId: number;\n ruleType: RecurrenceType;\n interval: number;\n endDate?: Date;\n count?: number;\n byWeekday?: number[]; // 0-6, 0=周日\n byMonthday?: number[]; // 1-31\n byMonth?: number[]; // 1-12\n}\n\n/**\n * 提醒\n */\nexport interface Reminder {\n id: number;\n eventId: number;\n reminderTime: Date;\n reminderType: ReminderType;\n status: ReminderStatus;\n createdAt: Date;\n}\n\n// ===== 枚举类型 =====\n\n/**\n * 重复类型\n */\nexport enum RecurrenceType {\n DAILY = 'daily',\n WEEKLY = 'weekly', \n MONTHLY = 'monthly',\n YEARLY = 'yearly',\n CUSTOM = 'custom'\n}\n\n/**\n * 提醒类型\n */\nexport enum ReminderType {\n NOTIFICATION = 'notification',\n EMAIL = 'email',\n SMS = 'sms'\n}\n\n/**\n * 提醒状态\n */\nexport enum ReminderStatus {\n PENDING = 'pending',\n SENT = 'sent',\n FAILED = 'failed'\n}\n\n/**\n * 日历视图类型\n */\nexport enum CalendarViewType {\n MONTH = 'month',\n WEEK = 'week',\n DAY = 'day',\n AGENDA = 'agenda'\n}\n\n/**\n * 事件颜色预设\n */\nexport enum EventColor {\n BLUE = '#3B82F6',\n GREEN = '#10B981',\n PURPLE = '#8B5CF6',\n RED = '#EF4444',\n YELLOW = '#F59E0B',\n PINK = '#EC4899',\n INDIGO = '#6366F1',\n GRAY = '#6B7280'\n}\n\n/**\n * 事件优先级\n */\nexport enum EventPriority {\n LOW = 'low',\n NORMAL = 'normal',\n HIGH = 'high',\n URGENT = 'urgent'\n}\n\n// ===== 表单数据类型 =====\n\n/**\n * 事件表单数据\n */\nexport interface EventFormData {\n title: string;\n description?: string;\n startTime: Date;\n endTime: Date;\n allDay: boolean;\n location?: string;\n color: string;\n priority: EventPriority;\n recurrence?: RecurrenceFormData;\n reminders?: ReminderFormData[];\n}\n\n/**\n * 重复规则表单数据\n */\nexport interface RecurrenceFormData {\n ruleType: RecurrenceType;\n interval: number;\n endDate?: Date;\n count?: number;\n byWeekday?: number[];\n byMonthday?: number[];\n byMonth?: number[];\n}\n\n/**\n * 提醒表单数据\n */\nexport interface ReminderFormData {\n reminderTime: Date;\n reminderType: ReminderType;\n}\n\n// ===== API类型 =====\n\n/**\n * API提醒数据\n */\nexport interface ReminderApiData {\n reminderTime: string; // ISO string\n reminderType: ReminderType;\n}\n\n/**\n * 创建事件请求\n */\nexport interface CreateEventRequest {\n title: string;\n description?: string;\n startTime: string; // ISO string\n endTime: string; // ISO string\n allDay: boolean;\n location?: string;\n color: string;\n priority: EventPriority;\n recurrence?: RecurrenceFormData;\n reminders?: ReminderApiData[];\n}\n\n/**\n * 更新事件请求\n */\nexport interface UpdateEventRequest {\n title?: string;\n description?: string;\n startTime?: string; // ISO string\n endTime?: string; // ISO string\n allDay?: boolean;\n location?: string;\n color?: string;\n priority?: EventPriority;\n recurrence?: RecurrenceFormData;\n reminders?: ReminderApiData[];\n}\n\n/**\n * 删除事件请求\n */\nexport interface DeleteEventRequest {\n id: number;\n deleteAll?: boolean; // 是否删除所有重复事件\n}\n\n/**\n * 获取事件请求参数\n */\nexport interface GetEventsRequest {\n startDate: string; // ISO string\n endDate: string; // ISO string\n viewType?: CalendarViewType;\n userId?: number;\n}\n\n/**\n * API响应基础类型\n */\nexport interface ApiResponse<T = any> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n}\n\n/**\n * 事件列表响应\n */\nexport interface EventsResponse extends ApiResponse<CalendarEvent[]> {}\n\n/**\n * 单个事件响应\n */\nexport interface EventResponse extends ApiResponse<CalendarEvent> {}\n\n// ===== 组件Props类型 =====\n\n/**\n * 日历视图组件Props\n */\nexport interface CalendarViewProps {\n events: CalendarEvent[];\n viewType: CalendarViewType;\n currentDate: Date;\n onDateChange: (date: Date) => void;\n onViewTypeChange: (viewType: CalendarViewType) => void;\n onEventClick: (event: CalendarEvent) => void;\n onEventCreate: (event: EventFormData) => void;\n onEventUpdate: (event: CalendarEvent) => void;\n onEventDelete: (eventId: number) => void;\n loading?: boolean;\n className?: string;\n}\n\n/**\n * 事件卡片组件Props\n */\nexport interface EventCardProps {\n event: CalendarEvent;\n onClick?: (event: CalendarEvent) => void;\n onEdit?: (event: CalendarEvent) => void;\n onDelete?: (eventId: number) => void;\n compact?: boolean;\n className?: string;\n}\n\n/**\n * 事件表单组件Props\n */\nexport interface EventFormProps {\n event?: CalendarEvent;\n onSubmit: (eventData: EventFormData) => void;\n onCancel: () => void;\n loading?: boolean;\n className?: string;\n}\n\n/**\n * 事件弹窗组件Props\n */\nexport interface EventModalProps {\n isOpen: boolean;\n event?: CalendarEvent;\n onClose: () => void;\n onSave: (eventData: EventFormData) => void;\n onDelete?: (eventId: number) => void;\n loading?: boolean;\n}\n\n/**\n * 迷你日历组件Props\n */\nexport interface MiniCalendarProps {\n selectedDate: Date;\n onDateSelect: (date: Date) => void;\n events?: CalendarEvent[];\n highlightDatesWithEvents?: boolean;\n className?: string;\n}\n\n// ===== 状态管理类型 =====\n\n/**\n * 日历状态\n */\nexport interface CalendarState {\n events: CalendarEvent[];\n currentDate: Date;\n viewType: CalendarViewType;\n selectedEvent?: CalendarEvent;\n loading: boolean;\n error?: string;\n}\n\n/**\n * 日历操作类型\n */\nexport interface CalendarActions {\n setEvents: (events: CalendarEvent[]) => void;\n addEvent: (event: CalendarEvent) => void;\n updateEvent: (event: CalendarEvent) => void;\n deleteEvent: (eventId: number) => void;\n setCurrentDate: (date: Date) => void;\n setViewType: (viewType: CalendarViewType) => void;\n setSelectedEvent: (event?: CalendarEvent) => void;\n setLoading: (loading: boolean) => void;\n setError: (error?: string) => void;\n}\n\n// ===== Hook返回类型 =====\n\n/**\n * useCalendar Hook返回类型\n */\nexport interface UseCalendarReturn {\n state: CalendarState;\n actions: CalendarActions;\n loadEvents: (startDate: Date, endDate: Date) => Promise<void>;\n createEvent: (eventData: EventFormData) => Promise<CalendarEvent>;\n updateEvent: (eventId: number, eventData: Partial<EventFormData>) => Promise<CalendarEvent>;\n deleteEvent: (eventId: number, deleteAll?: boolean) => Promise<void>;\n refreshEvents: () => Promise<void>;\n}\n\n/**\n * useEvents Hook返回类型\n */\nexport interface UseEventsReturn {\n events: CalendarEvent[];\n loading: boolean;\n error?: string;\n createEvent: (eventData: EventFormData) => Promise<CalendarEvent>;\n updateEvent: (eventId: number, eventData: Partial<EventFormData>) => Promise<CalendarEvent>;\n deleteEvent: (eventId: number, deleteAll?: boolean) => Promise<void>;\n loadEvents: (startDate: Date, endDate: Date) => Promise<void>;\n refreshEvents: () => Promise<void>;\n}\n\n// ===== 工具类型 =====\n\n/**\n * 日期范围\n */\nexport interface DateRange {\n startDate: Date;\n endDate: Date;\n}\n\n/**\n * 日历单元格数据\n */\nexport interface CalendarCell {\n date: Date;\n isCurrentMonth: boolean;\n isToday: boolean;\n isSelected: boolean;\n events: CalendarEvent[];\n}\n\n/**\n * 时间槽数据\n */\nexport interface TimeSlot {\n time: Date;\n events: CalendarEvent[];\n isWorkingHour: boolean;\n}\n\n// ===== 配置类型 =====\n\n/**\n * 日历配置\n */\nexport interface CalendarConfig {\n firstDayOfWeek: number; // 0=周日, 1=周一\n workingHours: {\n start: string; // \"09:00\"\n end: string; // \"18:00\"\n };\n timeZone: string;\n dateFormat: string;\n timeFormat: string;\n defaultView: CalendarViewType;\n defaultEventColor: string;\n weekends: boolean;\n eventColors: Record<string, string>;\n}\n\n/**\n * 服务接口\n */\nexport interface CalendarService {\n getEvents(params: GetEventsRequest): Promise<CalendarEvent[]>;\n createEvent(eventData: CreateEventRequest): Promise<CalendarEvent>;\n updateEvent(eventId: number, eventData: UpdateEventRequest): Promise<CalendarEvent>;\n deleteEvent(eventId: number, deleteAll?: boolean): Promise<void>;\n getEvent(eventId: number): Promise<CalendarEvent>;\n}\n\n/**\n * 数据库服务接口\n */\nexport interface CalendarDbService {\n getAllEvents(userId: number, startDate?: Date, endDate?: Date): Promise<CalendarEvent[]>;\n getEventById(eventId: number): Promise<CalendarEvent | null>;\n createEvent(eventData: Omit<CalendarEvent, 'id' | 'createdAt' | 'updatedAt'>): Promise<CalendarEvent>;\n updateEvent(eventId: number, eventData: Partial<CalendarEvent>): Promise<CalendarEvent>;\n deleteEvent(eventId: number): Promise<void>;\n createRecurrenceRule(ruleData: Omit<RecurrenceRule, 'id'>): Promise<RecurrenceRule>;\n updateRecurrenceRule(ruleId: number, ruleData: Partial<RecurrenceRule>): Promise<RecurrenceRule>;\n deleteRecurrenceRule(ruleId: number): Promise<void>;\n createReminder(reminderData: Omit<Reminder, 'id' | 'createdAt'>): Promise<Reminder>;\n updateReminder(reminderId: number, reminderData: Partial<Reminder>): Promise<Reminder>;\n deleteReminder(reminderId: number): Promise<void>;\n}\n\n// ===== 事件列表相关类型 =====\n\n/**\n * 事件排序字段\n */\nexport enum EventSortField {\n START_TIME = 'startTime',\n TITLE = 'title',\n PRIORITY = 'priority',\n CREATED_AT = 'createdAt',\n UPDATED_AT = 'updatedAt'\n}\n\n/**\n * 排序方向\n */\nexport enum SortDirection {\n ASC = 'asc',\n DESC = 'desc'\n}\n\n/**\n * 事件列表显示模式\n */\nexport enum EventListDisplayMode {\n LIST = 'list',\n GRID = 'grid'\n}\n\n/**\n * 事件列表排序配置\n */\nexport interface EventListSort {\n field: EventSortField;\n direction: SortDirection;\n}\n\n/**\n * 事件列表过滤配置\n */\nexport interface EventListFilter {\n priority?: EventPriority;\n color?: string;\n dateRange?: DateRange;\n searchText?: string;\n}\n\n/**\n * 事件列表配置\n */\nexport interface EventListConfig {\n displayMode: EventListDisplayMode;\n sort: EventListSort;\n filter: EventListFilter;\n pageSize: number;\n currentPage: number;\n}\n\n/**\n * 事件列表Props\n */\nexport interface EventListProps {\n events: CalendarEvent[];\n config: EventListConfig;\n onConfigChange: (config: EventListConfig) => void;\n onEventClick: (event: CalendarEvent) => void;\n onEventEdit: (event: CalendarEvent) => void;\n onEventDelete: (eventId: number) => void;\n onBatchDelete?: (eventIds: number[]) => Promise<void>;\n enableBatchActions?: boolean;\n loading?: boolean;\n className?: string;\n} ","/**\n * 日历日期工具函数\n * \n * 提供日历模块中常用的日期处理功能,包括:\n * - 日期格式化\n * - 日期计算\n * - 日历视图相关的日期逻辑\n * - 重复事件计算\n */\n\n/**\n * 格式化日期为 YYYY-MM-DD 格式\n * 使用本地时区,避免时区转换问题\n */\nexport function formatDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return (year) + '-' + (month) + '-' + (day);\n}\n\n/**\n * 格式化时间为 HH:mm 格式\n */\nexport function formatTime(date: Date): string {\n return date.toLocaleTimeString('zh-CN', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false\n });\n}\n\n/**\n * 格式化日期时间为本地字符串\n */\nexport function formatDateTime(date: Date, options?: Intl.DateTimeFormatOptions): string {\n const defaultOptions: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false\n };\n\n return date.toLocaleString('zh-CN', { ...defaultOptions, ...options });\n}\n\n/**\n * 将日期时间转换为ISO字符串,但保持本地时区\n * 避免时区转换导致的日期偏移问题\n */\nexport function toLocalISOString(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n const milliseconds = String(date.getMilliseconds()).padStart(3, '0');\n \n // 不添加Z后缀,避免被误认为是UTC时间\n return (year) + '-' + (month) + '-' + (day) + 'T' + (hours) + ':' + (minutes) + ':' + (seconds) + '.' + (milliseconds);\n}\n\n/**\n * 获取月份的第一天\n */\nexport function getMonthStart(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n}\n\n/**\n * 获取月份的最后一天\n */\nexport function getMonthEnd(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0);\n}\n\n/**\n * 获取周的第一天(基于指定的一周开始日)\n */\nexport function getWeekStart(date: Date, firstDayOfWeek: number = 1): Date {\n const day = date.getDay();\n const diff = day - firstDayOfWeek;\n const adjustedDiff = diff < 0 ? diff + 7 : diff;\n \n const weekStart = new Date(date);\n weekStart.setDate(date.getDate() - adjustedDiff);\n weekStart.setHours(0, 0, 0, 0);\n \n return weekStart;\n}\n\n/**\n * 获取周的最后一天\n */\nexport function getWeekEnd(date: Date, firstDayOfWeek: number = 1): Date {\n const weekStart = getWeekStart(date, firstDayOfWeek);\n const weekEnd = new Date(weekStart);\n weekEnd.setDate(weekStart.getDate() + 6);\n weekEnd.setHours(23, 59, 59, 999);\n \n return weekEnd;\n}\n\n/**\n * 获取当天的开始时间\n */\nexport function getDayStart(date: Date): Date {\n const dayStart = new Date(date);\n dayStart.setHours(0, 0, 0, 0);\n return dayStart;\n}\n\n/**\n * 获取当天的结束时间\n */\nexport function getDayEnd(date: Date): Date {\n const dayEnd = new Date(date);\n dayEnd.setHours(23, 59, 59, 999);\n return dayEnd;\n}\n\n/**\n * 检查两个日期是否在同一天\n */\nexport function isSameDay(date1: Date, date2: Date): boolean {\n return date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate();\n}\n\n/**\n * 检查两个日期是否在同一周\n */\nexport function isSameWeek(date1: Date, date2: Date, firstDayOfWeek: number = 1): boolean {\n const week1Start = getWeekStart(date1, firstDayOfWeek);\n const week2Start = getWeekStart(date2, firstDayOfWeek);\n \n return isSameDay(week1Start, week2Start);\n}\n\n/**\n * 检查两个日期是否在同一月\n */\nexport function isSameMonth(date1: Date, date2: Date): boolean {\n return date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth();\n}\n\n/**\n * 检查日期是否是今天\n */\nexport function isToday(date: Date): boolean {\n return isSameDay(date, new Date());\n}\n\n/**\n * 检查日期是否是周末\n */\nexport function isWeekend(date: Date): boolean {\n const day = date.getDay();\n return day === 0 || day === 6; // 周日或周六\n}\n\n/**\n * 添加天数\n */\nexport function addDays(date: Date, days: number): Date {\n const result = new Date(date);\n result.setDate(result.getDate() + days);\n return result;\n}\n\n/**\n * 添加周数\n */\nexport function addWeeks(date: Date, weeks: number): Date {\n return addDays(date, weeks * 7);\n}\n\n/**\n * 添加月数\n */\nexport function addMonths(date: Date, months: number): Date {\n const result = new Date(date);\n result.setMonth(result.getMonth() + months);\n return result;\n}\n\n/**\n * 添加年数\n */\nexport function addYears(date: Date, years: number): Date {\n const result = new Date(date);\n result.setFullYear(result.getFullYear() + years);\n return result;\n}\n\n/**\n * 获取月视图的日期网格\n */\nexport function getMonthViewDates(date: Date, firstDayOfWeek: number = 1): Date[] {\n const monthStart = getMonthStart(date);\n const monthEnd = getMonthEnd(date);\n const viewStart = getWeekStart(monthStart, firstDayOfWeek);\n \n const dates: Date[] = [];\n let currentDate = new Date(viewStart);\n \n // 确保总是生成6周(42天)的日期\n for (let i = 0; i < 42; i++) {\n dates.push(new Date(currentDate));\n currentDate.setDate(currentDate.getDate() + 1);\n }\n \n return dates;\n}\n\n/**\n * 获取周视图的日期\n */\nexport function getWeekViewDates(date: Date, firstDayOfWeek: number = 1): Date[] {\n const weekStart = getWeekStart(date, firstDayOfWeek);\n const dates: Date[] = [];\n \n for (let i = 0; i < 7; i++) {\n const currentDate = new Date(weekStart);\n currentDate.setDate(weekStart.getDate() + i);\n dates.push(currentDate);\n }\n \n return dates;\n}\n\n/**\n * 生成时间槽(用于日视图和周视图)\n */\nexport function generateTimeSlots(startHour: number = 0, endHour: number = 24, interval: number = 60): Date[] {\n const today = new Date();\n const slots: Date[] = [];\n \n for (let hour = startHour; hour < endHour; hour++) {\n for (let minute = 0; minute < 60; minute += interval) {\n const slot = new Date(today);\n slot.setHours(hour, minute, 0, 0);\n slots.push(slot);\n }\n }\n \n return slots;\n}\n\n/**\n * 解析日期字符串为Date对象\n */\nexport function parseDate(dateString: string): Date {\n // 支持多种日期格式\n if (dateString.includes('T')) {\n // ISO 格式\n return new Date(dateString);\n } else if (dateString.includes('-')) {\n // YYYY-MM-DD 格式\n const parts = dateString.split('-').map(Number);\n const year = parts[0];\n const month = parts[1];\n const day = parts[2];\n \n if (year !== undefined && month !== undefined && day !== undefined) {\n return new Date(year, month - 1, day);\n }\n return new Date(dateString);\n } else {\n // 其他格式,使用默认解析\n return new Date(dateString);\n }\n}\n\n/**\n * 获取两个日期之间的天数差\n */\nexport function getDaysDifference(date1: Date, date2: Date): number {\n const timeDiff = Math.abs(date2.getTime() - date1.getTime());\n return Math.ceil(timeDiff / (1000 * 60 * 60 * 24));\n}\n\n/**\n * 检查时间是否在工作时间内\n */\nexport function isWorkingHour(date: Date, workingStart: string = '09:00', workingEnd: string = '18:00'): boolean {\n const timeString = formatTime(date);\n return timeString >= workingStart && timeString <= workingEnd;\n}\n\n/**\n * 获取月份名称\n */\nexport function getMonthName(date: Date, locale: string = 'zh-CN'): string {\n return date.toLocaleDateString(locale, { month: 'long' });\n}\n\n/**\n * 获取星期名称\n */\nexport function getWeekdayName(date: Date, locale: string = 'zh-CN', format: 'long' | 'short' | 'narrow' = 'long'): string {\n return date.toLocaleDateString(locale, { weekday: format });\n}\n\n/**\n * 获取相对时间描述(如\"2小时前\"、\"明天\")\n */\nexport function getRelativeTime(date: Date, locale: string = 'zh-CN'): string {\n const now = new Date();\n const diff = date.getTime() - now.getTime();\n const diffInDays = Math.floor(diff / (1000 * 60 * 60 * 24));\n \n if (diffInDays === 0) {\n if (isSameDay(date, now)) {\n return '今天';\n }\n } else if (diffInDays === 1) {\n return '明天';\n } else if (diffInDays === -1) {\n return '昨天';\n } else if (diffInDays > 1 && diffInDays <= 7) {\n return (diffInDays) + '天后';\n } else if (diffInDays < -1 && diffInDays >= -7) {\n return (Math.abs(diffInDays)) + '天前';\n }\n \n // 对于更远的日期,返回格式化的日期\n return formatDate(date);\n}\n\n/**\n * 验证日期是否有效\n */\nexport function isValidDate(date: any): date is Date {\n return date instanceof Date && !isNaN(date.getTime());\n}\n\n/**\n * 克隆日期对象\n */\nexport function cloneDate(date: Date): Date {\n return new Date(date.getTime());\n} ","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { CalendarEvent, EventFormData, CreateEventRequest } from '../types';\nimport { toLocalISOString } from '../utils/dateUtils';\n\nexport interface UseEventsReturn {\n events: CalendarEvent[];\n loading: boolean;\n error?: string;\n createEvent: (eventData: EventFormData) => Promise<CalendarEvent>;\n updateEvent: (eventId: number, eventData: Partial<EventFormData>) => Promise<CalendarEvent>;\n deleteEvent: (eventId: number, deleteAll?: boolean) => Promise<void>;\n batchDeleteEvents: (eventIds: number[]) => Promise<void>;\n fetchEvents: (startDate: Date, endDate: Date) => Promise<void>;\n clearError: () => void;\n}\n\n/**\n * 事件管理 Hook\n * \n * 提供事件的状态管理和CRUD操作\n */\nexport function useEvents(): UseEventsReturn {\n const [events, setEvents] = useState<CalendarEvent[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | undefined>();\n\n // 清除错误\n const clearError = useCallback(() => {\n setError(undefined);\n }, []);\n\n // 获取事件列表\n const fetchEvents = useCallback(async (startDate: Date, endDate: Date) => {\n setLoading(true);\n setError(undefined);\n \n try {\n const params = new URLSearchParams({\n startDate: toLocalISOString(startDate),\n endDate: toLocalISOString(endDate),\n });\n\n const response = await fetch('/api/calendar/events?' + (params));\n \n if (!response.ok) {\n throw new Error('获取事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '获取事件失败');\n }\n\n // 转换日期字符串为Date对象\n const eventsWithDates = data.data.map((event: any) => ({\n ...event,\n startTime: new Date(event.startTime),\n endTime: new Date(event.endTime),\n createdAt: new Date(event.createdAt),\n updatedAt: new Date(event.updatedAt),\n }));\n\n setEvents(eventsWithDates);\n } catch (err) {\n console.error('获取事件失败:', err);\n setError(err instanceof Error ? err.message : '获取事件失败');\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 创建事件\n const createEvent = useCallback(async (eventData: EventFormData): Promise<CalendarEvent> => {\n setLoading(true);\n setError(undefined);\n \n try {\n const createRequest: CreateEventRequest = {\n title: eventData.title,\n description: eventData.description,\n startTime: toLocalISOString(eventData.startTime),\n endTime: toLocalISOString(eventData.endTime),\n allDay: eventData.allDay,\n location: eventData.location,\n color: eventData.color,\n priority: eventData.priority,\n // TODO: 支持重复规则和提醒\n recurrence: eventData.recurrence,\n reminders: eventData.reminders?.map(reminder => ({\n reminderTime: toLocalISOString(reminder.reminderTime),\n reminderType: reminder.reminderType,\n })),\n };\n\n const response = await fetch('/api/calendar/events', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(createRequest),\n });\n\n if (!response.ok) {\n throw new Error('创建事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '创建事件失败');\n }\n\n // 转换日期字符串为Date对象\n const newEvent: CalendarEvent = {\n ...data.data,\n startTime: new Date(data.data.startTime),\n endTime: new Date(data.data.endTime),\n createdAt: new Date(data.data.createdAt),\n updatedAt: new Date(data.data.updatedAt),\n };\n\n // 更新本地状态\n setEvents(prev => [...prev, newEvent]);\n \n return newEvent;\n } catch (err) {\n console.error('创建事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '创建事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 更新事件\n const updateEvent = useCallback(async (\n eventId: number, \n eventData: Partial<EventFormData>\n ): Promise<CalendarEvent> => {\n setLoading(true);\n setError(undefined);\n \n try {\n const updateRequest: any = {};\n \n if (eventData.title !== undefined) updateRequest.title = eventData.title;\n if (eventData.description !== undefined) updateRequest.description = eventData.description;\n if (eventData.startTime !== undefined) updateRequest.startTime = toLocalISOString(eventData.startTime);\n if (eventData.endTime !== undefined) updateRequest.endTime = toLocalISOString(eventData.endTime);\n if (eventData.allDay !== undefined) updateRequest.allDay = eventData.allDay;\n if (eventData.location !== undefined) updateRequest.location = eventData.location;\n if (eventData.color !== undefined) updateRequest.color = eventData.color;\n\n const response = await fetch('/api/calendar/events/' + (eventId), {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(updateRequest),\n });\n\n if (!response.ok) {\n throw new Error('更新事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '更新事件失败');\n }\n\n // 转换日期字符串为Date对象\n const updatedEvent: CalendarEvent = {\n ...data.data,\n startTime: new Date(data.data.startTime),\n endTime: new Date(data.data.endTime),\n createdAt: new Date(data.data.createdAt),\n updatedAt: new Date(data.data.updatedAt),\n };\n\n // 更新本地状态\n setEvents(prev => prev.map(event => \n event.id === eventId ? updatedEvent : event\n ));\n \n return updatedEvent;\n } catch (err) {\n console.error('更新事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '更新事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 删除事件\n const deleteEvent = useCallback(async (eventId: number, deleteAll = false) => {\n setLoading(true);\n setError(undefined);\n \n try {\n const url = deleteAll \n ? '/api/calendar/events/' + (eventId) + '?deleteAll=true'\n : '/api/calendar/events/' + (eventId);\n\n const response = await fetch(url, {\n method: 'DELETE',\n });\n\n if (!response.ok) {\n throw new Error('删除事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '删除事件失败');\n }\n\n // 更新本地状态\n setEvents(prev => prev.filter(event => event.id !== eventId));\n } catch (err) {\n console.error('删除事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '删除事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 批量删除事件\n const batchDeleteEvents = useCallback(async (eventIds: number[]) => {\n setLoading(true);\n setError(undefined);\n \n try {\n const response = await fetch('/api/calendar/events/batchDelete', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ eventIds }),\n });\n\n if (!response.ok) {\n throw new Error('批量删除事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '批量删除事件失败');\n }\n\n // 更新本地状态\n setEvents(prev => prev.filter(event => !eventIds.includes(event.id)));\n } catch (err) {\n console.error('批量删除事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '批量删除事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n return {\n events,\n loading,\n error,\n createEvent,\n updateEvent,\n deleteEvent,\n batchDeleteEvents,\n fetchEvents,\n clearError,\n };\n} ","/**\n * 事件类型服务\n * \n * 负责处理不同类型事件的创建逻辑:\n * 1. 单次事件 (Single Event)\n * 2. 多天事件 (Multi-day Event) \n * 3. 重复事件 (Recurring Event)\n */\n\nexport enum EventType {\n SINGLE = 'single', // 单次事件\n MULTI_DAY = 'multi_day', // 多天事件(跨越多个日期的单个事件)\n RECURRING = 'recurring' // 重复事件(按规律重复发生)\n}\n\nexport enum RecurrencePattern {\n DAILY = 'daily',\n WEEKLY = 'weekly', \n MONTHLY = 'monthly',\n YEARLY = 'yearly',\n CUSTOM = 'custom'\n}\n\nexport interface BaseEventData {\n title: string;\n description?: string;\n location?: string;\n color: string;\n priority: string;\n allDay: boolean;\n}\n\nexport interface SingleEventData extends BaseEventData {\n type: EventType.SINGLE;\n startTime: Date;\n endTime: Date;\n}\n\nexport interface MultiDayEventData extends BaseEventData {\n type: EventType.MULTI_DAY;\n startDate: Date; // 开始日期\n endDate: Date; // 结束日期(包含)\n startTime?: string; // 每日开始时间 \"09:00\"\n endTime?: string; // 每日结束时间 \"17:00\"\n}\n\nexport interface RecurringEventData extends BaseEventData {\n type: EventType.RECURRING;\n startDate: Date;\n startTime: Date;\n endTime: Date;\n recurrence: {\n pattern: RecurrencePattern;\n interval: number; // 间隔(每N天/周/月)\n endDate?: Date; // 结束日期\n count?: number; // 重复次数\n daysOfWeek?: number[]; // 星期几(用于每周重复)\n };\n}\n\nexport type EventData = SingleEventData | MultiDayEventData | RecurringEventData;\n\nexport interface GeneratedEvent {\n title: string;\n description?: string;\n startTime: Date;\n endTime: Date;\n location?: string;\n color: string;\n priority: string;\n allDay: boolean;\n // 元数据\n eventType: EventType;\n parentEventId?: string; // 对于多天事件和重复事件,指向父事件\n instanceDate?: string; // 实例日期 (YYYY-MM-DD)\n isMultiDayPart?: boolean; // 是否是多天事件的一部分\n isRecurringInstance?: boolean; // 是否是重复事件的实例\n}\n\nexport class EventTypeService {\n \n /**\n * 根据事件数据生成实际的事件实例\n */\n static generateEventInstances(\n eventData: EventData,\n viewStartDate: Date,\n viewEndDate: Date,\n parentEventId?: string\n ): GeneratedEvent[] {\n switch (eventData.type) {\n case EventType.SINGLE:\n return this.generateSingleEvent(eventData, parentEventId);\n \n case EventType.MULTI_DAY:\n return this.generateMultiDayEvents(eventData, viewStartDate, viewEndDate, parentEventId);\n \n case EventType.RECURRING:\n return this.generateRecurringEvents(eventData, viewStartDate, viewEndDate, parentEventId);\n \n default:\n throw new Error('不支持的事件类型: ' + ((eventData as any).type));\n }\n }\n\n /**\n * 生成单次事件\n */\n private static generateSingleEvent(\n eventData: SingleEventData, \n parentEventId?: string\n ): GeneratedEvent[] {\n return [{\n ...eventData,\n eventType: EventType.SINGLE,\n parentEventId\n }];\n }\n\n /**\n * 生成多天事件实例\n * 例:21-23号的会议 -> 创建3个事件实例,每个代表一天\n */\n private static generateMultiDayEvents(\n eventData: MultiDayEventData,\n viewStartDate: Date,\n viewEndDate: Date,\n parentEventId?: string\n ): GeneratedEvent[] {\n const events: GeneratedEvent[] = [];\n const currentDate = new Date(eventData.startDate);\n \n // 确保不超出视图范围\n const actualStartDate = currentDate < viewStartDate ? viewStartDate : currentDate;\n const actualEndDate = eventData.endDate > viewEndDate ? viewEndDate : eventData.endDate;\n \n currentDate.setTime(actualStartDate.getTime());\n \n while (currentDate <= actualEndDate) {\n const dayStart = new Date(currentDate);\n const dayEnd = new Date(currentDate);\n \n if (eventData.allDay) {\n // 全天事件\n dayStart.setHours(0, 0, 0, 0);\n dayEnd.setHours(23, 59, 59, 999);\n } else {\n // 定时事件,使用指定的时间\n const startParts = (eventData.startTime || '09:00').split(':');\n const endParts = (eventData.endTime || '17:00').split(':');\n const startHour = Number(startParts[0] || 0);\n const startMinute = Number(startParts[1] || 0);\n const endHour = Number(endParts[0] || 0);\n const endMinute = Number(endParts[1] || 0);\n \n dayStart.setHours(startHour, startMinute, 0, 0);\n dayEnd.setHours(endHour, endMinute, 0, 0);\n }\n \n events.push({\n title: eventData.title,\n description: eventData.description,\n startTime: dayStart,\n endTime: dayEnd,\n location: eventData.location,\n color: eventData.color,\n priority: eventData.priority,\n allDay: eventData.allDay,\n eventType: EventType.MULTI_DAY,\n parentEventId,\n instanceDate: this.formatDateString(currentDate),\n isMultiDayPart: true\n });\n \n // 移动到下一天\n currentDate.setDate(currentDate.getDate() + 1);\n }\n \n return events;\n }\n\n /**\n * 生成重复事件实例\n */\n private static generateRecurringEvents(\n eventData: RecurringEventData,\n viewStartDate: Date,\n viewEndDate: Date,\n parentEventId?: string\n ): GeneratedEvent[] {\n const events: GeneratedEvent[] = [];\n const { recurrence } = eventData;\n \n let currentDate = new Date(eventData.startDate);\n let instanceCount = 0;\n const maxInstances = recurrence.count || 1000;\n \n // 确定结束条件\n const endDate = recurrence.endDate || viewEndDate;\n const actualEndDate = endDate < viewEndDate ? endDate : viewEndDate;\n \n while (currentDate <= actualEndDate && instanceCount < maxInstances) {\n // 检查当前日期是否在视图范围内\n if (currentDate >= viewStartDate) {\n const instanceStart = new Date(currentDate);\n instanceStart.setHours(\n eventData.startTime.getHours(),\n eventData.startTime.getMinutes(),\n eventData.startTime.getSeconds()\n );\n \n const instanceEnd = new Date(currentDate);\n instanceEnd.setHours(\n eventData.endTime.getHours(),\n eventData.endTime.getMinutes(),\n eventData.endTime.getSeconds()\n );\n \n events.push({\n title: eventData.title,\n description: eventData.description,\n startTime: instanceStart,\n endTime: instanceEnd,\n location: eventData.location,\n color: eventData.color,\n priority: eventData.priority,\n allDay: eventData.allDay,\n eventType: EventType.RECURRING,\n parentEventId,\n instanceDate: this.formatDateString(currentDate),\n isRecurringInstance: true\n });\n \n instanceCount++;\n }\n \n // 计算下一次重复的日期\n currentDate = this.getNextRecurrenceDate(currentDate, recurrence);\n }\n \n return events;\n }\n\n /**\n * 计算下一次重复的日期\n */\n private static getNextRecurrenceDate(\n currentDate: Date, \n recurrence: RecurringEventData['recurrence']\n ): Date {\n const nextDate = new Date(currentDate);\n \n switch (recurrence.pattern) {\n case RecurrencePattern.DAILY:\n nextDate.setDate(nextDate.getDate() + recurrence.interval);\n break;\n \n case RecurrencePattern.WEEKLY:\n nextDate.setDate(nextDate.getDate() + (7 * recurrence.interval));\n break;\n \n case RecurrencePattern.MONTHLY:\n nextDate.setMonth(nextDate.getMonth() + recurrence.interval);\n break;\n \n case RecurrencePattern.YEARLY:\n nextDate.setFullYear(nextDate.getFullYear() + recurrence.interval);\n break;\n \n default:\n throw new Error('不支持的重复模式: ' + (recurrence.pattern));\n }\n \n return nextDate;\n }\n\n /**\n * 格式化日期为字符串 (YYYY-MM-DD)\n */\n private static formatDateString(date: Date): string {\n return date.toISOString().split('T')[0]!;\n }\n\n /**\n * 验证事件数据\n */\n static validateEventData(eventData: EventData): string[] {\n const errors: string[] = [];\n \n // 基础验证\n if (!eventData.title?.trim()) {\n errors.push('事件标题不能为空');\n }\n \n if (!eventData.color) {\n errors.push('请选择事件颜色');\n }\n \n // 根据类型进行特定验证\n switch (eventData.type) {\n case EventType.SINGLE:\n errors.push(...this.validateSingleEvent(eventData));\n break;\n \n case EventType.MULTI_DAY:\n errors.push(...this.validateMultiDayEvent(eventData));\n break;\n \n case EventType.RECURRING:\n errors.push(...this.validateRecurringEvent(eventData));\n break;\n }\n \n return errors;\n }\n\n private static validateSingleEvent(eventData: SingleEventData): string[] {\n const errors: string[] = [];\n \n if (!eventData.startTime) {\n errors.push('请设置开始时间');\n }\n \n if (!eventData.endTime) {\n errors.push('请设置结束时间');\n }\n \n if (eventData.startTime && eventData.endTime && eventData.endTime <= eventData.startTime) {\n errors.push('结束时间必须晚于开始时间');\n }\n \n return errors;\n }\n\n private static validateMultiDayEvent(eventData: MultiDayEventData): string[] {\n const errors: string[] = [];\n \n if (!eventData.startDate) {\n errors.push('请设置开始日期');\n }\n \n if (!eventData.endDate) {\n errors.push('请设置结束日期');\n }\n \n if (eventData.startDate && eventData.endDate && eventData.endDate < eventData.startDate) {\n errors.push('结束日期必须不早于开始日期');\n }\n \n // 验证时间格式\n if (!eventData.allDay) {\n if (eventData.startTime && !/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/.test(eventData.startTime)) {\n errors.push('开始时间格式不正确 (HH:MM)');\n }\n \n if (eventData.endTime && !/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/.test(eventData.endTime)) {\n errors.push('结束时间格式不正确 (HH:MM)');\n }\n }\n \n return errors;\n }\n\n private static validateRecurringEvent(eventData: RecurringEventData): string[] {\n const errors: string[] = [];\n \n if (!eventData.startDate) {\n errors.push('请设置开始日期');\n }\n \n if (!eventData.startTime) {\n errors.push('请设置开始时间');\n }\n \n if (!eventData.endTime) {\n errors.push('请设置结束时间');\n }\n \n if (eventData.startTime && eventData.endTime && eventData.endTime <= eventData.startTime) {\n errors.push('结束时间必须晚于开始时间');\n }\n \n // 验证重复规则\n const { recurrence } = eventData;\n \n if (!recurrence.pattern) {\n errors.push('请选择重复模式');\n }\n \n if (!recurrence.interval || recurrence.interval < 1) {\n errors.push('重复间隔必须大于0');\n }\n \n if (recurrence.interval > 365) {\n errors.push('重复间隔不能超过365');\n }\n \n if (recurrence.endDate && recurrence.count && recurrence.count > 0) {\n errors.push('不能同时设置结束日期和重复次数');\n }\n \n if (recurrence.count && (recurrence.count < 1 || recurrence.count > 999)) {\n errors.push('重复次数必须在1-999之间');\n }\n \n return errors;\n }\n\n /**\n * 获取事件类型的描述文本\n */\n static getEventTypeDescription(eventData: EventData): string {\n switch (eventData.type) {\n case EventType.SINGLE:\n return '单次事件';\n \n case EventType.MULTI_DAY:\n const dayCount = Math.ceil((eventData.endDate.getTime() - eventData.startDate.getTime()) / (24 * 60 * 60 * 1000)) + 1;\n return '持续 ' + (dayCount) + ' 天';\n \n case EventType.RECURRING:\n const { pattern, interval, count, endDate } = eventData.recurrence;\n let desc = '';\n \n switch (pattern) {\n case RecurrencePattern.DAILY:\n desc = interval === 1 ? '每天' : '每 ' + (interval) + ' 天';\n break;\n case RecurrencePattern.WEEKLY:\n desc = interval === 1 ? '每周' : '每 ' + (interval) + ' 周';\n break;\n case RecurrencePattern.MONTHLY:\n desc = interval === 1 ? '每月' : '每 ' + (interval) + ' 个月';\n break;\n case RecurrencePattern.YEARLY:\n desc = interval === 1 ? '每年' : '每 ' + (interval) + ' 年';\n break;\n }\n \n if (count) {\n desc += ',共 ' + (count) + ' 次';\n } else if (endDate) {\n desc += ',直到 ' + (endDate.toLocaleDateString('zh-CN'));\n }\n \n return desc;\n \n default:\n return '未知类型';\n }\n }\n} ","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { CalendarEvent, EventFormData, CreateEventRequest, EventPriority, RecurrenceType } from '../types';\nimport { EventData, EventType, EventTypeService } from '../services/eventTypeService';\nimport { toLocalISOString, formatDate } from '../utils/dateUtils';\n\nexport interface UseEnhancedEventsReturn {\n events: CalendarEvent[];\n loading: boolean;\n error?: string;\n createEvent: (eventData: EventFormData) => Promise<CalendarEvent>;\n createEnhancedEvent: (eventData: EventData) => Promise<CalendarEvent[]>;\n updateEvent: (eventId: number, eventData: Partial<EventFormData>) => Promise<CalendarEvent>;\n updateEventTime: (eventId: number, newStartTime: Date, newEndTime: Date) => Promise<void>;\n deleteEvent: (eventId: number, deleteAll?: boolean) => Promise<void>;\n batchDeleteEvents: (eventIds: number[]) => Promise<void>;\n fetchEvents: (startDate: Date, endDate: Date) => Promise<void>;\n clearError: () => void;\n}\n\n/**\n * 增强版事件管理 Hook\n * \n * 支持新的事件类型系统:单次事件、多天事件、重复事件\n */\nexport function useEnhancedEvents(): UseEnhancedEventsReturn {\n const [events, setEvents] = useState<CalendarEvent[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | undefined>();\n\n // 清除错误\n const clearError = useCallback(() => {\n setError(undefined);\n }, []);\n\n // 获取事件列表\n const fetchEvents = useCallback(async (startDate: Date, endDate: Date) => {\n setLoading(true);\n setError(undefined);\n \n try {\n const params = new URLSearchParams({\n startDate: toLocalISOString(startDate),\n endDate: toLocalISOString(endDate),\n });\n\n const response = await fetch('/api/calendar/events?' + (params));\n \n if (!response.ok) {\n throw new Error('获取事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '获取事件失败');\n }\n\n // 转换日期字符串为Date对象\n const eventsWithDates = data.data.map((event: any) => ({\n ...event,\n startTime: new Date(event.startTime),\n endTime: new Date(event.endTime),\n createdAt: new Date(event.createdAt),\n updatedAt: new Date(event.updatedAt),\n }));\n\n console.log('📥 获取到的事件数据:', {\n requestRange: (formatDate(startDate)) + ' 到 ' + (formatDate(endDate)),\n eventCount: eventsWithDates.length,\n eventIds: eventsWithDates.map((e: CalendarEvent) => e.id)\n });\n\n // 智能合并事件:保留不在当前查询范围内的事件,替换范围内的事件\n setEvents(prev => {\n // 过滤出不在当前查询时间范围内的现有事件\n const eventsOutsideRange = prev.filter(event => {\n const eventDate = new Date(event.startTime);\n return eventDate < startDate || eventDate > endDate;\n });\n\n console.log('🔄 事件合并策略:', {\n previousEventCount: prev.length,\n eventsOutsideRange: eventsOutsideRange.length,\n newEventsInRange: eventsWithDates.length,\n finalEventCount: eventsOutsideRange.length + eventsWithDates.length\n });\n\n // 合并范围外的事件和新获取的事件\n return [...eventsOutsideRange, ...eventsWithDates];\n });\n } catch (err) {\n console.error('获取事件失败:', err);\n setError(err instanceof Error ? err.message : '获取事件失败');\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 传统的创建事件方法(向后兼容)\n const createEvent = useCallback(async (eventData: EventFormData): Promise<CalendarEvent> => {\n setLoading(true);\n setError(undefined);\n \n try {\n const createRequest: CreateEventRequest = {\n title: eventData.title,\n description: eventData.description,\n startTime: toLocalISOString(eventData.startTime),\n endTime: toLocalISOString(eventData.endTime),\n allDay: eventData.allDay,\n location: eventData.location,\n color: eventData.color,\n priority: eventData.priority,\n recurrence: eventData.recurrence,\n reminders: eventData.reminders?.map(reminder => ({\n reminderTime: toLocalISOString(reminder.reminderTime),\n reminderType: reminder.reminderType,\n })),\n };\n\n const response = await fetch('/api/calendar/events', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(createRequest),\n });\n\n if (!response.ok) {\n throw new Error('创建事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '创建事件失败');\n }\n\n // 转换日期字符串为Date对象\n const newEvent: CalendarEvent = {\n ...data.data,\n startTime: new Date(data.data.startTime),\n endTime: new Date(data.data.endTime),\n createdAt: new Date(data.data.createdAt),\n updatedAt: new Date(data.data.updatedAt),\n };\n\n // 更新本地状态\n setEvents(prev => [...prev, newEvent]);\n \n return newEvent;\n } catch (err) {\n console.error('创建事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '创建事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 映射事件类型服务的优先级到日历模块的优先级\n const mapPriorityToEventPriority = (priority: string): EventPriority => {\n switch (priority.toLowerCase()) {\n case 'low':\n return EventPriority.LOW;\n case 'normal':\n return EventPriority.NORMAL;\n case 'high':\n return EventPriority.HIGH;\n case 'urgent':\n return EventPriority.URGENT;\n default:\n return EventPriority.NORMAL;\n }\n };\n\n // 映射重复模式到重复类型\n const mapPatternToRecurrenceType = (pattern: string): RecurrenceType => {\n switch (pattern) {\n case 'daily':\n return RecurrenceType.DAILY;\n case 'weekly':\n return RecurrenceType.WEEKLY;\n case 'monthly':\n return RecurrenceType.MONTHLY;\n case 'yearly':\n return RecurrenceType.YEARLY;\n default:\n return RecurrenceType.DAILY;\n }\n };\n\n // 增强版创建事件方法\n const createEnhancedEvent = useCallback(async (eventData: EventData): Promise<CalendarEvent[]> => {\n setLoading(true);\n setError(undefined);\n \n try {\n // 验证事件数据\n const validationErrors = EventTypeService.validateEventData(eventData);\n if (validationErrors.length > 0) {\n throw new Error(validationErrors[0]);\n }\n\n // 根据事件类型生成事件实例\n let generatedEvents;\n \n // 确定视图范围\n const currentDate = new Date();\n let viewStartDate: Date;\n let viewEndDate: Date;\n \n switch (eventData.type) {\n case EventType.SINGLE:\n // 单次事件:使用startTime作为基准\n viewStartDate = new Date(eventData.startTime);\n viewEndDate = new Date(eventData.endTime);\n generatedEvents = EventTypeService.generateEventInstances(\n eventData,\n viewStartDate,\n viewEndDate\n );\n break;\n \n case EventType.MULTI_DAY:\n // 多天事件:使用startDate和endDate\n viewStartDate = new Date(eventData.startDate);\n viewEndDate = new Date(eventData.endDate);\n generatedEvents = EventTypeService.generateEventInstances(\n eventData,\n viewStartDate,\n viewEndDate\n );\n break;\n \n case EventType.RECURRING:\n // 重复事件:生成一段时间内的重复实例\n viewStartDate = new Date(eventData.startDate);\n viewEndDate = eventData.recurrence.endDate || (() => {\n const calcEndDate = new Date(eventData.startDate);\n const count = eventData.recurrence.count || 10;\n const interval = eventData.recurrence.interval || 1;\n \n switch (eventData.recurrence.pattern) {\n case 'daily':\n calcEndDate.setDate(calcEndDate.getDate() + (count * interval));\n break;\n case 'weekly':\n calcEndDate.setDate(calcEndDate.getDate() + (count * interval * 7));\n break;\n case 'monthly':\n calcEndDate.setMonth(calcEndDate.getMonth() + (count * interval));\n break;\n case 'yearly':\n calcEndDate.setFullYear(calcEndDate.getFullYear() + (count * interval));\n break;\n }\n return calcEndDate;\n })();\n \n generatedEvents = EventTypeService.generateEventInstances(\n eventData,\n viewStartDate,\n viewEndDate\n );\n break;\n \n default:\n throw new Error('不支持的事件类型: ' + ((eventData as any).type));\n }\n\n // 批量创建事件\n const createdEvents: CalendarEvent[] = [];\n \n for (const generatedEvent of generatedEvents) {\n const createRequest: CreateEventRequest = {\n title: generatedEvent.title,\n description: generatedEvent.description,\n startTime: toLocalISOString(generatedEvent.startTime),\n endTime: toLocalISOString(generatedEvent.endTime),\n allDay: generatedEvent.allDay,\n location: generatedEvent.location,\n color: generatedEvent.color,\n priority: mapPriorityToEventPriority(generatedEvent.priority),\n };\n\n // 如果是重复事件,添加重复规则\n if (eventData.type === EventType.RECURRING && eventData.recurrence) {\n createRequest.recurrence = {\n ruleType: mapPatternToRecurrenceType(eventData.recurrence.pattern),\n interval: eventData.recurrence.interval,\n endDate: eventData.recurrence.endDate,\n count: eventData.recurrence.count,\n };\n }\n\n const response = await fetch('/api/calendar/events', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(createRequest),\n });\n\n if (!response.ok) {\n throw new Error('创建事件实例失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '创建事件实例失败');\n }\n\n const newEvent: CalendarEvent = {\n ...data.data,\n startTime: new Date(data.data.startTime),\n endTime: new Date(data.data.endTime),\n createdAt: new Date(data.data.createdAt),\n updatedAt: new Date(data.data.updatedAt),\n };\n\n createdEvents.push(newEvent);\n }\n\n // 更新本地状态\n setEvents(prev => [...prev, ...createdEvents]);\n \n return createdEvents;\n } catch (err) {\n console.error('创建增强事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '创建事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 更新事件\n const updateEvent = useCallback(async (\n eventId: number, \n eventData: Partial<EventFormData>\n ): Promise<CalendarEvent> => {\n setLoading(true);\n setError(undefined);\n \n try {\n const updateRequest: any = {};\n \n if (eventData.title !== undefined) updateRequest.title = eventData.title;\n if (eventData.description !== undefined) updateRequest.description = eventData.description;\n if (eventData.startTime !== undefined) updateRequest.startTime = toLocalISOString(eventData.startTime);\n if (eventData.endTime !== undefined) updateRequest.endTime = toLocalISOString(eventData.endTime);\n if (eventData.allDay !== undefined) updateRequest.allDay = eventData.allDay;\n if (eventData.location !== undefined) updateRequest.location = eventData.location;\n if (eventData.color !== undefined) updateRequest.color = eventData.color;\n\n const response = await fetch('/api/calendar/events/' + (eventId), {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(updateRequest),\n });\n\n if (!response.ok) {\n throw new Error('更新事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '更新事件失败');\n }\n\n // 转换日期字符串为Date对象\n const updatedEvent: CalendarEvent = {\n ...data.data,\n startTime: new Date(data.data.startTime),\n endTime: new Date(data.data.endTime),\n createdAt: new Date(data.data.createdAt),\n updatedAt: new Date(data.data.updatedAt),\n };\n\n // 更新本地状态\n setEvents(prev => prev.map(event => \n event.id === eventId ? updatedEvent : event\n ));\n \n return updatedEvent;\n } catch (err) {\n console.error('更新事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '更新事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 删除事件\n const deleteEvent = useCallback(async (eventId: number, deleteAll = false) => {\n setLoading(true);\n setError(undefined);\n \n try {\n const url = deleteAll \n ? '/api/calendar/events/' + (eventId) + '?deleteAll=true'\n : '/api/calendar/events/' + (eventId);\n\n const response = await fetch(url, {\n method: 'DELETE',\n });\n\n if (!response.ok) {\n throw new Error('删除事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '删除事件失败');\n }\n\n // 更新本地状态\n setEvents(prev => prev.filter(event => event.id !== eventId));\n } catch (err) {\n console.error('删除事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '删除事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 批量删除事件\n const batchDeleteEvents = useCallback(async (eventIds: number[]) => {\n setLoading(true);\n setError(undefined);\n \n try {\n const response = await fetch('/api/calendar/events/batchDelete', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ eventIds }),\n });\n\n if (!response.ok) {\n throw new Error('批量删除事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '批量删除事件失败');\n }\n\n // 更新本地状态\n setEvents(prev => prev.filter(event => !eventIds.includes(event.id)));\n } catch (err) {\n console.error('批量删除事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '批量删除事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 更新事件时间(专门用于拖拽)\n const updateEventTime = useCallback(async (\n eventId: number, \n newStartTime: Date, \n newEndTime: Date\n ): Promise<void> => {\n setLoading(true);\n setError(undefined);\n \n console.log('🔄 updateEventTime 调用:', {\n eventId,\n newStartTime: newStartTime.toISOString(),\n newEndTime: newEndTime.toISOString(),\n localStartTime: toLocalISOString(newStartTime),\n localEndTime: toLocalISOString(newEndTime)\n });\n \n try {\n const updateRequest = {\n startTime: toLocalISOString(newStartTime),\n endTime: toLocalISOString(newEndTime),\n };\n\n console.log('📤 发送API请求:', updateRequest);\n\n const response = await fetch('/api/calendar/events/' + (eventId), {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(updateRequest),\n });\n\n if (!response.ok) {\n throw new Error('更新事件时间失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n console.log('📥 API响应:', data);\n \n if (!data.success) {\n throw new Error(data.error || '更新事件时间失败');\n }\n\n console.log('🔄 API返回的事件数据:', {\n originalStartTime: data.data.startTime,\n originalEndTime: data.data.endTime,\n parsedStartTime: new Date(data.data.startTime).toISOString(),\n parsedEndTime: new Date(data.data.endTime).toISOString()\n });\n\n // 转换日期字符串为Date对象\n const updatedEvent: CalendarEvent = {\n ...data.data,\n startTime: new Date(data.data.startTime),\n endTime: new Date(data.data.endTime),\n createdAt: new Date(data.data.createdAt),\n updatedAt: new Date(data.data.updatedAt),\n };\n\n console.log('✅ 更新后的事件对象:', {\n id: updatedEvent.id,\n title: updatedEvent.title,\n startTime: updatedEvent.startTime.toISOString(),\n endTime: updatedEvent.endTime.toISOString(),\n localStartDate: formatDate(updatedEvent.startTime),\n localEndDate: formatDate(updatedEvent.endTime)\n });\n\n // 更新本地状态\n setEvents(prev => {\n const oldEvent = prev.find(e => e.id === eventId);\n const newEvents = prev.map(event => \n event.id === eventId ? updatedEvent : event\n );\n \n console.log('🔄 updateEventTime 本地状态更新:', {\n eventId,\n oldEventDate: oldEvent ? formatDate(oldEvent.startTime) : 'not found',\n newEventDate: formatDate(updatedEvent.startTime),\n totalEventsBefore: prev.length,\n totalEventsAfter: newEvents.length,\n eventFound: !!oldEvent\n });\n \n return newEvents;\n });\n } catch (err) {\n console.error('更新事件时间失败:', err);\n const errorMessage = err instanceof Error ? err.message : '更新事件时间失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n return {\n events,\n loading,\n error,\n createEvent,\n createEnhancedEvent,\n updateEvent,\n updateEventTime,\n deleteEvent,\n batchDeleteEvents,\n fetchEvents,\n clearError,\n };\n} ","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { DragEndEvent, DragStartEvent, DragOverEvent } from '@dnd-kit/core';\nimport { CalendarEvent } from '../types';\nimport { formatDate, isSameDay } from '../utils/dateUtils';\n\nexport interface DragState {\n isDragging: boolean;\n draggedEvent: CalendarEvent | null;\n dragOverDate: Date | null;\n previewTime: string | null;\n}\n\nexport interface UseEventDragReturn {\n dragState: DragState;\n handleDragStart: (event: DragStartEvent) => void;\n handleDragOver: (event: DragOverEvent) => void;\n handleDragEnd: (event: DragEndEvent) => void;\n resetDragState: () => void;\n}\n\n/**\n * 事件拖拽Hook\n * \n * 提供事件拖拽功能,支持:\n * - 拖拽事件到不同日期\n * - 拖拽时显示预览信息\n * - 拖拽状态管理\n */\nexport function useEventDrag(\n events: CalendarEvent[],\n onEventUpdate: (eventId: number, newStartTime: Date, newEndTime: Date) => Promise<void>\n): UseEventDragReturn {\n \n const [dragState, setDragState] = useState<DragState>({\n isDragging: false,\n draggedEvent: null,\n dragOverDate: null,\n previewTime: null,\n });\n\n // 处理拖拽开始\n const handleDragStart = useCallback((event: DragStartEvent) => {\n const eventId = parseInt(event.active.id as string);\n const draggedEvent = events.find(e => e.id === eventId);\n \n console.log('🎯 拖拽开始:', {\n activeId: event.active.id,\n eventId,\n draggedEvent: draggedEvent ? {\n id: draggedEvent.id,\n title: draggedEvent.title,\n originalStartTime: draggedEvent.startTime,\n originalDate: formatDate(new Date(draggedEvent.startTime))\n } : null\n });\n \n if (draggedEvent) {\n setDragState({\n isDragging: true,\n draggedEvent,\n dragOverDate: null,\n previewTime: null,\n });\n }\n }, [events]);\n\n // 处理拖拽悬停\n const handleDragOver = useCallback((event: DragOverEvent) => {\n const { over } = event;\n \n console.log('🔍 拖拽悬停:', {\n overId: over?.id,\n hasOver: !!over,\n hasDraggedEvent: !!dragState.draggedEvent\n });\n \n if (over && dragState.draggedEvent) {\n const targetDateStr = over.id as string;\n \n console.log('📅 解析目标日期:', {\n targetDateStr,\n startsWithDate: targetDateStr.startsWith('date-')\n });\n \n // 解析目标日期 (格式: \"date-2024-12-28\")\n if (targetDateStr.startsWith('date-')) {\n const dateStr = targetDateStr.replace('date-', '');\n // 使用本地时区解析日期,避免时区偏移\n const parts = dateStr.split('-').map(Number);\n const year = parts[0];\n const month = parts[1];\n const day = parts[2];\n\n if (year !== undefined && month !== undefined && day !== undefined) {\n const targetDate = new Date(year, month - 1, day);\n \n console.log('🗓️ 日期解析结果:', {\n dateStr,\n parsedComponents: { year, month: month - 1, day },\n targetDate: targetDate.toISOString(),\n isValidDate: !isNaN(targetDate.getTime()),\n formattedTargetDate: formatDate(targetDate)\n });\n \n if (!isNaN(targetDate.getTime())) {\n const originalStart = new Date(dragState.draggedEvent.startTime);\n const originalEnd = new Date(dragState.draggedEvent.endTime);\n \n // 计算新的开始和结束时间,保持原有的时间部分\n const newStartTime = new Date(targetDate);\n newStartTime.setHours(originalStart.getHours(), originalStart.getMinutes(), originalStart.getSeconds(), originalStart.getMilliseconds());\n \n const duration = originalEnd.getTime() - originalStart.getTime();\n const newEndTime = new Date(newStartTime.getTime() + duration);\n \n // 生成预览时间文本\n const previewTime = dragState.draggedEvent.allDay \n ? '全天'\n : (formatTime(newStartTime)) + ' - ' + (formatTime(newEndTime));\n \n console.log('⏰ 计算新时间:', {\n originalStart: dragState.draggedEvent.startTime,\n originalEnd: dragState.draggedEvent.endTime,\n newStartTime: newStartTime.toISOString(),\n newEndTime: newEndTime.toISOString(),\n duration: duration / (1000 * 60), // 转换为分钟\n previewTime\n });\n \n setDragState(prev => ({\n ...prev,\n dragOverDate: targetDate,\n previewTime,\n }));\n }\n }\n }\n }\n }, [dragState.draggedEvent]);\n\n // 处理拖拽结束\n const handleDragEnd = useCallback(async (event: DragEndEvent) => {\n const { over } = event;\n \n console.log('🎯 拖拽结束:', {\n overId: over?.id,\n hasOver: !!over,\n hasDraggedEvent: !!dragState.draggedEvent,\n hasDragOverDate: !!dragState.dragOverDate,\n dragOverDate: dragState.dragOverDate ? formatDate(dragState.dragOverDate) : null\n });\n \n if (over && dragState.draggedEvent && dragState.dragOverDate) {\n const originalStart = new Date(dragState.draggedEvent.startTime);\n const originalEnd = new Date(dragState.draggedEvent.endTime);\n const targetDate = dragState.dragOverDate;\n \n // 检查是否真的移动到了不同的日期\n const isSameDayResult = isSameDay(originalStart, targetDate);\n console.log('📊 日期比较:', {\n originalDate: formatDate(originalStart),\n targetDate: formatDate(targetDate),\n isSameDay: isSameDayResult\n });\n \n if (!isSameDayResult) {\n try {\n // 计算新的开始和结束时间,保持原有的时间部分\n const newStartTime = new Date(targetDate);\n newStartTime.setHours(originalStart.getHours(), originalStart.getMinutes(), originalStart.getSeconds(), originalStart.getMilliseconds());\n \n const duration = originalEnd.getTime() - originalStart.getTime();\n const newEndTime = new Date(newStartTime.getTime() + duration);\n \n // 调用更新函数\n console.log('✅ 执行拖拽更新事件:', {\n eventId: dragState.draggedEvent.id,\n originalDate: formatDate(originalStart),\n targetDate: formatDate(targetDate),\n originalStartTime: originalStart.toISOString(),\n originalEndTime: originalEnd.toISOString(),\n newStartTime: newStartTime.toISOString(),\n newEndTime: newEndTime.toISOString(),\n duration: duration / (1000 * 60) // 分钟\n });\n await onEventUpdate(dragState.draggedEvent.id, newStartTime, newEndTime);\n } catch (error) {\n console.error('❌ 拖拽更新事件失败:', error);\n // 这里可以显示错误提示\n }\n } else {\n console.log('⚠️ 跳过更新 - 日期相同或条件不满足');\n }\n } else {\n console.log('⚠️ 拖拽结束但缺少必要条件:', {\n hasOver: !!over,\n hasDraggedEvent: !!dragState.draggedEvent,\n hasDragOverDate: !!dragState.dragOverDate\n });\n }\n \n // 重置拖拽状态\n console.log('🔄 重置拖拽状态');\n resetDragState();\n }, [dragState.draggedEvent, dragState.dragOverDate, onEventUpdate]);\n\n // 重置拖拽状态\n const resetDragState = useCallback(() => {\n setDragState({\n isDragging: false,\n draggedEvent: null,\n dragOverDate: null,\n previewTime: null,\n });\n }, []);\n\n return {\n dragState,\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n resetDragState,\n };\n}\n\n// 辅助函数:格式化时间\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString('zh-CN', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n });\n} ","/**\n * 日历导出服务\n * \n * 提供日历事件的导出功能,支持多种格式:\n * - iCal (.ics) 格式\n * - JSON 格式\n * - CSV 格式\n */\n\nimport { CalendarEvent } from '../types';\n\nexport interface ExportOptions {\n format: 'ical' | 'json' | 'csv';\n dateRange?: {\n start: Date;\n end: Date;\n };\n includeCompleted?: boolean;\n}\n\nexport class CalendarExportService {\n /**\n * 导出事件到指定格式\n */\n static async exportEvents(events: CalendarEvent[], options: ExportOptions): Promise<string> {\n switch (options.format) {\n case 'ical':\n return this.exportToICal(events);\n case 'json':\n return this.exportToJSON(events);\n case 'csv':\n return this.exportToCSV(events);\n default:\n throw new Error('不支持的导出格式: ' + (options.format));\n }\n }\n\n /**\n * 导出为 iCal (.ics) 格式\n */\n private static exportToICal(events: CalendarEvent[]): string {\n const lines: string[] = [];\n \n // iCal 文件头\n lines.push('BEGIN:VCALENDAR');\n lines.push('VERSION:2.0');\n lines.push('PRODID:-//Profile-v1//Calendar Module//CN');\n lines.push('CALSCALE:GREGORIAN');\n lines.push('METHOD:PUBLISH');\n \n // 导出每个事件\n events.forEach(event => {\n lines.push('BEGIN:VEVENT');\n lines.push('UID:' + (event.id) + '@profile-v1.calendar');\n lines.push('DTSTART:' + (this.formatDateTimeToICal(new Date(event.startTime))));\n lines.push('DTEND:' + (this.formatDateTimeToICal(new Date(event.endTime))));\n lines.push('DTSTAMP:' + (this.formatDateTimeToICal(new Date(event.createdAt))));\n lines.push('SUMMARY:' + (this.escapeICalText(event.title)));\n \n if (event.description) {\n lines.push('DESCRIPTION:' + (this.escapeICalText(event.description)));\n }\n \n if (event.location) {\n lines.push('LOCATION:' + (this.escapeICalText(event.location)));\n }\n \n // 优先级\n if (event.priority) {\n const priorityMap: Record<string, string> = {\n 'low': '9',\n 'normal': '5',\n 'high': '1'\n };\n lines.push('PRIORITY:' + (priorityMap[event.priority] || '5'));\n }\n \n // 全天事件\n if (event.allDay) {\n lines.push('X-MICROSOFT-CDO-ALLDAYEVENT:TRUE');\n }\n \n lines.push('END:VEVENT');\n });\n \n // iCal 文件尾\n lines.push('END:VCALENDAR');\n \n return lines.join('\\r\\n');\n }\n\n /**\n * 导出为 JSON 格式\n */\n private static exportToJSON(events: CalendarEvent[]): string {\n const exportData = {\n exportedAt: new Date().toISOString(),\n version: '1.0',\n source: 'Profile-v1 Calendar',\n events: events.map(event => ({\n id: event.id,\n title: event.title,\n description: event.description,\n startTime: event.startTime,\n endTime: event.endTime,\n allDay: event.allDay,\n location: event.location,\n color: event.color,\n priority: event.priority,\n createdAt: event.createdAt,\n updatedAt: event.updatedAt\n }))\n };\n \n return JSON.stringify(exportData, null, 2);\n }\n\n /**\n * 导出为 CSV 格式\n */\n private static exportToCSV(events: CalendarEvent[]): string {\n const headers = [\n 'ID',\n '标题',\n '描述',\n '开始时间',\n '结束时间',\n '全天',\n '地点',\n '颜色',\n '优先级',\n '创建时间',\n '更新时间'\n ];\n \n const rows = events.map(event => [\n event.id,\n this.escapeCSVField(event.title),\n this.escapeCSVField(event.description || ''),\n event.startTime,\n event.endTime,\n event.allDay ? '是' : '否',\n this.escapeCSVField(event.location || ''),\n event.color || '',\n event.priority || '',\n event.createdAt,\n event.updatedAt || ''\n ]);\n \n const csvLines = [headers.join(',')];\n rows.forEach(row => {\n csvLines.push(row.join(','));\n });\n \n return csvLines.join('\\n');\n }\n\n /**\n * 下载导出的文件\n */\n static downloadFile(content: string, filename: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n \n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n \n URL.revokeObjectURL(url);\n }\n\n /**\n * 获导出方法的便捷函数\n */\n static async exportAndDownload(\n events: CalendarEvent[], \n options: ExportOptions,\n filename?: string\n ): Promise<void> {\n const content = await this.exportEvents(events, options);\n \n const defaultFilenames = {\n ical: 'calendar-events.ics',\n json: 'calendar-events.json',\n csv: 'calendar-events.csv'\n };\n \n const mimeTypes = {\n ical: 'text/calendar',\n json: 'application/json',\n csv: 'text/csv'\n };\n \n const finalFilename = filename || defaultFilenames[options.format];\n const mimeType = mimeTypes[options.format];\n \n this.downloadFile(content, finalFilename, mimeType);\n }\n\n /**\n * 格式化日期时间为 iCal 格式\n */\n private static formatDateTimeToICal(date: Date): string {\n return date.toISOString().replace(/[-:]/g, '').replace(/\\.\\d{3}/, '');\n }\n\n /**\n * 转义 iCal 文本\n */\n private static escapeICalText(text: string): string {\n return text\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/;/g, '\\\\;')\n .replace(/,/g, '\\\\,')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '');\n }\n\n /**\n * 转义 CSV 字段\n */\n private static escapeCSVField(field: string): string {\n if (field.includes(',') || field.includes('\"') || field.includes('\\n')) {\n return '\"' + (field.replace(/\"/g, '\"\"')) + '\"';\n }\n return field;\n }\n}\n\nexport default CalendarExportService; ","/**\n * 日历导入服务\n * \n * 提供日历事件的导入功能,支持多种格式:\n * - iCal (.ics) 格式\n * - JSON 格式\n * - CSV 格式\n */\n\nimport { CreateEventRequest } from '../types';\n\nexport interface ImportOptions {\n format: 'ical' | 'json' | 'csv';\n overwriteExisting?: boolean;\n validateEvents?: boolean;\n}\n\nexport interface ImportResult {\n success: boolean;\n importedCount: number;\n errors: string[];\n events: CreateEventRequest[];\n}\n\nexport class CalendarImportService {\n /**\n * 从文件导入事件\n */\n static async importFromFile(file: File, options: ImportOptions): Promise<ImportResult> {\n try {\n const content = await this.readFileContent(file);\n return await this.importFromContent(content, options);\n } catch (error) {\n return {\n success: false,\n importedCount: 0,\n errors: ['读取文件失败: ' + (error instanceof Error ? error.message : '未知错误')],\n events: []\n };\n }\n }\n\n /**\n * 从内容字符串导入事件\n */\n static async importFromContent(content: string, options: ImportOptions): Promise<ImportResult> {\n try {\n let events: CreateEventRequest[] = [];\n \n switch (options.format) {\n case 'ical':\n events = this.parseICalContent(content);\n break;\n case 'json':\n events = this.parseJSONContent(content);\n break;\n case 'csv':\n events = this.parseCSVContent(content);\n break;\n default:\n throw new Error('不支持的导入格式: ' + (options.format));\n }\n\n // 验证事件(如果启用)\n if (options.validateEvents) {\n events = this.validateAndFilterEvents(events);\n }\n\n return {\n success: true,\n importedCount: events.length,\n errors: [],\n events: events\n };\n } catch (error) {\n return {\n success: false,\n importedCount: 0,\n errors: ['解析内容失败: ' + (error instanceof Error ? error.message : '未知错误')],\n events: []\n };\n }\n }\n\n /**\n * 读取文件内容\n */\n private static readFileContent(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => resolve(e.target?.result as string);\n reader.onerror = () => reject(new Error('文件读取失败'));\n reader.readAsText(file);\n });\n }\n\n /**\n * 解析 iCal 内容\n */\n private static parseICalContent(content: string): CreateEventRequest[] {\n const events: CreateEventRequest[] = [];\n const lines = content.split(/\\r?\\n/);\n \n let currentEvent: Partial<CreateEventRequest> | null = null;\n let currentProperty = '';\n \n for (let line of lines) {\n line = line.trim();\n \n if (line === 'BEGIN:VEVENT') {\n currentEvent = {};\n continue;\n }\n \n if (line === 'END:VEVENT') {\n if (currentEvent && currentEvent.title && currentEvent.startTime && currentEvent.endTime) {\n events.push(currentEvent as CreateEventRequest);\n }\n currentEvent = null;\n continue;\n }\n \n if (!currentEvent) continue;\n \n // 处理多行属性\n if (line.startsWith(' ') && currentProperty) {\n continue; // 简化处理,跳过多行属性\n }\n \n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) continue;\n \n const property = line.substring(0, colonIndex);\n const value = line.substring(colonIndex + 1);\n currentProperty = property;\n \n switch (property) {\n case 'SUMMARY':\n currentEvent.title = this.unescapeICalText(value);\n break;\n case 'DESCRIPTION':\n currentEvent.description = this.unescapeICalText(value);\n break;\n case 'DTSTART':\n currentEvent.startTime = this.parseICalDateTime(value);\n break;\n case 'DTEND':\n currentEvent.endTime = this.parseICalDateTime(value);\n break;\n case 'LOCATION':\n currentEvent.location = this.unescapeICalText(value);\n break;\n case 'PRIORITY':\n const priority = this.mapICalPriority(value);\n if (priority) currentEvent.priority = priority as any;\n break;\n }\n }\n \n return events;\n }\n\n /**\n * 解析 JSON 内容\n */\n private static parseJSONContent(content: string): CreateEventRequest[] {\n const data = JSON.parse(content);\n \n // 如果是导出的格式\n if (data.events && Array.isArray(data.events)) {\n return data.events.map((event: any) => ({\n title: event.title,\n description: event.description,\n startTime: event.startTime,\n endTime: event.endTime,\n allDay: event.allDay || false,\n location: event.location,\n color: event.color,\n priority: event.priority\n }));\n }\n \n // 如果是事件数组\n if (Array.isArray(data)) {\n return data.map((event: any) => ({\n title: event.title,\n description: event.description,\n startTime: event.startTime,\n endTime: event.endTime,\n allDay: event.allDay || false,\n location: event.location,\n color: event.color,\n priority: event.priority\n }));\n }\n \n throw new Error('无效的 JSON 格式');\n }\n\n /**\n * 解析 CSV 内容\n */\n private static parseCSVContent(content: string): CreateEventRequest[] {\n const lines = content.split(/\\r?\\n/);\n if (lines.length < 2) {\n throw new Error('CSV 文件必须包含标题行和至少一行数据');\n }\n \n const firstLine = lines[0];\n if (firstLine === undefined) {\n throw new Error('CSV 文件为空');\n }\n \n const headers = this.parseCSVLine(firstLine);\n const events: CreateEventRequest[] = [];\n \n for (let i = 1; i < lines.length; i++) {\n const currentLine = lines[i];\n if (currentLine === undefined) continue;\n \n const line = currentLine.trim();\n if (!line) continue;\n \n const values = this.parseCSVLine(line);\n if (values.length !== headers.length) continue;\n \n const event: Partial<CreateEventRequest> = {};\n \n headers.forEach((header, index) => {\n const value = values[index];\n switch (header.toLowerCase()) {\n case '标题':\n case 'title':\n event.title = value;\n break;\n case '描述':\n case 'description':\n event.description = value;\n break;\n case '开始时间':\n case 'start_time':\n case 'starttime':\n event.startTime = value;\n break;\n case '结束时间':\n case 'end_time':\n case 'endtime':\n event.endTime = value;\n break;\n case '全天':\n case 'all_day':\n case 'allday':\n event.allDay = value === '是' || value === 'true' || value === 'True';\n break;\n case '地点':\n case 'location':\n event.location = value;\n break;\n case '颜色':\n case 'color':\n event.color = value;\n break;\n case '优先级':\n case 'priority':\n event.priority = value as any;\n break;\n }\n });\n \n if (event.title && event.startTime && event.endTime) {\n events.push(event as CreateEventRequest);\n }\n }\n \n return events;\n }\n\n /**\n * 解析 CSV 行\n */\n private static parseCSVLine(line: string): string[] {\n const result: string[] = [];\n let current = '';\n let inQuotes = false;\n \n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n \n if (char === '\"') {\n if (inQuotes && line[i + 1] === '\"') {\n current += '\"';\n i++; // 跳过下一个引号\n } else {\n inQuotes = !inQuotes;\n }\n } else if (char === ',' && !inQuotes) {\n result.push(current);\n current = '';\n } else {\n current += char;\n }\n }\n \n result.push(current);\n return result;\n }\n\n /**\n * 验证和过滤事件\n */\n private static validateAndFilterEvents(events: CreateEventRequest[]): CreateEventRequest[] {\n return events.filter(event => {\n // 基本验证\n if (!event.title || !event.startTime || !event.endTime) {\n return false;\n }\n \n // 时间验证\n const startTime = new Date(event.startTime);\n const endTime = new Date(event.endTime);\n \n if (isNaN(startTime.getTime()) || isNaN(endTime.getTime())) {\n return false;\n }\n \n if (endTime <= startTime) {\n return false;\n }\n \n return true;\n });\n }\n\n /**\n * 解析 iCal 日期时间\n */\n private static parseICalDateTime(value: string): string {\n // 简化处理,支持基本的 iCal 日期时间格式\n if (value.includes('T')) {\n // 有时间的格式:20240315T093000Z\n const dateTime = value.replace(/[^\\d]/g, '');\n if (dateTime.length >= 14) {\n const year = dateTime.substring(0, 4);\n const month = dateTime.substring(4, 6);\n const day = dateTime.substring(6, 8);\n const hour = dateTime.substring(8, 10);\n const minute = dateTime.substring(10, 12);\n const second = dateTime.substring(12, 14);\n return (year) + '-' + (month) + '-' + (day) + 'T' + (hour) + ':' + (minute) + ':' + (second) + '.000Z';\n }\n } else {\n // 只有日期的格式:20240315\n const dateOnly = value.replace(/[^\\d]/g, '');\n if (dateOnly.length >= 8) {\n const year = dateOnly.substring(0, 4);\n const month = dateOnly.substring(4, 6);\n const day = dateOnly.substring(6, 8);\n return (year) + '-' + (month) + '-' + (day) + 'T00:00:00.000Z';\n }\n }\n \n return new Date().toISOString(); // 默认返回当前时间\n }\n\n /**\n * 反转义 iCal 文本\n */\n private static unescapeICalText(text: string): string {\n return text\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\,/g, ',')\n .replace(/\\\\;/g, ';')\n .replace(/\\\\\\\\/g, '\\\\');\n }\n\n /**\n * 映射 iCal 优先级\n */\n private static mapICalPriority(value: string): string | undefined {\n const priority = parseInt(value);\n if (priority >= 1 && priority <= 3) return 'high';\n if (priority >= 4 && priority <= 6) return 'normal';\n if (priority >= 7 && priority <= 9) return 'low';\n return undefined;\n }\n}\n\nexport default CalendarImportService; ","interface RecurrenceRule {\n type: 'daily' | 'weekly' | 'monthly' | 'yearly';\n interval: number; // 重复间隔\n endDate?: string; // 结束日期 (YYYY-MM-DD格式)\n count?: number; // 重复次数\n daysOfWeek?: number[]; // 星期几 (0=周日, 1=周一, ...)\n dayOfMonth?: number; // 月份中的第几天\n weekOfMonth?: number; // 月份中的第几周\n}\n\ninterface RecurringEventInstance {\n startTime: string;\n endTime: string;\n title: string;\n description?: string;\n location?: string;\n color?: string;\n priority?: string;\n allDay: boolean;\n isRecurringInstance: boolean;\n recurrenceId?: string; // 原始事件ID\n instanceDate: string; // 该实例的日期\n}\n\nexport class RecurrenceService {\n /**\n * 根据重复规则生成事件实例\n */\n static generateRecurringInstances(\n baseEvent: {\n title: string;\n description?: string;\n startTime: string;\n endTime: string;\n location?: string;\n color?: string;\n priority?: string;\n allDay: boolean;\n },\n rule: RecurrenceRule,\n startDate: Date,\n endDate: Date,\n eventId?: string\n ): RecurringEventInstance[] {\n const instances: RecurringEventInstance[] = [];\n const baseStart = new Date(baseEvent.startTime);\n const baseEnd = new Date(baseEvent.endTime);\n const duration = baseEnd.getTime() - baseStart.getTime();\n\n let currentDate = new Date(startDate);\n let instanceCount = 0;\n const maxInstances = rule.count || 1000; // 最大实例数限制\n\n // 确保不超过结束日期\n const ruleEndDate = rule.endDate ? new Date(rule.endDate) : endDate;\n const finalEndDate = ruleEndDate < endDate ? ruleEndDate : endDate;\n\n while (currentDate <= finalEndDate && instanceCount < maxInstances) {\n if (this.shouldGenerateInstance(currentDate, baseStart, rule)) {\n const instanceStart = new Date(currentDate);\n instanceStart.setHours(baseStart.getHours(), baseStart.getMinutes(), baseStart.getSeconds());\n \n const instanceEnd = new Date(instanceStart.getTime() + duration);\n\n instances.push({\n startTime: instanceStart.toISOString(),\n endTime: instanceEnd.toISOString(),\n title: baseEvent.title,\n description: baseEvent.description,\n location: baseEvent.location,\n color: baseEvent.color,\n priority: baseEvent.priority,\n allDay: baseEvent.allDay,\n isRecurringInstance: true,\n recurrenceId: eventId,\n instanceDate: currentDate.toISOString().split('T')[0]!,\n });\n\n instanceCount++;\n }\n\n // 移动到下一个可能的日期\n currentDate = this.getNextOccurrence(currentDate, rule);\n \n // 防止无限循环\n if (instanceCount > maxInstances) {\n break;\n }\n }\n\n return instances;\n }\n\n /**\n * 判断是否应该在指定日期生成实例\n */\n private static shouldGenerateInstance(\n date: Date,\n baseDate: Date,\n rule: RecurrenceRule\n ): boolean {\n switch (rule.type) {\n case 'daily':\n const daysDiff = Math.floor((date.getTime() - baseDate.getTime()) / (24 * 60 * 60 * 1000));\n return daysDiff >= 0 && daysDiff % rule.interval === 0;\n\n case 'weekly':\n const weeksDiff = Math.floor((date.getTime() - baseDate.getTime()) / (7 * 24 * 60 * 60 * 1000));\n const sameWeekday = date.getDay() === baseDate.getDay();\n return weeksDiff >= 0 && weeksDiff % rule.interval === 0 && sameWeekday;\n\n case 'monthly':\n const monthsDiff = (date.getFullYear() - baseDate.getFullYear()) * 12 + (date.getMonth() - baseDate.getMonth());\n const sameDayOfMonth = date.getDate() === baseDate.getDate();\n return monthsDiff >= 0 && monthsDiff % rule.interval === 0 && sameDayOfMonth;\n\n case 'yearly':\n const yearsDiff = date.getFullYear() - baseDate.getFullYear();\n const sameMonthAndDay = date.getMonth() === baseDate.getMonth() && date.getDate() === baseDate.getDate();\n return yearsDiff >= 0 && yearsDiff % rule.interval === 0 && sameMonthAndDay;\n\n default:\n return false;\n }\n }\n\n /**\n * 获取下一个重复事件的日期\n */\n private static getNextOccurrence(date: Date, rule: RecurrenceRule): Date {\n const nextDate = new Date(date);\n\n switch (rule.type) {\n case 'daily':\n nextDate.setDate(nextDate.getDate() + rule.interval);\n break;\n\n case 'weekly':\n nextDate.setDate(nextDate.getDate() + (7 * rule.interval));\n break;\n\n case 'monthly':\n nextDate.setMonth(nextDate.getMonth() + rule.interval);\n break;\n\n case 'yearly':\n nextDate.setFullYear(nextDate.getFullYear() + rule.interval);\n break;\n }\n\n return nextDate;\n }\n\n /**\n * 验证重复规则\n */\n static validateRecurrenceRule(rule: RecurrenceRule): string[] {\n const errors: string[] = [];\n\n if (!rule.type) {\n errors.push('重复类型不能为空');\n }\n\n if (!rule.interval || rule.interval < 1) {\n errors.push('重复间隔必须大于0');\n }\n\n if (rule.interval > 365) {\n errors.push('重复间隔不能超过365');\n }\n\n if (rule.endDate && rule.count && rule.count > 0) {\n errors.push('不能同时设置结束日期和重复次数');\n }\n\n if (rule.endDate) {\n const endDate = new Date(rule.endDate);\n if (isNaN(endDate.getTime())) {\n errors.push('结束日期格式不正确');\n } else if (endDate < new Date()) {\n errors.push('结束日期不能早于当前日期');\n }\n }\n\n if (rule.count && (rule.count < 1 || rule.count > 999)) {\n errors.push('重复次数必须在1-999之间');\n }\n\n return errors;\n }\n\n /**\n * 将表单数据转换为重复规则\n */\n static formDataToRecurrenceRule(formData: {\n recurrenceType?: 'daily' | 'weekly' | 'monthly' | 'yearly';\n recurrenceInterval?: number;\n recurrenceEndDate?: string;\n recurrenceCount?: number;\n }): RecurrenceRule | null {\n if (!formData.recurrenceType) {\n return null;\n }\n\n return {\n type: formData.recurrenceType,\n interval: formData.recurrenceInterval || 1,\n endDate: formData.recurrenceEndDate || undefined,\n count: formData.recurrenceCount || undefined,\n };\n }\n\n /**\n * 描述重复规则的文本\n */\n static describeRecurrenceRule(rule: RecurrenceRule): string {\n let description = '';\n\n switch (rule.type) {\n case 'daily':\n description = rule.interval === 1 ? '每天' : '每' + (rule.interval) + '天';\n break;\n case 'weekly':\n description = rule.interval === 1 ? '每周' : '每' + (rule.interval) + '周';\n break;\n case 'monthly':\n description = rule.interval === 1 ? '每月' : '每' + (rule.interval) + '个月';\n break;\n case 'yearly':\n description = rule.interval === 1 ? '每年' : '每' + (rule.interval) + '年';\n break;\n }\n\n if (rule.endDate) {\n description += ',直到' + (rule.endDate);\n } else if (rule.count) {\n description += ',共' + (rule.count) + '次';\n }\n\n return description;\n }\n}\n\n// 导出类型\nexport type { RecurrenceRule, RecurringEventInstance }; ","import { CalendarEvent } from '../types';\n\ninterface ReminderConfig {\n minutes: number; // 提前多少分钟提醒\n type: 'browser' | 'email' | 'sms' | 'sound';\n enabled: boolean;\n}\n\ninterface ScheduledReminder {\n id: string;\n eventId: number;\n eventTitle: string;\n reminderTime: Date;\n config: ReminderConfig;\n status: 'pending' | 'sent' | 'failed';\n}\n\nexport class ReminderService {\n private static reminders: Map<string, ScheduledReminder> = new Map();\n private static notificationPermission: NotificationPermission = 'default';\n\n /**\n * 初始化提醒服务\n */\n static async initialize(): Promise<void> {\n // 请求通知权限\n if ('Notification' in window) {\n this.notificationPermission = await Notification.requestPermission();\n }\n\n // 检查并触发到期的提醒\n this.checkPendingReminders();\n \n // 每分钟检查一次提醒\n setInterval(() => {\n this.checkPendingReminders();\n }, 60000);\n }\n\n /**\n * 为事件创建提醒\n */\n static createReminder(\n event: CalendarEvent,\n reminderMinutes: number,\n reminderType: 'browser' | 'email' | 'sms' | 'sound' = 'browser'\n ): string {\n const reminderId = (event.id) + '_' + (Date.now());\n const eventStart = new Date(event.startTime);\n const reminderTime = new Date(eventStart.getTime() - (reminderMinutes * 60 * 1000));\n\n const reminder: ScheduledReminder = {\n id: reminderId,\n eventId: event.id,\n eventTitle: event.title,\n reminderTime,\n config: {\n minutes: reminderMinutes,\n type: reminderType,\n enabled: true,\n },\n status: 'pending',\n };\n\n this.reminders.set(reminderId, reminder);\n \n // 如果提醒时间已经过了,立即触发\n if (reminderTime <= new Date()) {\n this.triggerReminder(reminder);\n }\n\n return reminderId;\n }\n\n /**\n * 删除提醒\n */\n static deleteReminder(reminderId: string): boolean {\n return this.reminders.delete(reminderId);\n }\n\n /**\n * 删除事件的所有提醒\n */\n static deleteEventReminders(eventId: number): void {\n for (const [id, reminder] of this.reminders.entries()) {\n if (reminder.eventId === eventId) {\n this.reminders.delete(id);\n }\n }\n }\n\n /**\n * 检查并触发到期的提醒\n */\n private static checkPendingReminders(): void {\n const now = new Date();\n \n for (const reminder of this.reminders.values()) {\n if (reminder.status === 'pending' && reminder.reminderTime <= now) {\n this.triggerReminder(reminder);\n }\n }\n }\n\n /**\n * 触发提醒\n */\n private static async triggerReminder(reminder: ScheduledReminder): Promise<void> {\n try {\n switch (reminder.config.type) {\n case 'browser':\n await this.sendBrowserNotification(reminder);\n break;\n case 'email':\n await this.sendEmailReminder(reminder);\n break;\n case 'sms':\n await this.sendSmsReminder(reminder);\n break;\n case 'sound':\n await this.playSoundReminder(reminder);\n break;\n }\n \n reminder.status = 'sent';\n } catch (error) {\n console.error('Failed to send reminder:', error);\n reminder.status = 'failed';\n }\n }\n\n /**\n * 发送浏览器通知\n */\n private static async sendBrowserNotification(reminder: ScheduledReminder): Promise<void> {\n if (this.notificationPermission !== 'granted') {\n throw new Error('Notification permission not granted');\n }\n\n const timeText = this.getTimeText(reminder.config.minutes);\n const notification = new Notification(`📅 事件提醒`, {\n body: (reminder.eventTitle) + '\\n' + (timeText),\n icon: '/favicon.ico',\n tag: reminder.id,\n requireInteraction: true,\n });\n\n // 点击通知时的处理\n notification.onclick = () => {\n window.focus();\n notification.close();\n // 可以添加跳转到日历页面的逻辑\n };\n\n // 自动关闭通知\n setTimeout(() => {\n notification.close();\n }, 10000);\n }\n\n /**\n * 发送邮件提醒\n */\n private static async sendEmailReminder(reminder: ScheduledReminder): Promise<void> {\n // 这里应该调用后端邮件服务API\n console.log('Email reminder would be sent:', reminder);\n \n // 示例API调用\n // const response = await fetch('/api/send-email-reminder', {\n // method: 'POST',\n // headers: { 'Content-Type': 'application/json' },\n // body: JSON.stringify({\n // eventTitle: reminder.eventTitle,\n // reminderMinutes: reminder.config.minutes,\n // }),\n // });\n \n // if (!response.ok) {\n // throw new Error('Failed to send email reminder');\n // }\n }\n\n /**\n * 发送短信提醒\n */\n private static async sendSmsReminder(reminder: ScheduledReminder): Promise<void> {\n // 这里应该调用后端短信服务API\n console.log('SMS reminder would be sent:', reminder);\n \n // 示例API调用\n // const response = await fetch('/api/send-sms-reminder', {\n // method: 'POST',\n // headers: { 'Content-Type': 'application/json' },\n // body: JSON.stringify({\n // eventTitle: reminder.eventTitle,\n // reminderMinutes: reminder.config.minutes,\n // }),\n // });\n \n // if (!response.ok) {\n // throw new Error('Failed to send SMS reminder');\n // }\n }\n\n /**\n * 播放声音提醒\n */\n private static async playSoundReminder(reminder: ScheduledReminder): Promise<void> {\n try {\n // 创建一个简单的提醒音\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n\n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n\n oscillator.frequency.setValueAtTime(800, audioContext.currentTime);\n oscillator.frequency.setValueAtTime(600, audioContext.currentTime + 0.1);\n oscillator.frequency.setValueAtTime(800, audioContext.currentTime + 0.2);\n\n gainNode.gain.setValueAtTime(0.3, audioContext.currentTime);\n gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.5);\n\n oscillator.start(audioContext.currentTime);\n oscillator.stop(audioContext.currentTime + 0.5);\n\n // 显示视觉提醒\n this.showVisualAlert(reminder);\n } catch (error) {\n console.error('Failed to play sound reminder:', error);\n // 降级到视觉提醒\n this.showVisualAlert(reminder);\n }\n }\n\n /**\n * 显示视觉提醒\n */\n private static showVisualAlert(reminder: ScheduledReminder): void {\n const timeText = this.getTimeText(reminder.config.minutes);\n alert('📅 事件提醒\\n\\n' + (reminder.eventTitle) + '\\n' + (timeText));\n }\n\n /**\n * 获取时间描述文本\n */\n private static getTimeText(minutes: number): string {\n if (minutes === 0) {\n return '事件即将开始';\n } else if (minutes < 60) {\n return (minutes) + '分钟后开始';\n } else if (minutes < 1440) {\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return remainingMinutes > 0 \n ? (hours) + '小时' + (remainingMinutes) + '分钟后开始'\n : (hours) + '小时后开始';\n } else {\n const days = Math.floor(minutes / 1440);\n const remainingHours = Math.floor((minutes % 1440) / 60);\n return remainingHours > 0\n ? (days) + '天' + (remainingHours) + '小时后开始'\n : (days) + '天后开始';\n }\n }\n\n /**\n * 获取所有提醒\n */\n static getAllReminders(): ScheduledReminder[] {\n return Array.from(this.reminders.values());\n }\n\n /**\n * 获取事件的提醒\n */\n static getEventReminders(eventId: number): ScheduledReminder[] {\n return Array.from(this.reminders.values()).filter(\n reminder => reminder.eventId === eventId\n );\n }\n\n /**\n * 智能推荐提醒时间\n */\n static getSmartReminderSuggestions(event: CalendarEvent): number[] {\n const suggestions: number[] = [];\n const eventStart = new Date(event.startTime);\n const now = new Date();\n const hoursUntilEvent = (eventStart.getTime() - now.getTime()) / (1000 * 60 * 60);\n\n // 根据事件类型和时间距离智能推荐\n if (event.allDay) {\n // 全天事件:提前更长时间\n suggestions.push(1440, 720, 60); // 1天、12小时、1小时\n } else {\n // 普通事件:根据距离时间推荐\n if (hoursUntilEvent > 24) {\n suggestions.push(1440, 60, 15); // 1天、1小时、15分钟\n } else if (hoursUntilEvent > 2) {\n suggestions.push(60, 30, 15); // 1小时、30分钟、15分钟\n } else {\n suggestions.push(30, 15, 5); // 30分钟、15分钟、5分钟\n }\n }\n\n // 根据优先级调整\n if (event.priority === 'urgent') {\n suggestions.unshift(0); // 紧急事件添加即时提醒\n }\n\n // 去重并排序\n return [...new Set(suggestions)].sort((a, b) => b - a);\n }\n\n /**\n * 批量创建智能提醒\n */\n static createSmartReminders(event: CalendarEvent): string[] {\n const suggestions = this.getSmartReminderSuggestions(event);\n const reminderIds: string[] = [];\n\n // 自动创建推荐的提醒\n suggestions.slice(0, 2).forEach(minutes => { // 只创建前两个推荐\n const reminderId = this.createReminder(event, minutes, 'browser');\n reminderIds.push(reminderId);\n });\n\n return reminderIds;\n }\n}\n\n// 导出类型\nexport type { ReminderConfig, ScheduledReminder }; ","'use client';\n\n/**\n * 检测是否为移动端设备\n */\nexport const isMobileDevice = (): boolean => {\n if (typeof window === 'undefined') return false;\n \n // 检测屏幕宽度\n const isMobileWidth = window.innerWidth <= 768;\n \n // 检测触摸支持\n const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n \n // 检测用户代理\n const isMobileUserAgent = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n );\n \n return isMobileWidth || (isTouchDevice && isMobileUserAgent);\n};\n\n/**\n * 检测是否支持拖拽\n */\nexport const isDragSupported = (): boolean => {\n if (typeof window === 'undefined') return false;\n \n // 移动端禁用拖拽\n if (isMobileDevice()) return false;\n \n // 检测拖拽API支持\n return 'draggable' in document.createElement('div');\n};\n\n/**\n * 响应式Hook - 监听设备类型变化\n */\nimport { useState, useEffect } from 'react';\n\nexport const useDeviceType = () => {\n const [isMobile, setIsMobile] = useState(false);\n const [dragSupported, setDragSupported] = useState(true);\n \n useEffect(() => {\n const checkDevice = () => {\n const mobile = isMobileDevice();\n setIsMobile(mobile);\n setDragSupported(isDragSupported());\n };\n \n checkDevice();\n window.addEventListener('resize', checkDevice);\n \n return () => window.removeEventListener('resize', checkDevice);\n }, []);\n \n return { isMobile, dragSupported };\n}; ","export * from '../types';\nexport * from '../logic';\n\nexport const CALENDAR_MODULE_VERSION = '1.0.0';\nexport const CALENDAR_MODULE_NAME = 'sa2kit/calendar';\n","import React, { useState, useEffect } from 'react';\nimport { clsx } from 'clsx';\n\n// 预设颜色主题\nconst COLOR_THEMES = {\n default: {\n name: '默认主题',\n colors: {\n primary: '#3B82F6', // 蓝色\n secondary: '#10B981', // 绿色\n accent: '#F59E0B', // 黄色\n danger: '#EF4444', // 红色\n purple: '#8B5CF6', // 紫色\n pink: '#EC4899', // 粉色\n indigo: '#6366F1', // 靛蓝\n teal: '#14B8A6', // 青色\n },\n background: {\n calendar: '#FFFFFF',\n cell: '#F9FAFB',\n today: '#EFF6FF',\n weekend: '#F3F4F6',\n otherMonth: '#F9FAFB',\n },\n border: {\n calendar: '#E5E7EB',\n cell: '#E5E7EB',\n today: '#3B82F6',\n },\n text: {\n primary: '#111827',\n secondary: '#6B7280',\n today: '#1D4ED8',\n weekend: '#9CA3AF',\n otherMonth: '#D1D5DB',\n }\n },\n dark: {\n name: '深色主题',\n colors: {\n primary: '#60A5FA',\n secondary: '#34D399',\n accent: '#FBBF24',\n danger: '#F87171',\n purple: '#A78BFA',\n pink: '#F472B6',\n indigo: '#818CF8',\n teal: '#2DD4BF',\n },\n background: {\n calendar: '#1F2937',\n cell: '#374151',\n today: '#1E3A8A',\n weekend: '#374151',\n otherMonth: '#374151',\n },\n border: {\n calendar: '#4B5563',\n cell: '#4B5563',\n today: '#60A5FA',\n },\n text: {\n primary: '#F9FAFB',\n secondary: '#D1D5DB',\n today: '#DBEAFE',\n weekend: '#9CA3AF',\n otherMonth: '#6B7280',\n }\n },\n colorful: {\n name: '彩色主题',\n colors: {\n primary: '#8B5CF6',\n secondary: '#06B6D4',\n accent: '#F59E0B',\n danger: '#EF4444',\n purple: '#8B5CF6',\n pink: '#EC4899',\n indigo: '#6366F1',\n teal: '#14B8A6',\n },\n background: {\n calendar: '#FFFFFF',\n cell: '#FEF3C7',\n today: '#DDD6FE',\n weekend: '#FECACA',\n otherMonth: '#F3F4F6',\n },\n border: {\n calendar: '#D1D5DB',\n cell: '#D1D5DB',\n today: '#8B5CF6',\n },\n text: {\n primary: '#111827',\n secondary: '#6B7280',\n today: '#5B21B6',\n weekend: '#DC2626',\n otherMonth: '#9CA3AF',\n }\n }\n};\n\n// 其他设置选项\nconst WEEK_START_OPTIONS = [\n { value: 0, label: '周日开始' },\n { value: 1, label: '周一开始' },\n];\n\nconst TIME_FORMAT_OPTIONS = [\n { value: '12h', label: '12小时制' },\n { value: '24h', label: '24小时制' },\n];\n\nconst LANGUAGE_OPTIONS = [\n { value: 'zh-CN', label: '简体中文' },\n { value: 'en-US', label: 'English' },\n];\n\ninterface CalendarSettingsProps {\n onSettingsChange?: (settings: CalendarSettings) => void;\n}\n\nexport interface CalendarSettings {\n theme: keyof typeof COLOR_THEMES;\n customColors?: {\n [key: string]: string;\n };\n weekStartsOn: number;\n timeFormat: '12h' | '24h';\n language: string;\n showWeekNumbers: boolean;\n showLunarCalendar: boolean;\n defaultEventDuration: number; // 分钟\n workingHours: {\n start: string;\n end: string;\n };\n}\n\nconst DEFAULT_SETTINGS: CalendarSettings = {\n theme: 'default',\n weekStartsOn: 1,\n timeFormat: '24h',\n language: 'zh-CN',\n showWeekNumbers: false,\n showLunarCalendar: false,\n defaultEventDuration: 60,\n workingHours: {\n start: '09:00',\n end: '18:00',\n },\n};\n\nexport default function CalendarSettings({ onSettingsChange }: CalendarSettingsProps) {\n const [settings, setSettings] = useState<CalendarSettings>(DEFAULT_SETTINGS);\n const [activeTab, setActiveTab] = useState<'theme' | 'general' | 'time'>('theme');\n\n // 从localStorage加载设置\n useEffect(() => {\n const savedSettings = localStorage.getItem('calendar-settings');\n if (savedSettings) {\n try {\n const parsedSettings = JSON.parse(savedSettings);\n setSettings({ ...DEFAULT_SETTINGS, ...parsedSettings });\n } catch (error) {\n console.error('加载日历设置失败:', error);\n }\n }\n }, []);\n\n // 保存设置到localStorage\n const saveSettings = (newSettings: CalendarSettings) => {\n setSettings(newSettings);\n localStorage.setItem('calendar-settings', JSON.stringify(newSettings));\n onSettingsChange?.(newSettings);\n };\n\n // 更新设置\n const updateSettings = (updates: Partial<CalendarSettings>) => {\n const newSettings = { ...settings, ...updates };\n saveSettings(newSettings);\n };\n\n // 重置设置\n const resetSettings = () => {\n saveSettings(DEFAULT_SETTINGS);\n };\n\n // 当前主题\n const currentTheme = COLOR_THEMES[settings.theme];\n\n return (\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200\">\n {/* 标题 */}\n <div className=\"px-6 py-4 border-b border-gray-200\">\n <h2 className=\"text-lg font-semibold text-gray-900\">日历设置</h2>\n <p className=\"text-sm text-gray-600 mt-1\">\n 自定义您的日历外观和行为\n </p>\n </div>\n\n {/* 选项卡 */}\n <div className=\"border-b border-gray-200\">\n <nav className=\"flex space-x-8 px-6\">\n {[\n { key: 'theme', label: '主题样式', icon: '🎨' },\n { key: 'general', label: '常规设置', icon: '⚙️' },\n { key: 'time', label: '时间设置', icon: '⏰' },\n ].map(({ key, label, icon }) => (\n <button\n key={key}\n onClick={() => setActiveTab(key as any)}\n className={clsx('py-4 text-sm font-medium border-b-2 transition-colors', activeTab === key\n ? 'border-blue-500 text-blue-600'\n : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300')}\n >\n <span className=\"mr-2\">{icon}</span>\n {label}\n </button>\n ))}\n </nav>\n </div>\n\n <div className=\"p-6\">\n {/* 主题样式设置 */}\n {activeTab === 'theme' && (\n <div className=\"space-y-6\">\n {/* 预设主题 */}\n <div>\n <h3 className=\"text-md font-medium text-gray-900 mb-4\">预设主题</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n {Object.entries(COLOR_THEMES).map(([key, theme]) => (\n <div\n key={key}\n onClick={() => updateSettings({ theme: key as keyof typeof COLOR_THEMES })}\n className={clsx('p-4 border-2 rounded-lg cursor-pointer transition-all', settings.theme === key\n ? 'border-blue-500 bg-blue-50'\n : 'border-gray-200 hover:border-gray-300')}\n >\n <div className=\"flex items-center justify-between mb-3\">\n <h4 className=\"font-medium text-gray-900\">{theme.name}</h4>\n {settings.theme === key && (\n <svg className=\"w-5 h-5 text-blue-500\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </div>\n \n {/* 颜色预览 */}\n <div className=\"flex space-x-1 mb-3\">\n {Object.values(theme.colors).slice(0, 6).map((color, index) => (\n <div\n key={index}\n className=\"w-6 h-6 rounded-full border border-gray-200\"\n style={{ backgroundColor: color }}\n />\n ))}\n </div>\n \n {/* 日历预览 */}\n <div className=\"text-xs\">\n <div \n className=\"grid grid-cols-7 gap-1 p-2 rounded border\"\n style={{ \n backgroundColor: theme.background.calendar,\n borderColor: theme.border.calendar \n }}\n >\n {['日', '一', '二', '三', '四', '五', '六'].map((day, index) => (\n <div \n key={day}\n className=\"text-center py-1 text-xs\"\n style={{ color: theme.text.secondary }}\n >\n {day}\n </div>\n ))}\n {Array.from({ length: 7 }, (_, index) => (\n <div\n key={index}\n className=\"aspect-square flex items-center justify-center text-xs rounded\"\n style={{\n backgroundColor: index === 3 ? theme.background.today : theme.background.cell,\n color: index === 3 ? theme.text.today : theme.text.primary,\n border: '1px solid ' + (index === 3 ? theme.border.today : theme.border.cell)\n }}\n >\n {index + 1}\n </div>\n ))}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* 自定义颜色 */}\n <div>\n <h3 className=\"text-md font-medium text-gray-900 mb-4\">自定义颜色</h3>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {Object.entries(currentTheme.colors).map(([key, defaultColor]) => (\n <div key={key} className=\"space-y-2\">\n <label className=\"block text-sm font-medium text-gray-700 capitalize\">\n {key === 'primary' ? '主色' : \n key === 'secondary' ? '次要色' : \n key === 'accent' ? '强调色' : \n key === 'danger' ? '危险色' : key}\n </label>\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"color\"\n value={settings.customColors?.[key] || defaultColor}\n onChange={(e) => updateSettings({\n customColors: {\n ...settings.customColors,\n [key]: e.target.value\n }\n })}\n className=\"w-12 h-8 border border-gray-300 rounded cursor-pointer\"\n />\n <input\n type=\"text\"\n value={settings.customColors?.[key] || defaultColor}\n onChange={(e) => updateSettings({\n customColors: {\n ...settings.customColors,\n [key]: e.target.value\n }\n })}\n className=\"flex-1 px-3 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder={defaultColor}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* 常规设置 */}\n {activeTab === 'general' && (\n <div className=\"space-y-6\">\n {/* 一周开始 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 一周开始于\n </label>\n <select\n value={settings.weekStartsOn}\n onChange={(e) => updateSettings({ weekStartsOn: Number(e.target.value) })}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {WEEK_START_OPTIONS.map(option => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* 语言设置 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 语言\n </label>\n <select\n value={settings.language}\n onChange={(e) => updateSettings({ language: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {LANGUAGE_OPTIONS.map(option => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* 显示选项 */}\n <div className=\"space-y-4\">\n <h3 className=\"text-md font-medium text-gray-900\">显示选项</h3>\n \n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={settings.showWeekNumbers}\n onChange={(e) => updateSettings({ showWeekNumbers: e.target.checked })}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">显示周数</span>\n </label>\n\n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={settings.showLunarCalendar}\n onChange={(e) => updateSettings({ showLunarCalendar: e.target.checked })}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">显示农历</span>\n </label>\n </div>\n\n {/* 默认事件时长 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 默认事件时长(分钟)\n </label>\n <input\n type=\"number\"\n min=\"15\"\n max=\"480\"\n step=\"15\"\n value={settings.defaultEventDuration}\n onChange={(e) => updateSettings({ defaultEventDuration: Number(e.target.value) })}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n </div>\n )}\n\n {/* 时间设置 */}\n {activeTab === 'time' && (\n <div className=\"space-y-6\">\n {/* 时间格式 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 时间格式\n </label>\n <select\n value={settings.timeFormat}\n onChange={(e) => updateSettings({ timeFormat: e.target.value as '12h' | '24h' })}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {TIME_FORMAT_OPTIONS.map(option => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* 工作时间 */}\n <div>\n <h3 className=\"text-md font-medium text-gray-900 mb-4\">工作时间</h3>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 开始时间\n </label>\n <input\n type=\"time\"\n value={settings.workingHours.start}\n onChange={(e) => updateSettings({\n workingHours: {\n ...settings.workingHours,\n start: e.target.value\n }\n })}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 结束时间\n </label>\n <input\n type=\"time\"\n value={settings.workingHours.end}\n onChange={(e) => updateSettings({\n workingHours: {\n ...settings.workingHours,\n end: e.target.value\n }\n })}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* 操作按钮 */}\n <div className=\"flex justify-between pt-6 border-t border-gray-200\">\n <button\n onClick={resetSettings}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 rounded-md transition-colors\"\n >\n 重置为默认\n </button>\n \n <div className=\"flex space-x-3\">\n <button\n onClick={() => {\n const dataStr = JSON.stringify(settings, null, 2);\n const dataBlob = new Blob([dataStr], { type: 'application/json' });\n const url = URL.createObjectURL(dataBlob);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'calendar-settings.json';\n link.click();\n URL.revokeObjectURL(url);\n }}\n className=\"px-4 py-2 text-sm font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded-md transition-colors\"\n >\n 导出设置\n </button>\n \n <label className=\"px-4 py-2 text-sm font-medium text-green-600 bg-green-50 hover:bg-green-100 rounded-md transition-colors cursor-pointer\">\n 导入设置\n <input\n type=\"file\"\n accept=\".json\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (event) => {\n try {\n const importedSettings = JSON.parse(event.target?.result as string);\n saveSettings({ ...DEFAULT_SETTINGS, ...importedSettings });\n } catch (error) {\n alert('导入设置失败,请检查文件格式');\n }\n };\n reader.readAsText(file);\n }\n }}\n />\n </label>\n </div>\n </div>\n </div>\n </div>\n );\n} ","'use client';\n\nimport React from 'react';\nimport { useDraggable } from '@dnd-kit/core';\nimport { CalendarEvent } from '../types';\nimport { formatTime } from '../utils/dateUtils';\nimport { useDeviceType } from '../utils/deviceUtils';\nimport { clsx } from 'clsx';\n\ninterface DraggableEventProps {\n event: CalendarEvent;\n isDragging?: boolean;\n className?: string;\n onClick?: () => void;\n children?: React.ReactNode;\n}\n\n/**\n * 可拖拽的事件组件\n * \n * 功能特性:\n * - 支持拖拽移动事件(桌面端)\n * - 移动端禁用拖拽功能\n * - 拖拽时显示半透明效果\n * - 保持原有的点击功能\n * - 响应式设计\n */\nexport const DraggableEvent: React.FC<DraggableEventProps> = ({\n event,\n isDragging = false,\n className = '',\n onClick,\n children\n}) => {\n // 检测设备类型\n const { isMobile, dragSupported } = useDeviceType();\n \n // 只在支持拖拽的设备上启用拖拽功能\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n isDragging: isDragActive,\n } = useDraggable({\n id: event.id.toString(),\n data: {\n event,\n },\n disabled: !dragSupported, // 移动端禁用拖拽\n });\n\n // 计算拖拽时的样式变换\n const style = transform ? {\n transform: 'translate3d(' + (transform.x) + 'px, ' + (transform.y) + 'px, 0)',\n } : undefined;\n\n // 格式化显示时间\n const displayTime = event.allDay \n ? '全天' \n : (formatTime(new Date(event.startTime))) + ' - ' + (formatTime(new Date(event.endTime)));\n\n // 事件颜色映射\n const getEventColorClasses = (color?: string) => {\n switch (color) {\n case 'red':\n return 'bg-red-100 border-red-300 text-red-800 hover:bg-red-200';\n case 'blue':\n return 'bg-blue-100 border-blue-300 text-blue-800 hover:bg-blue-200';\n case 'green':\n return 'bg-green-100 border-green-300 text-green-800 hover:bg-green-200';\n case 'yellow':\n return 'bg-yellow-100 border-yellow-300 text-yellow-800 hover:bg-yellow-200';\n case 'purple':\n return 'bg-purple-100 border-purple-300 text-purple-800 hover:bg-purple-200';\n case 'pink':\n return 'bg-pink-100 border-pink-300 text-pink-800 hover:bg-pink-200';\n case 'indigo':\n return 'bg-indigo-100 border-indigo-300 text-indigo-800 hover:bg-indigo-200';\n case 'gray':\n return 'bg-gray-100 border-gray-300 text-gray-800 hover:bg-gray-200';\n default:\n return 'bg-blue-100 border-blue-300 text-blue-800 hover:bg-blue-200';\n }\n };\n\n // 优先级指示器\n const getPriorityIndicator = (priority: string) => {\n switch (priority) {\n case 'high':\n return <div className=\"w-2 h-2 bg-red-500 rounded-full flex-shrink-0\" title=\"高优先级\" />;\n case 'medium':\n return <div className=\"w-2 h-2 bg-yellow-500 rounded-full flex-shrink-0\" title=\"中优先级\" />;\n case 'low':\n return <div className=\"w-2 h-2 bg-green-500 rounded-full flex-shrink-0\" title=\"低优先级\" />;\n default:\n return null;\n }\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={clsx('group relative rounded border-l-2 px-1 py-0.5 mb-0.5', dragSupported ? 'cursor-grab active:cursor-grabbing' : 'cursor-pointer', 'transition-all duration-150 ease-in-out text-xs', getEventColorClasses(event.color), isDragActive || isDragging ? 'opacity-60 shadow-md z-[40]' : 'opacity-100', className)}\n // 只在支持拖拽时应用拖拽事件监听器\n {...(dragSupported ? listeners : {})}\n {...(dragSupported ? attributes : {})}\n onClick={onClick}\n >\n {/* 拖拽指示器 - 只在桌面端显示 */}\n {dragSupported && (\n <div className=\"absolute top-1 right-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <svg \n className=\"w-3 h-3 text-gray-400\" \n fill=\"currentColor\" \n viewBox=\"0 0 20 20\"\n >\n <path d=\"M7 2a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM7 8a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM7 14a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM13 2a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM13 8a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM13 14a2 2 0 1 0 0 4 2 2 0 0 0 0-4z\" />\n </svg>\n </div>\n )}\n\n {/* 移动端操作提示 */}\n {isMobile && (\n <div className=\"absolute top-1 right-1 opacity-70\">\n <svg \n className=\"w-3 h-3 text-gray-500\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\" \n strokeWidth={2} \n d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" \n />\n </svg>\n </div>\n )}\n\n {/* 事件内容 - 紧凑模式 */}\n <div className=\"flex items-center gap-1\">\n {getPriorityIndicator(event.priority)}\n <span className=\"font-medium truncate flex-1\">\n {event.title}\n </span>\n {!event.allDay && (\n <span className=\"text-xs opacity-60 whitespace-nowrap\">\n {formatTime(new Date(event.startTime))}\n </span>\n )}\n </div>\n\n {/* 自定义子内容 */}\n {children}\n\n {/* 拖拽时的反馈效果 */}\n {isDragActive && (\n <div className=\"absolute inset-0 bg-white bg-opacity-20 rounded-lg pointer-events-none\" />\n )}\n </div>\n );\n};\n\nexport default DraggableEvent; ","'use client';\n\nimport React from 'react';\nimport { useDroppable } from '@dnd-kit/core';\nimport { CalendarEvent } from '../types';\nimport { formatDate, isSameDay, isToday } from '../utils/dateUtils';\nimport DraggableEvent from './DraggableEvent';\nimport { clsx } from 'clsx';\n\ninterface DroppableCalendarCellProps {\n date: Date;\n events: CalendarEvent[];\n isCurrentMonth: boolean;\n isSelected?: boolean;\n dragOverPreview?: string | null;\n onEventClick?: (event: CalendarEvent) => void;\n onDateClick?: (date: Date) => void;\n className?: string;\n disableDrop?: boolean;\n}\n\n/**\n * 可放置的日历单元格组件\n * \n * 功能特性:\n * - 支持拖拽事件到此日期\n * - 显示当前日期的所有事件\n * - 拖拽悬停时显示预览\n * - 响应式设计\n */\nexport const DroppableCalendarCell: React.FC<DroppableCalendarCellProps> = ({\n date,\n events,\n isCurrentMonth,\n isSelected = false,\n dragOverPreview,\n onEventClick,\n onDateClick,\n className = '',\n disableDrop = false\n}) => {\n const dateStr = formatDate(date);\n const dropId = 'date-' + (dateStr);\n \n // 只在支持拖拽时启用可放置功能\n const {\n isOver,\n setNodeRef,\n } = useDroppable({\n id: dropId,\n data: {\n date,\n dateStr,\n },\n disabled: disableDrop,\n });\n\n // 调试日志\n if (isOver) {\n console.log('📍 拖拽悬停在单元格:', {\n dropId,\n date: dateStr,\n isCurrentMonth,\n dayOfWeek: date.getDay()\n });\n }\n\n // 获取当前日期的事件\n const dayEvents = events.filter(event => \n isSameDay(new Date(event.startTime), date)\n );\n\n // 样式计算\n const getCellClasses = () => {\n const baseClasses = [\n 'relative w-full h-full p-2',\n 'transition-all duration-200 ease-in-out',\n 'hover:bg-gray-50 cursor-pointer',\n className\n ];\n\n // 当前月份样式\n if (!isCurrentMonth) {\n baseClasses.push('bg-gray-100 text-gray-400');\n }\n\n // 今天的样式\n if (isToday(date)) {\n baseClasses.push('bg-blue-100 ring-2 ring-blue-400 ring-inset');\n }\n\n // 选中日期样式\n if (isSelected) {\n baseClasses.push('ring-2 ring-blue-400 ring-inset');\n }\n\n // 拖拽悬停样式\n if (isOver) {\n baseClasses.push('bg-blue-100 ring-2 ring-blue-300 ring-inset shadow-lg');\n }\n\n return baseClasses.join(' ');\n };\n\n return (\n <div\n ref={disableDrop ? undefined : setNodeRef}\n className={getCellClasses()}\n onClick={() => onDateClick?.(date)}\n >\n {/* 日期数字 */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className={clsx('inline-flex items-center justify-center text-sm font-semibold w-6 h-6', !isCurrentMonth ? 'text-gray-400' : \n (date.getDay() === 0 || date.getDay() === 6) ? 'text-red-600' : 'text-gray-900', isToday(date) ? 'bg-blue-600 text-white rounded-full shadow-md' : '')}>\n {date.getDate()}\n </span>\n \n {/* 事件数量指示器 */}\n {dayEvents.length > 0 && (\n <span className=\"bg-yellow-500 inline-flex items-center justify-center text-sm font-semibold w-6 h-6 border border-white 'bg-blue-600 text-white rounded-full shadow-md\">\n {dayEvents.length}\n </span>\n )}\n </div>\n\n {/* 事件列表 */}\n <div className=\"space-y-1\">\n {dayEvents.slice(0, 3).map((event) => (\n <DraggableEvent\n key={event.id}\n event={event}\n className=\"text-xs\"\n onClick={() => {\n onEventClick?.(event);\n }}\n />\n ))}\n \n {/* 更多事件指示器 */}\n {dayEvents.length > 3 && (\n <div className=\"text-xs text-gray-500 px-2 py-1 bg-gray-100 rounded\">\n +{dayEvents.length - 3} 更多\n </div>\n )}\n </div>\n\n {/* 拖拽预览 */}\n {isOver && dragOverPreview && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-blue-50 bg-opacity-90 rounded-lg border-2 border-dashed border-blue-300\">\n <div className=\"text-center\">\n <div className=\"text-sm font-medium text-blue-600 mb-1\">\n 移动到 {date.getMonth() + 1}/{date.getDate()}\n </div>\n <div className=\"text-xs text-blue-500\">\n {dragOverPreview}\n </div>\n </div>\n </div>\n )}\n\n {/* 新建事件提示 */}\n {isOver && !dragOverPreview && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-green-50 bg-opacity-90 rounded-lg border-2 border-dashed border-green-300\">\n <div className=\"text-center\">\n <div className=\"text-sm font-medium text-green-600\">\n 点击创建事件\n </div>\n <div className=\"text-xs text-green-500\">\n {date.getMonth() + 1}/{date.getDate()}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default DroppableCalendarCell; ","'use client';\n\nimport React, { useState, useMemo } from 'react';\nimport { DndContext, DragOverlay } from '@dnd-kit/core';\nimport { CalendarEvent } from '../types';\nimport { useEventDrag } from '../hooks/useEventDrag';\nimport { useDeviceType } from '../utils/deviceUtils';\nimport { clsx } from 'clsx';\nimport { \n getMonthViewDates, \n formatDate, \n addMonths, \n getMonthName,\n getWeekdayName\n} from '../utils/dateUtils';\nimport DroppableCalendarCell from './DroppableCalendarCell';\nimport DraggableEvent from './DraggableEvent';\n\ninterface DraggableMonthViewProps {\n events: CalendarEvent[];\n currentDate: Date;\n onDateChange: (date: Date) => void;\n onEventClick?: (event: CalendarEvent) => void;\n onDateClick?: (date: Date) => void;\n onEventUpdate: (eventId: number, newStartTime: Date, newEndTime: Date) => Promise<void>;\n className?: string;\n}\n\n/**\n * 支持拖拽的月视图组件\n * \n * 功能特性:\n * - 完整的月视图日历\n * - 事件拖拽功能(桌面端)\n * - 移动端禁用拖拽,优化触摸体验\n * - 拖拽预览和反馈\n * - 月份导航\n * - 响应式设计\n */\nexport const DraggableMonthView: React.FC<DraggableMonthViewProps> = ({\n events,\n currentDate,\n onDateChange,\n onEventClick,\n onDateClick,\n onEventUpdate,\n className = ''\n}) => {\n const [selectedDate, setSelectedDate] = useState<Date | null>(null);\n \n // 检测设备类型\n const { isMobile, dragSupported } = useDeviceType();\n\n // 使用拖拽Hook - 移动端禁用\n const {\n dragState,\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n } = useEventDrag(events, dragSupported ? onEventUpdate : async () => {});\n\n // 获取月份的所有日期\n const monthDays = useMemo(() => {\n const dates = getMonthViewDates(currentDate);\n return dates.map(date => ({\n date,\n isCurrentMonth: date.getMonth() === currentDate.getMonth()\n }));\n }, [currentDate]);\n\n // 周标题 - 基于实际日期生成,确保与日期网格匹配\n const weekDays = useMemo(() => {\n return monthDays.slice(0, 7).map(dayData => \n getWeekdayName(dayData.date, 'zh-CN', 'short')\n );\n }, [monthDays]);\n\n // 月份导航\n const goToPreviousMonth = () => {\n onDateChange(addMonths(currentDate, -1));\n };\n\n const goToNextMonth = () => {\n onDateChange(addMonths(currentDate, 1));\n };\n\n const goToToday = () => {\n onDateChange(new Date());\n };\n\n // 处理日期点击\n const handleDateClick = (date: Date) => {\n setSelectedDate(date);\n onDateClick?.(date);\n };\n\n // 日历内容渲染\n const renderCalendarContent = () => (\n <div className=\"overflow-hidden border border-gray-300 rounded-lg\">\n <table className=\"w-full table-fixed border-collapse\">\n {/* 周标题 */}\n <thead>\n <tr className=\"bg-gradient-to-r from-gray-50 to-gray-100 border-b-2 border-gray-300\">\n {weekDays.map((day, index) => (\n <th \n key={day} \n className={clsx('p-2 sm:p-3 text-center text-sm font-bold border-r border-gray-300 last:border-r-0', index === 5 || index === 6 ? 'text-red-600 bg-red-50' : 'text-gray-800')}\n >\n {day}\n </th>\n ))}\n </tr>\n </thead>\n \n {/* 日历网格 - 按周分组 */}\n <tbody>\n {Array.from({ length: 6 }, (_, weekIndex) => (\n <tr key={weekIndex}>\n {Array.from({ length: 7 }, (_, dayIndex) => {\n const dateIndex = weekIndex * 7 + dayIndex;\n const dayData = monthDays[dateIndex];\n \n if (!dayData) {\n return (\n <td key={dayIndex} className=\"h-24 sm:h-32 border-b border-gray-300 border-r border-gray-300 last:border-r-0 bg-gray-100\"></td>\n );\n }\n \n const isWeekend = dayData.date.getDay() === 0 || dayData.date.getDay() === 6;\n \n return (\n <td\n key={dayIndex}\n className={clsx('h-24 sm:h-32 border-b border-gray-300 border-r border-gray-300 last:border-r-0 relative', isWeekend ? 'bg-red-50' : 'bg-white', 'hover:bg-blue-50 transition-colors')}\n >\n <DroppableCalendarCell\n date={dayData.date}\n events={events}\n isCurrentMonth={dayData.isCurrentMonth}\n isSelected={selectedDate ? formatDate(selectedDate) === formatDate(dayData.date) : false}\n dragOverPreview={dragSupported ? dragState.previewTime : null}\n onEventClick={onEventClick}\n onDateClick={handleDateClick}\n className=\"h-full border-0\"\n disableDrop={!dragSupported} // 移动端禁用放置\n />\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n\n return (\n <div className={clsx('bg-white rounded-lg shadow-sm', className)}>\n {/* 月份标题和导航 */}\n <div className=\"flex items-center justify-between p-4 border-b\">\n <div className=\"flex items-center space-x-4\">\n <h2 className=\"text-lg sm:text-xl font-semibold text-gray-900\">\n {currentDate.getFullYear()}年{getMonthName(currentDate)}\n </h2>\n <button\n onClick={goToToday}\n className=\"px-3 py-1 text-sm bg-blue-100 text-blue-600 rounded hover:bg-blue-200 transition-colors\"\n >\n 今天\n </button>\n {/* 移动端提示 */}\n {isMobile && (\n <span className=\"text-xs text-gray-500 bg-gray-100 px-2 py-1 rounded\">\n 点击事件编辑\n </span>\n )}\n </div>\n \n <div className=\"flex items-center space-x-2\">\n <button\n onClick={goToPreviousMonth}\n className=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\"\n title=\"上个月\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <button\n onClick={goToNextMonth}\n className=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\"\n title=\"下个月\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* 日历内容 - 桌面端支持拖拽,移动端仅显示 */}\n {dragSupported ? (\n <DndContext\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n >\n {renderCalendarContent()}\n\n {/* 拖拽覆盖层 */}\n <DragOverlay>\n {dragState.isDragging && dragState.draggedEvent && (\n <div className=\"transform rotate-1 scale-105 pointer-events-none\">\n <DraggableEvent\n event={dragState.draggedEvent}\n isDragging={true}\n className=\"shadow-lg border border-blue-400 bg-opacity-90\"\n />\n </div>\n )}\n </DragOverlay>\n </DndContext>\n ) : (\n renderCalendarContent()\n )}\n\n {/* 拖拽状态指示器 - 仅桌面端 */}\n {dragSupported && dragState.isDragging && (\n <div className=\"fixed bottom-4 right-4 bg-blue-600 text-white px-4 py-2 rounded-lg shadow-lg z-[50]\">\n <div className=\"flex items-center space-x-2\">\n <svg className=\"w-4 h-4 animate-pulse\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M10 12a2 2 0 100-4 2 2 0 000 4z\" />\n <path fillRule=\"evenodd\" d=\"M.458 10C1.732 5.943 5.522 3 10 3s8.268 2.943 9.542 7c-1.274 4.057-5.064 7-9.542 7S1.732 14.057.458 10zM14 10a4 4 0 11-8 0 4 4 0 018 0z\" clipRule=\"evenodd\" />\n </svg>\n <span className=\"text-sm\">\n 拖拽 \"{dragState.draggedEvent?.title}\" 到目标日期\n </span>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default DraggableMonthView; ","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { EventFormData, EventColor, EventPriority, RecurrenceType } from '../types';\nimport { clsx } from 'clsx';\n\ninterface EventFormProps {\n /** 初始事件数据(编辑模式) */\n initialData?: Partial<EventFormData>;\n /** 是否为编辑模式 */\n isEdit?: boolean;\n /** 表单提交回调 */\n onSubmit: (data: EventFormData) => void;\n /** 取消回调 */\n onCancel: () => void;\n /** 是否正在加载 */\n loading?: boolean;\n}\n\n/**\n * 事件表单组件\n * \n * 用于创建和编辑日历事件的表单组件\n * 支持基本信息、重复规则、提醒设置等功能\n */\nexport default function EventForm({\n initialData,\n isEdit = false,\n onSubmit,\n onCancel,\n loading = false\n}: EventFormProps) {\n // 表单状态\n const [formData, setFormData] = useState<EventFormData>({\n title: '',\n description: '',\n startTime: new Date(),\n endTime: new Date(Date.now() + 60 * 60 * 1000), // 默认1小时后\n allDay: false,\n location: '',\n color: EventColor.BLUE,\n priority: EventPriority.NORMAL,\n recurrence: undefined,\n reminders: []\n });\n\n // 表单验证错误\n const [errors, setErrors] = useState<Record<string, string>>({});\n\n // 初始化表单数据\n useEffect(() => {\n if (initialData) {\n setFormData(prev => ({\n ...prev,\n ...initialData,\n startTime: initialData.startTime || prev.startTime,\n endTime: initialData.endTime || prev.endTime\n }));\n }\n }, [initialData]);\n\n // 处理输入变化\n const handleInputChange = (field: keyof EventFormData, value: any) => {\n setFormData(prev => ({\n ...prev,\n [field]: value\n }));\n\n // 清除对应字段的错误\n if (errors[field]) {\n setErrors(prev => {\n const newErrors = { ...prev };\n delete newErrors[field];\n return newErrors;\n });\n }\n };\n\n // 表单验证\n const validateForm = (): boolean => {\n const newErrors: Record<string, string> = {};\n\n if (!formData.title.trim()) {\n newErrors.title = '事件标题不能为空';\n }\n\n if (formData.startTime >= formData.endTime) {\n newErrors.endTime = '结束时间必须晚于开始时间';\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n // 处理表单提交\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n \n if (validateForm()) {\n onSubmit(formData);\n }\n };\n\n // 格式化日期时间为本地输入格式\n const formatDateTimeLocal = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n \n return (year) + '-' + (month) + '-' + (day) + 'T' + (hours) + ':' + (minutes);\n };\n\n // 解析本地日期时间\n const parseDateTimeLocal = (value: string): Date => {\n return new Date(value);\n };\n\n // 颜色选项\n const colorOptions = [\n { value: EventColor.BLUE, label: '蓝色', class: 'bg-blue-500' },\n { value: EventColor.GREEN, label: '绿色', class: 'bg-green-500' },\n { value: EventColor.RED, label: '红色', class: 'bg-red-500' },\n { value: EventColor.PURPLE, label: '紫色', class: 'bg-purple-500' },\n { value: EventColor.YELLOW, label: '黄色', class: 'bg-yellow-500' },\n { value: EventColor.PINK, label: '粉色', class: 'bg-pink-500' },\n { value: EventColor.INDIGO, label: '靛蓝', class: 'bg-indigo-500' },\n { value: EventColor.GRAY, label: '灰色', class: 'bg-gray-500' }\n ];\n\n return (\n <div className=\"bg-white rounded-lg shadow-lg p-6 max-w-2xl mx-auto\">\n <div className=\"flex items-center justify-between mb-6\">\n <h2 className=\"text-xl font-semibold text-gray-900\">\n {isEdit ? '编辑事件' : '创建事件'}\n </h2>\n <button\n onClick={onCancel}\n className=\"text-gray-400 hover:text-gray-600 transition-colors\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n {/* 基本信息 */}\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-medium text-gray-900\">基本信息</h3>\n \n {/* 标题 */}\n <div>\n <label htmlFor=\"title\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 事件标题 *\n </label>\n <input\n type=\"text\"\n id=\"title\"\n value={formData.title}\n onChange={(e) => handleInputChange('title', e.target.value)}\n className={clsx('w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500', errors.title ? 'border-red-300' : 'border-gray-300')}\n placeholder=\"请输入事件标题\"\n />\n {errors.title && (\n <p className=\"mt-1 text-sm text-red-600\">{errors.title}</p>\n )}\n </div>\n\n {/* 描述 */}\n <div>\n <label htmlFor=\"description\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 事件描述\n </label>\n <textarea\n id=\"description\"\n rows={3}\n value={formData.description}\n onChange={(e) => handleInputChange('description', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"请输入事件描述(可选)\"\n />\n </div>\n\n {/* 地点 */}\n <div>\n <label htmlFor=\"location\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 地点\n </label>\n <input\n type=\"text\"\n id=\"location\"\n value={formData.location}\n onChange={(e) => handleInputChange('location', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"请输入事件地点(可选)\"\n />\n </div>\n </div>\n\n {/* 时间设置 */}\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-medium text-gray-900\">时间设置</h3>\n \n {/* 全天事件 */}\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"allDay\"\n checked={formData.allDay}\n onChange={(e) => handleInputChange('allDay', e.target.checked)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <label htmlFor=\"allDay\" className=\"ml-2 text-sm text-gray-700\">\n 全天事件\n </label>\n </div>\n\n {/* 开始时间 */}\n <div>\n <label htmlFor=\"startTime\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 开始时间 *\n </label>\n <input\n type={formData.allDay ? 'date' : 'datetime-local'}\n id=\"startTime\"\n value={formData.allDay \n ? formData.startTime.toISOString().split('T')[0]\n : formatDateTimeLocal(formData.startTime)\n }\n onChange={(e) => {\n const newDate = formData.allDay \n ? new Date(e.target.value + 'T00:00:00')\n : parseDateTimeLocal(e.target.value);\n handleInputChange('startTime', newDate);\n }}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n\n {/* 结束时间 */}\n <div>\n <label htmlFor=\"endTime\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 结束时间 *\n </label>\n <input\n type={formData.allDay ? 'date' : 'datetime-local'}\n id=\"endTime\"\n value={formData.allDay \n ? formData.endTime.toISOString().split('T')[0]\n : formatDateTimeLocal(formData.endTime)\n }\n onChange={(e) => {\n const newDate = formData.allDay \n ? new Date(e.target.value + 'T23:59:59')\n : parseDateTimeLocal(e.target.value);\n handleInputChange('endTime', newDate);\n }}\n className={clsx('w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500', errors.endTime ? 'border-red-300' : 'border-gray-300')}\n />\n {errors.endTime && (\n <p className=\"mt-1 text-sm text-red-600\">{errors.endTime}</p>\n )}\n </div>\n </div>\n\n {/* 颜色选择 */}\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-medium text-gray-900\">外观</h3>\n \n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 事件颜色\n </label>\n <div className=\"flex flex-wrap gap-3\">\n {colorOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => handleInputChange('color', option.value)}\n className={clsx('flex items-center px-3 py-2 rounded-lg border-2 transition-all', formData.color === option.value \n ? 'border-blue-500 ring-2 ring-blue-200' \n : 'border-gray-200 hover:border-gray-300')}\n >\n <div className={clsx('w-4 h-4 rounded-full', option.class, 'mr-2')} />\n <span className=\"text-sm text-gray-700\">{option.label}</span>\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* 提交按钮 */}\n <div className=\"flex items-center justify-end gap-3 pt-6 border-t border-gray-200\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n >\n 取消\n </button>\n <button\n type=\"submit\"\n disabled={loading}\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-lg hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {loading ? '保存中...' : (isEdit ? '更新事件' : '创建事件')}\n </button>\n </div>\n </form>\n </div>\n );\n} ","import React from 'react';\nimport { clsx } from 'clsx';\n\ninterface SearchBoxProps {\n searchQuery: string;\n onSearchChange: (query: string) => void;\n placeholder?: string;\n size?: 'small' | 'medium' | 'large';\n}\n\nexport const SearchBox: React.FC<SearchBoxProps> = ({ \n searchQuery, \n onSearchChange, \n placeholder = \"搜索实验项目的标题、描述或标签...\",\n size = 'large'\n}) => {\n // 根据尺寸获取样式\n const getSizeStyles = () => {\n switch (size) {\n case 'small':\n return {\n container: 'h-10',\n input: 'pl-10 pr-10 text-sm',\n icon: 'w-4 h-4',\n iconPosition: 'left-3',\n clearButton: 'right-2 w-6 h-6',\n clearIcon: 'w-3 h-3'\n };\n case 'medium':\n return {\n container: 'h-12',\n input: 'pl-12 pr-12 text-base',\n icon: 'w-5 h-5',\n iconPosition: 'left-3',\n clearButton: 'right-3 w-7 h-7',\n clearIcon: 'w-4 h-4'\n };\n case 'large':\n default:\n return {\n container: 'h-16',\n input: 'pl-6 pr-16 text-lg',\n icon: 'w-6 h-6',\n iconPosition: 'left-6',\n clearButton: 'right-4 w-8 h-8',\n clearIcon: 'w-4 h-4'\n };\n }\n };\n\n const styles = getSizeStyles();\n const isLarge = size === 'large';\n\n return (\n <div className=\"relative group w-full\">\n {/* 搜索输入框 */}\n <input\n type=\"text\"\n placeholder={placeholder}\n value={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n className={clsx(\n 'w-full',\n styles.container,\n styles.input,\n isLarge ? 'border-2 border-gray-200 rounded-2xl shadow-lg' : 'border border-gray-300 rounded-lg shadow-sm',\n 'bg-white focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 hover:border-gray-400',\n isLarge ? 'hover:shadow-xl' : 'hover:shadow-md',\n 'transition-all duration-300 ease-out text-gray-800 placeholder-gray-500',\n isLarge ? 'font-medium' : 'font-normal'\n )}\n />\n\n {/* 清除按钮 */}\n {searchQuery && (\n <button\n onClick={() => onSearchChange('')}\n className={clsx(\n 'absolute top-1/2',\n styles.clearButton,\n 'transform -translate-y-1/2 z-10 group/clear'\n )}\n >\n <div className={clsx(\n styles.clearButton,\n 'flex items-center justify-center rounded-full bg-gray-100 hover:bg-gray-200 transition-all duration-200 group-hover/clear:scale-105'\n )}>\n <svg \n className={clsx(styles.clearIcon, 'text-gray-500 group-hover/clear:text-gray-700')}\n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\" \n strokeWidth={2} \n d=\"M6 18L18 6M6 6l12 12\" \n />\n </svg>\n </div>\n </button>\n )}\n </div>\n );\n}","import type { LoggerAdapter, LogEntry, LogLevel } from './types';\n\n/**\n * 控制台日志适配器\n * 使用 console.info/warn/error 输出日志\n */\nexport class ConsoleLoggerAdapter implements LoggerAdapter {\n private readonly colors = {\n DEBUG: '\\x1b[36m', // Cyan\n INFO: '\\x1b[32m', // Green\n WARN: '\\x1b[33m', // Yellow\n ERROR: '\\x1b[31m', // Red\n RESET: '\\x1b[0m',\n };\n\n log(entry: LogEntry): void {\n const { level, message, timestamp, data, context, error } = entry;\n\n // 构建日志消息\n let logMessage = '';\n\n // 添加时间戳\n if (timestamp) {\n logMessage += '[' + (this.formatTimestamp(timestamp)) + '] ';\n }\n\n // 添加日志级别\n const levelName = this.getLevelName(level);\n logMessage += (levelName) + ': ';\n\n // 添加上下文\n if (context) {\n logMessage += '[' + (context) + '] ';\n }\n\n // 添加消息\n logMessage += message;\n\n // 根据日志级别选择输出方式\n switch (level) {\n case 0: // DEBUG\n console.debug(this.colorize(logMessage, 'DEBUG'), data || '');\n break;\n case 1: // INFO\n console.info(this.colorize(logMessage, 'INFO'), data || '');\n break;\n case 2: // WARN\n console.warn(this.colorize(logMessage, 'WARN'), data || '');\n break;\n case 3: // ERROR\n console.error(this.colorize(logMessage, 'ERROR'), data || '');\n if (error) {\n console.error(error);\n }\n break;\n }\n }\n\n private formatTimestamp(date: Date): string {\n return date.toISOString();\n }\n\n private getLevelName(level: LogLevel): string {\n const names = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'NONE'];\n return names[level] || 'UNKNOWN';\n }\n\n private colorize(message: string, level: keyof typeof this.colors): string {\n // 只在支持颜色的环境中使用颜色\n if (typeof process !== 'undefined' && process.stdout?.isTTY) {\n return (this.colors[level]) + (message) + (this.colors.RESET);\n }\n return message;\n }\n}\n\n","import type { LogLevel, LogEntry, LoggerConfig, LoggerAdapter } from './types';\nimport { ConsoleLoggerAdapter } from './console-adapter';\n\n/**\n * 统一日志管理类\n */\nexport class Logger {\n private config: Required<LoggerConfig>;\n private adapter: LoggerAdapter;\n private context?: string;\n\n constructor(config?: Partial<LoggerConfig>, context?: string) {\n const isProduction =\n typeof process !== 'undefined' ? process.env.NODE_ENV === 'production' : false;\n\n this.config = {\n minLevel: config?.minLevel ?? (isProduction ? 1 : 0), // INFO in prod, DEBUG in dev\n enableTimestamp: config?.enableTimestamp ?? true,\n enableContext: config?.enableContext ?? true,\n environment: config?.environment ?? (isProduction ? 'production' : 'development'),\n adapter: config?.adapter ?? new ConsoleLoggerAdapter(),\n };\n this.adapter = this.config.adapter;\n this.context = context;\n }\n\n /**\n * 创建带上下文的子 Logger\n */\n createChild(context: string): Logger {\n return new Logger(this.config, context);\n }\n\n /**\n * 调试日志\n */\n debug(message: string, data?: any): void {\n this.log(0, message, data); // LogLevel.DEBUG\n }\n\n /**\n * 信息日志\n */\n info(message: string, data?: any): void {\n this.log(1, message, data); // LogLevel.INFO\n }\n\n /**\n * 警告日志\n */\n warn(message: string, data?: any): void {\n this.log(2, message, data); // LogLevel.WARN\n }\n\n /**\n * 错误日志\n */\n error(message: string, error?: Error | any): void {\n this.log(\n 3, // LogLevel.ERROR\n message,\n error instanceof Error ? undefined : error,\n error instanceof Error ? error : undefined\n );\n }\n\n /**\n * 核心日志方法\n */\n private log(level: LogLevel, message: string, data?: any, error?: Error): void {\n // 检查日志级别\n if (level < this.config.minLevel) {\n return;\n }\n\n // 检查动态调试配置(仅在浏览器环境)\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n const loggerDebug = localStorage.getItem('logger-debug');\n // 如果明确设置为 false,则不输出(但 Error 级别始终输出)\n if (loggerDebug === 'false' && level < 3) {\n // level < ERROR\n return;\n }\n }\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: this.config.enableTimestamp ? new Date() : (undefined as any),\n data,\n context: this.config.enableContext ? this.context : undefined,\n error,\n };\n\n this.adapter.log(entry);\n }\n\n /**\n * 设置日志级别\n */\n setLevel(level: LogLevel): void {\n this.config.minLevel = level;\n }\n\n /**\n * 获取当前日志级别\n */\n getLevel(): LogLevel {\n return this.config.minLevel;\n }\n}\n\n/**\n * 默认全局 Logger 实例\n */\nexport const logger = new Logger();\n\n/**\n * 创建带上下文的 Logger\n */\nexport function createLogger(context: string, config?: Partial<LoggerConfig>): Logger {\n return new Logger(config, context);\n}\n\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n","import * as React from \"react\"\nimport { cva } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', asChild = false, children, ...props }, ref) => {\n if (asChild && React.isValidElement(children)) {\n const childProps = children.props as { className?: string }\n return React.cloneElement(children, {\n ...(props as object),\n className: cn(buttonVariants({ variant, size, className }), childProps.className),\n })\n }\n\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n >\n {children}\n </button>\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-xl border bg-card text-card-foreground shadow\",\n className\n )}\n {...(props as any)}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...(props as any)}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...(props as any)}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...(props as any)} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...(props as any)}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...(props as any)} />\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...(props as any)}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n HTMLLabelElement,\n React.LabelHTMLAttributes<HTMLLabelElement> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <label\n ref={ref}\n className={cn(labelVariants(), className)}\n {...(props as any)}\n />\n))\nLabel.displayName = \"Label\"\n\nexport { Label }\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: {\n value?: T;\n defaultValue: T;\n onChange?: (next: T) => void;\n}) {\n const [internal, setInternal] = React.useState<T>(defaultValue);\n const isControlled = value !== undefined;\n const state = isControlled ? (value as T) : internal;\n\n const setState = React.useCallback(\n (next: T) => {\n if (!isControlled) setInternal(next);\n onChange?.(next);\n },\n [isControlled, onChange]\n );\n\n return [state, setState] as const;\n}\n\nexport function Portal({\n children,\n container,\n}: {\n children: React.ReactNode;\n container?: Element | null;\n}) {\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!mounted) return null;\n return createPortal(children, container ?? document.body);\n}\n\nexport function useOnClickOutside(\n refs: Array<React.RefObject<HTMLElement | null>>,\n handler: (event: MouseEvent | TouchEvent) => void,\n enabled: boolean\n) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const listener = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n const clickedInside = refs.some((ref) => {\n const el = ref.current;\n return el && el.contains(target);\n });\n if (!clickedInside) {\n handler(event);\n }\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [refs, handler, enabled]);\n}\n\nexport function mergeRefs<T>(\n ...refs: Array<React.Ref<T> | undefined>\n): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (!ref) return;\n if (typeof ref === \"function\") {\n ref(value);\n } else {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\nimport { useControllableState } from \"./internal/ui-core\"\n\ninterface TabsContextValue {\n value: string\n setValue: (next: string) => void\n}\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null)\n\ninterface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n}\n\nconst Tabs = ({\n value,\n defaultValue = \"\",\n onValueChange,\n className,\n ...props\n}: TabsProps) => {\n const [current, setCurrent] = useControllableState({\n value,\n defaultValue,\n onChange: onValueChange,\n })\n\n return (\n <TabsContext.Provider value={{ value: current, setValue: setCurrent }}>\n <div className={className} {...(props as any)} />\n </TabsContext.Provider>\n )\n}\n\nconst TabsList = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground\",\n className\n )}\n {...(props as any)}\n />\n))\nTabsList.displayName = \"TabsList\"\n\ninterface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nconst TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n ({ className, value, onClick, ...props }, ref) => {\n const ctx = React.useContext(TabsContext)\n const active = ctx?.value === value\n\n return (\n <button\n ref={ref}\n type=\"button\"\n data-state={active ? \"active\" : \"inactive\"}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active && \"bg-background text-foreground shadow\",\n className\n )}\n onClick={(e) => {\n ctx?.setValue(value)\n onClick?.(e)\n }}\n {...(props as any)}\n />\n )\n }\n)\nTabsTrigger.displayName = \"TabsTrigger\"\n\ninterface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n forceMount?: boolean\n}\n\nconst TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, value, forceMount = false, ...props }, ref) => {\n const ctx = React.useContext(TabsContext)\n const active = ctx?.value === value\n if (!active && !forceMount) return null\n\n return (\n <div\n ref={ref}\n data-state={active ? \"active\" : \"inactive\"}\n hidden={!active && forceMount}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n {...(props as any)}\n />\n )\n }\n)\nTabsContent.displayName = \"TabsContent\"\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface DialogContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n contentRef: React.RefObject<HTMLDivElement>\n}\n\nconst DialogContext = React.createContext<DialogContextValue | null>(null)\n\ninterface DialogProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children: React.ReactNode\n}\n\nconst Dialog = ({ open, defaultOpen = false, onOpenChange, children }: DialogProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n\n return (\n <DialogContext.Provider value={{ open: isOpen, setOpen: setIsOpen, triggerRef, contentRef }}>\n {children}\n </DialogContext.Provider>\n )\n}\n\ninterface TriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n children: React.ReactNode\n}\n\nconst DialogTrigger = React.forwardRef<HTMLButtonElement, TriggerProps>(\n ({ children, onClick, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx) return null\n\n const mergedRef = mergeRefs<HTMLButtonElement>(ctx.triggerRef, ref)\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.setOpen(true)\n onClick?.(e)\n }\n\n return (\n <button ref={mergedRef} type=\"button\" onClick={handleClick} {...(props as any)}>\n {children}\n </button>\n )\n }\n)\nDialogTrigger.displayName = \"DialogTrigger\"\n\nconst DialogPortal = ({ children }: { children: React.ReactNode }) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx?.open) return null\n return <Portal>{children}</Portal>\n}\n\nconst DialogClose = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ onClick, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={(e) => {\n ctx?.setOpen(false)\n onClick?.(e)\n }}\n {...(props as any)}\n />\n )\n})\nDialogClose.displayName = \"DialogClose\"\n\nconst DialogOverlay = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx?.open) return null\n return (\n <div\n ref={ref}\n className={cn(\"fixed inset-0 z-[9999] bg-black/80\", className)}\n {...(props as any)}\n />\n )\n})\nDialogOverlay.displayName = \"DialogOverlay\"\n\nexport interface DialogContentProps extends React.HTMLAttributes<HTMLDivElement> {\n onPointerDownOutside?: (event: PointerEvent) => void\n onEscapeKeyDown?: (event: KeyboardEvent) => void\n showCloseButton?: boolean\n}\n\nconst DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps>(\n ({ className, children, onPointerDownOutside, onEscapeKeyDown, showCloseButton = true, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n const open = !!ctx?.open\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n (evt) => {\n onPointerDownOutside?.(evt as PointerEvent)\n if (!(evt as Event).defaultPrevented) {\n ctx?.setOpen(false)\n }\n },\n open\n )\n\n React.useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return\n onEscapeKeyDown?.(e)\n if (!e.defaultPrevented) {\n ctx?.setOpen(false)\n }\n }\n document.addEventListener(\"keydown\", onKey)\n return () => document.removeEventListener(\"keydown\", onKey)\n }, [ctx, onEscapeKeyDown, open])\n\n if (!ctx || !open) return null\n\n return (\n <DialogPortal>\n <DialogOverlay />\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"fixed left-[50%] top-[50%] z-[10000] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg sm:rounded-lg\",\n className\n )}\n {...(props as any)}\n >\n {children}\n {showCloseButton ? (\n <DialogClose className=\"absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogClose>\n ) : null}\n </div>\n </DialogPortal>\n )\n }\n)\nDialogContent.displayName = \"DialogContent\"\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...(props as any)}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...(props as any)}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h2\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...(props as any)}\n />\n))\nDialogTitle.displayName = \"DialogTitle\"\n\nconst DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nDialogDescription.displayName = \"DialogDescription\"\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\nimport { buttonVariants } from \"./Button\"\nimport {\n Dialog as AlertDialog,\n DialogPortal as AlertDialogPortal,\n DialogOverlay as AlertDialogOverlay,\n DialogTrigger as AlertDialogTrigger,\n DialogContent as AlertDialogContentBase,\n DialogHeader as AlertDialogHeader,\n DialogFooter as AlertDialogFooter,\n DialogTitle as AlertDialogTitle,\n DialogDescription as AlertDialogDescription,\n DialogClose,\n} from \"./Dialog\"\n\nconst AlertDialogContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<typeof AlertDialogContentBase>\n>(({ className, ...props }, ref) => (\n <AlertDialogContentBase\n ref={ref}\n className={cn(\"z-[9999]\", className)}\n {...(props as any)}\n />\n))\nAlertDialogContent.displayName = \"AlertDialogContent\"\n\nconst AlertDialogAction = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ className, ...props }, ref) => (\n <DialogClose\n ref={ref}\n className={cn(buttonVariants(), className)}\n {...(props as any)}\n />\n))\nAlertDialogAction.displayName = \"AlertDialogAction\"\n\nconst AlertDialogCancel = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ className, ...props }, ref) => (\n <DialogClose\n ref={ref}\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className\n )}\n {...(props as any)}\n />\n))\nAlertDialogCancel.displayName = \"AlertDialogCancel\"\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface DropdownMenuContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n contentRef: React.RefObject<HTMLDivElement>\n}\n\nconst DropdownMenuContext = React.createContext<DropdownMenuContextValue | null>(null)\nconst DropdownMenuRadioGroupContext = React.createContext<{\n value?: string\n onValueChange?: (value: string) => void\n} | null>(null)\n\ninterface DropdownMenuProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children: React.ReactNode\n}\n\nconst DropdownMenu = ({ open, defaultOpen = false, onOpenChange, children }: DropdownMenuProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n\n return (\n <DropdownMenuContext.Provider value={{ open: isOpen, setOpen: setIsOpen, triggerRef, contentRef }}>\n {children}\n </DropdownMenuContext.Provider>\n )\n}\n\nconst DropdownMenuTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & { asChild?: boolean; children: React.ReactNode }\n>(({ children, onClick, ...props }, ref) => {\n const ctx = React.useContext(DropdownMenuContext)\n if (!ctx) return null\n\n const mergedRef = mergeRefs<HTMLButtonElement>(ctx.triggerRef, ref)\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.setOpen(!ctx.open)\n onClick?.(e)\n }\n\n return (\n <button ref={mergedRef} type=\"button\" onClick={handleClick} {...(props as any)}>\n {children}\n </button>\n )\n})\nDropdownMenuTrigger.displayName = \"DropdownMenuTrigger\"\n\nconst DropdownMenuGroup = ({ children }: { children: React.ReactNode }) => <>{children}</>\nconst DropdownMenuPortal = ({ children }: { children: React.ReactNode }) => <Portal>{children}</Portal>\nconst DropdownMenuSub = ({ children }: { children: React.ReactNode }) => <>{children}</>\n\nconst DropdownMenuContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { sideOffset?: number }\n>(({ className, sideOffset = 4, style, ...props }, ref) => {\n const ctx = React.useContext(DropdownMenuContext)\n const [pos, setPos] = React.useState({ top: 0, left: 0 })\n const open = !!ctx?.open\n const trigger = ctx?.triggerRef.current ?? null\n\n React.useLayoutEffect(() => {\n if (!trigger) return\n const rect = trigger.getBoundingClientRect()\n setPos({ top: rect.bottom + sideOffset, left: rect.left })\n }, [trigger, sideOffset])\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n () => ctx?.setOpen(false),\n open\n )\n\n if (!ctx || !open || !trigger) return null\n\n return (\n <DropdownMenuPortal>\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\",\n className\n )}\n style={{ position: \"fixed\", top: pos.top, left: pos.left, ...style }}\n {...(props as any)}\n />\n </DropdownMenuPortal>\n )\n})\nDropdownMenuContent.displayName = \"DropdownMenuContent\"\n\ntype SelectEventLike = Event & { preventDefault: () => void; defaultPrevented: boolean }\n\nconst DropdownMenuItem = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & {\n inset?: boolean\n onSelect?: (event: SelectEventLike) => void\n }\n>(({ className, inset, onSelect, onClick, ...props }, ref) => {\n const ctx = React.useContext(DropdownMenuContext)\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\",\n inset && \"pl-8\",\n className\n )}\n onClick={(e) => {\n onSelect?.(e.nativeEvent as SelectEventLike)\n onClick?.(e)\n if (!e.isDefaultPrevented()) {\n ctx?.setOpen(false)\n }\n }}\n {...(props as any)}\n />\n )\n})\nDropdownMenuItem.displayName = \"DropdownMenuItem\"\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & {\n checked?: boolean\n onCheckedChange?: (checked: boolean) => void\n }\n>(({ className, children, checked = false, onCheckedChange, onClick, ...props }, ref) => (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n onClick={(e) => {\n onCheckedChange?.(!checked)\n onClick?.(e)\n }}\n {...(props as any)}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {checked ? <Check className=\"h-4 w-4\" /> : null}\n </span>\n {children}\n </button>\n))\nDropdownMenuCheckboxItem.displayName = \"DropdownMenuCheckboxItem\"\n\nconst DropdownMenuRadioGroup = ({\n value,\n onValueChange,\n children,\n}: {\n value?: string\n onValueChange?: (value: string) => void\n children: React.ReactNode\n}) => (\n <DropdownMenuRadioGroupContext.Provider value={{ value, onValueChange }}>\n {children}\n </DropdownMenuRadioGroupContext.Provider>\n)\n\nconst DropdownMenuRadioItem = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & { value: string }\n>(({ className, children, value, onClick, ...props }, ref) => {\n const radioCtx = React.useContext(DropdownMenuRadioGroupContext)\n const menuCtx = React.useContext(DropdownMenuContext)\n const checked = radioCtx?.value === value\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n onClick={(e) => {\n radioCtx?.onValueChange?.(value)\n onClick?.(e)\n menuCtx?.setOpen(false)\n }}\n {...(props as any)}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {checked ? <Circle className=\"h-2 w-2 fill-current\" /> : null}\n </span>\n {children}\n </button>\n )\n})\nDropdownMenuRadioItem.displayName = \"DropdownMenuRadioItem\"\n\nconst DropdownMenuLabel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", inset && \"pl-8\", className)}\n {...(props as any)}\n />\n))\nDropdownMenuLabel.displayName = \"DropdownMenuLabel\"\n\nconst DropdownMenuSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...(props as any)}\n />\n))\nDropdownMenuSeparator.displayName = \"DropdownMenuSeparator\"\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...(props as any)}\n />\n)\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & { inset?: boolean }\n>(({ className, inset, children, ...props }, ref) => (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none hover:bg-accent\",\n inset && \"pl-8\",\n className\n )}\n {...(props as any)}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </button>\n))\nDropdownMenuSubTrigger.displayName = \"DropdownMenuSubTrigger\"\n\nconst DropdownMenuSubContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg\",\n className\n )}\n {...(props as any)}\n />\n))\nDropdownMenuSubContent.displayName = \"DropdownMenuSubContent\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface PopoverContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n anchorRef: React.RefObject<HTMLSpanElement>\n contentRef: React.RefObject<HTMLDivElement>\n}\n\nconst PopoverContext = React.createContext<PopoverContextValue | null>(null)\n\ninterface PopoverProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children: React.ReactNode\n}\n\nconst Popover = ({ open, defaultOpen = false, onOpenChange, children }: PopoverProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const anchorRef = React.useRef<HTMLSpanElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n\n return (\n <PopoverContext.Provider value={{ open: isOpen, setOpen: setIsOpen, triggerRef, anchorRef, contentRef }}>\n {children}\n </PopoverContext.Provider>\n )\n}\n\ninterface PopoverTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n children: React.ReactNode\n}\n\nconst PopoverTrigger = React.forwardRef<HTMLButtonElement, PopoverTriggerProps>(\n ({ children, onClick, ...props }, ref) => {\n const ctx = React.useContext(PopoverContext)\n if (!ctx) return null\n\n const mergedRef = mergeRefs<HTMLButtonElement>(ctx.triggerRef, ref)\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.setOpen(!ctx.open)\n onClick?.(e)\n }\n\n return (\n <button ref={mergedRef} type=\"button\" onClick={handleClick} {...(props as any)}>\n {children}\n </button>\n )\n }\n)\nPopoverTrigger.displayName = \"PopoverTrigger\"\n\nconst PopoverAnchor = React.forwardRef<HTMLSpanElement, React.HTMLAttributes<HTMLSpanElement>>(\n ({ ...props }, ref) => {\n const ctx = React.useContext(PopoverContext)\n if (!ctx) return null\n\n return (\n <span ref={mergeRefs(ctx.anchorRef, ref)} {...(props as any)} />\n )\n }\n)\nPopoverAnchor.displayName = \"PopoverAnchor\"\n\ninterface PopoverContentProps extends React.HTMLAttributes<HTMLDivElement> {\n align?: \"start\" | \"center\" | \"end\"\n sideOffset?: number\n}\n\nconst PopoverContent = React.forwardRef<HTMLDivElement, PopoverContentProps>(\n ({ className, align = \"center\", sideOffset = 4, style, ...props }, ref) => {\n const ctx = React.useContext(PopoverContext)\n const [position, setPosition] = React.useState({ top: 0, left: 0 })\n const open = !!ctx?.open\n const anchor = ctx?.anchorRef.current ?? ctx?.triggerRef.current ?? null\n\n React.useLayoutEffect(() => {\n if (!anchor) return\n const rect = anchor.getBoundingClientRect()\n let left = rect.left + rect.width / 2\n if (align === \"start\") left = rect.left\n if (align === \"end\") left = rect.right\n setPosition({ top: rect.bottom + sideOffset, left })\n }, [anchor, align, sideOffset])\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n () => ctx?.setOpen(false),\n open\n )\n\n if (!ctx || !open) return null\n\n return (\n <Portal>\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none\",\n className\n )}\n style={{\n position: \"fixed\",\n top: position.top,\n left: position.left,\n transform: align === \"center\" ? \"translateX(-50%)\" : align === \"end\" ? \"translateX(-100%)\" : undefined,\n ...style,\n }}\n {...(props as any)}\n />\n </Portal>\n )\n }\n)\nPopoverContent.displayName = \"PopoverContent\"\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: number\n max?: number\n}\n\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n ({ className, value = 0, max = 100, ...props }, ref) => {\n const safeMax = max <= 0 ? 100 : max\n const safeValue = Math.max(0, Math.min(value, safeMax))\n const percent = (safeValue / safeMax) * 100\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={safeMax}\n aria-valuenow={safeValue}\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-full bg-primary/20\",\n className\n )}\n {...(props as any)}\n >\n <div\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - percent}%)` }}\n />\n </div>\n )\n }\n)\nProgress.displayName = \"Progress\"\n\nexport { Progress }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst ScrollArea = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"relative overflow-auto\", className)}\n {...(props as any)}\n >\n {children}\n </div>\n))\nScrollArea.displayName = \"ScrollArea\"\n\ninterface ScrollBarProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"vertical\" | \"horizontal\"\n}\n\nconst ScrollBar = React.forwardRef<HTMLDivElement, ScrollBarProps>(\n ({ className, orientation = \"vertical\", ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"pointer-events-none absolute\",\n orientation === \"vertical\"\n ? \"right-0 top-0 h-full w-2.5\"\n : \"bottom-0 left-0 h-2.5 w-full\",\n className\n )}\n {...(props as any)}\n />\n )\n)\nScrollBar.displayName = \"ScrollBar\"\n\nexport { ScrollArea, ScrollBar }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface SelectContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n value?: string\n setValue: (value: string) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n contentRef: React.RefObject<HTMLDivElement>\n itemsRef: React.MutableRefObject<Map<string, React.ReactNode>>\n}\n\nconst SelectContext = React.createContext<SelectContextValue | null>(null)\nconst SelectGroupContext = React.createContext<boolean>(false)\n\ninterface SelectProps {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n disabled?: boolean\n children: React.ReactNode\n}\n\nconst Select = ({\n value,\n defaultValue,\n onValueChange,\n open,\n defaultOpen = false,\n onOpenChange,\n disabled = false,\n children,\n}: SelectProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const [currentValue, setCurrentValue] = useControllableState<string | undefined>({\n value,\n defaultValue,\n onChange: (next) => {\n if (next !== undefined) {\n onValueChange?.(next)\n }\n },\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n const itemsRef = React.useRef<Map<string, React.ReactNode>>(new Map())\n\n return (\n <SelectContext.Provider\n value={{\n open: disabled ? false : isOpen,\n setOpen: disabled ? () => undefined : setIsOpen,\n value: currentValue,\n setValue: (next) => {\n if (disabled) return\n setCurrentValue(next)\n setIsOpen(false)\n },\n triggerRef,\n contentRef,\n itemsRef,\n }}\n >\n {children}\n </SelectContext.Provider>\n )\n}\n\nconst SelectGroup = ({ children }: { children: React.ReactNode }) => (\n <SelectGroupContext.Provider value={true}>{children}</SelectGroupContext.Provider>\n)\n\nconst SelectValue = ({\n placeholder,\n children,\n}: {\n placeholder?: React.ReactNode\n children?: React.ReactNode\n}) => {\n const ctx = React.useContext(SelectContext)\n if (!ctx) return null\n if (children) return <>{children}</>\n if (ctx.value && ctx.itemsRef.current.has(ctx.value)) {\n return <>{ctx.itemsRef.current.get(ctx.value)}</>\n }\n return <span className=\"text-muted-foreground\">{placeholder}</span>\n}\n\nconst SelectTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ className, children, onClick, ...props }, ref) => {\n const ctx = React.useContext(SelectContext)\n if (!ctx) return null\n\n return (\n <button\n ref={mergeRefs(ctx.triggerRef, ref)}\n type=\"button\"\n className={cn(\n \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n onClick={(e) => {\n ctx.setOpen(!ctx.open)\n onClick?.(e)\n }}\n {...(props as any)}\n >\n <span>{children}</span>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </button>\n )\n})\nSelectTrigger.displayName = \"SelectTrigger\"\n\nconst SelectScrollUpButton = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...(props as any)}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </div>\n))\nSelectScrollUpButton.displayName = \"SelectScrollUpButton\"\n\nconst SelectScrollDownButton = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...(props as any)}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </div>\n))\nSelectScrollDownButton.displayName = \"SelectScrollDownButton\"\n\nconst SelectContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & {\n position?: \"item-aligned\" | \"popper\"\n }\n>(({ className, children, style, ...props }, ref) => {\n const ctx = React.useContext(SelectContext)\n const [pos, setPos] = React.useState({ top: 0, left: 0, width: 0 })\n const open = !!ctx?.open\n const trigger = ctx?.triggerRef.current ?? null\n\n React.useLayoutEffect(() => {\n if (!trigger) return\n const rect = trigger.getBoundingClientRect()\n setPos({ top: rect.bottom + 4, left: rect.left, width: rect.width })\n }, [trigger])\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n () => ctx?.setOpen(false),\n open\n )\n\n if (!ctx || !open || !trigger) return null\n\n return (\n <Portal>\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"relative z-50 max-h-80 overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n className\n )}\n style={{\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n minWidth: Math.max(pos.width, 128),\n ...style,\n }}\n {...(props as any)}\n >\n <div className=\"p-1\">{children}</div>\n </div>\n </Portal>\n )\n})\nSelectContent.displayName = \"SelectContent\"\n\nconst SelectLabel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...(props as any)}\n />\n))\nSelectLabel.displayName = \"SelectLabel\"\n\ninterface SelectItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nconst SelectItem = React.forwardRef<HTMLButtonElement, SelectItemProps>(\n ({ className, children, value, onClick, ...props }, ref) => {\n const ctx = React.useContext(SelectContext)\n\n React.useEffect(() => {\n if (!ctx) return\n ctx.itemsRef.current.set(value, children)\n return () => {\n ctx.itemsRef.current.delete(value)\n }\n }, [ctx, value, children])\n\n if (!ctx) return null\n\n const selected = ctx.value === value\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n onClick={(e) => {\n ctx.setValue(value)\n onClick?.(e)\n }}\n {...(props as any)}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n {selected ? <Check className=\"h-4 w-4\" /> : null}\n </span>\n <span>{children}</span>\n </button>\n )\n }\n)\nSelectItem.displayName = \"SelectItem\"\n\nconst SelectSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...(props as any)}\n />\n))\nSelectSeparator.displayName = \"SelectSeparator\"\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\"\n decorative?: boolean\n}\n\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <div\n ref={ref}\n role={decorative ? undefined : \"separator\"}\n aria-orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...(props as any)}\n />\n )\n)\nSeparator.displayName = \"Separator\"\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport {\n Dialog as Sheet,\n DialogTrigger as SheetTrigger,\n DialogClose as SheetClose,\n DialogPortal as SheetPortal,\n DialogOverlay as SheetOverlay,\n DialogContent as BaseDialogContent,\n} from \"./Dialog\"\n\nconst sheetVariants = cva(\n \"fixed z-[10000] gap-4 bg-background p-6 shadow-lg transition ease-in-out translate-x-0 translate-y-0\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 left-0 border-b\",\n bottom: \"inset-x-0 bottom-0 left-0 border-t\",\n left: \"inset-y-0 left-0 top-0 h-full w-3/4 border-r sm:max-w-sm\",\n right: \"inset-y-0 right-0 top-0 h-full w-3/4 border-l sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n)\n\ninterface SheetContentProps\n extends Omit<React.ComponentPropsWithoutRef<typeof BaseDialogContent>, \"children\">,\n VariantProps<typeof sheetVariants> {\n children?: React.ReactNode\n}\n\nconst SheetContent = React.forwardRef<HTMLDivElement, SheetContentProps>(\n ({ side = \"right\", className, children, ...props }, ref) => (\n <BaseDialogContent\n ref={ref}\n className={cn(\n \"max-w-none rounded-none\",\n sheetVariants({ side }),\n className\n )}\n showCloseButton={false}\n {...(props as any)}\n >\n <SheetClose className=\"absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetClose>\n {children}\n </BaseDialogContent>\n )\n)\nSheetContent.displayName = \"SheetContent\"\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...(props as any)}\n />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...(props as any)}\n />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h2\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...(props as any)}\n />\n))\nSheetTitle.displayName = \"SheetTitle\"\n\nconst SheetDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nSheetDescription.displayName = \"SheetDescription\"\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...(props as any)}\n />\n )\n})\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal } from \"./internal/ui-core\"\n\nconst TooltipConfigContext = React.createContext<{ delayDuration: number }>({\n delayDuration: 200,\n})\n\ninterface TooltipContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLSpanElement>\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null)\n\nconst TooltipProvider = ({\n children,\n delayDuration = 200,\n}: {\n children: React.ReactNode\n delayDuration?: number\n}) => {\n return (\n <TooltipConfigContext.Provider value={{ delayDuration }}>\n {children}\n </TooltipConfigContext.Provider>\n )\n}\n\nconst Tooltip = ({ children }: { children: React.ReactNode }) => {\n const [open, setOpen] = React.useState(false)\n const triggerRef = React.useRef<HTMLSpanElement>(null)\n return (\n <TooltipContext.Provider value={{ open, setOpen, triggerRef }}>\n {children}\n </TooltipContext.Provider>\n )\n}\n\nconst TooltipTrigger = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement> & { asChild?: boolean; children: React.ReactNode }\n>(({ children, ...props }, ref) => {\n const ctx = React.useContext(TooltipContext)\n const cfg = React.useContext(TooltipConfigContext)\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n if (!ctx) return null\n\n const setRef = mergeRefs(ctx.triggerRef, ref)\n\n const openWithDelay = () => {\n if (timer.current) clearTimeout(timer.current)\n timer.current = setTimeout(() => ctx.setOpen(true), cfg.delayDuration)\n }\n\n const closeNow = () => {\n if (timer.current) clearTimeout(timer.current)\n ctx.setOpen(false)\n }\n\n const shared = {\n onMouseEnter: openWithDelay,\n onMouseLeave: closeNow,\n onFocus: openWithDelay,\n onBlur: closeNow,\n ...props,\n }\n\n return (\n <span ref={setRef} {...(shared as any)}>\n {children}\n </span>\n )\n})\nTooltipTrigger.displayName = \"TooltipTrigger\"\n\nconst TooltipContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { sideOffset?: number }\n>(({ className, sideOffset = 4, style, ...props }, ref) => {\n const ctx = React.useContext(TooltipContext)\n const [pos, setPos] = React.useState({ top: 0, left: 0 })\n const open = !!ctx?.open\n const trigger = ctx?.triggerRef.current ?? null\n\n React.useLayoutEffect(() => {\n if (!trigger) return\n const rect = trigger.getBoundingClientRect()\n setPos({\n top: rect.top - sideOffset,\n left: rect.left + rect.width / 2,\n })\n }, [trigger, sideOffset])\n\n if (!ctx || !open || !trigger) return null\n\n return (\n <Portal>\n <div\n ref={ref}\n className={cn(\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground\",\n className\n )}\n style={{\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n transform: \"translate(-50%, -100%)\",\n ...style,\n }}\n {...(props as any)}\n />\n </Portal>\n )\n})\nTooltipContent.displayName = \"TooltipContent\"\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\ntype AvatarStatus = \"idle\" | \"loaded\" | \"error\"\n\nconst AvatarContext = React.createContext<{\n status: AvatarStatus\n setStatus: (next: AvatarStatus) => void\n} | null>(null)\n\nconst Avatar = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => {\n const [status, setStatus] = React.useState<AvatarStatus>(\"idle\")\n\n return (\n <AvatarContext.Provider value={{ status, setStatus }}>\n <span\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...(props as any)}\n />\n </AvatarContext.Provider>\n )\n})\nAvatar.displayName = \"Avatar\"\n\nconst AvatarImage = React.forwardRef<\n HTMLImageElement,\n React.ImgHTMLAttributes<HTMLImageElement>\n>(({ className, onLoad, onError, ...props }, ref) => {\n const ctx = React.useContext(AvatarContext)\n\n return (\n <img\n ref={ref}\n className={cn(\n \"aspect-square h-full w-full\",\n ctx?.status === \"error\" ? \"hidden\" : undefined,\n className\n )}\n onLoad={(e) => {\n ctx?.setStatus(\"loaded\")\n onLoad?.(e)\n }}\n onError={(e) => {\n ctx?.setStatus(\"error\")\n onError?.(e)\n }}\n {...(props as any)}\n />\n )\n})\nAvatarImage.displayName = \"AvatarImage\"\n\nconst AvatarFallback = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => {\n const ctx = React.useContext(AvatarContext)\n const show = ctx?.status !== \"loaded\"\n\n if (!show) return null\n\n return (\n <span\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n className\n )}\n {...(props as any)}\n />\n )\n})\nAvatarFallback.displayName = \"AvatarFallback\"\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","'use client';\n\nimport React from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from './Dialog';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from './AlertDialog';\nimport { cn } from '@/utils';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n width?: number | string;\n height?: number | string;\n className?: string;\n maskClosable?: boolean;\n children: React.ReactNode;\n zIndex?: number;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n width,\n height,\n className,\n maskClosable = true,\n children,\n zIndex = 50,\n}) => {\n return (\n <Dialog open={isOpen} onOpenChange={(open) => {\n if (!open) {\n if (maskClosable) {\n onClose();\n } else {\n // If maskClosable is false, we don't allow closing via backdrop/ESC\n }\n }\n }}>\n <DialogContent \n className={cn(\"sm:max-w-[425px]\", className) + ' z-[' + (zIndex) + ']'}\n onPointerDownOutside={(e) => {\n if (!maskClosable) e.preventDefault();\n }}\n onEscapeKeyDown={(e) => {\n if (!maskClosable) e.preventDefault();\n }}\n style={{\n ...(width ? { maxWidth: typeof width === 'number' ? `${width}px` : width } : undefined),\n ...(height ? { height: typeof height === 'number' ? `${height}px` : height } : undefined),\n }}\n >\n {title ? (\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n ) : (\n // 无障碍性:始终需要 DialogTitle,使用 sr-only 对视觉隐藏但对屏幕阅读器可见\n <DialogTitle className=\"sr-only\">弹窗</DialogTitle>\n )}\n <div className=\"py-4\">\n {children}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport interface ConfirmModalProps {\n isOpen: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title?: string;\n message: string;\n confirmText?: string;\n cancelText?: string;\n isLoading?: boolean;\n}\n\nexport const ConfirmModal: React.FC<ConfirmModalProps> = ({\n isOpen,\n onClose,\n onConfirm,\n title = \"确认操作\",\n message,\n confirmText = \"确认\",\n cancelText = \"取消\",\n isLoading = false,\n}) => {\n return (\n <AlertDialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n <AlertDialogDescription>{message}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isLoading}>{cancelText}</AlertDialogCancel>\n <AlertDialogAction \n onClick={(e) => {\n e.preventDefault();\n onConfirm();\n }}\n disabled={isLoading}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {isLoading ? \"处理中...\" : confirmText}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n","'use client';\n\nimport React, { useMemo, useState, useCallback } from 'react';\nimport { SearchBox } from '../../components/SearchBox';\nimport { ConfirmModal } from '@/components';\nimport { clsx } from 'clsx';\nimport { \n CalendarEvent, \n EventListProps, \n EventListDisplayMode, \n EventSortField, \n SortDirection, \n EventPriority \n} from '../types';\n\n/**\n * 事件列表组件\n * 支持列表/网格显示模式、排序、批量选择和批量删除\n */\nexport default function EventList({\n events,\n config,\n onConfigChange,\n onEventClick,\n onEventEdit,\n onEventDelete,\n onBatchDelete,\n enableBatchActions = true,\n loading = false,\n className = ''\n}: EventListProps) {\n \n // 批量选择状态\n const [selectedEventIds, setSelectedEventIds] = useState<Set<number>>(new Set());\n const [isSelectionMode, setIsSelectionMode] = useState(false);\n const [showBatchDeleteConfirm, setShowBatchDeleteConfirm] = useState(false);\n const [batchDeleteLoading, setBatchDeleteLoading] = useState(false);\n \n // 排序和过滤事件\n const sortedAndFilteredEvents = useMemo(() => {\n let filteredEvents = [...events];\n \n // 应用过滤条件\n if (config.filter.priority) {\n filteredEvents = filteredEvents.filter(event => event.priority === config.filter.priority);\n }\n \n if (config.filter.color) {\n filteredEvents = filteredEvents.filter(event => event.color === config.filter.color);\n }\n \n if (config.filter.searchText) {\n const searchText = config.filter.searchText.toLowerCase();\n filteredEvents = filteredEvents.filter(event => \n event.title.toLowerCase().includes(searchText) ||\n (event.description && event.description.toLowerCase().includes(searchText)) ||\n (event.location && event.location.toLowerCase().includes(searchText))\n );\n }\n \n if (config.filter.dateRange) {\n filteredEvents = filteredEvents.filter(event => \n event.startTime >= config.filter.dateRange!.startDate &&\n event.startTime <= config.filter.dateRange!.endDate\n );\n }\n \n // 应用排序\n filteredEvents.sort((a, b) => {\n let aValue: any;\n let bValue: any;\n \n switch (config.sort.field) {\n case EventSortField.START_TIME:\n aValue = a.startTime.getTime();\n bValue = b.startTime.getTime();\n break;\n case EventSortField.TITLE:\n aValue = a.title.toLowerCase();\n bValue = b.title.toLowerCase();\n break;\n case EventSortField.PRIORITY:\n const priorityOrder = { \n [EventPriority.URGENT]: 4, \n [EventPriority.HIGH]: 3, \n [EventPriority.NORMAL]: 2, \n [EventPriority.LOW]: 1 \n };\n aValue = priorityOrder[a.priority];\n bValue = priorityOrder[b.priority];\n break;\n case EventSortField.CREATED_AT:\n aValue = a.createdAt.getTime();\n bValue = b.createdAt.getTime();\n break;\n case EventSortField.UPDATED_AT:\n aValue = a.updatedAt.getTime();\n bValue = b.updatedAt.getTime();\n break;\n default:\n aValue = a.startTime.getTime();\n bValue = b.startTime.getTime();\n }\n \n if (aValue < bValue) return config.sort.direction === SortDirection.ASC ? -1 : 1;\n if (aValue > bValue) return config.sort.direction === SortDirection.ASC ? 1 : -1;\n return 0;\n });\n \n return filteredEvents;\n }, [events, config]);\n \n // 分页数据\n const paginatedEvents = useMemo(() => {\n const startIndex = (config.currentPage - 1) * config.pageSize;\n const endIndex = startIndex + config.pageSize;\n return sortedAndFilteredEvents.slice(startIndex, endIndex);\n }, [sortedAndFilteredEvents, config.currentPage, config.pageSize]);\n \n const totalPages = Math.ceil(sortedAndFilteredEvents.length / config.pageSize);\n \n // 批量选择逻辑\n const handleSelectEvent = useCallback((eventId: number, selected: boolean) => {\n setSelectedEventIds(prev => {\n const newSet = new Set(prev);\n if (selected) {\n newSet.add(eventId);\n } else {\n newSet.delete(eventId);\n }\n return newSet;\n });\n }, []);\n \n const handleSelectAll = useCallback((selected: boolean) => {\n if (selected) {\n setSelectedEventIds(new Set(paginatedEvents.map(event => event.id)));\n } else {\n setSelectedEventIds(new Set());\n }\n }, [paginatedEvents]);\n \n const toggleSelectionMode = useCallback(() => {\n setIsSelectionMode(!isSelectionMode);\n setSelectedEventIds(new Set());\n }, [isSelectionMode]);\n \n const exitSelectionMode = useCallback(() => {\n setIsSelectionMode(false);\n setSelectedEventIds(new Set());\n }, []);\n \n // 批量删除处理\n const handleBatchDelete = useCallback(async () => {\n if (!onBatchDelete || selectedEventIds.size === 0) return;\n \n setBatchDeleteLoading(true);\n try {\n await onBatchDelete(Array.from(selectedEventIds));\n setSelectedEventIds(new Set());\n setIsSelectionMode(false);\n setShowBatchDeleteConfirm(false);\n } catch (error) {\n console.error('批量删除失败:', error);\n } finally {\n setBatchDeleteLoading(false);\n }\n }, [onBatchDelete, selectedEventIds]);\n \n // 检查是否全选\n const isAllSelected = useMemo(() => {\n return paginatedEvents.length > 0 && paginatedEvents.every(event => selectedEventIds.has(event.id));\n }, [paginatedEvents, selectedEventIds]);\n \n // 检查是否部分选中\n const isPartiallySelected = useMemo(() => {\n return selectedEventIds.size > 0 && !isAllSelected;\n }, [selectedEventIds.size, isAllSelected]);\n \n // 获取优先级显示\n const getPriorityDisplay = (priority: EventPriority) => {\n switch (priority) {\n case EventPriority.URGENT:\n return { text: '紧急', color: 'bg-red-100 text-red-800 border-red-200' };\n case EventPriority.HIGH:\n return { text: '高', color: 'bg-orange-100 text-orange-800 border-orange-200' };\n case EventPriority.NORMAL:\n return { text: '普通', color: 'bg-blue-100 text-blue-800 border-blue-200' };\n case EventPriority.LOW:\n return { text: '低', color: 'bg-gray-100 text-gray-800 border-gray-200' };\n default:\n return { text: '普通', color: 'bg-gray-100 text-gray-800 border-gray-200' };\n }\n };\n \n // 获取事件颜色类名\n const getEventColorClass = (color: string) => {\n const colorMap: Record<string, string> = {\n '#3B82F6': 'border-blue-500 bg-blue-50',\n '#10B981': 'border-green-500 bg-green-50',\n '#8B5CF6': 'border-purple-500 bg-purple-50',\n '#EF4444': 'border-red-500 bg-red-50',\n '#F59E0B': 'border-yellow-500 bg-yellow-50',\n '#EC4899': 'border-pink-500 bg-pink-50',\n '#6366F1': 'border-indigo-500 bg-indigo-50',\n '#6B7280': 'border-gray-500 bg-gray-50',\n };\n return colorMap[color] || 'border-gray-500 bg-gray-50';\n };\n \n // 处理排序变更\n const handleSortChange = (field: EventSortField) => {\n const newDirection = config.sort.field === field && config.sort.direction === SortDirection.ASC \n ? SortDirection.DESC \n : SortDirection.ASC;\n \n onConfigChange({\n ...config,\n sort: { field, direction: newDirection }\n });\n };\n \n // 处理显示模式切换\n const handleDisplayModeChange = (mode: EventListDisplayMode) => {\n onConfigChange({\n ...config,\n displayMode: mode\n });\n };\n \n // 处理页面变更\n const handlePageChange = (page: number) => {\n onConfigChange({\n ...config,\n currentPage: page\n });\n };\n \n // 处理搜索\n const handleSearchChange = (searchText: string) => {\n onConfigChange({\n ...config,\n filter: {\n ...config.filter,\n searchText\n },\n currentPage: 1 // 重置到第一页\n });\n };\n \n // 渲染排序按钮\n const renderSortButton = (field: EventSortField, label: string) => {\n const isActive = config.sort.field === field;\n const isAsc = isActive && config.sort.direction === SortDirection.ASC;\n \n return (\n <button\n onClick={() => handleSortChange(field)}\n className={clsx('flex items-center px-3 py-1.5 text-sm font-medium rounded-lg transition-colors', isActive ? 'bg-blue-100 text-blue-700' : 'text-gray-600 hover:bg-gray-100')}\n >\n {label}\n <svg \n className={clsx('ml-1 w-4 h-4 transition-transform', isActive ? (isAsc ? 'rotate-180' : '') : 'opacity-50')} \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n );\n };\n \n // 渲染复选框\n const renderCheckbox = (eventId: number) => {\n const isChecked = selectedEventIds.has(eventId);\n \n return (\n <input\n type=\"checkbox\"\n checked={isChecked}\n onChange={(e) => {\n e.stopPropagation();\n handleSelectEvent(eventId, e.target.checked);\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n );\n };\n \n // 渲染全选复选框\n const renderSelectAllCheckbox = () => {\n return (\n <input\n type=\"checkbox\"\n checked={isAllSelected}\n ref={(input) => {\n if (input) input.indeterminate = isPartiallySelected;\n }}\n onChange={(e) => handleSelectAll(e.target.checked)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n );\n };\n \n // 渲染列表模式\n const renderListMode = () => (\n <div className=\"space-y-4\">\n {paginatedEvents.map((event) => {\n const priorityDisplay = getPriorityDisplay(event.priority);\n const isSelected = selectedEventIds.has(event.id);\n \n return (\n <div\n key={event.id}\n className={clsx('p-4 rounded-lg border-l-4 cursor-pointer hover:shadow-md transition-all', getEventColorClass(event.color), isSelected ? 'ring-2 ring-blue-500 ring-opacity-50' : '')}\n onClick={() => !isSelectionMode && onEventClick(event)}\n >\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-start gap-3 flex-1\">\n {/* 选择框 */}\n {isSelectionMode && (\n <div className=\"pt-1\">\n {renderCheckbox(event.id)}\n </div>\n )}\n \n <div className=\"flex-1\">\n <div className=\"flex items-center gap-3 mb-2\">\n <h3 className=\"text-lg font-semibold text-gray-900\">{event.title}</h3>\n <span className={clsx('px-2 py-1 text-xs font-medium rounded border', priorityDisplay.color)}>\n {priorityDisplay.text}\n </span>\n </div>\n \n {event.description && (\n <p className=\"text-gray-600 mb-2 line-clamp-2\">{event.description}</p>\n )}\n \n <div className=\"flex items-center gap-4 text-sm text-gray-500\">\n <div className=\"flex items-center gap-1\">\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <span>\n {event.startTime.toLocaleDateString('zh-CN')} {\n !event.allDay && event.startTime.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })\n }\n </span>\n </div>\n \n {event.location && (\n <div className=\"flex items-center gap-1\">\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <span>{event.location}</span>\n </div>\n )}\n </div>\n </div>\n </div>\n \n {/* 操作按钮 */}\n {!isSelectionMode && (\n <div className=\"flex items-center gap-2 ml-4\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n onEventEdit(event);\n }}\n className=\"p-2 text-gray-400 hover:text-blue-600 hover:bg-blue-50 rounded-lg transition-colors\"\n title=\"编辑事件\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n </button>\n \n <button\n onClick={(e) => {\n e.stopPropagation();\n onEventDelete(event.id);\n }}\n className=\"p-2 text-gray-400 hover:text-red-600 hover:bg-red-50 rounded-lg transition-colors\"\n title=\"删除事件\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n \n // 渲染网格模式\n const renderGridMode = () => (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {paginatedEvents.map((event) => {\n const priorityDisplay = getPriorityDisplay(event.priority);\n const isSelected = selectedEventIds.has(event.id);\n \n return (\n <div\n key={event.id}\n className={clsx('p-4 rounded-lg border cursor-pointer hover:shadow-lg transition-all', getEventColorClass(event.color), 'border-l-4', isSelected ? 'ring-2 ring-blue-500 ring-opacity-50' : '')}\n onClick={() => !isSelectionMode && onEventClick(event)}\n >\n <div className=\"flex items-start justify-between mb-3\">\n {/* 选择框 */}\n {isSelectionMode && (\n <div className=\"pt-1 mr-2\">\n {renderCheckbox(event.id)}\n </div>\n )}\n \n <h3 className=\"text-lg font-semibold text-gray-900 flex-1 pr-2\">{event.title}</h3>\n <span className={clsx('px-2 py-1 text-xs font-medium rounded border flex-shrink-0', priorityDisplay.color)}>\n {priorityDisplay.text}\n </span>\n </div>\n \n {event.description && (\n <p className=\"text-gray-600 text-sm mb-3 line-clamp-3\">{event.description}</p>\n )}\n \n <div className=\"space-y-2 text-sm text-gray-500\">\n <div className=\"flex items-center gap-1\">\n <svg className=\"w-4 h-4 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <span className=\"truncate\">\n {event.startTime.toLocaleDateString('zh-CN')} {\n !event.allDay && event.startTime.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })\n }\n </span>\n </div>\n \n {event.location && (\n <div className=\"flex items-center gap-1\">\n <svg className=\"w-4 h-4 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <span className=\"truncate\">{event.location}</span>\n </div>\n )}\n </div>\n \n {!isSelectionMode && (\n <div className=\"flex items-center justify-end gap-2 mt-4 pt-3 border-t border-gray-200\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n onEventEdit(event);\n }}\n className=\"p-1.5 text-gray-400 hover:text-blue-600 hover:bg-blue-50 rounded transition-colors\"\n title=\"编辑事件\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n </button>\n \n <button\n onClick={(e) => {\n e.stopPropagation();\n onEventDelete(event.id);\n }}\n className=\"p-1.5 text-gray-400 hover:text-red-600 hover:bg-red-50 rounded transition-colors\"\n title=\"删除事件\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n \n return (\n <div className={clsx('space-y-6', className)}>\n {/* 工具栏 */}\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-4\">\n <div className=\"flex flex-col lg:flex-row lg:items-center lg:justify-between gap-4\">\n {/* 搜索框 */}\n <div className=\"flex-1 max-w-md\">\n <SearchBox\n searchQuery={config.filter.searchText || ''}\n onSearchChange={handleSearchChange}\n placeholder=\"搜索事件标题、描述或位置...\"\n size=\"medium\"\n />\n </div>\n \n {/* 批量操作和显示模式 */}\n <div className=\"flex items-center gap-3\">\n {/* 批量操作按钮 */}\n {enableBatchActions && onBatchDelete && (\n <>\n {!isSelectionMode ? (\n <button\n onClick={toggleSelectionMode}\n className=\"flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-gray-100 border border-gray-300 rounded-lg hover:bg-gray-200 transition-colors\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n 批量操作\n </button>\n ) : (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={exitSelectionMode}\n className=\"px-3 py-2 text-sm font-medium text-gray-700 bg-gray-100 border border-gray-300 rounded-lg hover:bg-gray-200 transition-colors\"\n >\n 取消\n </button>\n \n {selectedEventIds.size > 0 && (\n <button\n onClick={() => setShowBatchDeleteConfirm(true)}\n disabled={batchDeleteLoading}\n className=\"flex items-center gap-2 px-3 py-2 text-sm font-medium text-white bg-red-600 border border-red-600 rounded-lg hover:bg-red-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {batchDeleteLoading ? (\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-white\"></div>\n ) : (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n )}\n 删除选中({selectedEventIds.size})\n </button>\n )}\n </div>\n )}\n </>\n )}\n \n {/* 显示模式切换 */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-gray-700 mr-2\">显示模式:</span>\n <div className=\"flex items-center bg-gray-100 rounded-lg p-1\">\n <button\n onClick={() => handleDisplayModeChange(EventListDisplayMode.LIST)}\n className={clsx('px-3 py-1.5 text-sm font-medium rounded-md transition-colors', config.displayMode === EventListDisplayMode.LIST\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900')}\n >\n 列表\n </button>\n <button\n onClick={() => handleDisplayModeChange(EventListDisplayMode.GRID)}\n className={clsx('px-3 py-1.5 text-sm font-medium rounded-md transition-colors', config.displayMode === EventListDisplayMode.GRID\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900')}\n >\n 网格\n </button>\n </div>\n </div>\n </div>\n </div>\n \n {/* 选择模式信息栏 */}\n {isSelectionMode && (\n <div className=\"flex items-center justify-between mt-4 pt-4 border-t border-gray-200\">\n <div className=\"flex items-center gap-3\">\n <label className=\"flex items-center gap-2 text-sm font-medium text-gray-700\">\n {renderSelectAllCheckbox()}\n 全选当前页\n </label>\n <span className=\"text-sm text-gray-600\">\n 已选择 {selectedEventIds.size} 个事件\n </span>\n </div>\n </div>\n )}\n \n {/* 排序选项 */}\n {!isSelectionMode && (\n <div className=\"flex flex-wrap items-center gap-2 mt-4 pt-4 border-t border-gray-200\">\n <span className=\"text-sm text-gray-700 mr-2\">排序:</span>\n {renderSortButton(EventSortField.START_TIME, '日期')}\n {renderSortButton(EventSortField.TITLE, '标题')}\n {renderSortButton(EventSortField.PRIORITY, '优先级')}\n {renderSortButton(EventSortField.CREATED_AT, '创建时间')}\n {renderSortButton(EventSortField.UPDATED_AT, '更新时间')}\n </div>\n )}\n </div>\n \n {/* 事件统计 */}\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm text-gray-600\">\n 共 {sortedAndFilteredEvents.length} 个事件\n {config.filter.searchText && ' (搜索: \"' + (config.filter.searchText) + '\")'}\n </div>\n </div>\n \n {/* 加载状态 */}\n {loading && (\n <div className=\"flex justify-center py-8\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600\"></div>\n </div>\n )}\n \n {/* 事件列表 */}\n {!loading && paginatedEvents.length > 0 && (\n <>\n {config.displayMode === EventListDisplayMode.LIST ? renderListMode() : renderGridMode()}\n \n {/* 分页 */}\n {totalPages > 1 && (\n <div className=\"flex items-center justify-between pt-6\">\n <div className=\"text-sm text-gray-600\">\n 第 {config.currentPage} 页,共 {totalPages} 页\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => handlePageChange(config.currentPage - 1)}\n disabled={config.currentPage === 1}\n className=\"px-3 py-1.5 text-sm border border-gray-300 rounded-lg hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n 上一页\n </button>\n <button\n onClick={() => handlePageChange(config.currentPage + 1)}\n disabled={config.currentPage === totalPages}\n className=\"px-3 py-1.5 text-sm border border-gray-300 rounded-lg hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n 下一页\n </button>\n </div>\n </div>\n )}\n </>\n )}\n \n {/* 空状态 */}\n {!loading && paginatedEvents.length === 0 && (\n <div className=\"text-center py-12\">\n <svg className=\"w-16 h-16 mx-auto mb-4 text-gray-300\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <h3 className=\"text-lg font-medium text-gray-900 mb-2\">暂无事件</h3>\n <p className=\"text-gray-600\">\n {config.filter.searchText || config.filter.priority || config.filter.color || config.filter.dateRange\n ? '没有找到符合条件的事件'\n : '还没有创建任何事件'\n }\n </p>\n </div>\n )}\n \n {/* 批量删除确认弹窗 */}\n <ConfirmModal\n isOpen={showBatchDeleteConfirm}\n onClose={() => setShowBatchDeleteConfirm(false)}\n onConfirm={handleBatchDelete}\n title=\"确认批量删除\"\n message={'确定要删除选中的 ' + (selectedEventIds.size) + ' 个事件吗?此操作无法撤销。'}\n confirmText=\"删除\"\n cancelText=\"取消\"\n isLoading={batchDeleteLoading}\n />\n </div>\n );\n} ","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { Modal, ConfirmModal } from '@/components';\nimport { CalendarEvent, CreateEventRequest, UpdateEventRequest, EventPriority } from '../types';\nimport { toLocalISOString } from '../utils/dateUtils';\nimport { clsx } from 'clsx';\n\ninterface EventModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSave: (eventData: CreateEventRequest | UpdateEventRequest) => Promise<void>;\n onDelete?: (eventId: number) => Promise<void>; // 删除事件回调\n event?: CalendarEvent | null; // 如果传入event,则为编辑模式\n initialDate?: Date; // 创建事件时的初始日期\n}\n\nconst EventModal: React.FC<EventModalProps> = ({\n isOpen,\n onClose,\n onSave,\n onDelete,\n event,\n initialDate,\n}) => {\n const [formData, setFormData] = useState({\n title: '',\n description: '',\n startTime: '',\n endTime: '',\n location: '',\n color: '#3b82f6',\n priority: EventPriority.NORMAL,\n isAllDay: false,\n categoryId: null as string | null,\n // 重复事件相关\n isRecurring: false,\n recurrenceType: undefined as 'daily' | 'weekly' | 'monthly' | 'yearly' | undefined,\n recurrenceInterval: 1,\n recurrenceEndDate: '',\n recurrenceCount: 0,\n // 提醒相关\n hasReminder: false,\n reminderTime: 15, // 提前15分钟提醒\n reminderType: 'notification' as 'notification' | 'email',\n reminderMinutes: undefined as number | undefined,\n });\n\n const [isLoading, setIsLoading] = useState(false);\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n const isEditMode = !!event;\n\n // 初始化表单数据\n useEffect(() => {\n if (event) {\n // 编辑模式:使用现有事件数据\n const startDate = new Date(event.startTime);\n const endDate = new Date(event.endTime);\n \n setFormData({\n title: event.title,\n description: event.description || '',\n startTime: formatDateTimeLocal(startDate),\n endTime: formatDateTimeLocal(endDate),\n location: event.location || '',\n color: event.color || '#3b82f6',\n priority: event.priority || EventPriority.NORMAL,\n isAllDay: event.allDay,\n categoryId: null, // CalendarEvent doesn't have categoryId\n // 重复事件相关\n isRecurring: false,\n recurrenceType: undefined as 'daily' | 'weekly' | 'monthly' | 'yearly' | undefined,\n recurrenceInterval: 1,\n recurrenceEndDate: '',\n recurrenceCount: 0,\n // 提醒相关\n hasReminder: false,\n reminderTime: 15,\n reminderType: 'notification' as 'notification' | 'email',\n reminderMinutes: undefined as number | undefined,\n });\n } else if (initialDate) {\n // 创建模式:使用初始日期\n const startDateTime = new Date(initialDate);\n startDateTime.setHours(9, 0, 0, 0); // 默认上午9点\n \n const endDateTime = new Date(startDateTime);\n endDateTime.setHours(10, 0, 0, 0); // 默认1小时后\n \n setFormData(prev => ({\n ...prev,\n startTime: formatDateTimeLocal(startDateTime),\n endTime: formatDateTimeLocal(endDateTime),\n }));\n }\n }, [event, initialDate]);\n\n // 格式化日期时间为datetime-local输入格式\n const formatDateTimeLocal = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n return (year) + '-' + (month) + '-' + (day) + 'T' + (hours) + ':' + (minutes);\n };\n\n // 验证表单\n const validateForm = (): boolean => {\n const newErrors: Record<string, string> = {};\n\n if (!formData.title.trim()) {\n newErrors.title = '事件标题不能为空';\n }\n\n if (!formData.startTime) {\n newErrors.startTime = '开始时间不能为空';\n }\n\n if (!formData.endTime) {\n newErrors.endTime = '结束时间不能为空';\n }\n\n if (formData.startTime && formData.endTime) {\n const startDate = new Date(formData.startTime);\n const endDate = new Date(formData.endTime);\n \n if (endDate <= startDate) {\n newErrors.endTime = '结束时间必须晚于开始时间';\n }\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n // 处理表单提交\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n \n if (!validateForm()) {\n return;\n }\n\n setIsLoading(true);\n \n try {\n const eventData = {\n title: formData.title.trim(),\n description: formData.description.trim() || undefined,\n startTime: toLocalISOString(new Date(formData.startTime)),\n endTime: toLocalISOString(new Date(formData.endTime)),\n location: formData.location.trim() || undefined,\n color: formData.color,\n priority: formData.priority,\n allDay: formData.isAllDay,\n };\n\n await onSave(eventData);\n onClose();\n } catch (error) {\n console.error('保存事件失败:', error);\n setErrors({ submit: '保存事件失败,请重试' });\n } finally {\n setIsLoading(false);\n }\n };\n\n // 处理输入变化\n const handleInputChange = (\n field: keyof typeof formData,\n value: string | boolean | number | undefined\n ) => {\n setFormData(prev => ({ ...prev, [field]: value }));\n \n // 清除对应字段的错误\n if (errors[field]) {\n setErrors(prev => ({ ...prev, [field]: '' }));\n }\n };\n\n // 处理事件删除\n const handleDelete = async () => {\n if (!event?.id || !onDelete) return;\n \n setIsLoading(true);\n try {\n await onDelete(event.id);\n setShowDeleteConfirm(false);\n onClose();\n } catch (error) {\n console.error('删除事件失败:', error);\n setErrors({ submit: '删除事件失败,请重试' });\n } finally {\n setIsLoading(false);\n }\n };\n\n // 重置表单\n const resetForm = () => {\n setFormData({\n title: '',\n description: '',\n startTime: '',\n endTime: '',\n location: '',\n color: '#3b82f6',\n priority: EventPriority.NORMAL,\n isAllDay: false,\n categoryId: null,\n // 重复事件相关\n isRecurring: false,\n recurrenceType: undefined as 'daily' | 'weekly' | 'monthly' | 'yearly' | undefined,\n recurrenceInterval: 1,\n recurrenceEndDate: '',\n recurrenceCount: 0,\n // 提醒相关\n hasReminder: false,\n reminderTime: 15,\n reminderType: 'notification' as 'notification' | 'email',\n reminderMinutes: undefined as number | undefined,\n });\n setErrors({});\n setShowDeleteConfirm(false);\n };\n\n // 处理弹窗关闭\n const handleClose = () => {\n resetForm();\n onClose();\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={handleClose}\n title={isEditMode ? '编辑事件' : '创建事件'}\n width={600}\n maskClosable={false}\n >\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {/* 事件标题 */}\n <div>\n <label htmlFor=\"title\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 事件标题 *\n </label>\n <input\n type=\"text\"\n id=\"title\"\n value={formData.title}\n onChange={(e) => handleInputChange('title', e.target.value)}\n className={clsx('w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none', errors.title ? 'border-red-500' : 'border-gray-300')}\n placeholder=\"输入事件标题\"\n />\n {errors.title && (\n <p className=\"text-red-500 text-sm mt-1\">{errors.title}</p>\n )}\n </div>\n\n {/* 全天事件开关 */}\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"isAllDay\"\n checked={formData.isAllDay}\n onChange={(e) => handleInputChange('isAllDay', e.target.checked)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <label htmlFor=\"isAllDay\" className=\"ml-2 text-sm text-gray-700\">\n 全天事件\n </label>\n </div>\n\n {/* 时间选择 */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label htmlFor=\"startTime\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 开始时间 *\n </label>\n <input\n type={formData.isAllDay ? 'date' : 'datetime-local'}\n id=\"startTime\"\n value={formData.isAllDay ? formData.startTime.split('T')[0] : formData.startTime}\n onChange={(e) => {\n const value = formData.isAllDay \n ? (e.target.value) + 'T00:00' \n : e.target.value;\n handleInputChange('startTime', value);\n }}\n className={clsx('w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none', errors.startTime ? 'border-red-500' : 'border-gray-300')}\n />\n {errors.startTime && (\n <p className=\"text-red-500 text-sm mt-1\">{errors.startTime}</p>\n )}\n </div>\n\n <div>\n <label htmlFor=\"endTime\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 结束时间 *\n </label>\n <input\n type={formData.isAllDay ? 'date' : 'datetime-local'}\n id=\"endTime\"\n value={formData.isAllDay ? formData.endTime.split('T')[0] : formData.endTime}\n onChange={(e) => {\n const value = formData.isAllDay \n ? (e.target.value) + 'T23:59' \n : e.target.value;\n handleInputChange('endTime', value);\n }}\n className={clsx('w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none', errors.endTime ? 'border-red-500' : 'border-gray-300')}\n />\n {errors.endTime && (\n <p className=\"text-red-500 text-sm mt-1\">{errors.endTime}</p>\n )}\n </div>\n </div>\n\n {/* 位置 */}\n <div>\n <label htmlFor=\"location\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 位置\n </label>\n <input\n type=\"text\"\n id=\"location\"\n value={formData.location}\n onChange={(e) => handleInputChange('location', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n placeholder=\"输入事件位置\"\n />\n </div>\n\n {/* 描述 */}\n <div>\n <label htmlFor=\"description\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 描述\n </label>\n <textarea\n id=\"description\"\n value={formData.description}\n onChange={(e) => handleInputChange('description', e.target.value)}\n rows={3}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none resize-none\"\n placeholder=\"输入事件描述\"\n />\n </div>\n\n {/* 优先级选择 */}\n <div>\n <label htmlFor=\"priority\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 优先级\n </label>\n <select\n id=\"priority\"\n value={formData.priority}\n onChange={(e) => handleInputChange('priority', e.target.value as EventPriority)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n >\n <option value={EventPriority.LOW}>低</option>\n <option value={EventPriority.NORMAL}>普通</option>\n <option value={EventPriority.HIGH}>高</option>\n <option value={EventPriority.URGENT}>紧急</option>\n </select>\n </div>\n\n {/* 颜色选择 */}\n <div>\n <label htmlFor=\"color\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 颜色标签\n </label>\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"color\"\n id=\"color\"\n value={formData.color}\n onChange={(e) => handleInputChange('color', e.target.value)}\n className=\"w-12 h-10 border border-gray-300 rounded cursor-pointer\"\n />\n <span className=\"text-sm text-gray-600\">{formData.color}</span>\n </div>\n </div>\n\n {/* 重复设置 */}\n <div className=\"border-t border-gray-200 pt-4\">\n <h4 className=\"text-sm font-medium text-gray-700 mb-3\">🔄 重复设置</h4>\n \n {/* 重复类型 */}\n <div>\n <label htmlFor=\"recurrenceType\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 重复频率\n </label>\n <select\n id=\"recurrenceType\"\n value={formData.recurrenceType || 'none'}\n onChange={(e) => {\n const value = e.target.value === 'none' ? undefined : e.target.value;\n handleInputChange('recurrenceType', value);\n }}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n >\n <option value=\"none\">不重复</option>\n <option value=\"daily\">每天</option>\n <option value=\"weekly\">每周</option>\n <option value=\"monthly\">每月</option>\n <option value=\"yearly\">每年</option>\n </select>\n </div>\n\n {/* 重复间隔 - 只有选择了重复类型才显示 */}\n {formData.recurrenceType && (\n <div className=\"mt-3\">\n <label htmlFor=\"recurrenceInterval\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 重复间隔\n </label>\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-sm text-gray-600\">每</span>\n <input\n type=\"number\"\n id=\"recurrenceInterval\"\n min=\"1\"\n max=\"365\"\n value={formData.recurrenceInterval || 1}\n onChange={(e) => handleInputChange('recurrenceInterval', parseInt(e.target.value) || 1)}\n className=\"w-20 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none text-center\"\n />\n <span className=\"text-sm text-gray-600\">\n {formData.recurrenceType === 'daily' && '天'}\n {formData.recurrenceType === 'weekly' && '周'}\n {formData.recurrenceType === 'monthly' && '月'}\n {formData.recurrenceType === 'yearly' && '年'}\n </span>\n </div>\n </div>\n )}\n\n {/* 重复结束设置 - 只有选择了重复类型才显示 */}\n {formData.recurrenceType && (\n <div className=\"mt-3\">\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 重复结束\n </label>\n \n <div className=\"space-y-2\">\n {/* 永不结束 */}\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n name=\"recurrenceEnd\"\n checked={!formData.recurrenceEndDate && !formData.recurrenceCount}\n onChange={() => {\n handleInputChange('recurrenceEndDate', '');\n handleInputChange('recurrenceCount', 0);\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">永不结束</span>\n </label>\n\n {/* 指定结束日期 */}\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n name=\"recurrenceEnd\"\n checked={!!formData.recurrenceEndDate}\n onChange={() => {\n const endDate = new Date();\n endDate.setMonth(endDate.getMonth() + 1);\n handleInputChange('recurrenceEndDate', endDate.toISOString().split('T')[0]);\n handleInputChange('recurrenceCount', 0);\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">结束于:</span>\n <input\n type=\"date\"\n value={formData.recurrenceEndDate || ''}\n onChange={(e) => {\n handleInputChange('recurrenceEndDate', e.target.value);\n handleInputChange('recurrenceCount', 0);\n }}\n className=\"ml-2 px-2 py-1 border border-gray-300 rounded text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n disabled={!formData.recurrenceEndDate}\n />\n </label>\n\n {/* 指定重复次数 */}\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n name=\"recurrenceEnd\"\n checked={!!formData.recurrenceCount && formData.recurrenceCount > 0}\n onChange={() => {\n handleInputChange('recurrenceCount', 10);\n handleInputChange('recurrenceEndDate', '');\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">重复</span>\n <input\n type=\"number\"\n min=\"1\"\n max=\"999\"\n value={formData.recurrenceCount || ''}\n onChange={(e) => {\n const count = parseInt(e.target.value) || 0;\n handleInputChange('recurrenceCount', count);\n if (count > 0) {\n handleInputChange('recurrenceEndDate', '');\n }\n }}\n className=\"ml-2 w-16 px-2 py-1 border border-gray-300 rounded text-sm text-center focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n disabled={!formData.recurrenceCount || formData.recurrenceCount === 0}\n />\n <span className=\"ml-2 text-sm text-gray-700\">次</span>\n </label>\n </div>\n </div>\n )}\n </div>\n\n {/* 提醒设置 */}\n <div className=\"border-t border-gray-200 pt-4\">\n <h4 className=\"text-sm font-medium text-gray-700 mb-3\">🔔 提醒设置</h4>\n \n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 提醒时间\n </label>\n <div className=\"space-y-2\">\n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={formData.reminderMinutes === 0}\n onChange={(e) => {\n if (e.target.checked) {\n handleInputChange('reminderMinutes', 0);\n } else {\n handleInputChange('reminderMinutes', undefined);\n }\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">事件开始时</span>\n </label>\n \n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={formData.reminderMinutes === 15}\n onChange={(e) => {\n if (e.target.checked) {\n handleInputChange('reminderMinutes', 15);\n } else {\n handleInputChange('reminderMinutes', undefined);\n }\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">提前15分钟</span>\n </label>\n \n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={formData.reminderMinutes === 30}\n onChange={(e) => {\n if (e.target.checked) {\n handleInputChange('reminderMinutes', 30);\n } else {\n handleInputChange('reminderMinutes', undefined);\n }\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">提前30分钟</span>\n </label>\n \n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={formData.reminderMinutes === 60}\n onChange={(e) => {\n if (e.target.checked) {\n handleInputChange('reminderMinutes', 60);\n } else {\n handleInputChange('reminderMinutes', undefined);\n }\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">提前1小时</span>\n </label>\n \n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={formData.reminderMinutes === 1440}\n onChange={(e) => {\n if (e.target.checked) {\n handleInputChange('reminderMinutes', 1440);\n } else {\n handleInputChange('reminderMinutes', undefined);\n }\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">提前1天</span>\n </label>\n </div>\n </div>\n </div>\n\n {/* 错误提示 */}\n {errors.submit && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3\">\n <p className=\"text-red-600 text-sm\">{errors.submit}</p>\n </div>\n )}\n\n {/* 操作按钮 */}\n <div className=\"flex justify-between pt-4 border-t border-gray-200\">\n {/* 左侧删除按钮(仅编辑模式显示) */}\n <div>\n {isEditMode && onDelete && (\n <button\n type=\"button\"\n onClick={() => setShowDeleteConfirm(true)}\n className=\"px-4 py-2 text-red-600 border border-red-300 rounded-lg hover:bg-red-50 transition-colors\"\n disabled={isLoading}\n >\n 删除事件\n </button>\n )}\n </div>\n\n {/* 右侧主要操作按钮 */}\n <div className=\"flex space-x-3\">\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"px-4 py-2 text-gray-700 border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n disabled={isLoading}\n >\n 取消\n </button>\n <button\n type=\"submit\"\n disabled={isLoading}\n className=\"px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isLoading ? '保存中...' : (isEditMode ? '更新事件' : '创建事件')}\n </button>\n </div>\n </div>\n\n </form>\n \n {/* 删除确认弹窗 */}\n <ConfirmModal\n isOpen={showDeleteConfirm}\n onClose={() => setShowDeleteConfirm(false)}\n onConfirm={handleDelete}\n title=\"确认删除\"\n message={'确定要删除事件\"' + (formData.title) + '\"吗?此操作无法撤销。'}\n confirmText=\"删除\"\n cancelText=\"取消\"\n isLoading={isLoading}\n />\n </Modal>\n );\n};\n\nexport default EventModal; ","'use client';\n\nimport React, { useState, useCallback, useMemo } from 'react';\nimport { CalendarEvent, EventPriority } from '../types';\nimport { clsx } from 'clsx';\n\ninterface EventSearchProps {\n events: CalendarEvent[];\n onFiltered: (filteredEvents: CalendarEvent[]) => void;\n className?: string;\n}\n\ninterface SearchFilters {\n keyword: string;\n priority: EventPriority | 'all';\n dateRange: {\n start: string;\n end: string;\n };\n colorFilter: string[];\n isAllDay: 'all' | 'yes' | 'no';\n}\n\nconst EventSearch: React.FC<EventSearchProps> = ({\n events,\n onFiltered,\n className = '',\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const [filters, setFilters] = useState<SearchFilters>({\n keyword: '',\n priority: 'all',\n dateRange: {\n start: '',\n end: '',\n },\n colorFilter: [],\n isAllDay: 'all',\n });\n\n // 获取所有可用的颜色\n const availableColors = useMemo(() => {\n const colors = new Set<string>();\n events.forEach(event => {\n if (event.color) colors.add(event.color);\n });\n return Array.from(colors);\n }, [events]);\n\n // 过滤事件\n const filteredEvents = useMemo(() => {\n return events.filter(event => {\n // 关键词搜索\n if (filters.keyword) {\n const keyword = filters.keyword.toLowerCase();\n const matchTitle = event.title.toLowerCase().includes(keyword);\n const matchDescription = event.description?.toLowerCase().includes(keyword) || false;\n const matchLocation = event.location?.toLowerCase().includes(keyword) || false;\n \n if (!matchTitle && !matchDescription && !matchLocation) {\n return false;\n }\n }\n\n // 优先级过滤\n if (filters.priority !== 'all' && event.priority !== filters.priority) {\n return false;\n }\n\n // 日期范围过滤\n if (filters.dateRange.start || filters.dateRange.end) {\n const parts = new Date(event.startTime).toISOString().split('T');\n const eventDate = parts[0];\n \n if (eventDate) {\n if (filters.dateRange.start && eventDate < filters.dateRange.start) {\n return false;\n }\n \n if (filters.dateRange.end && eventDate > filters.dateRange.end) {\n return false;\n }\n }\n }\n\n // 颜色过滤\n if (filters.colorFilter.length > 0 && !filters.colorFilter.includes(event.color || '#3b82f6')) {\n return false;\n }\n\n // 全天事件过滤\n if (filters.isAllDay !== 'all') {\n const isEventAllDay = event.allDay;\n if (filters.isAllDay === 'yes' && !isEventAllDay) return false;\n if (filters.isAllDay === 'no' && isEventAllDay) return false;\n }\n\n return true;\n });\n }, [events, filters]);\n\n // 更新过滤结果\n React.useEffect(() => {\n onFiltered(filteredEvents);\n }, [filteredEvents, onFiltered]);\n\n // 处理过滤器变化\n const handleFilterChange = useCallback((\n key: keyof SearchFilters,\n value: string | string[] | { start: string; end: string }\n ) => {\n setFilters(prev => ({\n ...prev,\n [key]: value,\n }));\n }, []);\n\n // 重置过滤器\n const resetFilters = useCallback(() => {\n setFilters({\n keyword: '',\n priority: 'all',\n dateRange: { start: '', end: '' },\n colorFilter: [],\n isAllDay: 'all',\n });\n }, []);\n\n // 检查是否有活跃的过滤器\n const hasActiveFilters = useMemo(() => {\n return filters.keyword !== '' ||\n filters.priority !== 'all' ||\n filters.dateRange.start !== '' ||\n filters.dateRange.end !== '' ||\n filters.colorFilter.length > 0 ||\n filters.isAllDay !== 'all';\n }, [filters]);\n\n // 获取优先级显示文本\n const getPriorityText = (priority: EventPriority) => {\n const priorityMap = {\n [EventPriority.LOW]: '低',\n [EventPriority.NORMAL]: '普通',\n [EventPriority.HIGH]: '高',\n [EventPriority.URGENT]: '紧急',\n };\n return priorityMap[priority];\n };\n\n return (\n <div className={clsx('bg-white rounded-lg border border-gray-200', className)}>\n {/* 搜索头部 */}\n <div className=\"p-4 border-b border-gray-200\">\n <div className=\"flex items-center space-x-3\">\n {/* 关键词搜索 */}\n <div className=\"flex-1\">\n <div className=\"relative\">\n <input\n type=\"text\"\n placeholder=\"搜索事件标题、描述或位置...\"\n value={filters.keyword}\n onChange={(e) => handleFilterChange('keyword', e.target.value)}\n className=\"w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n />\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg className=\"h-5 w-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n </div>\n </div>\n </div>\n\n {/* 展开/收起按钮 */}\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className={clsx('px-3 py-2 text-sm font-medium rounded-lg transition-colors', hasActiveFilters \n ? 'bg-blue-100 text-blue-700 border border-blue-300' \n : 'bg-gray-100 text-gray-700 border border-gray-300 hover:bg-gray-200')}\n >\n <div className=\"flex items-center space-x-2\">\n <svg \n className={clsx('h-4 w-4 transition-transform', isExpanded ? 'rotate-180' : '')} \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n <span>过滤器</span>\n {hasActiveFilters && (\n <span className=\"inline-flex items-center justify-center w-5 h-5 text-xs font-bold text-white bg-blue-600 rounded-full\">\n {Object.values(filters).filter(v => \n v !== '' && v !== 'all' && \n (Array.isArray(v) ? v.length > 0 : true) &&\n (typeof v === 'object' && !Array.isArray(v) ? v.start !== '' || v.end !== '' : true)\n ).length}\n </span>\n )}\n </div>\n </button>\n\n {/* 重置按钮 */}\n {hasActiveFilters && (\n <button\n type=\"button\"\n onClick={resetFilters}\n className=\"px-3 py-2 text-sm font-medium text-red-600 bg-red-50 border border-red-300 rounded-lg hover:bg-red-100 transition-colors\"\n >\n 重置\n </button>\n )}\n </div>\n\n {/* 搜索结果统计 */}\n <div className=\"mt-3 text-sm text-gray-600\">\n 共找到 <span className=\"font-medium text-gray-900\">{filteredEvents.length}</span> 个事件\n {filteredEvents.length !== events.length && (\n <span className=\"text-gray-500\">(共 {events.length} 个)</span>\n )}\n </div>\n </div>\n\n {/* 高级过滤器 */}\n {isExpanded && (\n <div className=\"p-4 bg-gray-50 border-t border-gray-200\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {/* 优先级过滤 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 优先级\n </label>\n <select\n value={filters.priority}\n onChange={(e) => handleFilterChange('priority', e.target.value as EventPriority | 'all')}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n >\n <option value=\"all\">全部优先级</option>\n <option value={EventPriority.LOW}>{getPriorityText(EventPriority.LOW)}</option>\n <option value={EventPriority.NORMAL}>{getPriorityText(EventPriority.NORMAL)}</option>\n <option value={EventPriority.HIGH}>{getPriorityText(EventPriority.HIGH)}</option>\n <option value={EventPriority.URGENT}>{getPriorityText(EventPriority.URGENT)}</option>\n </select>\n </div>\n\n {/* 全天事件过滤 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 事件类型\n </label>\n <select\n value={filters.isAllDay}\n onChange={(e) => handleFilterChange('isAllDay', e.target.value as 'all' | 'yes' | 'no')}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n >\n <option value=\"all\">全部类型</option>\n <option value=\"yes\">全天事件</option>\n <option value=\"no\">定时事件</option>\n </select>\n </div>\n\n {/* 颜色过滤 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 颜色标签\n </label>\n <div className=\"flex flex-wrap gap-2\">\n {availableColors.map(color => (\n <button\n key={color}\n type=\"button\"\n onClick={() => {\n const newColors = filters.colorFilter.includes(color)\n ? filters.colorFilter.filter(c => c !== color)\n : [...filters.colorFilter, color];\n handleFilterChange('colorFilter', newColors);\n }}\n className={clsx('w-8 h-8 rounded border-2 transition-all', filters.colorFilter.includes(color)\n ? 'border-gray-800 scale-110'\n : 'border-gray-300 hover:border-gray-500')}\n style={{ backgroundColor: color }}\n title={'颜色: ' + (color)}\n />\n ))}\n </div>\n </div>\n\n {/* 日期范围过滤 */}\n <div className=\"md:col-span-2 lg:col-span-3\">\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 日期范围\n </label>\n <div className=\"flex items-center space-x-3\">\n <input\n type=\"date\"\n value={filters.dateRange.start}\n onChange={(e) => handleFilterChange('dateRange', {\n ...filters.dateRange,\n start: e.target.value\n })}\n className=\"px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n />\n <span className=\"text-gray-500\">至</span>\n <input\n type=\"date\"\n value={filters.dateRange.end}\n onChange={(e) => handleFilterChange('dateRange', {\n ...filters.dateRange,\n end: e.target.value\n })}\n className=\"px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n />\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default EventSearch; ","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { Modal, ConfirmModal } from '@/components';\nimport { EventType, RecurrencePattern, EventData, EventTypeService } from '../services/eventTypeService';\nimport { CalendarEvent, EventPriority } from '../types';\nimport { clsx } from 'clsx';\n\ninterface ImprovedEventModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSave: (eventData: EventData) => Promise<void>;\n onDelete?: (eventId: number) => Promise<void>;\n event?: CalendarEvent | null;\n initialDate?: Date;\n}\n\nconst ImprovedEventModal: React.FC<ImprovedEventModalProps> = ({\n isOpen,\n onClose,\n onSave,\n onDelete,\n event,\n initialDate,\n}) => {\n const [eventType, setEventType] = useState<EventType>(EventType.SINGLE);\n const [formData, setFormData] = useState({\n // 基础信息\n title: '',\n description: '',\n location: '',\n color: '#3b82f6',\n priority: EventPriority.NORMAL,\n allDay: false,\n \n // 单次事件\n startTime: '',\n endTime: '',\n \n // 多天事件\n startDate: '',\n endDate: '',\n dailyStartTime: '09:00',\n dailyEndTime: '17:00',\n \n // 重复事件\n recurrenceStartDate: '',\n recurrenceStartTime: '',\n recurrenceEndTime: '',\n recurrencePattern: RecurrencePattern.DAILY,\n recurrenceInterval: 1,\n recurrenceEndDate: '',\n recurrenceCount: 0,\n useEndDate: true, // true: 使用结束日期, false: 使用重复次数\n });\n\n const [isLoading, setIsLoading] = useState(false);\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n const isEditMode = !!event;\n\n // 初始化表单数据\n useEffect(() => {\n if (event) {\n // 编辑模式:使用现有事件数据\n const startDate = new Date(event.startTime);\n const endDate = new Date(event.endTime);\n \n setEventType(EventType.SINGLE); // 默认为单次事件\n setFormData({\n title: event.title,\n description: event.description || '',\n location: event.location || '',\n color: event.color || '#3b82f6',\n priority: event.priority || EventPriority.NORMAL,\n allDay: event.allDay,\n startTime: formatDateTimeLocal(startDate),\n endTime: formatDateTimeLocal(endDate),\n startDate: formatDateOnly(startDate),\n endDate: formatDateOnly(endDate),\n dailyStartTime: formatTimeOnly(startDate),\n dailyEndTime: formatTimeOnly(endDate),\n recurrenceStartDate: formatDateOnly(startDate),\n recurrenceStartTime: formatDateTimeLocal(startDate),\n recurrenceEndTime: formatDateTimeLocal(endDate),\n recurrencePattern: RecurrencePattern.DAILY,\n recurrenceInterval: 1,\n recurrenceEndDate: '',\n recurrenceCount: 0,\n useEndDate: true,\n });\n } else if (initialDate) {\n // 创建模式:使用初始日期\n const startDateTime = new Date(initialDate);\n startDateTime.setHours(9, 0, 0, 0);\n \n const endDateTime = new Date(startDateTime);\n endDateTime.setHours(10, 0, 0, 0);\n \n setFormData(prev => ({\n ...prev,\n startTime: formatDateTimeLocal(startDateTime),\n endTime: formatDateTimeLocal(endDateTime),\n startDate: formatDateOnly(startDateTime),\n endDate: formatDateOnly(startDateTime),\n recurrenceStartDate: formatDateOnly(startDateTime),\n recurrenceStartTime: formatDateTimeLocal(startDateTime),\n recurrenceEndTime: formatDateTimeLocal(endDateTime),\n }));\n }\n }, [event, initialDate]);\n\n // 格式化函数\n const formatDateTimeLocal = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n return (year) + '-' + (month) + '-' + (day) + 'T' + (hours) + ':' + (minutes);\n };\n\n const formatDateOnly = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return (year) + '-' + (month) + '-' + (day);\n };\n\n const formatTimeOnly = (date: Date): string => {\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n return (hours) + ':' + (minutes);\n };\n\n // 构建事件数据\n const buildEventData = (): EventData => {\n switch (eventType) {\n case EventType.SINGLE:\n return {\n type: EventType.SINGLE,\n title: formData.title.trim(),\n description: formData.description.trim() || undefined,\n location: formData.location.trim() || undefined,\n color: formData.color,\n priority: formData.priority,\n allDay: formData.allDay,\n startTime: new Date(formData.startTime),\n endTime: new Date(formData.endTime),\n };\n\n case EventType.MULTI_DAY:\n return {\n type: EventType.MULTI_DAY,\n title: formData.title.trim(),\n description: formData.description.trim() || undefined,\n location: formData.location.trim() || undefined,\n color: formData.color,\n priority: formData.priority,\n allDay: formData.allDay,\n startDate: new Date(formData.startDate),\n endDate: new Date(formData.endDate),\n startTime: formData.allDay ? undefined : formData.dailyStartTime,\n endTime: formData.allDay ? undefined : formData.dailyEndTime,\n };\n\n case EventType.RECURRING:\n return {\n type: EventType.RECURRING,\n title: formData.title.trim(),\n description: formData.description.trim() || undefined,\n location: formData.location.trim() || undefined,\n color: formData.color,\n priority: formData.priority,\n allDay: formData.allDay,\n startDate: new Date(formData.recurrenceStartDate),\n startTime: new Date(formData.recurrenceStartTime),\n endTime: new Date(formData.recurrenceEndTime),\n recurrence: {\n pattern: formData.recurrencePattern,\n interval: formData.recurrenceInterval,\n endDate: formData.useEndDate && formData.recurrenceEndDate ? new Date(formData.recurrenceEndDate) : undefined,\n count: !formData.useEndDate && formData.recurrenceCount > 0 ? formData.recurrenceCount : undefined,\n },\n };\n\n default:\n throw new Error('不支持的事件类型: ' + (eventType));\n }\n };\n\n // 验证表单\n const validateForm = (): boolean => {\n const eventData = buildEventData();\n const validationErrors = EventTypeService.validateEventData(eventData);\n \n const newErrors: Record<string, string> = {};\n validationErrors.forEach(error => {\n newErrors.general = error;\n });\n\n setErrors(newErrors);\n return validationErrors.length === 0;\n };\n\n // 处理表单提交\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n \n if (!validateForm()) {\n return;\n }\n\n setIsLoading(true);\n \n try {\n const eventData = buildEventData();\n await onSave(eventData);\n onClose();\n } catch (error) {\n console.error('保存事件失败:', error);\n setErrors({ submit: '保存事件失败,请重试' });\n } finally {\n setIsLoading(false);\n }\n };\n\n // 处理输入变化\n const handleInputChange = (\n field: keyof typeof formData,\n value: string | boolean | number\n ) => {\n setFormData(prev => ({ ...prev, [field]: value }));\n \n // 清除错误\n if (errors[field]) {\n setErrors(prev => ({ ...prev, [field]: '' }));\n }\n };\n\n // 处理事件删除\n const handleDelete = async () => {\n if (!event?.id || !onDelete) return;\n \n setIsLoading(true);\n try {\n await onDelete(event.id);\n setShowDeleteConfirm(false);\n onClose();\n } catch (error) {\n console.error('删除事件失败:', error);\n setErrors({ submit: '删除事件失败,请重试' });\n } finally {\n setIsLoading(false);\n }\n };\n\n // 重置表单\n const handleClose = () => {\n setErrors({});\n onClose();\n };\n\n // 渲染事件类型选择器\n const renderEventTypeSelector = () => (\n <div className=\"space-y-4\">\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-lg\">🎯</span>\n <label className=\"text-base font-medium text-gray-900\">\n 选择事件类型\n </label>\n </div>\n \n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <button\n type=\"button\"\n onClick={() => setEventType(EventType.SINGLE)}\n className={clsx('group relative p-4 rounded-xl border-2 transition-all duration-300 transform hover:scale-105', eventType === EventType.SINGLE\n ? 'bg-gradient-to-br from-blue-50 to-blue-100 border-blue-300 shadow-lg ring-2 ring-blue-200'\n : 'bg-white border-gray-200 hover:bg-gray-50 hover:border-gray-300 shadow-sm hover:shadow-md')}\n >\n <div className=\"text-center\">\n <div className={clsx('text-3xl mb-2 transition-transform duration-300', eventType === EventType.SINGLE ? 'scale-110' : 'group-hover:scale-110')}>\n 📅\n </div>\n <div className={clsx('font-semibold mb-1', eventType === EventType.SINGLE ? 'text-blue-700' : 'text-gray-900')}>\n 单次事件\n </div>\n <div className=\"text-xs text-gray-500\">\n 一次性事件\n </div>\n </div>\n {eventType === EventType.SINGLE && (\n <div className=\"absolute top-2 right-2\">\n <div className=\"w-6 h-6 bg-blue-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-sm\">✓</span>\n </div>\n </div>\n )}\n </button>\n\n <button\n type=\"button\"\n onClick={() => setEventType(EventType.MULTI_DAY)}\n className={clsx('group relative p-4 rounded-xl border-2 transition-all duration-300 transform hover:scale-105', eventType === EventType.MULTI_DAY\n ? 'bg-gradient-to-br from-green-50 to-green-100 border-green-300 shadow-lg ring-2 ring-green-200'\n : 'bg-white border-gray-200 hover:bg-gray-50 hover:border-gray-300 shadow-sm hover:shadow-md')}\n >\n <div className=\"text-center\">\n <div className={clsx('text-3xl mb-2 transition-transform duration-300', eventType === EventType.MULTI_DAY ? 'scale-110' : 'group-hover:scale-110')}>\n 🗓️\n </div>\n <div className={clsx('font-semibold mb-1', eventType === EventType.MULTI_DAY ? 'text-green-700' : 'text-gray-900')}>\n 多天事件\n </div>\n <div className=\"text-xs text-gray-500\">\n 连续多天\n </div>\n </div>\n {eventType === EventType.MULTI_DAY && (\n <div className=\"absolute top-2 right-2\">\n <div className=\"w-6 h-6 bg-green-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-sm\">✓</span>\n </div>\n </div>\n )}\n </button>\n\n <button\n type=\"button\"\n onClick={() => setEventType(EventType.RECURRING)}\n className={clsx('group relative p-4 rounded-xl border-2 transition-all duration-300 transform hover:scale-105', eventType === EventType.RECURRING\n ? 'bg-gradient-to-br from-purple-50 to-purple-100 border-purple-300 shadow-lg ring-2 ring-purple-200'\n : 'bg-white border-gray-200 hover:bg-gray-50 hover:border-gray-300 shadow-sm hover:shadow-md')}\n >\n <div className=\"text-center\">\n <div className={clsx('text-3xl mb-2 transition-transform duration-300', eventType === EventType.RECURRING ? 'scale-110' : 'group-hover:scale-110')}>\n 🔄\n </div>\n <div className={clsx('font-semibold mb-1', eventType === EventType.RECURRING ? 'text-purple-700' : 'text-gray-900')}>\n 重复事件\n </div>\n <div className=\"text-xs text-gray-500\">\n 周期性重复\n </div>\n </div>\n {eventType === EventType.RECURRING && (\n <div className=\"absolute top-2 right-2\">\n <div className=\"w-6 h-6 bg-purple-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-sm\">✓</span>\n </div>\n </div>\n )}\n </button>\n </div>\n \n {/* 事件类型说明 */}\n <div className={clsx('p-4 rounded-lg transition-all duration-300', eventType === EventType.SINGLE ? 'bg-blue-50 border border-blue-200' :\n eventType === EventType.MULTI_DAY ? 'bg-green-50 border border-green-200' :\n 'bg-purple-50 border border-purple-200')}>\n <div className=\"flex items-start space-x-3\">\n <div className=\"flex-shrink-0 mt-0.5\">\n <span className=\"text-lg\">\n {eventType === EventType.SINGLE ? '💡' :\n eventType === EventType.MULTI_DAY ? '📋' : '🔔'}\n </span>\n </div>\n <div>\n {eventType === EventType.SINGLE && (\n <>\n <h4 className=\"font-medium text-blue-800 mb-1\">单次事件</h4>\n <p className=\"text-sm text-blue-700\">\n 在指定的时间发生一次的事件,如会议、约会、面试等。适合一次性的活动安排。\n </p>\n </>\n )}\n {eventType === EventType.MULTI_DAY && (\n <>\n <h4 className=\"font-medium text-green-800 mb-1\">多天事件</h4>\n <p className=\"text-sm text-green-700\">\n 持续多天的单个事件,如培训课程、会议、假期等。例如:3天的培训课程或1周的假期。\n </p>\n </>\n )}\n {eventType === EventType.RECURRING && (\n <>\n <h4 className=\"font-medium text-purple-800 mb-1\">重复事件</h4>\n <p className=\"text-sm text-purple-700\">\n 按照规律重复发生的事件,如每天的晨会、每周的例会、每月的总结等。系统会自动创建多个事件实例。\n </p>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n\n // 渲染基础信息表单\n const renderBasicForm = () => (\n <div className=\"space-y-6\">\n {/* 事件标题 */}\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-gray-900 mb-3\">\n <span className=\"text-lg\">📝</span>\n <span>事件标题</span>\n <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <input\n type=\"text\"\n value={formData.title}\n onChange={(e) => handleInputChange('title', e.target.value)}\n className=\"w-full px-4 py-3 border-2 border-gray-200 rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all duration-200 placeholder-gray-400 text-gray-900 bg-white hover:border-gray-300\"\n placeholder=\"为你的事件起个名字...\"\n />\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3\">\n <div className={clsx('w-2 h-2 rounded-full transition-colors duration-200', formData.title.trim() ? 'bg-green-400' : 'bg-gray-300')}></div>\n </div>\n </div>\n {errors.title && (\n <div className=\"flex items-center space-x-2 mt-2\">\n <span className=\"text-red-500 text-sm\">⚠️</span>\n <p className=\"text-sm text-red-600\">{errors.title}</p>\n </div>\n )}\n </div>\n\n {/* 事件描述 */}\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-gray-900 mb-3\">\n <span className=\"text-lg\">📄</span>\n <span>事件描述</span>\n </label>\n <textarea\n value={formData.description}\n onChange={(e) => handleInputChange('description', e.target.value)}\n rows={4}\n className=\"w-full px-4 py-3 border-2 border-gray-200 rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all duration-200 placeholder-gray-400 text-gray-900 bg-white hover:border-gray-300 resize-none\"\n placeholder=\"描述一下这个事件的详细信息...\"\n />\n <div className=\"flex justify-between items-center mt-2\">\n <div className=\"text-xs text-gray-500\">\n {formData.description.length > 0 && '已输入 ' + (formData.description.length) + ' 个字符'}\n </div>\n </div>\n </div>\n\n {/* 地点 */}\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-gray-900 mb-3\">\n <span className=\"text-lg\">📍</span>\n <span>地点</span>\n </label>\n <div className=\"relative\">\n <input\n type=\"text\"\n value={formData.location}\n onChange={(e) => handleInputChange('location', e.target.value)}\n className=\"w-full px-4 py-3 border-2 border-gray-200 rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all duration-200 placeholder-gray-400 text-gray-900 bg-white hover:border-gray-300\"\n placeholder=\"事件举办地点...\"\n />\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3\">\n <div className={clsx('w-2 h-2 rounded-full transition-colors duration-200', formData.location.trim() ? 'bg-green-400' : 'bg-gray-300')}></div>\n </div>\n </div>\n </div>\n\n {/* 全天事件开关 */}\n <div className=\"bg-gray-50 rounded-xl p-4\">\n <label className=\"flex items-center justify-between cursor-pointer group\">\n <div className=\"flex items-center space-x-3\">\n <span className=\"text-lg\">🌅</span>\n <div>\n <div className=\"text-sm font-medium text-gray-900\">全天事件</div>\n <div className=\"text-xs text-gray-500\">不设置具体时间,整天有效</div>\n </div>\n </div>\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id=\"allDay\"\n checked={formData.allDay}\n onChange={(e) => handleInputChange('allDay', e.target.checked)}\n className=\"sr-only\"\n />\n <div className={clsx('w-12 h-6 rounded-full transition-colors duration-200', formData.allDay ? 'bg-blue-500' : 'bg-gray-300')}>\n <div className={clsx('w-5 h-5 bg-white rounded-full shadow-md transform transition-transform duration-200', formData.allDay ? 'translate-x-6' : 'translate-x-0.5', 'translate-y-0.5')}></div>\n </div>\n </div>\n </label>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {/* 颜色选择器 */}\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-gray-900 mb-3\">\n <span className=\"text-lg\">🎨</span>\n <span>事件颜色</span>\n </label>\n <div className=\"space-y-3\">\n <div className=\"flex items-center space-x-3\">\n <div \n className=\"w-12 h-12 rounded-xl border-2 border-gray-200 flex items-center justify-center cursor-pointer hover:scale-105 transition-transform duration-200 shadow-sm\"\n style={{ backgroundColor: formData.color }}\n >\n <input\n type=\"color\"\n value={formData.color}\n onChange={(e) => handleInputChange('color', e.target.value)}\n className=\"w-8 h-8 border-none rounded-lg cursor-pointer opacity-0 absolute\"\n />\n </div>\n <div className=\"flex-1\">\n <div className=\"text-sm font-medium text-gray-900\" style={{ color: formData.color }}>\n {formData.color.toUpperCase()}\n </div>\n <div className=\"text-xs text-gray-500\">点击色块选择颜色</div>\n </div>\n </div>\n \n {/* 预设颜色 */}\n <div className=\"flex space-x-2\">\n {['#3b82f6', '#ef4444', '#10b981', '#f59e0b', '#8b5cf6', '#ec4899'].map((color) => (\n <button\n key={color}\n type=\"button\"\n onClick={() => handleInputChange('color', color)}\n className={clsx('w-8 h-8 rounded-lg border-2 hover:scale-105 transition-all duration-200', formData.color === color ? 'border-gray-400 ring-2 ring-gray-200' : 'border-gray-200')}\n style={{ backgroundColor: color }}\n />\n ))}\n </div>\n </div>\n </div>\n\n {/* 优先级选择器 */}\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-gray-900 mb-3\">\n <span className=\"text-lg\">⭐</span>\n <span>优先级</span>\n </label>\n <div className=\"space-y-2\">\n {[\n { value: EventPriority.LOW, label: '低', icon: '📘', color: 'text-blue-600 bg-blue-50 border-blue-200' },\n { value: EventPriority.NORMAL, label: '普通', icon: '📗', color: 'text-green-600 bg-green-50 border-green-200' },\n { value: EventPriority.HIGH, label: '高', icon: '📙', color: 'text-yellow-600 bg-yellow-50 border-yellow-200' },\n { value: EventPriority.URGENT, label: '紧急', icon: '📕', color: 'text-red-600 bg-red-50 border-red-200' }\n ].map((priority) => (\n <label key={priority.value} className=\"flex items-center cursor-pointer group\">\n <input\n type=\"radio\"\n name=\"priority\"\n value={priority.value}\n checked={formData.priority === priority.value}\n onChange={(e) => handleInputChange('priority', e.target.value as EventPriority)}\n className=\"sr-only\"\n />\n <div className={clsx('flex items-center space-x-3 px-3 py-2 rounded-lg border-2 transition-all duration-200 flex-1', formData.priority === priority.value \n ? priority.color + ' ring-2 ring-opacity-20'\n : 'text-gray-600 bg-white border-gray-200 hover:bg-gray-50')}>\n <span className=\"text-lg\">{priority.icon}</span>\n <span className=\"text-sm font-medium\">{priority.label}</span>\n {formData.priority === priority.value && (\n <span className=\"ml-auto text-sm\">✓</span>\n )}\n </div>\n </label>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n\n // 渲染单次事件表单\n const renderSingleEventForm = () => (\n <div className=\"space-y-6\">\n {!formData.allDay && (\n <div className=\"bg-blue-50 rounded-xl p-4 border border-blue-200\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-blue-900 mb-3\">\n <span className=\"text-lg\">🕐</span>\n <span>开始时间</span>\n <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <input\n type=\"datetime-local\"\n value={formData.startTime}\n onChange={(e) => handleInputChange('startTime', e.target.value)}\n className=\"w-full px-4 py-3 border-2 border-blue-200 rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all duration-200 text-gray-900 bg-white hover:border-blue-300\"\n />\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3\">\n <span className=\"text-blue-500 text-sm\">📅</span>\n </div>\n </div>\n </div>\n\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-blue-900 mb-3\">\n <span className=\"text-lg\">🕕</span>\n <span>结束时间</span>\n <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <input\n type=\"datetime-local\"\n value={formData.endTime}\n onChange={(e) => handleInputChange('endTime', e.target.value)}\n className=\"w-full px-4 py-3 border-2 border-blue-200 rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all duration-200 text-gray-900 bg-white hover:border-blue-300\"\n />\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3\">\n <span className=\"text-blue-500 text-sm\">📅</span>\n </div>\n </div>\n </div>\n </div>\n \n <div className=\"mt-4 p-3 bg-blue-100 rounded-lg\">\n <div className=\"flex items-start space-x-2\">\n <span className=\"text-blue-600 text-sm\">💡</span>\n <div className=\"text-xs text-blue-700\">\n <strong>提示:</strong>单次事件在指定的时间段内发生一次。请确保结束时间晚于开始时间。\n </div>\n </div>\n </div>\n </div>\n )}\n \n {formData.allDay && (\n <div className=\"bg-amber-50 rounded-xl p-4 border border-amber-200\">\n <div className=\"flex items-center space-x-3\">\n <span className=\"text-2xl\">🌅</span>\n <div>\n <h4 className=\"font-medium text-amber-800\">全天事件模式</h4>\n <p className=\"text-sm text-amber-700 mt-1\">\n 此事件将持续整天,无需设置具体时间。事件将在选定日期的全天显示。\n </p>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n\n // 渲染多天事件表单\n const renderMultiDayEventForm = () => (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 开始日期 *\n </label>\n <input\n type=\"date\"\n value={formData.startDate}\n onChange={(e) => handleInputChange('startDate', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 结束日期 *\n </label>\n <input\n type=\"date\"\n value={formData.endDate}\n onChange={(e) => handleInputChange('endDate', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n\n {!formData.allDay && (\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 每日开始时间\n </label>\n <input\n type=\"time\"\n value={formData.dailyStartTime}\n onChange={(e) => handleInputChange('dailyStartTime', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 每日结束时间\n </label>\n <input\n type=\"time\"\n value={formData.dailyEndTime}\n onChange={(e) => handleInputChange('dailyEndTime', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n )}\n\n <div className=\"p-3 bg-blue-50 rounded-lg text-sm text-blue-700\">\n <strong>示例</strong>:如果您要创建一个从21号到23号的培训课程,系统将在这三天内每天都创建一个事件实例。\n </div>\n </div>\n );\n\n // 渲染重复事件表单\n const renderRecurringEventForm = () => (\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 开始日期 *\n </label>\n <input\n type=\"date\"\n value={formData.recurrenceStartDate}\n onChange={(e) => handleInputChange('recurrenceStartDate', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n\n {!formData.allDay && (\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 开始时间 *\n </label>\n <input\n type=\"datetime-local\"\n value={formData.recurrenceStartTime}\n onChange={(e) => handleInputChange('recurrenceStartTime', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 结束时间 *\n </label>\n <input\n type=\"datetime-local\"\n value={formData.recurrenceEndTime}\n onChange={(e) => handleInputChange('recurrenceEndTime', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n )}\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 重复模式 *\n </label>\n <select\n value={formData.recurrencePattern}\n onChange={(e) => handleInputChange('recurrencePattern', e.target.value as RecurrencePattern)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n >\n <option value={RecurrencePattern.DAILY}>每天</option>\n <option value={RecurrencePattern.WEEKLY}>每周</option>\n <option value={RecurrencePattern.MONTHLY}>每月</option>\n <option value={RecurrencePattern.YEARLY}>每年</option>\n </select>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 重复间隔\n </label>\n <input\n type=\"number\"\n min=\"1\"\n max=\"365\"\n value={formData.recurrenceInterval}\n onChange={(e) => handleInputChange('recurrenceInterval', parseInt(e.target.value) || 1)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n\n {/* 结束条件 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 结束条件\n </label>\n <div className=\"space-y-3\">\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n checked={formData.useEndDate}\n onChange={() => handleInputChange('useEndDate', true)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">结束日期</span>\n </label>\n \n {formData.useEndDate && (\n <input\n type=\"date\"\n value={formData.recurrenceEndDate}\n onChange={(e) => handleInputChange('recurrenceEndDate', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n )}\n\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n checked={!formData.useEndDate}\n onChange={() => handleInputChange('useEndDate', false)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">重复次数</span>\n </label>\n \n {!formData.useEndDate && (\n <input\n type=\"number\"\n min=\"1\"\n max=\"999\"\n value={formData.recurrenceCount}\n onChange={(e) => handleInputChange('recurrenceCount', parseInt(e.target.value) || 0)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"输入重复次数\"\n />\n )}\n </div>\n </div>\n\n <div className=\"p-3 bg-purple-50 rounded-lg text-sm text-purple-700\">\n <strong>示例</strong>:选择\"每天重复3次\"将创建3个独立的事件实例,分别在连续的3天发生。\n </div>\n </div>\n );\n\n return (\n <>\n <Modal isOpen={isOpen} onClose={handleClose} width=\"800px\" height=\"auto\">\n <div className=\"relative\">\n {/* 头部 */}\n <div className=\"px-6 py-4 border-b border-gray-200 bg-gradient-to-r from-blue-50 to-indigo-50\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"w-10 h-10 bg-blue-100 rounded-full flex items-center justify-center\">\n <span className=\"text-blue-600 text-lg\">\n {isEditMode ? '✏️' : '➕'}\n </span>\n </div>\n <div>\n <h2 className=\"text-xl font-semibold text-gray-900\">\n {isEditMode ? '编辑事件' : '创建新事件'}\n </h2>\n <p className=\"text-sm text-gray-600\">\n {isEditMode ? '修改事件信息' : '填写事件详细信息'}\n </p>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"w-8 h-8 flex items-center justify-center rounded-full hover:bg-gray-100 transition-colors\"\n >\n <span className=\"text-gray-400 text-xl\">×</span>\n </button>\n </div>\n </div>\n\n {/* 表单内容 */}\n <div className=\"px-6 py-6 max-h-[70vh] overflow-y-auto\">\n <form onSubmit={handleSubmit} className=\"space-y-8\">\n {/* 事件类型选择器 */}\n {!isEditMode && (\n <div className=\"bg-gray-50 rounded-lg p-4\">\n {renderEventTypeSelector()}\n </div>\n )}\n\n {/* 基础信息 */}\n <div className=\"space-y-6\">\n <div className=\"flex items-center space-x-2 mb-4\">\n <div className=\"w-1 h-6 bg-blue-500 rounded-full\"></div>\n <h3 className=\"text-lg font-medium text-gray-900\">基本信息</h3>\n </div>\n {renderBasicForm()}\n </div>\n\n {/* 时间设置 */}\n <div className=\"space-y-6\">\n <div className=\"flex items-center space-x-2 mb-4\">\n <div className=\"w-1 h-6 bg-green-500 rounded-full\"></div>\n <h3 className=\"text-lg font-medium text-gray-900\">时间设置</h3>\n </div>\n {eventType === EventType.SINGLE && renderSingleEventForm()}\n {eventType === EventType.MULTI_DAY && renderMultiDayEventForm()}\n {eventType === EventType.RECURRING && renderRecurringEventForm()}\n </div>\n\n {/* 错误提示 */}\n {(errors.general || errors.submit) && (\n <div className=\"space-y-3\">\n {errors.general && (\n <div className=\"flex items-start space-x-3 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <div className=\"flex-shrink-0\">\n <span className=\"text-red-500 text-lg\">⚠️</span>\n </div>\n <div>\n <h4 className=\"text-sm font-medium text-red-800\">表单验证错误</h4>\n <p className=\"text-sm text-red-600 mt-1\">{errors.general}</p>\n </div>\n </div>\n )}\n\n {errors.submit && (\n <div className=\"flex items-start space-x-3 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <div className=\"flex-shrink-0\">\n <span className=\"text-red-500 text-lg\">❌</span>\n </div>\n <div>\n <h4 className=\"text-sm font-medium text-red-800\">保存失败</h4>\n <p className=\"text-sm text-red-600 mt-1\">{errors.submit}</p>\n </div>\n </div>\n )}\n </div>\n )}\n </form>\n </div>\n\n {/* 底部操作栏 */}\n <div className=\"px-6 py-4 border-t border-gray-200 bg-gray-50\">\n <div className=\"flex items-center justify-between\">\n <div>\n {isEditMode && onDelete && (\n <button\n type=\"button\"\n onClick={() => setShowDeleteConfirm(true)}\n className=\"inline-flex items-center px-4 py-2 text-sm font-medium text-red-600 bg-white border border-red-300 rounded-lg hover:bg-red-50 hover:border-red-400 transition-all duration-200 shadow-sm hover:shadow-md\"\n >\n <span className=\"mr-2\">🗑️</span>\n 删除事件\n </button>\n )}\n </div>\n\n <div className=\"flex items-center space-x-3\">\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"inline-flex items-center px-6 py-2.5 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 hover:border-gray-400 transition-all duration-200 shadow-sm hover:shadow-md\"\n >\n 取消\n </button>\n <button\n type=\"submit\"\n disabled={isLoading}\n onClick={handleSubmit}\n className=\"inline-flex items-center px-6 py-2.5 text-sm font-medium text-white bg-gradient-to-r from-blue-600 to-blue-700 border border-blue-600 rounded-lg hover:from-blue-700 hover:to-blue-800 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-200 shadow-md hover:shadow-lg transform hover:-translate-y-0.5\"\n >\n {isLoading && (\n <div className=\"mr-2 w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin\"></div>\n )}\n <span className=\"mr-2\">{isEditMode ? '💾' : '✨'}</span>\n {isLoading ? '保存中...' : (isEditMode ? '更新事件' : '创建事件')}\n </button>\n </div>\n </div>\n </div>\n </div>\n </Modal>\n\n {/* 删除确认弹窗 */}\n <ConfirmModal\n isOpen={showDeleteConfirm}\n onClose={() => setShowDeleteConfirm(false)}\n onConfirm={handleDelete}\n title=\"确认删除\"\n message=\"确定要删除这个事件吗?此操作无法撤销。\"\n confirmText=\"删除\"\n cancelText=\"取消\"\n isLoading={isLoading}\n />\n </>\n );\n};\n\nexport default ImprovedEventModal; ","'use client';\n\nimport React, { ReactNode, useEffect } from 'react';\n\ninterface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n children: ReactNode;\n width?: string | number;\n height?: string | number;\n maskClosable?: boolean;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n children,\n width = 600,\n maskClosable = true,\n}) => {\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = 'unset';\n }\n return () => {\n document.body.style.overflow = 'unset';\n };\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-[50] flex items-center justify-center p-4\">\n <div \n className=\"fixed inset-0 bg-black/50 transition-opacity\" \n onClick={() => maskClosable && onClose()}\n />\n <div \n className=\"bg-white rounded-xl shadow-2xl z-[10] overflow-hidden flex flex-col transition-all transform scale-100\"\n style={{ width: typeof width === 'number' ? (width) + 'px' : width, maxWidth: '100%' }}\n >\n {title && (\n <div className=\"px-6 py-4 border-b border-gray-200 flex justify-between items-center\">\n <h3 className=\"text-xl font-semibold text-gray-900\">{title}</h3>\n <button onClick={onClose} className=\"text-gray-400 hover:text-gray-600 transition-colors\">\n <span className=\"text-2xl\">×</span>\n </button>\n </div>\n )}\n <div className=\"flex-1 overflow-y-auto\">\n {children}\n </div>\n </div>\n </div>\n );\n};\n\ninterface ConfirmModalProps {\n isOpen: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n message: string;\n confirmText?: string;\n cancelText?: string;\n isLoading?: boolean;\n}\n\nexport const ConfirmModal: React.FC<ConfirmModalProps> = ({\n isOpen,\n onClose,\n onConfirm,\n title,\n message,\n confirmText = '确定',\n cancelText = '取消',\n isLoading = false,\n}) => {\n if (!isOpen) return null;\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} title={title} width={400}>\n <div className=\"p-6\">\n <p className=\"text-gray-600 mb-6\">{message}</p>\n <div className=\"flex justify-end space-x-3\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-gray-700 border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n disabled={isLoading}\n >\n {cancelText}\n </button>\n <button\n onClick={onConfirm}\n className=\"px-4 py-2 bg-red-600 text-white rounded-lg hover:bg-red-700 transition-colors flex items-center\"\n disabled={isLoading}\n >\n {isLoading && (\n <div className=\"mr-2 w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin\" />\n )}\n {confirmText}\n </button>\n </div>\n </div>\n </Modal>\n );\n};\n\n\n\n\n\n\n","'use client';\n\nimport React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport { Settings, Calendar, List, Cog, User } from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { \n CalendarViewType, \n EventColor,\n EventFormData,\n CreateEventRequest,\n UpdateEventRequest,\n EventListDisplayMode,\n EventSortField,\n SortDirection,\n EventPriority,\n EventListConfig,\n formatDate,\n getMonthViewDates,\n getWeekViewDates,\n isToday,\n isSameMonth,\n isSameWeek,\n addDays,\n addWeeks,\n useEvents,\n getWeekdayName\n} from '../index';\nimport EventModal from '../components/EventModal';\nimport EventList from '../components/EventList';\nimport { useEnhancedEvents } from '../hooks/useEnhancedEvents';\nimport { EventData } from '../services/eventTypeService';\nimport ImprovedEventModal from '../components/ImprovedEventModal';\nimport DraggableMonthView from '../components/DraggableMonthView';\nimport CalendarSettings from '../components/CalendarSettings';\nimport type { CalendarSettings as CalendarSettingsType } from '../components/CalendarSettings';\n\ninterface CalendarPageProps {\n /** 当前登录用户信息 */\n user?: { id: number; name?: string; [key: string]: any } | null;\n /** 是否已认证 */\n isAuthenticated?: boolean;\n /** 触发登录的回调 */\n onShowLogin?: () => void;\n /** 自定义页头操作区域(例如用户菜单) */\n headerActions?: React.ReactNode;\n}\n\n/**\n * 基础日历页面组件\n * \n * 这是一个简化版本的日历页面,用于在实验田中展示基本功能\n * 包含了基本的月历视图和事件显示\n */\nexport function CalendarPage({ \n user, \n isAuthenticated = true, \n onShowLogin,\n headerActions\n}: CalendarPageProps) {\n const [currentDate, setCurrentDate] = useState(new Date());\n const [viewType, setViewType] = useState<CalendarViewType>(CalendarViewType.MONTH);\n const [isEventModalOpen, setIsEventModalOpen] = useState(false);\n const [selectedDate, setSelectedDate] = useState<Date | null>(null);\n const [editingEvent, setEditingEvent] = useState<any>(null);\n const [activeTab, setActiveTab] = useState<'calendar' | 'events' | 'settings'>('calendar');\n \n // 日历设置状态\n const [calendarSettings, setCalendarSettings] = useState<CalendarSettingsType | null>(null);\n \n // 事件列表配置\n const [eventListConfig, setEventListConfig] = useState<EventListConfig>({\n displayMode: EventListDisplayMode.LIST,\n sort: {\n field: EventSortField.START_TIME,\n direction: SortDirection.ASC\n },\n filter: {},\n pageSize: 10,\n currentPage: 1\n });\n \n // 使用事件 management Hook\n const { \n events, \n loading, \n error, \n createEvent, \n createEnhancedEvent,\n updateEvent,\n updateEventTime,\n deleteEvent,\n batchDeleteEvents,\n fetchEvents, \n clearError \n } = useEnhancedEvents();\n\n // 获取当前月份的日期数组\n const monthDates = useMemo(() => getMonthViewDates(currentDate), [currentDate]);\n\n // 加载当前月份的事件(包含月视图中显示的相邻月份日期)\n useEffect(() => {\n // 获取月视图显示的所有日期范围(包括上月末和下月初)\n const viewDates = getMonthViewDates(currentDate);\n const viewStart = viewDates[0]; // 第一个日期\n const viewEnd = viewDates[viewDates.length - 1]; // 最后一个日期\n \n if (viewStart && viewEnd) {\n console.log('📅 加载月视图事件范围:', {\n currentMonth: (currentDate.getFullYear()) + '-' + (currentDate.getMonth() + 1),\n viewStart: formatDate(viewStart),\n viewEnd: formatDate(viewEnd),\n totalDays: viewDates.length\n });\n \n fetchEvents(viewStart, viewEnd).catch(err => {\n console.error('加载事件失败:', err);\n });\n }\n }, [currentDate, fetchEvents]);\n\n // 示例事件数据 - 当没有实际事件时显示\n const sampleEvents = useMemo(() => [\n { date: '2024-12-15', title: '团队会议', color: 'blue' },\n { date: '2024-12-20', title: '项目评审', color: 'green' },\n { date: '2024-12-25', title: '圣诞节', color: 'red' },\n { date: '2024-12-31', title: '年终总结', color: 'purple' },\n ], []);\n\n // 向前导航\n const goToPrevious = () => {\n switch (viewType) {\n case CalendarViewType.MONTH:\n setCurrentDate(new Date(currentDate.getFullYear(), currentDate.getMonth() - 1, 1));\n break;\n case CalendarViewType.WEEK:\n setCurrentDate(addDays(currentDate, -7));\n break;\n case CalendarViewType.DAY:\n setCurrentDate(addDays(currentDate, -1));\n break;\n }\n };\n\n // 向后导航\n const goToNext = () => {\n switch (viewType) {\n case CalendarViewType.MONTH:\n setCurrentDate(new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1));\n break;\n case CalendarViewType.WEEK:\n setCurrentDate(addDays(currentDate, 7));\n break;\n case CalendarViewType.DAY:\n setCurrentDate(addDays(currentDate, 1));\n break;\n }\n };\n\n // 切换到今天\n const goToToday = () => {\n setCurrentDate(new Date());\n };\n\n // 获取月份名称\n const getMonthName = (date: Date) => {\n return date.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long' });\n };\n\n // 获取视图标题\n const getViewTitle = () => {\n switch (viewType) {\n case CalendarViewType.MONTH:\n return getMonthName(currentDate);\n case CalendarViewType.WEEK:\n const weekDates = getWeekViewDates(currentDate);\n const weekStart = weekDates[0];\n const weekEnd = weekDates[6];\n if (!weekStart || !weekEnd) {\n return getMonthName(currentDate);\n }\n if (weekStart.getMonth() === weekEnd.getMonth()) {\n return (weekStart.getFullYear()) + '年' + (weekStart.getMonth() + 1) + '月 第' + (Math.ceil(weekStart.getDate() / 7)) + '周';\n } else {\n return (weekStart.getMonth() + 1) + '月' + (weekStart.getDate()) + '日 - ' + (weekEnd.getMonth() + 1) + '月' + (weekEnd.getDate()) + '日';\n }\n case CalendarViewType.DAY:\n return currentDate.toLocaleDateString('zh-CN', { \n year: 'numeric', \n month: 'long', \n day: 'numeric',\n weekday: 'long'\n });\n default:\n return getMonthName(currentDate);\n }\n };\n\n // 检查日期是否有事件(优先使用真实事件,其次使用示例事件)\n const getEventsForDate = (date: Date) => {\n const dateStr = formatDate(date);\n \n // 首先查找真实事件\n const realEvents = events.filter(event => {\n const eventDateStr = formatDate(event.startTime);\n return eventDateStr === dateStr;\n });\n \n // 如果有真实事件,返回真实事件,否则返回示例事件\n if (realEvents.length > 0) {\n return realEvents.map(event => ({\n title: event.title,\n color: event.color,\n id: event.id,\n isRealEvent: true\n }));\n }\n \n // 为了演示效果,显示示例事件\n return sampleEvents.filter(event => event.date === dateStr).map(event => ({\n title: event.title,\n color: event.color,\n id: undefined,\n isRealEvent: false\n }));\n };\n\n // 获取事件颜色类名\n const getEventColorClass = (color: string) => {\n const colorMap: Record<string, string> = {\n blue: 'bg-blue-100 text-blue-800 border-blue-200',\n green: 'bg-green-100 text-green-800 border-green-200',\n red: 'bg-red-100 text-red-800 border-red-200',\n purple: 'bg-purple-100 text-purple-800 border-purple-200',\n yellow: 'bg-yellow-100 text-yellow-800 border-yellow-200',\n '#3B82F6': 'bg-blue-100 text-blue-800 border-blue-200',\n '#10B981': 'bg-green-100 text-green-800 border-green-200',\n '#EF4444': 'bg-red-100 text-red-800 border-red-200',\n '#8B5CF6': 'bg-purple-100 text-purple-800 border-purple-200',\n '#F59E0B': 'bg-yellow-100 text-yellow-800 border-yellow-200',\n };\n return colorMap[color] || 'bg-gray-100 text-gray-800 border-gray-200';\n };\n\n // 处理日期点击事件\n const handleDateClick = (date: Date) => {\n if (!isAuthenticated && onShowLogin) {\n onShowLogin();\n return;\n }\n setSelectedDate(date);\n setEditingEvent(null);\n setIsEventModalOpen(true);\n };\n\n // 处理事件点击(用于编辑)\n const handleEventClick = (event: any, e: React.MouseEvent) => {\n e.stopPropagation(); // 阻止冒泡到日期点击\n if (!isAuthenticated && onShowLogin) {\n onShowLogin();\n return;\n }\n setEditingEvent(event);\n setSelectedDate(null);\n setIsEventModalOpen(true);\n };\n\n // 处理事件保存(创建或更新)\n const handleEventSave = async (eventData: CreateEventRequest | UpdateEventRequest) => {\n if (!isAuthenticated && onShowLogin) {\n onShowLogin();\n return;\n }\n \n try {\n if (!eventData.title || !eventData.startTime || !eventData.endTime) {\n throw new Error('缺少必需的事件信息');\n }\n \n if (editingEvent) {\n await updateEvent(editingEvent.id, {\n title: eventData.title,\n description: eventData.description,\n startTime: new Date(eventData.startTime),\n endTime: new Date(eventData.endTime),\n allDay: eventData.allDay || false,\n location: eventData.location,\n color: eventData.color || EventColor.BLUE,\n priority: eventData.priority || EventPriority.NORMAL,\n });\n } else {\n await createEvent({\n title: eventData.title,\n description: eventData.description,\n startTime: new Date(eventData.startTime),\n endTime: new Date(eventData.endTime),\n allDay: eventData.allDay || false,\n location: eventData.location,\n color: eventData.color || EventColor.BLUE,\n priority: eventData.priority || EventPriority.NORMAL,\n });\n }\n \n setIsEventModalOpen(false);\n setSelectedDate(null);\n setEditingEvent(null);\n } catch (error) {\n console.error(editingEvent ? '更新事件失败:' : '创建事件失败:', error);\n }\n };\n\n // 处理事件删除\n const handleEventDelete = async (eventId: number) => {\n if (!isAuthenticated && onShowLogin) {\n onShowLogin();\n return;\n }\n \n try {\n await deleteEvent(eventId);\n setIsEventModalOpen(false);\n setEditingEvent(null);\n } catch (error) {\n console.error('删除事件失败:', error);\n }\n };\n\n // 处理批量删除事件\n const handleBatchDelete = async (eventIds: number[]) => {\n if (!isAuthenticated && onShowLogin) {\n onShowLogin();\n return;\n }\n \n try {\n await batchDeleteEvents(eventIds);\n } catch (error) {\n console.error('批量删除事件失败:', error);\n throw error;\n }\n };\n\n // 处理事件列表中的事件点击\n const handleEventListClick = (event: any) => {\n setEditingEvent(event);\n setIsEventModalOpen(true);\n };\n\n // 处理事件列表中的事件编辑\n const handleEventListEdit = (event: any) => {\n if (!isAuthenticated && onShowLogin) {\n onShowLogin();\n return;\n }\n setEditingEvent(event);\n setIsEventModalOpen(true);\n };\n\n // 处理事件列表配置变更\n const handleEventListConfigChange = (config: EventListConfig) => {\n setEventListConfig(config);\n };\n\n // 关闭模态框\n const handleModalClose = () => {\n setIsEventModalOpen(false);\n setSelectedDate(null);\n setEditingEvent(null);\n clearError();\n };\n\n // 处理设置变更\n const handleSettingsChange = (newSettings: CalendarSettingsType) => {\n setCalendarSettings(newSettings);\n console.log('📝 日历设置已更新:', newSettings);\n };\n\n // 渲染不同的日历视图\n const renderCalendarView = () => {\n switch (viewType) {\n case CalendarViewType.MONTH:\n return (\n <DraggableMonthView\n events={events}\n currentDate={currentDate}\n onDateChange={setCurrentDate}\n onEventClick={(event) => {\n setEditingEvent(event);\n setIsEventModalOpen(true);\n }}\n onDateClick={handleDateClick}\n onEventUpdate={updateEventTime}\n />\n );\n case CalendarViewType.WEEK:\n return renderWeekView();\n case CalendarViewType.DAY:\n return renderDayView();\n default:\n return (\n <DraggableMonthView\n events={events}\n currentDate={currentDate}\n onDateChange={setCurrentDate}\n onEventClick={(event) => {\n setEditingEvent(event);\n setIsEventModalOpen(true);\n }}\n onDateClick={handleDateClick}\n onEventUpdate={updateEventTime}\n />\n );\n }\n };\n\n // 渲染周视图\n const renderWeekView = () => {\n const weekDates = getWeekViewDates(currentDate);\n \n return (\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden mb-6\">\n <table className=\"w-full table-fixed\">\n <thead>\n <tr className=\"bg-gray-50\">\n {weekDates.map((date, index) => {\n const isWeekend = date.getDay() === 0 || date.getDay() === 6;\n return (\n <th \n key={index} \n className={clsx('p-3 text-center border-b border-gray-200', index < 6 ? 'border-r border-gray-200' : '')}\n >\n <div className={clsx('text-sm font-medium', isWeekend ? 'text-red-600' : 'text-gray-700')}>\n {getWeekdayName(date, 'zh-CN', 'short')}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n <tr>\n {weekDates.map((date, index) => {\n const dayEvents = getEventsForDate(date);\n const isTodayDate = isToday(date);\n const isWeekend = date.getDay() === 0 || date.getDay() === 6;\n \n return (\n <td\n key={index}\n onClick={() => handleDateClick(date)}\n className={clsx('h-56 border-b border-gray-200 relative cursor-pointer', index < 6 ? 'border-r border-gray-200' : '', 'hover:bg-gray-50 transition-colors', isTodayDate ? 'bg-blue-50' : 'bg-white')}\n >\n <div className=\"flex flex-col h-full p-3\">\n <div className=\"flex flex-col items-center mb-3\">\n <div className={clsx('flex items-center justify-center text-lg font-bold w-10 h-10 rounded-full', isTodayDate ? 'bg-blue-600 text-white shadow-md' : \n isWeekend ? 'text-red-600 bg-red-50' : 'text-gray-900 hover:bg-gray-100', 'transition-colors')}>\n {date.getDate()}\n </div>\n {(index === 0 || date.getDate() === 1) && (\n <div className=\"text-xs text-gray-500 mt-1 font-medium\">\n {date.getMonth() + 1}月\n </div>\n )}\n </div>\n \n <div className=\"flex-1 flex flex-col\">\n {dayEvents.length > 0 ? (\n <>\n <div className=\"text-center mb-2\">\n <span className={clsx('inline-flex items-center justify-center w-6 h-6 text-xs font-bold rounded-full', dayEvents.length > 5 ? 'bg-red-100 text-red-700' :\n dayEvents.length > 2 ? 'bg-yellow-100 text-yellow-700' :\n 'bg-green-100 text-green-700')}>\n {dayEvents.length}\n </span>\n </div>\n \n <div className=\"space-y-1 overflow-hidden\">\n {dayEvents.slice(0, 4).map((event, eventIndex) => (\n <div\n key={eventIndex}\n onClick={(e) => event.isRealEvent && event.id ? handleEventClick(events.find(e => e.id === event.id), e) : undefined}\n className={clsx('text-xs px-2 py-1 rounded font-medium truncate text-center', event.isRealEvent ? 'cursor-pointer hover:opacity-80 hover:shadow-sm' : 'cursor-default', 'transition-all duration-200', getEventColorClass(event.color))}\n title={event.title}\n >\n {event.title}\n </div>\n ))}\n {dayEvents.length > 4 && (\n <div className=\"text-xs text-gray-500 text-center py-1 bg-gray-100 rounded\">\n +{dayEvents.length - 4} 更多\n </div>\n )}\n </div>\n </>\n ) : (\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"text-center\">\n <div className=\"w-4 h-4 mx-auto mb-1 opacity-30\">\n <svg fill=\"currentColor\" viewBox=\"0 0 20 20\" className=\"text-gray-400\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"text-xs text-gray-400\">无事件</div>\n </div>\n </div>\n )}\n </div>\n </div>\n </td>\n );\n })}\n </tr>\n </tbody>\n </table>\n </div>\n );\n };\n\n // 渲染日视图\n const renderDayView = () => {\n const dayEvents = getEventsForDate(currentDate);\n const isTodayDate = isToday(currentDate);\n \n return (\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden mb-6\">\n <div className=\"bg-gray-50 p-4 border-b border-gray-200\">\n <div className=\"text-center\">\n <div className=\"text-sm text-gray-600 mb-1\">\n {currentDate.toLocaleDateString('zh-CN', { weekday: 'long' })}\n </div>\n <div className={clsx('text-2xl font-bold', isTodayDate ? 'text-blue-600' : 'text-gray-900')}>\n {currentDate.getDate()}日\n </div>\n <div className=\"text-sm text-gray-600\">\n {currentDate.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long' })}\n </div>\n </div>\n </div>\n\n <div className=\"p-4\">\n <button\n onClick={() => handleDateClick(currentDate)}\n className=\"w-full mb-4 p-3 border-2 border-dashed border-gray-300 rounded-lg text-gray-600 hover:border-blue-300 hover:text-blue-600 transition-colors\"\n >\n + 在此日期创建事件\n </button>\n\n {dayEvents.length > 0 ? (\n <div className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-gray-700 mb-3\">\n 今日事件 ({dayEvents.length})\n </h3>\n {dayEvents.map((event, eventIndex) => (\n <div\n key={eventIndex}\n onClick={(e) => event.isRealEvent && event.id ? handleEventClick(events.find(e => e.id === event.id), e) : undefined}\n className={clsx('p-3 rounded-lg border-l-4 bg-gray-50', event.isRealEvent ? 'cursor-pointer hover:shadow-md' : 'cursor-default', 'transition-shadow', getEventColorClass(event.color))}\n >\n <div className=\"font-medium text-sm mb-1\">{event.title}</div>\n {event.isRealEvent && event.id && (\n <div className=\"text-xs text-gray-600\">\n 点击编辑事件\n </div>\n )}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-8 text-gray-500\">\n <svg className=\"w-12 h-12 mx-auto mb-3 text-gray-300\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <p>今日暂无事件</p>\n <p className=\"text-xs mt-1\">点击上方按钮创建事件</p>\n </div>\n )}\n </div>\n </div>\n );\n };\n\n // 处理增强事件创建\n const handleCreateEnhancedEvent = useCallback(async (eventData: EventData) => {\n try {\n const createdEvents = await createEnhancedEvent(eventData);\n setIsEventModalOpen(false);\n setSelectedDate(null);\n \n const eventCount = createdEvents.length;\n if (eventCount > 1) {\n alert('成功创建 ' + (eventCount) + ' 个事件!');\n } else {\n alert('事件创建成功!');\n }\n } catch (error) {\n console.error('创建增强事件失败:', error);\n alert('创建事件失败,请重试');\n }\n }, [createEnhancedEvent]);\n\n return (\n <div className=\"min-h-screen bg-gray-50\">\n <div className=\"max-w-7xl mx-auto p-4 lg:p-6\">\n <div className=\"mb-6\">\n <div className=\"flex justify-between items-start mb-4\">\n <div>\n <h1 className=\"text-3xl font-bold text-gray-900 mb-2\">日历管理</h1>\n <p className=\"text-gray-600\">\n 功能完整的日历应用,支持事件管理、提醒、重复事件等功能\n </p>\n </div>\n \n <div className=\"flex items-center gap-3\">\n {headerActions}\n {!headerActions && !isAuthenticated && (\n <button\n onClick={onShowLogin}\n className=\"px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors\"\n >\n 登录\n </button>\n )}\n </div>\n </div>\n \n <div className=\"flex space-x-1 bg-gray-100 p-1 rounded-lg w-fit\">\n <button\n onClick={() => setActiveTab('calendar')}\n className={clsx('px-4 py-2 text-sm font-medium rounded-md transition-colors', activeTab === 'calendar'\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900')}\n >\n 📅 日历视图\n </button>\n <button\n onClick={() => setActiveTab('events')}\n className={clsx('px-4 py-2 text-sm font-medium rounded-md transition-colors', activeTab === 'events'\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900')}\n >\n 📋 事件列表\n </button>\n <button\n onClick={() => setActiveTab('settings')}\n className={clsx('px-4 py-2 text-sm font-medium rounded-md transition-colors', activeTab === 'settings'\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900')}\n >\n ⚙️ 设置\n </button>\n </div>\n </div>\n\n {error && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-4 mb-6\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-red-400 mt-0.5\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-red-800\">操作失败</h3>\n <p className=\"mt-1 text-sm text-red-700\">{error}</p>\n <button\n onClick={clearError}\n className=\"mt-2 text-sm text-red-600 hover:text-red-800 font-medium\"\n >\n 关闭\n </button>\n </div>\n </div>\n </div>\n )}\n\n {activeTab === 'calendar' && (\n <>\n <div className=\"bg-blue-50 border border-blue-200 rounded-lg p-4 mb-6\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-blue-400 mt-0.5\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-blue-800\">功能说明</h3>\n <p className=\"mt-1 text-sm text-blue-700\">\n 点击日历上的任意日期可以创建新事件。当前已支持完整的事件管理功能,包括创建、编辑、删除等操作。\n {!isAuthenticated && (\n <span className=\"block mt-2 text-orange-700 font-medium\">\n 💡 提示:请先登录以使用完整的事件管理功能\n </span>\n )}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-4 mb-6\">\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div className=\"flex items-center gap-3\">\n <button onClick={goToPrevious} className=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\">\n <svg className=\"w-5 h-5 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <h2 className=\"text-xl font-semibold text-gray-900 min-w-[160px] text-center\">{getViewTitle()}</h2>\n <button onClick={goToNext} className=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\">\n <svg className=\"w-5 h-5 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <button onClick={goToToday} className=\"px-4 py-2 text-sm font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded-lg transition-colors\">\n 今天\n </button>\n <div className=\"flex items-center bg-gray-100 rounded-lg p-1\">\n {(['month', 'week', 'day'] as const).map((view) => (\n <button\n key={view}\n onClick={() => setViewType(CalendarViewType[view.toUpperCase() as keyof typeof CalendarViewType])}\n className={clsx('px-3 py-1.5 text-sm font-medium rounded-md transition-colors', viewType === CalendarViewType[view.toUpperCase() as keyof typeof CalendarViewType]\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900')}\n >\n {view === 'month' ? '月' : view === 'week' ? '周' : '日'}\n </button>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n {renderCalendarView()}\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-6\">\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n <div className=\"flex items-center mb-4\">\n <div className=\"bg-blue-100 p-3 rounded-lg\">\n <svg className=\"w-6 h-6 text-blue-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </div>\n <h3 className=\"ml-3 text-lg font-semibold text-gray-900\">事件管理</h3>\n </div>\n <p className=\"text-gray-600 text-sm mb-4\">创建、编辑、删除日历事件,支持拖拽调整时间,多种颜色标识。</p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n <div className=\"flex items-center mb-4\">\n <div className=\"bg-green-100 p-3 rounded-lg\">\n <svg className=\"w-6 h-6 text-green-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </div>\n <h3 className=\"ml-3 text-lg font-semibold text-gray-900\">重复事件</h3>\n </div>\n <p className=\"text-gray-600 text-sm mb-4\">支持日、周、月、年重复模式,灵活的重复规则配置。</p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n <div className=\"flex items-center mb-4\">\n <div className=\"bg-purple-100 p-3 rounded-lg\">\n <svg className=\"w-6 h-6 text-purple-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 17h5l-5 5v-5zM4 7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v6a2 2 0 01-2 2H6a2 2 0 01-2-2V7z\" />\n </svg>\n </div>\n <h3 className=\"ml-3 text-lg font-semibold text-gray-900\">智能提醒</h3>\n </div>\n <p className=\"text-gray-600 text-sm mb-4\">邮件、通知、短信多种提醒方式,自定义提醒时间。</p>\n </div>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">技术特性</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"flex items-center text-sm text-gray-600\">\n <svg className=\"w-4 h-4 text-green-500 mr-3 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n 完整的TypeScript类型定义\n </div>\n <div className=\"flex items-center text-sm text-gray-600\">\n <svg className=\"w-4 h-4 text-green-500 mr-3 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n 响应式设计 (TailwindCSS)\n </div>\n </div>\n </div>\n </>\n )}\n\n {activeTab === 'events' && (\n <EventList\n events={events}\n config={eventListConfig}\n onConfigChange={handleEventListConfigChange}\n onEventClick={handleEventListClick}\n onEventEdit={handleEventListEdit}\n onEventDelete={handleEventDelete}\n onBatchDelete={handleBatchDelete}\n enableBatchActions={true}\n loading={loading}\n />\n )}\n\n {activeTab === 'settings' && (\n <CalendarSettings\n onSettingsChange={handleSettingsChange}\n />\n )}\n </div>\n\n <ImprovedEventModal\n isOpen={isEventModalOpen}\n onClose={handleModalClose}\n onSave={handleCreateEnhancedEvent}\n onDelete={editingEvent ? handleEventDelete : undefined}\n event={editingEvent}\n initialDate={selectedDate || undefined}\n />\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { CalendarEvent, useEvents, formatDate, formatTime } from '../index';\nimport EventModal from '../components/EventModal';\nimport { ConfirmModal } from '@/components';\nimport { clsx } from 'clsx';\n\ninterface EventDetailPageProps {\n eventId: number;\n onBack?: () => void;\n onEdit?: (event: CalendarEvent) => void;\n onDelete?: (eventId: number) => void;\n}\n\nconst EventDetailPage: React.FC<EventDetailPageProps> = ({\n eventId,\n onBack,\n onEdit,\n onDelete,\n}) => {\n const [event, setEvent] = useState<CalendarEvent | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n\n const { events, updateEvent, deleteEvent } = useEvents();\n\n // 加载事件详情\n useEffect(() => {\n const foundEvent = events.find(e => e.id === eventId);\n if (foundEvent) {\n setEvent(foundEvent);\n setIsLoading(false);\n }\n }, [eventId, events]);\n\n // 处理编辑事件\n const handleEditSave = async (eventData: any) => {\n if (!event) return;\n \n try {\n await updateEvent(event.id, eventData);\n setIsEditModalOpen(false);\n // 重新加载事件数据\n const updatedEvent = events.find(e => e.id === eventId);\n if (updatedEvent) {\n setEvent(updatedEvent);\n }\n } catch (error) {\n console.error('更新事件失败:', error);\n }\n };\n\n // 处理删除事件\n const handleDelete = async () => {\n if (!event) return;\n \n setIsDeleting(true);\n try {\n await deleteEvent(event.id);\n setShowDeleteConfirm(false);\n if (onDelete) {\n onDelete(event.id);\n }\n if (onBack) {\n onBack();\n }\n } catch (error) {\n console.error('删除事件失败:', error);\n } finally {\n setIsDeleting(false);\n }\n };\n\n // 获取事件优先级显示文本\n const getPriorityText = (priority: string) => {\n switch (priority) {\n case 'high': return '高';\n case 'normal': return '普通';\n case 'low': return '低';\n default: return '普通';\n }\n };\n\n // 获取事件优先级颜色\n const getPriorityColor = (priority: string) => {\n switch (priority) {\n case 'high': return 'text-red-600 bg-red-50';\n case 'normal': return 'text-blue-600 bg-blue-50';\n case 'low': return 'text-gray-600 bg-gray-50';\n default: return 'text-blue-600 bg-blue-50';\n }\n };\n\n if (isLoading) {\n return (\n <div className=\"min-h-screen bg-gray-50 flex items-center justify-center\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto\"></div>\n <p className=\"mt-4 text-gray-600\">加载事件详情...</p>\n </div>\n </div>\n );\n }\n\n if (!event) {\n return (\n <div className=\"min-h-screen bg-gray-50 flex items-center justify-center\">\n <div className=\"text-center\">\n <p className=\"text-gray-600\">事件不存在</p>\n {onBack && (\n <button\n onClick={onBack}\n className=\"mt-4 px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700\"\n >\n 返回\n </button>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"min-h-screen bg-gray-50\">\n <div className=\"max-w-4xl mx-auto px-4 py-8\">\n {/* 头部 */}\n <div className=\"mb-8\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-4\">\n {onBack && (\n <button\n onClick={onBack}\n className=\"p-2 hover:bg-gray-100 rounded-md\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n <h1 className=\"text-3xl font-bold text-gray-900\">事件详情</h1>\n </div>\n \n <div className=\"flex space-x-3\">\n <button\n onClick={() => setIsEditModalOpen(true)}\n className=\"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700\"\n >\n 编辑\n </button>\n <button\n onClick={() => setShowDeleteConfirm(true)}\n className=\"px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700\"\n >\n 删除\n </button>\n </div>\n </div>\n </div>\n\n {/* 事件详情卡片 */}\n <div className=\"bg-white rounded-lg shadow-md overflow-hidden\">\n {/* 事件头部 */}\n <div className=\"px-6 py-4 border-b border-gray-200\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-2xl font-semibold text-gray-900\">{event.title}</h2>\n <div className=\"flex items-center space-x-2\">\n <span\n className={clsx('px-2 py-1 text-xs font-medium rounded-full', getPriorityColor(event.priority || 'normal'))}\n >\n {getPriorityText(event.priority || 'normal')}\n </span>\n <div\n className=\"w-4 h-4 rounded-full\"\n style={{ backgroundColor: event.color }}\n />\n </div>\n </div>\n </div>\n\n {/* 事件详情内容 */}\n <div className=\"px-6 py-6\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {/* 时间信息 */}\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-medium text-gray-900\">时间信息</h3>\n \n <div className=\"space-y-3\">\n <div className=\"flex items-center space-x-3\">\n <svg className=\"w-5 h-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">开始时间</p>\n <p className=\"font-medium\">\n {formatDate(new Date(event.startTime))} {formatTime(new Date(event.startTime))}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center space-x-3\">\n <svg className=\"w-5 h-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">结束时间</p>\n <p className=\"font-medium\">\n {formatDate(new Date(event.endTime))} {formatTime(new Date(event.endTime))}\n </p>\n </div>\n </div>\n\n {event.allDay && (\n <div className=\"flex items-center space-x-3\">\n <svg className=\"w-5 h-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\" />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">全天事件</p>\n <p className=\"font-medium text-blue-600\">是</p>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* 基本信息 */}\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-medium text-gray-900\">基本信息</h3>\n \n <div className=\"space-y-3\">\n {event.location && (\n <div className=\"flex items-center space-x-3\">\n <svg className=\"w-5 h-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">地点</p>\n <p className=\"font-medium\">{event.location}</p>\n </div>\n </div>\n )}\n\n <div className=\"flex items-center space-x-3\">\n <svg className=\"w-5 h-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 4V2a1 1 0 011-1h8a1 1 0 011 1v2M7 4a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V6a2 2 0 00-2-2M7 4h10M7 8h10M7 12h10\" />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">创建时间</p>\n <p className=\"font-medium\">\n {formatDate(new Date(event.createdAt))} {formatTime(new Date(event.createdAt))}\n </p>\n </div>\n </div>\n\n {event.updatedAt && event.updatedAt !== event.createdAt && (\n <div className=\"flex items-center space-x-3\">\n <svg className=\"w-5 h-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">最后修改</p>\n <p className=\"font-medium\">\n {formatDate(new Date(event.updatedAt))} {formatTime(new Date(event.updatedAt))}\n </p>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* 描述 */}\n {event.description && (\n <div className=\"mt-6 pt-6 border-t border-gray-200\">\n <h3 className=\"text-lg font-medium text-gray-900 mb-3\">描述</h3>\n <div className=\"prose max-w-none\">\n <p className=\"text-gray-700 whitespace-pre-wrap\">{event.description}</p>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* 编辑事件弹窗 */}\n <EventModal\n isOpen={isEditModalOpen}\n onClose={() => setIsEditModalOpen(false)}\n onSave={handleEditSave}\n event={event}\n />\n\n {/* 删除确认弹窗 */}\n <ConfirmModal\n isOpen={showDeleteConfirm}\n onClose={() => setShowDeleteConfirm(false)}\n onConfirm={handleDelete}\n title=\"确认删除\"\n message={'您确定要删除事件\"' + (event.title) + '\"吗?此操作无法撤销。'}\n confirmText=\"删除\"\n cancelText=\"取消\"\n isLoading={isDeleting}\n />\n </div>\n );\n};\n\nexport default EventDetailPage; "]}
|
|
1
|
+
{"version":3,"sources":["../../../src/calendar/types/index.ts","../../../src/calendar/utils/dateUtils.ts","../../../src/calendar/hooks/useEvents.ts","../../../src/calendar/services/eventTypeService.ts","../../../src/calendar/hooks/useEnhancedEvents.ts","../../../src/calendar/hooks/useEventDrag.ts","../../../src/calendar/services/exportService.ts","../../../src/calendar/services/importService.ts","../../../src/calendar/services/recurrenceService.ts","../../../src/calendar/services/reminderService.ts","../../../src/calendar/utils/deviceUtils.ts","../../../src/calendar/core/index.ts","../../../src/calendar/components/CalendarSettings.tsx","../../../src/calendar/components/DraggableEvent.tsx","../../../src/calendar/components/DroppableCalendarCell.tsx","../../../src/calendar/components/DraggableMonthView.tsx","../../../src/calendar/components/EventForm.tsx","../../../src/components/SearchBox.tsx","../../../src/logger/console-adapter.ts","../../../src/logger/Logger.ts","../../../src/utils/cn.ts","../../../src/components/Button.tsx","../../../src/components/Card.tsx","../../../src/components/Badge.tsx","../../../src/components/Input.tsx","../../../src/components/Label.tsx","../../../src/components/internal/ui-core.tsx","../../../src/components/Tabs.tsx","../../../src/components/Dialog.tsx","../../../src/components/AlertDialog.tsx","../../../src/components/DropdownMenu.tsx","../../../src/components/Popover.tsx","../../../src/components/Progress.tsx","../../../src/components/ScrollArea.tsx","../../../src/components/Select.tsx","../../../src/components/Separator.tsx","../../../src/components/Sheet.tsx","../../../src/components/Textarea.tsx","../../../src/components/Tooltip.tsx","../../../src/components/Avatar.tsx","../../../src/components/PopWindow.tsx","../../../src/calendar/components/EventList.tsx","../../../src/calendar/components/EventModal.tsx","../../../src/calendar/components/EventSearch.tsx","../../../src/calendar/components/ImprovedEventModal.tsx","../../../src/calendar/components/internal/PopWindow.tsx","../../../src/calendar/pages/CalendarPage.tsx","../../../src/calendar/pages/EventDetailPage.tsx"],"names":["RecurrenceType","ReminderType","ReminderStatus","CalendarViewType","EventColor","EventPriority","EventSortField","SortDirection","EventListDisplayMode","useState","useCallback","EventType","RecurrencePattern","formatTime","useEffect","React","clsx","useDraggable","useDroppable","useMemo","_","isWeekend","DndContext","DragOverlay","twMerge","cva","React7","React8","React10","React11","React12","createPortal","React13","React14","X","React15","React16","Check","Circle","ChevronRight","React17","React18","React19","React20","ChevronDown","ChevronUp","React21","React22","React23","React24","React25","Modal","getMonthName","error","e"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 日历模块类型定义\n * \n * 定义了日历模块中使用的所有TypeScript类型,包括:\n * - 事件相关类型\n * - 日历视图类型 \n * - 重复规则类型\n * - 提醒类型\n * - API响应类型\n * - 组件Props类型\n */\n\n// ===== 基础数据类型 =====\n\n/**\n * 日历事件\n */\nexport interface CalendarEvent {\n id: number;\n title: string;\n description?: string;\n startTime: Date;\n endTime: Date;\n allDay: boolean;\n location?: string;\n color: string;\n priority: EventPriority;\n userId: number;\n createdAt: Date;\n updatedAt: Date;\n // 关联数据\n recurrenceRule?: RecurrenceRule;\n reminders?: Reminder[];\n}\n\n/**\n * 重复规则\n */\nexport interface RecurrenceRule {\n id: number;\n eventId: number;\n ruleType: RecurrenceType;\n interval: number;\n endDate?: Date;\n count?: number;\n byWeekday?: number[]; // 0-6, 0=周日\n byMonthday?: number[]; // 1-31\n byMonth?: number[]; // 1-12\n}\n\n/**\n * 提醒\n */\nexport interface Reminder {\n id: number;\n eventId: number;\n reminderTime: Date;\n reminderType: ReminderType;\n status: ReminderStatus;\n createdAt: Date;\n}\n\n// ===== 枚举类型 =====\n\n/**\n * 重复类型\n */\nexport enum RecurrenceType {\n DAILY = 'daily',\n WEEKLY = 'weekly', \n MONTHLY = 'monthly',\n YEARLY = 'yearly',\n CUSTOM = 'custom'\n}\n\n/**\n * 提醒类型\n */\nexport enum ReminderType {\n NOTIFICATION = 'notification',\n EMAIL = 'email',\n SMS = 'sms'\n}\n\n/**\n * 提醒状态\n */\nexport enum ReminderStatus {\n PENDING = 'pending',\n SENT = 'sent',\n FAILED = 'failed'\n}\n\n/**\n * 日历视图类型\n */\nexport enum CalendarViewType {\n MONTH = 'month',\n WEEK = 'week',\n DAY = 'day',\n AGENDA = 'agenda'\n}\n\n/**\n * 事件颜色预设\n */\nexport enum EventColor {\n BLUE = '#3B82F6',\n GREEN = '#10B981',\n PURPLE = '#8B5CF6',\n RED = '#EF4444',\n YELLOW = '#F59E0B',\n PINK = '#EC4899',\n INDIGO = '#6366F1',\n GRAY = '#6B7280'\n}\n\n/**\n * 事件优先级\n */\nexport enum EventPriority {\n LOW = 'low',\n NORMAL = 'normal',\n HIGH = 'high',\n URGENT = 'urgent'\n}\n\n// ===== 表单数据类型 =====\n\n/**\n * 事件表单数据\n */\nexport interface EventFormData {\n title: string;\n description?: string;\n startTime: Date;\n endTime: Date;\n allDay: boolean;\n location?: string;\n color: string;\n priority: EventPriority;\n recurrence?: RecurrenceFormData;\n reminders?: ReminderFormData[];\n}\n\n/**\n * 重复规则表单数据\n */\nexport interface RecurrenceFormData {\n ruleType: RecurrenceType;\n interval: number;\n endDate?: Date;\n count?: number;\n byWeekday?: number[];\n byMonthday?: number[];\n byMonth?: number[];\n}\n\n/**\n * 提醒表单数据\n */\nexport interface ReminderFormData {\n reminderTime: Date;\n reminderType: ReminderType;\n}\n\n// ===== API类型 =====\n\n/**\n * API提醒数据\n */\nexport interface ReminderApiData {\n reminderTime: string; // ISO string\n reminderType: ReminderType;\n}\n\n/**\n * 创建事件请求\n */\nexport interface CreateEventRequest {\n title: string;\n description?: string;\n startTime: string; // ISO string\n endTime: string; // ISO string\n allDay: boolean;\n location?: string;\n color: string;\n priority: EventPriority;\n recurrence?: RecurrenceFormData;\n reminders?: ReminderApiData[];\n}\n\n/**\n * 更新事件请求\n */\nexport interface UpdateEventRequest {\n title?: string;\n description?: string;\n startTime?: string; // ISO string\n endTime?: string; // ISO string\n allDay?: boolean;\n location?: string;\n color?: string;\n priority?: EventPriority;\n recurrence?: RecurrenceFormData;\n reminders?: ReminderApiData[];\n}\n\n/**\n * 删除事件请求\n */\nexport interface DeleteEventRequest {\n id: number;\n deleteAll?: boolean; // 是否删除所有重复事件\n}\n\n/**\n * 获取事件请求参数\n */\nexport interface GetEventsRequest {\n startDate: string; // ISO string\n endDate: string; // ISO string\n viewType?: CalendarViewType;\n userId?: number;\n}\n\n/**\n * API响应基础类型\n */\nexport interface ApiResponse<T = any> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n}\n\n/**\n * 事件列表响应\n */\nexport interface EventsResponse extends ApiResponse<CalendarEvent[]> {}\n\n/**\n * 单个事件响应\n */\nexport interface EventResponse extends ApiResponse<CalendarEvent> {}\n\n// ===== 组件Props类型 =====\n\n/**\n * 日历视图组件Props\n */\nexport interface CalendarViewProps {\n events: CalendarEvent[];\n viewType: CalendarViewType;\n currentDate: Date;\n onDateChange: (date: Date) => void;\n onViewTypeChange: (viewType: CalendarViewType) => void;\n onEventClick: (event: CalendarEvent) => void;\n onEventCreate: (event: EventFormData) => void;\n onEventUpdate: (event: CalendarEvent) => void;\n onEventDelete: (eventId: number) => void;\n loading?: boolean;\n className?: string;\n}\n\n/**\n * 事件卡片组件Props\n */\nexport interface EventCardProps {\n event: CalendarEvent;\n onClick?: (event: CalendarEvent) => void;\n onEdit?: (event: CalendarEvent) => void;\n onDelete?: (eventId: number) => void;\n compact?: boolean;\n className?: string;\n}\n\n/**\n * 事件表单组件Props\n */\nexport interface EventFormProps {\n event?: CalendarEvent;\n onSubmit: (eventData: EventFormData) => void;\n onCancel: () => void;\n loading?: boolean;\n className?: string;\n}\n\n/**\n * 事件弹窗组件Props\n */\nexport interface EventModalProps {\n isOpen: boolean;\n event?: CalendarEvent;\n onClose: () => void;\n onSave: (eventData: EventFormData) => void;\n onDelete?: (eventId: number) => void;\n loading?: boolean;\n}\n\n/**\n * 迷你日历组件Props\n */\nexport interface MiniCalendarProps {\n selectedDate: Date;\n onDateSelect: (date: Date) => void;\n events?: CalendarEvent[];\n highlightDatesWithEvents?: boolean;\n className?: string;\n}\n\n// ===== 状态管理类型 =====\n\n/**\n * 日历状态\n */\nexport interface CalendarState {\n events: CalendarEvent[];\n currentDate: Date;\n viewType: CalendarViewType;\n selectedEvent?: CalendarEvent;\n loading: boolean;\n error?: string;\n}\n\n/**\n * 日历操作类型\n */\nexport interface CalendarActions {\n setEvents: (events: CalendarEvent[]) => void;\n addEvent: (event: CalendarEvent) => void;\n updateEvent: (event: CalendarEvent) => void;\n deleteEvent: (eventId: number) => void;\n setCurrentDate: (date: Date) => void;\n setViewType: (viewType: CalendarViewType) => void;\n setSelectedEvent: (event?: CalendarEvent) => void;\n setLoading: (loading: boolean) => void;\n setError: (error?: string) => void;\n}\n\n// ===== Hook返回类型 =====\n\n/**\n * useCalendar Hook返回类型\n */\nexport interface UseCalendarReturn {\n state: CalendarState;\n actions: CalendarActions;\n loadEvents: (startDate: Date, endDate: Date) => Promise<void>;\n createEvent: (eventData: EventFormData) => Promise<CalendarEvent>;\n updateEvent: (eventId: number, eventData: Partial<EventFormData>) => Promise<CalendarEvent>;\n deleteEvent: (eventId: number, deleteAll?: boolean) => Promise<void>;\n refreshEvents: () => Promise<void>;\n}\n\n/**\n * useEvents Hook返回类型\n */\nexport interface UseEventsReturn {\n events: CalendarEvent[];\n loading: boolean;\n error?: string;\n createEvent: (eventData: EventFormData) => Promise<CalendarEvent>;\n updateEvent: (eventId: number, eventData: Partial<EventFormData>) => Promise<CalendarEvent>;\n deleteEvent: (eventId: number, deleteAll?: boolean) => Promise<void>;\n loadEvents: (startDate: Date, endDate: Date) => Promise<void>;\n refreshEvents: () => Promise<void>;\n}\n\n// ===== 工具类型 =====\n\n/**\n * 日期范围\n */\nexport interface DateRange {\n startDate: Date;\n endDate: Date;\n}\n\n/**\n * 日历单元格数据\n */\nexport interface CalendarCell {\n date: Date;\n isCurrentMonth: boolean;\n isToday: boolean;\n isSelected: boolean;\n events: CalendarEvent[];\n}\n\n/**\n * 时间槽数据\n */\nexport interface TimeSlot {\n time: Date;\n events: CalendarEvent[];\n isWorkingHour: boolean;\n}\n\n// ===== 配置类型 =====\n\n/**\n * 日历配置\n */\nexport interface CalendarConfig {\n firstDayOfWeek: number; // 0=周日, 1=周一\n workingHours: {\n start: string; // \"09:00\"\n end: string; // \"18:00\"\n };\n timeZone: string;\n dateFormat: string;\n timeFormat: string;\n defaultView: CalendarViewType;\n defaultEventColor: string;\n weekends: boolean;\n eventColors: Record<string, string>;\n}\n\n/**\n * 服务接口\n */\nexport interface CalendarService {\n getEvents(params: GetEventsRequest): Promise<CalendarEvent[]>;\n createEvent(eventData: CreateEventRequest): Promise<CalendarEvent>;\n updateEvent(eventId: number, eventData: UpdateEventRequest): Promise<CalendarEvent>;\n deleteEvent(eventId: number, deleteAll?: boolean): Promise<void>;\n getEvent(eventId: number): Promise<CalendarEvent>;\n}\n\n/**\n * 数据库服务接口\n */\nexport interface CalendarDbService {\n getAllEvents(userId: number, startDate?: Date, endDate?: Date): Promise<CalendarEvent[]>;\n getEventById(eventId: number): Promise<CalendarEvent | null>;\n createEvent(eventData: Omit<CalendarEvent, 'id' | 'createdAt' | 'updatedAt'>): Promise<CalendarEvent>;\n updateEvent(eventId: number, eventData: Partial<CalendarEvent>): Promise<CalendarEvent>;\n deleteEvent(eventId: number): Promise<void>;\n createRecurrenceRule(ruleData: Omit<RecurrenceRule, 'id'>): Promise<RecurrenceRule>;\n updateRecurrenceRule(ruleId: number, ruleData: Partial<RecurrenceRule>): Promise<RecurrenceRule>;\n deleteRecurrenceRule(ruleId: number): Promise<void>;\n createReminder(reminderData: Omit<Reminder, 'id' | 'createdAt'>): Promise<Reminder>;\n updateReminder(reminderId: number, reminderData: Partial<Reminder>): Promise<Reminder>;\n deleteReminder(reminderId: number): Promise<void>;\n}\n\n// ===== 事件列表相关类型 =====\n\n/**\n * 事件排序字段\n */\nexport enum EventSortField {\n START_TIME = 'startTime',\n TITLE = 'title',\n PRIORITY = 'priority',\n CREATED_AT = 'createdAt',\n UPDATED_AT = 'updatedAt'\n}\n\n/**\n * 排序方向\n */\nexport enum SortDirection {\n ASC = 'asc',\n DESC = 'desc'\n}\n\n/**\n * 事件列表显示模式\n */\nexport enum EventListDisplayMode {\n LIST = 'list',\n GRID = 'grid'\n}\n\n/**\n * 事件列表排序配置\n */\nexport interface EventListSort {\n field: EventSortField;\n direction: SortDirection;\n}\n\n/**\n * 事件列表过滤配置\n */\nexport interface EventListFilter {\n priority?: EventPriority;\n color?: string;\n dateRange?: DateRange;\n searchText?: string;\n}\n\n/**\n * 事件列表配置\n */\nexport interface EventListConfig {\n displayMode: EventListDisplayMode;\n sort: EventListSort;\n filter: EventListFilter;\n pageSize: number;\n currentPage: number;\n}\n\n/**\n * 事件列表Props\n */\nexport interface EventListProps {\n events: CalendarEvent[];\n config: EventListConfig;\n onConfigChange: (config: EventListConfig) => void;\n onEventClick: (event: CalendarEvent) => void;\n onEventEdit: (event: CalendarEvent) => void;\n onEventDelete: (eventId: number) => void;\n onBatchDelete?: (eventIds: number[]) => Promise<void>;\n enableBatchActions?: boolean;\n loading?: boolean;\n className?: string;\n} ","/**\n * 日历日期工具函数\n * \n * 提供日历模块中常用的日期处理功能,包括:\n * - 日期格式化\n * - 日期计算\n * - 日历视图相关的日期逻辑\n * - 重复事件计算\n */\n\n/**\n * 格式化日期为 YYYY-MM-DD 格式\n * 使用本地时区,避免时区转换问题\n */\nexport function formatDate(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return (year) + '-' + (month) + '-' + (day);\n}\n\n/**\n * 格式化时间为 HH:mm 格式\n */\nexport function formatTime(date: Date): string {\n return date.toLocaleTimeString('zh-CN', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false\n });\n}\n\n/**\n * 格式化日期时间为本地字符串\n */\nexport function formatDateTime(date: Date, options?: Intl.DateTimeFormatOptions): string {\n const defaultOptions: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false\n };\n\n return date.toLocaleString('zh-CN', { ...defaultOptions, ...options });\n}\n\n/**\n * 将日期时间转换为ISO字符串,但保持本地时区\n * 避免时区转换导致的日期偏移问题\n */\nexport function toLocalISOString(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n const milliseconds = String(date.getMilliseconds()).padStart(3, '0');\n \n // 不添加Z后缀,避免被误认为是UTC时间\n return (year) + '-' + (month) + '-' + (day) + 'T' + (hours) + ':' + (minutes) + ':' + (seconds) + '.' + (milliseconds);\n}\n\n/**\n * 获取月份的第一天\n */\nexport function getMonthStart(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1);\n}\n\n/**\n * 获取月份的最后一天\n */\nexport function getMonthEnd(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0);\n}\n\n/**\n * 获取周的第一天(基于指定的一周开始日)\n */\nexport function getWeekStart(date: Date, firstDayOfWeek: number = 1): Date {\n const day = date.getDay();\n const diff = day - firstDayOfWeek;\n const adjustedDiff = diff < 0 ? diff + 7 : diff;\n \n const weekStart = new Date(date);\n weekStart.setDate(date.getDate() - adjustedDiff);\n weekStart.setHours(0, 0, 0, 0);\n \n return weekStart;\n}\n\n/**\n * 获取周的最后一天\n */\nexport function getWeekEnd(date: Date, firstDayOfWeek: number = 1): Date {\n const weekStart = getWeekStart(date, firstDayOfWeek);\n const weekEnd = new Date(weekStart);\n weekEnd.setDate(weekStart.getDate() + 6);\n weekEnd.setHours(23, 59, 59, 999);\n \n return weekEnd;\n}\n\n/**\n * 获取当天的开始时间\n */\nexport function getDayStart(date: Date): Date {\n const dayStart = new Date(date);\n dayStart.setHours(0, 0, 0, 0);\n return dayStart;\n}\n\n/**\n * 获取当天的结束时间\n */\nexport function getDayEnd(date: Date): Date {\n const dayEnd = new Date(date);\n dayEnd.setHours(23, 59, 59, 999);\n return dayEnd;\n}\n\n/**\n * 检查两个日期是否在同一天\n */\nexport function isSameDay(date1: Date, date2: Date): boolean {\n return date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getDate() === date2.getDate();\n}\n\n/**\n * 检查两个日期是否在同一周\n */\nexport function isSameWeek(date1: Date, date2: Date, firstDayOfWeek: number = 1): boolean {\n const week1Start = getWeekStart(date1, firstDayOfWeek);\n const week2Start = getWeekStart(date2, firstDayOfWeek);\n \n return isSameDay(week1Start, week2Start);\n}\n\n/**\n * 检查两个日期是否在同一月\n */\nexport function isSameMonth(date1: Date, date2: Date): boolean {\n return date1.getFullYear() === date2.getFullYear() &&\n date1.getMonth() === date2.getMonth();\n}\n\n/**\n * 检查日期是否是今天\n */\nexport function isToday(date: Date): boolean {\n return isSameDay(date, new Date());\n}\n\n/**\n * 检查日期是否是周末\n */\nexport function isWeekend(date: Date): boolean {\n const day = date.getDay();\n return day === 0 || day === 6; // 周日或周六\n}\n\n/**\n * 添加天数\n */\nexport function addDays(date: Date, days: number): Date {\n const result = new Date(date);\n result.setDate(result.getDate() + days);\n return result;\n}\n\n/**\n * 添加周数\n */\nexport function addWeeks(date: Date, weeks: number): Date {\n return addDays(date, weeks * 7);\n}\n\n/**\n * 添加月数\n */\nexport function addMonths(date: Date, months: number): Date {\n const result = new Date(date);\n result.setMonth(result.getMonth() + months);\n return result;\n}\n\n/**\n * 添加年数\n */\nexport function addYears(date: Date, years: number): Date {\n const result = new Date(date);\n result.setFullYear(result.getFullYear() + years);\n return result;\n}\n\n/**\n * 获取月视图的日期网格\n */\nexport function getMonthViewDates(date: Date, firstDayOfWeek: number = 1): Date[] {\n const monthStart = getMonthStart(date);\n const monthEnd = getMonthEnd(date);\n const viewStart = getWeekStart(monthStart, firstDayOfWeek);\n \n const dates: Date[] = [];\n let currentDate = new Date(viewStart);\n \n // 确保总是生成6周(42天)的日期\n for (let i = 0; i < 42; i++) {\n dates.push(new Date(currentDate));\n currentDate.setDate(currentDate.getDate() + 1);\n }\n \n return dates;\n}\n\n/**\n * 获取周视图的日期\n */\nexport function getWeekViewDates(date: Date, firstDayOfWeek: number = 1): Date[] {\n const weekStart = getWeekStart(date, firstDayOfWeek);\n const dates: Date[] = [];\n \n for (let i = 0; i < 7; i++) {\n const currentDate = new Date(weekStart);\n currentDate.setDate(weekStart.getDate() + i);\n dates.push(currentDate);\n }\n \n return dates;\n}\n\n/**\n * 生成时间槽(用于日视图和周视图)\n */\nexport function generateTimeSlots(startHour: number = 0, endHour: number = 24, interval: number = 60): Date[] {\n const today = new Date();\n const slots: Date[] = [];\n \n for (let hour = startHour; hour < endHour; hour++) {\n for (let minute = 0; minute < 60; minute += interval) {\n const slot = new Date(today);\n slot.setHours(hour, minute, 0, 0);\n slots.push(slot);\n }\n }\n \n return slots;\n}\n\n/**\n * 解析日期字符串为Date对象\n */\nexport function parseDate(dateString: string): Date {\n // 支持多种日期格式\n if (dateString.includes('T')) {\n // ISO 格式\n return new Date(dateString);\n } else if (dateString.includes('-')) {\n // YYYY-MM-DD 格式\n const parts = dateString.split('-').map(Number);\n const year = parts[0];\n const month = parts[1];\n const day = parts[2];\n \n if (year !== undefined && month !== undefined && day !== undefined) {\n return new Date(year, month - 1, day);\n }\n return new Date(dateString);\n } else {\n // 其他格式,使用默认解析\n return new Date(dateString);\n }\n}\n\n/**\n * 获取两个日期之间的天数差\n */\nexport function getDaysDifference(date1: Date, date2: Date): number {\n const timeDiff = Math.abs(date2.getTime() - date1.getTime());\n return Math.ceil(timeDiff / (1000 * 60 * 60 * 24));\n}\n\n/**\n * 检查时间是否在工作时间内\n */\nexport function isWorkingHour(date: Date, workingStart: string = '09:00', workingEnd: string = '18:00'): boolean {\n const timeString = formatTime(date);\n return timeString >= workingStart && timeString <= workingEnd;\n}\n\n/**\n * 获取月份名称\n */\nexport function getMonthName(date: Date, locale: string = 'zh-CN'): string {\n return date.toLocaleDateString(locale, { month: 'long' });\n}\n\n/**\n * 获取星期名称\n */\nexport function getWeekdayName(date: Date, locale: string = 'zh-CN', format: 'long' | 'short' | 'narrow' = 'long'): string {\n return date.toLocaleDateString(locale, { weekday: format });\n}\n\n/**\n * 获取相对时间描述(如\"2小时前\"、\"明天\")\n */\nexport function getRelativeTime(date: Date, locale: string = 'zh-CN'): string {\n const now = new Date();\n const diff = date.getTime() - now.getTime();\n const diffInDays = Math.floor(diff / (1000 * 60 * 60 * 24));\n \n if (diffInDays === 0) {\n if (isSameDay(date, now)) {\n return '今天';\n }\n } else if (diffInDays === 1) {\n return '明天';\n } else if (diffInDays === -1) {\n return '昨天';\n } else if (diffInDays > 1 && diffInDays <= 7) {\n return (diffInDays) + '天后';\n } else if (diffInDays < -1 && diffInDays >= -7) {\n return (Math.abs(diffInDays)) + '天前';\n }\n \n // 对于更远的日期,返回格式化的日期\n return formatDate(date);\n}\n\n/**\n * 验证日期是否有效\n */\nexport function isValidDate(date: any): date is Date {\n return date instanceof Date && !isNaN(date.getTime());\n}\n\n/**\n * 克隆日期对象\n */\nexport function cloneDate(date: Date): Date {\n return new Date(date.getTime());\n} ","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { CalendarEvent, EventFormData, CreateEventRequest } from '../types';\nimport { toLocalISOString } from '../utils/dateUtils';\n\nexport interface UseEventsReturn {\n events: CalendarEvent[];\n loading: boolean;\n error?: string;\n createEvent: (eventData: EventFormData) => Promise<CalendarEvent>;\n updateEvent: (eventId: number, eventData: Partial<EventFormData>) => Promise<CalendarEvent>;\n deleteEvent: (eventId: number, deleteAll?: boolean) => Promise<void>;\n batchDeleteEvents: (eventIds: number[]) => Promise<void>;\n fetchEvents: (startDate: Date, endDate: Date) => Promise<void>;\n clearError: () => void;\n}\n\n/**\n * 事件管理 Hook\n * \n * 提供事件的状态管理和CRUD操作\n */\nexport function useEvents(): UseEventsReturn {\n const [events, setEvents] = useState<CalendarEvent[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | undefined>();\n\n // 清除错误\n const clearError = useCallback(() => {\n setError(undefined);\n }, []);\n\n // 获取事件列表\n const fetchEvents = useCallback(async (startDate: Date, endDate: Date) => {\n setLoading(true);\n setError(undefined);\n \n try {\n const params = new URLSearchParams({\n startDate: toLocalISOString(startDate),\n endDate: toLocalISOString(endDate),\n });\n\n const response = await fetch('/api/calendar/events?' + (params));\n \n if (!response.ok) {\n throw new Error('获取事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '获取事件失败');\n }\n\n // 转换日期字符串为Date对象\n const eventsWithDates = data.data.map((event: any) => ({\n ...event,\n startTime: new Date(event.startTime),\n endTime: new Date(event.endTime),\n createdAt: new Date(event.createdAt),\n updatedAt: new Date(event.updatedAt),\n }));\n\n setEvents(eventsWithDates);\n } catch (err) {\n console.error('获取事件失败:', err);\n setError(err instanceof Error ? err.message : '获取事件失败');\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 创建事件\n const createEvent = useCallback(async (eventData: EventFormData): Promise<CalendarEvent> => {\n setLoading(true);\n setError(undefined);\n \n try {\n const createRequest: CreateEventRequest = {\n title: eventData.title,\n description: eventData.description,\n startTime: toLocalISOString(eventData.startTime),\n endTime: toLocalISOString(eventData.endTime),\n allDay: eventData.allDay,\n location: eventData.location,\n color: eventData.color,\n priority: eventData.priority,\n // TODO: 支持重复规则和提醒\n recurrence: eventData.recurrence,\n reminders: eventData.reminders?.map(reminder => ({\n reminderTime: toLocalISOString(reminder.reminderTime),\n reminderType: reminder.reminderType,\n })),\n };\n\n const response = await fetch('/api/calendar/events', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(createRequest),\n });\n\n if (!response.ok) {\n throw new Error('创建事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '创建事件失败');\n }\n\n // 转换日期字符串为Date对象\n const newEvent: CalendarEvent = {\n ...data.data,\n startTime: new Date(data.data.startTime),\n endTime: new Date(data.data.endTime),\n createdAt: new Date(data.data.createdAt),\n updatedAt: new Date(data.data.updatedAt),\n };\n\n // 更新本地状态\n setEvents(prev => [...prev, newEvent]);\n \n return newEvent;\n } catch (err) {\n console.error('创建事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '创建事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 更新事件\n const updateEvent = useCallback(async (\n eventId: number, \n eventData: Partial<EventFormData>\n ): Promise<CalendarEvent> => {\n setLoading(true);\n setError(undefined);\n \n try {\n const updateRequest: any = {};\n \n if (eventData.title !== undefined) updateRequest.title = eventData.title;\n if (eventData.description !== undefined) updateRequest.description = eventData.description;\n if (eventData.startTime !== undefined) updateRequest.startTime = toLocalISOString(eventData.startTime);\n if (eventData.endTime !== undefined) updateRequest.endTime = toLocalISOString(eventData.endTime);\n if (eventData.allDay !== undefined) updateRequest.allDay = eventData.allDay;\n if (eventData.location !== undefined) updateRequest.location = eventData.location;\n if (eventData.color !== undefined) updateRequest.color = eventData.color;\n\n const response = await fetch('/api/calendar/events/' + (eventId), {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(updateRequest),\n });\n\n if (!response.ok) {\n throw new Error('更新事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '更新事件失败');\n }\n\n // 转换日期字符串为Date对象\n const updatedEvent: CalendarEvent = {\n ...data.data,\n startTime: new Date(data.data.startTime),\n endTime: new Date(data.data.endTime),\n createdAt: new Date(data.data.createdAt),\n updatedAt: new Date(data.data.updatedAt),\n };\n\n // 更新本地状态\n setEvents(prev => prev.map(event => \n event.id === eventId ? updatedEvent : event\n ));\n \n return updatedEvent;\n } catch (err) {\n console.error('更新事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '更新事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 删除事件\n const deleteEvent = useCallback(async (eventId: number, deleteAll = false) => {\n setLoading(true);\n setError(undefined);\n \n try {\n const url = deleteAll \n ? '/api/calendar/events/' + (eventId) + '?deleteAll=true'\n : '/api/calendar/events/' + (eventId);\n\n const response = await fetch(url, {\n method: 'DELETE',\n });\n\n if (!response.ok) {\n throw new Error('删除事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '删除事件失败');\n }\n\n // 更新本地状态\n setEvents(prev => prev.filter(event => event.id !== eventId));\n } catch (err) {\n console.error('删除事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '删除事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 批量删除事件\n const batchDeleteEvents = useCallback(async (eventIds: number[]) => {\n setLoading(true);\n setError(undefined);\n \n try {\n const response = await fetch('/api/calendar/events/batchDelete', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ eventIds }),\n });\n\n if (!response.ok) {\n throw new Error('批量删除事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '批量删除事件失败');\n }\n\n // 更新本地状态\n setEvents(prev => prev.filter(event => !eventIds.includes(event.id)));\n } catch (err) {\n console.error('批量删除事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '批量删除事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n return {\n events,\n loading,\n error,\n createEvent,\n updateEvent,\n deleteEvent,\n batchDeleteEvents,\n fetchEvents,\n clearError,\n };\n} ","/**\n * 事件类型服务\n * \n * 负责处理不同类型事件的创建逻辑:\n * 1. 单次事件 (Single Event)\n * 2. 多天事件 (Multi-day Event) \n * 3. 重复事件 (Recurring Event)\n */\n\nexport enum EventType {\n SINGLE = 'single', // 单次事件\n MULTI_DAY = 'multi_day', // 多天事件(跨越多个日期的单个事件)\n RECURRING = 'recurring' // 重复事件(按规律重复发生)\n}\n\nexport enum RecurrencePattern {\n DAILY = 'daily',\n WEEKLY = 'weekly', \n MONTHLY = 'monthly',\n YEARLY = 'yearly',\n CUSTOM = 'custom'\n}\n\nexport interface BaseEventData {\n title: string;\n description?: string;\n location?: string;\n color: string;\n priority: string;\n allDay: boolean;\n}\n\nexport interface SingleEventData extends BaseEventData {\n type: EventType.SINGLE;\n startTime: Date;\n endTime: Date;\n}\n\nexport interface MultiDayEventData extends BaseEventData {\n type: EventType.MULTI_DAY;\n startDate: Date; // 开始日期\n endDate: Date; // 结束日期(包含)\n startTime?: string; // 每日开始时间 \"09:00\"\n endTime?: string; // 每日结束时间 \"17:00\"\n}\n\nexport interface RecurringEventData extends BaseEventData {\n type: EventType.RECURRING;\n startDate: Date;\n startTime: Date;\n endTime: Date;\n recurrence: {\n pattern: RecurrencePattern;\n interval: number; // 间隔(每N天/周/月)\n endDate?: Date; // 结束日期\n count?: number; // 重复次数\n daysOfWeek?: number[]; // 星期几(用于每周重复)\n };\n}\n\nexport type EventData = SingleEventData | MultiDayEventData | RecurringEventData;\n\nexport interface GeneratedEvent {\n title: string;\n description?: string;\n startTime: Date;\n endTime: Date;\n location?: string;\n color: string;\n priority: string;\n allDay: boolean;\n // 元数据\n eventType: EventType;\n parentEventId?: string; // 对于多天事件和重复事件,指向父事件\n instanceDate?: string; // 实例日期 (YYYY-MM-DD)\n isMultiDayPart?: boolean; // 是否是多天事件的一部分\n isRecurringInstance?: boolean; // 是否是重复事件的实例\n}\n\nexport class EventTypeService {\n \n /**\n * 根据事件数据生成实际的事件实例\n */\n static generateEventInstances(\n eventData: EventData,\n viewStartDate: Date,\n viewEndDate: Date,\n parentEventId?: string\n ): GeneratedEvent[] {\n switch (eventData.type) {\n case EventType.SINGLE:\n return this.generateSingleEvent(eventData, parentEventId);\n \n case EventType.MULTI_DAY:\n return this.generateMultiDayEvents(eventData, viewStartDate, viewEndDate, parentEventId);\n \n case EventType.RECURRING:\n return this.generateRecurringEvents(eventData, viewStartDate, viewEndDate, parentEventId);\n \n default:\n throw new Error('不支持的事件类型: ' + ((eventData as any).type));\n }\n }\n\n /**\n * 生成单次事件\n */\n private static generateSingleEvent(\n eventData: SingleEventData, \n parentEventId?: string\n ): GeneratedEvent[] {\n return [{\n ...eventData,\n eventType: EventType.SINGLE,\n parentEventId\n }];\n }\n\n /**\n * 生成多天事件实例\n * 例:21-23号的会议 -> 创建3个事件实例,每个代表一天\n */\n private static generateMultiDayEvents(\n eventData: MultiDayEventData,\n viewStartDate: Date,\n viewEndDate: Date,\n parentEventId?: string\n ): GeneratedEvent[] {\n const events: GeneratedEvent[] = [];\n const currentDate = new Date(eventData.startDate);\n \n // 确保不超出视图范围\n const actualStartDate = currentDate < viewStartDate ? viewStartDate : currentDate;\n const actualEndDate = eventData.endDate > viewEndDate ? viewEndDate : eventData.endDate;\n \n currentDate.setTime(actualStartDate.getTime());\n \n while (currentDate <= actualEndDate) {\n const dayStart = new Date(currentDate);\n const dayEnd = new Date(currentDate);\n \n if (eventData.allDay) {\n // 全天事件\n dayStart.setHours(0, 0, 0, 0);\n dayEnd.setHours(23, 59, 59, 999);\n } else {\n // 定时事件,使用指定的时间\n const startParts = (eventData.startTime || '09:00').split(':');\n const endParts = (eventData.endTime || '17:00').split(':');\n const startHour = Number(startParts[0] || 0);\n const startMinute = Number(startParts[1] || 0);\n const endHour = Number(endParts[0] || 0);\n const endMinute = Number(endParts[1] || 0);\n \n dayStart.setHours(startHour, startMinute, 0, 0);\n dayEnd.setHours(endHour, endMinute, 0, 0);\n }\n \n events.push({\n title: eventData.title,\n description: eventData.description,\n startTime: dayStart,\n endTime: dayEnd,\n location: eventData.location,\n color: eventData.color,\n priority: eventData.priority,\n allDay: eventData.allDay,\n eventType: EventType.MULTI_DAY,\n parentEventId,\n instanceDate: this.formatDateString(currentDate),\n isMultiDayPart: true\n });\n \n // 移动到下一天\n currentDate.setDate(currentDate.getDate() + 1);\n }\n \n return events;\n }\n\n /**\n * 生成重复事件实例\n */\n private static generateRecurringEvents(\n eventData: RecurringEventData,\n viewStartDate: Date,\n viewEndDate: Date,\n parentEventId?: string\n ): GeneratedEvent[] {\n const events: GeneratedEvent[] = [];\n const { recurrence } = eventData;\n \n let currentDate = new Date(eventData.startDate);\n let instanceCount = 0;\n const maxInstances = recurrence.count || 1000;\n \n // 确定结束条件\n const endDate = recurrence.endDate || viewEndDate;\n const actualEndDate = endDate < viewEndDate ? endDate : viewEndDate;\n \n while (currentDate <= actualEndDate && instanceCount < maxInstances) {\n // 检查当前日期是否在视图范围内\n if (currentDate >= viewStartDate) {\n const instanceStart = new Date(currentDate);\n instanceStart.setHours(\n eventData.startTime.getHours(),\n eventData.startTime.getMinutes(),\n eventData.startTime.getSeconds()\n );\n \n const instanceEnd = new Date(currentDate);\n instanceEnd.setHours(\n eventData.endTime.getHours(),\n eventData.endTime.getMinutes(),\n eventData.endTime.getSeconds()\n );\n \n events.push({\n title: eventData.title,\n description: eventData.description,\n startTime: instanceStart,\n endTime: instanceEnd,\n location: eventData.location,\n color: eventData.color,\n priority: eventData.priority,\n allDay: eventData.allDay,\n eventType: EventType.RECURRING,\n parentEventId,\n instanceDate: this.formatDateString(currentDate),\n isRecurringInstance: true\n });\n \n instanceCount++;\n }\n \n // 计算下一次重复的日期\n currentDate = this.getNextRecurrenceDate(currentDate, recurrence);\n }\n \n return events;\n }\n\n /**\n * 计算下一次重复的日期\n */\n private static getNextRecurrenceDate(\n currentDate: Date, \n recurrence: RecurringEventData['recurrence']\n ): Date {\n const nextDate = new Date(currentDate);\n \n switch (recurrence.pattern) {\n case RecurrencePattern.DAILY:\n nextDate.setDate(nextDate.getDate() + recurrence.interval);\n break;\n \n case RecurrencePattern.WEEKLY:\n nextDate.setDate(nextDate.getDate() + (7 * recurrence.interval));\n break;\n \n case RecurrencePattern.MONTHLY:\n nextDate.setMonth(nextDate.getMonth() + recurrence.interval);\n break;\n \n case RecurrencePattern.YEARLY:\n nextDate.setFullYear(nextDate.getFullYear() + recurrence.interval);\n break;\n \n default:\n throw new Error('不支持的重复模式: ' + (recurrence.pattern));\n }\n \n return nextDate;\n }\n\n /**\n * 格式化日期为字符串 (YYYY-MM-DD)\n */\n private static formatDateString(date: Date): string {\n return date.toISOString().split('T')[0]!;\n }\n\n /**\n * 验证事件数据\n */\n static validateEventData(eventData: EventData): string[] {\n const errors: string[] = [];\n \n // 基础验证\n if (!eventData.title?.trim()) {\n errors.push('事件标题不能为空');\n }\n \n if (!eventData.color) {\n errors.push('请选择事件颜色');\n }\n \n // 根据类型进行特定验证\n switch (eventData.type) {\n case EventType.SINGLE:\n errors.push(...this.validateSingleEvent(eventData));\n break;\n \n case EventType.MULTI_DAY:\n errors.push(...this.validateMultiDayEvent(eventData));\n break;\n \n case EventType.RECURRING:\n errors.push(...this.validateRecurringEvent(eventData));\n break;\n }\n \n return errors;\n }\n\n private static validateSingleEvent(eventData: SingleEventData): string[] {\n const errors: string[] = [];\n \n if (!eventData.startTime) {\n errors.push('请设置开始时间');\n }\n \n if (!eventData.endTime) {\n errors.push('请设置结束时间');\n }\n \n if (eventData.startTime && eventData.endTime && eventData.endTime <= eventData.startTime) {\n errors.push('结束时间必须晚于开始时间');\n }\n \n return errors;\n }\n\n private static validateMultiDayEvent(eventData: MultiDayEventData): string[] {\n const errors: string[] = [];\n \n if (!eventData.startDate) {\n errors.push('请设置开始日期');\n }\n \n if (!eventData.endDate) {\n errors.push('请设置结束日期');\n }\n \n if (eventData.startDate && eventData.endDate && eventData.endDate < eventData.startDate) {\n errors.push('结束日期必须不早于开始日期');\n }\n \n // 验证时间格式\n if (!eventData.allDay) {\n if (eventData.startTime && !/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/.test(eventData.startTime)) {\n errors.push('开始时间格式不正确 (HH:MM)');\n }\n \n if (eventData.endTime && !/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/.test(eventData.endTime)) {\n errors.push('结束时间格式不正确 (HH:MM)');\n }\n }\n \n return errors;\n }\n\n private static validateRecurringEvent(eventData: RecurringEventData): string[] {\n const errors: string[] = [];\n \n if (!eventData.startDate) {\n errors.push('请设置开始日期');\n }\n \n if (!eventData.startTime) {\n errors.push('请设置开始时间');\n }\n \n if (!eventData.endTime) {\n errors.push('请设置结束时间');\n }\n \n if (eventData.startTime && eventData.endTime && eventData.endTime <= eventData.startTime) {\n errors.push('结束时间必须晚于开始时间');\n }\n \n // 验证重复规则\n const { recurrence } = eventData;\n \n if (!recurrence.pattern) {\n errors.push('请选择重复模式');\n }\n \n if (!recurrence.interval || recurrence.interval < 1) {\n errors.push('重复间隔必须大于0');\n }\n \n if (recurrence.interval > 365) {\n errors.push('重复间隔不能超过365');\n }\n \n if (recurrence.endDate && recurrence.count && recurrence.count > 0) {\n errors.push('不能同时设置结束日期和重复次数');\n }\n \n if (recurrence.count && (recurrence.count < 1 || recurrence.count > 999)) {\n errors.push('重复次数必须在1-999之间');\n }\n \n return errors;\n }\n\n /**\n * 获取事件类型的描述文本\n */\n static getEventTypeDescription(eventData: EventData): string {\n switch (eventData.type) {\n case EventType.SINGLE:\n return '单次事件';\n \n case EventType.MULTI_DAY:\n const dayCount = Math.ceil((eventData.endDate.getTime() - eventData.startDate.getTime()) / (24 * 60 * 60 * 1000)) + 1;\n return '持续 ' + (dayCount) + ' 天';\n \n case EventType.RECURRING:\n const { pattern, interval, count, endDate } = eventData.recurrence;\n let desc = '';\n \n switch (pattern) {\n case RecurrencePattern.DAILY:\n desc = interval === 1 ? '每天' : '每 ' + (interval) + ' 天';\n break;\n case RecurrencePattern.WEEKLY:\n desc = interval === 1 ? '每周' : '每 ' + (interval) + ' 周';\n break;\n case RecurrencePattern.MONTHLY:\n desc = interval === 1 ? '每月' : '每 ' + (interval) + ' 个月';\n break;\n case RecurrencePattern.YEARLY:\n desc = interval === 1 ? '每年' : '每 ' + (interval) + ' 年';\n break;\n }\n \n if (count) {\n desc += ',共 ' + (count) + ' 次';\n } else if (endDate) {\n desc += ',直到 ' + (endDate.toLocaleDateString('zh-CN'));\n }\n \n return desc;\n \n default:\n return '未知类型';\n }\n }\n} ","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { CalendarEvent, EventFormData, CreateEventRequest, EventPriority, RecurrenceType } from '../types';\nimport { EventData, EventType, EventTypeService } from '../services/eventTypeService';\nimport { toLocalISOString, formatDate } from '../utils/dateUtils';\n\nexport interface UseEnhancedEventsReturn {\n events: CalendarEvent[];\n loading: boolean;\n error?: string;\n createEvent: (eventData: EventFormData) => Promise<CalendarEvent>;\n createEnhancedEvent: (eventData: EventData) => Promise<CalendarEvent[]>;\n updateEvent: (eventId: number, eventData: Partial<EventFormData>) => Promise<CalendarEvent>;\n updateEventTime: (eventId: number, newStartTime: Date, newEndTime: Date) => Promise<void>;\n deleteEvent: (eventId: number, deleteAll?: boolean) => Promise<void>;\n batchDeleteEvents: (eventIds: number[]) => Promise<void>;\n fetchEvents: (startDate: Date, endDate: Date) => Promise<void>;\n clearError: () => void;\n}\n\n/**\n * 增强版事件管理 Hook\n * \n * 支持新的事件类型系统:单次事件、多天事件、重复事件\n */\nexport function useEnhancedEvents(): UseEnhancedEventsReturn {\n const [events, setEvents] = useState<CalendarEvent[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | undefined>();\n\n // 清除错误\n const clearError = useCallback(() => {\n setError(undefined);\n }, []);\n\n // 获取事件列表\n const fetchEvents = useCallback(async (startDate: Date, endDate: Date) => {\n setLoading(true);\n setError(undefined);\n \n try {\n const params = new URLSearchParams({\n startDate: toLocalISOString(startDate),\n endDate: toLocalISOString(endDate),\n });\n\n const response = await fetch('/api/calendar/events?' + (params));\n \n if (!response.ok) {\n throw new Error('获取事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '获取事件失败');\n }\n\n // 转换日期字符串为Date对象\n const eventsWithDates = data.data.map((event: any) => ({\n ...event,\n startTime: new Date(event.startTime),\n endTime: new Date(event.endTime),\n createdAt: new Date(event.createdAt),\n updatedAt: new Date(event.updatedAt),\n }));\n\n console.log('📥 获取到的事件数据:', {\n requestRange: (formatDate(startDate)) + ' 到 ' + (formatDate(endDate)),\n eventCount: eventsWithDates.length,\n eventIds: eventsWithDates.map((e: CalendarEvent) => e.id)\n });\n\n // 智能合并事件:保留不在当前查询范围内的事件,替换范围内的事件\n setEvents(prev => {\n // 过滤出不在当前查询时间范围内的现有事件\n const eventsOutsideRange = prev.filter(event => {\n const eventDate = new Date(event.startTime);\n return eventDate < startDate || eventDate > endDate;\n });\n\n console.log('🔄 事件合并策略:', {\n previousEventCount: prev.length,\n eventsOutsideRange: eventsOutsideRange.length,\n newEventsInRange: eventsWithDates.length,\n finalEventCount: eventsOutsideRange.length + eventsWithDates.length\n });\n\n // 合并范围外的事件和新获取的事件\n return [...eventsOutsideRange, ...eventsWithDates];\n });\n } catch (err) {\n console.error('获取事件失败:', err);\n setError(err instanceof Error ? err.message : '获取事件失败');\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 传统的创建事件方法(向后兼容)\n const createEvent = useCallback(async (eventData: EventFormData): Promise<CalendarEvent> => {\n setLoading(true);\n setError(undefined);\n \n try {\n const createRequest: CreateEventRequest = {\n title: eventData.title,\n description: eventData.description,\n startTime: toLocalISOString(eventData.startTime),\n endTime: toLocalISOString(eventData.endTime),\n allDay: eventData.allDay,\n location: eventData.location,\n color: eventData.color,\n priority: eventData.priority,\n recurrence: eventData.recurrence,\n reminders: eventData.reminders?.map(reminder => ({\n reminderTime: toLocalISOString(reminder.reminderTime),\n reminderType: reminder.reminderType,\n })),\n };\n\n const response = await fetch('/api/calendar/events', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(createRequest),\n });\n\n if (!response.ok) {\n throw new Error('创建事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '创建事件失败');\n }\n\n // 转换日期字符串为Date对象\n const newEvent: CalendarEvent = {\n ...data.data,\n startTime: new Date(data.data.startTime),\n endTime: new Date(data.data.endTime),\n createdAt: new Date(data.data.createdAt),\n updatedAt: new Date(data.data.updatedAt),\n };\n\n // 更新本地状态\n setEvents(prev => [...prev, newEvent]);\n \n return newEvent;\n } catch (err) {\n console.error('创建事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '创建事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 映射事件类型服务的优先级到日历模块的优先级\n const mapPriorityToEventPriority = (priority: string): EventPriority => {\n switch (priority.toLowerCase()) {\n case 'low':\n return EventPriority.LOW;\n case 'normal':\n return EventPriority.NORMAL;\n case 'high':\n return EventPriority.HIGH;\n case 'urgent':\n return EventPriority.URGENT;\n default:\n return EventPriority.NORMAL;\n }\n };\n\n // 映射重复模式到重复类型\n const mapPatternToRecurrenceType = (pattern: string): RecurrenceType => {\n switch (pattern) {\n case 'daily':\n return RecurrenceType.DAILY;\n case 'weekly':\n return RecurrenceType.WEEKLY;\n case 'monthly':\n return RecurrenceType.MONTHLY;\n case 'yearly':\n return RecurrenceType.YEARLY;\n default:\n return RecurrenceType.DAILY;\n }\n };\n\n // 增强版创建事件方法\n const createEnhancedEvent = useCallback(async (eventData: EventData): Promise<CalendarEvent[]> => {\n setLoading(true);\n setError(undefined);\n \n try {\n // 验证事件数据\n const validationErrors = EventTypeService.validateEventData(eventData);\n if (validationErrors.length > 0) {\n throw new Error(validationErrors[0]);\n }\n\n // 根据事件类型生成事件实例\n let generatedEvents;\n \n // 确定视图范围\n const currentDate = new Date();\n let viewStartDate: Date;\n let viewEndDate: Date;\n \n switch (eventData.type) {\n case EventType.SINGLE:\n // 单次事件:使用startTime作为基准\n viewStartDate = new Date(eventData.startTime);\n viewEndDate = new Date(eventData.endTime);\n generatedEvents = EventTypeService.generateEventInstances(\n eventData,\n viewStartDate,\n viewEndDate\n );\n break;\n \n case EventType.MULTI_DAY:\n // 多天事件:使用startDate和endDate\n viewStartDate = new Date(eventData.startDate);\n viewEndDate = new Date(eventData.endDate);\n generatedEvents = EventTypeService.generateEventInstances(\n eventData,\n viewStartDate,\n viewEndDate\n );\n break;\n \n case EventType.RECURRING:\n // 重复事件:生成一段时间内的重复实例\n viewStartDate = new Date(eventData.startDate);\n viewEndDate = eventData.recurrence.endDate || (() => {\n const calcEndDate = new Date(eventData.startDate);\n const count = eventData.recurrence.count || 10;\n const interval = eventData.recurrence.interval || 1;\n \n switch (eventData.recurrence.pattern) {\n case 'daily':\n calcEndDate.setDate(calcEndDate.getDate() + (count * interval));\n break;\n case 'weekly':\n calcEndDate.setDate(calcEndDate.getDate() + (count * interval * 7));\n break;\n case 'monthly':\n calcEndDate.setMonth(calcEndDate.getMonth() + (count * interval));\n break;\n case 'yearly':\n calcEndDate.setFullYear(calcEndDate.getFullYear() + (count * interval));\n break;\n }\n return calcEndDate;\n })();\n \n generatedEvents = EventTypeService.generateEventInstances(\n eventData,\n viewStartDate,\n viewEndDate\n );\n break;\n \n default:\n throw new Error('不支持的事件类型: ' + ((eventData as any).type));\n }\n\n // 批量创建事件\n const createdEvents: CalendarEvent[] = [];\n \n for (const generatedEvent of generatedEvents) {\n const createRequest: CreateEventRequest = {\n title: generatedEvent.title,\n description: generatedEvent.description,\n startTime: toLocalISOString(generatedEvent.startTime),\n endTime: toLocalISOString(generatedEvent.endTime),\n allDay: generatedEvent.allDay,\n location: generatedEvent.location,\n color: generatedEvent.color,\n priority: mapPriorityToEventPriority(generatedEvent.priority),\n };\n\n // 如果是重复事件,添加重复规则\n if (eventData.type === EventType.RECURRING && eventData.recurrence) {\n createRequest.recurrence = {\n ruleType: mapPatternToRecurrenceType(eventData.recurrence.pattern),\n interval: eventData.recurrence.interval,\n endDate: eventData.recurrence.endDate,\n count: eventData.recurrence.count,\n };\n }\n\n const response = await fetch('/api/calendar/events', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(createRequest),\n });\n\n if (!response.ok) {\n throw new Error('创建事件实例失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '创建事件实例失败');\n }\n\n const newEvent: CalendarEvent = {\n ...data.data,\n startTime: new Date(data.data.startTime),\n endTime: new Date(data.data.endTime),\n createdAt: new Date(data.data.createdAt),\n updatedAt: new Date(data.data.updatedAt),\n };\n\n createdEvents.push(newEvent);\n }\n\n // 更新本地状态\n setEvents(prev => [...prev, ...createdEvents]);\n \n return createdEvents;\n } catch (err) {\n console.error('创建增强事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '创建事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 更新事件\n const updateEvent = useCallback(async (\n eventId: number, \n eventData: Partial<EventFormData>\n ): Promise<CalendarEvent> => {\n setLoading(true);\n setError(undefined);\n \n try {\n const updateRequest: any = {};\n \n if (eventData.title !== undefined) updateRequest.title = eventData.title;\n if (eventData.description !== undefined) updateRequest.description = eventData.description;\n if (eventData.startTime !== undefined) updateRequest.startTime = toLocalISOString(eventData.startTime);\n if (eventData.endTime !== undefined) updateRequest.endTime = toLocalISOString(eventData.endTime);\n if (eventData.allDay !== undefined) updateRequest.allDay = eventData.allDay;\n if (eventData.location !== undefined) updateRequest.location = eventData.location;\n if (eventData.color !== undefined) updateRequest.color = eventData.color;\n\n const response = await fetch('/api/calendar/events/' + (eventId), {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(updateRequest),\n });\n\n if (!response.ok) {\n throw new Error('更新事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '更新事件失败');\n }\n\n // 转换日期字符串为Date对象\n const updatedEvent: CalendarEvent = {\n ...data.data,\n startTime: new Date(data.data.startTime),\n endTime: new Date(data.data.endTime),\n createdAt: new Date(data.data.createdAt),\n updatedAt: new Date(data.data.updatedAt),\n };\n\n // 更新本地状态\n setEvents(prev => prev.map(event => \n event.id === eventId ? updatedEvent : event\n ));\n \n return updatedEvent;\n } catch (err) {\n console.error('更新事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '更新事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 删除事件\n const deleteEvent = useCallback(async (eventId: number, deleteAll = false) => {\n setLoading(true);\n setError(undefined);\n \n try {\n const url = deleteAll \n ? '/api/calendar/events/' + (eventId) + '?deleteAll=true'\n : '/api/calendar/events/' + (eventId);\n\n const response = await fetch(url, {\n method: 'DELETE',\n });\n\n if (!response.ok) {\n throw new Error('删除事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '删除事件失败');\n }\n\n // 更新本地状态\n setEvents(prev => prev.filter(event => event.id !== eventId));\n } catch (err) {\n console.error('删除事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '删除事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 批量删除事件\n const batchDeleteEvents = useCallback(async (eventIds: number[]) => {\n setLoading(true);\n setError(undefined);\n \n try {\n const response = await fetch('/api/calendar/events/batchDelete', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ eventIds }),\n });\n\n if (!response.ok) {\n throw new Error('批量删除事件失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n if (!data.success) {\n throw new Error(data.error || '批量删除事件失败');\n }\n\n // 更新本地状态\n setEvents(prev => prev.filter(event => !eventIds.includes(event.id)));\n } catch (err) {\n console.error('批量删除事件失败:', err);\n const errorMessage = err instanceof Error ? err.message : '批量删除事件失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // 更新事件时间(专门用于拖拽)\n const updateEventTime = useCallback(async (\n eventId: number, \n newStartTime: Date, \n newEndTime: Date\n ): Promise<void> => {\n setLoading(true);\n setError(undefined);\n \n console.log('🔄 updateEventTime 调用:', {\n eventId,\n newStartTime: newStartTime.toISOString(),\n newEndTime: newEndTime.toISOString(),\n localStartTime: toLocalISOString(newStartTime),\n localEndTime: toLocalISOString(newEndTime)\n });\n \n try {\n const updateRequest = {\n startTime: toLocalISOString(newStartTime),\n endTime: toLocalISOString(newEndTime),\n };\n\n console.log('📤 发送API请求:', updateRequest);\n\n const response = await fetch('/api/calendar/events/' + (eventId), {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(updateRequest),\n });\n\n if (!response.ok) {\n throw new Error('更新事件时间失败: ' + (response.status));\n }\n\n const data = await response.json();\n \n console.log('📥 API响应:', data);\n \n if (!data.success) {\n throw new Error(data.error || '更新事件时间失败');\n }\n\n console.log('🔄 API返回的事件数据:', {\n originalStartTime: data.data.startTime,\n originalEndTime: data.data.endTime,\n parsedStartTime: new Date(data.data.startTime).toISOString(),\n parsedEndTime: new Date(data.data.endTime).toISOString()\n });\n\n // 转换日期字符串为Date对象\n const updatedEvent: CalendarEvent = {\n ...data.data,\n startTime: new Date(data.data.startTime),\n endTime: new Date(data.data.endTime),\n createdAt: new Date(data.data.createdAt),\n updatedAt: new Date(data.data.updatedAt),\n };\n\n console.log('✅ 更新后的事件对象:', {\n id: updatedEvent.id,\n title: updatedEvent.title,\n startTime: updatedEvent.startTime.toISOString(),\n endTime: updatedEvent.endTime.toISOString(),\n localStartDate: formatDate(updatedEvent.startTime),\n localEndDate: formatDate(updatedEvent.endTime)\n });\n\n // 更新本地状态\n setEvents(prev => {\n const oldEvent = prev.find(e => e.id === eventId);\n const newEvents = prev.map(event => \n event.id === eventId ? updatedEvent : event\n );\n \n console.log('🔄 updateEventTime 本地状态更新:', {\n eventId,\n oldEventDate: oldEvent ? formatDate(oldEvent.startTime) : 'not found',\n newEventDate: formatDate(updatedEvent.startTime),\n totalEventsBefore: prev.length,\n totalEventsAfter: newEvents.length,\n eventFound: !!oldEvent\n });\n \n return newEvents;\n });\n } catch (err) {\n console.error('更新事件时间失败:', err);\n const errorMessage = err instanceof Error ? err.message : '更新事件时间失败';\n setError(errorMessage);\n throw new Error(errorMessage);\n } finally {\n setLoading(false);\n }\n }, []);\n\n return {\n events,\n loading,\n error,\n createEvent,\n createEnhancedEvent,\n updateEvent,\n updateEventTime,\n deleteEvent,\n batchDeleteEvents,\n fetchEvents,\n clearError,\n };\n} ","'use client';\n\nimport { useState, useCallback } from 'react';\nimport { DragEndEvent, DragStartEvent, DragOverEvent } from '@dnd-kit/core';\nimport { CalendarEvent } from '../types';\nimport { formatDate, isSameDay } from '../utils/dateUtils';\n\nexport interface DragState {\n isDragging: boolean;\n draggedEvent: CalendarEvent | null;\n dragOverDate: Date | null;\n previewTime: string | null;\n}\n\nexport interface UseEventDragReturn {\n dragState: DragState;\n handleDragStart: (event: DragStartEvent) => void;\n handleDragOver: (event: DragOverEvent) => void;\n handleDragEnd: (event: DragEndEvent) => void;\n resetDragState: () => void;\n}\n\n/**\n * 事件拖拽Hook\n * \n * 提供事件拖拽功能,支持:\n * - 拖拽事件到不同日期\n * - 拖拽时显示预览信息\n * - 拖拽状态管理\n */\nexport function useEventDrag(\n events: CalendarEvent[],\n onEventUpdate: (eventId: number, newStartTime: Date, newEndTime: Date) => Promise<void>\n): UseEventDragReturn {\n \n const [dragState, setDragState] = useState<DragState>({\n isDragging: false,\n draggedEvent: null,\n dragOverDate: null,\n previewTime: null,\n });\n\n // 处理拖拽开始\n const handleDragStart = useCallback((event: DragStartEvent) => {\n const eventId = parseInt(event.active.id as string);\n const draggedEvent = events.find(e => e.id === eventId);\n \n console.log('🎯 拖拽开始:', {\n activeId: event.active.id,\n eventId,\n draggedEvent: draggedEvent ? {\n id: draggedEvent.id,\n title: draggedEvent.title,\n originalStartTime: draggedEvent.startTime,\n originalDate: formatDate(new Date(draggedEvent.startTime))\n } : null\n });\n \n if (draggedEvent) {\n setDragState({\n isDragging: true,\n draggedEvent,\n dragOverDate: null,\n previewTime: null,\n });\n }\n }, [events]);\n\n // 处理拖拽悬停\n const handleDragOver = useCallback((event: DragOverEvent) => {\n const { over } = event;\n \n console.log('🔍 拖拽悬停:', {\n overId: over?.id,\n hasOver: !!over,\n hasDraggedEvent: !!dragState.draggedEvent\n });\n \n if (over && dragState.draggedEvent) {\n const targetDateStr = over.id as string;\n \n console.log('📅 解析目标日期:', {\n targetDateStr,\n startsWithDate: targetDateStr.startsWith('date-')\n });\n \n // 解析目标日期 (格式: \"date-2024-12-28\")\n if (targetDateStr.startsWith('date-')) {\n const dateStr = targetDateStr.replace('date-', '');\n // 使用本地时区解析日期,避免时区偏移\n const parts = dateStr.split('-').map(Number);\n const year = parts[0];\n const month = parts[1];\n const day = parts[2];\n\n if (year !== undefined && month !== undefined && day !== undefined) {\n const targetDate = new Date(year, month - 1, day);\n \n console.log('🗓️ 日期解析结果:', {\n dateStr,\n parsedComponents: { year, month: month - 1, day },\n targetDate: targetDate.toISOString(),\n isValidDate: !isNaN(targetDate.getTime()),\n formattedTargetDate: formatDate(targetDate)\n });\n \n if (!isNaN(targetDate.getTime())) {\n const originalStart = new Date(dragState.draggedEvent.startTime);\n const originalEnd = new Date(dragState.draggedEvent.endTime);\n \n // 计算新的开始和结束时间,保持原有的时间部分\n const newStartTime = new Date(targetDate);\n newStartTime.setHours(originalStart.getHours(), originalStart.getMinutes(), originalStart.getSeconds(), originalStart.getMilliseconds());\n \n const duration = originalEnd.getTime() - originalStart.getTime();\n const newEndTime = new Date(newStartTime.getTime() + duration);\n \n // 生成预览时间文本\n const previewTime = dragState.draggedEvent.allDay \n ? '全天'\n : (formatTime(newStartTime)) + ' - ' + (formatTime(newEndTime));\n \n console.log('⏰ 计算新时间:', {\n originalStart: dragState.draggedEvent.startTime,\n originalEnd: dragState.draggedEvent.endTime,\n newStartTime: newStartTime.toISOString(),\n newEndTime: newEndTime.toISOString(),\n duration: duration / (1000 * 60), // 转换为分钟\n previewTime\n });\n \n setDragState(prev => ({\n ...prev,\n dragOverDate: targetDate,\n previewTime,\n }));\n }\n }\n }\n }\n }, [dragState.draggedEvent]);\n\n // 处理拖拽结束\n const handleDragEnd = useCallback(async (event: DragEndEvent) => {\n const { over } = event;\n \n console.log('🎯 拖拽结束:', {\n overId: over?.id,\n hasOver: !!over,\n hasDraggedEvent: !!dragState.draggedEvent,\n hasDragOverDate: !!dragState.dragOverDate,\n dragOverDate: dragState.dragOverDate ? formatDate(dragState.dragOverDate) : null\n });\n \n if (over && dragState.draggedEvent && dragState.dragOverDate) {\n const originalStart = new Date(dragState.draggedEvent.startTime);\n const originalEnd = new Date(dragState.draggedEvent.endTime);\n const targetDate = dragState.dragOverDate;\n \n // 检查是否真的移动到了不同的日期\n const isSameDayResult = isSameDay(originalStart, targetDate);\n console.log('📊 日期比较:', {\n originalDate: formatDate(originalStart),\n targetDate: formatDate(targetDate),\n isSameDay: isSameDayResult\n });\n \n if (!isSameDayResult) {\n try {\n // 计算新的开始和结束时间,保持原有的时间部分\n const newStartTime = new Date(targetDate);\n newStartTime.setHours(originalStart.getHours(), originalStart.getMinutes(), originalStart.getSeconds(), originalStart.getMilliseconds());\n \n const duration = originalEnd.getTime() - originalStart.getTime();\n const newEndTime = new Date(newStartTime.getTime() + duration);\n \n // 调用更新函数\n console.log('✅ 执行拖拽更新事件:', {\n eventId: dragState.draggedEvent.id,\n originalDate: formatDate(originalStart),\n targetDate: formatDate(targetDate),\n originalStartTime: originalStart.toISOString(),\n originalEndTime: originalEnd.toISOString(),\n newStartTime: newStartTime.toISOString(),\n newEndTime: newEndTime.toISOString(),\n duration: duration / (1000 * 60) // 分钟\n });\n await onEventUpdate(dragState.draggedEvent.id, newStartTime, newEndTime);\n } catch (error) {\n console.error('❌ 拖拽更新事件失败:', error);\n // 这里可以显示错误提示\n }\n } else {\n console.log('⚠️ 跳过更新 - 日期相同或条件不满足');\n }\n } else {\n console.log('⚠️ 拖拽结束但缺少必要条件:', {\n hasOver: !!over,\n hasDraggedEvent: !!dragState.draggedEvent,\n hasDragOverDate: !!dragState.dragOverDate\n });\n }\n \n // 重置拖拽状态\n console.log('🔄 重置拖拽状态');\n resetDragState();\n }, [dragState.draggedEvent, dragState.dragOverDate, onEventUpdate]);\n\n // 重置拖拽状态\n const resetDragState = useCallback(() => {\n setDragState({\n isDragging: false,\n draggedEvent: null,\n dragOverDate: null,\n previewTime: null,\n });\n }, []);\n\n return {\n dragState,\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n resetDragState,\n };\n}\n\n// 辅助函数:格式化时间\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString('zh-CN', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n });\n} ","/**\n * 日历导出服务\n * \n * 提供日历事件的导出功能,支持多种格式:\n * - iCal (.ics) 格式\n * - JSON 格式\n * - CSV 格式\n */\n\nimport { CalendarEvent } from '../types';\n\nexport interface ExportOptions {\n format: 'ical' | 'json' | 'csv';\n dateRange?: {\n start: Date;\n end: Date;\n };\n includeCompleted?: boolean;\n}\n\nexport class CalendarExportService {\n /**\n * 导出事件到指定格式\n */\n static async exportEvents(events: CalendarEvent[], options: ExportOptions): Promise<string> {\n switch (options.format) {\n case 'ical':\n return this.exportToICal(events);\n case 'json':\n return this.exportToJSON(events);\n case 'csv':\n return this.exportToCSV(events);\n default:\n throw new Error('不支持的导出格式: ' + (options.format));\n }\n }\n\n /**\n * 导出为 iCal (.ics) 格式\n */\n private static exportToICal(events: CalendarEvent[]): string {\n const lines: string[] = [];\n \n // iCal 文件头\n lines.push('BEGIN:VCALENDAR');\n lines.push('VERSION:2.0');\n lines.push('PRODID:-//Profile-v1//Calendar Module//CN');\n lines.push('CALSCALE:GREGORIAN');\n lines.push('METHOD:PUBLISH');\n \n // 导出每个事件\n events.forEach(event => {\n lines.push('BEGIN:VEVENT');\n lines.push('UID:' + (event.id) + '@profile-v1.calendar');\n lines.push('DTSTART:' + (this.formatDateTimeToICal(new Date(event.startTime))));\n lines.push('DTEND:' + (this.formatDateTimeToICal(new Date(event.endTime))));\n lines.push('DTSTAMP:' + (this.formatDateTimeToICal(new Date(event.createdAt))));\n lines.push('SUMMARY:' + (this.escapeICalText(event.title)));\n \n if (event.description) {\n lines.push('DESCRIPTION:' + (this.escapeICalText(event.description)));\n }\n \n if (event.location) {\n lines.push('LOCATION:' + (this.escapeICalText(event.location)));\n }\n \n // 优先级\n if (event.priority) {\n const priorityMap: Record<string, string> = {\n 'low': '9',\n 'normal': '5',\n 'high': '1'\n };\n lines.push('PRIORITY:' + (priorityMap[event.priority] || '5'));\n }\n \n // 全天事件\n if (event.allDay) {\n lines.push('X-MICROSOFT-CDO-ALLDAYEVENT:TRUE');\n }\n \n lines.push('END:VEVENT');\n });\n \n // iCal 文件尾\n lines.push('END:VCALENDAR');\n \n return lines.join('\\r\\n');\n }\n\n /**\n * 导出为 JSON 格式\n */\n private static exportToJSON(events: CalendarEvent[]): string {\n const exportData = {\n exportedAt: new Date().toISOString(),\n version: '1.0',\n source: 'Profile-v1 Calendar',\n events: events.map(event => ({\n id: event.id,\n title: event.title,\n description: event.description,\n startTime: event.startTime,\n endTime: event.endTime,\n allDay: event.allDay,\n location: event.location,\n color: event.color,\n priority: event.priority,\n createdAt: event.createdAt,\n updatedAt: event.updatedAt\n }))\n };\n \n return JSON.stringify(exportData, null, 2);\n }\n\n /**\n * 导出为 CSV 格式\n */\n private static exportToCSV(events: CalendarEvent[]): string {\n const headers = [\n 'ID',\n '标题',\n '描述',\n '开始时间',\n '结束时间',\n '全天',\n '地点',\n '颜色',\n '优先级',\n '创建时间',\n '更新时间'\n ];\n \n const rows = events.map(event => [\n event.id,\n this.escapeCSVField(event.title),\n this.escapeCSVField(event.description || ''),\n event.startTime,\n event.endTime,\n event.allDay ? '是' : '否',\n this.escapeCSVField(event.location || ''),\n event.color || '',\n event.priority || '',\n event.createdAt,\n event.updatedAt || ''\n ]);\n \n const csvLines = [headers.join(',')];\n rows.forEach(row => {\n csvLines.push(row.join(','));\n });\n \n return csvLines.join('\\n');\n }\n\n /**\n * 下载导出的文件\n */\n static downloadFile(content: string, filename: string, mimeType: string): void {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n \n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n \n URL.revokeObjectURL(url);\n }\n\n /**\n * 获导出方法的便捷函数\n */\n static async exportAndDownload(\n events: CalendarEvent[], \n options: ExportOptions,\n filename?: string\n ): Promise<void> {\n const content = await this.exportEvents(events, options);\n \n const defaultFilenames = {\n ical: 'calendar-events.ics',\n json: 'calendar-events.json',\n csv: 'calendar-events.csv'\n };\n \n const mimeTypes = {\n ical: 'text/calendar',\n json: 'application/json',\n csv: 'text/csv'\n };\n \n const finalFilename = filename || defaultFilenames[options.format];\n const mimeType = mimeTypes[options.format];\n \n this.downloadFile(content, finalFilename, mimeType);\n }\n\n /**\n * 格式化日期时间为 iCal 格式\n */\n private static formatDateTimeToICal(date: Date): string {\n return date.toISOString().replace(/[-:]/g, '').replace(/\\.\\d{3}/, '');\n }\n\n /**\n * 转义 iCal 文本\n */\n private static escapeICalText(text: string): string {\n return text\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/;/g, '\\\\;')\n .replace(/,/g, '\\\\,')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '');\n }\n\n /**\n * 转义 CSV 字段\n */\n private static escapeCSVField(field: string): string {\n if (field.includes(',') || field.includes('\"') || field.includes('\\n')) {\n return '\"' + (field.replace(/\"/g, '\"\"')) + '\"';\n }\n return field;\n }\n}\n\nexport default CalendarExportService; ","/**\n * 日历导入服务\n * \n * 提供日历事件的导入功能,支持多种格式:\n * - iCal (.ics) 格式\n * - JSON 格式\n * - CSV 格式\n */\n\nimport { CreateEventRequest } from '../types';\n\nexport interface ImportOptions {\n format: 'ical' | 'json' | 'csv';\n overwriteExisting?: boolean;\n validateEvents?: boolean;\n}\n\nexport interface ImportResult {\n success: boolean;\n importedCount: number;\n errors: string[];\n events: CreateEventRequest[];\n}\n\nexport class CalendarImportService {\n /**\n * 从文件导入事件\n */\n static async importFromFile(file: File, options: ImportOptions): Promise<ImportResult> {\n try {\n const content = await this.readFileContent(file);\n return await this.importFromContent(content, options);\n } catch (error) {\n return {\n success: false,\n importedCount: 0,\n errors: ['读取文件失败: ' + (error instanceof Error ? error.message : '未知错误')],\n events: []\n };\n }\n }\n\n /**\n * 从内容字符串导入事件\n */\n static async importFromContent(content: string, options: ImportOptions): Promise<ImportResult> {\n try {\n let events: CreateEventRequest[] = [];\n \n switch (options.format) {\n case 'ical':\n events = this.parseICalContent(content);\n break;\n case 'json':\n events = this.parseJSONContent(content);\n break;\n case 'csv':\n events = this.parseCSVContent(content);\n break;\n default:\n throw new Error('不支持的导入格式: ' + (options.format));\n }\n\n // 验证事件(如果启用)\n if (options.validateEvents) {\n events = this.validateAndFilterEvents(events);\n }\n\n return {\n success: true,\n importedCount: events.length,\n errors: [],\n events: events\n };\n } catch (error) {\n return {\n success: false,\n importedCount: 0,\n errors: ['解析内容失败: ' + (error instanceof Error ? error.message : '未知错误')],\n events: []\n };\n }\n }\n\n /**\n * 读取文件内容\n */\n private static readFileContent(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => resolve(e.target?.result as string);\n reader.onerror = () => reject(new Error('文件读取失败'));\n reader.readAsText(file);\n });\n }\n\n /**\n * 解析 iCal 内容\n */\n private static parseICalContent(content: string): CreateEventRequest[] {\n const events: CreateEventRequest[] = [];\n const lines = content.split(/\\r?\\n/);\n \n let currentEvent: Partial<CreateEventRequest> | null = null;\n let currentProperty = '';\n \n for (let line of lines) {\n line = line.trim();\n \n if (line === 'BEGIN:VEVENT') {\n currentEvent = {};\n continue;\n }\n \n if (line === 'END:VEVENT') {\n if (currentEvent && currentEvent.title && currentEvent.startTime && currentEvent.endTime) {\n events.push(currentEvent as CreateEventRequest);\n }\n currentEvent = null;\n continue;\n }\n \n if (!currentEvent) continue;\n \n // 处理多行属性\n if (line.startsWith(' ') && currentProperty) {\n continue; // 简化处理,跳过多行属性\n }\n \n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) continue;\n \n const property = line.substring(0, colonIndex);\n const value = line.substring(colonIndex + 1);\n currentProperty = property;\n \n switch (property) {\n case 'SUMMARY':\n currentEvent.title = this.unescapeICalText(value);\n break;\n case 'DESCRIPTION':\n currentEvent.description = this.unescapeICalText(value);\n break;\n case 'DTSTART':\n currentEvent.startTime = this.parseICalDateTime(value);\n break;\n case 'DTEND':\n currentEvent.endTime = this.parseICalDateTime(value);\n break;\n case 'LOCATION':\n currentEvent.location = this.unescapeICalText(value);\n break;\n case 'PRIORITY':\n const priority = this.mapICalPriority(value);\n if (priority) currentEvent.priority = priority as any;\n break;\n }\n }\n \n return events;\n }\n\n /**\n * 解析 JSON 内容\n */\n private static parseJSONContent(content: string): CreateEventRequest[] {\n const data = JSON.parse(content);\n \n // 如果是导出的格式\n if (data.events && Array.isArray(data.events)) {\n return data.events.map((event: any) => ({\n title: event.title,\n description: event.description,\n startTime: event.startTime,\n endTime: event.endTime,\n allDay: event.allDay || false,\n location: event.location,\n color: event.color,\n priority: event.priority\n }));\n }\n \n // 如果是事件数组\n if (Array.isArray(data)) {\n return data.map((event: any) => ({\n title: event.title,\n description: event.description,\n startTime: event.startTime,\n endTime: event.endTime,\n allDay: event.allDay || false,\n location: event.location,\n color: event.color,\n priority: event.priority\n }));\n }\n \n throw new Error('无效的 JSON 格式');\n }\n\n /**\n * 解析 CSV 内容\n */\n private static parseCSVContent(content: string): CreateEventRequest[] {\n const lines = content.split(/\\r?\\n/);\n if (lines.length < 2) {\n throw new Error('CSV 文件必须包含标题行和至少一行数据');\n }\n \n const firstLine = lines[0];\n if (firstLine === undefined) {\n throw new Error('CSV 文件为空');\n }\n \n const headers = this.parseCSVLine(firstLine);\n const events: CreateEventRequest[] = [];\n \n for (let i = 1; i < lines.length; i++) {\n const currentLine = lines[i];\n if (currentLine === undefined) continue;\n \n const line = currentLine.trim();\n if (!line) continue;\n \n const values = this.parseCSVLine(line);\n if (values.length !== headers.length) continue;\n \n const event: Partial<CreateEventRequest> = {};\n \n headers.forEach((header, index) => {\n const value = values[index];\n switch (header.toLowerCase()) {\n case '标题':\n case 'title':\n event.title = value;\n break;\n case '描述':\n case 'description':\n event.description = value;\n break;\n case '开始时间':\n case 'start_time':\n case 'starttime':\n event.startTime = value;\n break;\n case '结束时间':\n case 'end_time':\n case 'endtime':\n event.endTime = value;\n break;\n case '全天':\n case 'all_day':\n case 'allday':\n event.allDay = value === '是' || value === 'true' || value === 'True';\n break;\n case '地点':\n case 'location':\n event.location = value;\n break;\n case '颜色':\n case 'color':\n event.color = value;\n break;\n case '优先级':\n case 'priority':\n event.priority = value as any;\n break;\n }\n });\n \n if (event.title && event.startTime && event.endTime) {\n events.push(event as CreateEventRequest);\n }\n }\n \n return events;\n }\n\n /**\n * 解析 CSV 行\n */\n private static parseCSVLine(line: string): string[] {\n const result: string[] = [];\n let current = '';\n let inQuotes = false;\n \n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n \n if (char === '\"') {\n if (inQuotes && line[i + 1] === '\"') {\n current += '\"';\n i++; // 跳过下一个引号\n } else {\n inQuotes = !inQuotes;\n }\n } else if (char === ',' && !inQuotes) {\n result.push(current);\n current = '';\n } else {\n current += char;\n }\n }\n \n result.push(current);\n return result;\n }\n\n /**\n * 验证和过滤事件\n */\n private static validateAndFilterEvents(events: CreateEventRequest[]): CreateEventRequest[] {\n return events.filter(event => {\n // 基本验证\n if (!event.title || !event.startTime || !event.endTime) {\n return false;\n }\n \n // 时间验证\n const startTime = new Date(event.startTime);\n const endTime = new Date(event.endTime);\n \n if (isNaN(startTime.getTime()) || isNaN(endTime.getTime())) {\n return false;\n }\n \n if (endTime <= startTime) {\n return false;\n }\n \n return true;\n });\n }\n\n /**\n * 解析 iCal 日期时间\n */\n private static parseICalDateTime(value: string): string {\n // 简化处理,支持基本的 iCal 日期时间格式\n if (value.includes('T')) {\n // 有时间的格式:20240315T093000Z\n const dateTime = value.replace(/[^\\d]/g, '');\n if (dateTime.length >= 14) {\n const year = dateTime.substring(0, 4);\n const month = dateTime.substring(4, 6);\n const day = dateTime.substring(6, 8);\n const hour = dateTime.substring(8, 10);\n const minute = dateTime.substring(10, 12);\n const second = dateTime.substring(12, 14);\n return (year) + '-' + (month) + '-' + (day) + 'T' + (hour) + ':' + (minute) + ':' + (second) + '.000Z';\n }\n } else {\n // 只有日期的格式:20240315\n const dateOnly = value.replace(/[^\\d]/g, '');\n if (dateOnly.length >= 8) {\n const year = dateOnly.substring(0, 4);\n const month = dateOnly.substring(4, 6);\n const day = dateOnly.substring(6, 8);\n return (year) + '-' + (month) + '-' + (day) + 'T00:00:00.000Z';\n }\n }\n \n return new Date().toISOString(); // 默认返回当前时间\n }\n\n /**\n * 反转义 iCal 文本\n */\n private static unescapeICalText(text: string): string {\n return text\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\,/g, ',')\n .replace(/\\\\;/g, ';')\n .replace(/\\\\\\\\/g, '\\\\');\n }\n\n /**\n * 映射 iCal 优先级\n */\n private static mapICalPriority(value: string): string | undefined {\n const priority = parseInt(value);\n if (priority >= 1 && priority <= 3) return 'high';\n if (priority >= 4 && priority <= 6) return 'normal';\n if (priority >= 7 && priority <= 9) return 'low';\n return undefined;\n }\n}\n\nexport default CalendarImportService; ","interface RecurrenceRule {\n type: 'daily' | 'weekly' | 'monthly' | 'yearly';\n interval: number; // 重复间隔\n endDate?: string; // 结束日期 (YYYY-MM-DD格式)\n count?: number; // 重复次数\n daysOfWeek?: number[]; // 星期几 (0=周日, 1=周一, ...)\n dayOfMonth?: number; // 月份中的第几天\n weekOfMonth?: number; // 月份中的第几周\n}\n\ninterface RecurringEventInstance {\n startTime: string;\n endTime: string;\n title: string;\n description?: string;\n location?: string;\n color?: string;\n priority?: string;\n allDay: boolean;\n isRecurringInstance: boolean;\n recurrenceId?: string; // 原始事件ID\n instanceDate: string; // 该实例的日期\n}\n\nexport class RecurrenceService {\n /**\n * 根据重复规则生成事件实例\n */\n static generateRecurringInstances(\n baseEvent: {\n title: string;\n description?: string;\n startTime: string;\n endTime: string;\n location?: string;\n color?: string;\n priority?: string;\n allDay: boolean;\n },\n rule: RecurrenceRule,\n startDate: Date,\n endDate: Date,\n eventId?: string\n ): RecurringEventInstance[] {\n const instances: RecurringEventInstance[] = [];\n const baseStart = new Date(baseEvent.startTime);\n const baseEnd = new Date(baseEvent.endTime);\n const duration = baseEnd.getTime() - baseStart.getTime();\n\n let currentDate = new Date(startDate);\n let instanceCount = 0;\n const maxInstances = rule.count || 1000; // 最大实例数限制\n\n // 确保不超过结束日期\n const ruleEndDate = rule.endDate ? new Date(rule.endDate) : endDate;\n const finalEndDate = ruleEndDate < endDate ? ruleEndDate : endDate;\n\n while (currentDate <= finalEndDate && instanceCount < maxInstances) {\n if (this.shouldGenerateInstance(currentDate, baseStart, rule)) {\n const instanceStart = new Date(currentDate);\n instanceStart.setHours(baseStart.getHours(), baseStart.getMinutes(), baseStart.getSeconds());\n \n const instanceEnd = new Date(instanceStart.getTime() + duration);\n\n instances.push({\n startTime: instanceStart.toISOString(),\n endTime: instanceEnd.toISOString(),\n title: baseEvent.title,\n description: baseEvent.description,\n location: baseEvent.location,\n color: baseEvent.color,\n priority: baseEvent.priority,\n allDay: baseEvent.allDay,\n isRecurringInstance: true,\n recurrenceId: eventId,\n instanceDate: currentDate.toISOString().split('T')[0]!,\n });\n\n instanceCount++;\n }\n\n // 移动到下一个可能的日期\n currentDate = this.getNextOccurrence(currentDate, rule);\n \n // 防止无限循环\n if (instanceCount > maxInstances) {\n break;\n }\n }\n\n return instances;\n }\n\n /**\n * 判断是否应该在指定日期生成实例\n */\n private static shouldGenerateInstance(\n date: Date,\n baseDate: Date,\n rule: RecurrenceRule\n ): boolean {\n switch (rule.type) {\n case 'daily':\n const daysDiff = Math.floor((date.getTime() - baseDate.getTime()) / (24 * 60 * 60 * 1000));\n return daysDiff >= 0 && daysDiff % rule.interval === 0;\n\n case 'weekly':\n const weeksDiff = Math.floor((date.getTime() - baseDate.getTime()) / (7 * 24 * 60 * 60 * 1000));\n const sameWeekday = date.getDay() === baseDate.getDay();\n return weeksDiff >= 0 && weeksDiff % rule.interval === 0 && sameWeekday;\n\n case 'monthly':\n const monthsDiff = (date.getFullYear() - baseDate.getFullYear()) * 12 + (date.getMonth() - baseDate.getMonth());\n const sameDayOfMonth = date.getDate() === baseDate.getDate();\n return monthsDiff >= 0 && monthsDiff % rule.interval === 0 && sameDayOfMonth;\n\n case 'yearly':\n const yearsDiff = date.getFullYear() - baseDate.getFullYear();\n const sameMonthAndDay = date.getMonth() === baseDate.getMonth() && date.getDate() === baseDate.getDate();\n return yearsDiff >= 0 && yearsDiff % rule.interval === 0 && sameMonthAndDay;\n\n default:\n return false;\n }\n }\n\n /**\n * 获取下一个重复事件的日期\n */\n private static getNextOccurrence(date: Date, rule: RecurrenceRule): Date {\n const nextDate = new Date(date);\n\n switch (rule.type) {\n case 'daily':\n nextDate.setDate(nextDate.getDate() + rule.interval);\n break;\n\n case 'weekly':\n nextDate.setDate(nextDate.getDate() + (7 * rule.interval));\n break;\n\n case 'monthly':\n nextDate.setMonth(nextDate.getMonth() + rule.interval);\n break;\n\n case 'yearly':\n nextDate.setFullYear(nextDate.getFullYear() + rule.interval);\n break;\n }\n\n return nextDate;\n }\n\n /**\n * 验证重复规则\n */\n static validateRecurrenceRule(rule: RecurrenceRule): string[] {\n const errors: string[] = [];\n\n if (!rule.type) {\n errors.push('重复类型不能为空');\n }\n\n if (!rule.interval || rule.interval < 1) {\n errors.push('重复间隔必须大于0');\n }\n\n if (rule.interval > 365) {\n errors.push('重复间隔不能超过365');\n }\n\n if (rule.endDate && rule.count && rule.count > 0) {\n errors.push('不能同时设置结束日期和重复次数');\n }\n\n if (rule.endDate) {\n const endDate = new Date(rule.endDate);\n if (isNaN(endDate.getTime())) {\n errors.push('结束日期格式不正确');\n } else if (endDate < new Date()) {\n errors.push('结束日期不能早于当前日期');\n }\n }\n\n if (rule.count && (rule.count < 1 || rule.count > 999)) {\n errors.push('重复次数必须在1-999之间');\n }\n\n return errors;\n }\n\n /**\n * 将表单数据转换为重复规则\n */\n static formDataToRecurrenceRule(formData: {\n recurrenceType?: 'daily' | 'weekly' | 'monthly' | 'yearly';\n recurrenceInterval?: number;\n recurrenceEndDate?: string;\n recurrenceCount?: number;\n }): RecurrenceRule | null {\n if (!formData.recurrenceType) {\n return null;\n }\n\n return {\n type: formData.recurrenceType,\n interval: formData.recurrenceInterval || 1,\n endDate: formData.recurrenceEndDate || undefined,\n count: formData.recurrenceCount || undefined,\n };\n }\n\n /**\n * 描述重复规则的文本\n */\n static describeRecurrenceRule(rule: RecurrenceRule): string {\n let description = '';\n\n switch (rule.type) {\n case 'daily':\n description = rule.interval === 1 ? '每天' : '每' + (rule.interval) + '天';\n break;\n case 'weekly':\n description = rule.interval === 1 ? '每周' : '每' + (rule.interval) + '周';\n break;\n case 'monthly':\n description = rule.interval === 1 ? '每月' : '每' + (rule.interval) + '个月';\n break;\n case 'yearly':\n description = rule.interval === 1 ? '每年' : '每' + (rule.interval) + '年';\n break;\n }\n\n if (rule.endDate) {\n description += ',直到' + (rule.endDate);\n } else if (rule.count) {\n description += ',共' + (rule.count) + '次';\n }\n\n return description;\n }\n}\n\n// 导出类型\nexport type { RecurrenceRule, RecurringEventInstance }; ","import { CalendarEvent } from '../types';\n\ninterface ReminderConfig {\n minutes: number; // 提前多少分钟提醒\n type: 'browser' | 'email' | 'sms' | 'sound';\n enabled: boolean;\n}\n\ninterface ScheduledReminder {\n id: string;\n eventId: number;\n eventTitle: string;\n reminderTime: Date;\n config: ReminderConfig;\n status: 'pending' | 'sent' | 'failed';\n}\n\nexport class ReminderService {\n private static reminders: Map<string, ScheduledReminder> = new Map();\n private static notificationPermission: NotificationPermission = 'default';\n\n /**\n * 初始化提醒服务\n */\n static async initialize(): Promise<void> {\n // 请求通知权限\n if ('Notification' in window) {\n this.notificationPermission = await Notification.requestPermission();\n }\n\n // 检查并触发到期的提醒\n this.checkPendingReminders();\n \n // 每分钟检查一次提醒\n setInterval(() => {\n this.checkPendingReminders();\n }, 60000);\n }\n\n /**\n * 为事件创建提醒\n */\n static createReminder(\n event: CalendarEvent,\n reminderMinutes: number,\n reminderType: 'browser' | 'email' | 'sms' | 'sound' = 'browser'\n ): string {\n const reminderId = (event.id) + '_' + (Date.now());\n const eventStart = new Date(event.startTime);\n const reminderTime = new Date(eventStart.getTime() - (reminderMinutes * 60 * 1000));\n\n const reminder: ScheduledReminder = {\n id: reminderId,\n eventId: event.id,\n eventTitle: event.title,\n reminderTime,\n config: {\n minutes: reminderMinutes,\n type: reminderType,\n enabled: true,\n },\n status: 'pending',\n };\n\n this.reminders.set(reminderId, reminder);\n \n // 如果提醒时间已经过了,立即触发\n if (reminderTime <= new Date()) {\n this.triggerReminder(reminder);\n }\n\n return reminderId;\n }\n\n /**\n * 删除提醒\n */\n static deleteReminder(reminderId: string): boolean {\n return this.reminders.delete(reminderId);\n }\n\n /**\n * 删除事件的所有提醒\n */\n static deleteEventReminders(eventId: number): void {\n for (const [id, reminder] of this.reminders.entries()) {\n if (reminder.eventId === eventId) {\n this.reminders.delete(id);\n }\n }\n }\n\n /**\n * 检查并触发到期的提醒\n */\n private static checkPendingReminders(): void {\n const now = new Date();\n \n for (const reminder of this.reminders.values()) {\n if (reminder.status === 'pending' && reminder.reminderTime <= now) {\n this.triggerReminder(reminder);\n }\n }\n }\n\n /**\n * 触发提醒\n */\n private static async triggerReminder(reminder: ScheduledReminder): Promise<void> {\n try {\n switch (reminder.config.type) {\n case 'browser':\n await this.sendBrowserNotification(reminder);\n break;\n case 'email':\n await this.sendEmailReminder(reminder);\n break;\n case 'sms':\n await this.sendSmsReminder(reminder);\n break;\n case 'sound':\n await this.playSoundReminder(reminder);\n break;\n }\n \n reminder.status = 'sent';\n } catch (error) {\n console.error('Failed to send reminder:', error);\n reminder.status = 'failed';\n }\n }\n\n /**\n * 发送浏览器通知\n */\n private static async sendBrowserNotification(reminder: ScheduledReminder): Promise<void> {\n if (this.notificationPermission !== 'granted') {\n throw new Error('Notification permission not granted');\n }\n\n const timeText = this.getTimeText(reminder.config.minutes);\n const notification = new Notification(`📅 事件提醒`, {\n body: (reminder.eventTitle) + '\\n' + (timeText),\n icon: '/favicon.ico',\n tag: reminder.id,\n requireInteraction: true,\n });\n\n // 点击通知时的处理\n notification.onclick = () => {\n window.focus();\n notification.close();\n // 可以添加跳转到日历页面的逻辑\n };\n\n // 自动关闭通知\n setTimeout(() => {\n notification.close();\n }, 10000);\n }\n\n /**\n * 发送邮件提醒\n */\n private static async sendEmailReminder(reminder: ScheduledReminder): Promise<void> {\n // 这里应该调用后端邮件服务API\n console.log('Email reminder would be sent:', reminder);\n \n // 示例API调用\n // const response = await fetch('/api/send-email-reminder', {\n // method: 'POST',\n // headers: { 'Content-Type': 'application/json' },\n // body: JSON.stringify({\n // eventTitle: reminder.eventTitle,\n // reminderMinutes: reminder.config.minutes,\n // }),\n // });\n \n // if (!response.ok) {\n // throw new Error('Failed to send email reminder');\n // }\n }\n\n /**\n * 发送短信提醒\n */\n private static async sendSmsReminder(reminder: ScheduledReminder): Promise<void> {\n // 这里应该调用后端短信服务API\n console.log('SMS reminder would be sent:', reminder);\n \n // 示例API调用\n // const response = await fetch('/api/send-sms-reminder', {\n // method: 'POST',\n // headers: { 'Content-Type': 'application/json' },\n // body: JSON.stringify({\n // eventTitle: reminder.eventTitle,\n // reminderMinutes: reminder.config.minutes,\n // }),\n // });\n \n // if (!response.ok) {\n // throw new Error('Failed to send SMS reminder');\n // }\n }\n\n /**\n * 播放声音提醒\n */\n private static async playSoundReminder(reminder: ScheduledReminder): Promise<void> {\n try {\n // 创建一个简单的提醒音\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n\n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n\n oscillator.frequency.setValueAtTime(800, audioContext.currentTime);\n oscillator.frequency.setValueAtTime(600, audioContext.currentTime + 0.1);\n oscillator.frequency.setValueAtTime(800, audioContext.currentTime + 0.2);\n\n gainNode.gain.setValueAtTime(0.3, audioContext.currentTime);\n gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 0.5);\n\n oscillator.start(audioContext.currentTime);\n oscillator.stop(audioContext.currentTime + 0.5);\n\n // 显示视觉提醒\n this.showVisualAlert(reminder);\n } catch (error) {\n console.error('Failed to play sound reminder:', error);\n // 降级到视觉提醒\n this.showVisualAlert(reminder);\n }\n }\n\n /**\n * 显示视觉提醒\n */\n private static showVisualAlert(reminder: ScheduledReminder): void {\n const timeText = this.getTimeText(reminder.config.minutes);\n alert('📅 事件提醒\\n\\n' + (reminder.eventTitle) + '\\n' + (timeText));\n }\n\n /**\n * 获取时间描述文本\n */\n private static getTimeText(minutes: number): string {\n if (minutes === 0) {\n return '事件即将开始';\n } else if (minutes < 60) {\n return (minutes) + '分钟后开始';\n } else if (minutes < 1440) {\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return remainingMinutes > 0 \n ? (hours) + '小时' + (remainingMinutes) + '分钟后开始'\n : (hours) + '小时后开始';\n } else {\n const days = Math.floor(minutes / 1440);\n const remainingHours = Math.floor((minutes % 1440) / 60);\n return remainingHours > 0\n ? (days) + '天' + (remainingHours) + '小时后开始'\n : (days) + '天后开始';\n }\n }\n\n /**\n * 获取所有提醒\n */\n static getAllReminders(): ScheduledReminder[] {\n return Array.from(this.reminders.values());\n }\n\n /**\n * 获取事件的提醒\n */\n static getEventReminders(eventId: number): ScheduledReminder[] {\n return Array.from(this.reminders.values()).filter(\n reminder => reminder.eventId === eventId\n );\n }\n\n /**\n * 智能推荐提醒时间\n */\n static getSmartReminderSuggestions(event: CalendarEvent): number[] {\n const suggestions: number[] = [];\n const eventStart = new Date(event.startTime);\n const now = new Date();\n const hoursUntilEvent = (eventStart.getTime() - now.getTime()) / (1000 * 60 * 60);\n\n // 根据事件类型和时间距离智能推荐\n if (event.allDay) {\n // 全天事件:提前更长时间\n suggestions.push(1440, 720, 60); // 1天、12小时、1小时\n } else {\n // 普通事件:根据距离时间推荐\n if (hoursUntilEvent > 24) {\n suggestions.push(1440, 60, 15); // 1天、1小时、15分钟\n } else if (hoursUntilEvent > 2) {\n suggestions.push(60, 30, 15); // 1小时、30分钟、15分钟\n } else {\n suggestions.push(30, 15, 5); // 30分钟、15分钟、5分钟\n }\n }\n\n // 根据优先级调整\n if (event.priority === 'urgent') {\n suggestions.unshift(0); // 紧急事件添加即时提醒\n }\n\n // 去重并排序\n return [...new Set(suggestions)].sort((a, b) => b - a);\n }\n\n /**\n * 批量创建智能提醒\n */\n static createSmartReminders(event: CalendarEvent): string[] {\n const suggestions = this.getSmartReminderSuggestions(event);\n const reminderIds: string[] = [];\n\n // 自动创建推荐的提醒\n suggestions.slice(0, 2).forEach(minutes => { // 只创建前两个推荐\n const reminderId = this.createReminder(event, minutes, 'browser');\n reminderIds.push(reminderId);\n });\n\n return reminderIds;\n }\n}\n\n// 导出类型\nexport type { ReminderConfig, ScheduledReminder }; ","'use client';\n\n/**\n * 检测是否为移动端设备\n */\nexport const isMobileDevice = (): boolean => {\n if (typeof window === 'undefined') return false;\n \n // 检测屏幕宽度\n const isMobileWidth = window.innerWidth <= 768;\n \n // 检测触摸支持\n const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n \n // 检测用户代理\n const isMobileUserAgent = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n );\n \n return isMobileWidth || (isTouchDevice && isMobileUserAgent);\n};\n\n/**\n * 检测是否支持拖拽\n */\nexport const isDragSupported = (): boolean => {\n if (typeof window === 'undefined') return false;\n \n // 移动端禁用拖拽\n if (isMobileDevice()) return false;\n \n // 检测拖拽API支持\n return 'draggable' in document.createElement('div');\n};\n\n/**\n * 响应式Hook - 监听设备类型变化\n */\nimport { useState, useEffect } from 'react';\n\nexport const useDeviceType = () => {\n const [isMobile, setIsMobile] = useState(false);\n const [dragSupported, setDragSupported] = useState(true);\n \n useEffect(() => {\n const checkDevice = () => {\n const mobile = isMobileDevice();\n setIsMobile(mobile);\n setDragSupported(isDragSupported());\n };\n \n checkDevice();\n window.addEventListener('resize', checkDevice);\n \n return () => window.removeEventListener('resize', checkDevice);\n }, []);\n \n return { isMobile, dragSupported };\n}; ","export * from '../types';\nexport * from '../logic';\n\nexport const CALENDAR_MODULE_VERSION = '1.0.0';\nexport const CALENDAR_MODULE_NAME = 'sa2kit/calendar';\n","import React, { useState, useEffect } from 'react';\nimport { clsx } from 'clsx';\n\n// 预设颜色主题\nconst COLOR_THEMES = {\n default: {\n name: '默认主题',\n colors: {\n primary: '#3B82F6', // 蓝色\n secondary: '#10B981', // 绿色\n accent: '#F59E0B', // 黄色\n danger: '#EF4444', // 红色\n purple: '#8B5CF6', // 紫色\n pink: '#EC4899', // 粉色\n indigo: '#6366F1', // 靛蓝\n teal: '#14B8A6', // 青色\n },\n background: {\n calendar: '#FFFFFF',\n cell: '#F9FAFB',\n today: '#EFF6FF',\n weekend: '#F3F4F6',\n otherMonth: '#F9FAFB',\n },\n border: {\n calendar: '#E5E7EB',\n cell: '#E5E7EB',\n today: '#3B82F6',\n },\n text: {\n primary: '#111827',\n secondary: '#6B7280',\n today: '#1D4ED8',\n weekend: '#9CA3AF',\n otherMonth: '#D1D5DB',\n }\n },\n dark: {\n name: '深色主题',\n colors: {\n primary: '#60A5FA',\n secondary: '#34D399',\n accent: '#FBBF24',\n danger: '#F87171',\n purple: '#A78BFA',\n pink: '#F472B6',\n indigo: '#818CF8',\n teal: '#2DD4BF',\n },\n background: {\n calendar: '#1F2937',\n cell: '#374151',\n today: '#1E3A8A',\n weekend: '#374151',\n otherMonth: '#374151',\n },\n border: {\n calendar: '#4B5563',\n cell: '#4B5563',\n today: '#60A5FA',\n },\n text: {\n primary: '#F9FAFB',\n secondary: '#D1D5DB',\n today: '#DBEAFE',\n weekend: '#9CA3AF',\n otherMonth: '#6B7280',\n }\n },\n colorful: {\n name: '彩色主题',\n colors: {\n primary: '#8B5CF6',\n secondary: '#06B6D4',\n accent: '#F59E0B',\n danger: '#EF4444',\n purple: '#8B5CF6',\n pink: '#EC4899',\n indigo: '#6366F1',\n teal: '#14B8A6',\n },\n background: {\n calendar: '#FFFFFF',\n cell: '#FEF3C7',\n today: '#DDD6FE',\n weekend: '#FECACA',\n otherMonth: '#F3F4F6',\n },\n border: {\n calendar: '#D1D5DB',\n cell: '#D1D5DB',\n today: '#8B5CF6',\n },\n text: {\n primary: '#111827',\n secondary: '#6B7280',\n today: '#5B21B6',\n weekend: '#DC2626',\n otherMonth: '#9CA3AF',\n }\n }\n};\n\n// 其他设置选项\nconst WEEK_START_OPTIONS = [\n { value: 0, label: '周日开始' },\n { value: 1, label: '周一开始' },\n];\n\nconst TIME_FORMAT_OPTIONS = [\n { value: '12h', label: '12小时制' },\n { value: '24h', label: '24小时制' },\n];\n\nconst LANGUAGE_OPTIONS = [\n { value: 'zh-CN', label: '简体中文' },\n { value: 'en-US', label: 'English' },\n];\n\ninterface CalendarSettingsProps {\n onSettingsChange?: (settings: CalendarSettings) => void;\n}\n\nexport interface CalendarSettings {\n theme: keyof typeof COLOR_THEMES;\n customColors?: {\n [key: string]: string;\n };\n weekStartsOn: number;\n timeFormat: '12h' | '24h';\n language: string;\n showWeekNumbers: boolean;\n showLunarCalendar: boolean;\n defaultEventDuration: number; // 分钟\n workingHours: {\n start: string;\n end: string;\n };\n}\n\nconst DEFAULT_SETTINGS: CalendarSettings = {\n theme: 'default',\n weekStartsOn: 1,\n timeFormat: '24h',\n language: 'zh-CN',\n showWeekNumbers: false,\n showLunarCalendar: false,\n defaultEventDuration: 60,\n workingHours: {\n start: '09:00',\n end: '18:00',\n },\n};\n\nexport default function CalendarSettings({ onSettingsChange }: CalendarSettingsProps) {\n const [settings, setSettings] = useState<CalendarSettings>(DEFAULT_SETTINGS);\n const [activeTab, setActiveTab] = useState<'theme' | 'general' | 'time'>('theme');\n\n // 从localStorage加载设置\n useEffect(() => {\n const savedSettings = localStorage.getItem('calendar-settings');\n if (savedSettings) {\n try {\n const parsedSettings = JSON.parse(savedSettings);\n setSettings({ ...DEFAULT_SETTINGS, ...parsedSettings });\n } catch (error) {\n console.error('加载日历设置失败:', error);\n }\n }\n }, []);\n\n // 保存设置到localStorage\n const saveSettings = (newSettings: CalendarSettings) => {\n setSettings(newSettings);\n localStorage.setItem('calendar-settings', JSON.stringify(newSettings));\n onSettingsChange?.(newSettings);\n };\n\n // 更新设置\n const updateSettings = (updates: Partial<CalendarSettings>) => {\n const newSettings = { ...settings, ...updates };\n saveSettings(newSettings);\n };\n\n // 重置设置\n const resetSettings = () => {\n saveSettings(DEFAULT_SETTINGS);\n };\n\n // 当前主题\n const currentTheme = COLOR_THEMES[settings.theme];\n\n return (\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200\">\n {/* 标题 */}\n <div className=\"px-6 py-4 border-b border-gray-200\">\n <h2 className=\"text-lg font-semibold text-gray-900\">日历设置</h2>\n <p className=\"text-sm text-gray-600 mt-1\">\n 自定义您的日历外观和行为\n </p>\n </div>\n\n {/* 选项卡 */}\n <div className=\"border-b border-gray-200\">\n <nav className=\"flex space-x-8 px-6\">\n {[\n { key: 'theme', label: '主题样式', icon: '🎨' },\n { key: 'general', label: '常规设置', icon: '⚙️' },\n { key: 'time', label: '时间设置', icon: '⏰' },\n ].map(({ key, label, icon }) => (\n <button\n key={key}\n onClick={() => setActiveTab(key as any)}\n className={clsx('py-4 text-sm font-medium border-b-2 transition-colors', activeTab === key\n ? 'border-blue-500 text-blue-600'\n : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300')}\n >\n <span className=\"mr-2\">{icon}</span>\n {label}\n </button>\n ))}\n </nav>\n </div>\n\n <div className=\"p-6\">\n {/* 主题样式设置 */}\n {activeTab === 'theme' && (\n <div className=\"space-y-6\">\n {/* 预设主题 */}\n <div>\n <h3 className=\"text-md font-medium text-gray-900 mb-4\">预设主题</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n {Object.entries(COLOR_THEMES).map(([key, theme]) => (\n <div\n key={key}\n onClick={() => updateSettings({ theme: key as keyof typeof COLOR_THEMES })}\n className={clsx('p-4 border-2 rounded-lg cursor-pointer transition-all', settings.theme === key\n ? 'border-blue-500 bg-blue-50'\n : 'border-gray-200 hover:border-gray-300')}\n >\n <div className=\"flex items-center justify-between mb-3\">\n <h4 className=\"font-medium text-gray-900\">{theme.name}</h4>\n {settings.theme === key && (\n <svg className=\"w-5 h-5 text-blue-500\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n )}\n </div>\n \n {/* 颜色预览 */}\n <div className=\"flex space-x-1 mb-3\">\n {Object.values(theme.colors).slice(0, 6).map((color, index) => (\n <div\n key={index}\n className=\"w-6 h-6 rounded-full border border-gray-200\"\n style={{ backgroundColor: color }}\n />\n ))}\n </div>\n \n {/* 日历预览 */}\n <div className=\"text-xs\">\n <div \n className=\"grid grid-cols-7 gap-1 p-2 rounded border\"\n style={{ \n backgroundColor: theme.background.calendar,\n borderColor: theme.border.calendar \n }}\n >\n {['日', '一', '二', '三', '四', '五', '六'].map((day, index) => (\n <div \n key={day}\n className=\"text-center py-1 text-xs\"\n style={{ color: theme.text.secondary }}\n >\n {day}\n </div>\n ))}\n {Array.from({ length: 7 }, (_, index) => (\n <div\n key={index}\n className=\"aspect-square flex items-center justify-center text-xs rounded\"\n style={{\n backgroundColor: index === 3 ? theme.background.today : theme.background.cell,\n color: index === 3 ? theme.text.today : theme.text.primary,\n border: '1px solid ' + (index === 3 ? theme.border.today : theme.border.cell)\n }}\n >\n {index + 1}\n </div>\n ))}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* 自定义颜色 */}\n <div>\n <h3 className=\"text-md font-medium text-gray-900 mb-4\">自定义颜色</h3>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {Object.entries(currentTheme.colors).map(([key, defaultColor]) => (\n <div key={key} className=\"space-y-2\">\n <label className=\"block text-sm font-medium text-gray-700 capitalize\">\n {key === 'primary' ? '主色' : \n key === 'secondary' ? '次要色' : \n key === 'accent' ? '强调色' : \n key === 'danger' ? '危险色' : key}\n </label>\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"color\"\n value={settings.customColors?.[key] || defaultColor}\n onChange={(e) => updateSettings({\n customColors: {\n ...settings.customColors,\n [key]: e.target.value\n }\n })}\n className=\"w-12 h-8 border border-gray-300 rounded cursor-pointer\"\n />\n <input\n type=\"text\"\n value={settings.customColors?.[key] || defaultColor}\n onChange={(e) => updateSettings({\n customColors: {\n ...settings.customColors,\n [key]: e.target.value\n }\n })}\n className=\"flex-1 px-3 py-1 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n placeholder={defaultColor}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* 常规设置 */}\n {activeTab === 'general' && (\n <div className=\"space-y-6\">\n {/* 一周开始 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 一周开始于\n </label>\n <select\n value={settings.weekStartsOn}\n onChange={(e) => updateSettings({ weekStartsOn: Number(e.target.value) })}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {WEEK_START_OPTIONS.map(option => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* 语言设置 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 语言\n </label>\n <select\n value={settings.language}\n onChange={(e) => updateSettings({ language: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {LANGUAGE_OPTIONS.map(option => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* 显示选项 */}\n <div className=\"space-y-4\">\n <h3 className=\"text-md font-medium text-gray-900\">显示选项</h3>\n \n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={settings.showWeekNumbers}\n onChange={(e) => updateSettings({ showWeekNumbers: e.target.checked })}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">显示周数</span>\n </label>\n\n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={settings.showLunarCalendar}\n onChange={(e) => updateSettings({ showLunarCalendar: e.target.checked })}\n className=\"rounded border-gray-300 text-blue-600 focus:ring-blue-500\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">显示农历</span>\n </label>\n </div>\n\n {/* 默认事件时长 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 默认事件时长(分钟)\n </label>\n <input\n type=\"number\"\n min=\"15\"\n max=\"480\"\n step=\"15\"\n value={settings.defaultEventDuration}\n onChange={(e) => updateSettings({ defaultEventDuration: Number(e.target.value) })}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n </div>\n )}\n\n {/* 时间设置 */}\n {activeTab === 'time' && (\n <div className=\"space-y-6\">\n {/* 时间格式 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 时间格式\n </label>\n <select\n value={settings.timeFormat}\n onChange={(e) => updateSettings({ timeFormat: e.target.value as '12h' | '24h' })}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {TIME_FORMAT_OPTIONS.map(option => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n\n {/* 工作时间 */}\n <div>\n <h3 className=\"text-md font-medium text-gray-900 mb-4\">工作时间</h3>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 开始时间\n </label>\n <input\n type=\"time\"\n value={settings.workingHours.start}\n onChange={(e) => updateSettings({\n workingHours: {\n ...settings.workingHours,\n start: e.target.value\n }\n })}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 结束时间\n </label>\n <input\n type=\"time\"\n value={settings.workingHours.end}\n onChange={(e) => updateSettings({\n workingHours: {\n ...settings.workingHours,\n end: e.target.value\n }\n })}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* 操作按钮 */}\n <div className=\"flex justify-between pt-6 border-t border-gray-200\">\n <button\n onClick={resetSettings}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-gray-100 hover:bg-gray-200 rounded-md transition-colors\"\n >\n 重置为默认\n </button>\n \n <div className=\"flex space-x-3\">\n <button\n onClick={() => {\n const dataStr = JSON.stringify(settings, null, 2);\n const dataBlob = new Blob([dataStr], { type: 'application/json' });\n const url = URL.createObjectURL(dataBlob);\n const link = document.createElement('a');\n link.href = url;\n link.download = 'calendar-settings.json';\n link.click();\n URL.revokeObjectURL(url);\n }}\n className=\"px-4 py-2 text-sm font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded-md transition-colors\"\n >\n 导出设置\n </button>\n \n <label className=\"px-4 py-2 text-sm font-medium text-green-600 bg-green-50 hover:bg-green-100 rounded-md transition-colors cursor-pointer\">\n 导入设置\n <input\n type=\"file\"\n accept=\".json\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (event) => {\n try {\n const importedSettings = JSON.parse(event.target?.result as string);\n saveSettings({ ...DEFAULT_SETTINGS, ...importedSettings });\n } catch (error) {\n alert('导入设置失败,请检查文件格式');\n }\n };\n reader.readAsText(file);\n }\n }}\n />\n </label>\n </div>\n </div>\n </div>\n </div>\n );\n} ","'use client';\n\nimport React from 'react';\nimport { useDraggable } from '@dnd-kit/core';\nimport { CalendarEvent } from '../types';\nimport { formatTime } from '../utils/dateUtils';\nimport { useDeviceType } from '../utils/deviceUtils';\nimport { clsx } from 'clsx';\n\ninterface DraggableEventProps {\n event: CalendarEvent;\n isDragging?: boolean;\n className?: string;\n onClick?: () => void;\n children?: React.ReactNode;\n}\n\n/**\n * 可拖拽的事件组件\n * \n * 功能特性:\n * - 支持拖拽移动事件(桌面端)\n * - 移动端禁用拖拽功能\n * - 拖拽时显示半透明效果\n * - 保持原有的点击功能\n * - 响应式设计\n */\nexport const DraggableEvent: React.FC<DraggableEventProps> = ({\n event,\n isDragging = false,\n className = '',\n onClick,\n children\n}) => {\n // 检测设备类型\n const { isMobile, dragSupported } = useDeviceType();\n \n // 只在支持拖拽的设备上启用拖拽功能\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n isDragging: isDragActive,\n } = useDraggable({\n id: event.id.toString(),\n data: {\n event,\n },\n disabled: !dragSupported, // 移动端禁用拖拽\n });\n\n // 计算拖拽时的样式变换\n const style = transform ? {\n transform: 'translate3d(' + (transform.x) + 'px, ' + (transform.y) + 'px, 0)',\n } : undefined;\n\n // 格式化显示时间\n const displayTime = event.allDay \n ? '全天' \n : (formatTime(new Date(event.startTime))) + ' - ' + (formatTime(new Date(event.endTime)));\n\n // 事件颜色映射\n const getEventColorClasses = (color?: string) => {\n switch (color) {\n case 'red':\n return 'bg-red-100 border-red-300 text-red-800 hover:bg-red-200';\n case 'blue':\n return 'bg-blue-100 border-blue-300 text-blue-800 hover:bg-blue-200';\n case 'green':\n return 'bg-green-100 border-green-300 text-green-800 hover:bg-green-200';\n case 'yellow':\n return 'bg-yellow-100 border-yellow-300 text-yellow-800 hover:bg-yellow-200';\n case 'purple':\n return 'bg-purple-100 border-purple-300 text-purple-800 hover:bg-purple-200';\n case 'pink':\n return 'bg-pink-100 border-pink-300 text-pink-800 hover:bg-pink-200';\n case 'indigo':\n return 'bg-indigo-100 border-indigo-300 text-indigo-800 hover:bg-indigo-200';\n case 'gray':\n return 'bg-gray-100 border-gray-300 text-gray-800 hover:bg-gray-200';\n default:\n return 'bg-blue-100 border-blue-300 text-blue-800 hover:bg-blue-200';\n }\n };\n\n // 优先级指示器\n const getPriorityIndicator = (priority: string) => {\n switch (priority) {\n case 'high':\n return <div className=\"w-2 h-2 bg-red-500 rounded-full flex-shrink-0\" title=\"高优先级\" />;\n case 'medium':\n return <div className=\"w-2 h-2 bg-yellow-500 rounded-full flex-shrink-0\" title=\"中优先级\" />;\n case 'low':\n return <div className=\"w-2 h-2 bg-green-500 rounded-full flex-shrink-0\" title=\"低优先级\" />;\n default:\n return null;\n }\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={clsx('group relative rounded border-l-2 px-1 py-0.5 mb-0.5', dragSupported ? 'cursor-grab active:cursor-grabbing' : 'cursor-pointer', 'transition-all duration-150 ease-in-out text-xs', getEventColorClasses(event.color), isDragActive || isDragging ? 'opacity-60 shadow-md z-[40]' : 'opacity-100', className)}\n // 只在支持拖拽时应用拖拽事件监听器\n {...(dragSupported ? listeners : {})}\n {...(dragSupported ? attributes : {})}\n onClick={onClick}\n >\n {/* 拖拽指示器 - 只在桌面端显示 */}\n {dragSupported && (\n <div className=\"absolute top-1 right-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n <svg \n className=\"w-3 h-3 text-gray-400\" \n fill=\"currentColor\" \n viewBox=\"0 0 20 20\"\n >\n <path d=\"M7 2a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM7 8a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM7 14a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM13 2a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM13 8a2 2 0 1 0 0 4 2 2 0 0 0 0-4zM13 14a2 2 0 1 0 0 4 2 2 0 0 0 0-4z\" />\n </svg>\n </div>\n )}\n\n {/* 移动端操作提示 */}\n {isMobile && (\n <div className=\"absolute top-1 right-1 opacity-70\">\n <svg \n className=\"w-3 h-3 text-gray-500\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\" \n strokeWidth={2} \n d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" \n />\n </svg>\n </div>\n )}\n\n {/* 事件内容 - 紧凑模式 */}\n <div className=\"flex items-center gap-1\">\n {getPriorityIndicator(event.priority)}\n <span className=\"font-medium truncate flex-1\">\n {event.title}\n </span>\n {!event.allDay && (\n <span className=\"text-xs opacity-60 whitespace-nowrap\">\n {formatTime(new Date(event.startTime))}\n </span>\n )}\n </div>\n\n {/* 自定义子内容 */}\n {children}\n\n {/* 拖拽时的反馈效果 */}\n {isDragActive && (\n <div className=\"absolute inset-0 bg-white bg-opacity-20 rounded-lg pointer-events-none\" />\n )}\n </div>\n );\n};\n\nexport default DraggableEvent; ","'use client';\n\nimport React from 'react';\nimport { useDroppable } from '@dnd-kit/core';\nimport { CalendarEvent } from '../types';\nimport { formatDate, isSameDay, isToday } from '../utils/dateUtils';\nimport DraggableEvent from './DraggableEvent';\nimport { clsx } from 'clsx';\n\ninterface DroppableCalendarCellProps {\n date: Date;\n events: CalendarEvent[];\n isCurrentMonth: boolean;\n isSelected?: boolean;\n dragOverPreview?: string | null;\n onEventClick?: (event: CalendarEvent) => void;\n onDateClick?: (date: Date) => void;\n className?: string;\n disableDrop?: boolean;\n}\n\n/**\n * 可放置的日历单元格组件\n * \n * 功能特性:\n * - 支持拖拽事件到此日期\n * - 显示当前日期的所有事件\n * - 拖拽悬停时显示预览\n * - 响应式设计\n */\nexport const DroppableCalendarCell: React.FC<DroppableCalendarCellProps> = ({\n date,\n events,\n isCurrentMonth,\n isSelected = false,\n dragOverPreview,\n onEventClick,\n onDateClick,\n className = '',\n disableDrop = false\n}) => {\n const dateStr = formatDate(date);\n const dropId = 'date-' + (dateStr);\n \n // 只在支持拖拽时启用可放置功能\n const {\n isOver,\n setNodeRef,\n } = useDroppable({\n id: dropId,\n data: {\n date,\n dateStr,\n },\n disabled: disableDrop,\n });\n\n // 调试日志\n if (isOver) {\n console.log('📍 拖拽悬停在单元格:', {\n dropId,\n date: dateStr,\n isCurrentMonth,\n dayOfWeek: date.getDay()\n });\n }\n\n // 获取当前日期的事件\n const dayEvents = events.filter(event => \n isSameDay(new Date(event.startTime), date)\n );\n\n // 样式计算\n const getCellClasses = () => {\n const baseClasses = [\n 'relative w-full h-full p-2',\n 'transition-all duration-200 ease-in-out',\n 'hover:bg-gray-50 cursor-pointer',\n className\n ];\n\n // 当前月份样式\n if (!isCurrentMonth) {\n baseClasses.push('bg-gray-100 text-gray-400');\n }\n\n // 今天的样式\n if (isToday(date)) {\n baseClasses.push('bg-blue-100 ring-2 ring-blue-400 ring-inset');\n }\n\n // 选中日期样式\n if (isSelected) {\n baseClasses.push('ring-2 ring-blue-400 ring-inset');\n }\n\n // 拖拽悬停样式\n if (isOver) {\n baseClasses.push('bg-blue-100 ring-2 ring-blue-300 ring-inset shadow-lg');\n }\n\n return baseClasses.join(' ');\n };\n\n return (\n <div\n ref={disableDrop ? undefined : setNodeRef}\n className={getCellClasses()}\n onClick={() => onDateClick?.(date)}\n >\n {/* 日期数字 */}\n <div className=\"flex items-center justify-between mb-2\">\n <span className={clsx('inline-flex items-center justify-center text-sm font-semibold w-6 h-6', !isCurrentMonth ? 'text-gray-400' : \n (date.getDay() === 0 || date.getDay() === 6) ? 'text-red-600' : 'text-gray-900', isToday(date) ? 'bg-blue-600 text-white rounded-full shadow-md' : '')}>\n {date.getDate()}\n </span>\n \n {/* 事件数量指示器 */}\n {dayEvents.length > 0 && (\n <span className=\"bg-yellow-500 inline-flex items-center justify-center text-sm font-semibold w-6 h-6 border border-white 'bg-blue-600 text-white rounded-full shadow-md\">\n {dayEvents.length}\n </span>\n )}\n </div>\n\n {/* 事件列表 */}\n <div className=\"space-y-1\">\n {dayEvents.slice(0, 3).map((event) => (\n <DraggableEvent\n key={event.id}\n event={event}\n className=\"text-xs\"\n onClick={() => {\n onEventClick?.(event);\n }}\n />\n ))}\n \n {/* 更多事件指示器 */}\n {dayEvents.length > 3 && (\n <div className=\"text-xs text-gray-500 px-2 py-1 bg-gray-100 rounded\">\n +{dayEvents.length - 3} 更多\n </div>\n )}\n </div>\n\n {/* 拖拽预览 */}\n {isOver && dragOverPreview && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-blue-50 bg-opacity-90 rounded-lg border-2 border-dashed border-blue-300\">\n <div className=\"text-center\">\n <div className=\"text-sm font-medium text-blue-600 mb-1\">\n 移动到 {date.getMonth() + 1}/{date.getDate()}\n </div>\n <div className=\"text-xs text-blue-500\">\n {dragOverPreview}\n </div>\n </div>\n </div>\n )}\n\n {/* 新建事件提示 */}\n {isOver && !dragOverPreview && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-green-50 bg-opacity-90 rounded-lg border-2 border-dashed border-green-300\">\n <div className=\"text-center\">\n <div className=\"text-sm font-medium text-green-600\">\n 点击创建事件\n </div>\n <div className=\"text-xs text-green-500\">\n {date.getMonth() + 1}/{date.getDate()}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default DroppableCalendarCell; ","'use client';\n\nimport React, { useState, useMemo } from 'react';\nimport { DndContext, DragOverlay } from '@dnd-kit/core';\nimport { CalendarEvent } from '../types';\nimport { useEventDrag } from '../hooks/useEventDrag';\nimport { useDeviceType } from '../utils/deviceUtils';\nimport { clsx } from 'clsx';\nimport { \n getMonthViewDates, \n formatDate, \n addMonths, \n getMonthName,\n getWeekdayName\n} from '../utils/dateUtils';\nimport DroppableCalendarCell from './DroppableCalendarCell';\nimport DraggableEvent from './DraggableEvent';\n\ninterface DraggableMonthViewProps {\n events: CalendarEvent[];\n currentDate: Date;\n onDateChange: (date: Date) => void;\n onEventClick?: (event: CalendarEvent) => void;\n onDateClick?: (date: Date) => void;\n onEventUpdate: (eventId: number, newStartTime: Date, newEndTime: Date) => Promise<void>;\n className?: string;\n}\n\n/**\n * 支持拖拽的月视图组件\n * \n * 功能特性:\n * - 完整的月视图日历\n * - 事件拖拽功能(桌面端)\n * - 移动端禁用拖拽,优化触摸体验\n * - 拖拽预览和反馈\n * - 月份导航\n * - 响应式设计\n */\nexport const DraggableMonthView: React.FC<DraggableMonthViewProps> = ({\n events,\n currentDate,\n onDateChange,\n onEventClick,\n onDateClick,\n onEventUpdate,\n className = ''\n}) => {\n const [selectedDate, setSelectedDate] = useState<Date | null>(null);\n \n // 检测设备类型\n const { isMobile, dragSupported } = useDeviceType();\n\n // 使用拖拽Hook - 移动端禁用\n const {\n dragState,\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n } = useEventDrag(events, dragSupported ? onEventUpdate : async () => {});\n\n // 获取月份的所有日期\n const monthDays = useMemo(() => {\n const dates = getMonthViewDates(currentDate);\n return dates.map(date => ({\n date,\n isCurrentMonth: date.getMonth() === currentDate.getMonth()\n }));\n }, [currentDate]);\n\n // 周标题 - 基于实际日期生成,确保与日期网格匹配\n const weekDays = useMemo(() => {\n return monthDays.slice(0, 7).map(dayData => \n getWeekdayName(dayData.date, 'zh-CN', 'short')\n );\n }, [monthDays]);\n\n // 月份导航\n const goToPreviousMonth = () => {\n onDateChange(addMonths(currentDate, -1));\n };\n\n const goToNextMonth = () => {\n onDateChange(addMonths(currentDate, 1));\n };\n\n const goToToday = () => {\n onDateChange(new Date());\n };\n\n // 处理日期点击\n const handleDateClick = (date: Date) => {\n setSelectedDate(date);\n onDateClick?.(date);\n };\n\n // 日历内容渲染\n const renderCalendarContent = () => (\n <div className=\"overflow-hidden border border-gray-300 rounded-lg\">\n <table className=\"w-full table-fixed border-collapse\">\n {/* 周标题 */}\n <thead>\n <tr className=\"bg-gradient-to-r from-gray-50 to-gray-100 border-b-2 border-gray-300\">\n {weekDays.map((day, index) => (\n <th \n key={day} \n className={clsx('p-2 sm:p-3 text-center text-sm font-bold border-r border-gray-300 last:border-r-0', index === 5 || index === 6 ? 'text-red-600 bg-red-50' : 'text-gray-800')}\n >\n {day}\n </th>\n ))}\n </tr>\n </thead>\n \n {/* 日历网格 - 按周分组 */}\n <tbody>\n {Array.from({ length: 6 }, (_, weekIndex) => (\n <tr key={weekIndex}>\n {Array.from({ length: 7 }, (_, dayIndex) => {\n const dateIndex = weekIndex * 7 + dayIndex;\n const dayData = monthDays[dateIndex];\n \n if (!dayData) {\n return (\n <td key={dayIndex} className=\"h-24 sm:h-32 border-b border-gray-300 border-r border-gray-300 last:border-r-0 bg-gray-100\"></td>\n );\n }\n \n const isWeekend = dayData.date.getDay() === 0 || dayData.date.getDay() === 6;\n \n return (\n <td\n key={dayIndex}\n className={clsx('h-24 sm:h-32 border-b border-gray-300 border-r border-gray-300 last:border-r-0 relative', isWeekend ? 'bg-red-50' : 'bg-white', 'hover:bg-blue-50 transition-colors')}\n >\n <DroppableCalendarCell\n date={dayData.date}\n events={events}\n isCurrentMonth={dayData.isCurrentMonth}\n isSelected={selectedDate ? formatDate(selectedDate) === formatDate(dayData.date) : false}\n dragOverPreview={dragSupported ? dragState.previewTime : null}\n onEventClick={onEventClick}\n onDateClick={handleDateClick}\n className=\"h-full border-0\"\n disableDrop={!dragSupported} // 移动端禁用放置\n />\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n\n return (\n <div className={clsx('bg-white rounded-lg shadow-sm', className)}>\n {/* 月份标题和导航 */}\n <div className=\"flex items-center justify-between p-4 border-b\">\n <div className=\"flex items-center space-x-4\">\n <h2 className=\"text-lg sm:text-xl font-semibold text-gray-900\">\n {currentDate.getFullYear()}年{getMonthName(currentDate)}\n </h2>\n <button\n onClick={goToToday}\n className=\"px-3 py-1 text-sm bg-blue-100 text-blue-600 rounded hover:bg-blue-200 transition-colors\"\n >\n 今天\n </button>\n {/* 移动端提示 */}\n {isMobile && (\n <span className=\"text-xs text-gray-500 bg-gray-100 px-2 py-1 rounded\">\n 点击事件编辑\n </span>\n )}\n </div>\n \n <div className=\"flex items-center space-x-2\">\n <button\n onClick={goToPreviousMonth}\n className=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\"\n title=\"上个月\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <button\n onClick={goToNextMonth}\n className=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\"\n title=\"下个月\"\n >\n <svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* 日历内容 - 桌面端支持拖拽,移动端仅显示 */}\n {dragSupported ? (\n <DndContext\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n >\n {renderCalendarContent()}\n\n {/* 拖拽覆盖层 */}\n <DragOverlay>\n {dragState.isDragging && dragState.draggedEvent && (\n <div className=\"transform rotate-1 scale-105 pointer-events-none\">\n <DraggableEvent\n event={dragState.draggedEvent}\n isDragging={true}\n className=\"shadow-lg border border-blue-400 bg-opacity-90\"\n />\n </div>\n )}\n </DragOverlay>\n </DndContext>\n ) : (\n renderCalendarContent()\n )}\n\n {/* 拖拽状态指示器 - 仅桌面端 */}\n {dragSupported && dragState.isDragging && (\n <div className=\"fixed bottom-4 right-4 bg-blue-600 text-white px-4 py-2 rounded-lg shadow-lg z-[50]\">\n <div className=\"flex items-center space-x-2\">\n <svg className=\"w-4 h-4 animate-pulse\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M10 12a2 2 0 100-4 2 2 0 000 4z\" />\n <path fillRule=\"evenodd\" d=\"M.458 10C1.732 5.943 5.522 3 10 3s8.268 2.943 9.542 7c-1.274 4.057-5.064 7-9.542 7S1.732 14.057.458 10zM14 10a4 4 0 11-8 0 4 4 0 018 0z\" clipRule=\"evenodd\" />\n </svg>\n <span className=\"text-sm\">\n 拖拽 \"{dragState.draggedEvent?.title}\" 到目标日期\n </span>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default DraggableMonthView; ","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { EventFormData, EventColor, EventPriority, RecurrenceType } from '../types';\nimport { clsx } from 'clsx';\n\ninterface EventFormProps {\n /** 初始事件数据(编辑模式) */\n initialData?: Partial<EventFormData>;\n /** 是否为编辑模式 */\n isEdit?: boolean;\n /** 表单提交回调 */\n onSubmit: (data: EventFormData) => void;\n /** 取消回调 */\n onCancel: () => void;\n /** 是否正在加载 */\n loading?: boolean;\n}\n\n/**\n * 事件表单组件\n * \n * 用于创建和编辑日历事件的表单组件\n * 支持基本信息、重复规则、提醒设置等功能\n */\nexport default function EventForm({\n initialData,\n isEdit = false,\n onSubmit,\n onCancel,\n loading = false\n}: EventFormProps) {\n // 表单状态\n const [formData, setFormData] = useState<EventFormData>({\n title: '',\n description: '',\n startTime: new Date(),\n endTime: new Date(Date.now() + 60 * 60 * 1000), // 默认1小时后\n allDay: false,\n location: '',\n color: EventColor.BLUE,\n priority: EventPriority.NORMAL,\n recurrence: undefined,\n reminders: []\n });\n\n // 表单验证错误\n const [errors, setErrors] = useState<Record<string, string>>({});\n\n // 初始化表单数据\n useEffect(() => {\n if (initialData) {\n setFormData(prev => ({\n ...prev,\n ...initialData,\n startTime: initialData.startTime || prev.startTime,\n endTime: initialData.endTime || prev.endTime\n }));\n }\n }, [initialData]);\n\n // 处理输入变化\n const handleInputChange = (field: keyof EventFormData, value: any) => {\n setFormData(prev => ({\n ...prev,\n [field]: value\n }));\n\n // 清除对应字段的错误\n if (errors[field]) {\n setErrors(prev => {\n const newErrors = { ...prev };\n delete newErrors[field];\n return newErrors;\n });\n }\n };\n\n // 表单验证\n const validateForm = (): boolean => {\n const newErrors: Record<string, string> = {};\n\n if (!formData.title.trim()) {\n newErrors.title = '事件标题不能为空';\n }\n\n if (formData.startTime >= formData.endTime) {\n newErrors.endTime = '结束时间必须晚于开始时间';\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n // 处理表单提交\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n \n if (validateForm()) {\n onSubmit(formData);\n }\n };\n\n // 格式化日期时间为本地输入格式\n const formatDateTimeLocal = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n \n return (year) + '-' + (month) + '-' + (day) + 'T' + (hours) + ':' + (minutes);\n };\n\n // 解析本地日期时间\n const parseDateTimeLocal = (value: string): Date => {\n return new Date(value);\n };\n\n // 颜色选项\n const colorOptions = [\n { value: EventColor.BLUE, label: '蓝色', class: 'bg-blue-500' },\n { value: EventColor.GREEN, label: '绿色', class: 'bg-green-500' },\n { value: EventColor.RED, label: '红色', class: 'bg-red-500' },\n { value: EventColor.PURPLE, label: '紫色', class: 'bg-purple-500' },\n { value: EventColor.YELLOW, label: '黄色', class: 'bg-yellow-500' },\n { value: EventColor.PINK, label: '粉色', class: 'bg-pink-500' },\n { value: EventColor.INDIGO, label: '靛蓝', class: 'bg-indigo-500' },\n { value: EventColor.GRAY, label: '灰色', class: 'bg-gray-500' }\n ];\n\n return (\n <div className=\"bg-white rounded-lg shadow-lg p-6 max-w-2xl mx-auto\">\n <div className=\"flex items-center justify-between mb-6\">\n <h2 className=\"text-xl font-semibold text-gray-900\">\n {isEdit ? '编辑事件' : '创建事件'}\n </h2>\n <button\n onClick={onCancel}\n className=\"text-gray-400 hover:text-gray-600 transition-colors\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n {/* 基本信息 */}\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-medium text-gray-900\">基本信息</h3>\n \n {/* 标题 */}\n <div>\n <label htmlFor=\"title\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 事件标题 *\n </label>\n <input\n type=\"text\"\n id=\"title\"\n value={formData.title}\n onChange={(e) => handleInputChange('title', e.target.value)}\n className={clsx('w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500', errors.title ? 'border-red-300' : 'border-gray-300')}\n placeholder=\"请输入事件标题\"\n />\n {errors.title && (\n <p className=\"mt-1 text-sm text-red-600\">{errors.title}</p>\n )}\n </div>\n\n {/* 描述 */}\n <div>\n <label htmlFor=\"description\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 事件描述\n </label>\n <textarea\n id=\"description\"\n rows={3}\n value={formData.description}\n onChange={(e) => handleInputChange('description', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"请输入事件描述(可选)\"\n />\n </div>\n\n {/* 地点 */}\n <div>\n <label htmlFor=\"location\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 地点\n </label>\n <input\n type=\"text\"\n id=\"location\"\n value={formData.location}\n onChange={(e) => handleInputChange('location', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"请输入事件地点(可选)\"\n />\n </div>\n </div>\n\n {/* 时间设置 */}\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-medium text-gray-900\">时间设置</h3>\n \n {/* 全天事件 */}\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"allDay\"\n checked={formData.allDay}\n onChange={(e) => handleInputChange('allDay', e.target.checked)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <label htmlFor=\"allDay\" className=\"ml-2 text-sm text-gray-700\">\n 全天事件\n </label>\n </div>\n\n {/* 开始时间 */}\n <div>\n <label htmlFor=\"startTime\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 开始时间 *\n </label>\n <input\n type={formData.allDay ? 'date' : 'datetime-local'}\n id=\"startTime\"\n value={formData.allDay \n ? formData.startTime.toISOString().split('T')[0]\n : formatDateTimeLocal(formData.startTime)\n }\n onChange={(e) => {\n const newDate = formData.allDay \n ? new Date(e.target.value + 'T00:00:00')\n : parseDateTimeLocal(e.target.value);\n handleInputChange('startTime', newDate);\n }}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n\n {/* 结束时间 */}\n <div>\n <label htmlFor=\"endTime\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 结束时间 *\n </label>\n <input\n type={formData.allDay ? 'date' : 'datetime-local'}\n id=\"endTime\"\n value={formData.allDay \n ? formData.endTime.toISOString().split('T')[0]\n : formatDateTimeLocal(formData.endTime)\n }\n onChange={(e) => {\n const newDate = formData.allDay \n ? new Date(e.target.value + 'T23:59:59')\n : parseDateTimeLocal(e.target.value);\n handleInputChange('endTime', newDate);\n }}\n className={clsx('w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500', errors.endTime ? 'border-red-300' : 'border-gray-300')}\n />\n {errors.endTime && (\n <p className=\"mt-1 text-sm text-red-600\">{errors.endTime}</p>\n )}\n </div>\n </div>\n\n {/* 颜色选择 */}\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-medium text-gray-900\">外观</h3>\n \n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 事件颜色\n </label>\n <div className=\"flex flex-wrap gap-3\">\n {colorOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => handleInputChange('color', option.value)}\n className={clsx('flex items-center px-3 py-2 rounded-lg border-2 transition-all', formData.color === option.value \n ? 'border-blue-500 ring-2 ring-blue-200' \n : 'border-gray-200 hover:border-gray-300')}\n >\n <div className={clsx('w-4 h-4 rounded-full', option.class, 'mr-2')} />\n <span className=\"text-sm text-gray-700\">{option.label}</span>\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* 提交按钮 */}\n <div className=\"flex items-center justify-end gap-3 pt-6 border-t border-gray-200\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n >\n 取消\n </button>\n <button\n type=\"submit\"\n disabled={loading}\n className=\"px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-lg hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {loading ? '保存中...' : (isEdit ? '更新事件' : '创建事件')}\n </button>\n </div>\n </form>\n </div>\n );\n} ","import React from 'react';\nimport { clsx } from 'clsx';\n\ninterface SearchBoxProps {\n searchQuery: string;\n onSearchChange: (query: string) => void;\n placeholder?: string;\n size?: 'small' | 'medium' | 'large';\n}\n\nexport const SearchBox: React.FC<SearchBoxProps> = ({ \n searchQuery, \n onSearchChange, \n placeholder = \"搜索实验项目的标题、描述或标签...\",\n size = 'large'\n}) => {\n // 根据尺寸获取样式\n const getSizeStyles = () => {\n switch (size) {\n case 'small':\n return {\n container: 'h-10',\n input: 'pl-10 pr-10 text-sm',\n icon: 'w-4 h-4',\n iconPosition: 'left-3',\n clearButton: 'right-2 w-6 h-6',\n clearIcon: 'w-3 h-3'\n };\n case 'medium':\n return {\n container: 'h-12',\n input: 'pl-12 pr-12 text-base',\n icon: 'w-5 h-5',\n iconPosition: 'left-3',\n clearButton: 'right-3 w-7 h-7',\n clearIcon: 'w-4 h-4'\n };\n case 'large':\n default:\n return {\n container: 'h-16',\n input: 'pl-6 pr-16 text-lg',\n icon: 'w-6 h-6',\n iconPosition: 'left-6',\n clearButton: 'right-4 w-8 h-8',\n clearIcon: 'w-4 h-4'\n };\n }\n };\n\n const styles = getSizeStyles();\n const isLarge = size === 'large';\n\n return (\n <div className=\"relative group w-full\">\n {/* 搜索输入框 */}\n <input\n type=\"text\"\n placeholder={placeholder}\n value={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n className={clsx(\n 'w-full',\n styles.container,\n styles.input,\n isLarge ? 'border-2 border-gray-200 rounded-2xl shadow-lg' : 'border border-gray-300 rounded-lg shadow-sm',\n 'bg-white focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 hover:border-gray-400',\n isLarge ? 'hover:shadow-xl' : 'hover:shadow-md',\n 'transition-all duration-300 ease-out text-gray-800 placeholder-gray-500',\n isLarge ? 'font-medium' : 'font-normal'\n )}\n />\n\n {/* 清除按钮 */}\n {searchQuery && (\n <button\n onClick={() => onSearchChange('')}\n className={clsx(\n 'absolute top-1/2',\n styles.clearButton,\n 'transform -translate-y-1/2 z-10 group/clear'\n )}\n >\n <div className={clsx(\n styles.clearButton,\n 'flex items-center justify-center rounded-full bg-gray-100 hover:bg-gray-200 transition-all duration-200 group-hover/clear:scale-105'\n )}>\n <svg \n className={clsx(styles.clearIcon, 'text-gray-500 group-hover/clear:text-gray-700')}\n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\" \n strokeWidth={2} \n d=\"M6 18L18 6M6 6l12 12\" \n />\n </svg>\n </div>\n </button>\n )}\n </div>\n );\n}","import type { LoggerAdapter, LogEntry, LogLevel } from './types';\n\n/**\n * 控制台日志适配器\n * 使用 console.info/warn/error 输出日志\n */\nexport class ConsoleLoggerAdapter implements LoggerAdapter {\n private readonly colors = {\n DEBUG: '\\x1b[36m', // Cyan\n INFO: '\\x1b[32m', // Green\n WARN: '\\x1b[33m', // Yellow\n ERROR: '\\x1b[31m', // Red\n RESET: '\\x1b[0m',\n };\n\n log(entry: LogEntry): void {\n const { level, message, timestamp, data, context, error } = entry;\n\n // 构建日志消息\n let logMessage = '';\n\n // 添加时间戳\n if (timestamp) {\n logMessage += '[' + (this.formatTimestamp(timestamp)) + '] ';\n }\n\n // 添加日志级别\n const levelName = this.getLevelName(level);\n logMessage += (levelName) + ': ';\n\n // 添加上下文\n if (context) {\n logMessage += '[' + (context) + '] ';\n }\n\n // 添加消息\n logMessage += message;\n\n // 根据日志级别选择输出方式\n switch (level) {\n case 0: // DEBUG\n console.debug(this.colorize(logMessage, 'DEBUG'), data || '');\n break;\n case 1: // INFO\n console.info(this.colorize(logMessage, 'INFO'), data || '');\n break;\n case 2: // WARN\n console.warn(this.colorize(logMessage, 'WARN'), data || '');\n break;\n case 3: // ERROR\n console.error(this.colorize(logMessage, 'ERROR'), data || '');\n if (error) {\n console.error(error);\n }\n break;\n }\n }\n\n private formatTimestamp(date: Date): string {\n return date.toISOString();\n }\n\n private getLevelName(level: LogLevel): string {\n const names = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'NONE'];\n return names[level] || 'UNKNOWN';\n }\n\n private colorize(message: string, level: keyof typeof this.colors): string {\n // 只在支持颜色的环境中使用颜色\n if (typeof process !== 'undefined' && process.stdout?.isTTY) {\n return (this.colors[level]) + (message) + (this.colors.RESET);\n }\n return message;\n }\n}\n\n","import type { LogLevel, LogEntry, LoggerConfig, LoggerAdapter } from './types';\nimport { ConsoleLoggerAdapter } from './console-adapter';\n\n/**\n * 统一日志管理类\n */\nexport class Logger {\n private config: Required<LoggerConfig>;\n private adapter: LoggerAdapter;\n private context?: string;\n\n constructor(config?: Partial<LoggerConfig>, context?: string) {\n const isProduction =\n typeof process !== 'undefined' ? process.env.NODE_ENV === 'production' : false;\n\n this.config = {\n minLevel: config?.minLevel ?? (isProduction ? 1 : 0), // INFO in prod, DEBUG in dev\n enableTimestamp: config?.enableTimestamp ?? true,\n enableContext: config?.enableContext ?? true,\n environment: config?.environment ?? (isProduction ? 'production' : 'development'),\n adapter: config?.adapter ?? new ConsoleLoggerAdapter(),\n };\n this.adapter = this.config.adapter;\n this.context = context;\n }\n\n /**\n * 创建带上下文的子 Logger\n */\n createChild(context: string): Logger {\n return new Logger(this.config, context);\n }\n\n /**\n * 调试日志\n */\n debug(message: string, data?: any): void {\n this.log(0, message, data); // LogLevel.DEBUG\n }\n\n /**\n * 信息日志\n */\n info(message: string, data?: any): void {\n this.log(1, message, data); // LogLevel.INFO\n }\n\n /**\n * 警告日志\n */\n warn(message: string, data?: any): void {\n this.log(2, message, data); // LogLevel.WARN\n }\n\n /**\n * 错误日志\n */\n error(message: string, error?: Error | any): void {\n this.log(\n 3, // LogLevel.ERROR\n message,\n error instanceof Error ? undefined : error,\n error instanceof Error ? error : undefined\n );\n }\n\n /**\n * 核心日志方法\n */\n private log(level: LogLevel, message: string, data?: any, error?: Error): void {\n // 检查日志级别\n if (level < this.config.minLevel) {\n return;\n }\n\n // 检查动态调试配置(仅在浏览器环境)\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n const loggerDebug = localStorage.getItem('logger-debug');\n // 如果明确设置为 false,则不输出(但 Error 级别始终输出)\n if (loggerDebug === 'false' && level < 3) {\n // level < ERROR\n return;\n }\n }\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: this.config.enableTimestamp ? new Date() : (undefined as any),\n data,\n context: this.config.enableContext ? this.context : undefined,\n error,\n };\n\n this.adapter.log(entry);\n }\n\n /**\n * 设置日志级别\n */\n setLevel(level: LogLevel): void {\n this.config.minLevel = level;\n }\n\n /**\n * 获取当前日志级别\n */\n getLevel(): LogLevel {\n return this.config.minLevel;\n }\n}\n\n/**\n * 默认全局 Logger 实例\n */\nexport const logger = new Logger();\n\n/**\n * 创建带上下文的 Logger\n */\nexport function createLogger(context: string, config?: Partial<LoggerConfig>): Logger {\n return new Logger(config, context);\n}\n\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n","import * as React from \"react\"\nimport { cva } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', asChild = false, children, ...props }, ref) => {\n if (asChild && React.isValidElement(children)) {\n const childProps = children.props as { className?: string }\n return React.cloneElement(children, {\n ...(props as object),\n className: cn(buttonVariants({ variant, size, className }), childProps.className),\n })\n }\n\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n >\n {children}\n </button>\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-xl border bg-card text-card-foreground shadow\",\n className\n )}\n {...(props as any)}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...(props as any)}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...(props as any)}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...(props as any)} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...(props as any)}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...(props as any)} />\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...(props as any)}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n HTMLLabelElement,\n React.LabelHTMLAttributes<HTMLLabelElement> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <label\n ref={ref}\n className={cn(labelVariants(), className)}\n {...(props as any)}\n />\n))\nLabel.displayName = \"Label\"\n\nexport { Label }\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: {\n value?: T;\n defaultValue: T;\n onChange?: (next: T) => void;\n}) {\n const [internal, setInternal] = React.useState<T>(defaultValue);\n const isControlled = value !== undefined;\n const state = isControlled ? (value as T) : internal;\n\n const setState = React.useCallback(\n (next: T) => {\n if (!isControlled) setInternal(next);\n onChange?.(next);\n },\n [isControlled, onChange]\n );\n\n return [state, setState] as const;\n}\n\nexport function Portal({\n children,\n container,\n}: {\n children: React.ReactNode;\n container?: Element | null;\n}) {\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!mounted) return null;\n return createPortal(children, container ?? document.body);\n}\n\nexport function useOnClickOutside(\n refs: Array<React.RefObject<HTMLElement | null>>,\n handler: (event: MouseEvent | TouchEvent) => void,\n enabled: boolean\n) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const listener = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n const clickedInside = refs.some((ref) => {\n const el = ref.current;\n return el && el.contains(target);\n });\n if (!clickedInside) {\n handler(event);\n }\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [refs, handler, enabled]);\n}\n\nexport function mergeRefs<T>(\n ...refs: Array<React.Ref<T> | undefined>\n): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (!ref) return;\n if (typeof ref === \"function\") {\n ref(value);\n } else {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\nimport { useControllableState } from \"./internal/ui-core\"\n\ninterface TabsContextValue {\n value: string\n setValue: (next: string) => void\n}\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null)\n\ninterface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n}\n\nconst Tabs = ({\n value,\n defaultValue = \"\",\n onValueChange,\n className,\n ...props\n}: TabsProps) => {\n const [current, setCurrent] = useControllableState({\n value,\n defaultValue,\n onChange: onValueChange,\n })\n\n return (\n <TabsContext.Provider value={{ value: current, setValue: setCurrent }}>\n <div className={className} {...(props as any)} />\n </TabsContext.Provider>\n )\n}\n\nconst TabsList = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground\",\n className\n )}\n {...(props as any)}\n />\n))\nTabsList.displayName = \"TabsList\"\n\ninterface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nconst TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n ({ className, value, onClick, ...props }, ref) => {\n const ctx = React.useContext(TabsContext)\n const active = ctx?.value === value\n\n return (\n <button\n ref={ref}\n type=\"button\"\n data-state={active ? \"active\" : \"inactive\"}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active && \"bg-background text-foreground shadow\",\n className\n )}\n onClick={(e) => {\n ctx?.setValue(value)\n onClick?.(e)\n }}\n {...(props as any)}\n />\n )\n }\n)\nTabsTrigger.displayName = \"TabsTrigger\"\n\ninterface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n forceMount?: boolean\n}\n\nconst TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, value, forceMount = false, ...props }, ref) => {\n const ctx = React.useContext(TabsContext)\n const active = ctx?.value === value\n if (!active && !forceMount) return null\n\n return (\n <div\n ref={ref}\n data-state={active ? \"active\" : \"inactive\"}\n hidden={!active && forceMount}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n {...(props as any)}\n />\n )\n }\n)\nTabsContent.displayName = \"TabsContent\"\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface DialogContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n contentRef: React.RefObject<HTMLDivElement>\n}\n\nconst DialogContext = React.createContext<DialogContextValue | null>(null)\n\ninterface DialogProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children: React.ReactNode\n}\n\nconst Dialog = ({ open, defaultOpen = false, onOpenChange, children }: DialogProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n\n return (\n <DialogContext.Provider value={{ open: isOpen, setOpen: setIsOpen, triggerRef, contentRef }}>\n {children}\n </DialogContext.Provider>\n )\n}\n\ninterface TriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n children: React.ReactNode\n}\n\nconst DialogTrigger = React.forwardRef<HTMLButtonElement, TriggerProps>(\n ({ children, onClick, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx) return null\n\n const mergedRef = mergeRefs<HTMLButtonElement>(ctx.triggerRef, ref)\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.setOpen(true)\n onClick?.(e)\n }\n\n return (\n <button ref={mergedRef} type=\"button\" onClick={handleClick} {...(props as any)}>\n {children}\n </button>\n )\n }\n)\nDialogTrigger.displayName = \"DialogTrigger\"\n\nconst DialogPortal = ({ children }: { children: React.ReactNode }) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx?.open) return null\n return <Portal>{children}</Portal>\n}\n\nconst DialogClose = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ onClick, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={(e) => {\n ctx?.setOpen(false)\n onClick?.(e)\n }}\n {...(props as any)}\n />\n )\n})\nDialogClose.displayName = \"DialogClose\"\n\nconst DialogOverlay = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx?.open) return null\n return (\n <div\n ref={ref}\n className={cn(\"fixed inset-0 z-[9999] bg-black/80\", className)}\n {...(props as any)}\n />\n )\n})\nDialogOverlay.displayName = \"DialogOverlay\"\n\nexport interface DialogContentProps extends React.HTMLAttributes<HTMLDivElement> {\n onPointerDownOutside?: (event: PointerEvent) => void\n onEscapeKeyDown?: (event: KeyboardEvent) => void\n showCloseButton?: boolean\n overlayClassName?: string\n}\n\nconst DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps>(\n ({ className, children, onPointerDownOutside, onEscapeKeyDown, showCloseButton = true, overlayClassName, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n const open = !!ctx?.open\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n (evt) => {\n onPointerDownOutside?.(evt as PointerEvent)\n if (!(evt as Event).defaultPrevented) {\n ctx?.setOpen(false)\n }\n },\n open\n )\n\n React.useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return\n onEscapeKeyDown?.(e)\n if (!e.defaultPrevented) {\n ctx?.setOpen(false)\n }\n }\n document.addEventListener(\"keydown\", onKey)\n return () => document.removeEventListener(\"keydown\", onKey)\n }, [ctx, onEscapeKeyDown, open])\n\n if (!ctx || !open) return null\n\n return (\n <DialogPortal>\n <DialogOverlay className={overlayClassName} />\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"fixed left-[50%] top-[50%] z-[10000] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg sm:rounded-lg\",\n className\n )}\n {...(props as any)}\n >\n {children}\n {showCloseButton ? (\n <DialogClose className=\"absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogClose>\n ) : null}\n </div>\n </DialogPortal>\n )\n }\n)\nDialogContent.displayName = \"DialogContent\"\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...(props as any)}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...(props as any)}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h2\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...(props as any)}\n />\n))\nDialogTitle.displayName = \"DialogTitle\"\n\nconst DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nDialogDescription.displayName = \"DialogDescription\"\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\nimport { buttonVariants } from \"./Button\"\nimport {\n Dialog as AlertDialog,\n DialogPortal as AlertDialogPortal,\n DialogOverlay as AlertDialogOverlay,\n DialogTrigger as AlertDialogTrigger,\n DialogContent as AlertDialogContentBase,\n DialogHeader as AlertDialogHeader,\n DialogFooter as AlertDialogFooter,\n DialogTitle as AlertDialogTitle,\n DialogDescription as AlertDialogDescription,\n DialogClose,\n} from \"./Dialog\"\n\nconst AlertDialogContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<typeof AlertDialogContentBase>\n>(({ className, ...props }, ref) => (\n <AlertDialogContentBase\n ref={ref}\n className={cn(\"z-[9999]\", className)}\n {...(props as any)}\n />\n))\nAlertDialogContent.displayName = \"AlertDialogContent\"\n\nconst AlertDialogAction = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ className, ...props }, ref) => (\n <DialogClose\n ref={ref}\n className={cn(buttonVariants(), className)}\n {...(props as any)}\n />\n))\nAlertDialogAction.displayName = \"AlertDialogAction\"\n\nconst AlertDialogCancel = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ className, ...props }, ref) => (\n <DialogClose\n ref={ref}\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className\n )}\n {...(props as any)}\n />\n))\nAlertDialogCancel.displayName = \"AlertDialogCancel\"\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface DropdownMenuContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n contentRef: React.RefObject<HTMLDivElement>\n}\n\nconst DropdownMenuContext = React.createContext<DropdownMenuContextValue | null>(null)\nconst DropdownMenuRadioGroupContext = React.createContext<{\n value?: string\n onValueChange?: (value: string) => void\n} | null>(null)\n\ninterface DropdownMenuProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children: React.ReactNode\n}\n\nconst DropdownMenu = ({ open, defaultOpen = false, onOpenChange, children }: DropdownMenuProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n\n return (\n <DropdownMenuContext.Provider value={{ open: isOpen, setOpen: setIsOpen, triggerRef, contentRef }}>\n {children}\n </DropdownMenuContext.Provider>\n )\n}\n\nconst DropdownMenuTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & { asChild?: boolean; children: React.ReactNode }\n>(({ children, onClick, ...props }, ref) => {\n const ctx = React.useContext(DropdownMenuContext)\n if (!ctx) return null\n\n const mergedRef = mergeRefs<HTMLButtonElement>(ctx.triggerRef, ref)\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.setOpen(!ctx.open)\n onClick?.(e)\n }\n\n return (\n <button ref={mergedRef} type=\"button\" onClick={handleClick} {...(props as any)}>\n {children}\n </button>\n )\n})\nDropdownMenuTrigger.displayName = \"DropdownMenuTrigger\"\n\nconst DropdownMenuGroup = ({ children }: { children: React.ReactNode }) => <>{children}</>\nconst DropdownMenuPortal = ({ children }: { children: React.ReactNode }) => <Portal>{children}</Portal>\nconst DropdownMenuSub = ({ children }: { children: React.ReactNode }) => <>{children}</>\n\nconst DropdownMenuContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { sideOffset?: number }\n>(({ className, sideOffset = 4, style, ...props }, ref) => {\n const ctx = React.useContext(DropdownMenuContext)\n const [pos, setPos] = React.useState({ top: 0, left: 0 })\n const open = !!ctx?.open\n const trigger = ctx?.triggerRef.current ?? null\n\n React.useLayoutEffect(() => {\n if (!trigger) return\n const rect = trigger.getBoundingClientRect()\n setPos({ top: rect.bottom + sideOffset, left: rect.left })\n }, [trigger, sideOffset])\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n () => ctx?.setOpen(false),\n open\n )\n\n if (!ctx || !open || !trigger) return null\n\n return (\n <DropdownMenuPortal>\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\",\n className\n )}\n style={{ position: \"fixed\", top: pos.top, left: pos.left, ...style }}\n {...(props as any)}\n />\n </DropdownMenuPortal>\n )\n})\nDropdownMenuContent.displayName = \"DropdownMenuContent\"\n\ntype SelectEventLike = Event & { preventDefault: () => void; defaultPrevented: boolean }\n\nconst DropdownMenuItem = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & {\n inset?: boolean\n onSelect?: (event: SelectEventLike) => void\n }\n>(({ className, inset, onSelect, onClick, ...props }, ref) => {\n const ctx = React.useContext(DropdownMenuContext)\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\",\n inset && \"pl-8\",\n className\n )}\n onClick={(e) => {\n onSelect?.(e.nativeEvent as SelectEventLike)\n onClick?.(e)\n if (!e.isDefaultPrevented()) {\n ctx?.setOpen(false)\n }\n }}\n {...(props as any)}\n />\n )\n})\nDropdownMenuItem.displayName = \"DropdownMenuItem\"\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & {\n checked?: boolean\n onCheckedChange?: (checked: boolean) => void\n }\n>(({ className, children, checked = false, onCheckedChange, onClick, ...props }, ref) => (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n onClick={(e) => {\n onCheckedChange?.(!checked)\n onClick?.(e)\n }}\n {...(props as any)}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {checked ? <Check className=\"h-4 w-4\" /> : null}\n </span>\n {children}\n </button>\n))\nDropdownMenuCheckboxItem.displayName = \"DropdownMenuCheckboxItem\"\n\nconst DropdownMenuRadioGroup = ({\n value,\n onValueChange,\n children,\n}: {\n value?: string\n onValueChange?: (value: string) => void\n children: React.ReactNode\n}) => (\n <DropdownMenuRadioGroupContext.Provider value={{ value, onValueChange }}>\n {children}\n </DropdownMenuRadioGroupContext.Provider>\n)\n\nconst DropdownMenuRadioItem = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & { value: string }\n>(({ className, children, value, onClick, ...props }, ref) => {\n const radioCtx = React.useContext(DropdownMenuRadioGroupContext)\n const menuCtx = React.useContext(DropdownMenuContext)\n const checked = radioCtx?.value === value\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n onClick={(e) => {\n radioCtx?.onValueChange?.(value)\n onClick?.(e)\n menuCtx?.setOpen(false)\n }}\n {...(props as any)}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {checked ? <Circle className=\"h-2 w-2 fill-current\" /> : null}\n </span>\n {children}\n </button>\n )\n})\nDropdownMenuRadioItem.displayName = \"DropdownMenuRadioItem\"\n\nconst DropdownMenuLabel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", inset && \"pl-8\", className)}\n {...(props as any)}\n />\n))\nDropdownMenuLabel.displayName = \"DropdownMenuLabel\"\n\nconst DropdownMenuSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...(props as any)}\n />\n))\nDropdownMenuSeparator.displayName = \"DropdownMenuSeparator\"\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...(props as any)}\n />\n)\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & { inset?: boolean }\n>(({ className, inset, children, ...props }, ref) => (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none hover:bg-accent\",\n inset && \"pl-8\",\n className\n )}\n {...(props as any)}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </button>\n))\nDropdownMenuSubTrigger.displayName = \"DropdownMenuSubTrigger\"\n\nconst DropdownMenuSubContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg\",\n className\n )}\n {...(props as any)}\n />\n))\nDropdownMenuSubContent.displayName = \"DropdownMenuSubContent\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface PopoverContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n anchorRef: React.RefObject<HTMLSpanElement>\n contentRef: React.RefObject<HTMLDivElement>\n}\n\nconst PopoverContext = React.createContext<PopoverContextValue | null>(null)\n\ninterface PopoverProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children: React.ReactNode\n}\n\nconst Popover = ({ open, defaultOpen = false, onOpenChange, children }: PopoverProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const anchorRef = React.useRef<HTMLSpanElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n\n return (\n <PopoverContext.Provider value={{ open: isOpen, setOpen: setIsOpen, triggerRef, anchorRef, contentRef }}>\n {children}\n </PopoverContext.Provider>\n )\n}\n\ninterface PopoverTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n children: React.ReactNode\n}\n\nconst PopoverTrigger = React.forwardRef<HTMLButtonElement, PopoverTriggerProps>(\n ({ children, onClick, ...props }, ref) => {\n const ctx = React.useContext(PopoverContext)\n if (!ctx) return null\n\n const mergedRef = mergeRefs<HTMLButtonElement>(ctx.triggerRef, ref)\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.setOpen(!ctx.open)\n onClick?.(e)\n }\n\n return (\n <button ref={mergedRef} type=\"button\" onClick={handleClick} {...(props as any)}>\n {children}\n </button>\n )\n }\n)\nPopoverTrigger.displayName = \"PopoverTrigger\"\n\nconst PopoverAnchor = React.forwardRef<HTMLSpanElement, React.HTMLAttributes<HTMLSpanElement>>(\n ({ ...props }, ref) => {\n const ctx = React.useContext(PopoverContext)\n if (!ctx) return null\n\n return (\n <span ref={mergeRefs(ctx.anchorRef, ref)} {...(props as any)} />\n )\n }\n)\nPopoverAnchor.displayName = \"PopoverAnchor\"\n\ninterface PopoverContentProps extends React.HTMLAttributes<HTMLDivElement> {\n align?: \"start\" | \"center\" | \"end\"\n sideOffset?: number\n}\n\nconst PopoverContent = React.forwardRef<HTMLDivElement, PopoverContentProps>(\n ({ className, align = \"center\", sideOffset = 4, style, ...props }, ref) => {\n const ctx = React.useContext(PopoverContext)\n const [position, setPosition] = React.useState({ top: 0, left: 0 })\n const open = !!ctx?.open\n const anchor = ctx?.anchorRef.current ?? ctx?.triggerRef.current ?? null\n\n React.useLayoutEffect(() => {\n if (!anchor) return\n const rect = anchor.getBoundingClientRect()\n let left = rect.left + rect.width / 2\n if (align === \"start\") left = rect.left\n if (align === \"end\") left = rect.right\n setPosition({ top: rect.bottom + sideOffset, left })\n }, [anchor, align, sideOffset])\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n () => ctx?.setOpen(false),\n open\n )\n\n if (!ctx || !open) return null\n\n return (\n <Portal>\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none\",\n className\n )}\n style={{\n position: \"fixed\",\n top: position.top,\n left: position.left,\n transform: align === \"center\" ? \"translateX(-50%)\" : align === \"end\" ? \"translateX(-100%)\" : undefined,\n ...style,\n }}\n {...(props as any)}\n />\n </Portal>\n )\n }\n)\nPopoverContent.displayName = \"PopoverContent\"\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: number\n max?: number\n}\n\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n ({ className, value = 0, max = 100, ...props }, ref) => {\n const safeMax = max <= 0 ? 100 : max\n const safeValue = Math.max(0, Math.min(value, safeMax))\n const percent = (safeValue / safeMax) * 100\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={safeMax}\n aria-valuenow={safeValue}\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-full bg-primary/20\",\n className\n )}\n {...(props as any)}\n >\n <div\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - percent}%)` }}\n />\n </div>\n )\n }\n)\nProgress.displayName = \"Progress\"\n\nexport { Progress }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst ScrollArea = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"relative overflow-auto\", className)}\n {...(props as any)}\n >\n {children}\n </div>\n))\nScrollArea.displayName = \"ScrollArea\"\n\ninterface ScrollBarProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"vertical\" | \"horizontal\"\n}\n\nconst ScrollBar = React.forwardRef<HTMLDivElement, ScrollBarProps>(\n ({ className, orientation = \"vertical\", ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"pointer-events-none absolute\",\n orientation === \"vertical\"\n ? \"right-0 top-0 h-full w-2.5\"\n : \"bottom-0 left-0 h-2.5 w-full\",\n className\n )}\n {...(props as any)}\n />\n )\n)\nScrollBar.displayName = \"ScrollBar\"\n\nexport { ScrollArea, ScrollBar }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface SelectContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n value?: string\n setValue: (value: string) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n contentRef: React.RefObject<HTMLDivElement>\n itemsRef: React.MutableRefObject<Map<string, React.ReactNode>>\n}\n\nconst SelectContext = React.createContext<SelectContextValue | null>(null)\nconst SelectGroupContext = React.createContext<boolean>(false)\n\ninterface SelectProps {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n disabled?: boolean\n children: React.ReactNode\n}\n\nconst Select = ({\n value,\n defaultValue,\n onValueChange,\n open,\n defaultOpen = false,\n onOpenChange,\n disabled = false,\n children,\n}: SelectProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const [currentValue, setCurrentValue] = useControllableState<string | undefined>({\n value,\n defaultValue,\n onChange: (next) => {\n if (next !== undefined) {\n onValueChange?.(next)\n }\n },\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n const itemsRef = React.useRef<Map<string, React.ReactNode>>(new Map())\n\n return (\n <SelectContext.Provider\n value={{\n open: disabled ? false : isOpen,\n setOpen: disabled ? () => undefined : setIsOpen,\n value: currentValue,\n setValue: (next) => {\n if (disabled) return\n setCurrentValue(next)\n setIsOpen(false)\n },\n triggerRef,\n contentRef,\n itemsRef,\n }}\n >\n {children}\n </SelectContext.Provider>\n )\n}\n\nconst SelectGroup = ({ children }: { children: React.ReactNode }) => (\n <SelectGroupContext.Provider value={true}>{children}</SelectGroupContext.Provider>\n)\n\nconst SelectValue = ({\n placeholder,\n children,\n}: {\n placeholder?: React.ReactNode\n children?: React.ReactNode\n}) => {\n const ctx = React.useContext(SelectContext)\n if (!ctx) return null\n if (children) return <>{children}</>\n if (ctx.value && ctx.itemsRef.current.has(ctx.value)) {\n return <>{ctx.itemsRef.current.get(ctx.value)}</>\n }\n return <span className=\"text-muted-foreground\">{placeholder}</span>\n}\n\nconst SelectTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ className, children, onClick, ...props }, ref) => {\n const ctx = React.useContext(SelectContext)\n if (!ctx) return null\n\n return (\n <button\n ref={mergeRefs(ctx.triggerRef, ref)}\n type=\"button\"\n className={cn(\n \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n onClick={(e) => {\n ctx.setOpen(!ctx.open)\n onClick?.(e)\n }}\n {...(props as any)}\n >\n <span>{children}</span>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </button>\n )\n})\nSelectTrigger.displayName = \"SelectTrigger\"\n\nconst SelectScrollUpButton = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...(props as any)}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </div>\n))\nSelectScrollUpButton.displayName = \"SelectScrollUpButton\"\n\nconst SelectScrollDownButton = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...(props as any)}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </div>\n))\nSelectScrollDownButton.displayName = \"SelectScrollDownButton\"\n\nconst SelectContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & {\n position?: \"item-aligned\" | \"popper\"\n }\n>(({ className, children, style, ...props }, ref) => {\n const ctx = React.useContext(SelectContext)\n const [pos, setPos] = React.useState({ top: 0, left: 0, width: 0 })\n const open = !!ctx?.open\n const trigger = ctx?.triggerRef.current ?? null\n\n React.useLayoutEffect(() => {\n if (!trigger) return\n const rect = trigger.getBoundingClientRect()\n setPos({ top: rect.bottom + 4, left: rect.left, width: rect.width })\n }, [trigger])\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n () => ctx?.setOpen(false),\n open\n )\n\n if (!ctx || !open || !trigger) return null\n\n return (\n <Portal>\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"relative z-50 max-h-80 overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n className\n )}\n style={{\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n minWidth: Math.max(pos.width, 128),\n ...style,\n }}\n {...(props as any)}\n >\n <div className=\"p-1\">{children}</div>\n </div>\n </Portal>\n )\n})\nSelectContent.displayName = \"SelectContent\"\n\nconst SelectLabel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...(props as any)}\n />\n))\nSelectLabel.displayName = \"SelectLabel\"\n\ninterface SelectItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nconst SelectItem = React.forwardRef<HTMLButtonElement, SelectItemProps>(\n ({ className, children, value, onClick, ...props }, ref) => {\n const ctx = React.useContext(SelectContext)\n\n React.useEffect(() => {\n if (!ctx) return\n ctx.itemsRef.current.set(value, children)\n return () => {\n ctx.itemsRef.current.delete(value)\n }\n }, [ctx, value, children])\n\n if (!ctx) return null\n\n const selected = ctx.value === value\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n onClick={(e) => {\n ctx.setValue(value)\n onClick?.(e)\n }}\n {...(props as any)}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n {selected ? <Check className=\"h-4 w-4\" /> : null}\n </span>\n <span>{children}</span>\n </button>\n )\n }\n)\nSelectItem.displayName = \"SelectItem\"\n\nconst SelectSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...(props as any)}\n />\n))\nSelectSeparator.displayName = \"SelectSeparator\"\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\"\n decorative?: boolean\n}\n\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <div\n ref={ref}\n role={decorative ? undefined : \"separator\"}\n aria-orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...(props as any)}\n />\n )\n)\nSeparator.displayName = \"Separator\"\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport {\n Dialog as Sheet,\n DialogTrigger as SheetTrigger,\n DialogClose as SheetClose,\n DialogPortal as SheetPortal,\n DialogOverlay as SheetOverlay,\n DialogContent as BaseDialogContent,\n} from \"./Dialog\"\n\nconst sheetVariants = cva(\n \"fixed z-[10000] gap-4 bg-background p-6 shadow-lg transition ease-in-out translate-x-0 translate-y-0\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 left-0 border-b\",\n bottom: \"inset-x-0 bottom-0 left-0 border-t\",\n left: \"inset-y-0 left-0 top-0 h-full w-3/4 border-r sm:max-w-sm\",\n right: \"inset-y-0 right-0 top-0 h-full w-3/4 border-l sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n)\n\ninterface SheetContentProps\n extends Omit<React.ComponentPropsWithoutRef<typeof BaseDialogContent>, \"children\">,\n VariantProps<typeof sheetVariants> {\n children?: React.ReactNode\n}\n\nconst SheetContent = React.forwardRef<HTMLDivElement, SheetContentProps>(\n ({ side = \"right\", className, children, ...props }, ref) => (\n <BaseDialogContent\n ref={ref}\n className={cn(\n \"max-w-none rounded-none\",\n sheetVariants({ side }),\n className\n )}\n showCloseButton={false}\n {...(props as any)}\n >\n <SheetClose className=\"absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetClose>\n {children}\n </BaseDialogContent>\n )\n)\nSheetContent.displayName = \"SheetContent\"\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...(props as any)}\n />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...(props as any)}\n />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h2\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...(props as any)}\n />\n))\nSheetTitle.displayName = \"SheetTitle\"\n\nconst SheetDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nSheetDescription.displayName = \"SheetDescription\"\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...(props as any)}\n />\n )\n})\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal } from \"./internal/ui-core\"\n\nconst TooltipConfigContext = React.createContext<{ delayDuration: number }>({\n delayDuration: 200,\n})\n\ninterface TooltipContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLSpanElement>\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null)\n\nconst TooltipProvider = ({\n children,\n delayDuration = 200,\n}: {\n children: React.ReactNode\n delayDuration?: number\n}) => {\n return (\n <TooltipConfigContext.Provider value={{ delayDuration }}>\n {children}\n </TooltipConfigContext.Provider>\n )\n}\n\nconst Tooltip = ({ children }: { children: React.ReactNode }) => {\n const [open, setOpen] = React.useState(false)\n const triggerRef = React.useRef<HTMLSpanElement>(null)\n return (\n <TooltipContext.Provider value={{ open, setOpen, triggerRef }}>\n {children}\n </TooltipContext.Provider>\n )\n}\n\nconst TooltipTrigger = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement> & { asChild?: boolean; children: React.ReactNode }\n>(({ children, ...props }, ref) => {\n const ctx = React.useContext(TooltipContext)\n const cfg = React.useContext(TooltipConfigContext)\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n if (!ctx) return null\n\n const setRef = mergeRefs(ctx.triggerRef, ref)\n\n const openWithDelay = () => {\n if (timer.current) clearTimeout(timer.current)\n timer.current = setTimeout(() => ctx.setOpen(true), cfg.delayDuration)\n }\n\n const closeNow = () => {\n if (timer.current) clearTimeout(timer.current)\n ctx.setOpen(false)\n }\n\n const shared = {\n onMouseEnter: openWithDelay,\n onMouseLeave: closeNow,\n onFocus: openWithDelay,\n onBlur: closeNow,\n ...props,\n }\n\n return (\n <span ref={setRef} {...(shared as any)}>\n {children}\n </span>\n )\n})\nTooltipTrigger.displayName = \"TooltipTrigger\"\n\nconst TooltipContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { sideOffset?: number }\n>(({ className, sideOffset = 4, style, ...props }, ref) => {\n const ctx = React.useContext(TooltipContext)\n const [pos, setPos] = React.useState({ top: 0, left: 0 })\n const open = !!ctx?.open\n const trigger = ctx?.triggerRef.current ?? null\n\n React.useLayoutEffect(() => {\n if (!trigger) return\n const rect = trigger.getBoundingClientRect()\n setPos({\n top: rect.top - sideOffset,\n left: rect.left + rect.width / 2,\n })\n }, [trigger, sideOffset])\n\n if (!ctx || !open || !trigger) return null\n\n return (\n <Portal>\n <div\n ref={ref}\n className={cn(\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground\",\n className\n )}\n style={{\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n transform: \"translate(-50%, -100%)\",\n ...style,\n }}\n {...(props as any)}\n />\n </Portal>\n )\n})\nTooltipContent.displayName = \"TooltipContent\"\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\ntype AvatarStatus = \"idle\" | \"loaded\" | \"error\"\n\nconst AvatarContext = React.createContext<{\n status: AvatarStatus\n setStatus: (next: AvatarStatus) => void\n} | null>(null)\n\nconst Avatar = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => {\n const [status, setStatus] = React.useState<AvatarStatus>(\"idle\")\n\n return (\n <AvatarContext.Provider value={{ status, setStatus }}>\n <span\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...(props as any)}\n />\n </AvatarContext.Provider>\n )\n})\nAvatar.displayName = \"Avatar\"\n\nconst AvatarImage = React.forwardRef<\n HTMLImageElement,\n React.ImgHTMLAttributes<HTMLImageElement>\n>(({ className, onLoad, onError, ...props }, ref) => {\n const ctx = React.useContext(AvatarContext)\n\n return (\n <img\n ref={ref}\n className={cn(\n \"aspect-square h-full w-full\",\n ctx?.status === \"error\" ? \"hidden\" : undefined,\n className\n )}\n onLoad={(e) => {\n ctx?.setStatus(\"loaded\")\n onLoad?.(e)\n }}\n onError={(e) => {\n ctx?.setStatus(\"error\")\n onError?.(e)\n }}\n {...(props as any)}\n />\n )\n})\nAvatarImage.displayName = \"AvatarImage\"\n\nconst AvatarFallback = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => {\n const ctx = React.useContext(AvatarContext)\n const show = ctx?.status !== \"loaded\"\n\n if (!show) return null\n\n return (\n <span\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n className\n )}\n {...(props as any)}\n />\n )\n})\nAvatarFallback.displayName = \"AvatarFallback\"\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","'use client';\n\nimport React from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from './Dialog';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from './AlertDialog';\nimport { cn } from '@/utils';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n width?: number | string;\n height?: number | string;\n className?: string;\n maskClosable?: boolean;\n children: React.ReactNode;\n zIndex?: number;\n overlayClassName?: string;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n width,\n height,\n className,\n maskClosable = true,\n children,\n zIndex = 50,\n overlayClassName,\n}) => {\n const contentZIndex = Math.max(zIndex, 10000);\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => {\n if (!open) {\n if (maskClosable) {\n onClose();\n } else {\n // If maskClosable is false, we don't allow closing via backdrop/ESC\n }\n }\n }}>\n <DialogContent \n className={cn(\"sm:max-w-[425px]\", className)}\n overlayClassName={overlayClassName}\n onPointerDownOutside={(e) => {\n if (!maskClosable) e.preventDefault();\n }}\n onEscapeKeyDown={(e) => {\n if (!maskClosable) e.preventDefault();\n }}\n style={{\n zIndex: contentZIndex,\n ...(width ? { maxWidth: typeof width === 'number' ? `${width}px` : width } : undefined),\n ...(height ? { height: typeof height === 'number' ? `${height}px` : height } : undefined),\n }}\n >\n {title ? (\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n ) : (\n // 无障碍性:始终需要 DialogTitle,使用 sr-only 对视觉隐藏但对屏幕阅读器可见\n <DialogTitle className=\"sr-only\">弹窗</DialogTitle>\n )}\n <div className=\"py-4\">\n {children}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport interface ConfirmModalProps {\n isOpen: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title?: string;\n message: string;\n confirmText?: string;\n cancelText?: string;\n isLoading?: boolean;\n}\n\nexport const ConfirmModal: React.FC<ConfirmModalProps> = ({\n isOpen,\n onClose,\n onConfirm,\n title = \"确认操作\",\n message,\n confirmText = \"确认\",\n cancelText = \"取消\",\n isLoading = false,\n}) => {\n return (\n <AlertDialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n <AlertDialogDescription>{message}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isLoading}>{cancelText}</AlertDialogCancel>\n <AlertDialogAction \n onClick={(e) => {\n e.preventDefault();\n onConfirm();\n }}\n disabled={isLoading}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {isLoading ? \"处理中...\" : confirmText}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n","'use client';\n\nimport React, { useMemo, useState, useCallback } from 'react';\nimport { SearchBox } from '../../components/SearchBox';\nimport { ConfirmModal } from '@/components';\nimport { clsx } from 'clsx';\nimport { \n CalendarEvent, \n EventListProps, \n EventListDisplayMode, \n EventSortField, \n SortDirection, \n EventPriority \n} from '../types';\n\n/**\n * 事件列表组件\n * 支持列表/网格显示模式、排序、批量选择和批量删除\n */\nexport default function EventList({\n events,\n config,\n onConfigChange,\n onEventClick,\n onEventEdit,\n onEventDelete,\n onBatchDelete,\n enableBatchActions = true,\n loading = false,\n className = ''\n}: EventListProps) {\n \n // 批量选择状态\n const [selectedEventIds, setSelectedEventIds] = useState<Set<number>>(new Set());\n const [isSelectionMode, setIsSelectionMode] = useState(false);\n const [showBatchDeleteConfirm, setShowBatchDeleteConfirm] = useState(false);\n const [batchDeleteLoading, setBatchDeleteLoading] = useState(false);\n \n // 排序和过滤事件\n const sortedAndFilteredEvents = useMemo(() => {\n let filteredEvents = [...events];\n \n // 应用过滤条件\n if (config.filter.priority) {\n filteredEvents = filteredEvents.filter(event => event.priority === config.filter.priority);\n }\n \n if (config.filter.color) {\n filteredEvents = filteredEvents.filter(event => event.color === config.filter.color);\n }\n \n if (config.filter.searchText) {\n const searchText = config.filter.searchText.toLowerCase();\n filteredEvents = filteredEvents.filter(event => \n event.title.toLowerCase().includes(searchText) ||\n (event.description && event.description.toLowerCase().includes(searchText)) ||\n (event.location && event.location.toLowerCase().includes(searchText))\n );\n }\n \n if (config.filter.dateRange) {\n filteredEvents = filteredEvents.filter(event => \n event.startTime >= config.filter.dateRange!.startDate &&\n event.startTime <= config.filter.dateRange!.endDate\n );\n }\n \n // 应用排序\n filteredEvents.sort((a, b) => {\n let aValue: any;\n let bValue: any;\n \n switch (config.sort.field) {\n case EventSortField.START_TIME:\n aValue = a.startTime.getTime();\n bValue = b.startTime.getTime();\n break;\n case EventSortField.TITLE:\n aValue = a.title.toLowerCase();\n bValue = b.title.toLowerCase();\n break;\n case EventSortField.PRIORITY:\n const priorityOrder = { \n [EventPriority.URGENT]: 4, \n [EventPriority.HIGH]: 3, \n [EventPriority.NORMAL]: 2, \n [EventPriority.LOW]: 1 \n };\n aValue = priorityOrder[a.priority];\n bValue = priorityOrder[b.priority];\n break;\n case EventSortField.CREATED_AT:\n aValue = a.createdAt.getTime();\n bValue = b.createdAt.getTime();\n break;\n case EventSortField.UPDATED_AT:\n aValue = a.updatedAt.getTime();\n bValue = b.updatedAt.getTime();\n break;\n default:\n aValue = a.startTime.getTime();\n bValue = b.startTime.getTime();\n }\n \n if (aValue < bValue) return config.sort.direction === SortDirection.ASC ? -1 : 1;\n if (aValue > bValue) return config.sort.direction === SortDirection.ASC ? 1 : -1;\n return 0;\n });\n \n return filteredEvents;\n }, [events, config]);\n \n // 分页数据\n const paginatedEvents = useMemo(() => {\n const startIndex = (config.currentPage - 1) * config.pageSize;\n const endIndex = startIndex + config.pageSize;\n return sortedAndFilteredEvents.slice(startIndex, endIndex);\n }, [sortedAndFilteredEvents, config.currentPage, config.pageSize]);\n \n const totalPages = Math.ceil(sortedAndFilteredEvents.length / config.pageSize);\n \n // 批量选择逻辑\n const handleSelectEvent = useCallback((eventId: number, selected: boolean) => {\n setSelectedEventIds(prev => {\n const newSet = new Set(prev);\n if (selected) {\n newSet.add(eventId);\n } else {\n newSet.delete(eventId);\n }\n return newSet;\n });\n }, []);\n \n const handleSelectAll = useCallback((selected: boolean) => {\n if (selected) {\n setSelectedEventIds(new Set(paginatedEvents.map(event => event.id)));\n } else {\n setSelectedEventIds(new Set());\n }\n }, [paginatedEvents]);\n \n const toggleSelectionMode = useCallback(() => {\n setIsSelectionMode(!isSelectionMode);\n setSelectedEventIds(new Set());\n }, [isSelectionMode]);\n \n const exitSelectionMode = useCallback(() => {\n setIsSelectionMode(false);\n setSelectedEventIds(new Set());\n }, []);\n \n // 批量删除处理\n const handleBatchDelete = useCallback(async () => {\n if (!onBatchDelete || selectedEventIds.size === 0) return;\n \n setBatchDeleteLoading(true);\n try {\n await onBatchDelete(Array.from(selectedEventIds));\n setSelectedEventIds(new Set());\n setIsSelectionMode(false);\n setShowBatchDeleteConfirm(false);\n } catch (error) {\n console.error('批量删除失败:', error);\n } finally {\n setBatchDeleteLoading(false);\n }\n }, [onBatchDelete, selectedEventIds]);\n \n // 检查是否全选\n const isAllSelected = useMemo(() => {\n return paginatedEvents.length > 0 && paginatedEvents.every(event => selectedEventIds.has(event.id));\n }, [paginatedEvents, selectedEventIds]);\n \n // 检查是否部分选中\n const isPartiallySelected = useMemo(() => {\n return selectedEventIds.size > 0 && !isAllSelected;\n }, [selectedEventIds.size, isAllSelected]);\n \n // 获取优先级显示\n const getPriorityDisplay = (priority: EventPriority) => {\n switch (priority) {\n case EventPriority.URGENT:\n return { text: '紧急', color: 'bg-red-100 text-red-800 border-red-200' };\n case EventPriority.HIGH:\n return { text: '高', color: 'bg-orange-100 text-orange-800 border-orange-200' };\n case EventPriority.NORMAL:\n return { text: '普通', color: 'bg-blue-100 text-blue-800 border-blue-200' };\n case EventPriority.LOW:\n return { text: '低', color: 'bg-gray-100 text-gray-800 border-gray-200' };\n default:\n return { text: '普通', color: 'bg-gray-100 text-gray-800 border-gray-200' };\n }\n };\n \n // 获取事件颜色类名\n const getEventColorClass = (color: string) => {\n const colorMap: Record<string, string> = {\n '#3B82F6': 'border-blue-500 bg-blue-50',\n '#10B981': 'border-green-500 bg-green-50',\n '#8B5CF6': 'border-purple-500 bg-purple-50',\n '#EF4444': 'border-red-500 bg-red-50',\n '#F59E0B': 'border-yellow-500 bg-yellow-50',\n '#EC4899': 'border-pink-500 bg-pink-50',\n '#6366F1': 'border-indigo-500 bg-indigo-50',\n '#6B7280': 'border-gray-500 bg-gray-50',\n };\n return colorMap[color] || 'border-gray-500 bg-gray-50';\n };\n \n // 处理排序变更\n const handleSortChange = (field: EventSortField) => {\n const newDirection = config.sort.field === field && config.sort.direction === SortDirection.ASC \n ? SortDirection.DESC \n : SortDirection.ASC;\n \n onConfigChange({\n ...config,\n sort: { field, direction: newDirection }\n });\n };\n \n // 处理显示模式切换\n const handleDisplayModeChange = (mode: EventListDisplayMode) => {\n onConfigChange({\n ...config,\n displayMode: mode\n });\n };\n \n // 处理页面变更\n const handlePageChange = (page: number) => {\n onConfigChange({\n ...config,\n currentPage: page\n });\n };\n \n // 处理搜索\n const handleSearchChange = (searchText: string) => {\n onConfigChange({\n ...config,\n filter: {\n ...config.filter,\n searchText\n },\n currentPage: 1 // 重置到第一页\n });\n };\n \n // 渲染排序按钮\n const renderSortButton = (field: EventSortField, label: string) => {\n const isActive = config.sort.field === field;\n const isAsc = isActive && config.sort.direction === SortDirection.ASC;\n \n return (\n <button\n onClick={() => handleSortChange(field)}\n className={clsx('flex items-center px-3 py-1.5 text-sm font-medium rounded-lg transition-colors', isActive ? 'bg-blue-100 text-blue-700' : 'text-gray-600 hover:bg-gray-100')}\n >\n {label}\n <svg \n className={clsx('ml-1 w-4 h-4 transition-transform', isActive ? (isAsc ? 'rotate-180' : '') : 'opacity-50')} \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n );\n };\n \n // 渲染复选框\n const renderCheckbox = (eventId: number) => {\n const isChecked = selectedEventIds.has(eventId);\n \n return (\n <input\n type=\"checkbox\"\n checked={isChecked}\n onChange={(e) => {\n e.stopPropagation();\n handleSelectEvent(eventId, e.target.checked);\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n );\n };\n \n // 渲染全选复选框\n const renderSelectAllCheckbox = () => {\n return (\n <input\n type=\"checkbox\"\n checked={isAllSelected}\n ref={(input) => {\n if (input) input.indeterminate = isPartiallySelected;\n }}\n onChange={(e) => handleSelectAll(e.target.checked)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n );\n };\n \n // 渲染列表模式\n const renderListMode = () => (\n <div className=\"space-y-4\">\n {paginatedEvents.map((event) => {\n const priorityDisplay = getPriorityDisplay(event.priority);\n const isSelected = selectedEventIds.has(event.id);\n \n return (\n <div\n key={event.id}\n className={clsx('p-4 rounded-lg border-l-4 cursor-pointer hover:shadow-md transition-all', getEventColorClass(event.color), isSelected ? 'ring-2 ring-blue-500 ring-opacity-50' : '')}\n onClick={() => !isSelectionMode && onEventClick(event)}\n >\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-start gap-3 flex-1\">\n {/* 选择框 */}\n {isSelectionMode && (\n <div className=\"pt-1\">\n {renderCheckbox(event.id)}\n </div>\n )}\n \n <div className=\"flex-1\">\n <div className=\"flex items-center gap-3 mb-2\">\n <h3 className=\"text-lg font-semibold text-gray-900\">{event.title}</h3>\n <span className={clsx('px-2 py-1 text-xs font-medium rounded border', priorityDisplay.color)}>\n {priorityDisplay.text}\n </span>\n </div>\n \n {event.description && (\n <p className=\"text-gray-600 mb-2 line-clamp-2\">{event.description}</p>\n )}\n \n <div className=\"flex items-center gap-4 text-sm text-gray-500\">\n <div className=\"flex items-center gap-1\">\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <span>\n {event.startTime.toLocaleDateString('zh-CN')} {\n !event.allDay && event.startTime.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })\n }\n </span>\n </div>\n \n {event.location && (\n <div className=\"flex items-center gap-1\">\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <span>{event.location}</span>\n </div>\n )}\n </div>\n </div>\n </div>\n \n {/* 操作按钮 */}\n {!isSelectionMode && (\n <div className=\"flex items-center gap-2 ml-4\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n onEventEdit(event);\n }}\n className=\"p-2 text-gray-400 hover:text-blue-600 hover:bg-blue-50 rounded-lg transition-colors\"\n title=\"编辑事件\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n </button>\n \n <button\n onClick={(e) => {\n e.stopPropagation();\n onEventDelete(event.id);\n }}\n className=\"p-2 text-gray-400 hover:text-red-600 hover:bg-red-50 rounded-lg transition-colors\"\n title=\"删除事件\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n \n // 渲染网格模式\n const renderGridMode = () => (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {paginatedEvents.map((event) => {\n const priorityDisplay = getPriorityDisplay(event.priority);\n const isSelected = selectedEventIds.has(event.id);\n \n return (\n <div\n key={event.id}\n className={clsx('p-4 rounded-lg border cursor-pointer hover:shadow-lg transition-all', getEventColorClass(event.color), 'border-l-4', isSelected ? 'ring-2 ring-blue-500 ring-opacity-50' : '')}\n onClick={() => !isSelectionMode && onEventClick(event)}\n >\n <div className=\"flex items-start justify-between mb-3\">\n {/* 选择框 */}\n {isSelectionMode && (\n <div className=\"pt-1 mr-2\">\n {renderCheckbox(event.id)}\n </div>\n )}\n \n <h3 className=\"text-lg font-semibold text-gray-900 flex-1 pr-2\">{event.title}</h3>\n <span className={clsx('px-2 py-1 text-xs font-medium rounded border flex-shrink-0', priorityDisplay.color)}>\n {priorityDisplay.text}\n </span>\n </div>\n \n {event.description && (\n <p className=\"text-gray-600 text-sm mb-3 line-clamp-3\">{event.description}</p>\n )}\n \n <div className=\"space-y-2 text-sm text-gray-500\">\n <div className=\"flex items-center gap-1\">\n <svg className=\"w-4 h-4 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <span className=\"truncate\">\n {event.startTime.toLocaleDateString('zh-CN')} {\n !event.allDay && event.startTime.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })\n }\n </span>\n </div>\n \n {event.location && (\n <div className=\"flex items-center gap-1\">\n <svg className=\"w-4 h-4 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <span className=\"truncate\">{event.location}</span>\n </div>\n )}\n </div>\n \n {!isSelectionMode && (\n <div className=\"flex items-center justify-end gap-2 mt-4 pt-3 border-t border-gray-200\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n onEventEdit(event);\n }}\n className=\"p-1.5 text-gray-400 hover:text-blue-600 hover:bg-blue-50 rounded transition-colors\"\n title=\"编辑事件\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n </button>\n \n <button\n onClick={(e) => {\n e.stopPropagation();\n onEventDelete(event.id);\n }}\n className=\"p-1.5 text-gray-400 hover:text-red-600 hover:bg-red-50 rounded transition-colors\"\n title=\"删除事件\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n \n return (\n <div className={clsx('space-y-6', className)}>\n {/* 工具栏 */}\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-4\">\n <div className=\"flex flex-col lg:flex-row lg:items-center lg:justify-between gap-4\">\n {/* 搜索框 */}\n <div className=\"flex-1 max-w-md\">\n <SearchBox\n searchQuery={config.filter.searchText || ''}\n onSearchChange={handleSearchChange}\n placeholder=\"搜索事件标题、描述或位置...\"\n size=\"medium\"\n />\n </div>\n \n {/* 批量操作和显示模式 */}\n <div className=\"flex items-center gap-3\">\n {/* 批量操作按钮 */}\n {enableBatchActions && onBatchDelete && (\n <>\n {!isSelectionMode ? (\n <button\n onClick={toggleSelectionMode}\n className=\"flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-gray-100 border border-gray-300 rounded-lg hover:bg-gray-200 transition-colors\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n 批量操作\n </button>\n ) : (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={exitSelectionMode}\n className=\"px-3 py-2 text-sm font-medium text-gray-700 bg-gray-100 border border-gray-300 rounded-lg hover:bg-gray-200 transition-colors\"\n >\n 取消\n </button>\n \n {selectedEventIds.size > 0 && (\n <button\n onClick={() => setShowBatchDeleteConfirm(true)}\n disabled={batchDeleteLoading}\n className=\"flex items-center gap-2 px-3 py-2 text-sm font-medium text-white bg-red-600 border border-red-600 rounded-lg hover:bg-red-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {batchDeleteLoading ? (\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-white\"></div>\n ) : (\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n )}\n 删除选中({selectedEventIds.size})\n </button>\n )}\n </div>\n )}\n </>\n )}\n \n {/* 显示模式切换 */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-gray-700 mr-2\">显示模式:</span>\n <div className=\"flex items-center bg-gray-100 rounded-lg p-1\">\n <button\n onClick={() => handleDisplayModeChange(EventListDisplayMode.LIST)}\n className={clsx('px-3 py-1.5 text-sm font-medium rounded-md transition-colors', config.displayMode === EventListDisplayMode.LIST\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900')}\n >\n 列表\n </button>\n <button\n onClick={() => handleDisplayModeChange(EventListDisplayMode.GRID)}\n className={clsx('px-3 py-1.5 text-sm font-medium rounded-md transition-colors', config.displayMode === EventListDisplayMode.GRID\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900')}\n >\n 网格\n </button>\n </div>\n </div>\n </div>\n </div>\n \n {/* 选择模式信息栏 */}\n {isSelectionMode && (\n <div className=\"flex items-center justify-between mt-4 pt-4 border-t border-gray-200\">\n <div className=\"flex items-center gap-3\">\n <label className=\"flex items-center gap-2 text-sm font-medium text-gray-700\">\n {renderSelectAllCheckbox()}\n 全选当前页\n </label>\n <span className=\"text-sm text-gray-600\">\n 已选择 {selectedEventIds.size} 个事件\n </span>\n </div>\n </div>\n )}\n \n {/* 排序选项 */}\n {!isSelectionMode && (\n <div className=\"flex flex-wrap items-center gap-2 mt-4 pt-4 border-t border-gray-200\">\n <span className=\"text-sm text-gray-700 mr-2\">排序:</span>\n {renderSortButton(EventSortField.START_TIME, '日期')}\n {renderSortButton(EventSortField.TITLE, '标题')}\n {renderSortButton(EventSortField.PRIORITY, '优先级')}\n {renderSortButton(EventSortField.CREATED_AT, '创建时间')}\n {renderSortButton(EventSortField.UPDATED_AT, '更新时间')}\n </div>\n )}\n </div>\n \n {/* 事件统计 */}\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm text-gray-600\">\n 共 {sortedAndFilteredEvents.length} 个事件\n {config.filter.searchText && ' (搜索: \"' + (config.filter.searchText) + '\")'}\n </div>\n </div>\n \n {/* 加载状态 */}\n {loading && (\n <div className=\"flex justify-center py-8\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600\"></div>\n </div>\n )}\n \n {/* 事件列表 */}\n {!loading && paginatedEvents.length > 0 && (\n <>\n {config.displayMode === EventListDisplayMode.LIST ? renderListMode() : renderGridMode()}\n \n {/* 分页 */}\n {totalPages > 1 && (\n <div className=\"flex items-center justify-between pt-6\">\n <div className=\"text-sm text-gray-600\">\n 第 {config.currentPage} 页,共 {totalPages} 页\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => handlePageChange(config.currentPage - 1)}\n disabled={config.currentPage === 1}\n className=\"px-3 py-1.5 text-sm border border-gray-300 rounded-lg hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n 上一页\n </button>\n <button\n onClick={() => handlePageChange(config.currentPage + 1)}\n disabled={config.currentPage === totalPages}\n className=\"px-3 py-1.5 text-sm border border-gray-300 rounded-lg hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n 下一页\n </button>\n </div>\n </div>\n )}\n </>\n )}\n \n {/* 空状态 */}\n {!loading && paginatedEvents.length === 0 && (\n <div className=\"text-center py-12\">\n <svg className=\"w-16 h-16 mx-auto mb-4 text-gray-300\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <h3 className=\"text-lg font-medium text-gray-900 mb-2\">暂无事件</h3>\n <p className=\"text-gray-600\">\n {config.filter.searchText || config.filter.priority || config.filter.color || config.filter.dateRange\n ? '没有找到符合条件的事件'\n : '还没有创建任何事件'\n }\n </p>\n </div>\n )}\n \n {/* 批量删除确认弹窗 */}\n <ConfirmModal\n isOpen={showBatchDeleteConfirm}\n onClose={() => setShowBatchDeleteConfirm(false)}\n onConfirm={handleBatchDelete}\n title=\"确认批量删除\"\n message={'确定要删除选中的 ' + (selectedEventIds.size) + ' 个事件吗?此操作无法撤销。'}\n confirmText=\"删除\"\n cancelText=\"取消\"\n isLoading={batchDeleteLoading}\n />\n </div>\n );\n} ","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { Modal, ConfirmModal } from '@/components';\nimport { CalendarEvent, CreateEventRequest, UpdateEventRequest, EventPriority } from '../types';\nimport { toLocalISOString } from '../utils/dateUtils';\nimport { clsx } from 'clsx';\n\ninterface EventModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSave: (eventData: CreateEventRequest | UpdateEventRequest) => Promise<void>;\n onDelete?: (eventId: number) => Promise<void>; // 删除事件回调\n event?: CalendarEvent | null; // 如果传入event,则为编辑模式\n initialDate?: Date; // 创建事件时的初始日期\n}\n\nconst EventModal: React.FC<EventModalProps> = ({\n isOpen,\n onClose,\n onSave,\n onDelete,\n event,\n initialDate,\n}) => {\n const [formData, setFormData] = useState({\n title: '',\n description: '',\n startTime: '',\n endTime: '',\n location: '',\n color: '#3b82f6',\n priority: EventPriority.NORMAL,\n isAllDay: false,\n categoryId: null as string | null,\n // 重复事件相关\n isRecurring: false,\n recurrenceType: undefined as 'daily' | 'weekly' | 'monthly' | 'yearly' | undefined,\n recurrenceInterval: 1,\n recurrenceEndDate: '',\n recurrenceCount: 0,\n // 提醒相关\n hasReminder: false,\n reminderTime: 15, // 提前15分钟提醒\n reminderType: 'notification' as 'notification' | 'email',\n reminderMinutes: undefined as number | undefined,\n });\n\n const [isLoading, setIsLoading] = useState(false);\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n const isEditMode = !!event;\n\n // 初始化表单数据\n useEffect(() => {\n if (event) {\n // 编辑模式:使用现有事件数据\n const startDate = new Date(event.startTime);\n const endDate = new Date(event.endTime);\n \n setFormData({\n title: event.title,\n description: event.description || '',\n startTime: formatDateTimeLocal(startDate),\n endTime: formatDateTimeLocal(endDate),\n location: event.location || '',\n color: event.color || '#3b82f6',\n priority: event.priority || EventPriority.NORMAL,\n isAllDay: event.allDay,\n categoryId: null, // CalendarEvent doesn't have categoryId\n // 重复事件相关\n isRecurring: false,\n recurrenceType: undefined as 'daily' | 'weekly' | 'monthly' | 'yearly' | undefined,\n recurrenceInterval: 1,\n recurrenceEndDate: '',\n recurrenceCount: 0,\n // 提醒相关\n hasReminder: false,\n reminderTime: 15,\n reminderType: 'notification' as 'notification' | 'email',\n reminderMinutes: undefined as number | undefined,\n });\n } else if (initialDate) {\n // 创建模式:使用初始日期\n const startDateTime = new Date(initialDate);\n startDateTime.setHours(9, 0, 0, 0); // 默认上午9点\n \n const endDateTime = new Date(startDateTime);\n endDateTime.setHours(10, 0, 0, 0); // 默认1小时后\n \n setFormData(prev => ({\n ...prev,\n startTime: formatDateTimeLocal(startDateTime),\n endTime: formatDateTimeLocal(endDateTime),\n }));\n }\n }, [event, initialDate]);\n\n // 格式化日期时间为datetime-local输入格式\n const formatDateTimeLocal = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n return (year) + '-' + (month) + '-' + (day) + 'T' + (hours) + ':' + (minutes);\n };\n\n // 验证表单\n const validateForm = (): boolean => {\n const newErrors: Record<string, string> = {};\n\n if (!formData.title.trim()) {\n newErrors.title = '事件标题不能为空';\n }\n\n if (!formData.startTime) {\n newErrors.startTime = '开始时间不能为空';\n }\n\n if (!formData.endTime) {\n newErrors.endTime = '结束时间不能为空';\n }\n\n if (formData.startTime && formData.endTime) {\n const startDate = new Date(formData.startTime);\n const endDate = new Date(formData.endTime);\n \n if (endDate <= startDate) {\n newErrors.endTime = '结束时间必须晚于开始时间';\n }\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n // 处理表单提交\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n \n if (!validateForm()) {\n return;\n }\n\n setIsLoading(true);\n \n try {\n const eventData = {\n title: formData.title.trim(),\n description: formData.description.trim() || undefined,\n startTime: toLocalISOString(new Date(formData.startTime)),\n endTime: toLocalISOString(new Date(formData.endTime)),\n location: formData.location.trim() || undefined,\n color: formData.color,\n priority: formData.priority,\n allDay: formData.isAllDay,\n };\n\n await onSave(eventData);\n onClose();\n } catch (error) {\n console.error('保存事件失败:', error);\n setErrors({ submit: '保存事件失败,请重试' });\n } finally {\n setIsLoading(false);\n }\n };\n\n // 处理输入变化\n const handleInputChange = (\n field: keyof typeof formData,\n value: string | boolean | number | undefined\n ) => {\n setFormData(prev => ({ ...prev, [field]: value }));\n \n // 清除对应字段的错误\n if (errors[field]) {\n setErrors(prev => ({ ...prev, [field]: '' }));\n }\n };\n\n // 处理事件删除\n const handleDelete = async () => {\n if (!event?.id || !onDelete) return;\n \n setIsLoading(true);\n try {\n await onDelete(event.id);\n setShowDeleteConfirm(false);\n onClose();\n } catch (error) {\n console.error('删除事件失败:', error);\n setErrors({ submit: '删除事件失败,请重试' });\n } finally {\n setIsLoading(false);\n }\n };\n\n // 重置表单\n const resetForm = () => {\n setFormData({\n title: '',\n description: '',\n startTime: '',\n endTime: '',\n location: '',\n color: '#3b82f6',\n priority: EventPriority.NORMAL,\n isAllDay: false,\n categoryId: null,\n // 重复事件相关\n isRecurring: false,\n recurrenceType: undefined as 'daily' | 'weekly' | 'monthly' | 'yearly' | undefined,\n recurrenceInterval: 1,\n recurrenceEndDate: '',\n recurrenceCount: 0,\n // 提醒相关\n hasReminder: false,\n reminderTime: 15,\n reminderType: 'notification' as 'notification' | 'email',\n reminderMinutes: undefined as number | undefined,\n });\n setErrors({});\n setShowDeleteConfirm(false);\n };\n\n // 处理弹窗关闭\n const handleClose = () => {\n resetForm();\n onClose();\n };\n\n return (\n <Modal\n isOpen={isOpen}\n onClose={handleClose}\n title={isEditMode ? '编辑事件' : '创建事件'}\n width={600}\n maskClosable={false}\n >\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {/* 事件标题 */}\n <div>\n <label htmlFor=\"title\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 事件标题 *\n </label>\n <input\n type=\"text\"\n id=\"title\"\n value={formData.title}\n onChange={(e) => handleInputChange('title', e.target.value)}\n className={clsx('w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none', errors.title ? 'border-red-500' : 'border-gray-300')}\n placeholder=\"输入事件标题\"\n />\n {errors.title && (\n <p className=\"text-red-500 text-sm mt-1\">{errors.title}</p>\n )}\n </div>\n\n {/* 全天事件开关 */}\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"isAllDay\"\n checked={formData.isAllDay}\n onChange={(e) => handleInputChange('isAllDay', e.target.checked)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <label htmlFor=\"isAllDay\" className=\"ml-2 text-sm text-gray-700\">\n 全天事件\n </label>\n </div>\n\n {/* 时间选择 */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label htmlFor=\"startTime\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 开始时间 *\n </label>\n <input\n type={formData.isAllDay ? 'date' : 'datetime-local'}\n id=\"startTime\"\n value={formData.isAllDay ? formData.startTime.split('T')[0] : formData.startTime}\n onChange={(e) => {\n const value = formData.isAllDay \n ? (e.target.value) + 'T00:00' \n : e.target.value;\n handleInputChange('startTime', value);\n }}\n className={clsx('w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none', errors.startTime ? 'border-red-500' : 'border-gray-300')}\n />\n {errors.startTime && (\n <p className=\"text-red-500 text-sm mt-1\">{errors.startTime}</p>\n )}\n </div>\n\n <div>\n <label htmlFor=\"endTime\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 结束时间 *\n </label>\n <input\n type={formData.isAllDay ? 'date' : 'datetime-local'}\n id=\"endTime\"\n value={formData.isAllDay ? formData.endTime.split('T')[0] : formData.endTime}\n onChange={(e) => {\n const value = formData.isAllDay \n ? (e.target.value) + 'T23:59' \n : e.target.value;\n handleInputChange('endTime', value);\n }}\n className={clsx('w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none', errors.endTime ? 'border-red-500' : 'border-gray-300')}\n />\n {errors.endTime && (\n <p className=\"text-red-500 text-sm mt-1\">{errors.endTime}</p>\n )}\n </div>\n </div>\n\n {/* 位置 */}\n <div>\n <label htmlFor=\"location\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 位置\n </label>\n <input\n type=\"text\"\n id=\"location\"\n value={formData.location}\n onChange={(e) => handleInputChange('location', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n placeholder=\"输入事件位置\"\n />\n </div>\n\n {/* 描述 */}\n <div>\n <label htmlFor=\"description\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 描述\n </label>\n <textarea\n id=\"description\"\n value={formData.description}\n onChange={(e) => handleInputChange('description', e.target.value)}\n rows={3}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none resize-none\"\n placeholder=\"输入事件描述\"\n />\n </div>\n\n {/* 优先级选择 */}\n <div>\n <label htmlFor=\"priority\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 优先级\n </label>\n <select\n id=\"priority\"\n value={formData.priority}\n onChange={(e) => handleInputChange('priority', e.target.value as EventPriority)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n >\n <option value={EventPriority.LOW}>低</option>\n <option value={EventPriority.NORMAL}>普通</option>\n <option value={EventPriority.HIGH}>高</option>\n <option value={EventPriority.URGENT}>紧急</option>\n </select>\n </div>\n\n {/* 颜色选择 */}\n <div>\n <label htmlFor=\"color\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 颜色标签\n </label>\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"color\"\n id=\"color\"\n value={formData.color}\n onChange={(e) => handleInputChange('color', e.target.value)}\n className=\"w-12 h-10 border border-gray-300 rounded cursor-pointer\"\n />\n <span className=\"text-sm text-gray-600\">{formData.color}</span>\n </div>\n </div>\n\n {/* 重复设置 */}\n <div className=\"border-t border-gray-200 pt-4\">\n <h4 className=\"text-sm font-medium text-gray-700 mb-3\">🔄 重复设置</h4>\n \n {/* 重复类型 */}\n <div>\n <label htmlFor=\"recurrenceType\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 重复频率\n </label>\n <select\n id=\"recurrenceType\"\n value={formData.recurrenceType || 'none'}\n onChange={(e) => {\n const value = e.target.value === 'none' ? undefined : e.target.value;\n handleInputChange('recurrenceType', value);\n }}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n >\n <option value=\"none\">不重复</option>\n <option value=\"daily\">每天</option>\n <option value=\"weekly\">每周</option>\n <option value=\"monthly\">每月</option>\n <option value=\"yearly\">每年</option>\n </select>\n </div>\n\n {/* 重复间隔 - 只有选择了重复类型才显示 */}\n {formData.recurrenceType && (\n <div className=\"mt-3\">\n <label htmlFor=\"recurrenceInterval\" className=\"block text-sm font-medium text-gray-700 mb-1\">\n 重复间隔\n </label>\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-sm text-gray-600\">每</span>\n <input\n type=\"number\"\n id=\"recurrenceInterval\"\n min=\"1\"\n max=\"365\"\n value={formData.recurrenceInterval || 1}\n onChange={(e) => handleInputChange('recurrenceInterval', parseInt(e.target.value) || 1)}\n className=\"w-20 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none text-center\"\n />\n <span className=\"text-sm text-gray-600\">\n {formData.recurrenceType === 'daily' && '天'}\n {formData.recurrenceType === 'weekly' && '周'}\n {formData.recurrenceType === 'monthly' && '月'}\n {formData.recurrenceType === 'yearly' && '年'}\n </span>\n </div>\n </div>\n )}\n\n {/* 重复结束设置 - 只有选择了重复类型才显示 */}\n {formData.recurrenceType && (\n <div className=\"mt-3\">\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 重复结束\n </label>\n \n <div className=\"space-y-2\">\n {/* 永不结束 */}\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n name=\"recurrenceEnd\"\n checked={!formData.recurrenceEndDate && !formData.recurrenceCount}\n onChange={() => {\n handleInputChange('recurrenceEndDate', '');\n handleInputChange('recurrenceCount', 0);\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">永不结束</span>\n </label>\n\n {/* 指定结束日期 */}\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n name=\"recurrenceEnd\"\n checked={!!formData.recurrenceEndDate}\n onChange={() => {\n const endDate = new Date();\n endDate.setMonth(endDate.getMonth() + 1);\n handleInputChange('recurrenceEndDate', endDate.toISOString().split('T')[0]);\n handleInputChange('recurrenceCount', 0);\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">结束于:</span>\n <input\n type=\"date\"\n value={formData.recurrenceEndDate || ''}\n onChange={(e) => {\n handleInputChange('recurrenceEndDate', e.target.value);\n handleInputChange('recurrenceCount', 0);\n }}\n className=\"ml-2 px-2 py-1 border border-gray-300 rounded text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n disabled={!formData.recurrenceEndDate}\n />\n </label>\n\n {/* 指定重复次数 */}\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n name=\"recurrenceEnd\"\n checked={!!formData.recurrenceCount && formData.recurrenceCount > 0}\n onChange={() => {\n handleInputChange('recurrenceCount', 10);\n handleInputChange('recurrenceEndDate', '');\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">重复</span>\n <input\n type=\"number\"\n min=\"1\"\n max=\"999\"\n value={formData.recurrenceCount || ''}\n onChange={(e) => {\n const count = parseInt(e.target.value) || 0;\n handleInputChange('recurrenceCount', count);\n if (count > 0) {\n handleInputChange('recurrenceEndDate', '');\n }\n }}\n className=\"ml-2 w-16 px-2 py-1 border border-gray-300 rounded text-sm text-center focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n disabled={!formData.recurrenceCount || formData.recurrenceCount === 0}\n />\n <span className=\"ml-2 text-sm text-gray-700\">次</span>\n </label>\n </div>\n </div>\n )}\n </div>\n\n {/* 提醒设置 */}\n <div className=\"border-t border-gray-200 pt-4\">\n <h4 className=\"text-sm font-medium text-gray-700 mb-3\">🔔 提醒设置</h4>\n \n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 提醒时间\n </label>\n <div className=\"space-y-2\">\n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={formData.reminderMinutes === 0}\n onChange={(e) => {\n if (e.target.checked) {\n handleInputChange('reminderMinutes', 0);\n } else {\n handleInputChange('reminderMinutes', undefined);\n }\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">事件开始时</span>\n </label>\n \n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={formData.reminderMinutes === 15}\n onChange={(e) => {\n if (e.target.checked) {\n handleInputChange('reminderMinutes', 15);\n } else {\n handleInputChange('reminderMinutes', undefined);\n }\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">提前15分钟</span>\n </label>\n \n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={formData.reminderMinutes === 30}\n onChange={(e) => {\n if (e.target.checked) {\n handleInputChange('reminderMinutes', 30);\n } else {\n handleInputChange('reminderMinutes', undefined);\n }\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">提前30分钟</span>\n </label>\n \n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={formData.reminderMinutes === 60}\n onChange={(e) => {\n if (e.target.checked) {\n handleInputChange('reminderMinutes', 60);\n } else {\n handleInputChange('reminderMinutes', undefined);\n }\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">提前1小时</span>\n </label>\n \n <label className=\"flex items-center\">\n <input\n type=\"checkbox\"\n checked={formData.reminderMinutes === 1440}\n onChange={(e) => {\n if (e.target.checked) {\n handleInputChange('reminderMinutes', 1440);\n } else {\n handleInputChange('reminderMinutes', undefined);\n }\n }}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">提前1天</span>\n </label>\n </div>\n </div>\n </div>\n\n {/* 错误提示 */}\n {errors.submit && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3\">\n <p className=\"text-red-600 text-sm\">{errors.submit}</p>\n </div>\n )}\n\n {/* 操作按钮 */}\n <div className=\"flex justify-between pt-4 border-t border-gray-200\">\n {/* 左侧删除按钮(仅编辑模式显示) */}\n <div>\n {isEditMode && onDelete && (\n <button\n type=\"button\"\n onClick={() => setShowDeleteConfirm(true)}\n className=\"px-4 py-2 text-red-600 border border-red-300 rounded-lg hover:bg-red-50 transition-colors\"\n disabled={isLoading}\n >\n 删除事件\n </button>\n )}\n </div>\n\n {/* 右侧主要操作按钮 */}\n <div className=\"flex space-x-3\">\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"px-4 py-2 text-gray-700 border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n disabled={isLoading}\n >\n 取消\n </button>\n <button\n type=\"submit\"\n disabled={isLoading}\n className=\"px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isLoading ? '保存中...' : (isEditMode ? '更新事件' : '创建事件')}\n </button>\n </div>\n </div>\n\n </form>\n \n {/* 删除确认弹窗 */}\n <ConfirmModal\n isOpen={showDeleteConfirm}\n onClose={() => setShowDeleteConfirm(false)}\n onConfirm={handleDelete}\n title=\"确认删除\"\n message={'确定要删除事件\"' + (formData.title) + '\"吗?此操作无法撤销。'}\n confirmText=\"删除\"\n cancelText=\"取消\"\n isLoading={isLoading}\n />\n </Modal>\n );\n};\n\nexport default EventModal; ","'use client';\n\nimport React, { useState, useCallback, useMemo } from 'react';\nimport { CalendarEvent, EventPriority } from '../types';\nimport { clsx } from 'clsx';\n\ninterface EventSearchProps {\n events: CalendarEvent[];\n onFiltered: (filteredEvents: CalendarEvent[]) => void;\n className?: string;\n}\n\ninterface SearchFilters {\n keyword: string;\n priority: EventPriority | 'all';\n dateRange: {\n start: string;\n end: string;\n };\n colorFilter: string[];\n isAllDay: 'all' | 'yes' | 'no';\n}\n\nconst EventSearch: React.FC<EventSearchProps> = ({\n events,\n onFiltered,\n className = '',\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const [filters, setFilters] = useState<SearchFilters>({\n keyword: '',\n priority: 'all',\n dateRange: {\n start: '',\n end: '',\n },\n colorFilter: [],\n isAllDay: 'all',\n });\n\n // 获取所有可用的颜色\n const availableColors = useMemo(() => {\n const colors = new Set<string>();\n events.forEach(event => {\n if (event.color) colors.add(event.color);\n });\n return Array.from(colors);\n }, [events]);\n\n // 过滤事件\n const filteredEvents = useMemo(() => {\n return events.filter(event => {\n // 关键词搜索\n if (filters.keyword) {\n const keyword = filters.keyword.toLowerCase();\n const matchTitle = event.title.toLowerCase().includes(keyword);\n const matchDescription = event.description?.toLowerCase().includes(keyword) || false;\n const matchLocation = event.location?.toLowerCase().includes(keyword) || false;\n \n if (!matchTitle && !matchDescription && !matchLocation) {\n return false;\n }\n }\n\n // 优先级过滤\n if (filters.priority !== 'all' && event.priority !== filters.priority) {\n return false;\n }\n\n // 日期范围过滤\n if (filters.dateRange.start || filters.dateRange.end) {\n const parts = new Date(event.startTime).toISOString().split('T');\n const eventDate = parts[0];\n \n if (eventDate) {\n if (filters.dateRange.start && eventDate < filters.dateRange.start) {\n return false;\n }\n \n if (filters.dateRange.end && eventDate > filters.dateRange.end) {\n return false;\n }\n }\n }\n\n // 颜色过滤\n if (filters.colorFilter.length > 0 && !filters.colorFilter.includes(event.color || '#3b82f6')) {\n return false;\n }\n\n // 全天事件过滤\n if (filters.isAllDay !== 'all') {\n const isEventAllDay = event.allDay;\n if (filters.isAllDay === 'yes' && !isEventAllDay) return false;\n if (filters.isAllDay === 'no' && isEventAllDay) return false;\n }\n\n return true;\n });\n }, [events, filters]);\n\n // 更新过滤结果\n React.useEffect(() => {\n onFiltered(filteredEvents);\n }, [filteredEvents, onFiltered]);\n\n // 处理过滤器变化\n const handleFilterChange = useCallback((\n key: keyof SearchFilters,\n value: string | string[] | { start: string; end: string }\n ) => {\n setFilters(prev => ({\n ...prev,\n [key]: value,\n }));\n }, []);\n\n // 重置过滤器\n const resetFilters = useCallback(() => {\n setFilters({\n keyword: '',\n priority: 'all',\n dateRange: { start: '', end: '' },\n colorFilter: [],\n isAllDay: 'all',\n });\n }, []);\n\n // 检查是否有活跃的过滤器\n const hasActiveFilters = useMemo(() => {\n return filters.keyword !== '' ||\n filters.priority !== 'all' ||\n filters.dateRange.start !== '' ||\n filters.dateRange.end !== '' ||\n filters.colorFilter.length > 0 ||\n filters.isAllDay !== 'all';\n }, [filters]);\n\n // 获取优先级显示文本\n const getPriorityText = (priority: EventPriority) => {\n const priorityMap = {\n [EventPriority.LOW]: '低',\n [EventPriority.NORMAL]: '普通',\n [EventPriority.HIGH]: '高',\n [EventPriority.URGENT]: '紧急',\n };\n return priorityMap[priority];\n };\n\n return (\n <div className={clsx('bg-white rounded-lg border border-gray-200', className)}>\n {/* 搜索头部 */}\n <div className=\"p-4 border-b border-gray-200\">\n <div className=\"flex items-center space-x-3\">\n {/* 关键词搜索 */}\n <div className=\"flex-1\">\n <div className=\"relative\">\n <input\n type=\"text\"\n placeholder=\"搜索事件标题、描述或位置...\"\n value={filters.keyword}\n onChange={(e) => handleFilterChange('keyword', e.target.value)}\n className=\"w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n />\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg className=\"h-5 w-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n </div>\n </div>\n </div>\n\n {/* 展开/收起按钮 */}\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className={clsx('px-3 py-2 text-sm font-medium rounded-lg transition-colors', hasActiveFilters \n ? 'bg-blue-100 text-blue-700 border border-blue-300' \n : 'bg-gray-100 text-gray-700 border border-gray-300 hover:bg-gray-200')}\n >\n <div className=\"flex items-center space-x-2\">\n <svg \n className={clsx('h-4 w-4 transition-transform', isExpanded ? 'rotate-180' : '')} \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n <span>过滤器</span>\n {hasActiveFilters && (\n <span className=\"inline-flex items-center justify-center w-5 h-5 text-xs font-bold text-white bg-blue-600 rounded-full\">\n {Object.values(filters).filter(v => \n v !== '' && v !== 'all' && \n (Array.isArray(v) ? v.length > 0 : true) &&\n (typeof v === 'object' && !Array.isArray(v) ? v.start !== '' || v.end !== '' : true)\n ).length}\n </span>\n )}\n </div>\n </button>\n\n {/* 重置按钮 */}\n {hasActiveFilters && (\n <button\n type=\"button\"\n onClick={resetFilters}\n className=\"px-3 py-2 text-sm font-medium text-red-600 bg-red-50 border border-red-300 rounded-lg hover:bg-red-100 transition-colors\"\n >\n 重置\n </button>\n )}\n </div>\n\n {/* 搜索结果统计 */}\n <div className=\"mt-3 text-sm text-gray-600\">\n 共找到 <span className=\"font-medium text-gray-900\">{filteredEvents.length}</span> 个事件\n {filteredEvents.length !== events.length && (\n <span className=\"text-gray-500\">(共 {events.length} 个)</span>\n )}\n </div>\n </div>\n\n {/* 高级过滤器 */}\n {isExpanded && (\n <div className=\"p-4 bg-gray-50 border-t border-gray-200\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {/* 优先级过滤 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 优先级\n </label>\n <select\n value={filters.priority}\n onChange={(e) => handleFilterChange('priority', e.target.value as EventPriority | 'all')}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n >\n <option value=\"all\">全部优先级</option>\n <option value={EventPriority.LOW}>{getPriorityText(EventPriority.LOW)}</option>\n <option value={EventPriority.NORMAL}>{getPriorityText(EventPriority.NORMAL)}</option>\n <option value={EventPriority.HIGH}>{getPriorityText(EventPriority.HIGH)}</option>\n <option value={EventPriority.URGENT}>{getPriorityText(EventPriority.URGENT)}</option>\n </select>\n </div>\n\n {/* 全天事件过滤 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 事件类型\n </label>\n <select\n value={filters.isAllDay}\n onChange={(e) => handleFilterChange('isAllDay', e.target.value as 'all' | 'yes' | 'no')}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n >\n <option value=\"all\">全部类型</option>\n <option value=\"yes\">全天事件</option>\n <option value=\"no\">定时事件</option>\n </select>\n </div>\n\n {/* 颜色过滤 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 颜色标签\n </label>\n <div className=\"flex flex-wrap gap-2\">\n {availableColors.map(color => (\n <button\n key={color}\n type=\"button\"\n onClick={() => {\n const newColors = filters.colorFilter.includes(color)\n ? filters.colorFilter.filter(c => c !== color)\n : [...filters.colorFilter, color];\n handleFilterChange('colorFilter', newColors);\n }}\n className={clsx('w-8 h-8 rounded border-2 transition-all', filters.colorFilter.includes(color)\n ? 'border-gray-800 scale-110'\n : 'border-gray-300 hover:border-gray-500')}\n style={{ backgroundColor: color }}\n title={'颜色: ' + (color)}\n />\n ))}\n </div>\n </div>\n\n {/* 日期范围过滤 */}\n <div className=\"md:col-span-2 lg:col-span-3\">\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 日期范围\n </label>\n <div className=\"flex items-center space-x-3\">\n <input\n type=\"date\"\n value={filters.dateRange.start}\n onChange={(e) => handleFilterChange('dateRange', {\n ...filters.dateRange,\n start: e.target.value\n })}\n className=\"px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n />\n <span className=\"text-gray-500\">至</span>\n <input\n type=\"date\"\n value={filters.dateRange.end}\n onChange={(e) => handleFilterChange('dateRange', {\n ...filters.dateRange,\n end: e.target.value\n })}\n className=\"px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\n />\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default EventSearch; ","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { Modal, ConfirmModal } from '@/components';\nimport { EventType, RecurrencePattern, EventData, EventTypeService } from '../services/eventTypeService';\nimport { CalendarEvent, EventPriority } from '../types';\nimport { clsx } from 'clsx';\n\ninterface ImprovedEventModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSave: (eventData: EventData) => Promise<void>;\n onDelete?: (eventId: number) => Promise<void>;\n event?: CalendarEvent | null;\n initialDate?: Date;\n}\n\nconst ImprovedEventModal: React.FC<ImprovedEventModalProps> = ({\n isOpen,\n onClose,\n onSave,\n onDelete,\n event,\n initialDate,\n}) => {\n const [eventType, setEventType] = useState<EventType>(EventType.SINGLE);\n const [formData, setFormData] = useState({\n // 基础信息\n title: '',\n description: '',\n location: '',\n color: '#3b82f6',\n priority: EventPriority.NORMAL,\n allDay: false,\n \n // 单次事件\n startTime: '',\n endTime: '',\n \n // 多天事件\n startDate: '',\n endDate: '',\n dailyStartTime: '09:00',\n dailyEndTime: '17:00',\n \n // 重复事件\n recurrenceStartDate: '',\n recurrenceStartTime: '',\n recurrenceEndTime: '',\n recurrencePattern: RecurrencePattern.DAILY,\n recurrenceInterval: 1,\n recurrenceEndDate: '',\n recurrenceCount: 0,\n useEndDate: true, // true: 使用结束日期, false: 使用重复次数\n });\n\n const [isLoading, setIsLoading] = useState(false);\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n const isEditMode = !!event;\n\n // 初始化表单数据\n useEffect(() => {\n if (event) {\n // 编辑模式:使用现有事件数据\n const startDate = new Date(event.startTime);\n const endDate = new Date(event.endTime);\n \n setEventType(EventType.SINGLE); // 默认为单次事件\n setFormData({\n title: event.title,\n description: event.description || '',\n location: event.location || '',\n color: event.color || '#3b82f6',\n priority: event.priority || EventPriority.NORMAL,\n allDay: event.allDay,\n startTime: formatDateTimeLocal(startDate),\n endTime: formatDateTimeLocal(endDate),\n startDate: formatDateOnly(startDate),\n endDate: formatDateOnly(endDate),\n dailyStartTime: formatTimeOnly(startDate),\n dailyEndTime: formatTimeOnly(endDate),\n recurrenceStartDate: formatDateOnly(startDate),\n recurrenceStartTime: formatDateTimeLocal(startDate),\n recurrenceEndTime: formatDateTimeLocal(endDate),\n recurrencePattern: RecurrencePattern.DAILY,\n recurrenceInterval: 1,\n recurrenceEndDate: '',\n recurrenceCount: 0,\n useEndDate: true,\n });\n } else if (initialDate) {\n // 创建模式:使用初始日期\n const startDateTime = new Date(initialDate);\n startDateTime.setHours(9, 0, 0, 0);\n \n const endDateTime = new Date(startDateTime);\n endDateTime.setHours(10, 0, 0, 0);\n \n setFormData(prev => ({\n ...prev,\n startTime: formatDateTimeLocal(startDateTime),\n endTime: formatDateTimeLocal(endDateTime),\n startDate: formatDateOnly(startDateTime),\n endDate: formatDateOnly(startDateTime),\n recurrenceStartDate: formatDateOnly(startDateTime),\n recurrenceStartTime: formatDateTimeLocal(startDateTime),\n recurrenceEndTime: formatDateTimeLocal(endDateTime),\n }));\n }\n }, [event, initialDate]);\n\n // 格式化函数\n const formatDateTimeLocal = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n return (year) + '-' + (month) + '-' + (day) + 'T' + (hours) + ':' + (minutes);\n };\n\n const formatDateOnly = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return (year) + '-' + (month) + '-' + (day);\n };\n\n const formatTimeOnly = (date: Date): string => {\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n return (hours) + ':' + (minutes);\n };\n\n // 构建事件数据\n const buildEventData = (): EventData => {\n switch (eventType) {\n case EventType.SINGLE:\n return {\n type: EventType.SINGLE,\n title: formData.title.trim(),\n description: formData.description.trim() || undefined,\n location: formData.location.trim() || undefined,\n color: formData.color,\n priority: formData.priority,\n allDay: formData.allDay,\n startTime: new Date(formData.startTime),\n endTime: new Date(formData.endTime),\n };\n\n case EventType.MULTI_DAY:\n return {\n type: EventType.MULTI_DAY,\n title: formData.title.trim(),\n description: formData.description.trim() || undefined,\n location: formData.location.trim() || undefined,\n color: formData.color,\n priority: formData.priority,\n allDay: formData.allDay,\n startDate: new Date(formData.startDate),\n endDate: new Date(formData.endDate),\n startTime: formData.allDay ? undefined : formData.dailyStartTime,\n endTime: formData.allDay ? undefined : formData.dailyEndTime,\n };\n\n case EventType.RECURRING:\n return {\n type: EventType.RECURRING,\n title: formData.title.trim(),\n description: formData.description.trim() || undefined,\n location: formData.location.trim() || undefined,\n color: formData.color,\n priority: formData.priority,\n allDay: formData.allDay,\n startDate: new Date(formData.recurrenceStartDate),\n startTime: new Date(formData.recurrenceStartTime),\n endTime: new Date(formData.recurrenceEndTime),\n recurrence: {\n pattern: formData.recurrencePattern,\n interval: formData.recurrenceInterval,\n endDate: formData.useEndDate && formData.recurrenceEndDate ? new Date(formData.recurrenceEndDate) : undefined,\n count: !formData.useEndDate && formData.recurrenceCount > 0 ? formData.recurrenceCount : undefined,\n },\n };\n\n default:\n throw new Error('不支持的事件类型: ' + (eventType));\n }\n };\n\n // 验证表单\n const validateForm = (): boolean => {\n const eventData = buildEventData();\n const validationErrors = EventTypeService.validateEventData(eventData);\n \n const newErrors: Record<string, string> = {};\n validationErrors.forEach(error => {\n newErrors.general = error;\n });\n\n setErrors(newErrors);\n return validationErrors.length === 0;\n };\n\n // 处理表单提交\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n \n if (!validateForm()) {\n return;\n }\n\n setIsLoading(true);\n \n try {\n const eventData = buildEventData();\n await onSave(eventData);\n onClose();\n } catch (error) {\n console.error('保存事件失败:', error);\n setErrors({ submit: '保存事件失败,请重试' });\n } finally {\n setIsLoading(false);\n }\n };\n\n // 处理输入变化\n const handleInputChange = (\n field: keyof typeof formData,\n value: string | boolean | number\n ) => {\n setFormData(prev => ({ ...prev, [field]: value }));\n \n // 清除错误\n if (errors[field]) {\n setErrors(prev => ({ ...prev, [field]: '' }));\n }\n };\n\n // 处理事件删除\n const handleDelete = async () => {\n if (!event?.id || !onDelete) return;\n \n setIsLoading(true);\n try {\n await onDelete(event.id);\n setShowDeleteConfirm(false);\n onClose();\n } catch (error) {\n console.error('删除事件失败:', error);\n setErrors({ submit: '删除事件失败,请重试' });\n } finally {\n setIsLoading(false);\n }\n };\n\n // 重置表单\n const handleClose = () => {\n setErrors({});\n onClose();\n };\n\n // 渲染事件类型选择器\n const renderEventTypeSelector = () => (\n <div className=\"space-y-4\">\n <div className=\"flex items-center space-x-2\">\n <span className=\"text-lg\">🎯</span>\n <label className=\"text-base font-medium text-gray-900\">\n 选择事件类型\n </label>\n </div>\n \n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <button\n type=\"button\"\n onClick={() => setEventType(EventType.SINGLE)}\n className={clsx('group relative p-4 rounded-xl border-2 transition-all duration-300 transform hover:scale-105', eventType === EventType.SINGLE\n ? 'bg-gradient-to-br from-blue-50 to-blue-100 border-blue-300 shadow-lg ring-2 ring-blue-200'\n : 'bg-white border-gray-200 hover:bg-gray-50 hover:border-gray-300 shadow-sm hover:shadow-md')}\n >\n <div className=\"text-center\">\n <div className={clsx('text-3xl mb-2 transition-transform duration-300', eventType === EventType.SINGLE ? 'scale-110' : 'group-hover:scale-110')}>\n 📅\n </div>\n <div className={clsx('font-semibold mb-1', eventType === EventType.SINGLE ? 'text-blue-700' : 'text-gray-900')}>\n 单次事件\n </div>\n <div className=\"text-xs text-gray-500\">\n 一次性事件\n </div>\n </div>\n {eventType === EventType.SINGLE && (\n <div className=\"absolute top-2 right-2\">\n <div className=\"w-6 h-6 bg-blue-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-sm\">✓</span>\n </div>\n </div>\n )}\n </button>\n\n <button\n type=\"button\"\n onClick={() => setEventType(EventType.MULTI_DAY)}\n className={clsx('group relative p-4 rounded-xl border-2 transition-all duration-300 transform hover:scale-105', eventType === EventType.MULTI_DAY\n ? 'bg-gradient-to-br from-green-50 to-green-100 border-green-300 shadow-lg ring-2 ring-green-200'\n : 'bg-white border-gray-200 hover:bg-gray-50 hover:border-gray-300 shadow-sm hover:shadow-md')}\n >\n <div className=\"text-center\">\n <div className={clsx('text-3xl mb-2 transition-transform duration-300', eventType === EventType.MULTI_DAY ? 'scale-110' : 'group-hover:scale-110')}>\n 🗓️\n </div>\n <div className={clsx('font-semibold mb-1', eventType === EventType.MULTI_DAY ? 'text-green-700' : 'text-gray-900')}>\n 多天事件\n </div>\n <div className=\"text-xs text-gray-500\">\n 连续多天\n </div>\n </div>\n {eventType === EventType.MULTI_DAY && (\n <div className=\"absolute top-2 right-2\">\n <div className=\"w-6 h-6 bg-green-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-sm\">✓</span>\n </div>\n </div>\n )}\n </button>\n\n <button\n type=\"button\"\n onClick={() => setEventType(EventType.RECURRING)}\n className={clsx('group relative p-4 rounded-xl border-2 transition-all duration-300 transform hover:scale-105', eventType === EventType.RECURRING\n ? 'bg-gradient-to-br from-purple-50 to-purple-100 border-purple-300 shadow-lg ring-2 ring-purple-200'\n : 'bg-white border-gray-200 hover:bg-gray-50 hover:border-gray-300 shadow-sm hover:shadow-md')}\n >\n <div className=\"text-center\">\n <div className={clsx('text-3xl mb-2 transition-transform duration-300', eventType === EventType.RECURRING ? 'scale-110' : 'group-hover:scale-110')}>\n 🔄\n </div>\n <div className={clsx('font-semibold mb-1', eventType === EventType.RECURRING ? 'text-purple-700' : 'text-gray-900')}>\n 重复事件\n </div>\n <div className=\"text-xs text-gray-500\">\n 周期性重复\n </div>\n </div>\n {eventType === EventType.RECURRING && (\n <div className=\"absolute top-2 right-2\">\n <div className=\"w-6 h-6 bg-purple-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-sm\">✓</span>\n </div>\n </div>\n )}\n </button>\n </div>\n \n {/* 事件类型说明 */}\n <div className={clsx('p-4 rounded-lg transition-all duration-300', eventType === EventType.SINGLE ? 'bg-blue-50 border border-blue-200' :\n eventType === EventType.MULTI_DAY ? 'bg-green-50 border border-green-200' :\n 'bg-purple-50 border border-purple-200')}>\n <div className=\"flex items-start space-x-3\">\n <div className=\"flex-shrink-0 mt-0.5\">\n <span className=\"text-lg\">\n {eventType === EventType.SINGLE ? '💡' :\n eventType === EventType.MULTI_DAY ? '📋' : '🔔'}\n </span>\n </div>\n <div>\n {eventType === EventType.SINGLE && (\n <>\n <h4 className=\"font-medium text-blue-800 mb-1\">单次事件</h4>\n <p className=\"text-sm text-blue-700\">\n 在指定的时间发生一次的事件,如会议、约会、面试等。适合一次性的活动安排。\n </p>\n </>\n )}\n {eventType === EventType.MULTI_DAY && (\n <>\n <h4 className=\"font-medium text-green-800 mb-1\">多天事件</h4>\n <p className=\"text-sm text-green-700\">\n 持续多天的单个事件,如培训课程、会议、假期等。例如:3天的培训课程或1周的假期。\n </p>\n </>\n )}\n {eventType === EventType.RECURRING && (\n <>\n <h4 className=\"font-medium text-purple-800 mb-1\">重复事件</h4>\n <p className=\"text-sm text-purple-700\">\n 按照规律重复发生的事件,如每天的晨会、每周的例会、每月的总结等。系统会自动创建多个事件实例。\n </p>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n\n // 渲染基础信息表单\n const renderBasicForm = () => (\n <div className=\"space-y-6\">\n {/* 事件标题 */}\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-gray-900 mb-3\">\n <span className=\"text-lg\">📝</span>\n <span>事件标题</span>\n <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <input\n type=\"text\"\n value={formData.title}\n onChange={(e) => handleInputChange('title', e.target.value)}\n className=\"w-full px-4 py-3 border-2 border-gray-200 rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all duration-200 placeholder-gray-400 text-gray-900 bg-white hover:border-gray-300\"\n placeholder=\"为你的事件起个名字...\"\n />\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3\">\n <div className={clsx('w-2 h-2 rounded-full transition-colors duration-200', formData.title.trim() ? 'bg-green-400' : 'bg-gray-300')}></div>\n </div>\n </div>\n {errors.title && (\n <div className=\"flex items-center space-x-2 mt-2\">\n <span className=\"text-red-500 text-sm\">⚠️</span>\n <p className=\"text-sm text-red-600\">{errors.title}</p>\n </div>\n )}\n </div>\n\n {/* 事件描述 */}\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-gray-900 mb-3\">\n <span className=\"text-lg\">📄</span>\n <span>事件描述</span>\n </label>\n <textarea\n value={formData.description}\n onChange={(e) => handleInputChange('description', e.target.value)}\n rows={4}\n className=\"w-full px-4 py-3 border-2 border-gray-200 rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all duration-200 placeholder-gray-400 text-gray-900 bg-white hover:border-gray-300 resize-none\"\n placeholder=\"描述一下这个事件的详细信息...\"\n />\n <div className=\"flex justify-between items-center mt-2\">\n <div className=\"text-xs text-gray-500\">\n {formData.description.length > 0 && '已输入 ' + (formData.description.length) + ' 个字符'}\n </div>\n </div>\n </div>\n\n {/* 地点 */}\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-gray-900 mb-3\">\n <span className=\"text-lg\">📍</span>\n <span>地点</span>\n </label>\n <div className=\"relative\">\n <input\n type=\"text\"\n value={formData.location}\n onChange={(e) => handleInputChange('location', e.target.value)}\n className=\"w-full px-4 py-3 border-2 border-gray-200 rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all duration-200 placeholder-gray-400 text-gray-900 bg-white hover:border-gray-300\"\n placeholder=\"事件举办地点...\"\n />\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3\">\n <div className={clsx('w-2 h-2 rounded-full transition-colors duration-200', formData.location.trim() ? 'bg-green-400' : 'bg-gray-300')}></div>\n </div>\n </div>\n </div>\n\n {/* 全天事件开关 */}\n <div className=\"bg-gray-50 rounded-xl p-4\">\n <label className=\"flex items-center justify-between cursor-pointer group\">\n <div className=\"flex items-center space-x-3\">\n <span className=\"text-lg\">🌅</span>\n <div>\n <div className=\"text-sm font-medium text-gray-900\">全天事件</div>\n <div className=\"text-xs text-gray-500\">不设置具体时间,整天有效</div>\n </div>\n </div>\n <div className=\"relative\">\n <input\n type=\"checkbox\"\n id=\"allDay\"\n checked={formData.allDay}\n onChange={(e) => handleInputChange('allDay', e.target.checked)}\n className=\"sr-only\"\n />\n <div className={clsx('w-12 h-6 rounded-full transition-colors duration-200', formData.allDay ? 'bg-blue-500' : 'bg-gray-300')}>\n <div className={clsx('w-5 h-5 bg-white rounded-full shadow-md transform transition-transform duration-200', formData.allDay ? 'translate-x-6' : 'translate-x-0.5', 'translate-y-0.5')}></div>\n </div>\n </div>\n </label>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {/* 颜色选择器 */}\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-gray-900 mb-3\">\n <span className=\"text-lg\">🎨</span>\n <span>事件颜色</span>\n </label>\n <div className=\"space-y-3\">\n <div className=\"flex items-center space-x-3\">\n <div \n className=\"w-12 h-12 rounded-xl border-2 border-gray-200 flex items-center justify-center cursor-pointer hover:scale-105 transition-transform duration-200 shadow-sm\"\n style={{ backgroundColor: formData.color }}\n >\n <input\n type=\"color\"\n value={formData.color}\n onChange={(e) => handleInputChange('color', e.target.value)}\n className=\"w-8 h-8 border-none rounded-lg cursor-pointer opacity-0 absolute\"\n />\n </div>\n <div className=\"flex-1\">\n <div className=\"text-sm font-medium text-gray-900\" style={{ color: formData.color }}>\n {formData.color.toUpperCase()}\n </div>\n <div className=\"text-xs text-gray-500\">点击色块选择颜色</div>\n </div>\n </div>\n \n {/* 预设颜色 */}\n <div className=\"flex space-x-2\">\n {['#3b82f6', '#ef4444', '#10b981', '#f59e0b', '#8b5cf6', '#ec4899'].map((color) => (\n <button\n key={color}\n type=\"button\"\n onClick={() => handleInputChange('color', color)}\n className={clsx('w-8 h-8 rounded-lg border-2 hover:scale-105 transition-all duration-200', formData.color === color ? 'border-gray-400 ring-2 ring-gray-200' : 'border-gray-200')}\n style={{ backgroundColor: color }}\n />\n ))}\n </div>\n </div>\n </div>\n\n {/* 优先级选择器 */}\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-gray-900 mb-3\">\n <span className=\"text-lg\">⭐</span>\n <span>优先级</span>\n </label>\n <div className=\"space-y-2\">\n {[\n { value: EventPriority.LOW, label: '低', icon: '📘', color: 'text-blue-600 bg-blue-50 border-blue-200' },\n { value: EventPriority.NORMAL, label: '普通', icon: '📗', color: 'text-green-600 bg-green-50 border-green-200' },\n { value: EventPriority.HIGH, label: '高', icon: '📙', color: 'text-yellow-600 bg-yellow-50 border-yellow-200' },\n { value: EventPriority.URGENT, label: '紧急', icon: '📕', color: 'text-red-600 bg-red-50 border-red-200' }\n ].map((priority) => (\n <label key={priority.value} className=\"flex items-center cursor-pointer group\">\n <input\n type=\"radio\"\n name=\"priority\"\n value={priority.value}\n checked={formData.priority === priority.value}\n onChange={(e) => handleInputChange('priority', e.target.value as EventPriority)}\n className=\"sr-only\"\n />\n <div className={clsx('flex items-center space-x-3 px-3 py-2 rounded-lg border-2 transition-all duration-200 flex-1', formData.priority === priority.value \n ? priority.color + ' ring-2 ring-opacity-20'\n : 'text-gray-600 bg-white border-gray-200 hover:bg-gray-50')}>\n <span className=\"text-lg\">{priority.icon}</span>\n <span className=\"text-sm font-medium\">{priority.label}</span>\n {formData.priority === priority.value && (\n <span className=\"ml-auto text-sm\">✓</span>\n )}\n </div>\n </label>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n\n // 渲染单次事件表单\n const renderSingleEventForm = () => (\n <div className=\"space-y-6\">\n {!formData.allDay && (\n <div className=\"bg-blue-50 rounded-xl p-4 border border-blue-200\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-blue-900 mb-3\">\n <span className=\"text-lg\">🕐</span>\n <span>开始时间</span>\n <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <input\n type=\"datetime-local\"\n value={formData.startTime}\n onChange={(e) => handleInputChange('startTime', e.target.value)}\n className=\"w-full px-4 py-3 border-2 border-blue-200 rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all duration-200 text-gray-900 bg-white hover:border-blue-300\"\n />\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3\">\n <span className=\"text-blue-500 text-sm\">📅</span>\n </div>\n </div>\n </div>\n\n <div className=\"group\">\n <label className=\"flex items-center space-x-2 text-sm font-medium text-blue-900 mb-3\">\n <span className=\"text-lg\">🕕</span>\n <span>结束时间</span>\n <span className=\"text-red-500\">*</span>\n </label>\n <div className=\"relative\">\n <input\n type=\"datetime-local\"\n value={formData.endTime}\n onChange={(e) => handleInputChange('endTime', e.target.value)}\n className=\"w-full px-4 py-3 border-2 border-blue-200 rounded-xl focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all duration-200 text-gray-900 bg-white hover:border-blue-300\"\n />\n <div className=\"absolute inset-y-0 right-0 flex items-center pr-3\">\n <span className=\"text-blue-500 text-sm\">📅</span>\n </div>\n </div>\n </div>\n </div>\n \n <div className=\"mt-4 p-3 bg-blue-100 rounded-lg\">\n <div className=\"flex items-start space-x-2\">\n <span className=\"text-blue-600 text-sm\">💡</span>\n <div className=\"text-xs text-blue-700\">\n <strong>提示:</strong>单次事件在指定的时间段内发生一次。请确保结束时间晚于开始时间。\n </div>\n </div>\n </div>\n </div>\n )}\n \n {formData.allDay && (\n <div className=\"bg-amber-50 rounded-xl p-4 border border-amber-200\">\n <div className=\"flex items-center space-x-3\">\n <span className=\"text-2xl\">🌅</span>\n <div>\n <h4 className=\"font-medium text-amber-800\">全天事件模式</h4>\n <p className=\"text-sm text-amber-700 mt-1\">\n 此事件将持续整天,无需设置具体时间。事件将在选定日期的全天显示。\n </p>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n\n // 渲染多天事件表单\n const renderMultiDayEventForm = () => (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 开始日期 *\n </label>\n <input\n type=\"date\"\n value={formData.startDate}\n onChange={(e) => handleInputChange('startDate', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 结束日期 *\n </label>\n <input\n type=\"date\"\n value={formData.endDate}\n onChange={(e) => handleInputChange('endDate', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n\n {!formData.allDay && (\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 每日开始时间\n </label>\n <input\n type=\"time\"\n value={formData.dailyStartTime}\n onChange={(e) => handleInputChange('dailyStartTime', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 每日结束时间\n </label>\n <input\n type=\"time\"\n value={formData.dailyEndTime}\n onChange={(e) => handleInputChange('dailyEndTime', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n )}\n\n <div className=\"p-3 bg-blue-50 rounded-lg text-sm text-blue-700\">\n <strong>示例</strong>:如果您要创建一个从21号到23号的培训课程,系统将在这三天内每天都创建一个事件实例。\n </div>\n </div>\n );\n\n // 渲染重复事件表单\n const renderRecurringEventForm = () => (\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 开始日期 *\n </label>\n <input\n type=\"date\"\n value={formData.recurrenceStartDate}\n onChange={(e) => handleInputChange('recurrenceStartDate', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n\n {!formData.allDay && (\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 开始时间 *\n </label>\n <input\n type=\"datetime-local\"\n value={formData.recurrenceStartTime}\n onChange={(e) => handleInputChange('recurrenceStartTime', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 结束时间 *\n </label>\n <input\n type=\"datetime-local\"\n value={formData.recurrenceEndTime}\n onChange={(e) => handleInputChange('recurrenceEndTime', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n )}\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 重复模式 *\n </label>\n <select\n value={formData.recurrencePattern}\n onChange={(e) => handleInputChange('recurrencePattern', e.target.value as RecurrencePattern)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n >\n <option value={RecurrencePattern.DAILY}>每天</option>\n <option value={RecurrencePattern.WEEKLY}>每周</option>\n <option value={RecurrencePattern.MONTHLY}>每月</option>\n <option value={RecurrencePattern.YEARLY}>每年</option>\n </select>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 重复间隔\n </label>\n <input\n type=\"number\"\n min=\"1\"\n max=\"365\"\n value={formData.recurrenceInterval}\n onChange={(e) => handleInputChange('recurrenceInterval', parseInt(e.target.value) || 1)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n </div>\n </div>\n\n {/* 结束条件 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n 结束条件\n </label>\n <div className=\"space-y-3\">\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n checked={formData.useEndDate}\n onChange={() => handleInputChange('useEndDate', true)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">结束日期</span>\n </label>\n \n {formData.useEndDate && (\n <input\n type=\"date\"\n value={formData.recurrenceEndDate}\n onChange={(e) => handleInputChange('recurrenceEndDate', e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n )}\n\n <label className=\"flex items-center\">\n <input\n type=\"radio\"\n checked={!formData.useEndDate}\n onChange={() => handleInputChange('useEndDate', false)}\n className=\"h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300\"\n />\n <span className=\"ml-2 text-sm text-gray-700\">重复次数</span>\n </label>\n \n {!formData.useEndDate && (\n <input\n type=\"number\"\n min=\"1\"\n max=\"999\"\n value={formData.recurrenceCount}\n onChange={(e) => handleInputChange('recurrenceCount', parseInt(e.target.value) || 0)}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n placeholder=\"输入重复次数\"\n />\n )}\n </div>\n </div>\n\n <div className=\"p-3 bg-purple-50 rounded-lg text-sm text-purple-700\">\n <strong>示例</strong>:选择\"每天重复3次\"将创建3个独立的事件实例,分别在连续的3天发生。\n </div>\n </div>\n );\n\n return (\n <>\n <Modal isOpen={isOpen} onClose={handleClose} width=\"800px\" height=\"auto\">\n <div className=\"relative\">\n {/* 头部 */}\n <div className=\"px-6 py-4 border-b border-gray-200 bg-gradient-to-r from-blue-50 to-indigo-50\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"w-10 h-10 bg-blue-100 rounded-full flex items-center justify-center\">\n <span className=\"text-blue-600 text-lg\">\n {isEditMode ? '✏️' : '➕'}\n </span>\n </div>\n <div>\n <h2 className=\"text-xl font-semibold text-gray-900\">\n {isEditMode ? '编辑事件' : '创建新事件'}\n </h2>\n <p className=\"text-sm text-gray-600\">\n {isEditMode ? '修改事件信息' : '填写事件详细信息'}\n </p>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"w-8 h-8 flex items-center justify-center rounded-full hover:bg-gray-100 transition-colors\"\n >\n <span className=\"text-gray-400 text-xl\">×</span>\n </button>\n </div>\n </div>\n\n {/* 表单内容 */}\n <div className=\"px-6 py-6 max-h-[70vh] overflow-y-auto\">\n <form onSubmit={handleSubmit} className=\"space-y-8\">\n {/* 事件类型选择器 */}\n {!isEditMode && (\n <div className=\"bg-gray-50 rounded-lg p-4\">\n {renderEventTypeSelector()}\n </div>\n )}\n\n {/* 基础信息 */}\n <div className=\"space-y-6\">\n <div className=\"flex items-center space-x-2 mb-4\">\n <div className=\"w-1 h-6 bg-blue-500 rounded-full\"></div>\n <h3 className=\"text-lg font-medium text-gray-900\">基本信息</h3>\n </div>\n {renderBasicForm()}\n </div>\n\n {/* 时间设置 */}\n <div className=\"space-y-6\">\n <div className=\"flex items-center space-x-2 mb-4\">\n <div className=\"w-1 h-6 bg-green-500 rounded-full\"></div>\n <h3 className=\"text-lg font-medium text-gray-900\">时间设置</h3>\n </div>\n {eventType === EventType.SINGLE && renderSingleEventForm()}\n {eventType === EventType.MULTI_DAY && renderMultiDayEventForm()}\n {eventType === EventType.RECURRING && renderRecurringEventForm()}\n </div>\n\n {/* 错误提示 */}\n {(errors.general || errors.submit) && (\n <div className=\"space-y-3\">\n {errors.general && (\n <div className=\"flex items-start space-x-3 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <div className=\"flex-shrink-0\">\n <span className=\"text-red-500 text-lg\">⚠️</span>\n </div>\n <div>\n <h4 className=\"text-sm font-medium text-red-800\">表单验证错误</h4>\n <p className=\"text-sm text-red-600 mt-1\">{errors.general}</p>\n </div>\n </div>\n )}\n\n {errors.submit && (\n <div className=\"flex items-start space-x-3 p-4 bg-red-50 border border-red-200 rounded-lg\">\n <div className=\"flex-shrink-0\">\n <span className=\"text-red-500 text-lg\">❌</span>\n </div>\n <div>\n <h4 className=\"text-sm font-medium text-red-800\">保存失败</h4>\n <p className=\"text-sm text-red-600 mt-1\">{errors.submit}</p>\n </div>\n </div>\n )}\n </div>\n )}\n </form>\n </div>\n\n {/* 底部操作栏 */}\n <div className=\"px-6 py-4 border-t border-gray-200 bg-gray-50\">\n <div className=\"flex items-center justify-between\">\n <div>\n {isEditMode && onDelete && (\n <button\n type=\"button\"\n onClick={() => setShowDeleteConfirm(true)}\n className=\"inline-flex items-center px-4 py-2 text-sm font-medium text-red-600 bg-white border border-red-300 rounded-lg hover:bg-red-50 hover:border-red-400 transition-all duration-200 shadow-sm hover:shadow-md\"\n >\n <span className=\"mr-2\">🗑️</span>\n 删除事件\n </button>\n )}\n </div>\n\n <div className=\"flex items-center space-x-3\">\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"inline-flex items-center px-6 py-2.5 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 hover:border-gray-400 transition-all duration-200 shadow-sm hover:shadow-md\"\n >\n 取消\n </button>\n <button\n type=\"submit\"\n disabled={isLoading}\n onClick={handleSubmit}\n className=\"inline-flex items-center px-6 py-2.5 text-sm font-medium text-white bg-gradient-to-r from-blue-600 to-blue-700 border border-blue-600 rounded-lg hover:from-blue-700 hover:to-blue-800 disabled:opacity-50 disabled:cursor-not-allowed transition-all duration-200 shadow-md hover:shadow-lg transform hover:-translate-y-0.5\"\n >\n {isLoading && (\n <div className=\"mr-2 w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin\"></div>\n )}\n <span className=\"mr-2\">{isEditMode ? '💾' : '✨'}</span>\n {isLoading ? '保存中...' : (isEditMode ? '更新事件' : '创建事件')}\n </button>\n </div>\n </div>\n </div>\n </div>\n </Modal>\n\n {/* 删除确认弹窗 */}\n <ConfirmModal\n isOpen={showDeleteConfirm}\n onClose={() => setShowDeleteConfirm(false)}\n onConfirm={handleDelete}\n title=\"确认删除\"\n message=\"确定要删除这个事件吗?此操作无法撤销。\"\n confirmText=\"删除\"\n cancelText=\"取消\"\n isLoading={isLoading}\n />\n </>\n );\n};\n\nexport default ImprovedEventModal; ","'use client';\n\nimport React, { ReactNode, useEffect } from 'react';\n\ninterface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n children: ReactNode;\n width?: string | number;\n height?: string | number;\n maskClosable?: boolean;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n children,\n width = 600,\n maskClosable = true,\n}) => {\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = 'unset';\n }\n return () => {\n document.body.style.overflow = 'unset';\n };\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-[50] flex items-center justify-center p-4\">\n <div \n className=\"fixed inset-0 bg-black/50 transition-opacity\" \n onClick={() => maskClosable && onClose()}\n />\n <div \n className=\"bg-white rounded-xl shadow-2xl z-[10] overflow-hidden flex flex-col transition-all transform scale-100\"\n style={{ width: typeof width === 'number' ? (width) + 'px' : width, maxWidth: '100%' }}\n >\n {title && (\n <div className=\"px-6 py-4 border-b border-gray-200 flex justify-between items-center\">\n <h3 className=\"text-xl font-semibold text-gray-900\">{title}</h3>\n <button onClick={onClose} className=\"text-gray-400 hover:text-gray-600 transition-colors\">\n <span className=\"text-2xl\">×</span>\n </button>\n </div>\n )}\n <div className=\"flex-1 overflow-y-auto\">\n {children}\n </div>\n </div>\n </div>\n );\n};\n\ninterface ConfirmModalProps {\n isOpen: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n message: string;\n confirmText?: string;\n cancelText?: string;\n isLoading?: boolean;\n}\n\nexport const ConfirmModal: React.FC<ConfirmModalProps> = ({\n isOpen,\n onClose,\n onConfirm,\n title,\n message,\n confirmText = '确定',\n cancelText = '取消',\n isLoading = false,\n}) => {\n if (!isOpen) return null;\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} title={title} width={400}>\n <div className=\"p-6\">\n <p className=\"text-gray-600 mb-6\">{message}</p>\n <div className=\"flex justify-end space-x-3\">\n <button\n onClick={onClose}\n className=\"px-4 py-2 text-gray-700 border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\n disabled={isLoading}\n >\n {cancelText}\n </button>\n <button\n onClick={onConfirm}\n className=\"px-4 py-2 bg-red-600 text-white rounded-lg hover:bg-red-700 transition-colors flex items-center\"\n disabled={isLoading}\n >\n {isLoading && (\n <div className=\"mr-2 w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin\" />\n )}\n {confirmText}\n </button>\n </div>\n </div>\n </Modal>\n );\n};\n\n\n\n\n\n\n","'use client';\n\nimport React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport { Settings, Calendar, List, Cog, User } from 'lucide-react';\nimport { clsx } from 'clsx';\nimport { \n CalendarViewType, \n EventColor,\n EventFormData,\n CreateEventRequest,\n UpdateEventRequest,\n EventListDisplayMode,\n EventSortField,\n SortDirection,\n EventPriority,\n EventListConfig,\n formatDate,\n getMonthViewDates,\n getWeekViewDates,\n isToday,\n isSameMonth,\n isSameWeek,\n addDays,\n addWeeks,\n useEvents,\n getWeekdayName\n} from '../index';\nimport EventModal from '../components/EventModal';\nimport EventList from '../components/EventList';\nimport { useEnhancedEvents } from '../hooks/useEnhancedEvents';\nimport { EventData } from '../services/eventTypeService';\nimport ImprovedEventModal from '../components/ImprovedEventModal';\nimport DraggableMonthView from '../components/DraggableMonthView';\nimport CalendarSettings from '../components/CalendarSettings';\nimport type { CalendarSettings as CalendarSettingsType } from '../components/CalendarSettings';\n\ninterface CalendarPageProps {\n /** 当前登录用户信息 */\n user?: { id: number; name?: string; [key: string]: any } | null;\n /** 是否已认证 */\n isAuthenticated?: boolean;\n /** 触发登录的回调 */\n onShowLogin?: () => void;\n /** 自定义页头操作区域(例如用户菜单) */\n headerActions?: React.ReactNode;\n}\n\n/**\n * 基础日历页面组件\n * \n * 这是一个简化版本的日历页面,用于在实验田中展示基本功能\n * 包含了基本的月历视图和事件显示\n */\nexport function CalendarPage({ \n user, \n isAuthenticated = true, \n onShowLogin,\n headerActions\n}: CalendarPageProps) {\n const [currentDate, setCurrentDate] = useState(new Date());\n const [viewType, setViewType] = useState<CalendarViewType>(CalendarViewType.MONTH);\n const [isEventModalOpen, setIsEventModalOpen] = useState(false);\n const [selectedDate, setSelectedDate] = useState<Date | null>(null);\n const [editingEvent, setEditingEvent] = useState<any>(null);\n const [activeTab, setActiveTab] = useState<'calendar' | 'events' | 'settings'>('calendar');\n \n // 日历设置状态\n const [calendarSettings, setCalendarSettings] = useState<CalendarSettingsType | null>(null);\n \n // 事件列表配置\n const [eventListConfig, setEventListConfig] = useState<EventListConfig>({\n displayMode: EventListDisplayMode.LIST,\n sort: {\n field: EventSortField.START_TIME,\n direction: SortDirection.ASC\n },\n filter: {},\n pageSize: 10,\n currentPage: 1\n });\n \n // 使用事件 management Hook\n const { \n events, \n loading, \n error, \n createEvent, \n createEnhancedEvent,\n updateEvent,\n updateEventTime,\n deleteEvent,\n batchDeleteEvents,\n fetchEvents, \n clearError \n } = useEnhancedEvents();\n\n // 获取当前月份的日期数组\n const monthDates = useMemo(() => getMonthViewDates(currentDate), [currentDate]);\n\n // 加载当前月份的事件(包含月视图中显示的相邻月份日期)\n useEffect(() => {\n // 获取月视图显示的所有日期范围(包括上月末和下月初)\n const viewDates = getMonthViewDates(currentDate);\n const viewStart = viewDates[0]; // 第一个日期\n const viewEnd = viewDates[viewDates.length - 1]; // 最后一个日期\n \n if (viewStart && viewEnd) {\n console.log('📅 加载月视图事件范围:', {\n currentMonth: (currentDate.getFullYear()) + '-' + (currentDate.getMonth() + 1),\n viewStart: formatDate(viewStart),\n viewEnd: formatDate(viewEnd),\n totalDays: viewDates.length\n });\n \n fetchEvents(viewStart, viewEnd).catch(err => {\n console.error('加载事件失败:', err);\n });\n }\n }, [currentDate, fetchEvents]);\n\n // 示例事件数据 - 当没有实际事件时显示\n const sampleEvents = useMemo(() => [\n { date: '2024-12-15', title: '团队会议', color: 'blue' },\n { date: '2024-12-20', title: '项目评审', color: 'green' },\n { date: '2024-12-25', title: '圣诞节', color: 'red' },\n { date: '2024-12-31', title: '年终总结', color: 'purple' },\n ], []);\n\n // 向前导航\n const goToPrevious = () => {\n switch (viewType) {\n case CalendarViewType.MONTH:\n setCurrentDate(new Date(currentDate.getFullYear(), currentDate.getMonth() - 1, 1));\n break;\n case CalendarViewType.WEEK:\n setCurrentDate(addDays(currentDate, -7));\n break;\n case CalendarViewType.DAY:\n setCurrentDate(addDays(currentDate, -1));\n break;\n }\n };\n\n // 向后导航\n const goToNext = () => {\n switch (viewType) {\n case CalendarViewType.MONTH:\n setCurrentDate(new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1));\n break;\n case CalendarViewType.WEEK:\n setCurrentDate(addDays(currentDate, 7));\n break;\n case CalendarViewType.DAY:\n setCurrentDate(addDays(currentDate, 1));\n break;\n }\n };\n\n // 切换到今天\n const goToToday = () => {\n setCurrentDate(new Date());\n };\n\n // 获取月份名称\n const getMonthName = (date: Date) => {\n return date.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long' });\n };\n\n // 获取视图标题\n const getViewTitle = () => {\n switch (viewType) {\n case CalendarViewType.MONTH:\n return getMonthName(currentDate);\n case CalendarViewType.WEEK:\n const weekDates = getWeekViewDates(currentDate);\n const weekStart = weekDates[0];\n const weekEnd = weekDates[6];\n if (!weekStart || !weekEnd) {\n return getMonthName(currentDate);\n }\n if (weekStart.getMonth() === weekEnd.getMonth()) {\n return (weekStart.getFullYear()) + '年' + (weekStart.getMonth() + 1) + '月 第' + (Math.ceil(weekStart.getDate() / 7)) + '周';\n } else {\n return (weekStart.getMonth() + 1) + '月' + (weekStart.getDate()) + '日 - ' + (weekEnd.getMonth() + 1) + '月' + (weekEnd.getDate()) + '日';\n }\n case CalendarViewType.DAY:\n return currentDate.toLocaleDateString('zh-CN', { \n year: 'numeric', \n month: 'long', \n day: 'numeric',\n weekday: 'long'\n });\n default:\n return getMonthName(currentDate);\n }\n };\n\n // 检查日期是否有事件(优先使用真实事件,其次使用示例事件)\n const getEventsForDate = (date: Date) => {\n const dateStr = formatDate(date);\n \n // 首先查找真实事件\n const realEvents = events.filter(event => {\n const eventDateStr = formatDate(event.startTime);\n return eventDateStr === dateStr;\n });\n \n // 如果有真实事件,返回真实事件,否则返回示例事件\n if (realEvents.length > 0) {\n return realEvents.map(event => ({\n title: event.title,\n color: event.color,\n id: event.id,\n isRealEvent: true\n }));\n }\n \n // 为了演示效果,显示示例事件\n return sampleEvents.filter(event => event.date === dateStr).map(event => ({\n title: event.title,\n color: event.color,\n id: undefined,\n isRealEvent: false\n }));\n };\n\n // 获取事件颜色类名\n const getEventColorClass = (color: string) => {\n const colorMap: Record<string, string> = {\n blue: 'bg-blue-100 text-blue-800 border-blue-200',\n green: 'bg-green-100 text-green-800 border-green-200',\n red: 'bg-red-100 text-red-800 border-red-200',\n purple: 'bg-purple-100 text-purple-800 border-purple-200',\n yellow: 'bg-yellow-100 text-yellow-800 border-yellow-200',\n '#3B82F6': 'bg-blue-100 text-blue-800 border-blue-200',\n '#10B981': 'bg-green-100 text-green-800 border-green-200',\n '#EF4444': 'bg-red-100 text-red-800 border-red-200',\n '#8B5CF6': 'bg-purple-100 text-purple-800 border-purple-200',\n '#F59E0B': 'bg-yellow-100 text-yellow-800 border-yellow-200',\n };\n return colorMap[color] || 'bg-gray-100 text-gray-800 border-gray-200';\n };\n\n // 处理日期点击事件\n const handleDateClick = (date: Date) => {\n if (!isAuthenticated && onShowLogin) {\n onShowLogin();\n return;\n }\n setSelectedDate(date);\n setEditingEvent(null);\n setIsEventModalOpen(true);\n };\n\n // 处理事件点击(用于编辑)\n const handleEventClick = (event: any, e: React.MouseEvent) => {\n e.stopPropagation(); // 阻止冒泡到日期点击\n if (!isAuthenticated && onShowLogin) {\n onShowLogin();\n return;\n }\n setEditingEvent(event);\n setSelectedDate(null);\n setIsEventModalOpen(true);\n };\n\n // 处理事件保存(创建或更新)\n const handleEventSave = async (eventData: CreateEventRequest | UpdateEventRequest) => {\n if (!isAuthenticated && onShowLogin) {\n onShowLogin();\n return;\n }\n \n try {\n if (!eventData.title || !eventData.startTime || !eventData.endTime) {\n throw new Error('缺少必需的事件信息');\n }\n \n if (editingEvent) {\n await updateEvent(editingEvent.id, {\n title: eventData.title,\n description: eventData.description,\n startTime: new Date(eventData.startTime),\n endTime: new Date(eventData.endTime),\n allDay: eventData.allDay || false,\n location: eventData.location,\n color: eventData.color || EventColor.BLUE,\n priority: eventData.priority || EventPriority.NORMAL,\n });\n } else {\n await createEvent({\n title: eventData.title,\n description: eventData.description,\n startTime: new Date(eventData.startTime),\n endTime: new Date(eventData.endTime),\n allDay: eventData.allDay || false,\n location: eventData.location,\n color: eventData.color || EventColor.BLUE,\n priority: eventData.priority || EventPriority.NORMAL,\n });\n }\n \n setIsEventModalOpen(false);\n setSelectedDate(null);\n setEditingEvent(null);\n } catch (error) {\n console.error(editingEvent ? '更新事件失败:' : '创建事件失败:', error);\n }\n };\n\n // 处理事件删除\n const handleEventDelete = async (eventId: number) => {\n if (!isAuthenticated && onShowLogin) {\n onShowLogin();\n return;\n }\n \n try {\n await deleteEvent(eventId);\n setIsEventModalOpen(false);\n setEditingEvent(null);\n } catch (error) {\n console.error('删除事件失败:', error);\n }\n };\n\n // 处理批量删除事件\n const handleBatchDelete = async (eventIds: number[]) => {\n if (!isAuthenticated && onShowLogin) {\n onShowLogin();\n return;\n }\n \n try {\n await batchDeleteEvents(eventIds);\n } catch (error) {\n console.error('批量删除事件失败:', error);\n throw error;\n }\n };\n\n // 处理事件列表中的事件点击\n const handleEventListClick = (event: any) => {\n setEditingEvent(event);\n setIsEventModalOpen(true);\n };\n\n // 处理事件列表中的事件编辑\n const handleEventListEdit = (event: any) => {\n if (!isAuthenticated && onShowLogin) {\n onShowLogin();\n return;\n }\n setEditingEvent(event);\n setIsEventModalOpen(true);\n };\n\n // 处理事件列表配置变更\n const handleEventListConfigChange = (config: EventListConfig) => {\n setEventListConfig(config);\n };\n\n // 关闭模态框\n const handleModalClose = () => {\n setIsEventModalOpen(false);\n setSelectedDate(null);\n setEditingEvent(null);\n clearError();\n };\n\n // 处理设置变更\n const handleSettingsChange = (newSettings: CalendarSettingsType) => {\n setCalendarSettings(newSettings);\n console.log('📝 日历设置已更新:', newSettings);\n };\n\n // 渲染不同的日历视图\n const renderCalendarView = () => {\n switch (viewType) {\n case CalendarViewType.MONTH:\n return (\n <DraggableMonthView\n events={events}\n currentDate={currentDate}\n onDateChange={setCurrentDate}\n onEventClick={(event) => {\n setEditingEvent(event);\n setIsEventModalOpen(true);\n }}\n onDateClick={handleDateClick}\n onEventUpdate={updateEventTime}\n />\n );\n case CalendarViewType.WEEK:\n return renderWeekView();\n case CalendarViewType.DAY:\n return renderDayView();\n default:\n return (\n <DraggableMonthView\n events={events}\n currentDate={currentDate}\n onDateChange={setCurrentDate}\n onEventClick={(event) => {\n setEditingEvent(event);\n setIsEventModalOpen(true);\n }}\n onDateClick={handleDateClick}\n onEventUpdate={updateEventTime}\n />\n );\n }\n };\n\n // 渲染周视图\n const renderWeekView = () => {\n const weekDates = getWeekViewDates(currentDate);\n \n return (\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden mb-6\">\n <table className=\"w-full table-fixed\">\n <thead>\n <tr className=\"bg-gray-50\">\n {weekDates.map((date, index) => {\n const isWeekend = date.getDay() === 0 || date.getDay() === 6;\n return (\n <th \n key={index} \n className={clsx('p-3 text-center border-b border-gray-200', index < 6 ? 'border-r border-gray-200' : '')}\n >\n <div className={clsx('text-sm font-medium', isWeekend ? 'text-red-600' : 'text-gray-700')}>\n {getWeekdayName(date, 'zh-CN', 'short')}\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n <tr>\n {weekDates.map((date, index) => {\n const dayEvents = getEventsForDate(date);\n const isTodayDate = isToday(date);\n const isWeekend = date.getDay() === 0 || date.getDay() === 6;\n \n return (\n <td\n key={index}\n onClick={() => handleDateClick(date)}\n className={clsx('h-56 border-b border-gray-200 relative cursor-pointer', index < 6 ? 'border-r border-gray-200' : '', 'hover:bg-gray-50 transition-colors', isTodayDate ? 'bg-blue-50' : 'bg-white')}\n >\n <div className=\"flex flex-col h-full p-3\">\n <div className=\"flex flex-col items-center mb-3\">\n <div className={clsx('flex items-center justify-center text-lg font-bold w-10 h-10 rounded-full', isTodayDate ? 'bg-blue-600 text-white shadow-md' : \n isWeekend ? 'text-red-600 bg-red-50' : 'text-gray-900 hover:bg-gray-100', 'transition-colors')}>\n {date.getDate()}\n </div>\n {(index === 0 || date.getDate() === 1) && (\n <div className=\"text-xs text-gray-500 mt-1 font-medium\">\n {date.getMonth() + 1}月\n </div>\n )}\n </div>\n \n <div className=\"flex-1 flex flex-col\">\n {dayEvents.length > 0 ? (\n <>\n <div className=\"text-center mb-2\">\n <span className={clsx('inline-flex items-center justify-center w-6 h-6 text-xs font-bold rounded-full', dayEvents.length > 5 ? 'bg-red-100 text-red-700' :\n dayEvents.length > 2 ? 'bg-yellow-100 text-yellow-700' :\n 'bg-green-100 text-green-700')}>\n {dayEvents.length}\n </span>\n </div>\n \n <div className=\"space-y-1 overflow-hidden\">\n {dayEvents.slice(0, 4).map((event, eventIndex) => (\n <div\n key={eventIndex}\n onClick={(e) => event.isRealEvent && event.id ? handleEventClick(events.find(e => e.id === event.id), e) : undefined}\n className={clsx('text-xs px-2 py-1 rounded font-medium truncate text-center', event.isRealEvent ? 'cursor-pointer hover:opacity-80 hover:shadow-sm' : 'cursor-default', 'transition-all duration-200', getEventColorClass(event.color))}\n title={event.title}\n >\n {event.title}\n </div>\n ))}\n {dayEvents.length > 4 && (\n <div className=\"text-xs text-gray-500 text-center py-1 bg-gray-100 rounded\">\n +{dayEvents.length - 4} 更多\n </div>\n )}\n </div>\n </>\n ) : (\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"text-center\">\n <div className=\"w-4 h-4 mx-auto mb-1 opacity-30\">\n <svg fill=\"currentColor\" viewBox=\"0 0 20 20\" className=\"text-gray-400\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"text-xs text-gray-400\">无事件</div>\n </div>\n </div>\n )}\n </div>\n </div>\n </td>\n );\n })}\n </tr>\n </tbody>\n </table>\n </div>\n );\n };\n\n // 渲染日视图\n const renderDayView = () => {\n const dayEvents = getEventsForDate(currentDate);\n const isTodayDate = isToday(currentDate);\n \n return (\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden mb-6\">\n <div className=\"bg-gray-50 p-4 border-b border-gray-200\">\n <div className=\"text-center\">\n <div className=\"text-sm text-gray-600 mb-1\">\n {currentDate.toLocaleDateString('zh-CN', { weekday: 'long' })}\n </div>\n <div className={clsx('text-2xl font-bold', isTodayDate ? 'text-blue-600' : 'text-gray-900')}>\n {currentDate.getDate()}日\n </div>\n <div className=\"text-sm text-gray-600\">\n {currentDate.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long' })}\n </div>\n </div>\n </div>\n\n <div className=\"p-4\">\n <button\n onClick={() => handleDateClick(currentDate)}\n className=\"w-full mb-4 p-3 border-2 border-dashed border-gray-300 rounded-lg text-gray-600 hover:border-blue-300 hover:text-blue-600 transition-colors\"\n >\n + 在此日期创建事件\n </button>\n\n {dayEvents.length > 0 ? (\n <div className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-gray-700 mb-3\">\n 今日事件 ({dayEvents.length})\n </h3>\n {dayEvents.map((event, eventIndex) => (\n <div\n key={eventIndex}\n onClick={(e) => event.isRealEvent && event.id ? handleEventClick(events.find(e => e.id === event.id), e) : undefined}\n className={clsx('p-3 rounded-lg border-l-4 bg-gray-50', event.isRealEvent ? 'cursor-pointer hover:shadow-md' : 'cursor-default', 'transition-shadow', getEventColorClass(event.color))}\n >\n <div className=\"font-medium text-sm mb-1\">{event.title}</div>\n {event.isRealEvent && event.id && (\n <div className=\"text-xs text-gray-600\">\n 点击编辑事件\n </div>\n )}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-8 text-gray-500\">\n <svg className=\"w-12 h-12 mx-auto mb-3 text-gray-300\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <p>今日暂无事件</p>\n <p className=\"text-xs mt-1\">点击上方按钮创建事件</p>\n </div>\n )}\n </div>\n </div>\n );\n };\n\n // 处理增强事件创建\n const handleCreateEnhancedEvent = useCallback(async (eventData: EventData) => {\n try {\n const createdEvents = await createEnhancedEvent(eventData);\n setIsEventModalOpen(false);\n setSelectedDate(null);\n \n const eventCount = createdEvents.length;\n if (eventCount > 1) {\n alert('成功创建 ' + (eventCount) + ' 个事件!');\n } else {\n alert('事件创建成功!');\n }\n } catch (error) {\n console.error('创建增强事件失败:', error);\n alert('创建事件失败,请重试');\n }\n }, [createEnhancedEvent]);\n\n return (\n <div className=\"min-h-screen bg-gray-50\">\n <div className=\"max-w-7xl mx-auto p-4 lg:p-6\">\n <div className=\"mb-6\">\n <div className=\"flex justify-between items-start mb-4\">\n <div>\n <h1 className=\"text-3xl font-bold text-gray-900 mb-2\">日历管理</h1>\n <p className=\"text-gray-600\">\n 功能完整的日历应用,支持事件管理、提醒、重复事件等功能\n </p>\n </div>\n \n <div className=\"flex items-center gap-3\">\n {headerActions}\n {!headerActions && !isAuthenticated && (\n <button\n onClick={onShowLogin}\n className=\"px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors\"\n >\n 登录\n </button>\n )}\n </div>\n </div>\n \n <div className=\"flex space-x-1 bg-gray-100 p-1 rounded-lg w-fit\">\n <button\n onClick={() => setActiveTab('calendar')}\n className={clsx('px-4 py-2 text-sm font-medium rounded-md transition-colors', activeTab === 'calendar'\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900')}\n >\n 📅 日历视图\n </button>\n <button\n onClick={() => setActiveTab('events')}\n className={clsx('px-4 py-2 text-sm font-medium rounded-md transition-colors', activeTab === 'events'\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900')}\n >\n 📋 事件列表\n </button>\n <button\n onClick={() => setActiveTab('settings')}\n className={clsx('px-4 py-2 text-sm font-medium rounded-md transition-colors', activeTab === 'settings'\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900')}\n >\n ⚙️ 设置\n </button>\n </div>\n </div>\n\n {error && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-4 mb-6\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-red-400 mt-0.5\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-red-800\">操作失败</h3>\n <p className=\"mt-1 text-sm text-red-700\">{error}</p>\n <button\n onClick={clearError}\n className=\"mt-2 text-sm text-red-600 hover:text-red-800 font-medium\"\n >\n 关闭\n </button>\n </div>\n </div>\n </div>\n )}\n\n {activeTab === 'calendar' && (\n <>\n <div className=\"bg-blue-50 border border-blue-200 rounded-lg p-4 mb-6\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-blue-400 mt-0.5\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"ml-3\">\n <h3 className=\"text-sm font-medium text-blue-800\">功能说明</h3>\n <p className=\"mt-1 text-sm text-blue-700\">\n 点击日历上的任意日期可以创建新事件。当前已支持完整的事件管理功能,包括创建、编辑、删除等操作。\n {!isAuthenticated && (\n <span className=\"block mt-2 text-orange-700 font-medium\">\n 💡 提示:请先登录以使用完整的事件管理功能\n </span>\n )}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-4 mb-6\">\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div className=\"flex items-center gap-3\">\n <button onClick={goToPrevious} className=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\">\n <svg className=\"w-5 h-5 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n <h2 className=\"text-xl font-semibold text-gray-900 min-w-[160px] text-center\">{getViewTitle()}</h2>\n <button onClick={goToNext} className=\"p-2 hover:bg-gray-100 rounded-lg transition-colors\">\n <svg className=\"w-5 h-5 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <button onClick={goToToday} className=\"px-4 py-2 text-sm font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded-lg transition-colors\">\n 今天\n </button>\n <div className=\"flex items-center bg-gray-100 rounded-lg p-1\">\n {(['month', 'week', 'day'] as const).map((view) => (\n <button\n key={view}\n onClick={() => setViewType(CalendarViewType[view.toUpperCase() as keyof typeof CalendarViewType])}\n className={clsx('px-3 py-1.5 text-sm font-medium rounded-md transition-colors', viewType === CalendarViewType[view.toUpperCase() as keyof typeof CalendarViewType]\n ? 'bg-white text-gray-900 shadow-sm'\n : 'text-gray-600 hover:text-gray-900')}\n >\n {view === 'month' ? '月' : view === 'week' ? '周' : '日'}\n </button>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n {renderCalendarView()}\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-6\">\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n <div className=\"flex items-center mb-4\">\n <div className=\"bg-blue-100 p-3 rounded-lg\">\n <svg className=\"w-6 h-6 text-blue-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </div>\n <h3 className=\"ml-3 text-lg font-semibold text-gray-900\">事件管理</h3>\n </div>\n <p className=\"text-gray-600 text-sm mb-4\">创建、编辑、删除日历事件,支持拖拽调整时间,多种颜色标识。</p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n <div className=\"flex items-center mb-4\">\n <div className=\"bg-green-100 p-3 rounded-lg\">\n <svg className=\"w-6 h-6 text-green-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </div>\n <h3 className=\"ml-3 text-lg font-semibold text-gray-900\">重复事件</h3>\n </div>\n <p className=\"text-gray-600 text-sm mb-4\">支持日、周、月、年重复模式,灵活的重复规则配置。</p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n <div className=\"flex items-center mb-4\">\n <div className=\"bg-purple-100 p-3 rounded-lg\">\n <svg className=\"w-6 h-6 text-purple-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 17h5l-5 5v-5zM4 7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v6a2 2 0 01-2 2H6a2 2 0 01-2-2V7z\" />\n </svg>\n </div>\n <h3 className=\"ml-3 text-lg font-semibold text-gray-900\">智能提醒</h3>\n </div>\n <p className=\"text-gray-600 text-sm mb-4\">邮件、通知、短信多种提醒方式,自定义提醒时间。</p>\n </div>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">技术特性</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"flex items-center text-sm text-gray-600\">\n <svg className=\"w-4 h-4 text-green-500 mr-3 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n 完整的TypeScript类型定义\n </div>\n <div className=\"flex items-center text-sm text-gray-600\">\n <svg className=\"w-4 h-4 text-green-500 mr-3 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\n </svg>\n 响应式设计 (TailwindCSS)\n </div>\n </div>\n </div>\n </>\n )}\n\n {activeTab === 'events' && (\n <EventList\n events={events}\n config={eventListConfig}\n onConfigChange={handleEventListConfigChange}\n onEventClick={handleEventListClick}\n onEventEdit={handleEventListEdit}\n onEventDelete={handleEventDelete}\n onBatchDelete={handleBatchDelete}\n enableBatchActions={true}\n loading={loading}\n />\n )}\n\n {activeTab === 'settings' && (\n <CalendarSettings\n onSettingsChange={handleSettingsChange}\n />\n )}\n </div>\n\n <ImprovedEventModal\n isOpen={isEventModalOpen}\n onClose={handleModalClose}\n onSave={handleCreateEnhancedEvent}\n onDelete={editingEvent ? handleEventDelete : undefined}\n event={editingEvent}\n initialDate={selectedDate || undefined}\n />\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { CalendarEvent, useEvents, formatDate, formatTime } from '../index';\nimport EventModal from '../components/EventModal';\nimport { ConfirmModal } from '@/components';\nimport { clsx } from 'clsx';\n\ninterface EventDetailPageProps {\n eventId: number;\n onBack?: () => void;\n onEdit?: (event: CalendarEvent) => void;\n onDelete?: (eventId: number) => void;\n}\n\nconst EventDetailPage: React.FC<EventDetailPageProps> = ({\n eventId,\n onBack,\n onEdit,\n onDelete,\n}) => {\n const [event, setEvent] = useState<CalendarEvent | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [isEditModalOpen, setIsEditModalOpen] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n\n const { events, updateEvent, deleteEvent } = useEvents();\n\n // 加载事件详情\n useEffect(() => {\n const foundEvent = events.find(e => e.id === eventId);\n if (foundEvent) {\n setEvent(foundEvent);\n setIsLoading(false);\n }\n }, [eventId, events]);\n\n // 处理编辑事件\n const handleEditSave = async (eventData: any) => {\n if (!event) return;\n \n try {\n await updateEvent(event.id, eventData);\n setIsEditModalOpen(false);\n // 重新加载事件数据\n const updatedEvent = events.find(e => e.id === eventId);\n if (updatedEvent) {\n setEvent(updatedEvent);\n }\n } catch (error) {\n console.error('更新事件失败:', error);\n }\n };\n\n // 处理删除事件\n const handleDelete = async () => {\n if (!event) return;\n \n setIsDeleting(true);\n try {\n await deleteEvent(event.id);\n setShowDeleteConfirm(false);\n if (onDelete) {\n onDelete(event.id);\n }\n if (onBack) {\n onBack();\n }\n } catch (error) {\n console.error('删除事件失败:', error);\n } finally {\n setIsDeleting(false);\n }\n };\n\n // 获取事件优先级显示文本\n const getPriorityText = (priority: string) => {\n switch (priority) {\n case 'high': return '高';\n case 'normal': return '普通';\n case 'low': return '低';\n default: return '普通';\n }\n };\n\n // 获取事件优先级颜色\n const getPriorityColor = (priority: string) => {\n switch (priority) {\n case 'high': return 'text-red-600 bg-red-50';\n case 'normal': return 'text-blue-600 bg-blue-50';\n case 'low': return 'text-gray-600 bg-gray-50';\n default: return 'text-blue-600 bg-blue-50';\n }\n };\n\n if (isLoading) {\n return (\n <div className=\"min-h-screen bg-gray-50 flex items-center justify-center\">\n <div className=\"text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-600 mx-auto\"></div>\n <p className=\"mt-4 text-gray-600\">加载事件详情...</p>\n </div>\n </div>\n );\n }\n\n if (!event) {\n return (\n <div className=\"min-h-screen bg-gray-50 flex items-center justify-center\">\n <div className=\"text-center\">\n <p className=\"text-gray-600\">事件不存在</p>\n {onBack && (\n <button\n onClick={onBack}\n className=\"mt-4 px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700\"\n >\n 返回\n </button>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"min-h-screen bg-gray-50\">\n <div className=\"max-w-4xl mx-auto px-4 py-8\">\n {/* 头部 */}\n <div className=\"mb-8\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-4\">\n {onBack && (\n <button\n onClick={onBack}\n className=\"p-2 hover:bg-gray-100 rounded-md\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\n </svg>\n </button>\n )}\n <h1 className=\"text-3xl font-bold text-gray-900\">事件详情</h1>\n </div>\n \n <div className=\"flex space-x-3\">\n <button\n onClick={() => setIsEditModalOpen(true)}\n className=\"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700\"\n >\n 编辑\n </button>\n <button\n onClick={() => setShowDeleteConfirm(true)}\n className=\"px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700\"\n >\n 删除\n </button>\n </div>\n </div>\n </div>\n\n {/* 事件详情卡片 */}\n <div className=\"bg-white rounded-lg shadow-md overflow-hidden\">\n {/* 事件头部 */}\n <div className=\"px-6 py-4 border-b border-gray-200\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-2xl font-semibold text-gray-900\">{event.title}</h2>\n <div className=\"flex items-center space-x-2\">\n <span\n className={clsx('px-2 py-1 text-xs font-medium rounded-full', getPriorityColor(event.priority || 'normal'))}\n >\n {getPriorityText(event.priority || 'normal')}\n </span>\n <div\n className=\"w-4 h-4 rounded-full\"\n style={{ backgroundColor: event.color }}\n />\n </div>\n </div>\n </div>\n\n {/* 事件详情内容 */}\n <div className=\"px-6 py-6\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {/* 时间信息 */}\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-medium text-gray-900\">时间信息</h3>\n \n <div className=\"space-y-3\">\n <div className=\"flex items-center space-x-3\">\n <svg className=\"w-5 h-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">开始时间</p>\n <p className=\"font-medium\">\n {formatDate(new Date(event.startTime))} {formatTime(new Date(event.startTime))}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center space-x-3\">\n <svg className=\"w-5 h-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">结束时间</p>\n <p className=\"font-medium\">\n {formatDate(new Date(event.endTime))} {formatTime(new Date(event.endTime))}\n </p>\n </div>\n </div>\n\n {event.allDay && (\n <div className=\"flex items-center space-x-3\">\n <svg className=\"w-5 h-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z\" />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">全天事件</p>\n <p className=\"font-medium text-blue-600\">是</p>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* 基本信息 */}\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-medium text-gray-900\">基本信息</h3>\n \n <div className=\"space-y-3\">\n {event.location && (\n <div className=\"flex items-center space-x-3\">\n <svg className=\"w-5 h-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">地点</p>\n <p className=\"font-medium\">{event.location}</p>\n </div>\n </div>\n )}\n\n <div className=\"flex items-center space-x-3\">\n <svg className=\"w-5 h-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 4V2a1 1 0 011-1h8a1 1 0 011 1v2M7 4a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V6a2 2 0 00-2-2M7 4h10M7 8h10M7 12h10\" />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">创建时间</p>\n <p className=\"font-medium\">\n {formatDate(new Date(event.createdAt))} {formatTime(new Date(event.createdAt))}\n </p>\n </div>\n </div>\n\n {event.updatedAt && event.updatedAt !== event.createdAt && (\n <div className=\"flex items-center space-x-3\">\n <svg className=\"w-5 h-5 text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n <div>\n <p className=\"text-sm text-gray-600\">最后修改</p>\n <p className=\"font-medium\">\n {formatDate(new Date(event.updatedAt))} {formatTime(new Date(event.updatedAt))}\n </p>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* 描述 */}\n {event.description && (\n <div className=\"mt-6 pt-6 border-t border-gray-200\">\n <h3 className=\"text-lg font-medium text-gray-900 mb-3\">描述</h3>\n <div className=\"prose max-w-none\">\n <p className=\"text-gray-700 whitespace-pre-wrap\">{event.description}</p>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* 编辑事件弹窗 */}\n <EventModal\n isOpen={isEditModalOpen}\n onClose={() => setIsEditModalOpen(false)}\n onSave={handleEditSave}\n event={event}\n />\n\n {/* 删除确认弹窗 */}\n <ConfirmModal\n isOpen={showDeleteConfirm}\n onClose={() => setShowDeleteConfirm(false)}\n onConfirm={handleDelete}\n title=\"确认删除\"\n message={'您确定要删除事件\"' + (event.title) + '\"吗?此操作无法撤销。'}\n confirmText=\"删除\"\n cancelText=\"取消\"\n isLoading={isDeleting}\n />\n </div>\n );\n};\n\nexport default EventDetailPage; "]}
|