fix(core): escHtml const 충돌 해소 — 모바일 페이지 긴급 복구

tkfb-core.js의 const escHtml이 4개 JS 파일의 function escHtml()과
전역 스코프에서 충돌하여 SyntaxError 발생, 해당 페이지 JS 전체 미실행.
- tkfb-core.js에서 const escHtml 제거
- schedule.html에서 escHtml → escapeHtml 직접 호출로 변경

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-04-01 11:11:29 +09:00
parent 7c1369a1be
commit 661523e963
2 changed files with 3 additions and 4 deletions

View File

@@ -361,21 +361,21 @@
const r = await apiFetch('/api/schedule/product-types');
typeSel.innerHTML = '<option value="">선택</option>';
(r.data || []).forEach(pt => {
typeSel.innerHTML += `<option value="${pt.code}">${pt.code} - ${escHtml(pt.name)}</option>`;
typeSel.innerHTML += `<option value="${pt.code}">${pt.code} - ${escapeHtml(pt.name)}</option>`;
});
} catch(e) { console.warn('제품유형 로드 실패:', e); }
// 프로젝트 목록 (기존 gantt에서 사용 중인 projects 변수 활용)
if (typeof allProjects !== 'undefined' && allProjects.length) {
projSel.innerHTML = allProjects.map(p =>
`<option value="${p.project_id}">${escHtml(p.job_no)} - ${escHtml(p.project_name)}</option>`
`<option value="${p.project_id}">${escapeHtml(p.job_no)} - ${escapeHtml(p.project_name)}</option>`
).join('');
} else {
try {
const r = await apiFetch('/api/projects/active');
const projs = r.data || [];
projSel.innerHTML = projs.map(p =>
`<option value="${p.project_id}">${escHtml(p.job_no)} - ${escHtml(p.project_name)}</option>`
`<option value="${p.project_id}">${escapeHtml(p.job_no)} - ${escapeHtml(p.project_name)}</option>`
).join('');
} catch(e) { projSel.innerHTML = '<option>프로젝트 로드 실패</option>'; }
}

View File

@@ -64,7 +64,6 @@ function showToast(msg, type = 'success') {
/* ===== Escape ===== */
function escapeHtml(str) { if (!str) return ''; const d = document.createElement('div'); d.textContent = str; return d.innerHTML; }
const escHtml = escapeHtml;
/* ===== Helpers ===== */
function formatDate(d) { if (!d) return ''; return String(d).substring(0, 10); }