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