Update used sale filters and guide
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user