/* eslint-disable @typescript-eslint/no-explicit-any */ import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Search, Plus, Upload, Network, Mail, Phone, Eye, Edit, Trash2, } from 'lucide-react'; import { UserFormDialog, type UserFormData } from './UserFormDialog'; import { UserDetailDialog } from './UserDetailDialog'; import { CsvImportDialog } from './CsvImportDialog'; import { LdapImportDialog } from './LdapImportDialog'; import { usePermission } from '@/hooks/usePermission'; interface SystemUserTabProps { // Search searchQuery: string; setSearchQuery: (v: string) => void; // Users filteredUsers: any[]; loading: boolean; selectedUser: any | null; setSelectedUser: (u: any | null) => void; getUserStatusBadge: (status: 'active' | 'inactive') => React.ReactNode; // Create / Edit dialogOpen: boolean; setDialogOpen: (open: boolean) => void; editingUser: any | null; form: UserFormData; setForm: React.Dispatch>; saving: boolean; handleSubmit: () => void; openCreate: () => void; openEdit: ( user: any) => void; handleDelete: ( user: any) => void; onResetPassword?: (user: any) => void; // CSV import importDialogOpen: 'csv' | 'ldap' | null; setImportDialogOpen: (v: 'csv' | 'ldap' | null) => void; importPreview: any[]; setImportPreview: ( p: any[]) => void; importing: boolean; importResult: any; setImportResult: ( r: any) => void; handleCsvUpload: (e: React.ChangeEvent) => void; handleBatchImport: () => void; // LDAP import ldapUsers: any[]; ldapSelected: Set; setLdapSelected: (s: Set) => void; ldapLoading: boolean; ldapImportOUs: any[]; ldapImportOUDN: string; setLdapImportOUDN: (v: string) => void; loadLdapUsers: (ouDn?: string) => void; handleLdapImport: () => void; setLdapUsers: ( u: any[]) => void; } export function SystemUserTab({ searchQuery, setSearchQuery, filteredUsers, loading, selectedUser, setSelectedUser, getUserStatusBadge, dialogOpen, setDialogOpen, editingUser, form, setForm, saving, handleSubmit, openCreate, openEdit, handleDelete, onResetPassword, importDialogOpen, setImportDialogOpen, importPreview, setImportPreview, importing, importResult, setImportResult, handleCsvUpload, handleBatchImport, ldapUsers, ldapSelected, setLdapSelected, ldapLoading, ldapImportOUs, ldapImportOUDN, setLdapImportOUDN, loadLdapUsers, handleLdapImport, setLdapUsers, }: SystemUserTabProps) { const { hasPermission } = usePermission(); return ( <> {/* Filters */}
setSearchQuery(e.target.value)} className="pl-9 h-9 bg-slate-800/50 border-slate-700 text-slate-200 placeholder:text-slate-500" />
{hasPermission('system:user') && ( )} {hasPermission('system:user') && ( )} {hasPermission('system:user') && ( )}
{/* Users Table */}
用户信息 联系方式 角色 来源 状态 最后登录 操作 {loading ? (
) : filteredUsers.length === 0 ? ( 暂无用户数据 ) : ( filteredUsers.map((user) => (
{(user.nickname || user.username || '?').charAt(0)}

{user.nickname || user.username}

@{user.username}

{user.email || '--'}
{user.phone && (
{user.phone}
)}
{(user.roles || []).map((role: string) => ( {role} ))}
{user.authSource === 'ldap' ? ( LDAP ) : ( 本地 )} {getUserStatusBadge(user.status)} {user.lastLoginAt ? new Date(user.lastLoginAt).toLocaleString() : '--'}
{hasPermission('system:user') && ( )} {hasPermission('system:user') && ( )}
)) )}
{/* 用户详情 / 创建编辑 / CSV 导入 / LDAP 导入 弹窗 — 均由独立子组件承载 */} ); }