ow
This commit is contained in:
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()"
|
||||
|
||||
Reference in new issue
Block a user