- 새글·수정 모두 boardApi.tagGroups(category)로 이 게시판 매핑 그룹만 노출 - 수정 시 전체 그룹으로 기존 태그 id 해석 → 이 게시판에 없는 태그는 별도 배지로 보존 - 다른 게시판 태그가 수정 화면에 모두 뜨던 문제 해결 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user