fix(操作统计): 全不选生效——默认全选,全不选后显示空态提示

- 打开抽屉默认全选所有人(宫格高亮+显示全部)
- 点「全不选」清空选择,表格显示『未选择任何人员』空态,不再退化为全部
- 首次加载自动全选;用户操作过筛选后不覆盖
This commit is contained in:
2026-08-28 13:54:43 +08:00
parent d0fc8cdecf
commit 788d7a7f78

View File

@ -274,7 +274,8 @@ export default function AdminDashboard() {
const [opsDrawerOpen, setOpsDrawerOpen] = useState(false);
const [opStats, setOpStats] = useState<UserOperation[]>([]);
const [opLoading, setOpLoading] = useState(false);
const [opFilterUsers, setOpFilterUsers] = useState<Set<string>>(new Set()); // 多选人员,空 = 全部
const [opFilterUsers, setOpFilterUsers] = useState<Set<string>>(new Set()); // 多选人员
const [opFilterTouched, setOpFilterTouched] = useState(false); // 用户是否主动操作过筛选
const [opSort, setOpSort] = useState<{ key: string; order: "asc" | "desc" } | null>(null);
// 操作明细下钻
const [opDetailOpen, setOpDetailOpen] = useState(false);
@ -349,12 +350,21 @@ export default function AdminDashboard() {
const openOpsDrawer = () => {
setOpsDrawerOpen(true);
setOpFilterUsers(new Set());
setOpFilterTouched(false);
setOpSort(null);
loadUserOperations();
};
// 首次加载完成后默认全选(显示全部);用户操作过筛选后不再自动覆盖
useEffect(() => {
if (!opFilterTouched && opStats.length > 0) {
setOpFilterUsers(new Set(opStats.map(u => u.user_id)));
}
}, [opStats, opFilterTouched]);
// 人员多选切换
const toggleOpFilterUser = (id: string) => {
setOpFilterTouched(true);
setOpFilterUsers(prev => {
const next = new Set(prev);
if (next.has(id)) next.delete(id); else next.add(id);
@ -362,8 +372,14 @@ export default function AdminDashboard() {
});
};
// 全选 / 全不选
const selectAllUsers = () => setOpFilterUsers(new Set(opStats.map(u => u.user_id)));
const clearAllUsers = () => setOpFilterUsers(new Set());
const selectAllUsers = () => {
setOpFilterTouched(true);
setOpFilterUsers(new Set(opStats.map(u => u.user_id)));
};
const clearAllUsers = () => {
setOpFilterTouched(true);
setOpFilterUsers(new Set());
};
// 表头升降序:无 → 升序 → 降序 → 无
const toggleOpSort = (key: string) => {
@ -758,10 +774,12 @@ export default function AdminDashboard() {
</div>
) : opStats.length === 0 ? (
<div className="py-16 text-center text-sm text-gray-400"></div>
) : opFilterUsers.size === 0 ? (
<div className="py-16 text-center text-sm text-gray-400"></div>
) : (
(() => {
// 过滤 + 排序后的数据
let list = opFilterUsers.size > 0 ? opStats.filter(u => opFilterUsers.has(u.user_id)) : opStats;
let list = opStats.filter(u => opFilterUsers.has(u.user_id));
if (opSort) {
const key = opSort.key;
const getVal = (u: UserOperation) => key === "receive" ? u.receive_count : key === "transfer" ? u.transfer_count : key === "record" ? u.record_count : u.total;