'use client'; import { useState } from 'react'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Switch } from '@/components/ui/switch'; import { Badge } from '@/components/ui/badge'; const INPUT_TYPE_OPTIONS = [ { value: 'textbox', label: '텍스트 입력' }, { value: 'number', label: '숫자 입력' }, { value: 'dropdown', label: '드롭다운' }, { value: 'checkbox', label: '체크박스' }, { value: 'date', label: '날짜' }, { value: 'textarea', label: '긴 텍스트' }, ]; interface MasterFieldDialogProps { isMasterFieldDialogOpen: boolean; setIsMasterFieldDialogOpen: (open: boolean) => void; editingMasterFieldId: number | null; setEditingMasterFieldId: (id: number | null) => void; newMasterFieldName: string; setNewMasterFieldName: (name: string) => void; newMasterFieldKey: string; setNewMasterFieldKey: (key: string) => void; newMasterFieldInputType: 'textbox' | 'number' | 'dropdown' | 'checkbox' | 'date' | 'textarea'; setNewMasterFieldInputType: (type: any) => void; newMasterFieldRequired: boolean; setNewMasterFieldRequired: (required: boolean) => void; newMasterFieldCategory: string; setNewMasterFieldCategory: (category: string) => void; newMasterFieldDescription: string; setNewMasterFieldDescription: (description: string) => void; newMasterFieldOptions: string; setNewMasterFieldOptions: (options: string) => void; newMasterFieldAttributeType: 'custom' | 'unit' | 'material' | 'surface'; setNewMasterFieldAttributeType: (type: 'custom' | 'unit' | 'material' | 'surface') => void; newMasterFieldMultiColumn: boolean; setNewMasterFieldMultiColumn: (multi: boolean) => void; newMasterFieldColumnCount: number; setNewMasterFieldColumnCount: (count: number) => void; newMasterFieldColumnNames: string[]; setNewMasterFieldColumnNames: (names: string[]) => void; handleUpdateMasterField: () => void; handleAddMasterField: () => void; } export function MasterFieldDialog({ isMasterFieldDialogOpen, setIsMasterFieldDialogOpen, editingMasterFieldId, setEditingMasterFieldId, newMasterFieldName, setNewMasterFieldName, newMasterFieldKey, setNewMasterFieldKey, newMasterFieldInputType, setNewMasterFieldInputType, newMasterFieldRequired, setNewMasterFieldRequired, newMasterFieldCategory, setNewMasterFieldCategory, newMasterFieldDescription, setNewMasterFieldDescription, newMasterFieldOptions, setNewMasterFieldOptions, newMasterFieldAttributeType, setNewMasterFieldAttributeType, newMasterFieldMultiColumn, setNewMasterFieldMultiColumn, newMasterFieldColumnCount, setNewMasterFieldColumnCount, newMasterFieldColumnNames, setNewMasterFieldColumnNames, handleUpdateMasterField, handleAddMasterField, }: MasterFieldDialogProps) { const [isSubmitted, setIsSubmitted] = useState(false); // 유효성 검사 const isNameEmpty = !newMasterFieldName.trim(); const isKeyEmpty = !newMasterFieldKey.trim(); // 2025-11-28: field_key validation - 영문 시작, 영문+숫자+언더스코어만 허용 const fieldKeyPattern = /^[a-zA-Z][a-zA-Z0-9_]*$/; const isKeyInvalid = newMasterFieldKey.trim() !== '' && !fieldKeyPattern.test(newMasterFieldKey); const handleClose = () => { setIsMasterFieldDialogOpen(false); setEditingMasterFieldId(null); setNewMasterFieldName(''); setNewMasterFieldKey(''); setNewMasterFieldInputType('textbox'); setNewMasterFieldRequired(false); setNewMasterFieldCategory('공통'); setNewMasterFieldDescription(''); setNewMasterFieldOptions(''); setNewMasterFieldAttributeType('custom'); setNewMasterFieldMultiColumn(false); setNewMasterFieldColumnCount(2); setNewMasterFieldColumnNames(['컬럼1', '컬럼2']); setIsSubmitted(false); }; const handleSubmit = () => { setIsSubmitted(true); // 2025-11-28: field_key validation 추가 if (!isNameEmpty && !isKeyEmpty && !isKeyInvalid) { if (editingMasterFieldId) { handleUpdateMasterField(); } else { handleAddMasterField(); } setIsSubmitted(false); } }; return ( { if (!open) handleClose(); else setIsMasterFieldDialogOpen(open); }}> {editingMasterFieldId ? '항목 수정' : '항목 추가'} 여러 섹션에서 재사용할 수 있는 항목을 생성합니다
setNewMasterFieldName(e.target.value)} placeholder="예: 품목명" className={isSubmitted && isNameEmpty ? 'border-red-500 focus-visible:ring-red-500' : ''} /> {isSubmitted && isNameEmpty && (

항목명을 입력해주세요

)}
setNewMasterFieldKey(e.target.value)} placeholder="예: itemName" className={(isSubmitted && isKeyEmpty) || isKeyInvalid ? 'border-red-500 focus-visible:ring-red-500' : ''} /> {isSubmitted && isKeyEmpty && (

필드 키를 입력해주세요

)} {isKeyInvalid && (

영문으로 시작하고, 영문/숫자/언더스코어(_)만 사용 가능합니다

)}