This commit is contained in:
owenchen committed 2026-10-15 16:55:07 +08:00
1 parent 95b38a7e4d
commit 23d14ba54c
2 files changed
+23 -10

No files matched your search

@@ -110,8 +110,13 @@ const selectedRows = computed(() =>
selectedKeys.value.map(key => selectedPool.value[key]).filter(Boolean),
);
// 全选态只看"当前可见行是否都被勾选",不能用 selectedRows.length 对比 rows.length:
// 选择器页开启 keepSelectionOnReload 后,selectedRows 会含被搜索过滤掉的已选行,
// 两个集合数量碰巧相等会误判成全选,用户点一下全选反而把跨搜索的已选整组清空。
const allSelected = computed(
() => rows.value.length > 0 && selectedRows.value.length === rows.value.length,
() =>
rows.value.length > 0 &&
rows.value.every(row => selectedKeys.value.includes(keyOf(row))),
);
function clearSelection(): void {
@@ -139,17 +144,25 @@ function toggleSelect(row: AdminRow): void {
}
function toggleSelectAll(): void {
if (allSelected.value) {
clearSelection();
return;
}
selectedKeys.value = rows.value.map(row => keyOf(row));
// 全选/取消全选只作用于"当前可见行",保留此前跨搜索/跨页已选的其他行;
// keys 与 pool 必须同步增删,否则 pool 会残留 keys 里已不存在的孤儿行对象。
const visible = rows.value.map(row => keyOf(row));
const pool = { ...selectedPool.value };
for (const row of rows.value) {
pool[keyOf(row)] = row;
if (allSelected.value) {
const drop = new Set(visible);
selectedKeys.value = selectedKeys.value.filter(key => !drop.has(key));
for (const key of visible) {
delete pool[key];
}
}
else {
for (const row of rows.value) {
pool[keyOf(row)] = row;
}
selectedKeys.value = [...new Set([...selectedKeys.value, ...visible])];
}
selectedPool.value = pool;
emit("selection-change", selectedKeys.value.map(key => pool[key]).filter(Boolean));
emit("selection-change", selectedRows.value);
}
function onLongPress(row: AdminRow): void {
@@ -135,7 +135,7 @@ useAuthGuard(() => {
<template>
<view class="page">
<admin-list ref="listRef" v-model:keyword="keyword" :nav-title="t('UserPage.actorEnquiryTitle')"
:show-nav-back="isPick" :columns="columns" :loader="state.query" :row-key="SecurityActorEntity.ACTOR_NAME"
:show-nav-back="!isPick" :columns="columns" :loader="state.query" :row-key="SecurityActorEntity.ACTOR_NAME"
title-key="ActorLocalName" :selectable="isPick ? pickTarget.multiple.value : Boolean(perm.canDelete.value)"
:filter-count="filterCount" :filter-visible="filterVisible" :filter-items="draft" :search-token="searchToken"
:keep-selection-on-reload="isPick" @search="onSearch" @open-filter="state.openFilter()"