import { useState } from 'react' import { useSubMenu } from '../../hooks/useSubMenu' // Mock data const mockUsers = [ { id: 1, name: '김해양', email: 'kim@kosg.go.kr', dept: '방제기술과', role: 'admin', status: 'active', lastLogin: '2026-02-16 09:30' }, { id: 2, name: '이방제', email: 'lee@kosg.go.kr', dept: '해양환경과', role: 'manager', status: 'active', lastLogin: '2026-02-15 14:20' }, { id: 3, name: '박구난', email: 'park@kosg.go.kr', dept: '긴급대응팀', role: 'user', status: 'active', lastLogin: '2026-02-16 08:15' }, { id: 4, name: '최분석', email: 'choi@kosg.go.kr', dept: '방제기술과', role: 'user', status: 'active', lastLogin: '2026-02-14 16:45' }, { id: 5, name: '정예측', email: 'jung@kosg.go.kr', dept: '해양환경과', role: 'user', status: 'inactive', lastLogin: '2026-01-20 11:00' }, { id: 6, name: '한기상', email: 'han@kosg.go.kr', dept: '기상관측팀', role: 'viewer', status: 'active', lastLogin: '2026-02-16 07:50' }, ] const roleLabels: Record = { admin: { label: '관리자', color: 'var(--red)' }, manager: { label: '매니저', color: 'var(--orange)' }, user: { label: '사용자', color: 'var(--cyan)' }, viewer: { label: '뷰어', color: 'var(--t3)' }, } const mockMenus = [ { id: 'prediction', label: '유출유 확산예측', enabled: true, order: 1 }, { id: 'hns', label: 'HNS·대기확산', enabled: true, order: 2 }, { id: 'rescue', label: '긴급구난', enabled: true, order: 3 }, { id: 'reports', label: '보고자료', enabled: true, order: 4 }, { id: 'aerial', label: '항공탐색', enabled: true, order: 5 }, { id: 'assets', label: '방제자산 관리', enabled: true, order: 6 }, { id: 'scat', label: 'Pre-SCAT', enabled: false, order: 7 }, { id: 'incidents', label: '사고조회', enabled: true, order: 8 }, { id: 'board', label: '게시판', enabled: true, order: 9 }, { id: 'weather', label: '기상정보', enabled: true, order: 10 }, ] function UsersPanel() { const [searchTerm, setSearchTerm] = useState('') const filtered = mockUsers.filter(u => u.name.includes(searchTerm) || u.email.includes(searchTerm) || u.dept.includes(searchTerm) ) return (

사용자 관리

총 {mockUsers.length}명

setSearchTerm(e.target.value)} className="w-56 px-3 py-2 text-xs bg-bg-2 border border-border rounded-md text-text-1 placeholder-text-3 focus:border-primary-cyan focus:outline-none font-korean" />
{filtered.map((user) => ( ))}
이름 이메일 부서 역할 상태 최근 로그인 관리
{user.name} {user.email} {user.dept} {roleLabels[user.role].label} {user.status === 'active' ? '활성' : '비활성'} {user.lastLogin}
) } function PermissionsPanel() { const roles = ['admin', 'manager', 'user', 'viewer'] const permissions = [ { id: 'prediction', label: '유출유 확산예측', desc: '확산 예측 실행 및 결과 조회' }, { id: 'hns', label: 'HNS·대기확산', desc: '대기확산 분석 실행 및 조회' }, { id: 'rescue', label: '긴급구난', desc: '구난 예측 실행 및 조회' }, { id: 'reports', label: '보고자료', desc: '보고자료 생성 및 관리' }, { id: 'aerial', label: '항공탐색', desc: '항공탐색 계획 및 결과 조회' }, { id: 'assets', label: '방제자산 관리', desc: '방제자산 등록 및 관리' }, { id: 'incidents', label: '사고조회', desc: '사고 정보 등록 및 조회' }, { id: 'admin', label: '관리자 설정', desc: '시스템 관리 기능 접근' }, ] const [matrix, setMatrix] = useState>>(() => { const m: Record> = {} permissions.forEach(p => { m[p.id] = { admin: true, manager: p.id !== 'admin', user: !['admin', 'assets'].includes(p.id), viewer: !['admin', 'assets', 'reports'].includes(p.id), } }) return m }) const toggle = (permId: string, role: string) => { setMatrix(prev => ({ ...prev, [permId]: { ...prev[permId], [role]: !prev[permId][role] } })) } return (

사용자 권한 관리

역할별 메뉴 접근 권한을 설정합니다

{roles.map(role => ( ))} {permissions.map((perm) => ( {roles.map(role => ( ))} ))}
기능 {roleLabels[role].label}
{perm.label}
{perm.desc}
) } function MenusPanel() { const [menus, setMenus] = useState(mockMenus) const toggleMenu = (id: string) => { setMenus(prev => prev.map(m => m.id === id ? { ...m, enabled: !m.enabled } : m)) } return (

메뉴 관리

메뉴 표시 여부 및 순서를 관리합니다

{menus.map((menu, idx) => (
{idx + 1}
{menu.label}
{menu.id}
))}
) } export function AdminView() { const { activeSubTab } = useSubMenu('admin') return (
{activeSubTab === 'users' && } {activeSubTab === 'permissions' && } {activeSubTab === 'menus' && }
) }