/** 상품 그리드·페이지네이션 렌더링 */ import { state } from './state.js'; import { ITEMS_PER_PAGE, STATUS_META, STATUS_COLOR, PRODUCT_CONDITIONS } from './config.js'; import { updateSummary } from './main.js'; export function renderProducts(page = 1) { const grid = document.getElementById('product-grid'); const tableWrapper = document.getElementById('product-table-wrapper'); const tableBody = document.getElementById('product-table-body'); const summaryBar = document.getElementById('selection-summary'); const paginationContainer = document.getElementById('pagination'); if (!grid || !tableWrapper) return; // 1. 결과가 0개인 경우 (그리드/테이블 공통 안내) if (state.visibleProducts.length === 0) { grid.classList.remove('grid', 'hidden'); grid.innerHTML = `
search_off

검색 결과가 없습니다

입력하신 검색어나 선택한 필터를 확인해 주세요.

`; tableWrapper.classList.add('hidden'); if (paginationContainer) paginationContainer.innerHTML = ''; return; } // 2. 뷰 모드에 따른 컨테이너 노출 설정 if (state.viewMode === 'grid') { // 그리드 활성화 grid.classList.remove('hidden'); grid.classList.add('grid'); // 테이블 및 요약바 비활성화 tableWrapper.classList.add('hidden'); if (summaryBar) { summaryBar.classList.remove('flex'); // flex 제거 summaryBar.classList.add('hidden'); } } else { // 그리드 비활성화 grid.classList.remove('grid'); grid.classList.add('hidden'); // 테이블 활성화 tableWrapper.classList.remove('hidden'); // 요약바 노출 여부는 데이터 상태에 따라 updateSummary에서 결정 updateSummary(); } // 3. 현재 페이지 데이터 슬라이싱 const startIndex = (page - 1) * ITEMS_PER_PAGE; const pagedProducts = state.visibleProducts.slice(startIndex, startIndex + ITEMS_PER_PAGE); if (state.viewMode === 'grid') { grid.innerHTML = ''; pagedProducts.forEach((product) => { const isSold = STATUS_META[product.status]?.soldOut === true; grid.insertAdjacentHTML( 'beforeend', `
${product.status}

${product.title}

${product.currency}${product.price.toLocaleString()}

${product.description}

`, ); }); } else { // 테이블 렌더링 (이전과 동일, 가격 포함) tableBody.innerHTML = pagedProducts .map((product) => { const isSelectable = STATUS_META[product.status]?.selectable !== false; const conditionKey = product.specs.condition; const conditionConfig = PRODUCT_CONDITIONS[conditionKey]; let conditionDisplay = ''; let conditionClass = 'text-slate-500'; if (conditionConfig) { // 1. 정의된 Key인 경우 (추천 방식) conditionDisplay = conditionConfig.label; conditionClass = conditionConfig.color; } else if (conditionKey && conditionKey.trim() !== '') { // 2. 정의되지 않았지만 텍스트가 있는 경우 (기존 수기 입력 데이터) conditionDisplay = conditionKey; } else { // 3. 데이터가 비어있는 경우 conditionDisplay = '상세 설명 참고 ℹ️'; conditionClass = 'text-indigo-500 italic'; } return ` ${product.title} ${conditionDisplay} ₩${product.price.toLocaleString()} ${product.status} `; }) .join(''); } // [중요] 전체 선택 체크박스 상태 동기화 const selectAllCheck = document.getElementById('select-all-current'); if (selectAllCheck) { const startIndex = (page - 1) * ITEMS_PER_PAGE; const currentSelectableItems = state.visibleProducts.slice(startIndex, startIndex + ITEMS_PER_PAGE).filter((p) => STATUS_META[p.status]?.selectable !== false); selectAllCheck.checked = currentSelectableItems.length > 0 && currentSelectableItems.every((p) => state.selectedIds.has(p.id)); } renderPagination(); } export function renderPagination() { const container = document.getElementById('pagination'); if (!container) return; const totalPages = Math.ceil(state.visibleProducts.length / ITEMS_PER_PAGE); const { currentPage } = state; let html = ``; for (let i = 1; i <= totalPages; i++) { html += ``; } html += ``; container.innerHTML = html; } export function changePage(page) { state.currentPage = page; renderProducts(page); window.scrollTo({ top: 0, behavior: 'smooth' }); } /** 모든 필터를 초기 상태로 되돌리는 함수 */ function resetAllFilters() { state.searchKeyword = ''; const searchInput = document.getElementById('search-input'); if (searchInput) searchInput.value = ''; state.activeCategories.clear(); state.activeCategories.add('All'); // 상태 필터 초기화 (config에서 defaultActive인 것만) import('./config.js').then(({ STATUS_FILTERS }) => { state.activeStatuses.clear(); STATUS_FILTERS.filter((f) => f.defaultActive).forEach((f) => state.activeStatuses.add(f.key)); // UI 전체 갱신 applyFilters(); renderStatusChips(); renderCategoryChips(productsData); }); }