From 5367b3b4d92588c4e76728e6bd4ad6aae0cbb967 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 23 七月 2026 13:05:25 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_pro2.0' into dev_pro2.0
---
src/views/im/home/composables/useSelectedItems.ts | 75 +++++++++++++++++++++++++++++++++++++
1 files changed, 75 insertions(+), 0 deletions(-)
diff --git a/src/views/im/home/composables/useSelectedItems.ts b/src/views/im/home/composables/useSelectedItems.ts
new file mode 100644
index 0000000..f8364b3
--- /dev/null
+++ b/src/views/im/home/composables/useSelectedItems.ts
@@ -0,0 +1,75 @@
+import { computed, type ComputedRef, type Ref } from 'vue'
+
+/**
+ * 涓夋�侀�夋嫨闈㈡澘鐨勩�屽凡閫夋暟 + 宸查�夐」鍒楄〃銆嶆淳鐢�
+ *
+ * - 涓夋�佷紭鍏堢骇锛堜笌 dialog-picker-contract 瀵归綈锛夛細hide > locked > disabled
+ * - hide锛氭案杩滃墧闄わ紝涓嶈鏁� / 涓嶈繘宸查�夊垪琛�
+ * - locked锛氶粯璁ゅ嬀閫� + 璁℃暟 + 浼樺厛鎺掑湪鍓嶉潰锛涘嵆浣胯澶栭儴濉炶繘 disabledIds 涔熻儨鍑�
+ * - disabled锛氫粎杩囨护 selectedIds锛屼笉璁℃暟 / 涓嶈繘宸查�夊垪琛�
+ * - 椤哄簭锛歭ockedIds 鍦ㄥ墠锛宻electedIds 绱ч殢锛涙寜鏁扮粍椤哄簭鍗充负銆岀偣鍑婚『搴忋��
+ *
+ * FriendPickerPanel / GroupMemberPickerPanel 鍏辩敤锛岄伩鍏嶄袱渚� 25 琛屽悓鏋� computed 鍚勫啓涓�浠斤紱
+ * Panel 鍐呴儴鐨� isLocked / isDisabled / isSelected 绛夋ā鏉垮垽瀹氬嚱鏁颁粛鍚勮嚜缁存姢锛屾湰 composable 鍙壙鎷呮淳鐢熼噺
+ */
+export function useSelectedItems<T>(
+ selectedIds: () => readonly number[],
+ lockedIds: () => readonly number[],
+ disabledIds: () => readonly number[],
+ hideIds: () => readonly number[],
+ byId: ComputedRef<Map<number, T>> | Ref<Map<number, T>>
+): {
+ selectedCount: ComputedRef<number>
+ selectedItems: ComputedRef<T[]>
+} {
+ const hideSet = computed(() => new Set(hideIds()))
+ const disabledSet = computed(() => new Set(disabledIds()))
+
+ const selectedCount = computed(() => {
+ const merged = new Set<number>()
+ for (const id of selectedIds()) {
+ if (hideSet.value.has(id) || disabledSet.value.has(id)) {
+ continue
+ }
+ merged.add(id)
+ }
+ // locked 浠呰 hide 杩囨护锛涘绾﹂噷 locked 鑳滆繃 disabled锛岀‘淇濋攣瀹氶」濮嬬粓璁″叆
+ for (const id of lockedIds()) {
+ if (hideSet.value.has(id)) {
+ continue
+ }
+ merged.add(id)
+ }
+ return merged.size
+ })
+
+ const selectedItems = computed(() => {
+ const seen = new Set<number>()
+ const result: T[] = []
+ // locked 鍦ㄥ墠锛涗粎琚� hide 杩囨护
+ for (const id of lockedIds()) {
+ if (seen.has(id) || hideSet.value.has(id)) {
+ continue
+ }
+ const item = byId.value.get(id)
+ if (item) {
+ seen.add(id)
+ result.push(item)
+ }
+ }
+ // selectedIds 绱ч殢锛涢澶栬繃婊� disabled
+ for (const id of selectedIds()) {
+ if (seen.has(id) || disabledSet.value.has(id) || hideSet.value.has(id)) {
+ continue
+ }
+ const item = byId.value.get(id)
+ if (item) {
+ seen.add(id)
+ result.push(item)
+ }
+ }
+ return result
+ })
+
+ return { selectedCount, selectedItems }
+}
--
Gitblit v1.9.3