/** * Project Master Overseas Inquiries JS * 기능: 문의사항 로드, 필터링, 답변 관리, 아코디언 및 이미지 모달 */ // --- 초기화 --- let allInquiries = []; let currentSort = { field: 'no', direction: 'desc' }; async function loadInquiries() { initStickyHeader(); const pmType = document.getElementById('filterPmType').value; const category = document.getElementById('filterCategory').value; const keyword = document.getElementById('searchKeyword').value; const params = new URLSearchParams({ pm_type: pmType, category: category, keyword: keyword }); try { const response = await fetch(`${API.INQUIRIES}?${params}`); allInquiries = await response.json(); refreshInquiryBoard(); } catch (e) { console.error("데이터 로딩 중 오류 발생:", e); } } function refreshInquiryBoard() { const status = document.getElementById('filterStatus').value; // 1. 상태 필터링 let filteredData = status ? allInquiries.filter(item => item.status === status) : [...allInquiries]; // 2. 정렬 적용 filteredData = sortData(filteredData); // 3. 통계 및 리스트 렌더링 updateStats(allInquiries); updateSortUI(); renderInquiryList(filteredData); } function handleSort(field) { if (currentSort.field === field) { currentSort.direction = currentSort.direction === 'asc' ? 'desc' : 'asc'; } else { currentSort.field = field; currentSort.direction = 'asc'; } refreshInquiryBoard(); } function sortData(data) { const { field, direction } = currentSort; const modifier = direction === 'asc' ? 1 : -1; return data.sort((a, b) => { let valA = a[field]; let valB = b[field]; // 숫자형 변환 시도 (No 필드 등) if (field === 'no' || !isNaN(valA)) { valA = Number(valA); valB = Number(valB); } // null/undefined 처리 if (valA === null || valA === undefined) valA = ""; if (valB === null || valB === undefined) valB = ""; if (valA < valB) return -1 * modifier; if (valA > valB) return 1 * modifier; return 0; }); } function updateSortUI() { // 모든 헤더 클래스 및 아이콘 초기화 document.querySelectorAll('.inquiry-table thead th.sortable').forEach(th => { th.classList.remove('active-sort'); const icon = th.querySelector('.sort-icon'); if (icon) { // 레이아웃 시프트 방지를 위해 투명한 기본 아이콘(또는 공백) 유지 icon.textContent = "▲"; icon.style.opacity = "0"; } }); // 현재 정렬된 헤더 강조 및 아이콘 표시 const activeTh = document.querySelector(`.inquiry-table thead th[onclick*="'${currentSort.field}'"]`); if (activeTh) { activeTh.classList.add('active-sort'); const icon = activeTh.querySelector('.sort-icon'); if (icon) { icon.textContent = currentSort.direction === 'asc' ? "▲" : "▼"; icon.style.opacity = "1"; } } } function initStickyHeader() { const header = document.getElementById('stickyHeader'); const thead = document.querySelector('.inquiry-table thead'); if (header && thead) { const headerHeight = header.offsetHeight; const totalOffset = 36 + headerHeight; document.querySelectorAll('.inquiry-table thead th').forEach(th => { th.style.top = totalOffset + 'px'; }); } } function renderInquiryList(data) { const tbody = document.getElementById('inquiryList'); tbody.innerHTML = data.map(item => `