Merge branch 'dev'
Deploy / deploy (push) Failing after 13m55s

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