/* 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 { Checkbox } from '@/components/ui/checkbox'; import { UserFormDialog, type UserFormData } from './UserFormDialog'; import { UserDetailDialog } from './UserDetailDialog'; import { CsvImportDialog } from './CsvImportDialog'; import { LdapImportDialog } from './LdapImportDialog'; import { usePermission } from '@/hooks/usePermission'; import { useTranslation } from 'react-i18next'; 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; handleBatchDelete: () => void; selectedUserIds: number[]; setSelectedUserIds: React.Dispatch>; 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, handleBatchDelete, selectedUserIds, setSelectedUserIds, onResetPassword, importDialogOpen, setImportDialogOpen, importPreview, setImportPreview, importing, importResult, setImportResult, handleCsvUpload, handleBatchImport, ldapUsers, ldapSelected, setLdapSelected, ldapLoading, ldapImportOUs, ldapImportOUDN, setLdapImportOUDN, loadLdapUsers, handleLdapImport, setLdapUsers, }: SystemUserTabProps) { const { t } = useTranslation(); const { hasPermission } = usePermission(); const canManage = hasPermission('system:user'); const toggleSelect = (id: number) => { setSelectedUserIds((prev) => prev.includes(id) ? prev.filter((i) => i !== id) : [...prev, id], ); }; const allSelected = filteredUsers.length > 0 && selectedUserIds.length === filteredUsers.length; const toggleSelectAll = () => { setSelectedUserIds(allSelected ? [] : filteredUsers.map((u) => u.id)); }; return ( <> {/* Filters */}
setSearchQuery(e.target.value)} className="pl-9 h-9 bg-[var(--dg-bg-tertiary)]/50 border-[var(--dg-border)] text-[var(--dg-text-primary)] placeholder:text-[var(--dg-text-muted)]" />
{hasPermission('system:user') && ( )} {hasPermission('system:user') && ( )} {hasPermission('system:user') && ( )}
{canManage && selectedUserIds.length > 0 && (
已选择 {selectedUserIds.length} 项 / 共 {filteredUsers.length} 项
)} {/* Users Table */}
{canManage && ( )} {t('system.userTitleField')} {t('system.contactInfo')} {t('system.userRole')} {t('common.source')} {t('system.userStatus')} {t('system.lastLogin')} {t('system.auditAction')} {loading ? (
) : filteredUsers.length === 0 ? ( 暂无用户数据 ) : ( filteredUsers.map((user) => ( {canManage && ( toggleSelect(user.id)} className="border-[var(--dg-border)]" /> )}
{(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 导入 弹窗 — 均由独立子组件承载 */} ); }