fix(board): 수정 화면도 게시판별 태그만 — 단, 글이 가진 기존 태그는 보존
CI / build (push) Failing after 15m27s

- 새글·수정 모두 boardApi.tagGroups(category)로 이 게시판 매핑 그룹만 노출
- 수정 시 전체 그룹으로 기존 태그 id 해석 → 이 게시판에 없는 태그는 별도 배지로 보존
- 다른 게시판 태그가 수정 화면에 모두 뜨던 문제 해결

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ByungCheol
2026-06-28 16:14:43 +09:00
parent 821aec72b9
commit 1000bf06af
+21 -8
View File
@@ -23,11 +23,17 @@ const content = ref('')
const notice = ref(false)
const tagGroups = ref([])
const selectedTagIds = ref([])
// 이 게시판 매핑엔 없지만 글이 이미 가진 태그(수정 시 보존용)
const extraTags = ref([])
const loading = ref(false)
const error = ref(null)
// 카테고리 구분 없이 태그만 평탄화
// 이 게시판 그룹의 태그 + 글이 이미 가진 추가 태그(중복 제거)
const allTags = computed(() => tagGroups.value.flatMap((g) => g.tags))
const displayTags = computed(() => {
const seen = new Set(allTags.value.map((t) => t.id))
return [...allTags.value, ...extraTags.value.filter((t) => !seen.has(t.id))]
})
function toggleTag(id) {
const i = selectedTagIds.value.indexOf(id)
@@ -37,8 +43,8 @@ function toggleTag(id) {
async function loadTagGroups() {
try {
// 수정 시엔 전체 그룹(기존 글 태그 유실 방지), 새 글은 이 게시판에 매핑된 그룹만
tagGroups.value = await boardApi.tagGroups(isEdit.value ? '' : category)
// 새 글·수정 모두 이 게시판에 매핑된 그룹만 노출
tagGroups.value = await boardApi.tagGroups(category)
} catch {
tagGroups.value = []
}
@@ -51,10 +57,17 @@ async function loadForEdit() {
title.value = p.title
content.value = p.content
notice.value = !!p.notice
// 게시글의 태그(이름) → 현재 태그 목록에서 id 매핑
// 전체 그룹에서 이름→id 해석 (이 게시판에 안 보이는 기존 태그도 보존)
const all = await boardApi.tagGroups('')
const nameToId = {}
tagGroups.value.forEach((c) => c.tags.forEach((t) => (nameToId[t.name] = t.id)))
const idToName = {}
all.forEach((c) => c.tags.forEach((t) => { nameToId[t.name] = t.id; idToName[t.id] = t.name }))
selectedTagIds.value = (p.tags || []).map((n) => nameToId[n]).filter(Boolean)
// 이 게시판 그룹에 없는 선택 태그만 별도 배지로 노출(보존)
const shown = new Set(allTags.value.map((t) => t.id))
extraTags.value = selectedTagIds.value
.filter((id) => !shown.has(id))
.map((id) => ({ id, name: idToName[id] }))
} catch (e) {
error.value = e.response?.data?.message || '게시글을 불러오지 못했습니다.'
} finally {
@@ -113,11 +126,11 @@ onMounted(async () => {
<!-- 태그 선택 (DB 등록 태그를 뱃지로 토글) -->
<div class="tag-select">
<div v-if="!allTags.length" class="hint">
등록된 태그가 없습니다. (관리자가 [태그 관리]에서 추가 있습니다)
<div v-if="!displayTags.length" class="hint">
게시판에 사용할 태그가 없습니다. (관리자가 [태그 관리]에서 게시판에 매핑 있습니다)
</div>
<button
v-for="t in allTags"
v-for="t in displayTags"
:key="t.id"
type="button"
class="tag-badge"