// 코드 관리 페이지 JavaScript // 전역 변수 let workStatusTypes = []; let errorTypes = []; let workTypes = []; let currentCodeType = 'work-status'; let currentEditingCode = null; // 페이지 초기화 document.addEventListener('DOMContentLoaded', function() { console.log('🏷️ 코드 관리 페이지 초기화 시작'); initializePage(); loadAllCodes(); }); // 페이지 초기화 function initializePage() { // 시간 업데이트 시작 updateCurrentTime(); setInterval(updateCurrentTime, 1000); // 사용자 정보 업데이트 updateUserInfo(); // 프로필 메뉴 토글 setupProfileMenu(); // 로그아웃 버튼 setupLogoutButton(); } // 현재 시간 업데이트 function updateCurrentTime() { const now = new Date(); const timeString = now.toLocaleTimeString('ko-KR', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' }); const timeElement = document.getElementById('timeValue'); if (timeElement) { timeElement.textContent = timeString; } } // 사용자 정보 업데이트 // navbar/sidebar는 app-init.js에서 공통 처리 function updateUserInfo() { // app-init.js가 navbar 사용자 정보를 처리 } // 프로필 메뉴 설정 function setupProfileMenu() { const userProfile = document.getElementById('userProfile'); const profileMenu = document.getElementById('profileMenu'); if (userProfile && profileMenu) { userProfile.addEventListener('click', function(e) { e.stopPropagation(); const isVisible = profileMenu.style.display === 'block'; profileMenu.style.display = isVisible ? 'none' : 'block'; }); // 외부 클릭 시 메뉴 닫기 document.addEventListener('click', function() { profileMenu.style.display = 'none'; }); } } // 로그아웃 버튼 설정 function setupLogoutButton() { const logoutBtn = document.getElementById('logoutBtn'); if (logoutBtn) { logoutBtn.addEventListener('click', function() { if (confirm('로그아웃 하시겠습니까?')) { localStorage.removeItem('token'); localStorage.removeItem('user'); localStorage.removeItem('userInfo'); window.location.href = '/index.html'; } }); } } // 모든 코드 데이터 로드 async function loadAllCodes() { try { console.log('📊 모든 코드 데이터 로딩 시작'); await Promise.all([ loadWorkStatusTypes(), // loadErrorTypes(), // 오류 유형은 신고 시스템으로 대체됨 loadWorkTypes() ]); // 현재 활성 탭 렌더링 renderCurrentTab(); } catch (error) { console.error('코드 데이터 로딩 오류:', error); showToast('코드 데이터를 불러오는데 실패했습니다.', 'error'); } } // 작업 상태 유형 로드 async function loadWorkStatusTypes() { try { console.log('📊 작업 상태 유형 로딩...'); const response = await apiCall('/daily-work-reports/work-status-types', 'GET'); let statusData = []; if (response && response.success && Array.isArray(response.data)) { statusData = response.data; } else if (Array.isArray(response)) { statusData = response; } workStatusTypes = statusData; console.log(`✅ 작업 상태 유형 ${workStatusTypes.length}개 로드 완료`); } catch (error) { console.error('작업 상태 유형 로딩 오류:', error); workStatusTypes = []; } } // 오류 유형 로드 async function loadErrorTypes() { try { console.log('⚠️ 오류 유형 로딩...'); const response = await apiCall('/daily-work-reports/error-types', 'GET'); let errorData = []; if (response && response.success && Array.isArray(response.data)) { errorData = response.data; } else if (Array.isArray(response)) { errorData = response; } errorTypes = errorData; console.log(`✅ 오류 유형 ${errorTypes.length}개 로드 완료`); } catch (error) { console.error('오류 유형 로딩 오류:', error); errorTypes = []; } } // 작업 유형 로드 async function loadWorkTypes() { try { console.log('🔧 작업 유형 로딩...'); const response = await apiCall('/daily-work-reports/work-types', 'GET'); let typeData = []; if (response && response.success && Array.isArray(response.data)) { typeData = response.data; } else if (Array.isArray(response)) { typeData = response; } workTypes = typeData; console.log(`✅ 작업 유형 ${workTypes.length}개 로드 완료`); } catch (error) { console.error('작업 유형 로딩 오류:', error); workTypes = []; } } // 코드 탭 전환 function switchCodeTab(tabName) { // 탭 버튼 활성화 상태 변경 document.querySelectorAll('.tab-btn').forEach(btn => { btn.classList.remove('active'); }); document.querySelector(`[data-tab="${tabName}"]`).classList.add('active'); // 탭 콘텐츠 표시/숨김 document.querySelectorAll('.code-tab-content').forEach(content => { content.classList.remove('active'); }); document.getElementById(`${tabName}-tab`).classList.add('active'); currentCodeType = tabName; renderCurrentTab(); } // 현재 탭 렌더링 function renderCurrentTab() { switch (currentCodeType) { case 'work-status': renderWorkStatusTypes(); break; // case 'error-types': // 오류 유형은 신고 시스템으로 대체됨 // renderErrorTypes(); // break; case 'work-types': renderWorkTypes(); break; } } // 작업 상태 유형 렌더링 function renderWorkStatusTypes() { const grid = document.getElementById('workStatusGrid'); if (!grid) return; if (workStatusTypes.length === 0) { grid.innerHTML = `
📊

등록된 작업 상태 유형이 없습니다.

"새 상태 추가" 버튼을 눌러 작업 상태를 등록해보세요.

`; updateWorkStatusStats(); return; } let gridHtml = ''; workStatusTypes.forEach(status => { const isError = status.is_error === 1 || status.is_error === true; const statusClass = isError ? 'error-status' : 'normal-status'; const statusIcon = isError ? '❌' : '✅'; const statusLabel = isError ? '오류' : '정상'; gridHtml += `
${statusIcon}

${status.name}

${statusLabel}
${status.description ? `

${status.description}

` : ''}
등록: ${formatDate(status.created_at)}
`; }); grid.innerHTML = gridHtml; updateWorkStatusStats(); } // 오류 유형 렌더링 function renderErrorTypes() { const grid = document.getElementById('errorTypesGrid'); if (!grid) return; if (errorTypes.length === 0) { grid.innerHTML = `
⚠️

등록된 오류 유형이 없습니다.

"새 오류 유형 추가" 버튼을 눌러 오류 유형을 등록해보세요.

`; updateErrorTypesStats(); return; } let gridHtml = ''; errorTypes.forEach(error => { const severityMap = { 'low': { icon: '🟢', label: '낮음', class: 'severity-low' }, 'medium': { icon: '🟡', label: '보통', class: 'severity-medium' }, 'high': { icon: '🟠', label: '높음', class: 'severity-high' }, 'critical': { icon: '🔴', label: '심각', class: 'severity-critical' } }; const severity = severityMap[error.severity] || severityMap.medium; gridHtml += `
⚠️

${error.name}

${severity.icon} ${severity.label}
${error.description ? `

${error.description}

` : ''} ${error.solution_guide ? `
해결 가이드:
${error.solution_guide}
` : ''}
등록: ${formatDate(error.created_at)} ${error.updated_at !== error.created_at ? `수정: ${formatDate(error.updated_at)}` : ''}
`; }); grid.innerHTML = gridHtml; updateErrorTypesStats(); } // 작업 유형 렌더링 function renderWorkTypes() { const grid = document.getElementById('workTypesGrid'); if (!grid) return; if (workTypes.length === 0) { grid.innerHTML = `
🔧

등록된 작업 유형이 없습니다.

"새 작업 유형 추가" 버튼을 눌러 작업 유형을 등록해보세요.

`; updateWorkTypesStats(); return; } let gridHtml = ''; workTypes.forEach(type => { gridHtml += `
🔧

${type.name}

${type.category ? `📁 ${type.category}` : ''}
${type.description ? `

${type.description}

` : ''}
등록: ${formatDate(type.created_at)} ${type.updated_at !== type.created_at ? `수정: ${formatDate(type.updated_at)}` : ''}
`; }); grid.innerHTML = gridHtml; updateWorkTypesStats(); } // 작업 상태 통계 업데이트 function updateWorkStatusStats() { const total = workStatusTypes.length; const normal = workStatusTypes.filter(s => !s.is_error).length; const error = workStatusTypes.filter(s => s.is_error).length; document.getElementById('workStatusCount').textContent = total; document.getElementById('normalStatusCount').textContent = normal; document.getElementById('errorStatusCount').textContent = error; } // 오류 유형 통계 업데이트 function updateErrorTypesStats() { const total = errorTypes.length; const critical = errorTypes.filter(e => e.severity === 'critical').length; const high = errorTypes.filter(e => e.severity === 'high').length; const medium = errorTypes.filter(e => e.severity === 'medium').length; const low = errorTypes.filter(e => e.severity === 'low').length; document.getElementById('errorTypesCount').textContent = total; document.getElementById('criticalErrorsCount').textContent = critical; document.getElementById('highErrorsCount').textContent = high; document.getElementById('mediumErrorsCount').textContent = medium; document.getElementById('lowErrorsCount').textContent = low; } // 작업 유형 통계 업데이트 function updateWorkTypesStats() { const total = workTypes.length; const categories = new Set(workTypes.map(t => t.category).filter(Boolean)).size; document.getElementById('workTypesCount').textContent = total; document.getElementById('workCategoriesCount').textContent = categories; } // 코드 모달 열기 function openCodeModal(codeType, codeData = null) { const modal = document.getElementById('codeModal'); const modalTitle = document.getElementById('modalTitle'); const deleteBtn = document.getElementById('deleteCodeBtn'); if (!modal) return; currentEditingCode = codeData; // 모든 전용 필드 숨기기 document.getElementById('isErrorGroup').style.display = 'none'; document.getElementById('severityGroup').style.display = 'none'; document.getElementById('solutionGuideGroup').style.display = 'none'; document.getElementById('categoryGroup').style.display = 'none'; // 코드 유형별 설정 switch (codeType) { case 'work-status': modalTitle.textContent = codeData ? '작업 상태 수정' : '새 작업 상태 추가'; document.getElementById('isErrorGroup').style.display = 'block'; break; case 'error-types': modalTitle.textContent = codeData ? '오류 유형 수정' : '새 오류 유형 추가'; document.getElementById('severityGroup').style.display = 'block'; document.getElementById('solutionGuideGroup').style.display = 'block'; break; case 'work-types': modalTitle.textContent = codeData ? '작업 유형 수정' : '새 작업 유형 추가'; document.getElementById('categoryGroup').style.display = 'block'; updateCategoryList(); break; } document.getElementById('codeType').value = codeType; if (codeData) { // 수정 모드 deleteBtn.style.display = 'inline-flex'; // 폼에 데이터 채우기 document.getElementById('codeId').value = codeData.id; document.getElementById('codeName').value = codeData.name || ''; document.getElementById('codeDescription').value = codeData.description || ''; // 코드 유형별 필드 채우기 if (codeType === 'work-status') { document.getElementById('isError').checked = codeData.is_error === 1 || codeData.is_error === true; } else if (codeType === 'error-types') { document.getElementById('severity').value = codeData.severity || 'medium'; document.getElementById('solutionGuide').value = codeData.solution_guide || ''; } else if (codeType === 'work-types') { document.getElementById('category').value = codeData.category || ''; } } else { // 신규 등록 모드 deleteBtn.style.display = 'none'; // 폼 초기화 document.getElementById('codeForm').reset(); document.getElementById('codeId').value = ''; document.getElementById('codeType').value = codeType; } modal.style.display = 'flex'; document.body.style.overflow = 'hidden'; // 첫 번째 입력 필드에 포커스 setTimeout(() => { document.getElementById('codeName').focus(); }, 100); } // 카테고리 목록 업데이트 function updateCategoryList() { const categoryList = document.getElementById('categoryList'); if (categoryList) { const categories = [...new Set(workTypes.map(t => t.category).filter(Boolean))].sort(); categoryList.innerHTML = categories.map(cat => `