From afbec5e3c3cafc75c0f64cedcd6b038326d2973d Mon Sep 17 00:00:00 2001 From: ByungCheol Date: Tue, 30 Jun 2026 23:23:08 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=B6=84=EB=A5=98=20=EC=95=84=EC=BD=94?= =?UTF-8?q?=EB=94=94=EC=96=B8=20=ED=99=94=EB=A9=B4=20=EA=B5=90=EC=A0=95=20?= =?UTF-8?q?=E2=80=94=20=EB=B6=84=EB=A5=98=EA=B4=80=EB=A6=AC=20=EB=A1=A4?= =?UTF-8?q?=EB=B0=B1=20=C2=B7=20=EB=82=B4=EC=97=AD=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CategoryView(분류 관리): 잘못 적용된 대분류 아코디언 제거, 소분류 항상 표시로 복원 - AccountView(내역 추가/수정): 2단 드롭다운 → 대분류 아코디언으로 교체 · 대분류 클릭 → 소분류 펼침(없으면 바로 선택) · 소분류 클릭 → 즉시 선택 / 선택 항목 초록 하이라이트 · 수정 진입 시 해당 대분류 자동 펼침 유지 Co-Authored-By: Claude Sonnet 4.6 --- src/views/account/AccountView.vue | 157 +++++++++++++++++++++-------- src/views/account/CategoryView.vue | 60 +---------- 2 files changed, 120 insertions(+), 97 deletions(-) diff --git a/src/views/account/AccountView.vue b/src/views/account/AccountView.vue index d810d16..475b0fa 100644 --- a/src/views/account/AccountView.vue +++ b/src/views/account/AccountView.vue @@ -276,25 +276,27 @@ async function loadCategories() { categories.value = [] } } -// 현재 구분(수입/지출)에 맞는 분류 + 편집 중 현재 값 보존 -// ===== 분류: 대분류 → 소분류 2단 선택 (긴 드롭다운 스크롤 방지) ===== -const categoryMajor = ref('') // 선택된 대분류 이름 -// 현재 구분의 대분류(부모 없음) 이름 + 편집 중 현재 대분류 보존 -const majorOptions = computed(() => { - const names = categories.value - .filter((c) => c.type === form.type && c.parentId == null) - .map((c) => c.name) - if (categoryMajor.value && !names.includes(categoryMajor.value)) names.unshift(categoryMajor.value) - return names -}) -// 선택된 대분류의 소분류 이름 목록 (없으면 대분류 자체가 분류) -const subOptions = computed(() => { - const major = categories.value.find( - (c) => c.type === form.type && c.parentId == null && c.name === categoryMajor.value, - ) - if (!major) return [] - return categories.value.filter((c) => c.parentId === major.id).map((c) => c.name) -}) +// ===== 분류: 대분류 아코디언 → 소분류 선택 ===== +const categoryMajor = ref('') // 펼쳐진 대분류 이름 +// 현재 구분의 대분류 객체 목록 +const majorOptionsData = computed(() => + categories.value.filter((c) => c.type === form.type && c.parentId == null) +) +// 특정 대분류의 소분류 객체 목록 +function subsByMajor(majorId) { + return categories.value.filter((c) => c.parentId === majorId) +} +// 대분류 클릭: 소분류 있으면 펼침 토글, 없으면 바로 선택 +function onMajorClick(major) { + if (categoryMajor.value === major.name) { + categoryMajor.value = '' + form.category = '' + } else { + categoryMajor.value = major.name + if (!subsByMajor(major.id).length) form.category = major.name + else form.category = '' + } +} // form.category 로부터 대분류 추론 (편집 진입 시) function syncCategoryMajor() { const cur = form.category @@ -310,10 +312,7 @@ function syncCategoryMajor() { categoryMajor.value = cur } } -// 대분류 변경: 소분류 있으면 소분류 선택 대기 / 없으면 대분류가 곧 분류 -function onMajorChange() { - form.category = subOptions.value.length ? '' : categoryMajor.value -} + // 필터용 전체 분류명 (중복 제거) const allCategoryNames = computed(() => [...new Set(categories.value.map((c) => c.name))]) @@ -1121,16 +1120,28 @@ onMounted(async () => {