/** * issues-dashboard.js — 부적합 현황판 페이지 스크립트 */ let currentUser = null; let allIssues = []; let projects = []; let filteredIssues = []; // 애니메이션 함수들 function animateHeaderAppearance() { const header = document.getElementById('commonHeader'); if (header) { header.classList.add('header-fade-in'); } } function animateContentAppearance() { const content = document.querySelector('.content-fade-in'); if (content) { content.classList.add('visible'); } } // 페이지 초기화 async function initializeDashboard() { try { // 인증 확인 currentUser = await window.authManager.checkAuth(); if (!currentUser) { showLoginScreen(); return; } // 페이지 권한 확인 window.pagePermissionManager.setUser(currentUser); await window.pagePermissionManager.loadPagePermissions(); if (!window.pagePermissionManager.canAccessPage('issues_dashboard')) { alert('현황판 접근 권한이 없습니다.'); window.location.href = '/'; return; } // 공통 헤더 초기화 if (window.commonHeader) { await window.commonHeader.init(currentUser, 'issues_dashboard'); setTimeout(() => animateHeaderAppearance(), 100); } // 데이터 로드 await Promise.all([ loadProjects(), loadInProgressIssues() ]); updateDashboard(); hideLoadingScreen(); } catch (error) { console.error('대시보드 초기화 실패:', error); alert('대시보드를 불러오는데 실패했습니다.'); hideLoadingScreen(); } } // 로딩 스크린 관리 function hideLoadingScreen() { document.getElementById('loadingScreen').style.display = 'none'; } function showLoginScreen() { document.getElementById('loadingScreen').style.display = 'none'; document.getElementById('loginScreen').classList.remove('hidden'); } // 데이터 로드 함수들 async function loadProjects() { try { const apiUrl = window.API_BASE_URL || '/api'; const response = await fetch(`${apiUrl}/projects/`, { headers: { 'Authorization': `Bearer ${TokenManager.getToken()}`, 'Content-Type': 'application/json' } }); if (response.ok) { projects = await response.json(); updateProjectFilter(); } else { throw new Error('프로젝트 목록을 불러올 수 없습니다.'); } } catch (error) { console.error('프로젝트 로드 실패:', error); } } async function loadInProgressIssues() { try { const response = await fetch('/api/issues/admin/all', { headers: { 'Authorization': `Bearer ${TokenManager.getToken()}`, 'Content-Type': 'application/json' } }); if (response.ok) { const allData = await response.json(); // 진행 중 상태만 필터링 allIssues = allData.filter(issue => issue.review_status === 'in_progress'); filteredIssues = [...allIssues]; } else { throw new Error('부적합 목록을 불러올 수 없습니다.'); } } catch (error) { console.error('부적합 로드 실패:', error); } } // 프로젝트 필터 업데이트 function updateProjectFilter() { const projectFilter = document.getElementById('projectFilter'); projectFilter.innerHTML = ''; projects.forEach(project => { const option = document.createElement('option'); option.value = project.id; option.textContent = project.project_name; projectFilter.appendChild(option); }); } // 대시보드 업데이트 function updateDashboard() { updateStatistics(); updateProjectCards(); } // 통계 업데이트 function updateStatistics() { const today = new Date().toDateString(); // 오늘 신규 (오늘 수신함에서 진행중으로 넘어온 것들) const todayIssues = allIssues.filter(issue => issue.reviewed_at && new Date(issue.reviewed_at).toDateString() === today ); // 완료 대기 (완료 신청이 된 것들) const pendingCompletionIssues = allIssues.filter(issue => issue.completion_requested_at && issue.review_status === 'in_progress' ); // 지연 중 (마감일이 지난 것들) const overdueIssues = allIssues.filter(issue => { if (!issue.expected_completion_date) return false; const expectedDate = new Date(issue.expected_completion_date); const now = new Date(); return expectedDate < now; // 마감일 지남 }); document.getElementById('totalInProgress').textContent = allIssues.length; document.getElementById('todayNew').textContent = todayIssues.length; document.getElementById('pendingCompletion').textContent = pendingCompletionIssues.length; document.getElementById('overdue').textContent = overdueIssues.length; } // 이슈 카드 업데이트 (관리함 스타일 - 날짜별 그룹화) function updateProjectCards() { const container = document.getElementById('projectDashboard'); const emptyState = document.getElementById('emptyState'); if (filteredIssues.length === 0) { container.innerHTML = ''; emptyState.classList.remove('hidden'); return; } emptyState.classList.add('hidden'); // 날짜별로 그룹화 (관리함 진입일 기준) const groupedByDate = {}; const dateObjects = {}; // 정렬용 Date 객체 저장 filteredIssues.forEach(issue => { // reviewed_at이 있으면 관리함 진입일, 없으면 report_date 사용 const dateToUse = issue.reviewed_at || issue.report_date; const dateObj = new Date(dateToUse); const dateKey = dateObj.toLocaleDateString('ko-KR'); if (!groupedByDate[dateKey]) { groupedByDate[dateKey] = []; dateObjects[dateKey] = dateObj; } groupedByDate[dateKey].push(issue); }); // 날짜별 그룹 생성 const dateGroups = Object.keys(groupedByDate) .sort((a, b) => dateObjects[b] - dateObjects[a]) // 최신순 .map(dateKey => { const issues = groupedByDate[dateKey]; const formattedDate = dateObjects[dateKey].toLocaleDateString('ko-KR', { year: 'numeric', month: '2-digit', day: '2-digit' }).replace(/\./g, '. ').trim(); return `
검색 결과가 없습니다
'; results.classList.remove('hidden'); return; } results.innerHTML = data.results.map(r => { const meta = r.metadata || {}; const similarity = Math.round((r.similarity || 0) * 100); const issueId = meta.issue_id || r.id.replace('issue_', ''); const doc = (r.document || '').substring(0, 100); const cat = meta.category || ''; const status = meta.review_status || ''; return `${doc}
${issue.description}
${issue.detail_notes}
${issue.final_description}
${issue.solution}
${issue.cause_detail}
${issue.management_comment}
이슈를 불러올 수 없습니다
관리함에서 보기 →`; } } // 초기화 initializeDashboardApp();