Update used sale filters and guide

This commit is contained in:
2026-08-03 18:50:30 +09:00
parent 11ec940e48
commit ef0b48dc16
6 changed files with 215 additions and 44 deletions

View File

@@ -1,9 +1,14 @@
import NSW_DB from '../db/nsw.resale.db.js?v=20260521-badges-v2';
import NSW_DB from '../db/nsw.resale.db.js?v=20260803-status-v4';
window.NSW_APP_VERSION = '20260521-badges-v2';
window.NSW_APP_VERSION = '20260803-status-v4';
const SHOW_SOLD_BY_DEFAULT = false;
const SHOW_RECOMMENDED_PRICE_RANGE_BY_DEFAULT = false;
const DEFAULT_FILTERS = {
language: ['koreanSupport', 'koreanNotSupport'],
status: ['available'],
country: ['KOR', 'JPN'],
cero: ['A', 'B', 'C', 'D', 'Z', '教育・データベース'],
};
/** @type {string} 가격 확인 완료 표시 */
const VERIFIED_PRICE_MARK = '⭐';
@@ -11,8 +16,12 @@ const VERIFIED_PRICE_MARK = '⭐';
document.addEventListener('DOMContentLoaded', () => {
const gameList = document.getElementById('gameList');
const gameCount = document.getElementById('gameCount');
const saleTotal = document.getElementById('saleTotal');
const saleTotalMobile = document.getElementById('saleTotalMobile');
const loading = document.getElementById('loading');
const languageRadios = document.querySelectorAll('input[name="language"]');
const saleStatusFilter = document.getElementById('saleStatusFilter');
let isAdminFilterUnlocked = false;
// 언어별 UI 텍스트
const uiTexts = {
@@ -23,7 +32,7 @@ document.addEventListener('DOMContentLoaded', () => {
korean: '한국어',
japanese: '일본어',
count: '개수',
listIntro: '우선 이런 게임들이 있습니다. 가격은 순차적으로 작성중입니다.',
listIntro: '',
pricePending: '-',
loading: '로딩중...',
tableHeaders: {
@@ -51,7 +60,7 @@ document.addEventListener('DOMContentLoaded', () => {
korean: '韓国語',
japanese: '日本語',
count: '件数',
listIntro: 'まずは所持タイトルを掲載しています。価格は順次入力中です。',
listIntro: '',
pricePending: '-',
loading: '読み込み中...',
tableHeaders: {
@@ -78,10 +87,10 @@ document.addEventListener('DOMContentLoaded', () => {
const filterState = {
language: 'ko',
filters: {
language: [],
status: [],
country: [],
cero: [],
language: [...DEFAULT_FILTERS.language],
status: [...DEFAULT_FILTERS.status],
country: [...DEFAULT_FILTERS.country],
cero: [...DEFAULT_FILTERS.cero],
},
searchText: '',
sortBy: 'sortByRandom',
@@ -836,12 +845,14 @@ document.addEventListener('DOMContentLoaded', () => {
checkbox.checked = false;
});
applyDefaultFilterCheckboxes();
// 필터 상태 초기화
filterState.filters = {
language: [],
status: [],
country: [],
cero: [],
language: [...DEFAULT_FILTERS.language],
status: [...DEFAULT_FILTERS.status],
country: [...DEFAULT_FILTERS.country],
cero: [...DEFAULT_FILTERS.cero],
};
filterState.searchText = '';
document.querySelectorAll('[data-search-input]').forEach(input => {
@@ -855,6 +866,33 @@ document.addEventListener('DOMContentLoaded', () => {
// 필터 초기화 버튼 이벤트 리스너 설정
document.getElementById('resetFilters')?.addEventListener('click', resetFilters);
function applyDefaultFilterCheckboxes() {
Object.entries(DEFAULT_FILTERS).forEach(([type, values]) => {
document.querySelectorAll(`input[name="${type}-filter"]`).forEach(checkbox => {
checkbox.checked = values.includes(checkbox.value);
});
});
}
function setupAdminFilterUnlock() {
const unlockTarget = document.getElementById('admin-filter-unlock');
if (!unlockTarget || !saleStatusFilter) return;
let clickCount = 0;
let lastClickAt = 0;
unlockTarget.addEventListener('click', () => {
const now = Date.now();
clickCount = now - lastClickAt > 10000 ? 1 : clickCount + 1;
lastClickAt = now;
if (clickCount < 5) return;
isAdminFilterUnlocked = true;
saleStatusFilter.classList.remove('hidden');
clickCount = 0;
});
}
// 필터 체크박스 이벤트 리스너 설정
function setupFilterListeners() {
const searchInputs = [
@@ -1066,17 +1104,13 @@ document.addEventListener('DOMContentLoaded', () => {
}
if (
!SHOW_SOLD_BY_DEFAULT &&
filterState.filters.status.length === 0 &&
game.status === 'sold'
filterState.filters.status.length > 0 &&
!filterState.filters.status.includes(game.status)
) {
return false;
}
if (
filterState.filters.status.length > 0 &&
!filterState.filters.status.includes(game.status)
) {
if (!isAdminFilterUnlocked && game.status !== 'available') {
return false;
}
@@ -1232,6 +1266,13 @@ document.addEventListener('DOMContentLoaded', () => {
// 게임 개수 업데이트
gameCount.textContent = `${sortedGames.length} ${uiTexts[filterState.language].count}`;
const totalSuggestedPrice = sortedGames.reduce((sum, game) => {
const suggestedPrice = getSuggestedPriceValue(game);
return sum + (suggestedPrice || 0);
}, 0);
const formattedTotal = formatKRW(totalSuggestedPrice);
if (saleTotal) saleTotal.textContent = formattedTotal;
if (saleTotalMobile) saleTotalMobile.textContent = formattedTotal;
// 테이블 내용 업데이트
gameList.innerHTML = '';
@@ -1243,6 +1284,8 @@ document.addEventListener('DOMContentLoaded', () => {
}
// 초기화
applyDefaultFilterCheckboxes();
setupAdminFilterUnlock();
setupFilterListeners();
setupSortUI();
updateUITexts();