From d1fedb151a4cb0ccaaa4d6a6b72b1a8a1624e8ad Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Mon, 10 Nov 2025 16:32:26 +0900 Subject: [PATCH] =?UTF-8?q?fix(admin-can):=20=EB=8B=89=EB=84=A4=EC=9E=84?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=20=EC=8B=9C=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EC=B9=A9=EC=9D=B4=20=EC=82=AC=EB=9D=BC=EC=A7=80=EB=8A=94=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - v-autocomplete에 cache-items 적용으로 선택 항목 캐시 유지 - value-comparator를 id 기반(compareMember)으로 지정해 동등성 안정화 - items를 displaySearchItems(선택 ∪ 검색 목록)로 제공해 선택 항목 항상 포함 보장 --- src/views/Can/CanCharge.vue | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/views/Can/CanCharge.vue b/src/views/Can/CanCharge.vue index 97c8a94..79c5fa4 100644 --- a/src/views/Can/CanCharge.vue +++ b/src/views/Can/CanCharge.vue @@ -10,7 +10,7 @@ @@ -140,6 +142,23 @@ export default { names.push(...manualIds.map(String)) } return names + }, + // 검색 결과 목록에 현재 선택된 사용자들을 항상 포함시켜 + // 선택 chip이 사라지지 않도록 보장 + displaySearchItems() { + const map = new Map() + ;(this.selectedMembers || []).forEach(m => { + if (m && (m.id !== undefined && m.id !== null)) { + map.set(String(m.id), m) + } + }) + ;(this.searchItems || []).forEach(m => { + if (m && (m.id !== undefined && m.id !== null)) { + const key = String(m.id) + if (!map.has(key)) map.set(key, m) + } + }) + return Array.from(map.values()) } }, @@ -159,6 +178,16 @@ export default { this.$dialog.notify.success(message) }, + // v-autocomplete의 선택 비교를 id 기준으로 수행 + compareMember(a, b) { + if (a === b) return true + if (!a || !b) return false + const aid = typeof a === 'object' ? a.id : a + const bid = typeof b === 'object' ? b.id : b + if (aid === undefined || bid === undefined || aid === null || bid === null) return false + return String(aid) === String(bid) + }, + onSearch(val) { this.searchQuery = val -- 2.49.1