// 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 apiClient from "@/lib/api/client"; // 1. กำหนด Schema สำหรับตรวจสอบข้อมูล (Validation) // อ้างอิงจาก Data Dictionary ตาราง projects const projectSchema = z.object({ project_code: z .string() .min(1, "กรุณาระบุรหัสโครงการ") .max(50, "รหัสโครงการต้องไม่เกิน 50 ตัวอักษร") .regex(/^[A-Z0-9-]+$/, "รหัสโครงการควรประกอบด้วยตัวอักษรภาษาอังกฤษตัวใหญ่ ตัวเลข หรือขีด (-) เท่านั้น"), project_name: z .string() .min(1, "กรุณาระบุชื่อโครงการ") .max(255, "ชื่อโครงการต้องไม่เกิน 255 ตัวอักษร"), description: z.string().optional(), // ฟิลด์เสริม (อาจจะยังไม่มีใน DB แต่เผื่อไว้สำหรับ UI) status: z.enum(["Active", "Inactive", "On Hold"]).default("Active"), start_date: z.string().optional(), end_date: 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) watch, // ใช้ดูค่า (สำหรับ Debug หรือ Conditional Logic) formState: { errors }, } = useForm({ resolver: zodResolver(projectSchema), defaultValues: { project_code: "", project_name: "", status: "Active", }, }); // 3. ฟังก์ชัน Submit async function onSubmit(data: ProjectValues) { setIsLoading(true); try { // เรียก API สร้างโครงการ (Mockup URL) // ใน Phase หลัง Backend จะเตรียม Endpoint POST /projects ไว้ให้ console.log("Submitting project data:", data); // จำลองการส่งข้อมูล (Artificial Delay) await new Promise((resolve) => setTimeout(resolve, 1000)); // await apiClient.post("/projects", data); alert("สร้างโครงการสำเร็จ"); // TODO: เปลี่ยนเป็น Toast router.push("/projects"); router.refresh(); } catch (error) { console.error("Failed to create project:", error); alert("เกิดข้อผิดพลาดในการสร้างโครงการ"); } finally { setIsLoading(false); } } return (
{/* Header with Back Button */}

Create New Project

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

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

{errors.project_code.message}

) : (

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

)}
{/* Project Name */}
{errors.project_name && (

{errors.project_name.message}

)}
{/* Description */}