site: 음악목록 항목별 별칭 편집 기능 추가

- MusicListEntry 에 aliases: string[] 필드 추가, 저장 시 trim·중복 제거.
- 목록 행에 "별칭" 버튼 표시(개수 있으면 강조), 클릭 시 모달 오픈.
- 모달에서 "별칭 추가" → 입력행 생성, "−" 버튼 → 해당 행 삭제,
  좌상단 "← 돌아가기" 또는 오버레이 클릭으로 저장 후 닫기.
This commit is contained in:
2026-05-13 15:57:35 +09:00
parent f9cf373550
commit 2344c4b8d2
6 changed files with 188 additions and 2 deletions

View File

@@ -229,6 +229,21 @@ function sanitizeNumber(value: unknown): number {
return Math.floor(n)
}
/** 별칭 배열을 정규화: 문자열만 받아 trim → 빈 값 제거 → 중복 제거. */
function sanitizeAliases(value: unknown): string[] {
if (!Array.isArray(value)) return []
const out: string[] = []
const seen = new Set<string>()
for (const item of value) {
const s = sanitizeStr(item)
if (!s) continue
if (seen.has(s)) continue
seen.add(s)
out.push(s)
}
return out
}
export function normalizePackList(input: unknown): PackList {
const fallback = defaultPackList()
if (!input || typeof input !== 'object') return fallback
@@ -244,7 +259,8 @@ export function normalizePackList(input: unknown): PackList {
url: sanitizeStr(entry.url),
title: sanitizeStr(entry.title),
artist: sanitizeStr(entry.artist),
durationSec: sanitizeNumber(entry.durationSec)
durationSec: sanitizeNumber(entry.durationSec),
aliases: sanitizeAliases(entry.aliases)
}))
.filter((entry) => entry.url.length > 0),
images: images

View File

@@ -47,6 +47,8 @@ export interface MusicListEntry {
artist: string
/** 노래 길이 (초). */
durationSec: number
/** 정답으로 인정할 별칭 목록. 빈 배열이면 정답은 title 뿐. */
aliases: string[]
}
export interface ImageListEntry {