| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { computed, type ComputedRef, type Ref } from 'vue' |
| | | |
| | | /** |
| | | * 䏿鿩颿¿çã已鿰 + å·²é项åè¡¨ãæ´¾ç |
| | | * |
| | | * - 䏿ä¼å
级ï¼ä¸ dialog-picker-contract 对é½ï¼ï¼hide > locked > disabled |
| | | * - hideï¼æ°¸è¿åé¤ï¼ä¸è®¡æ° / ä¸è¿å·²éå表 |
| | | * - lockedï¼é»è®¤å¾é + è®¡æ° + ä¼å
æå¨åé¢ï¼å³ä½¿è¢«å¤é¨å¡è¿ disabledIds ä¹èåº |
| | | * - disabledï¼ä»
è¿æ»¤ selectedIdsï¼ä¸è®¡æ° / ä¸è¿å·²éå表 |
| | | * - 顺åºï¼lockedIds å¨åï¼selectedIds ç´§éï¼ææ°ç»é¡ºåºå³ä¸ºãç¹å»é¡ºåºã |
| | | * |
| | | * 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 } |
| | | } |