'use client'; // File: components/ai/intent-classification/intent-form.tsx // Change Log // - 2026-05-19: สร้าง Intent Definition Form (Create/Update) (ADR-024). import { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from '@/components/ui/dialog'; import type { IntentDefinition, IntentCategory, } from '@/lib/services/ai-intent.service'; interface IntentFormProps { open: boolean; onClose: () => void; onSubmit: (data: { intentCode: string; descriptionTh: string; descriptionEn: string; category: IntentCategory; }) => void; /** ถ้ามี = edit mode */ initial?: IntentDefinition; isLoading?: boolean; } /** * Dialog Form สำหรับสร้าง/แก้ไข Intent Definition */ export function IntentForm({ open, onClose, onSubmit, initial, isLoading, }: IntentFormProps) { const isEdit = !!initial; const [intentCode, setIntentCode] = useState(initial?.intentCode || ''); const [descriptionTh, setDescriptionTh] = useState(initial?.descriptionTh || ''); const [descriptionEn, setDescriptionEn] = useState(initial?.descriptionEn || ''); const [category, setCategory] = useState(initial?.category || 'read'); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); onSubmit({ intentCode, descriptionTh, descriptionEn, category }); }; return ( !v && onClose()}> {isEdit ? `แก้ไข ${initial.intentCode}` : 'สร้าง Intent ใหม่'}
{/* Intent Code */}
setIntentCode(e.target.value.toUpperCase())} placeholder="GET_RFA" pattern="^[A-Z][A-Z0-9_]*$" maxLength={50} disabled={isEdit} required />

UPPERCASE_SNAKE_CASE เช่น GET_RFA, SUMMARIZE_DOCUMENT

{/* Description TH */}
setDescriptionTh(e.target.value)} placeholder="ดึง RFA ตาม filter" maxLength={255} required />
{/* Description EN */}
setDescriptionEn(e.target.value)} placeholder="Get RFA by filters" maxLength={255} required />
{/* Category */}
); }