상품 10개 추가 + 상태 디스플레이 수정

This commit is contained in:
2026-03-02 20:23:51 +09:00
parent f569000ba5
commit e10afe8967
32 changed files with 353 additions and 23 deletions

View File

@@ -1,11 +1,345 @@
import { import { STATUS, CONDITIONS, CATEGORIES, CURRENCIES } from '../scripts/config.js';
STATUS,
CONDITIONS,
CATEGORIES,
CURRENCIES,
} from '../scripts/config.js';
const games = [ const games = [
{
id: 'x3v7mq8k',
createdAt: '2026-03-02',
updatedAt: '2026-03-02',
// --- 관리용 데이터 ---
isVerified: true,
purchaseDate: '',
// --- 상품 핵심 데이터 ---
title: '디오필드 크로니클',
category: CATEGORIES.GAMES,
status: STATUS.ON_SALE,
condition: CONDITIONS.BRAND_NEW,
// --- 판매 정보 ---
price: 25000,
currency: CURRENCIES.KRW,
customTag: '',
tags: ['Nintendo Switch', 'Japanese'],
// --- 미디어 및 설명 ---
images: [
'/images/games/x3v7mq8k_01.jpg',
'/images/games/x3v7mq8k_02.jpg',
'/images/games/x3v7mq8k_03.jpg',
],
description: '일본판(JP), 한국어 미지원',
fullDescription: [
'디오필드 크로니클 (The Diofield Chronicle) 닌텐도 스위치용 패키지입니다.',
'일본판(JP) 제품입니다.',
'한국어는 지원하지 않습니다.',
'미개봉 새제품 상태입니다.',
'',
'',
'',
'',
],
},
{
id: 'm2v8x7qp',
createdAt: '2026-03-02',
updatedAt: '2026-03-02',
isVerified: true,
purchaseDate: '',
title: '유희왕 러시 듀얼 최강 배틀로얄!! 간다! 고 러시!!',
category: CATEGORIES.GAMES,
status: STATUS.ON_SALE,
condition: CONDITIONS.BRAND_NEW,
price: 20000,
currency: CURRENCIES.KRW,
customTag: '',
tags: ['Nintendo Switch', 'Japanese'],
images: [
'/images/games/m2v8x7qp_01.jpg',
'/images/games/m2v8x7qp_02.jpg',
'/images/games/m2v8x7qp_03.jpg',
],
description: '일본판(JP), 한국어 미지원',
fullDescription: [
'유희왕 러시 듀얼 최강 배틀로얄!! 간다! 고 러시!! (遊戯王ラッシュデュエル 最強バトルロイヤル!! いくぞ!ゴーラッシュ!!) 닌텐도 스위치용 패키지입니다.',
'일본판(JP) 제품입니다.',
'한국어는 지원하지 않습니다.',
'미개봉 새제품 상태입니다.',
'',
'',
'',
'',
],
},
{
id: 'q8x4vm2k',
createdAt: '2026-03-02',
updatedAt: '2026-03-02',
isVerified: true,
purchaseDate: '',
title: '구냐 몬스터',
category: CATEGORIES.GAMES,
status: STATUS.ON_SALE,
condition: CONDITIONS.BRAND_NEW,
price: 20000,
currency: CURRENCIES.KRW,
customTag: '',
tags: ['Nintendo Switch', 'Japanese'],
images: [
'/images/games/q8x4vm2k_01.jpg',
'/images/games/q8x4vm2k_02.jpg',
'/images/games/q8x4vm2k_03.jpg',
],
description: '일본판(JP), 한국어 지원',
fullDescription: [
'구냐 몬스터 (グーニャモンスター / Goonya Monster) 닌텐도 스위치용 패키지입니다.',
'일본판(JP) 제품이며 한국어를 지원합니다.',
'미개봉 새제품 상태입니다.',
'',
'',
'',
'',
],
},
{
id: 'x7q2vm9k',
createdAt: '2026-03-02',
updatedAt: '2026-03-02',
isVerified: true,
purchaseDate: '',
title: "DNF Duel: Who's Next",
category: CATEGORIES.GAMES,
status: STATUS.ON_SALE,
condition: CONDITIONS.BRAND_NEW,
price: 45000,
currency: CURRENCIES.KRW,
customTag: '',
tags: ['Nintendo Switch', 'Japanese'],
images: [
'/images/games/x7q2vm9k_01.jpg',
'/images/games/x7q2vm9k_02.jpg',
'/images/games/x7q2vm9k_03.jpg',
],
description: '일본판(JP), 한국어 지원',
fullDescription: [
"DNF Duel: Who's Next 닌텐도 스위치용 패키지입니다.",
'일본판(JP) 제품이며 한국어를 지원합니다.',
'미개봉 새제품 상태입니다.',
'',
'',
'',
'',
],
},
{
id: 'v9k2x7qp',
createdAt: '2026-03-02',
updatedAt: '2026-03-02',
isVerified: true,
purchaseDate: '',
title: '이곳, 어머니별로부터',
category: CATEGORIES.GAMES,
status: STATUS.ON_SALE,
condition: CONDITIONS.BRAND_NEW,
price: 30000,
currency: CURRENCIES.KRW,
customTag: '',
tags: ['Nintendo Switch', 'Japanese'],
images: [
'/images/games/v9k2x7qp_01.jpg',
'/images/games/v9k2x7qp_02.jpg',
'/images/games/v9k2x7qp_03.jpg',
],
description: '일본판(JP), 한국어 미지원',
fullDescription: [
'이곳, 어머니별로부터 (こちら、母なる星より) 닌텐도 스위치용 패키지입니다.',
'일본판(JP) 제품입니다.',
'한국어는 지원하지 않습니다.',
'미개봉 새제품 상태입니다.',
'',
'',
'',
'',
],
},
{
id: 'm7x4v9qp',
createdAt: '2026-03-01',
updatedAt: '2026-03-01',
isVerified: true,
purchaseDate: '',
title: '트라이앵글 스트래티지',
category: CATEGORIES.GAMES,
status: STATUS.ON_SALE,
condition: CONDITIONS.BRAND_NEW,
price: 35000,
currency: CURRENCIES.KRW,
customTag: '',
tags: ['Nintendo Switch', 'Japanese'],
images: [
'/images/games/m7x4v9qp_01.jpg',
'/images/games/m7x4v9qp_02.jpg',
'/images/games/m7x4v9qp_03.jpg',
],
description: '일본판(JP), 한국어 지원',
fullDescription: [
'트라이앵글 스트래티지 (TRIANGLE STRATEGY / トライアングルストラテジー) 닌텐도 스위치용 패키지입니다.',
'일본판(JP) 제품이며 한국어를 지원합니다.',
'미개봉 새제품 상태입니다.',
'',
'',
'',
'',
],
},
{
id: 'k4v9x2mz',
createdAt: '2026-03-01',
updatedAt: '2026-03-01',
isVerified: true,
purchaseDate: '',
title: '제노블레이드 3',
category: CATEGORIES.GAMES,
status: STATUS.ON_SALE,
condition: CONDITIONS.BRAND_NEW,
price: 50000,
currency: CURRENCIES.KRW,
customTag: '',
tags: ['Nintendo Switch', 'Japanese'],
images: [
'/images/games/k4v9x2mz_01.jpg',
'/images/games/k4v9x2mz_02.jpg',
'/images/games/k4v9x2mz_03.jpg',
],
description: '일본판(JP), 한국어 지원',
fullDescription: [
'제노블레이드 3 (Xenoblade 3 / ゼブレイド3) 닌텐도 스위치용 패키지입니다.',
'일본판(JP) 제품이며 한국어를 지원합니다.',
'미개봉 새제품 상태입니다.',
'',
'',
'',
'',
],
},
{
id: 'v3k9mz8q',
createdAt: '2026-03-01',
updatedAt: '2026-03-01',
isVerified: true,
purchaseDate: '',
title: '사랑하는 소녀와 수호의 방패 Re:boot The "SHIELD-9"',
category: CATEGORIES.GAMES,
status: STATUS.ON_SALE,
condition: CONDITIONS.BRAND_NEW,
price: 15000,
currency: CURRENCIES.KRW,
customTag: '',
tags: ['Nintendo Switch', 'Japanese'],
images: [
'/images/games/v3k9mz8q_01.jpg',
'/images/games/v3k9mz8q_02.jpg',
'/images/games/v3k9mz8q_03.jpg',
],
description: '일본판(JP), 한국어 미지원',
fullDescription: [
'사랑하는 소녀와 수호의 방패 Re:boot The "SHIELD-9" (恋する乙女と守護の楯 Re:boot The "SHIELD-9") 닌텐도 스위치용 패키지입니다.',
'일본판(JP) 제품입니다.',
'한국어는 지원하지 않습니다.',
'미개봉 새제품 상태입니다.',
'',
'',
'',
'',
],
},
{
id: 't8x3kp7v',
createdAt: '2026-03-01',
updatedAt: '2026-03-01',
isVerified: true,
purchaseDate: '',
title: '돌아온 명탐정 피카츄',
category: CATEGORIES.GAMES,
status: STATUS.ON_SALE,
condition: CONDITIONS.BRAND_NEW,
price: 30000,
currency: CURRENCIES.KRW,
customTag: '',
tags: ['Nintendo Switch', 'Japanese'],
images: [
'/images/games/t8x3kp7v_01.jpg',
'/images/games/t8x3kp7v_02.jpg',
'/images/games/t8x3kp7v_03.jpg',
],
description: '일본판(JP), 한국어 지원',
fullDescription: [
'돌아온 명탐정 피카츄 (帰ってきた 名探偵ピカチュウ) 닌텐도 스위치용 패키지입니다.',
'일본판(JP) 제품이며 한국어를 지원합니다.',
'미개봉 새제품 상태입니다.',
'',
'',
'',
'',
],
},
{
id: 'r2x9vk6m',
createdAt: '2026-03-01',
updatedAt: '2026-03-01',
isVerified: true,
purchaseDate: '',
title: '펼쳐지는 스카이! 프리큐어 펼쳐지는! 퍼즐 컬렉션',
category: CATEGORIES.GAMES,
status: STATUS.ON_SALE,
condition: CONDITIONS.BRAND_NEW,
price: 20000,
currency: CURRENCIES.KRW,
customTag: '',
tags: ['Nintendo Switch', 'Japanese'],
images: [
'/images/games/r2x9vk6m_01.jpg',
'/images/games/r2x9vk6m_02.jpg',
'/images/games/r2x9vk6m_03.jpg',
],
description: '일본판(JP), 한국어 미지원',
fullDescription: [
'펼쳐지는 스카이! 프리큐어 펼쳐지는! 퍼즐 컬렉션 (ひろがるスカイ!プリキュア ひろがる!パズルコレクション) 닌텐도 스위치용 패키지입니다.',
'일본판(JP) 제품입니다.',
'한국어는 지원하지 않습니다.',
'미개봉 새제품 상태입니다.',
'',
'',
'',
'',
],
},
{ {
id: 'k9v2x4qp', id: 'k9v2x4qp',
createdAt: '2026-02-22', createdAt: '2026-02-22',
@@ -305,7 +639,7 @@ const games = [
'/images/games/p4x9m2zk_02.jpg', '/images/games/p4x9m2zk_02.jpg',
'/images/games/p4x9m2zk_03.jpg', '/images/games/p4x9m2zk_03.jpg',
], ],
description: '미개봉 새제품, 일본판(JP), 한국어 지원', description: '일본판(JP), 한국어 지원',
fullDescription: [ fullDescription: [
'드래곤 퀘스트 트레저스 푸른 눈동자와 하늘의 나침반 (ドラゴンクエスト トレジャーズ 蒼き瞳と大空の羅針盤) 닌텐도 스위치용 패키지입니다.', '드래곤 퀘스트 트레저스 푸른 눈동자와 하늘의 나침반 (ドラゴンクエスト トレジャーズ 蒼き瞳と大空の羅針盤) 닌텐도 스위치용 패키지입니다.',
'일본판(JP) 제품입니다.', '일본판(JP) 제품입니다.',
@@ -407,7 +741,7 @@ const games = [
'/images/games/k7p2x9qa_02.webp', '/images/games/k7p2x9qa_02.webp',
'/images/games/k7p2x9qa_03.webp', '/images/games/k7p2x9qa_03.webp',
], ],
description: '미개봉 새제품, 일본판, 한국어 미지원', description: '일본판, 한국어 미지원',
fullDescription: [ fullDescription: [
'슈퍼 마리오 3D 컬렉션 (スーパーマリオ 3Dコレクション) 닌텐도 스위치용 패키지입니다.', '슈퍼 마리오 3D 컬렉션 (スーパーマリオ 3Dコレクション) 닌텐도 스위치용 패키지입니다.',
'일본판 미개봉 새제품입니다.', '일본판 미개봉 새제품입니다.',
@@ -646,7 +980,7 @@ const games = [
'/images/games/t9x4k2qm_02.webp', '/images/games/t9x4k2qm_02.webp',
'/images/games/t9x4k2qm_03.webp', '/images/games/t9x4k2qm_03.webp',
], ],
description: '미개봉 새제품, 일본 내수용(JP), 한국어 미지원', description: '일본 내수용(JP), 한국어 미지원',
fullDescription: [ fullDescription: [
'키즈나 아이 - 터치 더 비트 (Kizuna AI - Touch the Beat!) 일본어판 패키지입니다.', '키즈나 아이 - 터치 더 비트 (Kizuna AI - Touch the Beat!) 일본어판 패키지입니다.',
'일본 내수용(JP) 제품입니다.', '일본 내수용(JP) 제품입니다.',
@@ -680,8 +1014,7 @@ const games = [
'/images/games/a3k9x2pq_02.webp', '/images/games/a3k9x2pq_02.webp',
'/images/games/a3k9x2pq_03.webp', '/images/games/a3k9x2pq_03.webp',
], ],
description: description: '개봉 후 OPP 보관, 일본판(JP), 한국어 지원, 상태 매우 좋음',
'개봉 후 OPP 보관, 일본판(JP), 한국어 지원, 상태 매우 좋음',
fullDescription: [ fullDescription: [
'할로우 나이트 (Hollow Knight / ホロウナイト) 패키지입니다.', '할로우 나이트 (Hollow Knight / ホロウナイト) 패키지입니다.',
'일본판(JP) 제품입니다.', '일본판(JP) 제품입니다.',
@@ -1651,10 +1984,7 @@ const games = [
status: STATUS.ON_SALE, status: STATUS.ON_SALE,
customTag: '', customTag: '',
tags: ['Game&Watch'], tags: ['Game&Watch'],
images: [ images: ['/images/games/nm4uzduj_01.webp', '/images/games/nm4uzduj_02.webp'],
'/images/games/nm4uzduj_01.webp',
'/images/games/nm4uzduj_02.webp',
],
description: '일본 내수용(JP)', description: '일본 내수용(JP)',
fullDescription: [ fullDescription: [
'닌텐도 Game & Watch 젤다의 전설 에디션 미개봉 새제품입니다.', '닌텐도 Game & Watch 젤다의 전설 에디션 미개봉 새제품입니다.',
@@ -1672,10 +2002,7 @@ const games = [
status: STATUS.ON_SALE, status: STATUS.ON_SALE,
customTag: '', customTag: '',
tags: ['Game&Watch'], tags: ['Game&Watch'],
images: [ images: ['/images/games/vzwe916n_01.webp', '/images/games/vzwe916n_02.webp'],
'/images/games/vzwe916n_01.webp',
'/images/games/vzwe916n_02.webp',
],
description: '한국 정식 발매판(KR)', description: '한국 정식 발매판(KR)',
fullDescription: [ fullDescription: [
'닌텐도 Game & Watch 슈퍼 마리오 에디션 미개봉 새제품입니다.', '닌텐도 Game & Watch 슈퍼 마리오 에디션 미개봉 새제품입니다.',

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

@@ -167,8 +167,11 @@ function renderGridView(grid, tableWrapper, products) {
function createProductCardHTML(product) { function createProductCardHTML(product) {
const isSold = STATUS_META[product.status]?.soldOut === true; const isSold = STATUS_META[product.status]?.soldOut === true;
const isNonSale = product.status === '미판매'; const isNonSale = product.status === '미판매';
const conditionConfig = PRODUCT_CONDITIONS[product.specs?.condition]; // const conditionConfig = PRODUCT_CONDITIONS[product.specs?.condition];
const conditionDisplay = conditionConfig ? conditionConfig.label : product.specs?.condition || ''; // const conditionDisplay = conditionConfig ? conditionConfig.label : product.specs?.condition || '';
const conditionConfig = PRODUCT_CONDITIONS[product.condition];
const conditionDisplay = conditionConfig ? conditionConfig.label : '';
const conditionClass = conditionConfig ? conditionConfig.color : 'text-slate-400';
return ` return `
<div class="product-card group flex flex-col gap-4 cursor-pointer" <div class="product-card group flex flex-col gap-4 cursor-pointer"
@@ -208,7 +211,7 @@ function createProductCardHTML(product) {
</p> </p>
</div> </div>
<div class="flex flex-col"> <div class="flex flex-col">
${conditionDisplay ? `<span class="text-[11px] font-medium text-slate-400 mb-0.5">${conditionDisplay}</span>` : ''} ${conditionDisplay ? `<span class="text-[11px] font-medium ${conditionClass} mb-0.5">${conditionDisplay}</span>` : ''}
<p class="text-slate-500 dark:text-slate-400 text-sm font-normal line-clamp-1 italic">${product.description}</p> <p class="text-slate-500 dark:text-slate-400 text-sm font-normal line-clamp-1 italic">${product.description}</p>
</div> </div>
</div> </div>
@@ -244,7 +247,7 @@ function createTableRowHTML(product) {
</td> </td>
<td class="py-4 px-4 font-semibold ${isSold ? 'line-through text-slate-400' : 'text-slate-900 dark:text-white'}">${product.title}</td> <td class="py-4 px-4 font-semibold ${isSold ? 'line-through text-slate-400' : 'text-slate-900 dark:text-white'}">${product.title}</td>
<td class="py-4 px-4 text-xs break-keep ${conditionClass}">${conditionDisplay}</td> <td class="py-4 px-4 text-xs break-keep ${conditionClass}">${conditionDisplay}</td>
<td class="py-4 px-4 text-right font-bold text-slate-900 dark:text-white">${product.price.toLocaleString()}</td> <td class="py-4 px-4 text-right font-bold text-slate-900 dark:text-white">${product.currency || '₩'}${product.price.toLocaleString()}</td>
<td class="hidden lg:table-cell py-4 px-4 text-center"> <td class="hidden lg:table-cell py-4 px-4 text-center">
<span class="px-2 py-0.5 rounded text-[10px] font-bold border ${STATUS_COLOR[product.status]}">${product.status}</span> <span class="px-2 py-0.5 rounded text-[10px] font-bold border ${STATUS_COLOR[product.status]}">${product.status}</span>
</td> </td>