/** * 내 신고 현황 페이지 JavaScript * 전체 유형(안전/시설설비/부적합) 통합 목록 */ const API_BASE = window.API_BASE_URL || 'http://localhost:30005/api'; // 상태 한글 변환 const STATUS_LABELS = { reported: '신고', received: '접수', in_progress: '처리중', completed: '완료', closed: '종료' }; // 유형 한글 변환 const TYPE_LABELS = { safety: '안전', facility: '시설설비', nonconformity: '부적합' }; // 유형별 배지 CSS 클래스 const TYPE_BADGE_CLASS = { safety: 'type-badge-safety', facility: 'type-badge-facility', nonconformity: 'type-badge-nonconformity' }; // DOM 요소 let issueList; let filterType, filterStatus, filterStartDate, filterEndDate; // 초기화 document.addEventListener('DOMContentLoaded', async () => { issueList = document.getElementById('issueList'); filterType = document.getElementById('filterType'); filterStatus = document.getElementById('filterStatus'); filterStartDate = document.getElementById('filterStartDate'); filterEndDate = document.getElementById('filterEndDate'); // 필터 이벤트 리스너 filterType.addEventListener('change', loadIssues); filterStatus.addEventListener('change', loadIssues); filterStartDate.addEventListener('change', loadIssues); filterEndDate.addEventListener('change', loadIssues); // 데이터 로드 await loadIssues(); }); /** * 클라이언트 사이드 통계 계산 */ function computeStats(issues) { const stats = { reported: 0, received: 0, in_progress: 0, completed: 0 }; issues.forEach(issue => { if (stats.hasOwnProperty(issue.status)) { stats[issue.status]++; } }); document.getElementById('statReported').textContent = stats.reported; document.getElementById('statReceived').textContent = stats.received; document.getElementById('statProgress').textContent = stats.in_progress; document.getElementById('statCompleted').textContent = stats.completed; } /** * 신고 목록 로드 (전체 유형) */ async function loadIssues() { try { const params = new URLSearchParams(); // 유형 필터 (선택한 경우만) if (filterType.value) { params.append('category_type', filterType.value); } if (filterStatus.value) params.append('status', filterStatus.value); if (filterStartDate.value) params.append('start_date', filterStartDate.value); if (filterEndDate.value) params.append('end_date', filterEndDate.value); const response = await fetch(`${API_BASE}/work-issues?${params.toString()}`, { headers: { 'Authorization': `Bearer ${(window.getSSOToken ? window.getSSOToken() : localStorage.getItem('sso_token'))}` } }); if (!response.ok) throw new Error('목록 조회 실패'); const data = await response.json(); if (data.success) { const issues = data.data || []; computeStats(issues); renderIssues(issues); } } catch (error) { console.error('신고 목록 로드 실패:', error); issueList.innerHTML = `
잠시 후 다시 시도해주세요.
새로운 문제를 신고하려면 '신고하기' 버튼을 클릭하세요.