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 {