fix(操作统计): 全不选生效——默认全选,全不选后显示空态提示
- 打开抽屉默认全选所有人(宫格高亮+显示全部) - 点「全不选」清空选择,表格显示『未选择任何人员』空态,不再退化为全部 - 首次加载自动全选;用户操作过筛选后不覆盖
This commit is contained in:
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user