fix(操作统计): 全不选生效——默认全选,全不选后显示空态提示
- 打开抽屉默认全选所有人(宫格高亮+显示全部) - 点「全不选」清空选择,表格显示『未选择任何人员』空态,不再退化为全部 - 首次加载自动全选;用户操作过筛选后不覆盖
This commit is contained in:
@ -274,7 +274,8 @@ export default function AdminDashboard() {
|
|||||||
const [opsDrawerOpen, setOpsDrawerOpen] = useState(false);
|
const [opsDrawerOpen, setOpsDrawerOpen] = useState(false);
|
||||||
const [opStats, setOpStats] = useState<UserOperation[]>([]);
|
const [opStats, setOpStats] = useState<UserOperation[]>([]);
|
||||||
const [opLoading, setOpLoading] = useState(false);
|
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 [opSort, setOpSort] = useState<{ key: string; order: "asc" | "desc" } | null>(null);
|
||||||
// 操作明细下钻
|
// 操作明细下钻
|
||||||
const [opDetailOpen, setOpDetailOpen] = useState(false);
|
const [opDetailOpen, setOpDetailOpen] = useState(false);
|
||||||
@ -349,12 +350,21 @@ export default function AdminDashboard() {
|
|||||||
const openOpsDrawer = () => {
|
const openOpsDrawer = () => {
|
||||||
setOpsDrawerOpen(true);
|
setOpsDrawerOpen(true);
|
||||||
setOpFilterUsers(new Set());
|
setOpFilterUsers(new Set());
|
||||||
|
setOpFilterTouched(false);
|
||||||
setOpSort(null);
|
setOpSort(null);
|
||||||
loadUserOperations();
|
loadUserOperations();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 首次加载完成后默认全选(显示全部);用户操作过筛选后不再自动覆盖
|
||||||
|
useEffect(() => {
|
||||||
|
if (!opFilterTouched && opStats.length > 0) {
|
||||||
|
setOpFilterUsers(new Set(opStats.map(u => u.user_id)));
|
||||||
|
}
|
||||||
|
}, [opStats, opFilterTouched]);
|
||||||
|
|
||||||
// 人员多选切换
|
// 人员多选切换
|
||||||
const toggleOpFilterUser = (id: string) => {
|
const toggleOpFilterUser = (id: string) => {
|
||||||
|
setOpFilterTouched(true);
|
||||||
setOpFilterUsers(prev => {
|
setOpFilterUsers(prev => {
|
||||||
const next = new Set(prev);
|
const next = new Set(prev);
|
||||||
if (next.has(id)) next.delete(id); else next.add(id);
|
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 selectAllUsers = () => {
|
||||||
const clearAllUsers = () => setOpFilterUsers(new Set());
|
setOpFilterTouched(true);
|
||||||
|
setOpFilterUsers(new Set(opStats.map(u => u.user_id)));
|
||||||
|
};
|
||||||
|
const clearAllUsers = () => {
|
||||||
|
setOpFilterTouched(true);
|
||||||
|
setOpFilterUsers(new Set());
|
||||||
|
};
|
||||||
|
|
||||||
// 表头升降序:无 → 升序 → 降序 → 无
|
// 表头升降序:无 → 升序 → 降序 → 无
|
||||||
const toggleOpSort = (key: string) => {
|
const toggleOpSort = (key: string) => {
|
||||||
@ -758,10 +774,12 @@ export default function AdminDashboard() {
|
|||||||
</div>
|
</div>
|
||||||
) : opStats.length === 0 ? (
|
) : opStats.length === 0 ? (
|
||||||
<div className="py-16 text-center text-sm text-gray-400">该时段暂无操作记录</div>
|
<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) {
|
if (opSort) {
|
||||||
const key = opSort.key;
|
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;
|
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