From 1000bf06af89a877a625ba91925c0e90de79252e Mon Sep 17 00:00:00 2001 From: ByungCheol Date: Sun, 28 Jun 2026 16:14:43 +0900 Subject: [PATCH] =?UTF-8?q?fix(board):=20=EC=88=98=EC=A0=95=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=EB=8F=84=20=EA=B2=8C=EC=8B=9C=ED=8C=90=EB=B3=84=20?= =?UTF-8?q?=ED=83=9C=EA=B7=B8=EB=A7=8C=20=E2=80=94=20=EB=8B=A8,=20?= =?UTF-8?q?=EA=B8=80=EC=9D=B4=20=EA=B0=80=EC=A7=84=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?=ED=83=9C=EA=B7=B8=EB=8A=94=20=EB=B3=B4=EC=A1=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 새글·수정 모두 boardApi.tagGroups(category)로 이 게시판 매핑 그룹만 노출 - 수정 시 전체 그룹으로 기존 태그 id 해석 → 이 게시판에 없는 태그는 별도 배지로 보존 - 다른 게시판 태그가 수정 화면에 모두 뜨던 문제 해결 Co-Authored-By: Claude Opus 4.8 --- src/views/board/BoardWriteView.vue | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/views/board/BoardWriteView.vue b/src/views/board/BoardWriteView.vue index 8f32d3e..1651c7e 100644 --- a/src/views/board/BoardWriteView.vue +++ b/src/views/board/BoardWriteView.vue @@ -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 () => {
-
- 등록된 태그가 없습니다. (관리자가 [태그 관리]에서 추가할 수 있습니다) +
+ 이 게시판에 사용할 태그가 없습니다. (관리자가 [태그 관리]에서 게시판에 매핑할 수 있습니다)