import { useEffect, useState } from 'react' import { roleList, createRole, updateRole, deleteRoles } from '../../../api/uiws' import { PageHeader, SearchBar, Input, Button, DataGrid, Modal, FormField, Spinner, YnBadge, type Column, } from '../../../components/uiws/ui' interface RoleRow extends Record { roleId: string; roleNm: string; roleDesc: string; useYn: string } function friendlyError(e: any): string { if (e?.response?.status === 403) return '권한이 없습니다 (관리자 전용).' if (e?.response?.status === 409) return '이미 존재하는 권한ID입니다.' return e?.response?.data?.message || '요청을 처리하지 못했습니다. 잠시 후 다시 시도하세요.' } export default function RoleManagement() { const [rows, setRows] = useState([]) const [keyword, setKeyword] = useState('') const [loading, setLoading] = useState(false) const [err, setErr] = useState('') const [selected, setSelected] = useState>(new Set()) const [edit, setEdit] = useState(null) const [showForm, setShowForm] = useState(false) const load = async (kw = keyword) => { setLoading(true); setErr('') try { const res = await roleList(kw || undefined) // Mall 계약: 목록은 PageResponse { content, total, page, size } setRows(res.data.data?.content ?? []) setSelected(new Set()) } catch (e) { setErr(friendlyError(e)) } finally { setLoading(false) } } useEffect(() => { load('') }, []) const toggleSel = (id: string) => setSelected(prev => { const n = new Set(prev); n.has(id) ? n.delete(id) : n.add(id); return n }) const removeSelected = async () => { if (selected.size === 0) return if (!window.confirm(`선택한 권한 ${selected.size}건을 삭제하시겠습니까?`)) return try { await deleteRoles([...selected]); await load() } catch (e) { setErr(friendlyError(e)) } } const columns: Column[] = [ { key: 'sel', header: '', width: 44, align: 'center', render: r => ( e.stopPropagation()} onChange={() => toggleSel(r.roleId)} /> ), }, { key: 'roleId', header: '권한ID', width: 180 }, { key: 'roleNm', header: '권한명' }, { key: 'roleDesc', header: '설명' }, { key: 'useYn', header: '사용', width: 80, align: 'center', render: r => }, ] return (
} /> {err &&
{err}
} {loading ? : ( r.roleId} onRowClick={r => { setEdit(r); setShowForm(true) }} empty="등록된 권한이 없습니다." /> )} {showForm && ( setShowForm(false)} onSaved={() => { setShowForm(false); load() }} /> )}
) } function RoleForm({ role, onClose, onSaved }: { role: RoleRow | null; onClose: () => void; onSaved: () => void }) { const editing = !!role const [roleId, setRoleId] = useState(role?.roleId ?? '') const [roleNm, setRoleNm] = useState(role?.roleNm ?? '') const [roleDesc, setRoleDesc] = useState(role?.roleDesc ?? '') const [useYn, setUseYn] = useState(role?.useYn ?? 'Y') const [err, setErr] = useState('') const save = async () => { setErr('') if (!roleNm.trim()) { setErr('권한명은 필수입니다.'); return } if (!editing && !roleId.trim()) { setErr('권한ID는 필수입니다.'); return } try { const body = { roleId, roleNm, roleDesc, useYn } editing ? await updateRole(roleId, body) : await createRole(body) onSaved() } catch (e) { setErr(friendlyError(e)) } } return ( }> {err &&
{err}
}
) }