import React from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { Button } from '@/client/components/ui/button'; import { Input } from '@/client/components/ui/input'; import { Textarea } from '@/client/components/ui/textarea'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/client/components/ui/select'; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from '@/client/components/ui/form'; import { Calendar } from 'lucide-react'; import { format } from 'date-fns'; import { createActivitySchema, updateActivitySchema } from '@/server/modules/activities/activity.schema'; import type { CreateActivityInput, UpdateActivityInput } from '@/server/modules/activities/activity.schema'; import { ActivityType } from '@/server/modules/activities/activity.entity'; // 将ISO日期时间格式化为 datetime-local 输入框需要的格式 const formatDateTimeForInput = (dateString: string): string => { const date = new Date(dateString); // 使用 date-fns 转换为 YYYY-MM-DDTHH:mm 格式 return format(date, "yyyy-MM-dd'T'HH:mm"); }; interface ActivityFormProps { initialData?: UpdateActivityInput & { id?: number }; onSubmit: (data: CreateActivityInput | UpdateActivityInput) => Promise; onCancel: () => void; isLoading?: boolean; } export const ActivityForm: React.FC = ({ initialData, onSubmit, onCancel, isLoading = false }) => { const isEditing = !!initialData?.id; const form = useForm({ resolver: zodResolver(isEditing ? updateActivitySchema : createActivitySchema), defaultValues: initialData ? { name: initialData.name || '', description: initialData.description || '', type: initialData.type || ActivityType.DEPARTURE, startDate: initialData.startDate ? formatDateTimeForInput(initialData.startDate) : '', endDate: initialData.endDate ? formatDateTimeForInput(initialData.endDate) : '', isDisabled: initialData.isDisabled } : { name: '', description: '', type: ActivityType.DEPARTURE, startDate: '', endDate: '', } }); const handleSubmit = async (data: CreateActivityInput | UpdateActivityInput) => { try { await onSubmit(data); } catch (error) { console.error('表单提交失败:', error); } }; return (
{/* 活动名称 */} ( 活动名称 * 活动的显示名称,最多255个字符 )} /> {/* 活动类型 */} ( 活动类型 * 选择活动的类型:去程或返程 )} />
{/* 活动描述 */} ( 活动描述