import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigate, useParams } from 'umi'; import { LucideArrowLeft, LucideDot, LucideUser2 } from 'lucide-react'; import { useQuery } from '@tanstack/react-query'; import { createColumnHelper, flexRender, getCoreRowModel, getSortedRowModel, useReactTable, } from '@tanstack/react-table'; import { cn } from '@/lib/utils'; import { Routes } from '@/routes'; import { Avatar } from '@/components/ui/avatar'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader } from '@/components/ui/card'; import { RAGFlowPagination } from '@/components/ui/ragflow-pagination'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Tabs, TabsContent, TabsList, TabsTrigger, } from '@/components/ui/tabs-underlined'; import { getUserDetails, listUserAgents, listUserDatasets, type AdminService, } from '@/services/admin-service'; import EnterpriseFeature from './components/enterprise-feature'; import { getSortIcon, parseBooleanish } from './utils'; const ASSET_NAMES = ['dataset', 'flow']; const datasetColumnHelper = createColumnHelper(); const agentColumnHelper = createColumnHelper(); function UserDatasetTable(props: { data?: AdminService.ListUserDatasetItem[]; }) { const { t } = useTranslation(); const columnDefs = useMemo( () => [ datasetColumnHelper.accessor('name', { header: t('admin.name'), enableSorting: false, }), datasetColumnHelper.accessor('status', { header: t('admin.status'), cell: ({ cell }) => { return ( {t( parseBooleanish(cell.getValue()) ? 'admin.active' : 'admin.inactive', )} ); }, enableSorting: false, }), datasetColumnHelper.accessor('chunk_num', { header: t('admin.chunkNum'), }), datasetColumnHelper.accessor('doc_num', { header: t('admin.docNum'), }), datasetColumnHelper.accessor('token_num', { header: t('admin.tokenNum'), }), datasetColumnHelper.accessor('language', { header: t('admin.language'), enableSorting: false, }), datasetColumnHelper.accessor('create_date', { header: t('admin.createDate'), }), datasetColumnHelper.accessor('update_date', { header: t('admin.updateDate'), }), datasetColumnHelper.accessor('permission', { header: t('admin.permission'), enableSorting: false, }), ], [t], ); const table = useReactTable({ data: props.data ?? [], columns: columnDefs, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), }); return (
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : header.column.getCanSort() ? ( ) : ( flexRender( header.column.columnDef.header, header.getContext(), ) )} ))} ))} {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( {t('common.noData')} )}
{ table.setPagination({ pageIndex: page - 1, pageSize, }); }} />
); } function UserAgentTable(props: { data?: AdminService.ListUserAgentItem[] }) { const { t } = useTranslation(); const columnDefs = useMemo( () => [ agentColumnHelper.accessor('title', { header: t('admin.agentTitle'), }), agentColumnHelper.accessor('permission', { header: t('admin.permission'), }), agentColumnHelper.accessor('canvas_category', { header: t('admin.canvasCategory'), }), ], [t], ); const table = useReactTable({ data: props.data ?? [], columns: columnDefs, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), }); return (
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : ( <> {flexRender( header.column.columnDef.header, header.getContext(), )} {/* {header.column.getCanFilter() && ( )} */} )} ))} ))} {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( {t('common.noData')} )}
{ table.setPagination({ pageIndex: page - 1, pageSize, }); }} />
); } function AdminUserDetail() { const navigate = useNavigate(); const { t } = useTranslation(); const { id } = useParams(); const { data: { detail, datasets, agents } = {} } = useQuery({ queryKey: ['admin/userDetail', id], queryFn: async () => { const [userDetails, userDatasets, userAgents] = await Promise.all([ getUserDetails(id!), listUserDatasets(id!), listUserAgents(id!), ]); return { detail: userDetails.data.data[0], datasets: userDatasets.data.data, agents: userAgents.data.data, }; }, enabled: !!id, }); return (
{detail?.email .split('@')[0] .replace(/[^0-9a-z]/gi, '') .slice(0, 2) || } {detail?.email} {t( parseBooleanish(detail?.is_active) ? 'admin.active' : 'admin.inactive', )} {() => ( {detail?.role} )}
{t('admin.lastLoginTime')}
{detail?.last_login_time}
{t('admin.createTime')}
{detail?.create_date}
{t('admin.lastUpdateTime')}
{detail?.update_date}
{t('admin.language')}
{detail?.language}
{t('admin.isAnonymous')}
{t(detail?.is_anonymous ? 'admin.yes' : 'admin.no')}
{ASSET_NAMES.map((name) => ( {t(`header.${name}`)} ))}
); } export default AdminUserDetail;