import { useEffect, useMemo, useState } from 'react'; import { Trans, useTranslation } from 'react-i18next'; import { createColumnHelper, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from '@tanstack/react-table'; import { LucideClipboardList, LucideDot, LucideFilter, LucideSearch, LucideSettings2, } from 'lucide-react'; import { useQuery } from '@tanstack/react-query'; import { cn } from '@/lib/utils'; import Spotlight from '@/components/spotlight'; import { TableEmpty } from '@/components/table-skeleton'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardFooter, CardHeader, CardTitle, } from '@/components/ui/card'; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; 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 { listServices, showServiceDetails } from '@/services/admin-service'; import { EMPTY_DATA, createColumnFilterFn, createFuzzySearchFn, getSortIcon, } from './utils'; import ServiceDetail from './service-detail'; const columnHelper = createColumnHelper(); const globalFilterFn = createFuzzySearchFn([ 'name', 'service_type', ]); const SERVICE_TYPE_FILTER_OPTIONS = [ { value: 'ragflow_server', label: 'ragflow_server' }, { value: 'meta_data', label: 'meta_data' }, { value: 'file_store', label: 'file_store' }, { value: 'retrieval', label: 'retrieval' }, { value: 'message_queue', label: 'message_queue' }, ]; function AdminServiceStatus() { const { t } = useTranslation(); const [extraInfoModalOpen, setExtraInfoModalOpen] = useState(false); const [detailModalOpen, setDetailModalOpen] = useState(false); const [itemToMakeAction, setItemToMakeAction] = useState(null); const { data: servicesList } = useQuery({ queryKey: ['admin/listServices'], queryFn: async () => (await listServices()).data.data, retry: false, }); const { data: serviceDetails, error: serviceDetailsError } = useQuery({ queryKey: ['admin/serviceDetails', itemToMakeAction?.id], queryFn: async () => (await showServiceDetails(itemToMakeAction!?.id)).data.data, enabled: !!(itemToMakeAction && detailModalOpen), retry: false, }); const columnDefs = useMemo( () => [ columnHelper.accessor('id', { header: t('admin.id'), }), columnHelper.accessor('name', { header: t('admin.name'), }), columnHelper.accessor('service_type', { header: t('admin.serviceType'), filterFn: createColumnFilterFn( (row, id, filterValue) => row.getValue(id) === filterValue, { autoRemove: (v) => !v, resolveFilterValue: (v) => v || null, }, ), enableSorting: false, }), columnHelper.accessor('host', { header: t('admin.host'), cell: ({ row }) => ( {row.getValue('host')} ), }), columnHelper.accessor('port', { header: t('admin.port'), cell: ({ row }) => ( {row.getValue('port')} ), }), columnHelper.accessor('status', { header: t('admin.status'), cell: ({ cell }) => ( {t(`admin.${cell.getValue()}`)} ), enableSorting: false, }), columnHelper.display({ id: 'actions', header: t('admin.actions'), cell: ({ row }) => (
), }), ], [t], ); const table = useReactTable({ data: servicesList ?? EMPTY_DATA, columns: columnDefs, globalFilterFn, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), getPaginationRowModel: getPaginationRowModel(), }); useEffect(() => { if (detailModalOpen && serviceDetailsError) { setDetailModalOpen(false); } }, [detailModalOpen, serviceDetailsError]); return ( <> {t('admin.serviceStatus')}
{t('admin.serviceType')}
{SERVICE_TYPE_FILTER_OPTIONS.map(({ label, value }) => ( ))}
table.setGlobalFilter(e.target.value)} />
{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(), )} ))} )) ) : ( )}
{ table.setPagination({ pageIndex: page - 1, pageSize, }); }} />
{/* Extra info modal*/} { if (!extraInfoModalOpen) { setItemToMakeAction(null); } }} > {t('admin.extraInfo')}
                
                  {JSON.stringify(itemToMakeAction?.extra ?? {}, null, 2)}
                
              
{/* Service details modal */} { if (!detailModalOpen) { setItemToMakeAction(null); } }} > {{ name: itemToMakeAction?.name }} ); } export default AdminServiceStatus;