From 909ed72502e4b3f60c1a1180c0d54087996f155f Mon Sep 17 00:00:00 2001 From: zenn Date: Wed, 1 Apr 2026 13:32:25 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A6=B4=EB=A6=AC=EC=8A=A4:=20v1.3.18=20?= =?UTF-8?q?=ED=85=9C=ED=94=8C=EB=A6=BF=20=EC=9A=94=EC=B2=AD=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20=EB=B3=B4=EC=99=84=EA=B3=BC=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=B5=9C=EC=A0=81=ED=99=94=20=EA=B8=B0=EA=B0=84=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/update.md | 5 +++ frontend/src/views/AdminView.vue | 57 ++++++++++++++++++++++++++- frontend/src/views/TierEditorView.vue | 21 +++++++++- 3 files changed, 79 insertions(+), 4 deletions(-) diff --git a/docs/update.md b/docs/update.md index 6010eec..0c9a7fb 100644 --- a/docs/update.md +++ b/docs/update.md @@ -1,5 +1,10 @@ # 업데이트 로그 +## 2026-04-01 v1.3.18 +- 커스텀 아이템 기본 이름은 파일명 전체를 그대로 쓰지 않고 확장자 제거·공백 정리·60자 제한을 먼저 적용하도록 바꿔, 템플릿 요청 전에 커스텀 업로드가 길이 제한으로 실패하던 흐름을 줄임. +- 템플릿 요청 실패 안내는 커스텀 이미지 업로드 실패와 일반 bad request를 구분해, 사용자가 제목/설명/아이템 이름 길이 제한 문제를 더 쉽게 파악할 수 있게 보강함. +- 관리자 Image Optimization 월 필터는 기본 month input 대신 연도/월 셀렉트와 전체 초기화 버튼으로 바꿔, 기간 선택을 더 직관적으로 조작할 수 있게 정리함. + ## 2026-04-01 v1.3.17 - 티어 에디터 열 헤더 입력창과 행 라벨은 좌우 패딩을 대칭으로 다시 잡아, 드래그 핸들과 삭제 아이콘이 있어도 제목이 한쪽으로 쏠려 보이지 않도록 보정함. - 열 삭제도 이제 행 삭제와 같은 확인 모달을 거쳐 진행되도록 바꿔, 실수로 즉시 제거되던 문제를 막음. diff --git a/frontend/src/views/AdminView.vue b/frontend/src/views/AdminView.vue index 1915835..80edfa5 100644 --- a/frontend/src/views/AdminView.vue +++ b/frontend/src/views/AdminView.vue @@ -270,6 +270,49 @@ const visibleLinkedGames = computed(() => ) const imageStatsPeriodLabel = computed(() => (imageStatsMonth.value ? `${imageStatsMonth.value} 기준` : '전체 기간')) +const imageStatsYearOptions = computed(() => { + const currentYear = new Date().getFullYear() + return Array.from({ length: 6 }, (_, index) => String(currentYear - index)) +}) +const imageStatsMonthOptions = [ + { value: '01', label: '1월' }, + { value: '02', label: '2월' }, + { value: '03', label: '3월' }, + { value: '04', label: '4월' }, + { value: '05', label: '5월' }, + { value: '06', label: '6월' }, + { value: '07', label: '7월' }, + { value: '08', label: '8월' }, + { value: '09', label: '9월' }, + { value: '10', label: '10월' }, + { value: '11', label: '11월' }, + { value: '12', label: '12월' }, +] +const selectedImageStatsYear = computed({ + get: () => (imageStatsMonth.value ? imageStatsMonth.value.slice(0, 4) : ''), + set: (year) => { + if (!year) { + imageStatsMonth.value = '' + return + } + const month = imageStatsMonth.value ? imageStatsMonth.value.slice(5, 7) : '01' + imageStatsMonth.value = `${year}-${month}` + }, +}) +const selectedImageStatsMonthNumber = computed({ + get: () => (imageStatsMonth.value ? imageStatsMonth.value.slice(5, 7) : ''), + set: (month) => { + if (!month) { + imageStatsMonth.value = '' + return + } + const year = imageStatsMonth.value ? imageStatsMonth.value.slice(0, 4) : String(new Date().getFullYear()) + imageStatsMonth.value = `${year}-${month}` + }, +}) +function clearImageStatsMonth() { + imageStatsMonth.value = '' +} async function refreshImageDiagnostics() { try { @@ -2100,8 +2143,18 @@ async function saveFeaturedOrder() {
Image Optimization
-
- +
+
+ + + +