'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'; import { Check, X } from 'lucide-react'; import type { ItemMasterField } from '@/contexts/ItemMasterContext'; const INPUT_TYPE_OPTIONS = [ { value: 'textbox', label: '텍스트 입력' }, { value: 'number', label: '숫자 입력' }, { value: 'dropdown', label: '드롭다운' }, { value: 'checkbox', label: '체크박스' }, { value: 'date', label: '날짜' }, { value: 'textarea', label: '긴 텍스트' }, ]; interface TemplateFieldDialogProps { isTemplateFieldDialogOpen: boolean; setIsTemplateFieldDialogOpen: (open: boolean) => void; editingTemplateFieldId: number | null; setEditingTemplateFieldId: (id: number | null) => void; templateFieldName: string; setTemplateFieldName: (name: string) => void; templateFieldKey: string; setTemplateFieldKey: (key: string) => void; templateFieldInputType: 'textbox' | 'number' | 'dropdown' | 'checkbox' | 'date' | 'textarea'; setTemplateFieldInputType: (type: any) => void; templateFieldRequired: boolean; setTemplateFieldRequired: (required: boolean) => void; templateFieldOptions: string; setTemplateFieldOptions: (options: string) => void; templateFieldDescription: string; setTemplateFieldDescription: (description: string) => void; templateFieldMultiColumn: boolean; setTemplateFieldMultiColumn: (multi: boolean) => void; templateFieldColumnCount: number; setTemplateFieldColumnCount: (count: number) => void; templateFieldColumnNames: string[]; setTemplateFieldColumnNames: (names: string[]) => void; handleAddTemplateField: () => void | Promise; // 항목 관련 props itemMasterFields?: ItemMasterField[]; templateFieldInputMode?: 'custom' | 'master'; setTemplateFieldInputMode?: (mode: 'custom' | 'master') => void; showMasterFieldList?: boolean; setShowMasterFieldList?: (show: boolean) => void; selectedMasterFieldId?: string; setSelectedMasterFieldId?: (id: string) => void; } export function TemplateFieldDialog({ isTemplateFieldDialogOpen, setIsTemplateFieldDialogOpen, editingTemplateFieldId, setEditingTemplateFieldId, templateFieldName, setTemplateFieldName, templateFieldKey, setTemplateFieldKey, templateFieldInputType, setTemplateFieldInputType, templateFieldRequired, setTemplateFieldRequired, templateFieldOptions, setTemplateFieldOptions, templateFieldDescription, setTemplateFieldDescription, templateFieldMultiColumn, setTemplateFieldMultiColumn, templateFieldColumnCount, setTemplateFieldColumnCount, templateFieldColumnNames, setTemplateFieldColumnNames, handleAddTemplateField, // 항목 관련 props (optional) itemMasterFields = [], templateFieldInputMode = 'custom', setTemplateFieldInputMode, showMasterFieldList = false, setShowMasterFieldList, selectedMasterFieldId = '', setSelectedMasterFieldId, }: TemplateFieldDialogProps) { const [isSubmitted, setIsSubmitted] = useState(false); // 유효성 검사 const isNameEmpty = !templateFieldName.trim(); const isKeyEmpty = !templateFieldKey.trim(); const handleClose = () => { setIsSubmitted(false); setIsTemplateFieldDialogOpen(false); setEditingTemplateFieldId(null); setTemplateFieldName(''); setTemplateFieldKey(''); setTemplateFieldInputType('textbox'); setTemplateFieldRequired(false); setTemplateFieldOptions(''); setTemplateFieldDescription(''); setTemplateFieldMultiColumn(false); setTemplateFieldColumnCount(2); setTemplateFieldColumnNames(['컬럼1', '컬럼2']); // 항목 관련 상태 초기화 setTemplateFieldInputMode?.('custom'); setShowMasterFieldList?.(false); setSelectedMasterFieldId?.(''); }; const handleSelectMasterField = (field: ItemMasterField) => { setSelectedMasterFieldId?.(String(field.id)); setTemplateFieldName(field.field_name); setTemplateFieldKey(field.id.toString()); setTemplateFieldInputType(field.field_type); setTemplateFieldRequired(field.properties?.required || false); setTemplateFieldDescription(field.description || ''); // options는 {label, value}[] 배열이므로 label만 추출 setTemplateFieldOptions(field.options?.map(opt => opt.label).join(', ') || ''); if (field.properties?.multiColumn && field.properties?.columnNames) { setTemplateFieldMultiColumn(true); setTemplateFieldColumnCount(field.properties.columnNames.length); setTemplateFieldColumnNames(field.properties.columnNames); } else { setTemplateFieldMultiColumn(false); } }; return ( {editingTemplateFieldId ? '항목 수정' : '항목 추가'} 재사용 가능한 항목을 선택하거나 직접 입력하세요
{/* 입력 모드 선택 (편집 시에는 표시 안 함) */} {!editingTemplateFieldId && setTemplateFieldInputMode && (
)} {/* 항목 목록 */} {templateFieldInputMode === 'master' && !editingTemplateFieldId && showMasterFieldList && (
{itemMasterFields.length === 0 ? (

등록된 항목이 없습니다

) : (
{itemMasterFields.map(field => (
handleSelectMasterField(field)} >
{field.field_name} {INPUT_TYPE_OPTIONS.find(o => o.value === field.field_type)?.label || field.field_type} {field.properties?.required && ( 필수 )}
{field.description && (

{field.description}

)} {field.category && (
{field.category}
)}
{selectedMasterFieldId === String(field.id) && ( )}
))}
)}
)} {/* 직접 입력 폼 */} {(templateFieldInputMode === 'custom' || editingTemplateFieldId || !setTemplateFieldInputMode) && ( <>
setTemplateFieldName(e.target.value)} placeholder="예: 품목명" className={isSubmitted && isNameEmpty ? 'border-red-500 focus-visible:ring-red-500' : ''} /> {isSubmitted && isNameEmpty && (

항목명을 입력해주세요

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

필드 키를 입력해주세요

)}
{templateFieldInputType === 'dropdown' && (
setTemplateFieldOptions(e.target.value)} placeholder="옵션1, 옵션2, 옵션3 (쉼표로 구분)" />
)} {(templateFieldInputType === 'textbox' || templateFieldInputType === 'textarea') && (
{templateFieldMultiColumn && ( <>
{ const count = parseInt(e.target.value) || 2; setTemplateFieldColumnCount(count); const newNames = Array.from({ length: count }, (_, i) => templateFieldColumnNames[i] || `컬럼${i + 1}` ); setTemplateFieldColumnNames(newNames); }} />
{Array.from({ length: templateFieldColumnCount }).map((_, idx) => ( { const newNames = [...templateFieldColumnNames]; newNames[idx] = e.target.value; setTemplateFieldColumnNames(newNames); }} /> ))}
)}
)}