/* ===== Departments CRUD ===== */ let departments = [], departmentsLoaded = false; async function loadDepartments() { try { const r = await api('/departments'); departments = r.data || r; departmentsLoaded = true; populateParentDeptSelects(); displayDepartments(); } catch (err) { document.getElementById('departmentList').innerHTML = `

${err.message}

`; } } function populateParentDeptSelects() { ['newDeptParent','editDeptParent'].forEach(id => { const sel = document.getElementById(id); if (!sel) return; const val = sel.value; sel.innerHTML = ''; departments.filter(d => d.is_active !== 0 && d.is_active !== false).forEach(d => { const o = document.createElement('option'); o.value = d.department_id; o.textContent = d.department_name; sel.appendChild(o); }); sel.value = val; }); } let selectedDeptForMembers = null; function displayDepartments() { const c = document.getElementById('departmentList'); if (!departments.length) { c.innerHTML = '

등록된 부서가 없습니다.

'; return; } c.innerHTML = departments.map(d => `
${d.department_name}
${d.parent_name ? `상위: ${d.parent_name}` : '최상위'} 순서: ${d.display_order || 0} ${d.is_active === 0 || d.is_active === false ? '비활성' : '활성'}
${d.is_active !== 0 && d.is_active !== false ? `` : ''}
`).join(''); } async function showDeptMembers(deptId) { selectedDeptForMembers = deptId; displayDepartments(); const panel = document.getElementById('deptMembersPanel'); const list = document.getElementById('deptMembersList'); panel.classList.remove('hidden'); list.innerHTML = '
'; let deptUsers = users; if (!deptUsers || !deptUsers.length) { try { const r = await api('/users'); deptUsers = r.data || r; } catch (e) { list.innerHTML = `

${e.message}

`; return; } } const members = deptUsers.filter(u => u.department_id === deptId); const dept = departments.find(d => d.department_id === deptId); const title = panel.querySelector('h3'); if (title) title.innerHTML = `소속 인원 — ${dept ? dept.department_name : ''}`; if (!members.length) { list.innerHTML = '

소속 인원이 없습니다

'; return; } list.innerHTML = members.map(u => `
${(u.name || u.username).charAt(0)}
${u.name || u.username}
${u.username}
${u.role === 'admin' ? '관리자' : '사용자'} ${u.is_active === 0 || u.is_active === false ? '비활성' : '활성'}
`).join(''); } document.getElementById('addDepartmentForm').addEventListener('submit', async e => { e.preventDefault(); try { await api('/departments', { method: 'POST', body: JSON.stringify({ department_name: document.getElementById('newDeptName').value.trim(), parent_id: document.getElementById('newDeptParent').value ? parseInt(document.getElementById('newDeptParent').value) : null, description: document.getElementById('newDeptDescription').value.trim() || null, display_order: parseInt(document.getElementById('newDeptOrder').value) || 0 })}); showToast('부서가 추가되었습니다.'); document.getElementById('addDepartmentForm').reset(); await loadDepartments(); } catch(e) { showToast(e.message, 'error'); } }); function editDepartment(id) { const d = departments.find(x => x.department_id === id); if (!d) return; document.getElementById('editDeptId').value = d.department_id; document.getElementById('editDeptName').value = d.department_name; document.getElementById('editDeptDescription').value = d.description || ''; document.getElementById('editDeptOrder').value = d.display_order || 0; document.getElementById('editDeptActive').value = (d.is_active === 0 || d.is_active === false) ? '0' : '1'; populateParentDeptSelects(); document.getElementById('editDeptParent').value = d.parent_id || ''; document.getElementById('editDepartmentModal').classList.remove('hidden'); } function closeDepartmentModal() { document.getElementById('editDepartmentModal').classList.add('hidden'); } document.getElementById('editDepartmentForm').addEventListener('submit', async e => { e.preventDefault(); try { await api(`/departments/${document.getElementById('editDeptId').value}`, { method: 'PUT', body: JSON.stringify({ department_name: document.getElementById('editDeptName').value.trim(), parent_id: document.getElementById('editDeptParent').value ? parseInt(document.getElementById('editDeptParent').value) : null, description: document.getElementById('editDeptDescription').value.trim() || null, display_order: parseInt(document.getElementById('editDeptOrder').value) || 0, is_active: document.getElementById('editDeptActive').value === '1' })}); showToast('수정되었습니다.'); closeDepartmentModal(); await loadDepartments(); await loadDepartmentsForSelect(); } catch(e) { showToast(e.message, 'error'); } }); async function deactivateDepartment(id, name) { if (!confirm(`"${name}" 부서를 비활성화?`)) return; try { await api(`/departments/${id}`, { method: 'DELETE' }); showToast('부서 비활성화 완료'); await loadDepartments(); } catch(e) { showToast(e.message, 'error'); } }