import React, { useState, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { useAPI } from '@/providers/APIProvider'; import { ScrollArea } from '@/components/ui/scroll-area'; // User status enum mapped to descriptions const USER_STATUS = { WAITING: '가입승인 대기', ACTIVE: '활성화', RESET_PASSWORD: '비밀번호 초기화', INACTIVE: '비활성화', LOCKED: '잠김', DELETED: '삭제' }; const DEFAULT_USER = { esntlId: null, userId: '', password: '', password2: '', username: '', userSecurity: 'ROLE_USER', mobilePhone: '', status: 'WAITING', // Changed default to WAITING as per business logic lockAt: 'N', lockCnt: 0, createdAt: null, lastLockDate: null, lastPasswordChangeDate: null }; const UserEditDialog = ({ open, onOpenChange, item }) => { const { createUser, updateUser, error } = useAPI(); const [user, setUser] = useState(DEFAULT_USER); const [validationErrors, setValidationErrors] = useState({}); useEffect(() => { if (item) { setUser(item); } else { setUser(DEFAULT_USER); } }, [item]); const validateForm = () => { const errors = {}; if (!user.userId) errors.userId = '사용자 ID는 필수입니다.'; if (!user.username) errors.username = '이름은 필수입니다.'; if (!user.mobilePhone) errors.mobilePhone = '연락처는 필수입니다.'; if (!user.esntlId) { // Only validate passwords for new users if (!user.password) errors.password = '비밀번호는 필수입니다.'; if (user.password && user.password.length < 8) { errors.password = '비밀번호는 8자 이상이어야 합니다.'; } if (user.password !== user.password2) { errors.password2 = '비밀번호가 일치하지 않습니다.'; } } setValidationErrors(errors); return Object.keys(errors).length === 0; }; const handleSubmit = async (e) => { e.preventDefault(); if (!validateForm()) { return; } try { // Create a clean copy of the user data for API submission const userData = { ...user, createdAt: user.createdAt || undefined, lastLockDate: user.lastLockDate || undefined, lastPasswordChangeDate: user.lastPasswordChangeDate || undefined }; if (user.esntlId) { await updateUser(user.esntlId, userData); } else { await createUser(userData); } onOpenChange(false); } catch (error) { console.error('Failed to save user:', error); } }; const handleChange = (field, value) => { setUser(prev => ({ ...prev, [field]: value })); // Clear validation error when field is modified if (validationErrors[field]) { setValidationErrors(prev => ({ ...prev, [field]: undefined })); } }; return ( {user.esntlId == null ? '내부 사용자 등록' : '내부 사용자 수정'} 사용자 정보를 입력하거나 수정할 수 있습니다. 필수 항목을 모두 입력해주세요. {error && (
{error}
)}
{user.esntlId && (
)}
handleChange('userId', e.target.value)} disabled={!!user.esntlId} required className={validationErrors.userId ? 'border-red-500' : ''} /> {validationErrors.userId && (
{validationErrors.userId}
)}
{!user.esntlId && ( <>
handleChange('password', e.target.value)} required className={validationErrors.password ? 'border-red-500' : ''} /> {validationErrors.password && (
{validationErrors.password}
)}
handleChange('password2', e.target.value)} required className={validationErrors.password2 ? 'border-red-500' : ''} /> {validationErrors.password2 && (
{validationErrors.password2}
)}
)}
handleChange('username', e.target.value)} required className={validationErrors.username ? 'border-red-500' : ''} /> {validationErrors.username && (
{validationErrors.username}
)}
handleChange('mobilePhone', e.target.value)} required className={validationErrors.mobilePhone ? 'border-red-500' : ''} /> {validationErrors.mobilePhone && (
{validationErrors.mobilePhone}
)}
{user.esntlId && ( <>
{user.createdAt && (
)} {user.lastLockDate && (
)} {user.lastPasswordChangeDate && (
)} )}
); }; export default UserEditDialog;