import { useState, useEffect } from 'react'; import { Search, RefreshCw, Users, Check, X, User as UserIcon, Save, Settings, Shield, Mail } from 'lucide-react'; import { clsx } from 'clsx'; import { comms } from '@/communication'; import { GroupUser, UserLevelInfo, UserFullData } from '@/types'; // 사용자 상세 다이얼로그 Props interface UserDetailDialogProps { user: GroupUser; levelInfo: UserLevelInfo | null; onClose: () => void; onSave: () => void; } // 사용자 상세 다이얼로그 컴포넌트 function UserDetailDialog({ user, levelInfo, onClose, onSave }: UserDetailDialogProps) { const [formData, setFormData] = useState({ id: user.id, name: user.name || '', nameE: user.nameE || '', grade: user.grade || '', email: user.email || '', tel: user.tel || '', hp: user.hp || '', indate: user.indate || '', outdate: user.outdate || '', memo: user.memo || '', processs: user.processs || '', state: user.state || '', level: user.level || 1, useUserState: user.useUserState || false, useJobReport: user.useJobReport || false, exceptHoly: user.exceptHoly || false, }); const [saving, setSaving] = useState(false); // 편집 가능 여부: 관리자(level >= 5) 또는 본인 const isSelf = levelInfo?.CurrentUserId === user.id; const canEdit = levelInfo?.CanEdit || isSelf; const canEditAdmin = levelInfo?.CanEdit || false; // 관리자 전용 필드 const handleChange = (field: keyof UserFullData, value: string | number | boolean) => { setFormData(prev => ({ ...prev, [field]: value })); }; const handleSave = async () => { if (!canEdit) return; setSaving(true); try { const result = await comms.saveUserFull(formData); if (result.Success) { onSave(); onClose(); } else { alert(result.Message || '저장에 실패했습니다.'); } } catch (error) { console.error('저장 실패:', error); alert('저장 중 오류가 발생했습니다.'); } finally { setSaving(false); } }; return (
{/* 배경 오버레이 */}
{/* 다이얼로그 콘텐트 */}

사용자 정보 {canEdit ? '' : '(읽기 전용)'}

User Profile Management

{/* 기본 인사 정보 */}

인사 정보

handleChange('name', e.target.value)} disabled={!canEdit} className="w-full bg-transparent border-none text-sm text-white focus:outline-none placeholder:text-white/10" />
handleChange('nameE', e.target.value)} disabled={!canEdit} className="w-full bg-transparent border-none text-sm text-white focus:outline-none placeholder:text-white/10" />
handleChange('grade', e.target.value)} disabled={!canEdit} className="w-full bg-transparent border-none text-sm text-white focus:outline-none placeholder:text-white/10" />
handleChange('processs', e.target.value)} disabled={!canEdit} className="w-full bg-transparent border-none text-sm text-white focus:outline-none placeholder:text-white/10" />
handleChange('state', e.target.value)} disabled={!canEdit} className="w-full bg-transparent border-none text-sm text-white focus:outline-none placeholder:text-white/10" />
{/* 연락처 및 일정 */}

연락처 및 근태 정보

handleChange('email', e.target.value)} disabled={!canEdit} className="w-full bg-transparent border-none text-sm text-white focus:outline-none placeholder:text-white/10" />
handleChange('tel', e.target.value)} disabled={!canEdit} className="w-full bg-transparent border-none text-sm text-white focus:outline-none placeholder:text-white/10" />
handleChange('indate', e.target.value)} disabled={!canEdit} placeholder="YYYY-MM-DD" className="w-full bg-transparent border-none text-sm text-white focus:outline-none placeholder:text-white/10" />
handleChange('outdate', e.target.value)} disabled={!canEdit} placeholder="YYYY-MM-DD" className="w-full bg-transparent border-none text-sm text-white focus:outline-none placeholder:text-white/10" />
{/* 관리자 권한 및 메모 */}

시스템 설정 및 메모

{[ { id: 'useUserState', label: '계정 활성', checked: formData.useUserState }, { id: 'useJobReport', label: '일지 사용', checked: formData.useJobReport }, { id: 'exceptHoly', label: '휴가 제외', checked: formData.exceptHoly }, ].map((item) => ( ))}