diff --git a/docs/history.md b/docs/history.md index 2465417..8387082 100644 --- a/docs/history.md +++ b/docs/history.md @@ -1,5 +1,10 @@ # 의사결정 이력 +## 2026-04-06 v1.4.87 +- 템플릿 태그는 이름/slug 검색과 역할이 겹치고, 운영자가 실제로 원하는 것은 “템플릿 찾기”보다 “아이템 묶음 분류”에 가까웠으므로 템플릿 화면에서 직접 노출하지 않는 편이 더 맞다고 정리했다. +- 태그 입력도 카드 곳곳에 흩어져 있으면 메인 작업인 업로드와 이름 정리가 묻히기 쉬우므로, 태그는 관리자 아이템 모달에서만 배지형으로 다루고 템플릿 화면 본문은 가볍게 유지하는 쪽을 택했다. +- 기존 템플릿을 통째로 가져오는 기능만으로는 운영자가 “조건에 맞는 일부 아이템만” 빠르게 합치는 흐름이 부족하므로, 이름·파일명·태그 기반 개별 아이템 검색 후 초안 목록으로 담아두는 보조 모달을 추가하는 편이 더 실용적이라고 판단했다. + ## 2026-04-06 v1.4.86 - 내부 운영용 분류는 공개 노출용 필드와 분리하는 편이 맞다고 보고, 태그는 템플릿과 아이템의 관리자 전용 메타로만 저장하고 검색에 활용하는 방향으로 정리했다. - 기존 분기 템플릿이나 요청 아이템을 다시 재조합해 새 템플릿을 만드는 흐름은 완전히 별도 마법 기능보다, 이미 있는 `초안 목록`에 다른 출처의 아이템을 합류시키고 `제외` 버튼으로 정리하는 편이 훨씬 예측 가능하다고 판단했다. diff --git a/docs/update.md b/docs/update.md index f9b840a..ea0f077 100644 --- a/docs/update.md +++ b/docs/update.md @@ -1,5 +1,12 @@ # 업데이트 로그 +## 2026-04-06 v1.4.87 +- 템플릿 설정 화면에서는 더 이상 템플릿 태그를 직접 입력하지 않도록 정리했다. 템플릿 자체는 이름과 slug로만 관리하고, 운영용 태그는 아이템 모달 안에서만 다루는 흐름으로 단순화했다. +- 관리자 아이템 모달의 태그 입력은 쉼표 문자열 대신 배지형 입력으로 바꿨다. 태그를 입력하고 `Enter`를 누르면 아래에 배지로 붙고, 각 배지의 `X` 버튼으로 개별 제거할 수 있다. +- 템플릿 관리 액션 영역은 좁은 화면에서도 버튼이 자연스럽게 오른쪽 정렬로 줄바꿈되도록 손봤고, `개별 아이템 검색` 모달을 추가해 이름·파일명·태그로 원하는 아이템만 직접 찾아 현재 템플릿 초안에 넣을 수 있게 했다. +- 템플릿 화면의 기본 아이템 목록과 업로드 초안 카드에서는 태그 입력창을 제거해, 메인 작업 흐름이 이름 편집과 아이템 추가에 더 집중되도록 정리했다. +- 확인: `npm run build` + ## 2026-04-06 v1.4.86 - 관리자 전용 내부 태그를 템플릿과 아이템 메타에 추가했다. 이제 템플릿 설정과 기본 아이템/관리자 아이템 모달에서 태그를 쉼표 기준으로 저장할 수 있고, 관리자 검색에서도 이름·파일명뿐 아니라 태그까지 함께 조회할 수 있다. - 템플릿 관리 화면에 `기존 템플릿 가져오기`를 추가했다. 현재 선택한 템플릿에 다른 템플릿들의 기본 아이템을 초안으로 모아 온 뒤, 필요 없는 항목은 `제외`하고 저장할 수 있다. 여러 분기 템플릿을 합쳐 연간 통합 템플릿을 만드는 흐름을 염두에 둔 기능이다. diff --git a/frontend/src/components/TagBadgeInput.vue b/frontend/src/components/TagBadgeInput.vue new file mode 100644 index 0000000..f74b97e --- /dev/null +++ b/frontend/src/components/TagBadgeInput.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/frontend/src/components/admin/AdminTemplatesSection.vue b/frontend/src/components/admin/AdminTemplatesSection.vue index ecca34a..5136dbb 100644 --- a/frontend/src/components/admin/AdminTemplatesSection.vue +++ b/frontend/src/components/admin/AdminTemplatesSection.vue @@ -10,13 +10,13 @@ const props = defineProps({ appliedRequestItemCount: { type: Number, required: true }, openTemplateCreateModal: { type: Function, required: true }, openTemplateSourceImportModal: { type: Function, required: true }, + openTemplateLibraryItemModal: { type: Function, required: true }, isTemplateLoading: { type: Boolean, required: true }, hasSelectedTemplate: { type: Boolean, required: true }, selectedTemplate: { type: Object, default: null }, displayThumbnailUrl: { type: String, default: '' }, templateMetaDraftName: { type: String, default: '' }, templateMetaDraftSlug: { type: String, default: '' }, - templateMetaDraftTags: { type: String, default: '' }, templateMetaSaving: { type: Boolean, required: true }, canSaveTemplateMeta: { type: Boolean, required: true }, saveTemplateMeta: { type: Function, required: true }, @@ -54,7 +54,7 @@ const props = defineProps({ selectedTemplateId: { type: String, default: '' }, }) -defineEmits(['update:templateMetaDraftName', 'update:templateMetaDraftSlug', 'update:templateMetaDraftTags']) +defineEmits(['update:templateMetaDraftName', 'update:templateMetaDraftSlug']) function setTemplateItemListElement(el) { props.templateItemListRef(el) @@ -163,17 +163,6 @@ function setThumbFileElement(el) { @input="$emit('update:templateMetaDraftSlug', $event.target.value)" /> -
공개 URL: /topics/{{ props.selectedTemplate.template.slug || props.selectedTemplate.template.id }}