From 6828b868bc7f525b8fd90151d73e9ba1fc6cddfc Mon Sep 17 00:00:00 2001 From: zenn Date: Wed, 1 Apr 2026 18:24:01 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A6=B4=EB=A6=AC=EC=8A=A4:=20v1.3.47=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=ED=85=9C=ED=94=8C=EB=A6=BF=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=EC=B9=B4=EB=93=9C=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/history.md | 4 + docs/todo.md | 1 + docs/update.md | 5 + frontend/src/views/AdminView.vue | 166 ++++++++++++++----------------- 4 files changed, 82 insertions(+), 94 deletions(-) diff --git a/docs/history.md b/docs/history.md index 3914674..7fe6db6 100644 --- a/docs/history.md +++ b/docs/history.md @@ -1,5 +1,9 @@ # 의사결정 이력 +## 2026-04-01 v1.3.47 +- 관리자 `사용자 템플릿 요청`도 결국 검수용 카드이므로, 요청 전용 카드 문법을 따로 두기보다 `전체 티어표 관리`와 같은 카드 구조를 재사용하는 편이 더 직관적이라고 정리했다. +- 새 템플릿 생성 요청의 기본 게임 ID는 사람이 읽기 어려운 난수보다 요청 단위에서 유일한 임시값을 먼저 채워두고, 승인 전에 관리자가 수정하는 흐름이 더 현실적이라고 판단했다. + ## 2026-04-01 v1.3.46 - 관리자 전체 티어표 카드에서는 좌측 영역 전체를 버튼처럼 만드는 것보다, 실제 썸네일 이미지만 미리보기 진입점으로 읽히게 두는 편이 카드 정보 구조가 덜 흔들린다고 정리했다. - 템플릿 요청 미리보기는 일반 티어표 보기와 다른 요약 레이아웃을 새로 두기보다, 같은 내부 프레임 문법 안에서 보드 자체를 먼저 보여주는 편이 사용자가 더 자연스럽게 이해한다고 판단했다. diff --git a/docs/todo.md b/docs/todo.md index 638b226..182696b 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -22,3 +22,4 @@ - 관리자 아이템 라이브러리 이름 변경은 템플릿·사용자 업로드·보관 자산까지 모두 가능하므로, 이후에는 일괄 이름 정리나 중복 이름 감지 보조 기능까지 검토한다. - 관리자 템플릿 요청 미리보기는 실제 완성본 모달과 더 가까운 체감이 되도록, 이후에도 보드 여백·행/열 헤더·남은 아이템 밀도를 한 번 더 비교 QA한다. - 관리자 템플릿 요청 미리보기는 일반 완성본 보기와 거의 같은 구조로 맞췄으므로, 이후 실제 데이터로 row/column 정렬감과 비어 있는 셀 높이를 한 번 더 비교 QA한다. +- 관리자 템플릿 요청 카드와 전체 티어표 카드가 같은 문법으로 맞춰졌으므로, 이후에는 라이트모드까지 포함해 두 카드의 썸네일 높이·입력창 밀도·아이템 그리드를 한 번 더 비교 QA한다. diff --git a/docs/update.md b/docs/update.md index de02db1..70df345 100644 --- a/docs/update.md +++ b/docs/update.md @@ -1,5 +1,10 @@ # 업데이트 로그 +## 2026-04-01 v1.3.47 +- 관리자 `사용자 템플릿 요청` 카드는 별도 요청 전용 레이아웃 대신 `전체 티어표 관리`와 같은 카드 문법으로 맞추고, 왼쪽 썸네일 클릭으로 같은 미리보기 모달이 열리도록 정리함. +- 새 템플릿 요청에는 썸네일 아래에 `게임 이름 / 게임 ID` 입력을 두고, 초기 `게임 ID`는 `new-template` 대신 요청 ID 기반의 임시 고유값으로 채워 나중에 수정하기 쉽게 바꿈. +- 요청 카드 오른쪽에는 제목, 설명, 요청 메타, 추가 아이템 목록, 승인/반려 버튼을 같은 정보 계층으로 배치해 전체 티어표 관리와 읽는 흐름을 통일함. + ## 2026-04-01 v1.3.46 - 관리자 `전체 티어표 관리`의 썸네일 영역은 카드 좌측 전체가 눌리는 버튼처럼 보이지 않도록 이미지 영역만 상단에 붙여 클릭 진입점으로 유지하고, 카드 본문과의 시각적 분리를 다시 다듬음. - `템플릿 요청 관리` 미리보기는 별도 썸네일 요약형이 아니라, 제목·설명·행/열 보드·남은 아이템이 하나의 내부 프레임 안에서 이어지는 실제 티어표 완성본형 레이아웃으로 다시 정리함. diff --git a/frontend/src/views/AdminView.vue b/frontend/src/views/AdminView.vue index 3e18ba8..5ab64ad 100644 --- a/frontend/src/views/AdminView.vue +++ b/frontend/src/views/AdminView.vue @@ -654,11 +654,7 @@ async function refreshTemplateRequests() { ...request, draftGameId: request.type === 'create' - ? (request.sourceTierListTitle || '') - .toLowerCase() - .replace(/[^a-z0-9]+/g, '-') - .replace(/^-+|-+$/g, '') - .slice(0, 80) || 'new-template' + ? ('tmpl-' + String(request.id || 'request').replace(/[^a-zA-Z0-9]+/g, '').slice(0, 12).toLowerCase()) : request.targetGameId || request.sourceGameId || '', draftGameName: request.type === 'create' @@ -1768,45 +1764,64 @@ async function saveFeaturedOrder() {
현재 처리 대기 중인 템플릿 요청이 없어요.
-
-
-
-
-
{{ request.sourceTierListTitle }}
-
{{ request.sourceDescription }}
-
- {{ templateRequestTypeLabel(request) }} · {{ request.requesterName }} · {{ fmt(request.createdAt) }} +
+
+
+ + +
+ + +
+
+ +
+
+
+
{{ request.sourceTierListTitle }}
+
{{ request.sourceDescription }}
+
+ {{ templateRequestTypeLabel(request) }} · {{ request.requesterName }} · {{ fmt(request.createdAt) }} +
+
{{ templateRequestTargetLabel(request) }}
-
{{ templateRequestTargetLabel(request) }}
- -
-
-
- -
{{ item.label }}
+
+ 추가 아이템 {{ request.items?.length || 0 }}개 + {{ request.type === 'create' ? '새 템플릿' : '기존 템플릿 업데이트' }}
-
-
- - -
+
+ +
-
- - +
+ + +
@@ -3826,72 +3841,35 @@ async function saveFeaturedOrder() { gap: 14px; } .templateRequestCard { - display: grid; - gap: 14px; - padding: 18px; - border-radius: 20px; - border: 1px solid rgba(255, 255, 255, 0.12); - background: var(--theme-pill-bg); } -.templateRequestCard__head { - display: flex; +.templateRequestCard--aligned { + align-items: start; +} +.templateRequestCard__side { + display: grid; gap: 12px; - justify-content: space-between; - align-items: flex-start; - flex-wrap: wrap; + align-self: start; } -.templateRequestCard__title { - font-weight: 900; - font-size: 18px; +.templateRequestCard__preview { + align-self: start; } -.templateRequestCard__desc { - margin-top: 6px; - color: var(--theme-text-muted); - line-height: 1.55; - white-space: pre-line; -} -.templateRequestCard__meta { - margin-top: 4px; - font-size: 13px; - opacity: 0.72; -} -.templateRequestItems { +.templateRequestCard__thumbMeta { display: grid; - grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); gap: 10px; } -.templateRequestItem { - display: grid; - gap: 8px; -} -.templateRequestItem__thumb { - width: 100%; - aspect-ratio: 1 / 1; - object-fit: cover; - border-radius: 12px; - border: 1px solid rgba(255, 255, 255, 0.12); - background: var(--theme-surface-soft); -} -.templateRequestItem__label { - font-size: 12px; - font-weight: 800; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.templateRequestCard__form { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 10px; -} -.templateRequestField { - display: grid; - gap: 6px; -} -.templateRequestField__label { +.templateRequestCard__thumbLabel { font-size: 11px; color: var(--theme-text-faint); } +.templateRequestCard__thumbValue { + font-size: 14px; + font-weight: 800; + color: var(--theme-text); + word-break: break-word; +} +.templateRequestCard__items { + grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); +} .templateRequestCard__actions { display: flex; gap: 10px;