/* ===== 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 = `
`;
}
}
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 => `
`).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'); }
}