/* ===== Projects CRUD ===== */ let projects = [], projectsLoaded = false, productTypesCache = []; function statusBadge(status, isActive) { if (!isActive || isActive === 0 || isActive === false) return '비활성'; if (status === 'completed') return '완료'; return '진행중'; } async function loadProductTypes() { try { const r = await api('/projects/product-types'); productTypesCache = r.data || []; ['newProductType', 'editProductType'].forEach(id => { const sel = document.getElementById(id); if (!sel) return; const val = sel.value; sel.innerHTML = ''; productTypesCache.forEach(pt => { const o = document.createElement('option'); o.value = pt.id; o.textContent = `${pt.code} - ${pt.name}`; sel.appendChild(o); }); sel.value = val; }); } catch(e) { console.warn('제품유형 로드 실패:', e); } } async function loadProjects() { try { await loadProductTypes(); const r = await api('/projects'); projects = r.data || r; projectsLoaded = true; displayProjects(); } catch (err) { document.getElementById('projectList').innerHTML = `
${escapeHtml(err.message)}
등록된 프로젝트가 없습니다.
'; return; } c.innerHTML = projects.map(p => `