/** * 用途:用户列表表格(多选、行内启用/禁用开关、详情/编辑/重置密码/删除入口)+ 分页底栏 * 必需 props:users / loading / total / page / pageSize / selectedIds / allSelected 及各事件回调 * 已知限制:仅 loading 且列表为空时显示加载态;空态「清除筛选条件」由 showClearFilters 控制显隐 */ import { CheckSquare, Square, Search, Eye, Edit2, Trash2, KeyRound, ChevronLeft, ChevronRight, } from 'lucide-react'; import { Card, CardContent } from '@/components/ui/card'; import { roleNameMap, roleTagStyle } from '../constants'; import type { UserItem } from '../types'; interface UserTableProps { users: UserItem[]; loading: boolean; total: number; page: number; pageSize: number; selectedIds: Set; allSelected: boolean; showClearFilters: boolean; onToggleSelectAll: () => void; onToggleSelect: (id: number) => void; onShowDetail: (user: UserItem) => void; onShowEdit: (user: UserItem) => void; onShowResetPassword: (user: UserItem) => void; onToggleActive: (user: UserItem) => void; onDelete: (id: number) => void; onClearFilters: () => void; onPageChange: (page: number) => void; } export function UserTable({ users, loading, total, page, pageSize, selectedIds, allSelected, showClearFilters, onToggleSelectAll, onToggleSelect, onShowDetail, onShowEdit, onShowResetPassword, onToggleActive, onDelete, onClearFilters, onPageChange, }: UserTableProps) { return ( {loading && users.length === 0 ? (
加载中...
) : users.length === 0 ? (

没有找到匹配的用户

{showClearFilters && ( )}
) : ( <>
{users.map(user => { const isSelected = selectedIds.has(user.id); return ( ); })}
用户 角色 邮箱 最后登录 状态 来源 操作
onShowDetail(user)}>
{user.display_name || user.username}
@{user.username}
{roleNameMap[user.role] || user.role} {user.email || '-'} {user.last_login ? new Date(user.last_login).toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }) : '-'} {user.auth_source === 'ldap' ? 'LDAP' : '本地'}
共 {total} 条 {selectedIds.size > 0 && `,已选择 ${selectedIds.size} 项`} {total > pageSize && (
{page} / {Math.ceil(total / pageSize)}
)}
)} ); }