import { useState, useEffect, useCallback } from 'react'; import { Users, Plus, Edit2, Trash2, Save, X, Loader2, RefreshCw, Search, Shield, Check, } from 'lucide-react'; import { comms } from '@/communication'; import { UserGroupItem, PermissionInfo } from '@/types'; const initialFormData: Partial = { dept: '', path_kj: '', permission: 0, advpurchase: false, advkisul: false, managerinfo: '', devinfo: '', usemail: false, }; // 비트 연산 헬퍼 함수 const getBit = (value: number, index: number): boolean => { return ((value >> index) & 1) === 1; }; const setBit = (value: number, index: number, flag: boolean): number => { if (flag) { return value | (1 << index); } else { return value & ~(1 << index); } }; export function UserGroupPage() { const [loading, setLoading] = useState(false); const [groups, setGroups] = useState([]); const [searchKey, setSearchKey] = useState(''); const [showModal, setShowModal] = useState(false); const [showPermissionModal, setShowPermissionModal] = useState(false); const [editingItem, setEditingItem] = useState(null); const [formData, setFormData] = useState>(initialFormData); const [permissionInfo, setPermissionInfo] = useState([]); const [saving, setSaving] = useState(false); const loadData = useCallback(async () => { setLoading(true); try { const [groupsRes, permRes] = await Promise.all([ comms.getUserGroupList(), comms.getPermissionInfo() ]); if (groupsRes.Success && groupsRes.Data) { setGroups(groupsRes.Data); } if (permRes.Success && permRes.Data) { setPermissionInfo(permRes.Data); } } catch (error) { console.error('데이터 로드 오류:', error); alert('데이터를 불러오는 중 오류가 발생했습니다.'); } finally { setLoading(false); } }, []); useEffect(() => { loadData(); }, [loadData]); const filteredItems = groups.filter(item => !searchKey || item.dept?.toLowerCase().includes(searchKey.toLowerCase()) || item.managerinfo?.toLowerCase().includes(searchKey.toLowerCase()) ); const openAddModal = () => { setEditingItem(null); setFormData(initialFormData); setShowModal(true); }; const openEditModal = (item: UserGroupItem) => { setEditingItem(item); setFormData({ dept: item.dept || '', path_kj: item.path_kj || '', permission: item.permission || 0, advpurchase: item.advpurchase || false, advkisul: item.advkisul || false, managerinfo: item.managerinfo || '', devinfo: item.devinfo || '', usemail: item.usemail || false, }); setShowModal(true); }; const openPermissionModal = (item: UserGroupItem) => { setEditingItem(item); setFormData({ ...formData, dept: item.dept, permission: item.permission || 0, }); setShowPermissionModal(true); }; const handlePermissionChange = (index: number, checked: boolean) => { const newPermission = setBit(formData.permission || 0, index, checked); setFormData({ ...formData, permission: newPermission }); }; const handleSavePermission = async () => { if (!editingItem) return; setSaving(true); try { const response = await comms.editUserGroup( editingItem.dept, editingItem.dept, editingItem.path_kj || '', formData.permission || 0, editingItem.advpurchase || false, editingItem.advkisul || false, editingItem.managerinfo || '', editingItem.devinfo || '', editingItem.usemail || false ); if (response.Success) { setShowPermissionModal(false); loadData(); } else { alert(response.Message || '저장에 실패했습니다.'); } } catch (error) { console.error('저장 오류:', error); alert('저장 중 오류가 발생했습니다.'); } finally { setSaving(false); } }; const handleSave = async () => { if (!formData.dept?.trim()) { alert('부서명을 입력해주세요.'); return; } setSaving(true); try { let response; if (editingItem) { response = await comms.editUserGroup( editingItem.dept, formData.dept || '', formData.path_kj || '', formData.permission || 0, formData.advpurchase || false, formData.advkisul || false, formData.managerinfo || '', formData.devinfo || '', formData.usemail || false ); } else { response = await comms.addUserGroup( formData.dept || '', formData.path_kj || '', formData.permission || 0, formData.advpurchase || false, formData.advkisul || false, formData.managerinfo || '', formData.devinfo || '', formData.usemail || false ); } if (response.Success) { setShowModal(false); loadData(); } else { alert(response.Message || '저장에 실패했습니다.'); } } catch (error) { console.error('저장 오류:', error); alert('저장 중 오류가 발생했습니다.'); } finally { setSaving(false); } }; const handleDelete = async (item: UserGroupItem) => { if (!confirm(`"${item.dept}" 그룹을 삭제하시겠습니까?`)) return; try { const response = await comms.deleteUserGroup(item.dept); if (response.Success) { loadData(); } else { alert(response.Message || '삭제에 실패했습니다.'); } } catch (error) { console.error('삭제 오류:', error); alert('삭제 중 오류가 발생했습니다.'); } }; // 권한 카운트 계산 const getPermissionCount = (permission: number): number => { let count = 0; for (let i = 0; i < 11; i++) { if (getBit(permission, i)) count++; } return count; }; return (
{/* 헤더 */}

그룹정보

부서/그룹 및 권한 관리

{/* 검색 */}
setSearchKey(e.target.value)} placeholder="부서명 검색..." className="pl-10 pr-4 py-2 bg-white/10 border border-white/10 rounded-lg text-white text-sm focus:outline-none focus:border-primary-500 w-48" />
{/* 목록 */}
{loading ? (
) : filteredItems.length === 0 ? (

등록된 그룹이 없습니다.

) : (
{filteredItems.map((item, index) => ( ))}
부서명 경로 권한 구매고급 기술고급 메일 관리자정보 작업
{item.dept} {item.path_kj || '-'} {item.advpurchase && } {item.advkisul && } {item.usemail && } {item.managerinfo || '-'}
)}
{/* 그룹 편집 모달 */} {showModal && (
{/* 모달 헤더 */}

{editingItem ? '그룹 수정' : '새 그룹'}

{/* 모달 내용 */}
{/* 부서명 */}
setFormData({ ...formData, dept: e.target.value })} className="w-full px-3 py-2 bg-white/10 border border-white/10 rounded-lg text-white focus:outline-none focus:border-primary-500" />
{/* 경로 */}
setFormData({ ...formData, path_kj: e.target.value })} className="w-full px-3 py-2 bg-white/10 border border-white/10 rounded-lg text-white focus:outline-none focus:border-primary-500" />
{/* 체크박스들 */}
{/* 관리자 정보 */}