// File: app/(dashboard)/projects/new/page.tsx 'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import * as z from 'zod'; import { Loader2, ChevronLeft, Save } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'; import { toast } from 'sonner'; // Force dynamic rendering to prevent build-time prerendering issues export const dynamic = 'force-dynamic'; // Ensure this page is never statically generated export const fetchCache = 'force-no-store'; // 1. กำหนด Schema สำหรับตรวจสอบข้อมูล (Validation) // อ้างอิงจาก Data Dictionary ตาราง projects const projectSchema = z.object({ projectCode: z .string() .min(1, 'กรุณาระบุรหัสโครงการ') .max(50, 'รหัสโครงการต้องไม่เกิน 50 ตัวอักษร') .regex(/^[A-Z0-9-]+$/, 'รหัสโครงการควรประกอบด้วยตัวอักษรภาษาอังกฤษตัวใหญ่ ตัวเลข หรือขีด (-) เท่านั้น'), projectName: z.string().min(1, 'กรุณาระบุชื่อโครงการ').max(255, 'ชื่อโครงการต้องไม่เกิน 255 ตัวอักษร'), description: z.string().optional(), status: z.enum(['Active', 'Inactive', 'On Hold']), startDate: z.string().optional(), endDate: z.string().optional(), }); type ProjectValues = z.infer; export default function CreateProjectPage() { const router = useRouter(); const [isLoading, setIsLoading] = useState(false); // 2. ตั้งค่า React Hook Form const { register, handleSubmit, setValue, // ใช้สำหรับ manual set value (เช่น Select) formState: { errors }, } = useForm({ resolver: zodResolver(projectSchema), defaultValues: { projectCode: '', projectName: '', status: 'Active', }, }); // 3. ฟังก์ชัน Submit async function onSubmit(_data: ProjectValues) { setIsLoading(true); try { // เรียก API สร้างโครงการ (Mockup URL) // ใน Phase หลัง Backend จะเตรียม Endpoint POST /projects ไว้ให้ // จำลองการส่งข้อมูล (Artificial Delay) await new Promise((resolve) => setTimeout(resolve, 1000)); // await apiClient.post("/projects", data); toast.success('สร้างโครงการสำเร็จ'); router.push('/projects'); router.refresh(); } catch (_error) { toast.error('เกิดข้อผิดพลาดในการสร้างโครงการ'); // Project creation failed - toast shown } finally { setIsLoading(false); } } return (
{/* Header with Back Button */}

Create New Project

สร้างโครงการใหม่เพื่อเริ่มบริหารจัดการสัญญาและเอกสาร

ข้อมูลโครงการ กรอกรายละเอียดสำคัญของโครงการ รหัสโครงการควรไม่ซ้ำกับที่มีอยู่ {/* Project Code */}
{ e.target.value = e.target.value.toUpperCase(); register('projectCode').onChange(e); }} /> {errors.projectCode ? (

{errors.projectCode.message}

) : (

ใช้ภาษาอังกฤษตัวพิมพ์ใหญ่ ตัวเลข และขีด (-) เท่านั้น

)}
{/* Project Name */}
{errors.projectName &&

{errors.projectName.message}

}
{/* Description */}