From eeea82d8150e82cb5b42741de3a29dc5432a7d5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=AF=E5=A4=A7=E4=BE=A0?= Date: Sat, 31 Jan 2026 01:56:03 +0800 Subject: [PATCH] =?UTF-8?q?feat(TransferHistory):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=88=86=E7=BB=84=E9=80=89=E6=8B=A9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/reorganize/TransferHistoryView.vue | 46 ++++++++++++++++---- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/src/views/reorganize/TransferHistoryView.vue b/src/views/reorganize/TransferHistoryView.vue index 6cd778c8..69e5a0ed 100644 --- a/src/views/reorganize/TransferHistoryView.vue +++ b/src/views/reorganize/TransferHistoryView.vue @@ -177,7 +177,7 @@ const loading = ref(false) const totalItems = ref(0) // 是否要分组 -const group = ref(false) +const group = ref(route.query.grouped === 'true') // 分组条件 const groupBy = ref([ @@ -487,6 +487,9 @@ function reloadPage(resetPage = false) { if (currentPage.value) { url = addUrlQuery(url, 'currentPage', resetPage ? 1 : currentPage.value) } + if (group.value) { + url = addUrlQuery(url, 'grouped', 'true') + } router.push(url) } @@ -500,6 +503,26 @@ function ensureNumber(value: any, defaultValue: number = 0) { return value } +// 按标题分组后的选中数量统计,键为标题,值为对应分组的选中数 +const selectedCountsGroupedByTitle = computed(() => { + return selected.value.reduce((acc, item) => { + const title = item.title || ''; + acc[title] = (acc[title] || 0) + 1; + return acc; + }, {} as Record); +}); + +// 控制分组内所有子项的选中状态 +const toggleGroupSelection = (checked: boolean | null, items: readonly any[]) => { + const values = items.map(item => item.value); + if (checked) { + selected.value = [...new Set([...selected.value, ...values])]; + } else { + const itemsSet = new Set(values); + selected.value = selected.value.filter(item => !itemsSet.has(item)); + } +}; + // 初始加载数据 onMounted(() => { loadStorages() @@ -563,13 +586,20 @@ onMounted(() => {